関数の説明コメントと実際の動きが食い違っていることに気づき、画面を見つめながら静かに考え込んでいる開発者

AIにdocstring・コメントを書かせる|後で嘘にならない書き方

「この関数、None を渡すと空のリストが返るって書いてあったんですけど……例外で落ちました」

レビューでそう言われて、該当の関数を開いてみる。docstringには確かに「None の場合は空のリストを返す」と書いてあります。でもコードを読むと、その分岐は半年前の修正でなくなっていました。コードは直された。コメントは、そのまま残った。

しかもそのdocstring、書いたのは自分ではなく、AIに「この関数にdocstringを付けて」と頼んで出てきたものでした。引数も戻り値も例外も、きれいにそろっていて、読んだときは「助かる」と思ったはずです。

コメントが古くなるのは、昔からよくある話です。ただAIに書かせるようになってから、少し事情が変わりました。量が一気に増えること、そして整っているぶん、ずれていても疑われにくいことです。

この記事では、AIにdocstring・コメントを書かせるときに、あとで嘘にならない形にしておく方法を整理します。docstringとは、関数やクラスの先頭に書く「何をするものか」の説明文のこと。Pythonでは文字列として、JavaScriptやJavaではJSDoc・Javadocのようなコメントの形で書きます。

結論:順番は3つです。①絞る——コードを読めば分かることは書かせない。「なぜこうしたか」「呼ぶ側が知っておくべき約束」だけを残す。②確かめる——AIが書いたdocstringの引数・戻り値・例外・例を、1行ずつコードと突き合わせる。例はできれば実行して確かめる。③一緒に直す——コードを変えたら、同じ差分でコメントも直す。コメントもレビューの対象にする。

覚え方は 絞る → 確かめる → 一緒に直す。①で量を減らすと②が回り、②で一度正しくすると③で保ちやすくなります。

今日ぜんぶやる必要はありません。①の「なぜ、だけ残す」を1つの関数で試すだけでも、コメントの読み方が変わります。

何が起きているのか——AIのコメントは「今のコード」の写しになりやすい

大量の付箋から数枚だけを選び取る場面、書類と機械を見比べて確かめる場面、部品の交換と同時に説明書きの札も付け替える場面を並べた図
後で嘘にならないコメントの作り方。絞る→確かめる→一緒に直す。書く量を減らし、中身をコードと突き合わせ、コードを変えたら同じ手でコメントも直す

打ち手の前に、なぜAIに書かせたコメントがずれやすいのかを整理します。原因が見えると、どこを絞ればいいかが分かります。

1つ目は、AIは「コードに書いてあること」を言い換えるのが得意なこと。関数を渡して「docstringを付けて」と頼むと、AIはコードを読んで、その動きを日本語や英語に直します。# ユーザーIDでユーザーを取得する のような、コードと同じことを2回書いたコメントがたくさんできます。コードと同じことを書いているぶん、コードが変わった瞬間にずれます。

2つ目は、「なぜ」はコードの外にあること。「この外部APIは100件ずつしか返さないので分割している」「経理の締めに合わせて、ここは日本時間で切っている」。こうした理由は、打ち合わせや過去の障害の中にあって、コードだけを渡されたAIには見えません。いちばん残したいコメントほど、AIには書けないのです。

3つ目は、もっともらしく埋めてしまうこと。「例外」の欄があれば、何か書こうとします。実際には投げない例外や、呼び出し先の実装に依存する挙動を、それらしく書いてしまうことがあります(AIのハルシネーションの見抜き方|開発現場で気づく型)。

4つ目は、量が増えると読まれなくなること。全関数にAIがdocstringを付けると、ファイルの半分がコメントになることもあります。全部に書いてあると、どれが大事な注意書きか分からなくなり、結局だれも読まなくなります。

5つ目は、コメントはテストで落ちないこと。コードが間違っていればテストが落ちますが、コメントが間違っていても何も起きません。ずれは、誰かが信じて使った日にはじめて表に出ます。

裏を返すと、これは書き手の不注意の話ではなく、書かせ方と直し方の仕組みの話です。書く量を絞り、中身を確かめ、直す流れに組み込めば、AIはコメント作りのかなり頼れる相棒になります。

具体例——つい、こうなりがちという形

どれも「ないよりはあったほうがいい」という善意から生まれます。心当たりのある行があれば、そこだけ見れば十分です。

影響——ずれたコメントは、ないコメントより迷わせる

急いで全部消さないと危ない、という話ではありません。ただ、ずれたときの迷い方が大きい種類の問題なので、書いておきます。

少し安心できる話をすると、この領域は、書く量を減らすほど楽になります。全部を正しく保とうとしなくていい。残すものを絞れば、確かめる量も直す量も一緒に減ります。

明日からやること(絞る・確かめる・一緒に直す)

上から順に、小さく始められます。今日は①だけで構いません。

1. 絞る——「なぜ」と「約束」だけを書かせる

AIに「docstringを付けて」とだけ頼むと、コードの言い換えが返ってきます。何を書いてほしいかを先に伝えるだけで、出てくるものがかなり変わります。

2. 確かめる——書かれたことを、1行ずつコードと突き合わせる

AIが書いたdocstringは、コードの説明ではなく、コードについての主張として読みます。主張なので、確かめます。

3. 一緒に直す——コードの差分に、コメントの差分を含める

コメントがずれるのは、コードを直したときに、コメントを直す流れがないからです。直す流れに、コメントを最初から入れておきます。

AIに相談するときのプロンプト(コピーして使えます)

何も伝えないと、AIはコードの言い換えを全部の関数に付けてきます。書くもの・書かないもの・推測しないことを、先に伝えるのがコツです。

次の関数に、後で嘘にならないdocstringとコメントを付ける手伝いをお願いします。

①docstringは、呼ぶ側が知っておくべき約束だけを書いてください(引数の前提、戻り値の意味、投げる例外、副作用)。形式は( )でそろえてください。
②コードを読めば分かることは書かないでください。処理の手順をなぞるだけのコメントは不要です。
③「なぜこう書いたか」のコメントは、下に渡した背景の情報から分かるものだけ書いてください。背景が渡されていない箇所は推測で理由を書かず、「理由の確認が必要」と一覧にしてください。
④例外や戻り値は、このコードの中で実際に確かめられるものだけを書いてください。呼び出し先の挙動に依存するものは、その旨を書き分けてください。
⑤「高速」「安全」などの性質を表す言葉は、根拠をコードから示せる場合だけ使ってください。
⑥最後に、docstringに書いた内容のうち、コードから裏付けを確かめてほしい箇所を一覧にしてください。

対象のコード:( ) 背景の情報(チケット・打ち合わせメモ・過去の障害など):( ) 使っているdocstringの形式:( )

③の一文が効きます。「分からない理由は書かずに一覧にして」と先に伝えるだけで、それらしい理由が作られてしまうのを防げます。一覧に出てきた箇所は、知っている人に聞きにいく入口になります。

出てきたdocstringは、次の3点だけ自分の目で確かめます。(1)自分が渡していない背景が、理由として書かれていないか、(2)書かれている例外・戻り値の分岐が、コードに本当にあるか、(3)使用例がそのまま動くか。この3点は、文面が整っていてもずれていることがあります(AIが書いた単体テストを信用しすぎない|確認ポイント)。

後で嘘にならないコメントのチェックリスト(コピーして使えます)

全部に○が要るわけではありません。気になった行だけで十分です。

① 絞る

② 確かめる

③ 一緒に直す

この記事のまとめ

AIに書かせたコメントがずれるのは、書き手の不注意ではなく、書かせ方と直し方の仕組みの問題です。AIはコードを言い換えるのが得意なぶん、コードと同じことを書いたコメントが増え、コードが変わった瞬間にずれていきます。

やることは3つ。①絞る——コードを読めば分かることは書かせず、「なぜ」と「呼ぶ側への約束」だけを残す。②確かめる——引数・戻り値・例外・例を、1行ずつコードと突き合わせ、例は動かしてみる。③一緒に直す——コードを変えたら同じ差分でコメントも直し、コメントもレビューの対象にする。

AIに頼むときは、「分からない理由は推測で書かずに一覧にして」と先に一言添える。それだけで、コメントが「それらしい文章」から「確かめられる約束」に変わります。

朝のオフィスで、同僚と並んで画面を見ながら、短く整ったコードの説明に納得して穏やかに笑い合っている開発者

コメントを信じて呼んだ関数が違う動きをしたとき、まず自分の読み方を疑ったかもしれません。実際には、コメントを書いた日のコードと、今日のコードが違っていただけでした。

コメントは、全部をいつも正しく保つ種類のものではありません。残すものを絞って、確かめられる形にしておく種類のものです。量が減れば、守るのはずっと楽になります。

今日は、よく呼ばれている関数をひとつ開いて、docstringの「戻り値」の行だけをコードと見比べてみる。それだけで、次にそのコメントを読む誰かが、迷わずに済む日が近づきます。

よければ、こちらも

関連用語