読者です 読者をやめる 読者になる 読者になる

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

コードリーディングを学ぶ

Programming

ここのところ改めて人の書いたコードを読む作業をしているのですが、途中でなんだか分け分からなくなったりしたりするのでもう少し具体的な方法を紹介しているものが無いか探してみたら


WEB+DB PRESS Vol.35
WEB+DB PRESS Vol.35
posted with amazlet at 10.02.17

技術評論社
売り上げランキング: 333020


に記事が載っていたり、ネットで資料あったりしたので

ソースコードを読むための技術
http://i.loveruby.net/ja/misc/readingcode.html


心得と学習の一環でメモをまとめてみます。上のWeb+DB PRESSから書き起こしてます。


■着目すべきポイント
手続き型言語のソースコードを理解するポイント
・モジュールの構成と役割
・アルゴリズムとその意図
・データ構造とその意味


■予備知識
1.静的解析と動的解析
・静的解析
ソースコードを読み進めることで解析
・動的解析
対象プログラムを実行しながらその挙動を解析する


2.トップダウンとボトムアップ
ボトムアップアプローチ
コンポーネントの機能から把握していく。
・トップダウンアプローチ
まず全体を把握し、詳細なコンポーネントを把握していく。


3.プロダクトの対象領域を把握しておく
ソースコードを読み進めるにはそのプロダクトが対象している領域の一般的な知識が必要


■準備
1.心得と道具
・「メモを取り続けること」
大量の情報に翻弄されないように「いま何を調査中」をメモしておくことが大切
わかったことはどんどんメモって残す、不要になったメモはどんどん捨てる


2.目的を確認しよう
・今一度「なぜソースコードを読むのか」を再確認する
・機能拡張、勉強目的ならまんべんなく掘り下げるアプローチが適している
・動作不具合の修正や改造であれば、場所の特定だけで全体を把握する必要がないので、関係する部分だけをピンポイントで見つけて周辺だけを掘り下げるアプローチでもよい


■実践基礎
1.全体構造を把握する
・readmeなどの文書があるか
・ディレクトリ構成から推測(「view」というパッケージがあればMVCパターンである可能性が高い)
・ビルドファイルはあるか ソースの依存関係やモジュールの単位がわかる
・実際にビルドしてみたりサンプルプログラムを動作させてみる
「そのシステムにはどうような機能が実装されているか」「その機能のボリュームはどれくらいか」大まかに把握できらら
個々のソースコードを読んで行く


2.コールグラフを描く
・各モジュールのエントリポイントからシーケンス図を書いてコールグラフを把握すると処理の流れが見えてくる
・「ひらメソッド」を使う。
mainのような入り口関数からソースを読むとき処理内容は後回しにして、まずはそこから呼び出されている関数を洗い出しコールグラフだけを描いていく。
末端の関数まで降りてきたらそこで初めてじっくりと読んでその処理とナいようを理解し、折り返してコールグラフを遡っていく


3.ピンポイントで攻める
・ソース全体を検索し、その機能が実装されている場所を一気に特定する
・ソースディレクトリ全体を検索出来るツールがあると便利(エクスプローラの検索など) 


4.動的解析
・ある程度内容が見えてきたら動作させて追跡していく
・デバッガを使ってソースコードブレークポイントを設定して変数の内容を確認する、どういう経路でその関数が呼ばれたかコールスタックを確認する


5.実装の意図を組む
・クラスや関数名に注目 何を実現しようとしているのか名前から意図を汲む
単体テスト用のコードがヒントになる可能性がある



うーむ、奥が深い。もっとしっかり学びたい。本買おうかな。


Code Reading―オープンソースから学ぶソフトウェア開発技法
トップスタジオ まつもと ゆきひろ 平林 俊一 鵜飼 文敏
毎日コミュニケーションズ
売り上げランキング: 150190


ソースコードリーディングから学ぶ Javaの設計と実装
WINGSプロジェクト 佐藤 匡剛
技術評論社
売り上げランキング: 10806