Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大規模ソースコードの読み方
Search
Satoru Takeuchi
PRO
October 12, 2017
Programming
12
9.2k
大規模ソースコードの読み方
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
eBPF
sat
PRO
1
97
waruiBPF
sat
PRO
0
94
eBPFとwaruiBPF
sat
PRO
4
2.9k
Pythonのコードの気になる行でスタックトレースを出す
sat
PRO
0
89
ソースコードを読むときの思考プロセスの例 ~markdownのレンダリング方法を知りたかった2 markdownパッケージ~
sat
PRO
0
180
様々なファイルシステム
sat
PRO
0
330
ソースを読む時の思考プロセスの例-MkDocs
sat
PRO
1
410
ソースを読むプロセスの例
sat
PRO
22
17k
メモリマップトファイル
sat
PRO
1
170
Other Decks in Programming
See All in Programming
愛される翻訳の秘訣
kishikawakatsumi
3
350
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.4k
Developing static sites with Ruby
okuramasafumi
0
330
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
410
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
170
AIコーディングエージェント(Manus)
kondai24
0
220
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
190
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
140
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
4k
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
110
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
130
ゲームの物理 剛体編
fadis
0
370
Featured
See All Featured
Marketing to machines
jonoalderson
1
4.3k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
750
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
31
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
91
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
57
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.2k
Automating Front-end Workflow
addyosmani
1371
200k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
75
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
870
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
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!