エンジニアだけど実務で機能改修を担当することになった。でもコードの量が多くてどう読めばいいのかわからない。納期に間に合うか不安だなぁ。他人の書いたソースコードを効率よく読むコツとかあれば教えてほしい。
こんなお悩みにお答えします。
この記事で解説する「ソースコードを読むコツと注意点」を読めば、コードを読む力が圧倒的に向上し、すぐに実務に活用できるようになりますよ。
僕は現役のフリーランスエンジニアです。現在はフロントエンドエンジニアとしてWeb開発企業で働いています。実体験をもとに解説していきますね。
記事前半で「他人の書いたソースコードを読む必要性」をさくっと解説し、後半で「ソースコードを読むコツや注意点」を紹介します。
ぜひ最後までお読みいただき、プログラマーとしてレベルアップしてみてください。
他人の書いたソースコードを読む必要性
前提として、他人の書いたソースコードを「なぜ読むべきなのか」を解説します。
まず、他人の書いたソースコードは、エンジニアなら頻繁に読む機会があります。自社開発や受託開発にかかわらずです。
どういった時に、他人が書いたソースコードを読むのか?それは主に以下の時です。
- 既存システムへの機能追加
- 新規開発時に実装済みの他の機能を真似して実装するとき
- 人の書いたソースコードをレビューする時
- 自分が書いたソースコードをセルフレビューする時
上記の通り。
効率よく開発して納期に間に合わせるには、ソースコードをいかに早く読み切れるかが重要です。
他人の書いたソースコードを読むコツ6つ
他人の書いたソースコードを読むコツを紹介していきます。
- コードを読む目的を明確にする
- システムの構成を理解する
- 読むべき箇所を特定する
- 必要な箇所を一行ずつデバッグ
- コメントやメソッド名から読み解く
- 論理的に考えながらコードを読む
順番に見ていきましょう。
コードを読む目的を明確にする
まず、ソースコードを読む前に、「今からなんでそのコードを読むのか?」を明確にすることが重要です。
理由としては、コードを読む目的を明確にしなければ、何のためにそのコードを読むのかがわからずモチベーションが上がらないからです。モチベが上がらないと、よくわからないコードが出てきた時にすぐにコードを読むのを諦めて、投げ出してしまいがち。
では、コードを読む目的とは一体どんなことか?記事冒頭でも解説しましたが、
- 既存の機能を参考にして作りたい
- 既存システムのバグをなおすため
- 勉強用で人のコードを読みたい
- レビューでコードを読まないといけない
上記がコードを読む目的として多いかなと。
こんな感じで、まずは自分がやりたいことを明確にし、その目的を達成するために必要な手段を把握してからコードを読み始めてみてください。
システムの構成を理解する
ソースコードを読む際のポイントが、まずはシステムのクラスやファイル構成を理解することです。
なぜ、システムの構成を先に理解する必要があるのか?この答えは、「木を見て森を見ず」の状態をなくすためです。
つまり、全体を把握してから徐々に細かい部分に絞っていくことで、コードがどんな流れで動いているのかがイメージしやすくなります。これがコードを読むコツの1つです。
たとえば、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%といった感じです。
ちなみにフリーランスエンジニアなら色々な現場を経験できるので、幅広いスキルを身につけられます。また、高収入を得られる可能性も高いです。僕はフリーランスになってからスキルも収入もかなりあがりました。
興味のある方は、以下でフリーランスエンジニアになる方法をご紹介しているので、あわせてチェックしてみてください。
読んでも不明な箇所は飛ばす
コードを読んでもわからない箇所がでてくるとことがあります。
その際に深追いするかしないか迷う時ってありますよね。深追いしてわかればいいのですが、それでわからなかったら時間がもったいないです。
なので読んでも不明な箇所は、時には一旦読み飛ばすことが大事です。他のコードを読んでいくことで、読んでもわからなかった箇所との関連性がわかり、理解できるケースもあります。
どうしても今すぐ理解しないといけないなら、質問できる環境であれば質問するのもありですね。
以下でエンジニアの良い質問の仕方を紹介していますので、特に新人の方は参考にしてみてください。
最初はざっくり理解することがポイント
他人の書いたソースコードを読むには、システムの構成を理解し、不明点はその都度ググりましょう。
最初から完璧にコードを読んだり仕様を理解することは難しいです。まずはどのクラスがどんな役割をしているのかなど、全体をざっくり理解することがポイントです。
その上で細かいところまでフォーカスしていき、読むべき箇所と読まなくて良い箇所を特定してみてくださいね。
今回は以上です。