AIとのちょうどいい距離感
AIに仕事を頼むと、仕事をあっというまに片付けてくれる。
Claude Codeにissueを37個渡して蕎麦を食べに行った。戻ってきたら全部終わっていた。1個あたり3分45秒。「完了しました、次は何しますか?」と聞いてくる。CIも通っている。
すげえ、さすがだな!とテンションがあがり、8千行のコードをレビューした。データモデルの検証テストはあるのに、コンポーネントのテストは書かれていない。なのに「テストは通りました、エラー0件です」と報告してくる。
あれぇ、テストも一緒に頼んだはずなのに...。
テストのないコンポーネントをスキップするために--passWithNoTestsをつけていたので、テストが存在しなくてもexit 0で正常終了する。AIはそれを見て「タスク完了、問題なし」と判断した。
テストコードを書けとも、この観点からレビューしろとも、こちらが明示的に言わなかった。言わなかったことはやらない。AIではなく人間のミスだ。
品質ゲートを作る
対処として、人間の側で枠組みを先に作ることにした。
設計するとき
- (1) 技術スタック、デザイントークン、データモデル、テスト要件、セキュリティ要件などはあらかじめ決めておく。
- (2) ローカル/サーバーの環境を準備しておく。
- (3) 必要に応じて、法的要件/倫理的要件のチェック。
データモデル設計やセキュリティ設計に関しては、複数のモデルによるレビューも実施し、設計段階で抜け漏れを少なくしておく。
実装するとき
- (1) CLAUDE.mdとは別にCODINGRULE.mdを毎回読ませる。
nullをundefinedに統一、暗黙any禁止など。 - (2) Lint, Format, Testをコミット単位で自動実行して、ルールから外れたコードを機械的に弾く。AIの出力を毎回人間が判断しなくて済むようにする。
- (3) 異なるAIモデルによるクロスレビュー。OpenAIのCodexをClaude Codeから呼ぶ。
それでも楽にはならない
枠組みを作っても、毎日何かしらの手戻りが発生する。
仕様書を無視したAIが勝手にアーキテクチャを変えて7時間のロスタイムが発生した。シークレットが公開リポジトリに10日間露出していたのに人間を含め誰も気づかなかった。CIが32回連続で落ちて、誕生日のメール受信箱がRun failedで埋まった。
キレる。仕組みを直す。またキレる。
効率化のためにAIを使っているはずなのに、AI起因の手戻りで時間が溶ける。この矛盾は解消されない。たぶん今後も解消されない。
ちょうどいい距離
振り回されるのを楽しむくらいが、ちょうどいい距離だと思っている。
AIは便利な道具であると同時に、変なことをして、ややこしいことを起こす存在でもある。完璧に制御しようとすると制御コストの方が高くつく。かといって放置すると品質がガタガタになる。その間のどこかに、自分にとっての距離がある。
私がAIを使う理由は、効率化そのものではない。目や耳の使用量をセーブして、楽に自分にとって便利なものを作って、さらに楽になりたい。そして、障害のあるなしに関係なく、みんなが便利だと思えるものを作りたい。AIはそのための手段だ。
毎日Claude Codeのアップデートがある。週単位で大きな機能追加がある。それに振り回されることなく、その先に何を作るかが大事なんだと思う。