ソフトウェア開発の未来は、ソフトウェア開発者にあります。

2025/12/30 4:14

ソフトウェア開発の未来は、ソフトウェア開発者にあります。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

メインメッセージ
大規模言語モデルは熟練したプログラマーの代わりにはなりません。彼らは開発を支援するツールであり、置き換えではありません。

証拠と理由付け

  • 43年にわたるプログラミングキャリアが著者に深い歴史的視点を与えている。
  • 過去のサイクル―VB/Delphi、マクロ、Executable UML、No‑Code/Low‑Code―は開発者を排除すると約束したが、むしろ需要を増やした。これらのツールは信頼性と決定論的だった。
  • 現在のLLMは非決定論的なコードを生成し、バグが多く保守が難しく、チームの速度を遅くすることがある。
  • 大規模障害は「AI生成」コードに起因しており、その信頼性の欠如を浮き彫りにした。
  • ディクストラは50年前に自然言語で計算論理を信頼的に表現できないと警告し、これはLLMへのプロンプトでも依然として問題となっている。
  • 超大規模LLMは構築コストが高く適応性が限られており、長期的な将来性は疑問である。より控えめなAIアシスタント(例:Javaヘルパー)はプロトタイピングやインライン補完に有用かもしれない。

文脈
現在AIが開発者を置き換えているという信頼できる証拠はない。人員の変動はパンデミックによる過剰採用、借入コストの上昇、およびデータセンター投資に起因しており、AI導入ではない。

影響と推奨事項
熟練したプログラマーへの需要は供給を上回る。企業は今すぐ採用し、ポスト・マニア採用波に備え、リードタイムの短縮、信頼性の向上、および変更コストの低減が可能な開発者の育成に投資すべきである。AIツールと実証済みの技術的プラクティスを組み合わせることで、生産性を高めつつリスクを軽減できる。

本文

私は43年間、コンピュータプログラマとして「全てのことを知っている」状態で過ごしてきました――それは電子的にプログラム可能なコンピュータの歴史全体の半分以上に相当します。その期間、数多くの変化を目撃しましたが、いくつかの事実はほぼ同じままでした。

私は「プログラマの終焉」と称されるテクノロジーサイクルを何度も経験してきました。WYSIWYGやドラッグ&ドロップエディタ(Visual Basic、Delphi)がプログラマの必要性をなくすと噂され、Microsoft Office のウィザードやマクロが同様に予言された。そして実行可能なUML(Executable UML)やノーコード・ローコードプラットフォームも「プログラマ不要」と宣伝されました。現在では、大規模言語モデル(LLM)が、毎日読む記事の中で「プログラマを終わらせる」と語られています。

こうしたサイクルは新しいものではありません。1970年代と1980年代には4GLや5GLが「プログラマの終焉」と称されました。その前にFortranやCOBOLなどの3GL、さらにそれ以前にはA‑0のようなコンパイラで、カードの穴を打ち込むことでコンピュータに命令する必要がなくなると語られました。

もっと昔に遡れば、電子的にプログラム可能なコンピュータの最初期(機密)も同様です。COLOSSUS は物理的に配線を変えるだけでプログラムされていました。そのマシンで働いたエンジニアたちは、最初のストアド・プログラム方式のコンピュータで「本当のプログラマではない」と嘲笑したかもしれません。

すべてのサイクルにおいて予測は極めて誤っていました。結果としてプログラマが減るどころか、より多くのプログラムとプログラマが生まれました――これはジェヴォンズ逆説(1兆5千億ドル規模)の典型例です。

そして私たちは再びそのサイクルに直面しています。「でも今回は違うんだ、ジャスソン!」確かにそうです。前回よりも大きな規模で、Visual BasicやExecutable UMLが全国紙の表紙を飾ったことはなく、4GLに賭ける国全体の経済もありませんでした。

もう一つ重要な違いがあります。以前のサイクルでは技術は信頼性を持って動作していました。VBやMicrosoft Accessでより速く動作するソフトウェアを構築できました。しかしLLMの場合、ほとんどのチームにとって実際には速度低下を招き、ソフトウェアが不安定になり保守性も低下しています。これは多くの場合ロス・ロス(負けたら負け)です(ただし、開発プロセスの真のボトルネックに対処したチームは例外かもしれません)。

しかしこのすべては理論的な話です。技術が実際に多くのチームでポジティブな差を生むとしても、プログラマが不要になるわけではありません。

コンピュータプログラミングの難しい部分は「機械に何をさせたいか」をコードとして表現することではなく、人間の思考――そのあいまいさや矛盾を含む―を論理的で曖昧さのない計算思考へ変換し、それをプログラミング言語の構文に正確に落とし込むことです。カードに穴を打ち、COBOL を入力し、Visual Basic のGUIを実現し(恐らく殺人犯のIPアドレスを追跡するため)、そして今は言語モデルにプロンプトを与えて「見た目が妥当な」Python コードを生成させる―これまでずっと同じ難題でした。

この難問は長年続き、将来も続くでしょう――正確に何を求めるかを知ることです。エドガー・ディジャクスタは約50年前にこう呼びました:英語やフランス語、スペイン語でプログラミングすることは決してないだろう。自然言語は十分に正確で曖昧さのないものへ進化していません。意味的あいまいさと情報エントロピーは常にこの野望を打ち砕きます。

誰でもそのような思考法を学べるかもしれませんが、すべての人が楽しめるわけではなく、得意になる人も限られています。プログラミングスキルを持つ人への需要は常に供給を上回り、企業が数年間採用・訓練を停止すると、その差はさらに拡大します。これまでのバブルと崩壊のサイクルも私のキャリアで頻繁に経験したものです。このサイクルもただのテクノロジーハイプサイクルに過ぎません。

「AI」が実際にソフトウェア開発者を大規模に置き換えているという信頼できる証拠はありません。パンデミック時の過剰採用、借入コストの上昇、大規模データセンターへの投資が人件費から多くを奪っています。「AI」がすぐにでも人間プログラマと同等に理解・推論・学習できる段階になるという根拠はありません。AGI(汎用人工知能)はいつまでも遠い未来の話であり、コンピュータプログラミングの難問は本質的に一般知能を必要とします。

さらに「AI」コーディングアシスタントは以前のサイクルのコンパイラやコードジェネレータとは全く異なります。同じプロンプトでもほぼ同じプログラムが生成される保証はなく、生成されたコードには実際に人間プログラマが認識し対処する必要がある問題が必ず存在します。

私がコードを書くとき、私は頭の中でそれを実行しています。私の内部モデルは単なる構文的なものではありません。私はパターンを照合し統計的に妥当なトークンを予測するだけでなく、実際にコードを理解しているのです。

Cレベルでも、主要な障害やインシデントが「AI」生成コードと大きく結びついているという相関は認識されています。プロンプトが新たなソースコードであり、元モデル入力から全ての稼働システムを再構築できるという主張は間違いだと証明されます。現実は常に勝ちます。

したがって、「AI」がプログラマの終焉を意味するわけではありません。今後1〜3年でこの熱狂が消えるかもしれませんし、結局は再び戻る可能性があります。結局、人々はいつも勝つのです。

「このテクノロジーは永続的に存在しない」と言う人には、これらモデルを構築するコストと膨大な損失を思い出させたいと思います。ハイパースケールモデルから微細化された小規模モデルをローカルで使い続けることは可能ですが、年々プログラミング言語やライブラリのバージョンに縛られると制約が増します。

そのため私はハイパースケールLLMが長期的に持続可能かどうか懐疑的です。彼らは「AI」のアポロ・ムーンミッションと言えるでしょう。結局、コスト対効果を考えれば多くの場合それほど価値がないかもしれません。博物館で展示されるような存在になる可能性もあります。

ソフトウェア開発の近い将来は、「AI」をより控えめに利用するケース(例:Java コーディングアシスタント)でプロトタイプを生成したり、稼働コード上でインライン補完を行ったりする程度かもしれません。しかし重要な場面では必ずやソフトウェア開発者が舵を取るでしょう。ジェヴォンズの仮説を信じれば、むしろより多くの人が必要になるはずです。

雇用主の皆さんへ:今すぐ採用を始めて、この熱狂から目覚めたときに追い付けられないようにしたいと思います。そしてもし「AI」を含む技術的実践で、デリバリーリードタイムを劇的に短縮し、信頼性を向上させ、変更コストを削減できるスキルを育てたいと考えているなら、ぜひご連絡ください。それはウィン・ウィン・ウィンです。

同じ日のほかのニュース

一覧に戻る →

2025/12/30 6:46

USPS(米国郵便公社)が切手印日付システムの変更を発表しました。

## Japanese Translation: > **概要:** > USPSは最終規則(FR Doc. 2025‑20740)を発行し、国内郵便マニュアルに「セクション 608.11 —『切手印と郵便保有』」を追加しました。この規則では、切手印の定義が正式に示され、該当する印記がリストアップされています。切手印は印付け日でUSPSがその物件を保有していることを確認しますが、必ずしもアイテムの最初の受理日と同一ではありません。USPSは通常業務で全ての郵便に切手印を貼らないため、切手印が欠落していても、その物件が未処理だったとは限りません。機械による自動切手印は、施設内で最初に行われた自動処理操作の日付(「date of the first automated processing operation」)を表示し、投函日ではなく、地域輸送最適化(RTO)や路線ベースのサービス基準により受理日より遅くなることがあります。切手印は小売ユニットからの輸送後やカレンダー日がまたがる場合に付けられることが多いため、郵送日を示す信頼できる指標ではありません。同一日の切手印を確保するには、小売窓口で手動(ローカル)切手印を依頼できます。小売窓口で料金を支払うと「Postage Validation Imprint(PVI)」が付与され、受理日が記録されます。また、郵便証明書、登録メール、または認定メールは提示日を裏付ける領収書として機能します。この規則の影響は税務申告において重要です。IRC §7502 は、文書が期限までに物理的に届けられなかった場合に、提出の適時性を判断する際に切手印の日付を使用しています。

2025/12/30 1:07

**Zig における静的割り当て** Zig のコンパイル時メモリ管理を使えば、実行時ではなくコンパイル時にストレージを確保できます。データ構造のサイズが事前に分かっている場合やヒープ割り当てを避けたいときに便利です。 ### 重要概念 - **コンパイル時定数** `const` や `comptime` の値を使い、コンパイラがコンパイル中に評価できるサイズを記述します。 - **固定長配列** リテラルサイズで配列を宣言します。 ```zig const buf = [_]u8{0} ** 128; // 128 バイト、すべてゼロ初期化 ``` - **静的フィールドを持つ構造体** 固定長配列やその他コンパイル時に決まる型を含む構造体を定義します。 ### 例 ```zig const std = @import("std"); // 静的サイズのバッファを持つ構造体 pub const Message = struct { id: u32, payload: [256]u8, // 256 バイト、コンパイル時に確保 }; // 静的割り当てを使う関数 fn process(msg: *Message) void { // ヒープ割り当ては不要;msg はスタック上またはグローバルに存在 std.debug.print("ID: {d}\n", .{msg.id}); } pub fn main() !void { var msg = Message{ .id = 42, .payload = [_]u8{0} ** 256, // すべてのバイトをゼロで初期化 }; process(&msg); } ``` ### 利点 - **決定的なメモリ使用量** – サイズはコンパイル時に分かる - **実行時割り当てオーバーヘッドがゼロ** – ヒープアロケータ呼び出しなし - **安全性** – コンパイラが境界と寿命を検証できる ### 使うべき場面 - 固定長バッファ(例:ネットワークパケット、ファイルヘッダー) - 短時間しか存続しない小規模補助データ構造 - 性能や決定的な動作が重要な状況 --- コンパイル時定数・固定配列・構造体定義を活用することで、Zig は最小限のボイラープレートで最大の安全性を保ちつつメモリを静的に割り当てることができます。

## Japanese Translation: > **概要:** > このプロジェクトは、Zigで書かれた軽量Redis互換のキー/バリューサーバー「kv」を構築し、最小限のコマンドセットで本番環境に適した設計を目指しています。コアデザインでは起動時にすべてのメモリを確保することで、実行中にダイナミックヒープを使用せず、レイテンシスパイクやユース・アフター・フリー(use‑after‑free)バグを回避します。接続は`io_uring`で非同期に処理され、システムは3つのプール(Connection、受信バッファプール、送信バッファプール)を事前確保し、デフォルトでは約1000件までの同時接続数をサポートします。各接続は設定パラメータから派生した固定サイズの受信/送信バッファを使用します。 > コマンド解析はRedisのRESPプロトコルのサブセットに従い、Zigの`std.heap.FixedBufferAllocator`を用いてゼロコピーで解析し、各リクエスト後にアロケータをリセットします。バッファサイズは`list_length_max`と`val_size_max`に依存します。 > ストレージは未管理型の`StringHashMapUnmanaged(Value)`を使用し、初期化時に`ensureTotalCapacity`で容量を確保します。キーと値は共有`ByteArrayPool`に格納され、マップはポインタのみを保持します。削除操作では墓石(tombstone)が残り、墓石数が増えると再ハッシュが必要になる場合があります。 > 設定構造体(`Config`)は `connections_max`、`key_count`、`key_size_max`、`val_size_max`、`list_length_max` などのフィールドを公開し、派生アロケーションで接続ごとのバッファサイズを決定します。デフォルト設定(総計約748 MB、2048エントリ)では `val_size_max` または `list_length_max` を倍増すると、割り当て量が約2.8 GBに上昇する可能性があります。 > 今後の作業としては、カスタム静的コンテキストマップ実装の改善、より良いメモリ利用を実現する代替アロケータの探索、境界検査(fuzz)テストの追加による限界確認、および墓石再ハッシュ処理への対応が挙げられます。

2025/12/27 20:30

**フレームグラフ 対 ツリーマップ 対 サンバースト(2017)**

## Japanese Translation: **概要:** Flame グラフ(SVG)はディスク使用量を高レベルで明確に示します。たとえば、Linux 4.9‑rc5 では `drivers` ディレクトリが全容量の50%以上を占め、`drivers/net` サブディレクトリは約15%です。Tree マップ(macOS の GrandPerspective、Linux の Baobab)は非常に大きなファイルを素早く検出できますが、高レベルのラベルが欠けています;Baobab のツリー表示では各ディレクトリの横にミニバーグラフが表示されます。Sunburst(Baobab の極座標図)は視覚的に印象的ですが、角度で大きさを判断するため長さや面積よりも誤解しやすいです。他のツール―`ncdu` の ASCII バーと `du -hs * | sort -hr` ―はテキストベースで迅速なサマリーを提供しますが、同時に一階層のみ表示されます。 提案されたユーティリティは、これら三つの可視化(Flame グラフ(デフォルト)、Tree マップ、Sunburst)すべてを組み合わせるものです。Flame グラフは読みやすさ・印刷性・最小スペース使用量が優れているため、多数のサンプルファイルシステムでテストした後にデフォルトとして採用されます。このアプローチは、ディスク使用量を簡潔かつ印刷可能なスナップショットとして提供し、ユーザーや開発者がスペースを占有する項目をより効率的に検出できるよう支援します。アイデアは ACMQ の「The Flame Graph」記事と「A Tour through the Visualization Zoo」に引用された既存の研究に基づいています。 **反映された主なポイント:** flame グラフの高レベルビュー、Tree マップの大きなファイルを素早く検出できるがラベルが欠けている点、Sunburst の視覚的魅力とサイズ認識の問題、他ツールの制限、および提案ツールの三つのビュー(デフォルトは flame グラフ)と引用元への参照。