コードの読み方


背景

大規模なプログラムや長年開発され複雑になったプログラムは、何の方針もなしに漫然と読んでいるとなかなか理解ができない。そのため、以下のようなやり方で読む。

読む前にすること

背景事情の理解

コードを読む前に、コードにまつわる事情をあらかじめ可能な限り把握しておく。

・そのプログラムによって実現していた・これから実現するビジネス上の背景事情など -> 他の人に聞く、インターネットで調べる(公開情報なら)
・機能要件、非機能要件 -> 要件定義書・画面仕様書・処理フロー図・DB定義書・API仕様書など
・コードを作ってきたチームのルール -> コーディング規約、コードのあるリポジトリのREADMEや、その他ルールを定めた文書
・開発ツール、デバッグツールのバージョン、実行環境など -> 同上
・設計パターン、アルゴリズム、データ構造、その他開発時の典型パターンなど -> 同上
・ライブラリ、フレームワーク -> 同上、インターネット
・使っている言語の文法 -> 普段から勉強、インターネットなど

文書が残されていなければ、公開情報ならインターネットで調べれば良い。非公開情報なら、他の人に聞く。

大まかな流れや背景・必ずしも文書に残すような物ではない人的な事情などは元から聞いた方が早い場合も多い。

細かい部分は、逆に文書の方が把握しやすいだろう。

コードを読む目的の明確化

ただ漫然と読んでいても端から忘れてしまうので、何のためにコードを読むのか決める。言い換えれば、読む必要のある部分とない部分を分ける。

具体例

  • アプリの初回起動処理に改修を入れる予定なので、その部分を把握したい。

    • アプリの初回起動時に使われる部分のクラスを読む。そこから外れる部分は読まない。
  • 改修を入れる部分のある変数に変更を加える予定である。しかし、その変数が他でどういう風に使われているのか分からないため、影響範囲を調査したい。

    • その変数がどう宣言され、どういったデータが入力され、どこで利用されているかを読む。 そこから外れる部分は読まない。

読む時にすること

読む -> 実際にプログラムを動かし確かめる -> アウトプット

まず単純にコードを読んでいき、コードの動きについて一定の仮説を立てる
例)
- この機能は大体このクラスとあのクラスが関わっているはず
- このデータはここからあそこで受け渡されるはず
- このデータの中身はこういう感じのはず

その後、実際にプログラムを動かしてみて、デバッグツールなどを使用し、その仮説が実際にあっているか確かめる必要がある。違っていれば、原因を調査し、正しい知見が得られるまでやる。

その後、得られた知見を文章で要約してメモしたり、イラストに書いたり、フロー図にまとめたりなど何らかのアウトプットをする。アウトプットをすることで知識がまとまって深い意味で理解できるようなるのと、単純に頭の中にあるだけだとそのうち忘れるので後から参照できるようにする点で意義がある。

開発ツールの機能を利用

  • 複数の部分のコードを、複数のタブを使い開いたままにする
  • 特定の文字で検索する
  • ある変数や関数、クラスなどの宣言部分にジャンプする
  • ある変数や関数、クラスなどが呼ばれている箇所を検索する
  • あるファイルについて、特定のコミットと別のコミットでの変化を左右に同時表示し違いをチェックする

上記のような機能を利用すると、読むのが効率的になる。というか上記の機能くらいは使わないとしんどいだろう。

デバッガの機能を利用

  • コードが特定の場所に差し掛かったら止める(ブレークポイント)
  • エラー時のエラー理由や、ログを出力する
  • 画面に置かれている部品の階層構造を表・3D図などで表示する(画面のあるソフトウェアの場合)
  • メモリの消費状況を表示する
  • コード中で使用されている変数などの値を動的に書き換える

実際にプログラムを動かす段になると、以上のような機能が役立つ。また、デバッグをするために必要なもの(環境設定やアカウントなど)があれば、知っておかないとデバッグができないのでこれも聞いておくことになる。

アウトプットのツール

いわゆるマインドマップなどのツールを利用して書いてもいいし、単純にノートなどの紙に書いてもいい。
紙には、一覧性がある上どこでも自由に書き込みができるというメリットがあるので侮れない。ただ、嵩張り整理しづらかったりもするから、長期に残すのであれば何かデジタルに変換した方がいいかもしれない。

読む力を向上させるには

実際に読んでいき、立てた推測があっていたか間違っていたかを何度も繰り返す。業務でそのような作業をやっているならそれで良いし、機会がないならOSSなどを読んでみても良い。読んで数をこなすうちに、意識的にやらなければできなかった事が当たり前にできるようになっていく。

参考資料

Traveloco! - プログラマーが教える、ソースコードを読むための4つの方法!
ドナちきブログ - 【すぐに使える】ソースコードの読み方【効率読む6つのコツ】
よの冒険記 - ソースコードの追い方、読み方の方法やコツをまとめておく
self-taught corders - How to quickly and effectively read other people’s code
Launch School - How to read code without ripping your hair out
IT Next - How To Read Code?