コードリーディング
コードリーディングとは、プログラムのソースコードを読解することを意味する。
自分の書いたプログラムだけでなく、他人が書いたプログラムやオープンソースのプログラムなど、ソースコードを読解することを全般的にコードリーディングと呼ぶ。
コードリーディングの目的は人それぞれだが、どのようなソースコードでプログラムが動いているのかを解析することにより、テクニックやデータ構造・アルゴリズムを学ぶ。
ただソースコードを”読む”のではなく、目的を持って”読み解く“ことで意味のあるコードリーディングとなる。 Scrapboxを使ったコードリーディング
■ 地図のメタファー
コードリーディングの土地勘
ソースコードの「どの辺」にいるかの感覚を養う
■ 見知らぬ土地を歩き回る時
ランドマークを探す
大通りを基準にする
■ 地図の有無
地図(ナビゲーション)があると効率的
地図と目の前の現実を付き合わせる作業は必要
■ コードリーディングにも地図が必要
→ 自分で作るしかない
コードリーディングにはどんな地図が必要?
■ 動的解析
一般的にはデバッガを使う(環境によってはprint文デバッグ)
デバッガで止めてコールスタックを見る
→ とにかく効率的
■ はじめてのコード
何はともあれ動的解析をする
→ 地図がなくてもまず景色を見てみる
→ (たぶん用語などが不明で)行き詰まる
→ 静的解析に移る
→ ある程度、(頭の中に)地図ができたら、また動的解析
→ 繰り返す
■ 動的解析の実践
デバッガで止めてコールスタックを見る
エントリポイントを知る
→ Webアプリは比較的簡単(HTTPを意識する)
オブジェクトのライフサイクル管理を読み取る
→ Webアプリは比較的簡単(非localはglobal, session, requestの3種に大別できるので)
→ オブジェクトのライフサイクル管理はGCがあると軽視されがちだが、意識するとコードの構造を読み取るのに役立つ (コードの書き手と読み手の間のギャップになりやすいから。
書き手は暗黙にライフサイクルを理解しているが、読み手は意識しないと読み取りにくい) ■ 静的解析(2)
メモを取る
- 分からなければ分からないことをメモる
- 分かったことも忘れないようにメモる
幅優先的に読む
■ 静的解析のブレイクスルー
APIで切っていく感覚
内部APIも含めて、モジュールやレイヤの境界を意識して「切っていく」感覚
データ構造を意識する感覚
処理中心からデータ構造中心にコードを読む
オブジェクトのライフサイクルを意識
(オブジェクトの)集合に対する感覚
集合および集合に対する操作(列挙など)を意識(いわゆるコンテナやコレクションなど)
■ 抽象化
境界を把握できたら頭から細部を追い出す
→ ブラックボックス化
→ この抽象化こそが鍵
→ 完璧に内部を知る必要はなく何をするかだけがわかればよい。知る必要が来る時まで探索は遅延
内部(仕組み)を知りたくてたまらない時は?
→ 読めばいい。ただ一段潜ったことを自覚する(この自覚がないと潜りつづける危険がある) → 知的好奇心を一概に否定したくはないが、全体像をつかんで位置づけを知ってから細部に潜るほうが効率的なことが多いので、多少の我慢は必要
■ ブレイクスルー(続)
公開APIのサンプルコードは、ムダが無く直接的なので、大きな概念をつかみやすい
→ ソフトウェアがサービスとして外部に提供する機能境界
→ スケールアップしたサンドイッチ理論
■ レイヤ再び
- 利用APIや利用フレームワーク(下から押さえる)
- システムの提供APIを調べる(上から押さえる)
- 単体テストのコードから
- APIマニュアルから
- サンプルコードから
- 上と下の境界を意識して部品として把握する
■ コトバとメタ知識
ソフトウェアが複雑化すればするほどコードに陽に現れない知識(抽象化された層の内部に隠蔽)が増える コードから読み取る知識とそうでない知識を早めに選別しないと人生が終わる
コード以外から可能な限りメタ知識を仕入れる
システム概要やユースケースを知る(そもそも、このソフトウェアは何か?)
(コード以外の)メタな情報から高レベルな概念(アーキテクチャ)や用語(コード上の略称)を把握
内部スペック文書を読む
--