この記事の目次
コードを読む基礎
既存のコードを理解するスキルを学びます。1年目は「書く」より「読む」時間の方が長いことも多いです。
なぜコードを読むスキルが重要か
- 既存のコードを理解して修正・拡張する
- 他の人のコードから学ぶ
- コードレビューで指摘を理解する
- バグの原因を特定する
新しい機能を追加するときも、まず既存のコードを理解しないと「どこに」「どう書くか」が分かりません。
コードを読む全体の流れ
いきなりコードの細部を読み始めるのは非効率です。まず全体を把握し、段階的に詳細を理解していきます。
全体構造を把握する
↓
処理の入り口(エントリーポイント)を見つける
↓
処理の流れを追う
↓
自分の担当箇所を詳しく読む
ステップ1:全体構造を把握する
フォルダ構成を確認する
まずプロジェクトのフォルダ構成を見て、どこに何があるかを把握します。
よくあるフォルダ構成の例:
project/
├── src/ ← ソースコード本体
│ ├── controllers/ ← リクエストを受け付ける
│ ├── services/ ← ビジネスロジック
│ ├── repositories/ ← データベースアクセス
│ └── models/ ← データの定義
├── tests/ ← テストコード
├── config/ ← 設定ファイル
└── docs/ ← ドキュメント
ポイント:
- フォルダ名から役割を推測する
- 同じような名前のパターンを見つける(〜Controller、〜Service など)
- READMEがあれば読む
ファイル名から役割を推測する
| ファイル名の例 | 推測される役割 |
|---|---|
| UserController | ユーザー関連のリクエスト処理 |
| OrderService | 注文のビジネスロジック |
| ProductRepository | 商品データのDB操作 |
| AuthMiddleware | 認証の共通処理 |
| utils.js / helpers.py | 汎用的な便利関数 |
設計書やドキュメントを確認する
コードを読む前に、設計書があれば確認しましょう。
- アーキテクチャ図:全体の構成
- ER図:データベースの構造
- API仕様書:外部とのやり取り
- README:セットアップ手順や概要
ステップ2:エントリーポイントを見つける
エントリーポイントとは、処理の開始点です。「どこから読み始めればいいか」を特定します。
アプリケーションの種類別エントリーポイント
| アプリの種類 | エントリーポイントの例 |
|---|---|
| コンソールアプリ | main() 関数 |
| Webアプリ | URLに対応するController/Handler |
| バッチ処理 | 実行スクリプト、ジョブクラス |
| イベント駆動 | イベントハンドラ、コールバック |
| ライブラリ | 公開API(public メソッド) |
Webアプリの場合の見つけ方
-
URLのルーティング定義を探す
routes.rb(Rails)urls.py(Django)@RequestMapping(Spring)app.get()(Express)
-
URLに対応するControllerを見つける
/users → UsersController /orders → OrdersController -
Controllerのメソッドから読み始める
例:「ユーザー一覧画面」のコードを読む場合
1. 画面のURL(/users)を確認
↓
2. ルーティング定義で /users に対応するControllerを探す
↓
3. UsersController の index() メソッドを見つける
↓
4. そこから読み始める
ステップ3:処理の流れを追う
エントリーポイントから順番に処理を追っていきます。
上から下へ、呼び出し順に読む
// UsersController.java
public List<User> index() {
List<User> users = userService.findAll(); // 1. ここを見たら...
return users;
}
// UserService.java
public List<User> findAll() { // 2. ここへ進む
return userRepository.findAll(); // 3. さらにここへ...
}
// UserRepository.java
public List<User> findAll() { // 4. ここでDBアクセス
return jdbcTemplate.query(...);
}
深く追いすぎない
最初から全ての詳細を理解しようとしないことが重要です。
最初は「何をしているか」だけ把握:
List<User> users = userService.findAll(); // ユーザー一覧を取得している(詳細は後で)
必要になったら詳細を読む:
// userService.findAll() の中身が気になったら見に行く
メソッド名から処理を推測する
メソッド名は処理の要約です。名前から役割を推測して、中身を見るかどうか判断します。
| メソッド名 | 推測される処理 |
|---|---|
findById(id) |
IDで検索して返す |
save(user) |
ユーザーを保存する |
validate(input) |
入力値を検証する |
convertToDto(entity) |
形式を変換する |
calculateTotal(items) |
合計を計算する |
ステップ4:詳細を理解する
全体の流れが分かったら、自分が担当する箇所を詳しく読みます。
コードの構造を把握する
制御構造を見つける:
if/else:条件分岐for/while:繰り返しtry/catch:例外処理return:処理の終了点
データの流れを追う:
- 入力:引数、リクエスト、設定値
- 処理:計算、変換、検証
- 出力:戻り値、レスポンス、副作用
変数と型を確認する
変数名と型から、そのデータが何を表しているか理解します。
// 型と名前から意味を読み取る
List<User> activeUsers = ... // アクティブなユーザーのリスト
int totalAmount = ... // 合計金額(整数)
boolean isValid = ... // 有効かどうか(真偽値)
LocalDate startDate = ... // 開始日
コメントとドキュメントを読む
Javadoc/JSDoc などのドキュメントコメント:
/**
* ユーザーを検索する
* @param id ユーザーID
* @return ユーザー情報。見つからない場合はnull
*/
public User findById(Long id) { ... }
コード内のコメント:
// 税率は法改正で変更される可能性があるため定数化
final double TAX_RATE = 0.10;
注意:コメントは古くなっていることがあります。コードの動作が正しく、コメントと矛盾している場合はコードを信じましょう。
効率的にコードを読むテクニック
IDEの機能を活用する
| 機能 | 説明 | ショートカット例 |
|---|---|---|
| 定義へ移動 | メソッドや変数の定義場所へジャンプ | Ctrl+クリック、F12 |
| 参照を検索 | どこから呼ばれているか確認 | Shift+F12 |
| ファイル検索 | ファイル名でファイルを開く | Ctrl+P |
| テキスト検索 | プロジェクト全体を検索 | Ctrl+Shift+F |
| アウトライン表示 | クラスのメソッド一覧を表示 | Ctrl+Shift+O |
デバッガで動かしながら読む
コードを動かしながら読むと理解が深まります。
- ブレークポイントを設定
- デバッグ実行
- ステップ実行で処理を追う
- 変数の値を確認しながら理解
詳細は デバッグの基本 を参照してください。
図を描いて整理する
複雑な処理は図に描くと理解しやすくなります。
- シーケンス図:クラス間の呼び出し順序
- フローチャート:条件分岐と処理の流れ
- クラス図:クラス間の関係
手書きのメモでも十分です。
読むときに意識すること
「なぜこう書いてあるか」を考える
// なぜ getUserById ではなく findUserById なのか?
// なぜここで null チェックをしているのか?
// なぜこのループは逆順なのか?
疑問を持つことで理解が深まります。分からなければ先輩に聞くきっかけにもなります。
パターンを見つける
同じようなコードの書き方(パターン)を見つけると、読むスピードが上がります。
// このプロジェクトでは、Serviceで例外をキャッチしてnullを返すパターンが多い
public User findById(Long id) {
try {
return userRepository.findById(id);
} catch (Exception e) {
logger.warn("User not found: {}", id);
return null;
}
}
分からないところはメモする
- 「なぜこうしているか分からない」→ 後で調べる or 質問する
- 「この変数がどこで変更されるか分からない」→ 参照検索で確認
- 「この用語の意味が分からない」→ 検索する
「何が分からないか」を明確にすることが重要です。
よくある困りごとと対処法
「どこから読めばいいか分からない」
- まずエントリーポイントを探す
- 自分が修正すべき機能に関連するURLや画面から逆算する
- 設計書やREADMEを確認する
- 先輩に「この機能はどのファイルから読めばいいですか?」と聞く
「処理が複雑すぎて追えない」
- デバッガで実際に動かしながら追う
- メソッドごとに「何をしているか」を一言でメモする
- 図を描いて整理する
- 一度に全部理解しようとせず、担当箇所だけに集中する
「知らない技術・ライブラリが使われている」
- 公式ドキュメントを確認
- 「〇〇 使い方」「〇〇 チュートリアル」で検索
- 詳細は後回しにして、「何をするためのものか」だけ把握
- 先輩に概要を教えてもらう
「コメントがなくて意図が分からない」
- 変数名・メソッド名から推測
- テストコードを読む(期待される動作が分かる)
- Git の履歴(コミットメッセージ)を確認
- 分からなければ書いた人や先輩に聞く
まとめ
| ステップ | やること |
|---|---|
| 1. 全体把握 | フォルダ構成、ファイル名、ドキュメントを確認 |
| 2. 入口特定 | エントリーポイント(処理の開始点)を見つける |
| 3. 流れを追う | 上から下へ、呼び出し順に読む |
| 4. 詳細理解 | 担当箇所を詳しく読む |
効率化のコツ:
- IDEの機能(定義へ移動、参照検索)を活用
- デバッガで動かしながら読む
- 図を描いて整理する
- 分からないところはメモして後で確認
心がけ:
- 一度に全部理解しようとしない
- 「なぜ」を考えながら読む
- パターンを見つける
- 質問するためにも「何が分からないか」を明確にする