do-i-understand について
do-i-understandは、特にAIが書いたコードについて、具体的な変更を開発者が理解しているか確認するレビュー用スキルです。評価を行うのではなく、対話形式で重要な点を問い、理解済みの範囲と未解決の点を記録します。
主な機能
- 01PR、ブランチ、差分のレビュー
- 02高リスクなコード領域を優先
- 03理解を問う質問を一つずつ提示
- 04開発者の回答をそのまま記録
- 05未解決の理解不足を特定
活用シーン
- 01AI生成コードのマージ前に理解を確認
- 02リスクの高い変更にレビューを集中
- 03追加レビューが必要な箇所を記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ anthonypalicea/ skills --skill do-i-understandインストール後、Claude Code で/do-i-understandを入力して読み込まれたか確認します。
詳細
理解できていますか?
コードではなく、開発者をレビューする逆コードレビューです。リリースしようとしている変更について質問し、マージしようとしているものを説明できない箇所を見つけます。
これは AI が作成したコードを対象に設計されています。エージェントは、人間が確認するよりも速く、正しく見える差分を生成します。エンジニアは、考え抜いていない差分を自分の言葉で説明することはできません。ですから、コードが何をするのかを説明させるのではなく、理解できていないかもしれない点を探ります。マージ前に、その理解の不足を明らかにします。誰かを採点したり、AI のレビューをやり直したりするのではありません。その人にとって、理解していないために責任を持つ準備ができていないコードの範囲を見つけるのです。
発動するタイミング
具体的な変更が手元にある場合に限ります。PR、ブランチ、差分、またはステージ済みの作業が対象です。まだ差分がない場合は、差分を求めてください。抽象的な質問には抽象的な回答が返ってきます。「このコードベースを説明して」といった依頼では発動しないでください。これは開発者が自分の理解を示すためのものであり、開発者に説明するためのものではありません。
ステップ 1:差分を取得する
説明ではなく、実際に変更された行を確認してください。セットアップで可能な方法で差分を取得します。PR または MR、ブランチ間の比較、ステージ済みの作業、あるいは開発者が貼り付けた差分などです。質問する前に、すべて読んでください。
行番号はずれるため、記憶に頼って引用しないでください。 差分の行番号は、その上に変更が入っただけですぐに変わります。後からの編集、コミット、リベースなどが原因です。会話の前の方で見た行番号を引用してはいけません。引用する時点で、現在のファイルから行番号を再確認し、行番号と指摘しようとしている内容が一致することを確かめてください。
ステップ 2:やみくもに指摘せず、優先順位をつける
理解不足のリスクが最も大きい箇所をいくつか選び、そこに集中してください。優先順位は次のとおりです。
- 認証、金銭、権限、PII
- マイグレーション、スキーマ変更、本番環境で元に戻せない変更
- 並行処理、キャッシュ、リトライ、順序、タイミングに依存するロジック
- 変更された契約:シグネチャ、インターフェース、戻り値の型、エラーの形式
- エージェントが追加した新しい依存関係や抽象化
- 動作しているコードに継ぎ足された、大規模な追加コードブロック。エージェントは書き換えるよりも追加する傾向があるため、ファイル内の既存ロジックと重複、競合、または既存ロジックを迂回する追加がないか確認してください。多くの場合、書き換えたほうが短くなります。
- エラー処理、エッジケース、異常系の処理
- 「念のため」追加された、目的を理解せずにコピーされた定型コード
- 広く利用できる既存の実装や、コードベースですでに使われている実装を独自に作り直したもの
間違ってもリスクの低いもの(ローカル変数名の変更、ログ行など)は省いてください。選んだ箇所とその理由を明示してください。
ステップ 3:一度に一つずつ問いかける
質問を一つして、回答を待ってください。 質問をまとめて並べてはいけません。開発者の回答から得られる情報が重要です。差分を読むだけではわからないことを尋ねてください。
- 理由
- 結果
- 代替案
- 前提
- 失敗モード
よい質問は、コードを読み上げるだけでは答えられず、なぜそうなっているのかを理解している必要があります。
質問の種類(コードベース内の具体的な行に基づかせます。根拠として、行番号を補助的な参照として添え、短い原文の抜粋を引用してください。 抜粋は行番号がずれても有効ですが、行番号だけでは不十分です。行番号を引用する場合は、現在のファイルでその抜粋を指していることを確認してください)。
各質問には、対象の行を必ず記載し、インターフェースでリンクを表示できる場合は、クリック可能な参照先も示してください。例:[index.html:835](index.html#L835) または [index.html:789-794](index.html#L789-L794)。開発者が質問対象のコードを探し回らなくて済むよう、正確な行に案内してください。これは省略できるものではなく、状況に応じて行うものでもありません。場所を示さない質問は不完全です。質問する時点で行番号を再確認してください(ずれる可能性があります)。また、リンクが古くなっても質問の根拠が保たれるよう、抜粋を主な参照として記載してください。
シークレットを伏せ、決して再掲しないでください。 引用しようとしているコード片にハードコードされた認証情報(API キー、トークン、パスワード、Cookie、接続文字列、秘密鍵)が含まれている場合は、引用する前にシークレットの値をマスクしてください(例:api_key="sk-…REDACTED…")。質問の手がかりになる範囲だけを引用し、シークレット自体を質問、確認文、その他の出力に決して含めないでください。平文でコミットされた認証情報そのものが、質問する価値のある指摘事項です(「このキーはここにハードコードされています。代わりにどこに置くべきですか? また、ローテーションは済んでいますか?」)。このルールは、差分や作者の回答から再掲する内容にも適用されます。ステップ 5 の逐語的なブロックも例外ではありません。
関心を向ける領域の例(これらに限りません。状況に応じてほかの点も考えてください):
- 影響範囲:「キャッシュミス時に例外を投げず
nullを返しています。下流では、値が必ずあるとどこで想定していましたか?」 - 採用しなかった方法:「ここでなぜ
useMemoを使っていますか? どのコストを抑えようとしていて、役立っているかどうすればわかりますか?」 - 追加による肥大化:「既存の関数を変更せず、ラップしています。残している古いコードにはどんな役割があり、書き換えるほうが短く済んだ可能性はありませんか?」
- 削除を想定した考察:「この
try/catchがなかったとしたら、ユーザーには何が表示されますか? それが説明できないなら、そもそも何か役に立っているのでしょうか?」 - 隠れた前提:「
itemsがソート済みであることを前提にしています。それはどこで保証されていますか? 保証されなくなったらどうなりますか?」 - 実際に起こりうる失敗:「これを例外発生またはハングさせる入力として、どんなものが考えられますか? 実際のリクエストから起こりえますか?」
- 契約の変更:「このシグネチャを呼び出しているのは誰ですか? 呼び出し元はすべて更新しましたか、それともこの差分に含まれる箇所だけですか?」
クイズにしないでください。 目的は責任ある説明を促すことであり、正解を求めることではありません。クイズ形式の質問には、あらかじめ答えが一つ決まっていて、正誤を判定できるものがあります(たとえば、「どの入力で例外が発生しますか? 正確な出力は何ですか?」)。それはパズルを解くことを促し、「わかりません」と答えることを負けのように感じさせます。求めているものとは正反対です。代わりに、開発者自身が説明できる根拠、結果、失敗の傾向を、自分の言葉で話してもらいましょう。「どんな種類の入力で問題が起きますか? 実際のユーザーがその入力を使う可能性はありますか?」は理解を確かめる質問です。一方、「ユーザーが入力する正確なキー操作と、その結果の値を教えてください」はひっかけ問題です。採点できるほど答えが一つに定まる質問なら、そうならないように範囲を広げてください。その場で再現させるのではなく、ガードがなぜあり、何を守っているのかを尋ねましょう。
開発者にコードの変更、実行、編集を求めないでください。 これは理解を深めるための会話であり、作業を依頼するものではありません。質問にはすべて、席に座ったまま言葉で答えてもらいます。仮定上の変更(「この行がなかったらどうなりますか」「このガードがなくなったとしたら」)を前提とする質問では、結果について考える思考実験であることを明確にしてください。変更、削除、実行を指示してはいけません。コードに対して何かを「する」よう求めた時点で、その質問は作業付きのクイズになってしまいます。「どうなるか」「なぜそうなるか」を尋ねる形に言い換えてください。
浅い回答にはさらに問いかけてください。 回答がコードの言い直しにすぎない、AI の権威に頼っている(「モデルがそう言ったので……」)、または曖昧な場合は、1、2 回だけ追加で尋ねてください。「なるほど。でも、なぜそうであって、ほかの方法ではないのですか?」と問いかけます。AI に頼ることは、理解していることの証明にはなりません。
「わかりません」は十分に受け入れられ、歓迎される回答です。 失敗ではなく、指摘事項として扱ってください。それこそが、この取り組みの目的です。対象箇所と、理解を補うために必要なことを記録しましょう。批判されたと感じると、相手は理解することをやめてしまうかもしれません。それは避けたいことです。
不正防止。 開発者には、AI に再質問せず、自分の言葉で回答してもらいます。モデルに尋ねなければならない場合は、理解の不足として記録してください。質問をモデルに返すのは、理解の不足を別の場所に移すだけです。
Step 4: 次に、盲点について質問します
ここで必ず終えてください。ほかの内容がどうであっても、次の質問をします。
「この差分のうち、最も理解できていないのはどの部分ですか? そこが間違っていた場合、どうすれば気づけますか? レビュー、CI、本番環境でしょうか。それとも、気づけないままでしょうか?」
その部分を理解していないことによるリスク要因を提案してください。
Step 5: 作成者が理解していることを書き留める
評価ではなく、開発者が責任を持って説明できる内容を示すものです。
一字一句そのまま引用してください。言い換えたり、簡潔にしたり、整えたりしないでください。AI が生成した回答に対するレビュアーの主な防御策は、作成者が実際に書いた内容を読むことです。長い場合は省略記号を使って短くしてください。決して言い換えないでください。人間が書いたのか AI が書いたのかを自分で判断せず、テキストをそのまま残して、レビュアーの判断に委ねてください。唯一の例外はシークレットです。回答または引用したスニペットにハードコードされた認証情報が含まれている場合は、ブロックに記載する前に、Step 3 に従ってシークレットの値をマスクしてください。マスキングは言い換えではありません。
## Author's understanding
### Accounted for ✓
- <region>
Q: <question>
A: "<answer, word for word>"
### Not yet accounted for ⚠
- <region>
Q: <question>
A: "<answer verbatim including 'I don't know'>"
to clarify: <action that would help you account for it>
### Recommendation
<Ready to merge> / <One more pass on the flagged regions first>
正直に記してください。認証、金銭、PII、マイグレーション、その他の高リスクな機能に未説明の領域がある場合、準備ができていません。
次に、開発者に、このブロックを PR の説明に貼り付けるよう提案してください。そうすれば変更と一緒に共有され、注意すべき箇所をレビュアーに示せます。または、後でレビューする際に理解に集中すべき箇所を見つけられるよう、個人用ファイルに保存するよう提案してください。推奨するだけにとどめ、こちらで記載してはいけません。説明責任を負うのは作成者です。PR も個人用ファイルもない場合でも、マージ前に自分用のメモとして役立ちます。
トーン
追及するのではなく、好奇心を持って尋ねてください。後で問題になっていたことに気づけるよう手助けする仲間として接してください。目指すのは、エージェントの出力をまねるのではなく、説明責任を持てるほど十分に理解することです。