Claude CodeやOpenAI Codexが凄いという話は聞いていたが、なかなか時間がなくトライできてなかった。夏休みの機会に実際に使ってみると想像を超えた能力をもっていることが体感できた。
Claude CodeをGithubと接続して、ペアプログラミングのような形で昔Cで書かれたプログラムをPythonにポートしてみた。このプログラムは何年も前からPython化したかったのだが力不足のため実現できてなかった。現在、まだバグがたくさん残っているが、骨格の部分は動いている。たぶんひとりでやると1年以上かかるソフト開発が一週間ぐらいに短縮されたというのが実感だ。
何が凄いって、まずCのコード一式をClaude Codeに渡して、これをPythonにしてというと20分ぐらいでPythonになる。いわゆるVibe Coding。Cをアルゴリズミックにコンバートしているのではなく、Cプログラムの内容を読み取って新たに書いている感じ。変数名や関数名、ロジックなど変わっている。たとえばLazy Evaluationをしている関数はLazy Evaluationが何かわかって書き換えている。Claude Codeは神様ではないので初版ばぼろぼろで300個のテストデータに対してほとんど失敗していた。それでも最初のステップとして、データ構造を設計して、一旦全体を通して動くコードを書くところに至るまでにかなりの労力が必要なので、そこがスキップできるのは素晴らしい。
注意が必要なのは、Claude Codeと対話している内容が必ずしもコードに反映されてないこと。このあたりは実際に自分でプログラムできる能力がないとバグをなくせない。たとえば、「ある条件で処理Aを入れて」といって、「はい分かりました変更しました」と返答されても、実際にコードをみると複雑な条件を正しくコーディングできていない。Claude Codeが持っているある種の思い込み(事前確率)にそって条件を書いてしまうので、こちらの指定を無視することがある。また、勝手にテストを繰り返し、トークンを大量に消費することもある。「やめろ」と言えば一旦はやめるが、そのうちまた全項目テストを始めてしまう。これは、過去から続く長い対話履歴の中で指示したことが確率計算の中で減衰してしまうために起こる現象。こちらのことを理解して対話しているように見えても、ただ適当なことを言っているだけということがある。いわゆるポチョムキン理解。
一方、人間的なプログラム修正も行う。バグがあると、それに関連するコードをあちこち参照する。grepを使って関数名をファイルから拾ったりする。また、驚いたのは、check writeを入れてバグを調べていたこと。私もプログラムの各ポイントにプリント文を入れて変数の状態を確認するのだが、同じことをClaude Codeもやっていた。また、どれぐらい完全にやっているのかはわからないが、論文を与えてこの処理はこの論文に従っているというと、論文の処理との整合性を確認してくれる。
最後にClaude Codeを使うと楽になるのは間違いないが、実は1日の労働時間は増える。Claude Codeが疲れることなく24時間プログラミングするので、動作確認をして指示を出す側の人間も自然と24時間体制で対応してしまう。夜中の3時に進捗確認して、指示を出してまた寝ることになる。これはかなり健康に良くない。