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

型付き言語はバイブコーディングにより適しています

概要

  • Claude Code 登場以降、 Python が新規プロジェクトの第一選択肢でなくなった体験
  • 型付きコンパイル言語 (TypeScript、Rust、Go)での開発が効率的になった理由
  • AIツール が安全性と速度を両立させる要因
  • Python の利点と欠点、AI時代での位置づけ
  • 今後のPython採用減少 予測とその根拠

Claude Code登場後のプログラミング習慣の変化

  • Claude Code の登場により、10年以上続いた Python中心の開発習慣 が変化
  • 新規プロジェクトで TypeScript、Rust、Go など、得意でない言語も積極的に利用
  • 型付き・コンパイル言語 の安全性保証による“vibecoding”との相性の良さ
  • Python は直感的に使いやすいが、安全性やスケーラビリティで不利
  • Claude Code + Rust の組み合わせで、大規模開発でも 速度と安全性 を両立

AIツールによる開発効率の劇的向上

  • AIツール の活用で、得意でない言語でも 安定した開発 が可能
  • 例:TextCortexのTypeScriptフロントエンド大規模リファクタリング
    • Claude Code がタスクごとに tsc を実行し、コンパイルエラーを未然に防止
    • 数千行規模の差分も 短時間で安全に適用 可能
  • Python では得られない コンパイル時保証 による安心感
  • LLM(大規模言語モデル) は抽象化の漏れはあるが、 プロトタイピングの速さ安全性 を両立

Pythonの今後の立ち位置と予測

  • AIツール の普及で、 Pythonの利点 (高速プロトタイピング)が他言語でも実現
  • Pythonの欠点 (安全性の低さ、速度、曖昧さ)が目立つように
  • 企業における Python採用の減少、特に 本番運用 での利用減少を予測
  • 「AIツールがなくても型付き言語の方が良い」という意見もあるが、状況次第で異なると主張

まとめ

  • Claude Code などの AIツール によって、 型付き・コンパイル言語 での開発が容易かつ安全に
  • Python の「速さ」はAIによって他言語でも実現可能に
  • 今後、 本番環境 での Python利用 は減少傾向との見立て

Hackerたちの意見

この主張には評価が必要だね。逆に、LLMはPythonのコーディングが得意だって主張することもできるよ。だって、トレーニングセットにはC++やRustよりもPythonが圧倒的に多いから。いずれにせよ、型付き言語の利点は、LLMに常に型注釈付きのPythonコードを出力させて、ruffやtyを使ってその出力を検証するルールを追加することで簡単に得られるよ。

私も、LLMのトレーニングセットにはRustよりもPythonのトレーニングデータが圧倒的に多いってことには同意する。でも、C++はPythonより前から存在してたと思うから、PythonのコードがC++よりも2桁も多いとは思えないな。

あなたはPythonの型付けの能力を過大評価してると思うよ。

tyはまだmypyがキャッチするものを見逃してるね。それに、Pydanticへのサポートもまだ同じレベルじゃない。速さが魅力で使ってるけど、mypyと一緒に使う感じで、まだ置き換えにはならないかな。確かにmypyは遅いけど、完了を待ってるエージェントには関係ないよね。

上の論理は正反対の結論を支持することもできる。LLMは動的型付け言語をうまく扱えるから、型エラーを解決する必要がなくて、いくつかのコンテキストトークンを節約できるんだ。実際、LLMを使ったコーディングエージェントは、TypeScriptのような徐々に型付けされる言語でanyを使って型エラーを回避しているって報告されてる。私も何度かその使い方を見たことがあるし、Rustのような強い型付けの言語でもLLMエージェントを使ってみたことがある。複雑な型エラーが発生すると、エージェントはそれを修正するのに苦労して、最終的にはtodo!()を使うことになった。こういう経験は、トレーニングデータが不十分なせいかもしれないけど、イデオロギー的な推測よりも評価の重要性を示しているよ。

それとも、単に悪いトレーニングデータかもね。「any」がどこでもカジュアルに使われているのを見たことがあるよ。

私の経験では、リンターのルールでそれを禁止して、ローカルのClaudeファイルを使って、何かをするたびにリンティングの問題を修正するよう指示すれば、回避できるよ。

実際の評価が必要だって言われてる通りだね。経験上、エージェントがエラーを修正しようとして無駄に時間を浪費する「スピンアウト」状態が最悪で、結局は意味のない(あればだけど)「解決策」にたどり着くことが多い。私の経験では、TypeScriptではこういう「スピンアウト」状況はほぼ常に型に関連していて、ひどい「any」キャストが多く含まれていることが多いんだ。

だから、私はLLMに対して非常に具体的なルールセットとリンティングを設けていて、anyを一切許可していないし、他の品質チェックも行ってるよ。

質問は2つの方法で聞けるね:(1) 現在のLLMは、ユーザーのワークフローに関するいくつかの仮定のもとで、型付き言語の「雰囲気コーディング」が得意なのか? (2) LLMは技術として原則的に型付き言語に向いているのか? それともRLパイプラインはその方向に進むべきなのか?

そうだね、エージェントは「any」に対してすごく反応が早いのに気づいたよ。Rustでの作業は楽しかった。Rustでは型システムを無視するのがそんなに簡単じゃないし、「unwrap」や適切なエラーマネジメントに関しても文化がより厳格だと思う。だから「unwrapを使うのをやめて」って言うことは、ほとんど「anyを使うのをやめて」って言うことより少ない気がする。

LLMには、コンパイルされた型付き言語のように、どんな型も禁止すべきだと思う。

私の経験では、強い意見を持ったフレームワークの方が、型システムに関係なく雰囲気コーディングには向いてると思う。例えば、Railsを使っていると、雰囲気コーディングが素晴らしい。なぜなら、MCPがあって、公開されたプロンプトがあって、基本的にRailsではやり方が一つしかないから。ファイルの名前の付け方、どこに置くか、どんなフォーマットにするかなどが明確なんだ。Goで同じことをやろうとすると、型が強いにもかかわらず、全く違う結果になるよ。ClaudeもGeminiも、Goで簡単なアプリを一発で作るのに苦労しているけど、Railsでは成功している。

これはちょっとした経験則だけど、ネットで見つかる公開されてるRailsのソースコードって、大体が大きくて安定してて、ちゃんとドキュメントも整ってるコードが多い気がする。

基本的にはこういうことだよね。制約が多いほど、コードを「雰囲気」で書く自由が増えるし、もし誰かがテストを書いたり、バグを見つけたり、24時間365日改善するためのAIを作ったら、もっとすごいものができると思う。

私の経験では、GeminiはGoアプリを一発で作れるよ。これを判断するには、経験則じゃなくてしっかりした評価が必要だね。

比較すると、fastapiみたいな全く意見のないフレームワークは、初期のAIブームで人気が出たけど、バイブコーディングするには扱いにくいよ。人気のあるフレームワークは、物事をどうやるかの明確な方法がなくて、開発者に任せる原則に従っている。意見のあるフレームワークはRailsの後に流行らなくなったけど、実際にはAI支援開発にはかなり適していることがわかったんだ。

flaskを使ってるけど、結果がすごいよ。毎日使ってるかなり良いものを一発で作れちゃった。

変だな、GoはHNでLLMがうまく働く言語の代表例だと思ってた。意見がはっきりしてて、標準ライブラリも多いからね。試したことはないけど、vibe codingの試みは残念だったな。これって時代の流れに逆行してる気がする?

それについて考えたことある?つまり、LLMが一番得意なのは、最も多くの例があるものなんだよね。もしかしたら、トレーニングにはGoよりもよく構造化されたRailsコードが多いのかも?

私のRailsの経験は逆で、Hotwireのオープンエンドなパターンが影響してるんだ。Rails自体は意見が強いけど、Hotwireは同じことをするのにいくつかの方法を提供するから、LLMが混乱しちゃうんだよね。例えば、最近モーダルを使って関連オブジェクトをインラインで作成できるフォームを作ろうとしたんだけど、Claude 4 Sonnetはそのリクエストにかなり混乱してた。どれだけ助けても、結局は解決したけど、結果には満足できなかったよ。基本的な指示だけでReactを使って同じ機能を作ることはできるのに。他のライブラリ、例えばHTMXでも同じこと。TypeScriptとReact、そしてTanstack Queryのような意見が強いツールを使うと、LLMはエラーをすぐに修正できるから、ユーザーインタラクションを構築するのがずっと効率的になるよ。

ずっと設定を書いてればよかったんじゃない?

これはまだ完全な考えじゃないけど、LLMに自分の意見を与えることで緩和できるかも?私はコパイロットをペアプログラミングのように使っていて、作りたいものについてはプロンプトでたくさんの意見を出してる。ただ、私の変更は大きすぎることはなくて、せいぜい100行の差分くらい。

「私は流暢ではない言語—TypeScript、Rust、Go—でプロジェクトを管理していて、うまくやっているようです。この枠組みはメディアリテラシーの古典的な問題を思い出させます。専門家であれば、ジャーナリスティックなソースが貧弱であることが分かりますが、あまり馴染みのないテーマだと、そのソースが少なくともそれなりに良いと仮定しがちです。私はLLMを使ったウェブ開発で著者と同じ経験をしました。少なくとも私が作る混乱と比べると、かなり良い仕事をしているようです。でも、実際にはその判断をする資格はないし、エンジニアたちが自分たちがその資格があると思っていることから、AIの価値がかなり生まれていると思います。」

Gell-Mann Amnesia [0] [0] https://en.m.wikipedia.org/wiki/Gell-Mann_amnesia_effect

ちゃんと判断できるものにしか使わないよ。

うん、これはClaudeと一緒にRustを使った経験とは合わないな。プロとして2.5年間Rustを書いてきたけど、結構得意だよ。ClaudeはRustのコードについて幻覚を見ちゃうから、統計モデルであって静的解析ツールじゃないんだ。コンパイルできるコードを生成できるときは、必ず効率が悪くて見た目も良くない。でも、もし使えるエレガントなPythonのコードをゼロから生成してほしいなら、結構いい感じだよ。ちなみに、Pythonは流暢じゃないけどね。

数十年ソフトウェアを書いてきたから、新しい言語で「これは絶対にイディオマティックじゃない」って感覚は結構あると思う。何かおかしいと思ったら、リファレンスコードやその言語の大きなプロジェクトをググり始めるよ。LLMに聞いてみてもいいかもね。「これってイディオマティックなの?」って。もちろん、嘘をつくかもしれないけど…。

「可読性」の概念は良いと思う。これはGoogleのプログラムで、あなたのコードがその言語の専門家にレビューされるんだ(でも、必ずしもあなたのアプリケーションやドメインではない)。イディオマティックなコードを書けるレベルに達し、言語を完全に理解できるようになると、自分自身も可読性を得られる。LLMのコードをレビューする時は、その言語での可読性を自分が持っているべきだし、そうでなければコードは重要じゃないよね。

似たようなパターンに気づいたよ。特に、golangでのバイブコーディングが好きなんだ。Goはすごく冗長で、ほぼ逆のperlみたい。Goを書くのは大変だけど、読むのは楽しい。golangの冗長性のおかげで、いつでも飛び込んで文脈を理解できるし、たいていは1つのファイルからでもわかる。LLMが出る前は、golangを書くのにかかるコストがあったから、コストと利益のバランスがあまり良くなかったんだ。でも、LLMがある今は、冗長なコードを書くコストが下がるだけじゃなくて、LLMが書く内容に厳しくなって、軌道に乗せることができる。結果的に、コストと利益のバランスがGoにとってかなり良くなったね。

Goに対して悪口を言うつもりはないけど、君は言ってしまったよね。この言語はずっとAI生成のコードみたいに見えていて、今は実際に書かなくても済むからそれが有利に働いてるって。面白いけど、それがGoの利点だとは思わないな。

ここでの主な主張には同意するけど、これはすごく心配だな。> 数時間で作った3,000〜5,000行のdiffが何も壊さず、逆に安定性を増すことに毎回驚いている。個人的には、LLMから3,000〜5,000行のコードを定期的に追加して、高品質なコードベースが得られるとは思えない。あれは大きなdiffだよ。

同僚が君のコードベースにこんなことをしたら想像してみて…。

そうだね。経験から言うと、比較的複雑なシステムの場合、ミドルレベルの開発者からの1k行以上のPRにはバグがほぼ確実に含まれてる。しかも厄介なやつが多くて、特定して修正するのに何時間もかかることがある。コーディングを始めた頃(数十年前)、特定の問題をデバッグするのに数日かかってたのを覚えてる。オンラインで情報を探すのが難しかったのも一因だけど、自分のコードが過剰設計だったのも問題だった。大量のコードをすぐに書けたけど、実際に動くコードを作るんじゃなくて、見た目だけ動くコードを目指してたんだ。たまに自分のコードが壊れるとショックだったけど、今はそれが過剰に複雑にした結果だって分かる。良いコードは簡潔で、最小限の形で発見されたように見える。悪いコードは作り出されたもので、作者が余計に派手にしようとした感じ。20年コーディングしてきたけど、悪いコードは数秒で見抜ける。良いコードは読みやすいし、まずは関数の名前を見ただけで何をするか分かる。読んでも予想外のことはなくて、余計なこともしてない。

もしかしたら、LLMがファイルを再作成して更新してるのかも。過去にLLMはそうする傾向があるのに気づいたことがある。考えてみれば、まだgitを学んでない大学のCS学生がやることとあまり変わらないね。それでも、著者が少なくとも変更を整理する時間を取らないのはかなり悪いことだね。でも、ファイル名の変更だけかもしれない?

PythonとScalaの経験は全然違うな。PythonだとLLMが結構いい仕事する。コードはいつもコンパイルされるし、時々論理的なエラーやアーキテクチャの問題があるけど、それだけ。Scalaだと、LLMにすごくシンプルな仕事を与えないとダメで、例えばユニットテスト用のモックデータを作るとかね。それでも頻繁にミスするし、たまにコンパイルすら通らないコードを出してくる。Scalaの強い型システムはどうなってるんだろうね。

Scalaのトレーニングデータが少ないのが問題かもね。Pythonがどれだけあるか想像してみて。

vibecodingにとって大事なのはタイピングじゃなくて、エージェントにエラーのネガティブフィードバックを提供するツールへのフックを与えることなんだ。タイピングは確かに簡単だけど、コンパイラに組み込まれてるからね。でも、静的解析のリンターや自動テストも追加できるし、特にパフォーマンスのテストも含めてね。もちろん、エージェントに静的解析のリンターを設定させたり、テストを書くように指示したりする必要があるけど、それをすればちゃんと従ってくれる。大企業が昔、ジュニアを大量に雇えたのは、ジュニアが頼れるガードレールを設定してたからだよね。なんで同じガードレールがない状態で「ジュニア」エージェントを「雇う」必要があるの?

ツールチェーンの観点から見ると、これは理にかなってると思う。もしコードを家畜のように扱う時代に入るなら、過度に冗長で厳格な言語がそれから利益を得るのは理解できるよね。