執筆:H.I / 原書執筆:T.H / 発表:Y.A (IT事業部門)
ベガシステムでは、毎月技術勉強会を開催し、最新技術や開発現場で役立つ知識について継続的に学ぶ取り組みを行っています。
本記事では、その勉強会で扱ったテーマの一つである コードリーディング(Code Reading) について、「コードを書く時と読む時の考え方の違い」「効率よく全体像をつかむための読み進め方」といった内容を中心に分かりやすく整理しています。
ソフトウェア開発に関わる方に向けて、コードを読むときのコツや進め方の全体像をつかめる内容となっています。
コードリーディング 2023/07/25 技術勉強会資料 by @vegasystems
わかった つ・も・り とは?
- この内容は、概略だけを取り出して「わかったつもり」になってドヤ顔してもらうことを想定して作っています。
- 正確性よりもわかりやすさを重視して作っています。
- この内容を聞いても本当の実力はつきません。この記事を出発点として各自勉強してみてください。
読む/書くではゲームのルールが違う
「コードリーディング(Code Reading)」は、コードを書くこととは別のゲームです。
コードを書く時
やりたい事 → やり方 → コード → 実行 → 実行結果

コードを読む時
実行結果 → 実行 → コード → やり方 → やりたい事

整理すると、コードを書くことは「やりたい事からやり方を考えるゲーム」、コードを読むことは「やり方と結果からやりたい事を推測するゲーム」です。つまりコードを読むということは、探偵作品の推理に近いことなのです。
ここで最も重要なことは、細部に惑わされずに、全体像と状況証拠からコードが実現したい本当の意図をつかみ取ることです。
ルール:はじめにコードを読まない
その1:はじめにコードを読んではいけない
何も考えずにコードを読んではいけません。
コードを読むのは、どうしても分からないときだけです。最後の最後です。
その2:はじめにコードを読んではいけない理由
コードを読むためには時間がかかります。なぜなら、コードはやり方が書いてあるだけで、やりたい事は書いてないからです。はじめにコードを読むということは、自分から意図的に泥沼に落ちるということです。
つまり、いかにして「読まないか」が鍵になってきます。
ルール:システムの概要を先に押さえる
その3:システムの概要を調べておく
コードを技術的に調べる前に、まずは「このシステムは何が目的で作られていて、何が出来るのか?」を調べておきます。例えば、以下のような情報収集を行います。
- 関係者から聞き取る
- ドキュメントを読み込む
- システムを動かしてみて挙動を調べる
技術者の場合、技術的に解決することを優先しがちですが、前提となる事実関係をしっかりと捉えることが最優先です。
ルール:フォルダ構成と名前で絞り込む
その4:フォルダ構成は重要

システムの概要を把握した次は、はじめに読むべきファイルを絞り込みます。
プロジェクトのフォルダ構成は非常に重要であり、フォルダを見て読むべき場所を絞り込んでいきます。各フレームワーク・言語ごとに「推奨すべきフォルダ構成」が定義されていることが多いです。
プロジェクトを始めるとき、オリジナリティーに富んだ「ぼくの考えた最強フォルダ構成」は、後から読む人が困惑するので避けましょう。
その5:名前から妄想する
読むべきフォルダが見つかったら、次に名前から内容を妄想します。
ファイル名、名前空間、クラス名、関数名、と絞り込みを行い対象を絞り込みます。怪しいクラス・関数・処理を見つけたとしても、その場で読み進めてはいけません。まずは、その場所を「怪しいところリスト」にします。リストには簡単なメモをつけておくとよいでしょう。
重要なことは「怪しいところの分布と関係」をつかむことです。
ルール:関係を絵にする
前提の復習:プログラムとは何か

プログラムとは、「データを変換する手順」のことです。入力と出力があり、途中に何段かの変換処理があります。中身を調べる前に、各段の入り口と出口で何をやっているか知ることが、全体像を把握する場合にとても重要になります。
その6:コールグラフ・データフロー
フォルダ構成と名前から作成した「怪しいリスト」から、関数の呼び出し前、呼び出し後を図にします。このような図を「コールグラフ」と言います。コールグラフを使って処理の位置関係を調べます。
コールグラフの作成ツールもあるので、必要に応じて活用してみてください。

コールグラフの作成が出来たら、関数の呼び出しと戻り値としてどのようなデータが処理間で受け渡しされているか調べます。これを「データフロー」と言います。
データフローにより、これから読もうとしている処理の全体像が見えてきます。

ルール:必要なところだけをブロックで読む
その7:ブロックで読みます
ここまで来たら、いよいよコードを読みます。しかし、ここでも漫然と最初からコードを読んではいけません。
コードをブロック単位に分けて、何をやっているか推測して、読むべき場所を絞り込みます。本当に自分が知りたい塊を見つけたら、そこを時間をかけて丁寧に読みます。

まとめ:コードとはまだ見ぬ誰かへのお手紙
コードを読むことは、推理と同じことです。
やり方と結果から「やりたい事」を推測していくため、細部に惑わされずに全体像と状況証拠を押さえることが大切です。コードを読む際は、今回の記事を出発点として学習を進めながら、実際のコードで試してみてください。
また、コードを書く人は、読む人が読みやすいコードを意識して書きましょう!それは、まだ見ぬ誰か(未来の自分を含む)へのお手紙なのです。だからこそ、論理的に丁寧に分かりやすく、読む相手のことを考えて書きましょう。
参考リンク
Code Reading プレミアムブックス版 オープンソースから学ぶソフトウェア開発技法
https://book.mynavi.jp/ec/products/detail/id=54062
「良い名前付け」の参考サイトまとめ
https://qiita.com/rokumura7/items/cb6302102f5805996ef9
コールグラフについて
https://i.loveruby.net/ja/rhg/cd/callgraph.html
サンプルコード:BusyBoxのpwdコマンド実装(C言語)
https://github.com/mirror/busybox/blob/master/coreutils/pwd.c
技術ブログ「VEGA Scope」で他の記事も読む
VEGA Scopeでは、今回のコードリーディングのような開発の進め方・考え方に関する内容から、日々の実装で役立つTipsまで幅広く発信しています。エンジニアの知見を詰め込んだ記事を多数掲載していますので、併せてご覧ください。