📖 読了目安 約10分
この記事の目次

コードを読む基礎

既存のコードを理解するスキルを学びます。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アプリの場合の見つけ方

  1. URLのルーティング定義を探す

    • routes.rb(Rails)
    • urls.py(Django)
    • @RequestMapping(Spring)
    • app.get()(Express)
  2. URLに対応するControllerを見つける

    /users → UsersController
    /orders → OrdersController
    
  3. 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

デバッガで動かしながら読む

コードを動かしながら読むと理解が深まります。

  1. ブレークポイントを設定
  2. デバッグ実行
  3. ステップ実行で処理を追う
  4. 変数の値を確認しながら理解

詳細は デバッグの基本 を参照してください。

図を描いて整理する

複雑な処理は図に描くと理解しやすくなります。

  • シーケンス図:クラス間の呼び出し順序
  • フローチャート:条件分岐と処理の流れ
  • クラス図:クラス間の関係

手書きのメモでも十分です。


読むときに意識すること

「なぜこう書いてあるか」を考える

// なぜ 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 質問する
  • 「この変数がどこで変更されるか分からない」→ 参照検索で確認
  • 「この用語の意味が分からない」→ 検索する

「何が分からないか」を明確にすることが重要です。


よくある困りごとと対処法

「どこから読めばいいか分からない」

  1. まずエントリーポイントを探す
  2. 自分が修正すべき機能に関連するURLや画面から逆算する
  3. 設計書やREADMEを確認する
  4. 先輩に「この機能はどのファイルから読めばいいですか?」と聞く

「処理が複雑すぎて追えない」

  1. デバッガで実際に動かしながら追う
  2. メソッドごとに「何をしているか」を一言でメモする
  3. 図を描いて整理する
  4. 一度に全部理解しようとせず、担当箇所だけに集中する

「知らない技術・ライブラリが使われている」

  1. 公式ドキュメントを確認
  2. 「〇〇 使い方」「〇〇 チュートリアル」で検索
  3. 詳細は後回しにして、「何をするためのものか」だけ把握
  4. 先輩に概要を教えてもらう

「コメントがなくて意図が分からない」

  1. 変数名・メソッド名から推測
  2. テストコードを読む(期待される動作が分かる)
  3. Git の履歴(コミットメッセージ)を確認
  4. 分からなければ書いた人や先輩に聞く

まとめ

ステップ やること
1. 全体把握 フォルダ構成、ファイル名、ドキュメントを確認
2. 入口特定 エントリーポイント(処理の開始点)を見つける
3. 流れを追う 上から下へ、呼び出し順に読む
4. 詳細理解 担当箇所を詳しく読む

効率化のコツ

  • IDEの機能(定義へ移動、参照検索)を活用
  • デバッガで動かしながら読む
  • 図を描いて整理する
  • 分からないところはメモして後で確認

心がけ

  • 一度に全部理解しようとしない
  • 「なぜ」を考えながら読む
  • パターンを見つける
  • 質問するためにも「何が分からないか」を明確にする