エンジニアだけど実務で機能改修を担当することになった。でもコードの量が多くてどう読めばいいのかわからないから納期に間に合うか不安。他人の書いたソースコードを効率よく読むコツとかあれば教えてほしい。
こんなお悩みにお答えします。
この記事で解説する「ソースコードを読むコツと注意点」を読めば、コードを読む力が圧倒的に向上し、すぐに実務に活用できる方法がわかりますよ。
僕自身、上記の方法を実践した結果、他の人が書いたソースコードを読む力が圧倒的に向上しました。とても開発効率があがったので、実体験をもとに解説しますね。
記事前半でコツを解説し、後半で注意点を紹介します。実際にプログラミング言語Javaのコードを用いて紹介します。
ぜひ最後までお読みいただき、プログラマーとして一段階レベルアップしてみてください。
他人の書いたソースコードを読む必要性
前提として、他人の書いたソースコードをなぜ読むべきなのかを解説します。
まず、他人の書いたソースコードは、エンジニアなら頻繁に読む機会があります。自社開発や受託開発にかかわらずです。
既存のシステムへの機能追加や新規開発など、他の機能を真似する際にも他人が書いたコードを読む場合があります。コードレビューの際にも他人が書いたコードを読む必要がありますね。
効率よく開発して納期に間に合わせるには、他人の書いたソースコードをいかに早く読み切れるかが重要です。
他人の書いたソースコードを読むコツ6つ
他人の書いたソースコードを読むコツを紹介していきます。
- 目的を実現する手段を考える
- システムの構成を理解する
- 読むべき箇所を特定する
- 必要な箇所を一行ずつデバッグ
- コメントやメソッド名から読み解く
- 論理的に考えながらコードを読む
順番に見ていきましょう。
目的達成に必要な手段を考えよう
ソースコードを読む前にすべきことが「今から何を実装するのか」を確認することです。当然ですが目的を明確にしなければ、何のためにそのコードを読むのかがわからないからです。
実装内容はプロジェクトリーダーや現場の責任者から指示があると思います。指示がなければ自分から聞きに行く必要がありますね。
コードを読む目的は言語化して解像度をあげることがポイントです。僕の場合はエクセルでこれから行う作業内容を書き出しています。目的を明確にしたあとは、それを達成するために必要な手段を考えます。設計書があれば基本的には設計書通りに進めればいいです。
まずは自分がやりたいことを明確にし、その目的を達成するために必要な手段を把握してからコードを読み始めてみてください。
システムの構成を理解する
ソースコードを読む際のポイントが、システムのクラスやファイル構成を理解することです。システムの構成とは、どのクラスが大まかにどんな役目を果たしているのかですね。
たとえば、JavaやRubyなどのオブジェクト指向の言語を扱う開発では、「MVC」と呼ばれる構成が用いられることが多いです。
Mode(モデルl): データやアプリケーションのロジックを表す。データの操作、変更、および処理を担当。モデルは、アプリケーションのデータやビジネスロジックを保持し、必要に応じて更新や変更を行う。
View(ビュー): ユーザーに表示されるインターフェースを表す。データの可視化や表示に関連する操作を担当。ユーザーに情報を表示し、ユーザーからの入力を受け付ける。
Controller(コントローラー): モデルとビューの間の通信と調整を担当。ユーザーからの入力を受け取り、それに基づいてモデルの更新やビューの更新を行う。コントローラーは、ユーザーのアクションに応じて適切な処理を実行する役割を果たす。
上記の通り。眠たくなりそうな小難しいことが書いていますが、重要ポイントですので耐えてください。
たとえば、〇〇Model.javaというクラスがあったとします。このクラスはModelなので、データベースから取得した値を格納する役割があることがわかります。Viewはフロントエンドに関するファイルなので、htmlやjspなどが該当します。
多くのシステムでは構成が作られているはずです。システムの全体の構成を理解することで、どのソースコードを読めばいいのかがファイルを特定しやすくなり、コードを読み進めやすくなります。
読むべき箇所を特定する
他人の書いたソースコードを読む際は、読むべき箇所を特定しましょう。全てのソースコードを上から下まで読むのは、規模の大きいシステムほど膨大な時間がかかりますし、非効率すぎるからです。
読むべき箇所を特定するには、システムの動きとソースコードを照らし合わせると良いです。たとえばログイン機能に関するソースコードを読むのであれば、「ログインボタンを押す→ログインクラスが動く」と予想できますよね。なので、この場合はログイン機能を実装しているクラスを見ればOKです。
実際のコードの例をみてみましょう。以下はJavaで書いたログイン機能のソースコードです。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
// ログインクラス
public class Login {
private static Map<String, String> users = new HashMap<>();
public static void main(String[] args) {
// ユーザーを追加
users.put("user1", "password1");
users.put("user2", "password2");
Scanner scanner = new Scanner(System.in);
System.out.print("ユーザー名を入力してください: ");
String username = scanner.nextLine();
System.out.print("パスワードを入力してください: ");
String password = scanner.nextLine();
// ユーザー名とパスワードの存在確認メソッドを呼び出す
if (login(username, password)) {
System.out.println("ログインに成功しました。");
} else {
System.out.println("ログインに失敗しました。");
}
}
// ユーザー名とパスワードの存在確認
private static boolean login(String username, String password) {
if (users.containsKey(username) && users.get(username).equals(password)) {
return true;
}
return false;
}
}
ログイン機能に関する開発をするなら、Loginクラスがメインになります。その他のログイン機能に関連性のないクラスは基本的に見なくて良いです。見る必要があるのはLoginクラスとそれに関わるクラスやファイルだけでOK。
読まなくて良い箇所も特定しよう
読むべき箇所を特定した後に、読まなくて良い箇所も把握しておきましょう。先程のJavaのコードを例にすると、「// ユーザー名とパスワードの存在確認メソッドを呼び出す」の条件分岐で呼び出しているloginメソッドの中身は読まなくてOKです。
// ユーザー名とパスワードの存在確認メソッドを呼び出す
if (login(username, password)) { // loginメソッドは読まなくて良い
System.out.println("ログインに成功しました。");
} else {
System.out.println("ログインに失敗しました。");
}
このloginメソッドは、ユーザー名とパスワードの存在確認をしていることが、コメントやメソッド名から読み取れますよね。なのでここは読まなくて良いのです。
もちろん「勉強がてらに読みたい」とか、「レビューなどで質問された時に答えれるようにしておきたい」という個人的な考えがあるなら読んでもOKです。
ただし完璧に理解しようとして納期に遅れのはよくないので、その辺りは臨機応変に対応してくださいね。
こんな感じで読むべき箇所と読まなくて良い箇所を判断していくと、効率よくソースコードを読んでいけます。
必要な箇所を一行ずつデバッグ
他人の書いたソースコードを読む際は、実装が必要な箇所を一行ずつデバッグすると効率よく読み進められます。デバッグすることで処理の流れを把握できます。
どの変数にどんな値が入っているのか、どういう流れでシステムが動くのかを把握できます。
デバッグはソースコードを読む際には必須の作業と言っても過言ではないので、こちらもフル活用していきましょう。
コメントやメソッド名から読み解く
ソースコードを読む際はコメントやメソッド名をよくみましょう。コメントは何をする処理なのかが書かれているので、コメントを読みながらコードを見ると理解の速度が向上します。
メソッド名や変数名、クラス名もよく確認すると良いです。多くの現場ではメソッド名1つにしても、意味のある名前でつけられていることが多いです。
以下で具体例をあげてみますね。
// SNSアプリクラス
class SNSApp {
private List<User> users;
public SNSApp() {
this.users = new ArrayList<>();
}
// 新しいユーザーを登録
public void registerUser(String username) {
・・・・
}
// 指定されたユーザーに投稿を作成
public void postToUser(String username, String content) {
・・・・
}
// ユーザー名でユーザーを検索
private User findUserByUsername(String username) {
・・・・
}
}
上記のコードを解説します。まず、クラス名が「SNSApp」となっていることから、SNSアプリに関するクラスだとわかりますよね。
続いてメソッド名です。「registerUserメソッド」を見ると、registerUserと書いてあることから、新規ユーザーを登録するんだなと予想できます。
同様にfindUserByUsernameメソッドなら、ユーザーを検索するんだと予想できますよね。もちろん予想だけで決めつけはダメですので、最終的にはデバッグをしながら予想と確信に変える必要はあります。
こんな感じでクラス名やメソッド名から、どんな役割をしているのかがわかることが多いのです。
論理的に考えながらコードを読む
ソースコードを読む最大のコツは、「論理的に考えながらコードを読む」です。なぜなら、多くのシステムのコードは処理が複雑だからですね。
断片的に読んでも、その前後の処理が理解できていなければ、全体感を掴めず結果的に仕様を理解できないです。仕様を理解できないと、なんとなくの実装をするしかなくなり、後々重大なバグに繋がり兼ねません。
「何でこのコードはこう書かれているのか?」「何でこのシステムはこう動くのか?」といった感じで読み進めていくと良いですね。プログラミング言語は、言語なので、日本語と同じように文を意識して読むのがコツです。
もちろん全て完璧に仕様を理解しなくてもOKです。でも少なくとも「自分がそう思った根拠」は誰かに説明する際に必要です。なので論理的に考えながら、人に説明できるようにコードを読む癖をつけると良いですね。
他人の書いたソースコードを読む際の注意点5つ
他人の書いたソースコードを読む際の注意点もご紹介しますね。これを知っているかいないかだけでモチベーションがかなり変わるので、ぜひ読んでみてください。
以下の流れで見ていきましょう。
- 扱う言語の基礎学習はしておく
- 不明点はその都度ググる
- 設計書がない場合は仕様をメモ
- 繰り返しソースコードを読む
- 読んでも不明な箇所は飛ばす
扱う言語の基礎学習はしておく
ソースコードを読む前に、実務で扱う言語の基礎学習はしておきましょう。これをしていないと、実務で一から調べながら作業をする必要があり、時間がかかってしまいます。結果的に納期に間に合わなくなる可能性がでてくるのです。
新人でもベテランプログラマーでも同じです。現場が変わって新しい言語を扱うことになったとしても、基礎文法やよく使うメソッド、条件分岐や繰り返し処理の書き方などは事前に学習しておくと、ソースコードを読む速さが向上します。
僕自身、Javaをメインに使ってきたのですが、3年目のタイミングでTypeScriptを使うことになりました。そのため、事前にTypeScriptの動画教材を購入して基礎を学習しました。おかげで実務に入った時に迷いが少なくコードを読めたので、やはり基礎学習は必要だと感じたんですよね。
不明点はその都度ググる
ソースコードを読んでいるとわからないことがでてきます。もし理解が必要なのであれば、放置せずにその都度ググりましょう。
たとえば、メソッドの意味や変数名の付け方など。基本的なことも含めて自分が理解できていないのであれば都度調べる必要があります。
以下でプログラマーにおすすめのググり方を解説していますので、ぜひ参考にしてみてください。
設計書がない場合は仕様をメモ
現場によっては設計書がなかったり、設計書はあるけれど情報が古かったりして使い物にならないケースがあります。その際は自分でソースコードを読みながら仕様をメモっていくと良いですよ。
たとえば僕は、エクセルやmacのメモ帳に、「Aクラスは〇〇をするクラス、Aクラスのaメソッドは〇〇をしている、aメソッドからbメソッドが呼び出される」というように、ざっくり処理の流れをメモしています。もちろん全てのコードをメモしているわけではなく、自分が実装するところだけなのと、処理が複雑な箇所だけをメモしています。
システムの規模が大きいほどソースコードの量も増えるので、記憶だけに頼るのは非効率です。忘れないように自分が実装する箇所の仕様はメモしておくと、後でいつでも見返せるようになるので、効率よく開発を進められます。
繰り返しソースコードを読む
プログラマーは繰り返しソースコードを読んで理解していきます。一度コードを読んだだけで仕様や処理の流れを理解するのは、よほどの天才か長年そのシステムに関わっている人でない限り不可能に近いです。
僕自身はフリーランスエンジニアとして働いており、半年から1年ごとに案件を変えるケースが多いので、1つのシステムに長く携わることは少ないです。フリーランスやSESで働いているエンジニアはみなさんそうだと思います。
そのため、一度で理解できないのは当然のことです。なので繰り返しソースコードを読んで1つずつ理解していければOK。1周目はなんとなくの理解、2週目は理解度60%。3週目は90%といった感じです。
読んでも不明な箇所は飛ばす
コードを読んでもわからない箇所がでてくるとことがあります。その際に深追いするかしないか迷う時ってありますよね。深追いしてわかればいいのですが、それでわからなかったら時間がもったいないです。
なので読んでも不明な箇所は、時には一旦読み飛ばすことが大事です。他のコードを読んでいくことで、読んでもわからなかった箇所との関連性がわかり、理解できるケースもあります。
どうしても今すぐ理解しないといけないなら、質問できる環境であれば質問するのもありですね。以下でエンジニアの良い質問の仕方を紹介していますので、特に新人の方は参考にしてみてください。
最初はざっくり理解することがポイント
他人の書いたソースコードを読むには、システムの構成を理解し、不明点はその都度ググりましょう。
最初から完璧にコードを読んだり仕様を理解することは難しいです。まずはどのクラスがどんな役割をしているのかなど、全体をざっくり理解することがポイントです。
その上で細かいところまでフォーカスしていき、読むべき箇所と読まなくて良い箇所を特定してみてくださいね。
今回は以上です。