Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大規模ソースコードの読み方
Search
Satoru Takeuchi
PRO
October 12, 2017
Programming
12
8.8k
大規模ソースコードの読み方
Tips of how to understand the source code of big software projects
Satoru Takeuchi
PRO
October 12, 2017
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
ハイテク休憩
sat
PRO
2
140
利きプロセススケジューラ
sat
PRO
5
3.1k
俺とVSCode Python Debugger Extension
sat
PRO
1
190
コード再利用のしくみ ライブラリ
sat
PRO
3
60
AWKへの愛を語る
sat
PRO
3
540
syncコマンドのデータ同期 完了待ちやエラー検出
sat
PRO
0
100
動作中のLinux環境の全メモリを見る
sat
PRO
1
120
Linuxの時間を10秒止める
sat
PRO
2
220
プロセスへのメモリ割り当て4 - 実際に使うときにメモリを獲得するデマンドページング(実践編)
sat
PRO
1
150
Other Decks in Programming
See All in Programming
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
250
Refactor your code - refactor yourself
xosofox
1
260
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
210
CSC509 Lecture 14
javiergs
PRO
0
140
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
930
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
120
선언형 UI에서의 상태관리
l2hyunwoo
0
150
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
ドメインイベント増えすぎ問題
h0r15h0
1
240
命名をリントする
chiroruxx
1
390
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
40
2.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
GitHub's CSS Performance
jonrohan
1030
460k
What's in a price? How to price your products and services
michaelherold
243
12k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Documentation Writing (for coders)
carmenintech
66
4.5k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Transcript
1 大規模ソースコードの読み方 v1.0.0 2016/2/13 Satoru Takeuchi <
[email protected]
>
2 はじめに • 大規模ソースコード(以下ソースと記載)を、未 経験者が前提知識を持たない状態で読もうとす ると、ほぼ確実に挫折する • 例えばLinux kernelの場合一千万行をゆうに超える •
一日千行読んでも一万日かかる… • 本スライドは大規模ソースを読む上でのコツを いくつか紹介 • 想定読者 • これまで大規模ソースを見たことが無い人/見よう としたが、挫折した人 • Linux/UNIXユーザ
3 目次 • ソースを読む前 • 目的の明確化 • 設計意図の理解 • 読むソースの絞り込み
• ソースを読むとき • タグジャンプツールの使用 • 実際に動かしてみる • まとめ
4 目的の明確化 • まず自分がどの機能の実装を理解したいのかを明確化 • 目的が無いまま闇雲にソースの字面を眺めるだけでは 内容の理解は困難 • 「全てを理解しなくては!」や「とりあえずmain()か ら芋づる式に辿ろう」という考えかたは挫折への近道
• 大規模プログラムでは、全ソースを完璧に理解して いる開発者は少ない/居ない。全部を理解していな いのは別に恥ずかしいことではない • 最終目的はあくまで機能の実装を理解することであり、 ソースを読むのは手段であることを常に意識しておく
5 設計意図の理解 • 機能が何のためにあるのか、どういう方針で設 計されているかという意図を理解する • ドキュメントを見る • マニュアル、コメント、パッチのコミットログ •
自分なりの仮説を立てる • この機能を実現するためには設計はこうなってい るはず…と考える • 構造体の関連図がわかっていると、仮説を立て やすい • アルゴリズム+データ構造=プログラム • 仮説が外れていても、無いよりは全然よい
6 gitの活用 • 設計意図を知るのにはgitが役立つ • 無論ソースがgitで管理されていることが前提 • 他のVCSについては割愛 • ここでは2つのgitコマンドを紹介
• git log • git blame
7 git log • git log <path>: <path>を変更したパッチの一覧を 表示 •
機能追加、実装の再設計をしたパッチセットの先頭 パッチに設計意図が書いていることが多い • パッチそのものではなく、当該パッチセットを開発 MLに投稿した際の”[PATCH 0/X]”というメールに 書いていることもある
8 git blame • git blame <file>: <file>の各行を最後に変更した パッチを表示 •
<file>の各行が、どのような意図で現在そうなって いるかがわかる • もちろんまともなコミットログがあることが前提 • git logより細かい粒度の情報が得られる
9 読むソースの絞り込み • ソース全体のうちの、どこを読めばいいのか、 及び、どこを読まなくてよいのかを絞り込む • 余計なところを”読まない”ことが重要 • なるべく読む対象のソースを少なくする •
大規模ソースは大抵複数、かつ階層状のモ ジュールに細分化されている
10 絞り込みの例 • 興味のある機能の実行中に出てくるメッセージ を用いてgrepをかけることによって、関連ソー スの位置を知る • デバッガを使ってプログラム内の興味のある機 能を動かしてみることによって、当該機能の ソース上の位置を知る
11 実際にソースを読むにあたって • ここからようやく実際にソースを熟読する • これまでに述べたことが全てできていれば、必 要な作業の八割程度は終わっている • 一部しかできていなくても、漫然とソースを読むよ りは、はるかに良い
• ソースを読む前の作業は戦略、実際にソースを読む 作業は戦術
12 タグジャンプツールの使用 • ソースを読むにあたって、テキストエディタと基本コマン ドだけでソースを読むのは非常に面倒。以下、一例。 • foo()という関数内でbar()という関数を呼んでいる。bar()が何 をしている関数か知りたい • foo()の引数の型であるstruct
hogeの定義を知りたい • grepコマンドなどでソースを全て検索した上で、マッチ したファイルを開いてカーソルを所定の場所に移動、と いった操作を毎回実行するのは面倒、かつ非効率 • bar()やstruct hogeの調査後、foo()の調査を再開したいよ うな場合はさらに面倒 • これを解決するのがタグジャンプツール
13 タグジャンプツールの仕組み • ソースコードを走査して、ソースのどこにどのような シンボル(前述の例でいうとfoo,bar,およびhoge)が定義 されており、それぞれどこで使用されているのかを記 録したデータベースを作成 • エディタなどからシンボルを指定すると、当該シンボ ルの定義場所、および使用箇所に自動的にジャンプ
• 検索ごとの全ソース調査が不要なため、高速。マシ ンパワーも節約可能 • ジャンプ履歴を覚えているため、たとえばfoo()から bar()へのジャンプ後に、元のfoo()に戻ることも可能
14 タグの形式 • タグには色々な形式があり、それぞれ一長一 短。以下に著名なものを記載 • cscope • GNU Global
• ctags • etags • 詳細はそれぞれのドキュメントを参照 • タグジャンプ相当機能を内蔵している開発環境 もある(例: eclipse)
15 プログラムを動かしてみる • ソースを読みつつプログラムを実際に動かして みるのは非常に有用 • デバッガを用いてプログラムを動かしてみることに よって、関数の呼び出し関係、引数、およびデータ 構造の意味を知る •
興味のある箇所にprintf()などのデバッグメッセー ジを突っ込んで実行してみる • ソースを少し変更した上で挙動の変化を見る • ソースの読み/書き、実行を行き来することに よってソースの内容を理解
16 まとめ • 大規模ソースを読むためにはソースを読む前/読 むときについて様々なコツがある • 最終目標はソースを読むことではなく、実装を 理解することだと常に意識する • 機能の実装を理解するために必要なことの八割
は、ソースを読む前に終わっている • 実際にソースを読む際も、ただ読むだけではな く、タグジャンプツールを使ったり、読み書き 実行を行き来したりして、作業を効率化する
17 Happy Hacking!