絶対音感を説明する表現に対する提案

絶対音感を持っているひとには、すべての音が音名で聞こえる」という表現がよくなされるが、これはかなり誤解をうむ表現だと思う。

たとえばホワイトノイズはその定義上音高を持たない(基音を持つのであればそれはホワイトノイズではない)。これ極端な例だが、音高を決めることとなる「基音」を特定するのが難しい(聴感上むずかしい、という話ではなく、スペアナにかけても判断がつきにくい、ということ)音はこの世に無数にある。

「すべての音が音名できこえる」と言ってしまうと、そういう音も音名で聞こえると思われてしまい「絶対音感ハラスメント」(ハンドクラップをして「これなんの音?」と聞いたりするやつ)が生まれたりするのだと思う。

「すべての音が」という部分のほかに、音名に「聞こえる」という表現もまた、誤解を招きやすいと思う。

「どーはどーなつーのどー」と歌った時、最後の音の音高「ミ」なわけだけど、この、「音高がミでありことばとしてはドと発音されているぶぶん」は、耳にはちゃんと「ドと発音している声」として、つまり歌詞通りに聞こえている。その上で「音高はミだな」と同時に判別している、という状態にある。つまり耳に「聞こえている」のは言葉や歌詞なわけで、「音名で聞こえる」という表現も誤解をうみやすいと思う。

そんなわけで、絶対音感とはなにかを正確に表現するならば、「基音が判別できる、つまり、音高が判別できる音ならば、基準となる別の音高を示されなくても音名を判別できる」あたりになるけれど、これだとさすがにわかりにくい。というわけで、正確さを犠牲にした表現だが、誤解を生みにくい言い方として「音の高さがちゃんとある音ならそのドレミがわかる」という言い方を提案したいが、どうか。

なお、一部の人間において、ほんとうにこの世のすべての音が音名で聞こえるということを主張するひとがたまにいるので、そういうひとにはホワイトノイズを聴かせて「これの音名は?」と言ってやり、正解が出るまで(正解なんてないんだけど)出られない部屋に閉じ込めてやりたい、といういじわるな気持ちがないわけではないこともここに告白しておきます。

コード1行あたりの収支を意識する

ソフトウェアサービスというのは、リリースした瞬間から、もっと言えば書いてリポジトリにコミットした瞬間から「コスト」を産み始める。

新しい機能を作りたいとき、われわれは既存の機能、既存のコードとの整合性をとる必要がある。そのため、「既存のコード」の量が多ければ多いほど、「新しい1行」を追加するときのコストは上がる。また、ライブラリアップデートやフレームワークのアップデートをするときも、「既存のコード」の量が多ければ多いほど作業量は増える。また、リリースされているのであれば、そのコードが使う計算資源は当然ランニングコストとしてかかってくる。また、顧客からの問い合わせの調査においても、コードの量が多ければ多いほど調査のコストは増える。つまり、あらゆるコードは「ランニングコストのかかる困ったもの」であるとみなすことができる。

では、なぜそのような困ったものが存在することが許されるのか。これは単純で、そのコード(あるいはシステム全体)で稼ぐ金額が、そのコードが生み出すコストよりも大きい(あるいは、大きくなることを見込んでいる)からだ。

そう考えると、「同じ価値(売上)が出るのであれば、より少ないコード、より少ない仕様であるほうがコストが抑えられて利益率が上がる」という当然の帰結が導かれる。導かれるのだけれど、この「当然のこと」というのはすぐに見えなくなってしまう、ということに注意が必要だ。

まず、「コードや仕様を追加するときに、自分たちがあらたなランニングコストを抱えようとしている」ということに敏感になりがちなのはソフトウェアエンジニアであることが多い。それは当然のことで、実際にコストがかかる作業をすることが多いのはソフトウェアエンジニアだから。一方で、「そのソフトウェアの仕様や機能で出る価値(売上)」に敏感なのはディレクターや営業であることが多い。これも当然で、売上の源泉である顧客のニーズを日々肌で感じる機会はソフトウェアエンジニアよりも多いだろうから。このとき、ソフトウェアエンジニアが顧客に無頓着で、ディレクターがコストに無頓着であったらなにが起こるのか。当然、「なんで価値が出ることをやりたがらないんだ」VS「またランニングコストだけが増えて行くのか」という対立構造になってしまう。そんな組織、腐るほどあるのではないかな。

これはまあコストとベネフィットの「要はバランス」ではあるのだけれど、要はバランスというときは「どこにバランスさせるのか」ということも同時に議論しないとなんの結論も進捗も出ない。ではどうやってバランスさせるのか。「同じ価値でも、このやり方のほうがランニングコストが抑えられますよ」ということについてはソフトウェアエンジニアのほうが詳しい。というかそうあるべきだ。一方、いま簡単に言った「同じ価値」について、ほんとうにそれが同じ価値の出るものなのかどうか、つまり顧客理解については、ディレクターのほうが詳しい(はず)だ。よって、バランスさせるためには、コストに詳しいエンジニアとベネフィットに詳しいディレクターが「ここでいう価値とはなにか」を同じ基準で、あるいは同じレベルの目線で話し、お互いの専門性を差し出しあう必要がある。

事業会社ソフトウェアエンジニアは、ソフトウェアを切り売りしているわけではなく、そのソフトウェアを使って利益をあげている。ならば、ソフトウェアエンジニアこそが1行のコードがうむ価値の収支を意識すべきだ。その収支のコストの評価をするためには、ソフトウェアエンジニアの専門性が必要なのだから。コストだけに目を当てれば、当然、ソフトウェアに閉じた工夫(なるべく保守性が高くなるようにソフトウェアの設計原則を意識して書く、計算量を無駄に増やさないようにする、など)も必要だ。だけど、それだけでは済まないことも多く、「そもそもこの仕様を削ればめちゃめちゃコスパが良くなるんだからそうしましょうよ」という提案も必要となる。このとき、「コスパが良くなる」の根拠は、少なくとも「コストが減る」「けど(ほぼ)同じ価値が提供できる」の二つが必要となる。そりゃ当然だ。コスト「パフォーマンス」なのだから。後者の「同じ価値が提供できるでしょ」を添えて議論しなければ当然「要はバランス」のバランスを崩してしまうことになる。ソフトウェアエンジニアとしては無頓着になりがちな「価値」の話をきちんと理解し、提案する力が必要となるはずだ。

ただ、この「価値」ってのがけっこうややこしくて、「だってお客さんが欲しいって言ってるじゃん」みたいな話に終始すると、価値の見積もりが不可能となってしまう。どんなものでも「やるべき価値のあること」になるので。一番ダイレクトな問いは「それって、それをやることでどれくらい売上に効くんですか」となるだろうけど、あまりにダイレクトすぎて顧客目線から遠くなっちゃうこともあるので、プロダクトごとに、合意された「価値の見積もりの基準」が作れると良いだろう。その基準さえあれば、それぞれの専門性を持ち寄った上で「コストかけてやる? やらない?」を納得感もって決断することができるはずだ。それが、結果的に企業としてもユーザーとしても従業員としても嬉しい結果につながるはずだ。

ここから先は余談。成熟したチーム、あるいは互いに高いプロフェッショナリズムを持ったチームは明文化しなくとも、基準が存在していると感じることがある。じゃあ未成熟なチームはどうするべきかって考えた時、パッと思いつくのは「じゃあ基準を明文化しましょう!! そのためのワークショップをやりましょう!」とかになるんだけど、これはあまり機能しないと思っていて、なぜならば漏れのある抽象化の法則が発動し、ルールとして作った基準は常に個別の事例に対して不足するから。わたしは必要なのはルールではなく文化の醸成である、という立場をとっていて、どうやって文化を醸成するのかと言ったら、ソフトウェアエンジニア側からで言えば、嫌がられても臆せず敬意をもって「これユーザーにとってはどういう価値なんですか? 教えてください!」「わかんないので一緒にユーザーのところ行かせてください」というように「こっちがそっちの基準をまず理解しにいくよ!」という行動を取り続けることでボトムアップで変わって行くしかないのだろうと思う。

「ソフトウェア開発運用に関するコストパフォーマンス」に関するメモ

コストなんかかからなければかからないほうが良い。一方で、なにかをするためには資本(金、時間、労力)を投下しなければならない。そんなわけで、どこもぶち当たる課題「コストをなるべくかけず高い成果をあげたい」という話が生まれる。

しかし、これだけではなにも言っておらず、「ではそもそもわれわれにとって成果とは?」ということをまずは定義しなければならない。利潤を追求する企業であれば成果というのはとうぜん最後は「利益です」になるのだけど、それだと日々の生活との距離が遠すぎるので、もう少しブレイクダウンされたものが必要となるだろう。ここはじつはビジネスの構造、ビジネスモデルによって何が成果であるか決まってくる。あえてめちゃめちゃ単純化して、「書いた行数がそのままお金になります」というビジネスであるのであれば、書いた行数を成果として定義すればよいとなるけれど、現実の世界はもうちょっと複雑で、「われわれにとっての成果ってなんですか? なんの指標で測りますか?」という問いには一生懸命答えないといけないことが多い。この「われわれはこれを成果とします」という宣言がチーム、あるいはその上位概念と合致していない場合、まずはそこの認識を合わせることから考える必要がある。

話を少し変えて、「開発運用に関するコスト」について。開発に関するコストは、いくつかの視点によって整理することが可能だが、今回はソフトウェアエンジニアがコントロールできる範囲と、それを、どのように拡張していけるのかに注目をしたい。なお、本記事では話をわかりやすくするために事業会社のソフトウェアエンジニアリングをスコープとし、受託開発はスコープとしない。

さて、コストの圧縮で、なおかつソフトウェアエンジニアがコントロール可能なものとして一番わかりやすいのは、ソフトウェアの機能的な振る舞いに影響を与えずに計算資源を節約することだ。具体的にいえば、たとえばN+1を無くしていく、スロークエリを無くしていく、オートスケールやscheduledなスケールアウト、スケールインを適切に使う、など。そうすることで、単位あたりの計算資源で捌ける計算量が増えて行き、「そもそもDBのスケールダウンができるかも」「appサーバー減らせるかも」ということにもなるし、同じ量の計算資源で捌けるユーザー、トランザクションの量がふえ、「ユーザーが増えたらそのぶん計算資源のコストも増える」というその増え方を抑制することができる。つまり、計算資源に注目した時、低コストで同じ"成果"を、あるいは、同じコストでより高い"成果"を実現できるわけだ。

では、どういう条件がそろえば、ソフトウェアエンジニアがこのコストをコントロール可能になるのか。その条件はパッと思いつくだけでもいくつかある。組織的な話としては、ソフトウェアエンジニアがそのような仕事をすることが許される組織であること、言い方を変えると人的資源をそこにきちんと張るという意思決定がなされている必要がある。また、テクニカルな話として、システムのオブザーバビリティがお粗末である場合、「そもそもどこを改善したらいいかわからない」となってしまうので、こちらも条件となるだろう。これらの条件は「どちらも満たされている」ことが重要で、オブザーバビリティを向上させるぞ! といってAPMを導入したが、改善のための労力は投入しません、となる場合、「観測されるべきものがすべて垂れ流しになってむしろコストばかりかかっていく」という悲しいことになってしまう。これけっこうドキッとする現場多いんじゃないかな。

この問題のむずかしいところがまさにここにあって、「機能的なふるまいに影響を与えない」ということが、一見すると「価値を生んでないじゃん」に見えてしまう。「価値を生まないところに資本を投下するわけないじゃん、むしろそこはコストカットしていこうよ」となり、「計算機資源を節約するための仕事」は、最悪の場合着手されず、よくても「やすいところに運用をまかせちゃおうぜ」となってしまう。こうなると、「運用」を任せられた側は計算機資源を節約するメリットはべつにないので、結果として放置されてしまう。また、計算機資源の節約というのはそのビジネスの特性とほんとうは深くリンクしている(夜中にどれくらい使われることがあるシステムなんだろう? クリティカルなユースケースはなにで、そこはちょっと富豪的に守らないといけないけど、べつにクリティカルなユースケースじゃないところはギリギリを攻めて節約していいよね、とか)のだけれど、それらのリンクが断ち切られてしまうことになる。

「そういう仕事に時間や人間を張れるか」というのは、ありていに言うと「上がちゃんと考えてくれるか」にかかっており、いちエンジニアが直接変えることができないことも多い気がする。が、「言うだけタダ」なんで、この記事を添えて「こういう問題うちにもありますよね」って言うくらいはタダかもね、とは思います。

いまは計算機資源の話をしたけれど、他にもプロダクトの価値を下げないまま「そもそもの開発にかかるコスト」を下げるためにソフトウェアエンジニアがむしろ機能的な要件にコントロールの範囲を伸ばしていくべきである、という話がある。ここは「複利で効いてくる」ものなので重要な話になる。さらに、それを複利で聞かせるために組織が、あるいはテクニカルにどういう条件を満たす必要があるのか、という話題、そのコントローラブルな範囲を増やせる組織であるためにソフトウェアエンジニアの観点からなにをすべきか、という話に進んでいくんだけど、すでに結構な量を書いているので今日はここまで。ブログなのですきなときに書いてすきなところでやめるのだ。

ソフトウェアエンジニアがプロダクトにオーナーシップを持てないアンチパターン、構造

世間ではよく、「プロダクトにオーナーシップを持て」というようなことを言われる。かんたんにいうと「このプロダクトは自分のものだ」と思って仕事しろ、という話だ。よく言われるということは、逆にいうと「そうなっていないことが多い」ということだとも思う。つまり、「ほんとうはオーナーシップを持っていてほしいんだけど、そうじゃないから、"持て"と言われる」ということだ。あいさつがあたりまえになされている場所では「あいさつをしましょう」と言われない、というような話。

では、なぜオーナーシップを持つことが難しいのだろう? ぼくは、いままでいろんな現場を見てきて、いくつかのアンチパターンがあるな、と思っている。

アンチパターンの解説から入るまえにまず、前提の話から。そもそも、ソフトウェアエンジニア自体が「オーナーシップなんか持ちたくないよ」と思っている場合、それはどうやってもオーナーシップを持たせることは不可能だ。まああたりまえの話ではある。一方、ソフトウェアエンジニアは「オーナーシップを持ちたい」あるいは「もっとプロダクトに関わりたい」「言われたものをただハイハイ言って作っているだけでは嫌だ、こんなのただの社内受発注じゃないか」と思っていて、一方企画者(あるいはソフトウェアエンジニアに作業を頼む人)も「もっとソフトウェアエンジニアにオーナーシップを持って欲しい」と思っている にも関わらず なぜかソフトウェアエンジニアがオーナーシップを獲得することが非常に難しい状態になっている、という場合もある。場合もある、というか、そっちのほうが多いんじゃないかな? もの作りの好きな人間ならば、多くの場合作ったものを自分のものだと考えられるように動きたいものだし、作ってもらう側としても、作る側が「おれのもんじゃないから知らないよ」ってスタンスでいられるのは困ることが多いはずだ。

なぜ、「こうなっていたらいい」と全員が思っているはずなのにそうならないのか。アンチパターンのひとつに、「越境が難しすぎる構造」というものがあると思っている。よくある話として、「こういうビジネス上の問題があるから、こういうソフトウェアを作って解決してほしい」という要求に対して、経験を積んだエンジニアは「うーん、その解法はちょっと筋が悪いな」と思うことがままある。そのとき、素直に「それあんまよくないっすよ。だったら、こういうふうにしたほうが初期コストも抑えられるし、今後の拡張性に対しても開いているし、解決したい問題は解決できますよ」と言えない状態だと、当然ながらオーナーシップは生まれてこない。そもそも「それあんまりよくないよ、もっとこうしたほうがいいと思うよ」という言葉自体がオーナーシップの発露なのに、それができない、となればオーナーシップを発現させる機会がないのだから当然だ。

なぜそのような発言ができないのか。いろんな原因があるけれど、ベンダーにお仕事をお願いしている場合は産業構造の問題があるときもある。

つまり、ベンダーのお客さんは発注者であり、エンドユーザーではない。ベンダーは「たくさん作業が発生してたくさん"人月"がかけられればその分だけ見積もりに乗っかってくる」わけで、発注者が「こうしたい」と言ったときに「もっと安く簡単にできる」とわざわざ言うインセンティブは直接にはない。もちろんこれは単純化した図式だけれど、少なくともソフトウェアエンジニアがオーナーシップを発揮したところでよくなるのは「評判」だけであって売り上げではない、という産業構造になっていることはいまだにぜんぜんある。

内製であろうと、似たようなことになることもある。わたしはどこかで一度だけ「ビジネスサイドがやりたいと言っていることをそのまま実現するのがわれわれソフトウェアエンジニアの仕事であり、それを否定するのはソフトウェアエンジニアの仕事ではない」という言葉を(ソフトウェアエンジニアのボスが言っているのを!)きいたことがある。このような考え方でやっている限り、そのプロダクトにソフトウェアエンジニアがオーナーシップを持つことはかなりむずかしいだろう。

たいへんにややこしいのが、とくに内製の場合などで「よかれと思って」越境がむずかしくなっている場合があることだ。企画者は「しっかり仕様が固まった状態でエンジニアに渡さないと、エンジニアさんに余計な仕事させちゃうな」と思って、ガチガチにHowまで固めた状態で持ってきてくれる。これは見ようによっては善意だ。一方エンジニアはエンジニアで「これだけ考えてくれたのをひっくり返すのは悪いな」と思って越境しない。これも見ようによっては善意だ。そういう場合もある。ただ、こういう状態にあるときは思い出して欲しい、企画者のお客さんはエンジニアではなくエンドユーザーだ。エンジニアのお客さんも、企画者ではなくてエンドユーザーだ。そこを思い出したとき、これは「善意」ではなくて「余計な遠慮」であると思えるはずだ。そうなったら越境は簡単だ。そういう視点から見ると、善意に見えていたものはもしかしたら「信頼関係のなさ」に見えてくるかもしれない。「とりあえず相談できる」という信頼関係がないものを、「善意」で包んでいないだろうか?

ちょっと話を戻して、では、そのような「オーナーシップを獲得するのがむずかしい構造」がある場合、もはやどうしようもないのか?

ここで、ちょっと話を変えてオーナーシップのレベルについて考えてみたい。

ソフトウェアエンジニアがオーナーシップを持つ、といったとき、ぼくは3つのレベルの話があると思う。まず、ひとつめは「システムに対してオーナーシップを持つ」というレベル、次に「プロダクトに対してオーナーシップを持つ」というレベル、さいごに「ビジネスとしてオーナーシップを持つ」というレベルだ。

システムに対してオーナーシップを持つというのは、たとえば障害が起こった時、それが「自分の起こした障害」でなかったとしても原因調査に前のめりになって入っていくことだったりするだろう。要するに、「システムに期待通りに挙動をさせる責任の一端を自分は担っている」とソフトウェアエンジニアが感じ、そのように動いているときだ。プロダクトに対してオーナーシップを持つというのは、冒頭で言ったような例で、「やりたいこと、解決したいことはわかりますが、その仕様でやるとあとあとこういう問題が起こるし、こっちの仕様のほうがユーザーもわれわれも嬉しくないですか?」というような提案ができることだったりするだろう。つまり、「ユーザーの課題を解決するためのこのプロダクトの挙動を決める責任の一端は自分が担っている」とソフトウェアエンジニアが感じ、実際にそのように動いているときだ。ビジネスとしてオーナーシップを持つ、というのはかなり広い範囲が含まれるけれど、たとえば「ユーザー課題はわかりました。使えるコスト、参画してくれるメンバー、リリースしないといけない期日もわかりました。その上で、現在考えられているやりかたでは無理があるので、このようなやり方でやればどうでしょうか、一部の要求を諦めることになりますが、リリース日が固定ならば、これが現実解です」などの提案ができている場合などはビジネスに対するオーナーシップをもてていると言って良さそうだ。さらにその上にいくと複数のプロジェクトに対して軽重をつけたり「えいや」で諦めるものを決めたり、という話になってくるが、これはもはや「経営に対してオーナーシップを」という話になってくるので、いったんここでは扱わないこととする。

このようにオーナーシップをレベルわけして考えてみると、最初の「システムに対するオーナーシップを持つ」を邪魔する構造は少ないことがわかってくる。障害のときだけではない、だれかがどこかで詰まっているときに、声をかけにいく、など、「自分に明確に任されているわけではないぶぶん」について、まずはシステムに関することで「口出し」「手出し」することは、システムのオーナーシップを獲得することに通じていく。

そして、システムのオーナーシップ「すら」獲得していないエンジニアが、非エンジニアの信頼を獲得できるだろうか? 「あのひと、いつも困り事を"オーナーシップ持って"解決してるよね」というのは、非エンジニアにも見えるものだ。そうして信頼を獲得することではじめて前述の「善意に包んだ遠慮」を壊せるかもしれない。あるいは、システムに対するオーナーシップを獲得していくと、いつか必ず「そのやり方だとシステムのオーナーシップをまっとうできません」ということがやってくる。そのとき、仕様に口を出さざるを得なくなる。けど、信頼がすでにあるから口を出せる。そうやって、オーナーシップのレベルを少しずつあげていくことは可能な場合がある。まあ現実を見ると、まじで硬直している組織の場合できないこともある、それはそう。その場合諦めたほうがいいという現実的な視点ももっておいたほうが鬱病にならずに済む。しかし、そういう硬直した組織を変えていける人間というのは貴重なので、やってみる価値じたいはあると思っている。

まとめ。

本人たちも周りもオーナーシップを持ちたい、持って欲しいと思っているのに、ソフトウェアエンジニアがプロダクトにオーナーシップをもてない場合、越境や「口出し、手出し」を阻害する構造がある場合がある。この場合、まずは獲得しやすいレベルのオーナーシップから獲得し、行動するとよい。それが信頼につながり、つぎの「口出し、手出し」につながる。そうして、さらに上のオーナーシップを持つ、あるいはまかされることができることがある。できることがあるだけで、当然できないこともある。自分はこの構造にはもうとうてい立ち向かえません、となることだってある。そういうときには無理しないのも人間の知恵である。どっかべつのところでレベルを上げて再挑戦だ。

Lambda Functionsを ALB のターゲットとして使用する場合、複数値ヘッダーの有効化をしないとクエリストリングなどの値が捨てられる場合がある

さいきんは便利な社会になっており、Lambda FunctionsをALBの後ろに直接配置して、HTTPリクエストをシュッとLambdaで受けるなんてことができます。

さて、話が変わって、いわゆるREST APIでは、参照系の操作をGETで行い、パラメータはクエリストリングで渡す、ということが行われます。このとき、たとえばidの配列を渡したいばあい、id=1&id=2というように「おなじキーで別の値を渡す」という方法が取れれることがあります。これはOpenAPIv3のspecificationでもquery parameterのデフォルトの渡し方となっています

一方、複数値ヘッダーの有効化がなされていないLambda FunctionsをターゲットとしたALBは、クエリストリングにおいて重複したキーがある場合、最後の値のみを拾ってLambdaに渡します。

つまり、id=1&id=2&id=3のようなクエリストリングを渡しても、Lambdaに渡ってくるイベントではid=3のみが渡ってくるわけです。

この挙動を変更し、1,2,3すべてを拾いたい場合は、複数値ヘッダーの有効化をする必要があります。詳細は公式のドキュメントに当たるとよいでしょう。

Lambda 関数を Application Load Balancer のターゲットとして使用する - エラスティックロードバランシング

コーディングエージェントは新しい「コンパイラ」となるのか? わからん

コーディングエージェントは新しいコンパイラのようなもので、自然言語で仕様を記述したものが新しい「ソースコード」となる、という言説があるけど、ぼくはいまのところそうは思わない。なぜなら、コンパイラの動作は決定的である一方、LLMによる処理は非決定的であるという大きな違いがそこにはあるから。そうなると、プロダクトの仕様からソフトウェアのふるまいを決定的に記述するための技術、というのが鍵になりそうだと思うけどれど、その抽象度は今のプログラミング言語とどれくらいの違いがあるだろう? ぼくはちょっとわからない。

Claude Codeと一週間過ごして見えてきたこと

ブログなので雑にバラバラと書く

  • 手がとにかく早い
    • まあ機械なのでそれはそう
  • 意味のあるフィードバックをClaude Code自身が得られるような工夫が必要
    • 「生成」AIなので生成することは向いているけど、チェックすることには向いていない。あたりまえだけどテスト書いてなかったりしたら人間の何倍も早くぶっ壊していくと思う
    • テストもとにかくサボる
      • テスト書けって言っても書かない。必ず実行しろっていってもサボる
      • カバレッジ目標とかを明示的に与えたほうがいいのかもしれない(試してみる)
    • 外部API叩いてるところとか、そういうものはClaudeCodeが直接FBを確認しにくい。こういうときは当てずっぽうでやらせるのではなくて「人間が手伝うから、なにかを確認してほしくなったら確認手順を人間に教えて」と言ってFBループに人間が介在するとうまくいく。うまくいきはするんだけど、人間が介在するのでスピードがガタ落ちする
      • ここはけっこう「労働からの阻害」を感じるポイント。「なにをやるか」を自分が決められる個人開発なら「自分が決めてAIにやらせる」が成立して、「個人でできることの範囲が広がりうれしい」という感じがするんだけど、労働の文脈で「やることはチームや "えらいひと" が決める」となっている場合、AIが苦手な「人力でフィードバックを収集するパーツ」としての労働だけが残る、ということになりかねない。あんまりわくわくする未来ではない。
  • ちょっと複雑なバグを直すのはかなり苦手
    • このへん、LLMの「統計的正論パンチ繰り出しマシーン」の感じがよく出ている。「よくあるバグ」はすぐ直せるけど、ちょっとふくざつで折り入ったバグだと「当てずっぽう」ループが始まる。
    • 「当てずっぽう」ループにハマりこむとtokenをモリモリ消費するくせに成果がでない最悪の大飯食らいが爆誕する
    • こういうときは人間がちゃんとコードを読んだりするのも大事
    • さっきの、FBをClaudeCode自身が確認できるように、というのと同じ話で、ログをバンバン仕込ませてやると進捗したりする。
    • そのへんを考えると、最初のうちにログレベルをちゃんと変えられる仕組みを構築したうえで、デバッグログをばんばん仕込みなさいって指示しておいたほうがいいかもって思った
  • けっこうおべっかを使ってくるので、既存コードを分析してもらうときとかはあえて批判的にみてもらうといい
    • これChatGPTとかGeminiとかもかなりおべっかを使ってくるよね〜。
    • 真にうけていい気分になってると、破滅したコードベースが生成されていく。定期的に「このプロジェクトを批判的に深く考えて分析して」などでdeep thinkで批判的に分析させるといい。
    • そうすると「たしかにそこ修正しといたほうがいいな」ということが見つかるので、コード品質を高く保ちやすい
    • 批判的分析を加えることとそれに対して修正プランを作る部分ではかなり筋がいいので、ここはうまくやると自動化できる気がしている
  • 書かれたコードで内部的になにが起こっているのかへの理解は必須
    • この理解がないと、「当てずっぽう」になりはじめたときに詰む