いつ、どんなときにコードリーディングをしていて困っているか？

ソフトウェア開発を行っていると様々なシチュエーションでコードリーディングが必要となります。ざっと思いつくままに挙げてみるだけでも、

- バグ修正
- 新規機能追加
- テスト
- ライブラリやフレームワークの選定
- コードレビュー
- デバッグ
- 他プロジェクトのヘルプ
- トラブル発生時の状況整理
- 言語、フレームワーク等の公式サイトでの勉強
- 技術書やオンラインコース、チュートリアルの写経
- 参考になる、使えるコードの調査、収集
- リファクタリング

のようなシチュエーションがあります。最近のトピックだとTwitter社の買収のような、プロジェクトの整理・統合が発生するシチュエーションでも相当な量のコードリーディングが行われています[1][2]。

当然のことながら、あらゆる業務分野でもコードリーディングが必要となります。Web開発、モバイルアプリ開発、ゲーム開発、システム開発、組み込み系、データ解析など、どんな分野においてもそれぞれの事情にあわせて実装されたコードを読まなくてはいけません。また担当する職務という切り口で見ると、フロントエンド、バックエンド、DevOps、SRE、セキュリティ、テストなどの業務範囲においてそれぞれ知りたい情報が異なるため、コードリーディングのやり方も一筋縄ではいきません。

このようにシチュエーション、ソフトウェア開発の業務分野、職務のあらゆる場面でコードリーディングが必要となるため、それだけ多くの場面でコードリーディングへの課題にも直面してしまいます

## コードリーディングにはどういうタイプの課題があるか？
コードリーディングに関する課題も分析してみるとたくさんの種類があります。主だったものを挙げますと、

- コードそのものに問題がある（スパゲッティコード、不適当な命名や命名規則の揺れなど）
- コードリーディングの基礎力が不足している（文法への理解、アルゴリズムやアーキテクチャ、デザインパターンの知識が足りない）
- コードリーディング環境が整っていない（ペイン機能を利用していない、ディスプレイの数、大きさが不十分である）
- コードリーディング関連機能が足りない（検索、シンタックスハイライト、ペインなどツールに不足がある、使いにくい）
- コードリーディング方法およびテクニックが身についていない
- コードリーディング後の情報整理ができていない
- コードリーディング時に量的・時間的制約がある（緊急対応のため明らかに必要量を読みきれない）
- ドキュメント、コメント等の資料がない、足りない
- 背景知識がない、足りない（コンピュータサイエンスの基礎、ビジネスロジック、開発経緯などの背景を知らない）

のような課題に分類することができます。

## コードリーディング課題とシチュエーションの組み合わせでさらに複雑になっている
このような種類の課題がさきほど挙げたシチュエーションとの組み合わせで発生するため、実態はますます複雑になっています。シチュエーションのうち、バグ修正、新規機能追加、テスト、コードレビューとコードリーディング課題を組み合わせた表を作ってみました。ほとんどすべての欄に何らかのコードリーディングで困った経験を書き込むことができそうです。

|                                                          | バグ修正 | 新規機能追加 | テスト | コードレビュー |
|:---------------------------------------------------------|:--------:|:------------:|:------:|:--------------:|
| コードそのものに問題がある                               |          |              |        |                |
| コードリーディングの基礎力が不足している                 |          |              |        |                |
| コードリーディング環境が整っていない                     |    ✓     |              |        |                |
| コードリーディング関連機能が足りない                     |    ✓     |              |        |                |
| コードリーディング方法およびテクニックが身についていない |          |              |        |                |
| コードリーディング後の情報整理ができていない             |          |              |        |                |
| コードリーディング時に量的・時間的制約がある             |          |              |        |                |
| ドキュメント、コメント等の資料がない、足りない           |          |              |        |                |
| 背景知識がない、足りない                                 |          |              |        |                |

例えばバグ発生の原因を解析しているときに、3,4個のファイルを開いて複数のクラスやメソッドの処理をたどっていると、2つ前に読んだメソッドの処理内容を忘れてしまっているというようなことがあります。これは記憶力のせいと言ってしまえばそれまでかもしれませんが、画面内に同時に複数ファイルのコードを表示する環境（マルチディスプレイ）や機能（ペイン機能）があれば十分に改善可能な課題であり、コードリーディング環境またはコードリーディング関連機能に起因する課題と分類することができます。

みなさんが実際の開発現場で直面するコードリーディング課題はどういった種類のものでしょうか？よく見かける課題、まれにしか出くわさないけれど解決できずに放置してきた課題など、この表のどこに分類されるのかを考えてみると、改善のためのヒントが見つかるかもしれません。

## 終わりに
コードリーディングに関する課題を完全に網羅できたというわけではありませんが、これほど多種多様なシチュエーションや開発現場でコードリーディングへの課題が発生しています。その複雑さゆえに、これらの課題にすべて対応できる人は稀です。コードリーディングは複雑でとっつきにくい厄介な仕事ではありますが、ソフトウェア開発を続ける限り、避けることはできません。コードリーディングとうまく付き合っていくためにも、コードリーディングを行う上でのさまざまな課題があることを意識し、それを少しでも改善していくために、今回の記事での分類や整理が役に立てば幸いです。

## 参考
[1] https://gigazine.net/news/20221031-tesla-engineers-reviewing-twitter-code/
[2] https://forbesjapan.com/articles/detail/51771