ソースコードを読むときの3カ条

GCを読んでいく上で実際に使っているソースコードの読み方を紹介してみます。
個人的に大事にしているのは以下の3カ条です。

  • 小さい疑問から先に倒すべし
  • 正しいツールを選択するべし
  • 必ずメモするべし

小さい疑問から先に倒すべし

なんとなく読みたい時は疑問の分析から

ソースコードってなんとなく読みたくなるということもありますよね。
ただ、その状態でいきなり対象のソースコードを読みはじめるのはよくないです。
小さなプロジェクトだと問題ないかもしれませんが、大きなプロジェクトだと時間がかかりすぎます。

そういうときは最初にドキュメントなどを読んでみましょう。
そうすると、対象のソースコードが持つ機能が書いてあります。
機能がわかれば「どうやってこれを実装しているのか?」という疑問が浮かびます。

たとえば、G1GCの場合は論文がすでに公開されていたので、最初に論文を読みました。
読み終わったあとに論文内の疑問をメモして「こいつらを倒そう」という目標を立てました。

大きな疑問から小さな疑問へ

上記の例はわりと特殊な例です。
普通はある程度漠然とした疑問があってソースコードを読みはじめますので、大体がまず粒度の洗い「大きな疑問」を持っています。
上記で洗い出したものは、その大きな疑問にあたります。

大きな疑問をメモったら、それからソースコードを読んで行きます。G1GCの場合は

  • 退避はどうやる?

などというすごい漠然とした疑問を何個かもってました。
ソースコードの中にはだいたい大きな疑問を扱う関数があったりするので、そこから読んで行きます。

実際に読みはじめると、関数内で何をやっているのかよく分からない処理がでてきます。
「なぜこの処理が必要なのか?」とか。もっと具体的に「この関数はなんの処理をしている?」とか。
そのようにして「小さな疑問」を沢山メモします。

そして、そうやって出てきた「小さな疑問」を優先して倒します。

小さな疑問をすべて倒すと大きな疑問も倒せている

このように深さ優先的に疑問を倒すと、いつの間にか最初の大きな疑問も倒せています。
簡単にまとめると、以下の流れ図になります。

大きな疑問 =(分析)=> 小さな疑問 =(理解)=> 大きな疑問

小さな疑問は短時間で解決できるので、大きな疑問を解くよりも時間を有効に活用できます。

正しいツールを選択するべし

  • Emacs(手に馴染んだエディタ)

当たり前ですが、手に馴染んでいるものでコードを読むのがいいでしょう。
私はEmacs使いですから、Emacs上で全部のコードを読んできました。

  • gtags

関数を探索するのに便利。関数の呼び出し元もわかります。

gtagsで拾い切れないものもあるので、そういうときはgit grepを使います。
コメントの中の文言とか調べたかったりするので。

動作を調べる必要があるときに使います。
ただし、これは最終手段です。読んですぐに理解できるものなら実際に動かして調べる必要はまったくありません。どうしてもわからないときに使いましょう。
よくわからないプロジェクトのビルドは面倒ですし、対象の関数を動かすのはもっと面倒ですから。

必ずメモするべし

面倒でも読んで理解した部分は必ずメモします。絶対に忘れますよ。絶対に忘れますよ。
忘れるとまたそこから理解しないといけないので、モチベーションが下がります(モチベーション大事)。

私はrubikitchさんのorg-remember-code-readingを使っています。
org-mode + remember-mode でEmacs内で瞬時にメモをする→コードリーディングに生かす・メモ検索する - http://rubikitch.com/に移転しました
まず大きな疑問の項目を作って、その下に小さな疑問の項目を作っていき、理解の過程とか結果とか、とにかく自分が忘れてほしくないものをメモします。
あ、この時、日付も書いておくと情報の古さがあとでわかって便利です。

メモしていくと「大きな疑問が解消できた!」という達成感も得られて、モチベーション低下を防げます。
また、メモすることで「俺はもうこれ忘れていい」というよく分からない開放感も得られます。

また、以下の理由から私はorg-modeを使っています。

  • 対象ソースコードの特定の場所へのリンクを貼れる
  • メモ内の違う項目にリンクを貼れる

「このソースコードのこの部分の説明」とか書けて、あとでメモを見たときにすぐに対象の場所に飛ぶことができます。
さらに、emacs内(手に馴染んだエディタ)で完結して読めるので便利です。

上記と同様の機能があるメモツールであればorg-modeでなくてもいいでしょう。

注意

あくまで個人的なやりかたですから、参考にしてもいいですし、参考にしなくてもいいですよ、と。