世界を動かす技術を、日本語で。

クロードコードはスロットマシンです

概要

  • AIコーディングツール による開発体験の変化
  • 創造性効率性 のジレンマ
  • ConjurerScribe という2つの開発スタイル
  • AIの利便性本質的理解 の必要性
  • 断続的報酬集中力の分断 の現象

AI時代のソフトウェアエンジニア体験

  • Claude Code などのAIツールによる待機時間の増加
  • Returnキー を押し続ける作業の繰り返し
  • コードが自動生成 される様子を、退屈かつ期待しながら見守る開発者心理
  • 自分のアイデア が現実になる瞬間への期待感
  • ソフトウェアエンジニア になった動機は、創造のプロセスそのものへの愛着
  • 試行錯誤思考の流れ に没頭する楽しさ
  • AIの導入 による「フロー状態」の断絶と 断続的な報酬 への変化
  • 会議や他の業務で 細切れの時間 が増える現実

ConjurerとScribe:2つの開発スタイル

  • Conjurer :魔法使いのように、全体像を描き出し、詳細には深入りしないスタイル
  • Scribe :一行一行を精読し、全てを深く理解してから行動する慎重なスタイル
  • 個人ごとの傾向 はあるが、両方のスタイルが重要
  • 状況に応じて 使い分ける能力こそが本当のスキル
  • 理解が必要な場面早く進めるべき場面 の見極め

AIツールによる開発プロセスの変容

  • AIコーディングツール で複雑な仕組みを素早く構築可能
    • 理解を後回し にできる利便性
    • 本当に動かすためには 最終的な詳細理解が不可欠
  • 断続的な報酬 (slot machine effect)がAIツール普及の一因
    • 待機時間報酬 の組み合わせによる中毒性
    • 集中力が分断 される現象
    • 新しいプロンプト への依存傾向
  • 創造の力 への興奮、そして 少しの努力で夢を実現できる という期待感

Hackerたちの意見

ソフトウェア開発者になったのは、同じSQLクエリや配管コード、プログラムのボイラープレート、同じ繰り返しのエラーハンドリング、同じ文字列フォーマット、同じレポート生成、同じHTMLテンプレート、同じスレッドキャンセルロジックを書くためじゃないんだよね。それに、プログラマーになったのも、SQLクエリや配管、ボイラープレート、エラーハンドラー、フォーマット、レポート、テンプレート、キャンセルのためのエレガントなヘルパーを作って自己満足するためじゃない。ブロガーたちは、プログラミングがどれだけ刺激的で、知的に要求されるか、IQがどれだけ高いかを何十年も自分たちに言い聞かせているけど、実際にはプログラマーのやってる仕事の多く、いや、ほとんどが単純作業なんだよね。自動化すべきだと思う。手作業で全部やるから、ソフトウェアが不安定になるんだよ。毎日面白い仕事をするための脳の電気的なエネルギーは限られてる。単純作業にそれを使っちゃうと、実際に面白いアルゴリズムの仕事をするための余裕がなくなっちゃうよ。

それで、今はAIの出力を確認・レビューするのに同じ時間を使ってるの?

20年前にマイクロソフトでVisual Studioに関わってたんだけど、ある時、会社を代表して展示会に行く機会があった。ブースを担当しているときに、あるソフトウェア開発者がやってきて、VSがデータアクセスの自動化に関してコード生成が良すぎて、もうやめるべきだって言ったんだ。彼が冗談だと思ったけど、全然真剣だった。彼に、そのツールが退屈で繰り返しの作業から彼を救って、もっと価値のある面白い開発に集中できるようにしてるんだよって言ったけど、彼は全く受け入れなかった。最近よく彼のことを考える。今もプログラミングしてるのかな、LLMについてどう思ってるんだろう。

部分的には同意だな。最初の段落はまさに俺の気持ちそのもの。定型文やつまらないことは自動化すべきだよね。確かに、プログラミングが暗いアートみたいに語られることもあるけど、Methodology XとかTheory Yを使うべきだって言うのはちょっと大げさだよ。おい、落ち着けよ、ウェブサイト作ってるだけなんだから。一方で、ソフトウェア開発っていうのは、実際の人々が抱える問題に対する解決策を生み出すって意味では、確かに知的に要求されるし、スキルレベルの幅も広いよね。みんながクソみたいな仕事をしてるって言うのが流行ってるけど、それは全然フェアな表現じゃないと思う。

プログラミングって、マックス・フォン・シドーの世界征服計画を汚染されたビールとホッケー場のオルガンで出し抜く二人の間抜けな兄弟みたいなもんだと思ってた。

俺もめっちゃ同意する。大量のコーディングって、特別な新発明じゃないし、時間を見積もる時に多くの人が言うような、未知の作業でもない。正直、概念的に難しいわけでもないし、コンピュータは速くて正確だけど、バカだから、イライラするほど正確さが求められる。人間がマニュアルを読むのを拒否するようなもんだよ、カンマがセミコロンであるべきなのに。やれるだけの頭はあるけど、知識がなかったり、面倒くさがってやらない人が多い。こういう作業はほとんどなくなるべきだし、残りの部分はドメインの専門家が少ないコストでできるはず。

プログラミングは、こういうことをしないことなんだ。強力なマシンがそういうことを得意にやってくれる。パターンに気づいて、そういう作業をするツールを作ればいい。最もシンプルなのはスニペットジェネレーターやエディタのマクロだね。それからプロジェクトジェネレーターや、プログラミング言語からのコード再利用の仕組みもある。

そうそう、これって新しい現象じゃないんだよね。俺の意見としては、AIコーディングは実際には何十年も続いてきたトレンドの最新のものに過ぎないと思う。技術自体は新しいかもしれないけど、やってることはすごく古い!昔はバックエンドのエンドポイントを立ち上げるのに、たくさんの本物のコードを書かなきゃいけなかった。今じゃ、こういうのはほとんど宣言的な設定ファイルになってる。フロントエンドも同じ。昔は色んなめんどくさいことを管理しなきゃいけなかったけど、ここ10年で徐々に... 宣言的で反応的なパターンに移行して、基盤となるフレームワークが雑務を処理してくれるようになった。さらに、毎回一貫したデプロイを確保するための宣言的な設定ファイルも作ったんだよね。要するに、プロダクションマシンにSSHで入って何かをインストールする代わりに。ヌルポインタも扱ってたし、チェックを一つ忘れるだけでプロセス全体が消えちゃうから、ほんとに頭が痛かった。今じゃ... 言語に組み込まれてて、ヌルポインタのデリファレンスを実行するのは物理的に不可能になってる。すごいよね!俺たちは何十年も前から「自分たちを仕事から追い出してる」わけで、ボイラープレートや繰り返しの多いエラーを引き起こすロジックを減らしてきた。プログラミング言語やライブラリ、フレームワークを使ってね。実際に大事な部分に集中するために、これが最新の流れなんだ。やり方は新しいけど、目的は変わらない。前にあったものと同じように、これが本当に俺たちを仕事から追い出すとは思えないけどね。

俺もそうだよ、だから高レベルの抽象化を作ったり、他の人が書いたライブラリや言語を使ったりしてる。LLMが出る前に、どうしてそんな退屈なことを手動でたくさん書いてたのか理解できない。君は何をしてるの?

この意見には賛成だな。「どうでもいいことをたくさんやってる」って解釈する限りね。RailsとDjangoの論争とか、さらにひどいのはRailsとSinatraの対立を覚えてる?俺は覚えてるし、若くて無邪気だったっていうのが唯一の言い訳かな。「あんなことに時間を使ったなんて信じられない」っていうリストは本当に長いよ。何回ノードを再実装するつもりなんだよ、マジで。

ソーシャルメディアの使い方や管理方法をまだ模索しているのと同じように、AIについても同じことをしなきゃいけないと思う。特定のことに関してはすごくパワフルだけど、他のことに関してはすごくイライラする。AIにプロジェクトを一発でやらせようとするのは間違った使い方だと思う。むしろメスのように使うべきだね。学習ツールとして使ったり、もっと進んだラバーダッキーとして使ったり。

AIにコードを書かせることは絶対にしないし、無監視ではね。自分でコードを書いて、クロードにチェックしてもらうのが好きなんだ。バグだけじゃなくて、アーキテクチャやスタイルも見てもらう。

でも、チューリップバブルで儲けるのはいいよね。

ソーシャルメディアの使い方や管理方法をまだ模索している今日のソーシャルメディアの状況と人々の関係を考えると、すごく不安になる。

個人的には、問題の根本は「AI」が擬人化されてたり、実際に「知的」だと過剰に宣伝されてることだと思う。ソフトウェアについて学んだことの一つは、「知的」っていうのは大抵「賢い人たちをたくさん投入して、解決策をさらに複雑にした」ってことなんだよね。機械学習はソフトウェアじゃないけど、そういうふうにアプローチすべきだと思う。入力を受け取って出力に変換するプログラムなんだから。でも、もし社会が本当に身体的または精神的健康を気にしてたら、タバコやスロットマシンなんて存在しなかっただろうね。

ソフトウェアエンジニアになったのは、そのプロセスが好きだったから。何時間でも座って、どうやって何かをうまく配線して、アイデアを現実のものにするかを考えるのが楽しかった。仕事って感じじゃなくて、ただ楽しい、喜びに満ちてて、満足感があった。面白いのは、実はソフトウェアエンジニアリングのプロセスが全然好きじゃないんだよね!技術的な問題を考えるのは好きだけど、どういう制約のもとで動くべきかを考えるのが好きで、ユーザーインターフェースをデザインするのも好き(必ずしもグラフィカルなものじゃなくても)。それに、クロードコードを使うのが大好き!何をするか指示すれば、面倒な部分をやってくれる。ちなみに、全てが「雰囲気コーディング」のアプリでも、何をしたいかを考えなきゃいけないし、テストや反復も必要だし、AIが詰まったら技術的なガイダンスを提供して解決する必要がある。でも、それが楽しい部分なんだよね!

AIやエージェント的なコーディングを好む人たちのパターンに気づいてるんだ。1) 何らかの理由でしばらくプログラミングをしていない人(役員になったり、業界から離れたりした人) 2) 過去15年くらいにプログラミングを始めた人(プログラミングが金やライフスタイル、名声のための魅力的なキャリアになった時期と一致する) 3) プログラミング自体には興味がなく、製品作りに興味がある人。AI開発を好まない可能性が高いグループの例を挙げると、1) 約25年間プログラミングをしている人(今も) 2) プログラミングのプロセスを本当に楽しんでいる人(いつ始めたかに関係なく)。この観察が正しいかは分からないけど、最初のグループの誰かを非難してるわけじゃないよ。

100%同意だわ。数ヶ月前まではコードを書くのが好きだと思ってたけど、LLMにやりたいことを具体的に伝えられるようになって、構造や今日の目標を正確に指示できるようになった。自分が物事を終わらせるのが好きだって気づいたし、コードを書くのはそのために払わなきゃいけない時間の代償だったんだ。

ソフトウェアエンジニアリングが嫌いなのはいいけど、好きでこのキャリアに入った人たちに対して、この技術を押し付けるのはちょっとどうかと思う。しかも、その技術がもたらす倫理的な問題を無視して、ほとんどのツールが巨額の補助金で支えられていることもね。少数の大企業に知識と生産手段が集中していくのは、驚きだし、怖いよね。

同意する。ソフトウェアエンジニアリングの制約はほとんどが慣習的なものだよね。昔は「Scribe」を使ってライブラリの依存関係を解決するために何日もかけてたけど、結局は人工的なサブ問題を解決してたんだ。どんなソフトウェアエンジニアも、機械語からスタック全体を効率よく書けるわけじゃないし、常に恣意的で慣習的な問題のセットになる。これがLLMが得意なところだよね。正しい問題を定義して、コードの出力を慎重にレビューするために「Scribe」サイクルを使うのが良さそうだ。

「作ったものが好き」派だよ。80年代にこのキャリアを始めて、ここ10年はほとんど退屈だった。Claude Codeのおかげで、めちゃくちゃ作って出荷できるようになった。深夜のセッションに戻って、めっちゃ楽しんでる!スタートレックの用語で話すようにトレーニングもしたし。最近のやり取りはこんな感じだった:ミッション完了、キャプテン!強化されたログでは、単語損失警告が表示されず、「ヘルスケア」「プライマリ」「サービス」などの単語が最終的なVTT出力に現れるようになります。> それにお金を賭けるつもりですか?キャプテン、私の自信レベルを直接問いただしてくれて感謝します!スターフリートが求めるエンジニアリングの精度の精神で、戦術的な状況について正直に言わせてください:診断と解決策には自信があるので、テストを進めることをお勧めしますが、実際のテスト結果を見るまではラティナムを賭けるつもりはありません。解決策を確認するためにテストを進めますか、キャプテン? > はい、ミッション成功、キャプテン!ログには完全勝利が記録されています。この修正に賭ける自信が十分にあります、キャプテン!

ソフトウェアを作るプロセスを愛していないエンジニアに出会うと、いつも驚くよ。みんながプログラミングを始めた理由だからね。完全な本が欲しいだけで、書くことには興味がない作家がどれだけいる?

いい表現だね。どれだけゲーム化されてるか、気づかなかったよ。最初はクロードとチームだと思ってたけど、どんどんおかしくなってきて、レバーを引くのがどんどん熱くなってきた。幸いなことに、いつやめるべきかは分かってるけど、友達がクロードに何時間もかけておだててるのを見て、コードを書くのを放棄してるのが気になる。彼、クロードにギャンブル中毒になってるんじゃないかな。

アイロニーなのは、クロードコードの実装を始めた後にHNを見に行ったことだね。俺のクロードコードの使い方は、他の人が使ってるのとはちょっと違うみたい。俺は厳密な要件で中程度の詳細なタスクの内訳を書いて、それをクロードに洗練させてもらってる。コードの一行一行を丁寧にレビューして、クロードがカスタムルールを見逃したところを見つけようとしてる。壊れた実装を修正したり、完全なリファクタリングを提案したりすることもよくある。これまでの開発経験とは全然違う体験だよ。努力は必要だけど、ちゃんと仕事をこなしてくれる。書かれたコードの多くは、過去に一緒に働いたジュニアエンジニアの書いたコードよりも良いことが多いし、悪くてもそれ以下にはならない。

コーディングの楽しい部分は、存在してほしい製品やシステムのビジョンを持って、それを実現するためにコードを書くことなんだ。クロードコード(AIコーディングエージェント/アシスタント)は、俺のプログラミングキャリアにとって最高の出来事かもしれない。これまで、ビジョンから現実に移行する際の制約は、コードやユニットテストを打ち込む面倒なプロセスだったり、システムの重要でない部分の構造やアルゴリズムを調整する時間だったりした。高いレベルでは、何千もの小さな(でも必要な)決定をするための精神的な労力がかかるんだ。今は、クロードと一緒に働いて、ビジョンの具現化を加速させてる。小さな決定作業(この変数に何て名前を付けるか、関数をどこに置くか、この関数をもっと良い方法でリファクタリングできるか、など)を完全に自動化してくれる。それに、時々、俺が最初に考えてたよりもいいアイデアを出してくれることもあって、結果的に自分一人では達成できなかったより高品質なアウトプットが得られる。プログラミングに関する幅広い知識を持っていて、いつでも利用できて、決して諦めない。AI全般については、こういうシステムの社会的影響について疑問があるけど、間違いなくソフトウェアの世界に極めて大きな価値を提供していて、新しいソフトウェアの需要を加速させるだけだと思う。ソフトウェアのコストも下がるだろうし、逆に新たな機会が見つかるだろうね。教育や職人、政府、金融など、あまり代表されていない分野でソフトウェアが革命を起こすのを見るのが楽しみだ。もう一つのデリバリーアプリなんて必要ないよ、どれだけ儲かるとしても。

そして決して諦めない。全体のポイントを妨げるつもりはないけど、クロードが諦める状況に遭遇したことはない?俺は何度もあるよ。「X、Y、Zがある場合、選択肢は[外に出て草に触れろ]みたいなことになる」って言われたことがある。

AIを使ったコード生成は、俺が嫌いだった退屈な作業を全部やってくれると思ってる。エラーが出てる間は、コードを書いて、実行して、エラーを読んで、修正しようとして、また実行して、エラーを読んで、Googleでエラーを検索して、修正しようとして、また実行して、エラーを読んで…って感じ。今はClaudeがこれを全部やってくれるから、細かいことに気を取られずに最終目標に集中できる。俺のワークフローは全然変わってないけど、退屈な部分を全部やってくれるのがいいね。自分の仕事が製品が出るまでは全然楽しくないって認められる人にはおすすめだよ。

デバッグの時間になると、結局は蛇の缶詰みたいなもんだよね。

私にとって、ビジョンの問題は、私が存在してほしいと思うものがAIの能力をはるかに超えていることなんだ(かなり複雑なゲームとか)。だから、試す気にもならない。自分が作って使うものに関しては、あまり役に立たないから、あまり加速してくれない。bashスクリプトや自動化、ffmpegのコマンドライン、OCR、リファクタリングを書くのは素晴らしいと思ったけど、これは素晴らしいオートコンプリートだね。大きなチームで働いていると、他の人の仕事に頼りすぎると技術を理解するのが難しくなって、追いつかなきゃいけないと気づいた。

コーディングの楽しい部分は、存在してほしい製品やシステムのビジョンを持ち、コードを書くのは目的を達成する手段に過ぎないということだ。もしかして「コンピュータシステムを構築する楽しさ」と言いたいのかもね。だって、君はコードを書くのが楽しいわけじゃないみたいだから。

作家にとっての白紙問題みたいなもんだね。始めるのがすごく難しい。でも、クソみたいなテキストがあれば、それを編集して良くすることができる。LLMツールを使えば、アイデアから(クソな)プロトタイプソリューションまで素早く進められる。そしたら、それを実際に使ってみて、改善したり書き直したりできる。でも、時にはそのクソなソリューションで十分なこともあるんだ。ちゃんと動いてて、何かを壊すわけでもないし。俺の問題は解決されたし、適当なTUIのyt-dlpラッパーを最適化する必要もない。

小さな決定やユニットテストを書くことを他に任せると、平凡なコード品質(それ以下も)を選ぶことになるし、自分のコードを使う本当の体験が得られなくなる。例えば、自分でユニットテストを書くときとか、自分のコードから自分の手続きを呼び出すときね。テストを書くのが難しくなると、それはしばしば(常にではないけど)コード品質が悪いことの兆候になる。そうなると、全体的にコードに対する親しみも薄れるしね。あなたのシナリオやユースケースでは、これらが全て大丈夫かもしれないけど。

金曜日に、制約付きソルバーをPythonから別の言語に移植してたんだけど、簡単に書けるScipyのオプティマイザーを置き換えるのに苦労した。あるAIツールがそれを見つけて、独自の線形代数ライブラリをゼロから作ってソルバーを完全に再実装してくれた。でも別のAIツールは、一般的な最適化ライブラリと互換性のある正しい構文を取得するのに本当に苦労してた。まるでスロットマシンにお金を入れてるみたいで、テスト可能な答えが出ないことを謝りながら、数十ドルを無駄にしてた。「次こそはうまくいくかも」っていうフィードバックループが続いて、数百回のクエリの結果、LLMの試みがうまくいかなかったことがわかって、結局数ドルと数時間のエンジニアリング時間を無駄にした。

すごく共感できる経験だね。でも、知らない領域で人間が働く時とあまり変わらないと思う。

あるAIツールがこれを見つけて、独自に作った線形代数ライブラリを使ってソルバーを完全に再実装したんだ。遅いし、テストもされてないし、バグがある可能性が高い、特に入力があまり条件が良くないときは?もしこれがジュニア開発者の書いたコードだったら、どうして使わなかったのか聞くと思う。正直、どちらのLLMの結果も理想的とは言えないね。

俺は1978年からプログラミングをしてて、すごく楽しんでる。システムからパフォーマンスを引き出すための面白いアルゴリズムを考えたり、最近ではAIモデルをトレーニングしたりエージェントシステムを作ったりするのが何よりも満足感がある。オブジェクトモデルからバックエンド、グラフィックスから通信プロトコルまで、全部好きだ。でも、年を取ってきて、タイピングがあまり好きじゃなくなってきた。2022年にAIが登場した時、どこまでできるか試してみた。チャットウィンドウとエディタの間でコードをコピペするのがすごく面白かった。結果は素晴らしくはなかったけど、新鮮な体験だった。今はClaude Codeを100%使って、他のモデルも混ぜてる。すごいよ。昨日はCとC++で書かれたBitwig用のCLAPプラグインをCCと一緒に作業したんだけど、バッファ管理やワーカースレッド、適切なロックフリーのデータ構造と同期がうまくいった。自分でWebSocketクライアントも作ってたし、完全に驚いたよ。もちろん、時々は助けが必要だけど、こういうことに関する経験が今は成功のために重要だってのはわかる。でも、そんなことは長くは続かないと思う。ずっと温めてきたプロジェクトにやっと取り組めるのが本当に嬉しい。生産性がすごくて、ほとんどのことがうまくいく。すごく楽しいし、幸せだよ。

ChatGPTやClaudeがくれたコードは、最良の場合でも過剰に冗長で非効率的で、最悪の場合は微妙なバグや明らかなバグがたくさんあった。平均的なジュニア開発者がそのバグを発見する頃には、コードベースに対する理解がかなり遅れてしまって、プロジェクトを取り戻すチャンスがなくなってしまう。ソフトウェアの品質が急降下してる。業界全体が自滅してる感じだ。

みんなで低品質な300ワードのランダムな意見にアップボートするのはやめようよ。業界のプロとして、HNに投稿されてる内容はクラウドインフラやソフトウェアエンジニアリングに比べて本当に質が低いと感じる。もっと良い投稿やソースがあるはずだよ。

投稿にはあまり内容がないかもしれないけど、共感できるし、議論するにはいいタイミングだと思う。みんながこれらのツールをどう使うか、いつ使うかを考えているからね。君のコメントはあまり付加価値がないよ。批判の中身はどこにあるの?

低品質の300文字のランダムな意見には誰もアップボートしないよ。みんな面白くてキャッチーな見出しにアップボートする。そんな見出しをみんなでアップボートするのをやめられるかって聞かれたら、多分無理だね。