はじめに
最近はAIを使ってアプリの修正をすることが増えました。指示を出せば、それなりに動くコードがすぐに出てきます。
その一方で、「動いたからOK」とソースの中身を理解しないまま作業を終えてしまうことが、自分にもありました。
だからこそ私は、AIにコードを書かせる時代だからこそ、人間が1行ずつコードを読むことが大事だと考えています。この記事では、なぜそう考えるのかを整理します。
私はコードレビューで鍛えられた
AIがなかった頃、私はコードレビューでたくさんの指摘を受けてきました。
そこで、コードレビューに臨む前にコードを1行ずつ読み、「なぜこう書いたのか」「このコードがどう動いているのか」を説明できるようになるまで読み込むようにしていました。
今振り返ると、この習慣がプログラマーとしての力の土台になっていたと感じています。
動く≠正しい
「動いた」は「正しい」ことを意味しません。
例えば下記のような「変数.equals() で比較する」コードです。
if (status.equals("0")) {
// 処理
}
普段のテストでは status に必ず値が入っているので、問題なく動きます。しかし、DBの値が未設定だったりAPIから値が返ってこなかったりして status が null になると、NullPointerException で落ちます。
if ("0".equals(status)) { // statusがnullでもfalseになるだけで落ちない
// 処理
}
正しくは、このように定数側から equals を呼び出します。
動作確認ではOKになりますが、「この変数はnullになりうるか」という1行の意味を「理解」していれば、読んだ瞬間に気づくことができます。
「理解」とはどういう状態か
「理解するまで読む」と言っても、そもそも理解するとはどういうことなんだろうと感じました。
そこで、理解をできることで定義してみます。
- 知っている:読んで「なるほど」と思える(まだ理解ではない)
- 説明できる:何も見ずに、自分の言葉で「何をしているか・なぜか」を言える
- 予測できる:初めての入力(null、空、境界値など)が来たとき、どう動くか実行前に当てられる
- 変更できる:仕様が少し変わったとき、他を壊さずに直せる
- 判断できる:別の書き方と比べて、なぜこれがいいのかを言える
私は、少なくとも「3. 予測できる」まで行くことが、「理解した」の最低ラインだと考えています。
説明だけなら丸暗記でもできますが、予測は中身を理解していないとできないからです。
なぜ1行ずつ読むことが大事なのか
関数が何をしているかは、関数名や全体の雰囲気ではなく、1行1行の積み重ねで決まります。
どこか1行でも読み飛ばすと、「だいたいこういう関数」という思い込みが残り、実際の動きとズレてしまいます。次のコードで見てみます。
List<User> getUsers(List<User> users) {
List<User> result = new ArrayList<>();
for (User u : users) {
if (u.isDeleted()) continue;
if (u.getLastLogin().isBefore(LocalDate.now().minusYears(1))) continue;
result.add(u);
}
result.sort(Comparator.comparing(User::getName));
return result.subList(0, Math.min(10, result.size()));
}
ざっと読んだ場合
関数名とループの形から、「ユーザーの一覧を返す関数」に見えます。
1行ずつ読んだ場合
1行ずつ読むと、実際はこういう関数だと分かります。
-
if (u.isDeleted()) continue;:削除済みのユーザーは除く -
if (u.getLastLogin()...) continue;:1年以上ログインしていないユーザーも除く -
result.sort(...):名前順に並べ替える -
result.subList(0, ...):先頭の10件だけ返す
どの1行を飛ばしても、この関数の説明が変わってしまいます。
1行読み飛ばすと何が起きるか
たとえば最後の1行を読み飛ばすと、「全件返す関数」だと思い込んでしまいます。
その結果、画面に11人目以降が表示されないことを不具合だと勘違いしたり、この関数を別の機能で使い回して「件数が足りない」というバグを生んだりします。
コード自体は正しく動いているのに、読む人の理解がズレているせいで問題が起きるわけです。
1行ずつ読むと「説明できる」ようになる
1行ずつ読んで初めて、「この関数は、削除済みと1年以上ログインしていないユーザーを除いて、名前順に並べた先頭10件を返す」と、自分の言葉で正確に説明できるようになります。
これは前に挙げた「理解」の5段階のうち、「2. 説明できる」にあたります。そしてこの説明ができて初めて、「この関数に0件のリストが来たら?」と「3. 予測できる」に進めます。
特にAIが書いたコードは見た目が整っているので、ざっと眺めただけで分かった気になりやすいです。だからこそ、1行ずつ読むことが大事だと考えています。
おわりに
AIのおかげで、動くコードを手に入れるコストは劇的に下がりました。
だからこそ、人間の価値は「動くコードを書くこと」から「コードを理解し、正しいと判断できること」だと感じます。
1行ずつ読むことは、地味で時間のかかる作業です。
でもそれが、関数が本当は何をしているのかを正しく把握し、AIが書いたコードを読む力を育ててくれます。
「動いたからOK」で終わらせず、1行ずつ読んで、自分の言葉で説明できるまで理解する。
AIにコードを書かせる時代だからこそ、この習慣を大事にしていきたいです。
