2026年10月8日木曜日

Quoraの「プログラミングはなぜ難しいのか。開発者ならもっと簡単にできるはずで、『難しいままにしておく』忖度があるのか」というスレッドの回答集を、元に、要約や、解説など

全体像

このファイルは、Quoraの「プログラミングはなぜ難しいのか。開発者ならもっと簡単にできるはずで、『難しいままにしておく』忖度があるのか」というスレッドの回答集です。60人ほどが答えていて、結論はほぼ全員一致しています。忖度はなく、むしろ昔より劇的に簡単になった。それでも難しいのは、問題そのものと、コンピュータの性質によるものだ、というものです。

回答はだいたい次の系統に分かれます。

  • 昔より簡単になった
  • 問題自体が難しい
  • コンピュータは空気を読まない
  • 簡単さと自由度はトレードオフ
  • 頭の中の抽象物を扱うのがしんどい
  • 入口(環境構築・動機)で挫折する
  • 複雑性が爆発する

以下、特に良かった回答を抜粋して、雑学や業界話を添えて解説します。


1. Umeeeさん「無人島サバイバル料理 → 最新の厨房」

昔のプログラミングは調理器具を作るところから始める無人島料理で、今は設備の整った厨房だ、という例えです。「簡単になっている」という総意を一番きれいに言い表しています。

雑学: 世界初期の汎用コンピュータENIACは、ケーブルとスイッチを差し替えることでプログラムしていました。担当したのは主に女性数学者6人のチームです。そこから機械語、アセンブラ、C言語と進んできたわけです。ちなみに「Hello, World!」の元祖は、1970年代初頭のブライアン・カーニハンによる入門資料だと言われています。

2. Gouki Tokayaさん「永遠のループ」

分かりやすいツールが登場し、「もうプログラマー不要では」と言われ、すると今度はもっと複雑なものが作られて難しくなる。この繰り返しだ、という指摘です。

業界話: これは本当に何度も起きています。

  • COBOLは英語風の文法で「経営者にも読める」ことを狙った言語でした。
  • SQLも当初は非プログラマー向けに設計されました。
  • その後もVisual Basic、Excel、ノーコードと続き、今は生成AIの番です。

最近は、AIに任せて自分ではコードをほぼ読まない開発スタイルが「バイブコーディング」(2025年にアンドレイ・カルパシーが命名)と呼ばれて話題になりました。道具が変わっても、人が作る対象が複雑になるのでループは続きます。

3. Shiro Kawaiさん「プログラミングは文章を書くようなもの」

使い捨てスクリプトは、ツイートのように簡単です。一方で、人の心を動かす小説に当たる問題は難しい。つまり難しいのは言語ではなく、解こうとしている問題の方だという主張です。「漢字が難しいから全部ひらがなに」としても小説は簡単にならない、という例えが秀逸でした。

雑学: これは1986年にフレッド・ブルックスが書いた有名な論文「銀の弾などない」とほぼ同じ主張です。ソフトウェアの難しさは、道具が原因の偶有的複雑さと、問題そのものが持つ本質的複雑さに分けられます。道具の改善で減らせるのは前者だけで、後者は減りません。40年前の論文が、今のQuoraでも通用しているわけです。

4. Yu-Mo(半導体屋)さん「ローコンテクスト」

人間同士は「あれお願いね」で通じるハイコンテクストですが、コンピュータには一から十まで説明しないと動きません。「ケーキ作ってね」を「材料を用意し、順番に混ぜて…」と分解していく作業が得意かどうかで、向き不向きが分かれるという話です。逆に、100回やれば100回同じ結果を返すという良さがあるのも、この性質の裏返しです。

雑学: 別の回答者(ぶーちゃんさん)は「難しいのは英語だ。だから日本語で書ける『なでしこ』や『ひまわり』が作られた」と書いています。日本語のプログラミング言語は確かに実在します。ただ、難しさの正体が英単語なら、英語圏の人は苦労しないはずです。ところが2007年ごろ、「大卒の応募者の多くが、FizzBuzzという新人向けの超簡単な課題すら書けない」というブログが話題になり、「FizzBuzz問題」としてプログラマー採用の定番ネタになりました。難しさの本体は語彙より、手順の厳密な分解だと考える方が筋が通ります。

5. 長谷川 祐一さん「状態の爆発」

ON/OFFのフラグが2個なら4状態、8個で256状態、16個で65,536状態。理屈の上では全部の状態で正しく動くことを確認しないといけないので、デバッグが爆発的に難しくなる、という説明です。

業界話: これは現実のバグ事例が豊富にあります。

  • マイクロソフトの音楽プレーヤー「Zune」は2008年の大晦日(うるう年)に一斉にフリーズしました。うるう年の日付計算のバグです。
  • Excelは今も「1900年はうるう年」という誤った扱いを引きずっています。これはLotus 1-2-3との互換性のためです。
  • 宮川大輔さんの回答にある「宇宙線でメモリの中身が反転する」も実話で、ソフトエラーと呼ばれます。

「今日から1000日後の曜日」を自力で計算していた時代に比べ、今はライブラリが一行で済ませてくれるのも、こういう地雷を先人が踏み抜いてくれたおかげです。

6. Shiro Kawaiさん & A1aさん「Cはミッション車」

A1aさんは「高級言語はAT車、Cはミッション車」と例えています。ダブルクラッチやエンジンブレーキのような高度な操作ができる代わりに、加減を誤るとエンストします。

Shiro Kawaiさんはさらに、最近Cはむしろ難しくなってきたと書いています。コンパイラの最適化が言語仕様ぎりぎりまで攻めるようになったため、「ポインタはただのアドレスでしょ」という素朴な理解だと、新しいコンパイラで突然動かなくなるそうです。これは未定義動作と呼ばれる領域の話で、20年動いていたコードが、コンパイラの更新で壊れる事例が実際にあります。

雑学: 日本の運転免許にAT限定ができたのは1991年です。つまり「AT限定が当たり前になった世代」と「MTで育った世代」の違いは、そのまま「高級言語世代」と「C世代」の違いに重なります。

7. 浅見 幸宏さん「世界を3つに分ける」

自分の領域を、手に負える領域、よく使う要素技術、手に負えない領域に分け、手に負えないものは華麗にスルーする。「通ぶらず、泥臭く」という実務的な知恵です。

業界話: これは「ボーリングテクノロジーを選べ」という考え方と通じます(2015年にダン・マッキンリーが広めた議論)。新しい技術には、使える「イノベーショントークン」の数に限りがあるので、枯れた技術を選ぼう、というものです。同じ回答者の別の指摘も面白く、JavaScriptの数値は基本的に浮動小数点(0.1 + 0.2 が 0.3 にならない有名なアレ)なので、「簡単な計算アプリ」ですら実は奥が深いのです。

8. 動機の話(おかもとさん、Toru Ishiharaさんなど)

  • おかもとさんは「遊びでやっていないことは何でも難しい」と述べています。ゲームを作りたくてマリオが動いただけで大はしゃぎしたそうです。
  • Toru Ishiharaさんは「プログラミングは10%の人向けに設計されていて、スクールでも10人中9人が諦める」と書いています。

注意点: この「10%」には明確な根拠は示されていません。あくまで体感談として読むのが安全です。ただ、挫折が多いこと自体は、上のFizzBuzzの話とも整合します。

9. 山本 聡さん & Sone Masayukiさん「良し悪しが見えない」「過去の自分は最も恐るべき他人」

  • 山本さんは、車や建築は素人でも外見で良し悪しが分かりますが、ソフトウェアは内部がスパゲッティかどうか、初級者には全く分からない、と書いています。だから品質を磨く圧力がかかりにくいのです。
  • Sone さんは、半年前の自分のコードが、他人のコードより難解なことがある、と書いています。

雑学: 前者は、ウォード・カニンガムが1992年に提唱した技術的負債という考え方につながります。見えない借金が利子を生んで膨らんでいく、というものです。後者は、プログラマーなら誰でも経験のあるあるネタです。バージョン管理のgit blameで犯人を調べたら自分だった、というオチは業界の定番ジョークです。


ちょっと待った枠

  • **「論理的思考ができない人には難しい」「向いていないだけ」**系の回答は、気持ちは分かりますが、やや上から目線です。Rubyの作者まつもとゆきひろさんの「考えることが好きでない人には難しい」くらいの言い方の方が、事実としても温かいです。
  • **「Python 3.9のサポート切れ」**の回答は、「難しいままの方が幸せという力学が働くかも」と結びつけていますが、バージョンアップの手間と言語の難しさは別の話です。ここは少し論点がずれています。
  • 一番グッとくるのは、Aoki Hiroshiさんの「他人と比べず、1週間前の自分と比べよう」という励ましです。

味わい枠

Kurimoto Shingoさんの「嫁さんとの仲を維持する苦労に比べたら、プログラミングはアホみたいに簡単」という回答も、ある意味で核心を突いています。コンピュータは言った通りに動くのです。


一言でまとめると

プログラミングが難しいのは、誰かが意地悪をしているからではなく、現実の問題が複雑で、コンピュータが空気を読まず、簡単さを求めるほど自由度が失われるからです。道具は確実に良くなっていますが、人間は道具が良くなるたびに、より難しいものを作ろうとします。この追いかけっこが、60年以上続いています。

もし特定のテーマ(Cの未定義動作、技術的負債、ノーコードの限界など)をもっと掘り下げたい場合は、そこだけ詳しく解説することもできます。


プログラミングが「難しい」と感じる理由について、Quoraの多数の回答を整理すると、大きく以下のポイントに集約できます。共通して「忖度でわざと難しくしているわけではない」という結論が出ています。良い指摘を抜粋しつつ、業界の雑学を交えて解説します。

1. 昔に比べて、プログラミング自体は圧倒的に簡単になっている

最も多く出てきたのはこの視点です。

  • Umeeeさんの回答:昔は「無人島でのサバイバル料理」(道具を一から作る)、今は「最新設備の整った厨房」。必要な道具(ライブラリ・フレームワーク)が揃い、好みのキッチンを簡単にセットアップできる時代。
  • どどまささん:マシン語の時代は「2倍にする・半分にする」を組み合わせて四則演算していた。今は普通に a + b と書ける。
  • 大矢隆生さん:設備制御のプロがC#で画像処理+モーター制御を短期間で組めた。30年前ならPC専門のプロに頼んでいたレベルのことが、素人に近い人間でも可能になった。

業界雑学: 1980年代の「マシン語」時代、プログラムを書く人はCPUのレジスタを直接いじっていました。今のPythonやJavaScriptで「配列の合計を取る」一行が、当時は数十行のアセンブリ命令に相当します。さらに現在はAIエージェント(CursorやClaude Codeなど)がコードをほぼ自動生成してくれる段階まで来ています。Gemini CLIが無料で使える、という指摘もありました。

2. 難しさの本質は「コンピューターの性質」と「問題の複雑さ」

ここが最も本質的な指摘です。

  • コンピューターは厳密すぎる 人間の「いい感じにやっておいて」は通じない。曖昧な指示を一切受け付けない機械に、人間の曖昧な感覚を正確に翻訳する必要がある。 (伊本貴士さん、宮川大輔さん、Yu-Moさんなどが繰り返し指摘)

  • 解こうとしている問題自体が難しい Shiro Kawaiさんの比喩が秀逸です。 「文章を書くのは難しくない。でも『大勢の心を動かす物語』を書くのは難しい。プログラミングも同じで、難しいのは『解こうとしている問題』の方だ。」

    運動会のプログラム(時間割)や料理のレシピも「プログラム」だ、というYu-Moさんの指摘も面白い。長年デバッグされ最適化されたものだから、一見簡単に見える。

業界話: ソフトウェア工学で「複雑性の制御」は今も未解決の大問題です。Dijkstra(構造化プログラミングの提唱者)が「Goto文は有害」と言った時代から、オブジェクト指向、関数型、マイクロサービス、まで「複雑さをどう封じ込めるか」の戦いが続いています。簡単にしようとすると「痒いところに手が届かない」トレードオフが必ず出る(ノーコードの限界)。

3. 「簡単にする」と「できること」はトレードオフ

これが「忖度しているのか?」という疑問への直接的な答えです。

  • 人間に優しくするほど、コンピューターへの最適変換が難しくなり、最終的に細かい制御ができなくなる。
  • ノーコード・ローコードは存在するが、「RPGツクール」のようにできることが制限される。
  • 職業プログラマーは「自分がやりたいことを効率よく実現できること」を優先する。一般人向けの「わかりやすさ」は二の次になりやすい。

雑学: 日本語でプログラミングできる言語(「なでしこ」「ひまわり」など)がかつて作られましたが、ほとんど普及しませんでした。理由は「Giveの精神」(オープンソース文化)が弱かった、という指摘もあります。一方でScratchのようなビジュアル言語は教育用に成功していますが、本格的な製品開発にはほとんど使われません。

4. 人間側の適性と論理的思考

  • 論理的思考が得意な人には比較的簡単。逆に「何もしてないのに動かなくなった」と言う人には、そもそもプログラムを教える土台がない(仁月克彦さん)。
  • 短期記憶と「脳内イメージ力」が重要。頭の中で構造を組み立ててからコードに落とす作業。
  • 向いている人にとっては「遊び」、向いていない人にとっては「苦行」。

業界あるある: 「前任者のコードが読めない」問題は永遠です。山本聡さんの指摘通り、前任者の思想・癖・スキルレベルを読み解く必要があり、これが実務の最大の難所になることも多いです。

まとめ:忖度は存在しない

  • 開発者自身も「簡単になってほしい」と思っている。実際、歴史的にずっと簡単になってきた。
  • それでも難しいのは、
    1. コンピューターの厳密さ
    2. 解こうとしている問題の複雑さ
    3. 「簡単さ」と「表現力」のトレードオフ が根本にあるから。
  • 最近の生成AIは、このトレードオフをさらに崩し始めています。ただし「分かりやすいツールが出る → より複雑なものが求められる → また難しくなる」という永久ループが続く可能性が高い、という冷静な見方も複数ありました。

要するに「難しいままにしておくんだ!」という意志はなく、むしろ「もっと簡単にしたい」という欲求と、「簡単にしすぎると無力になる」という現実がせめぎ合っている状態です。


提供された文章は、Quoraの「プログラミングはなぜ難しいのか?」「開発者が忖度して意図的に難しくしているのではないか?」という素朴な疑問に対し、多くの現役エンジニアや有識者が回答しているスレッドです。

全体を簡潔にまとめつつ、特に鋭い部分や面白い視点を抜粋し、業界話や雑学を交えて解説します。

全体のまとめ:なぜプログラミングは難しいのか?

結論から言うと、「忖度で難しくしている」ということは一切なく、むしろ人類史上で最も簡単になり続けています。それにもかかわらず難しく感じるのには、主に3つの本質的な理由があります。

  1. コンピュータという機械の物理的な制約 人間のように「いい感じにやって」というハイコンテクスト(空気を読む)な意思疎通が通用せず、徹底的にローコンテクスト(厳密で一律な指示)を要求されるため。

  2. 解決しようとしている「現実世界の問題」自体が複雑 プログラミング言語自体は単なるツール(文章を書くためのペンや文字)であり、解くべき問題や要求仕様そのものが複雑だから難しくなる。

  3. 「わかりやすさ」と「自由度・効率」のトレードオフ 初心者向けに極限まで簡単に(ノーコード化など)すると自由度が奪われ、「痒い所に手が届かない」状態になるため、プロの現場では自由度の高い言語が必要とされる。

ここが面白い!注目の回答・説得力のある抜粋

1. 昔と今の比較:「無人島サバイバル」から「最新の厨房」へ

「昔のプログラミングは無人島で調理器具を作るところから始めるサバイバル。現代は最新設備の整った厨房で料理をするようなもの」(Umeee氏)

  • 解説・業界話: 昔(1970〜80年代)のプログラマは、メモリの容量(数キロバイト程度!)と格闘しながら、CPUに直接指示を出すような命令を書いていました。現代では巨大なライブラリやフレームワーク、さらにはAIエージェントまで揃っており、環境としては劇的に恵まれています。

2. 「鉛筆で文字を書く」をコードにすると?

「人間ならパッとできる『鉛筆で紙に書く』も、プログラミングでは『鉛筆とは?』『指の関節をどう動かす?』『目の前とは?』『紙とは?』まですべて定義・指示する必要がある」(morioka kazuo氏)

  • 解説・業界話: 人間が無意識に行っている抽象的な判断を、すべて論理的なステップに分解(分解能を極限まで高める)しなければならない点に、脳の疲れや難しさの正体があります。

3. 簡単になりすぎると「大したことができない」ジレンマ

「ノーコードなどプログラミングを簡単にする手法もあるが、簡単になった分、大したことはできなくなるトレードオフがある」(Kukutsu Atsushi氏)「RPGツクールは簡単にゲームが作れるが、RPGしか作れない。簡単な計算機すら作れない。簡単にすると制限が生まれる」(鎌次 伸也氏)

  • 解説・業界話: IT業界では昔から「誰でもマウス操作だけでシステムが作れる夢のツール」が何回も登場してはブームになり、結局「複雑なカスタマイズができない」という壁にぶつかって姿を消す…という歴史(Gouki Tokaya氏の言う永久ループ)を繰り返しています。

4. コンピュータと妻(人間)のロジックの違い?

「嫁さんとの仲を維持する苦労に比べたらアホみたいに簡単。言った通りに動いてくれる。かたや嫁という存在は『何か感想言いなさい』と言うので感想を述べたら激怒する。わけのわからないロジックが動いている」(Kurimoto Shingo氏)

  • 解説・雑学: ジョーク交じりの例えですが、エンジニアの本音を突いています。人間社会のルールや感情(忖度や空気感)は曖昧で矛盾に満ちていますが、プログラムは「絶対に書いた通りにしか動かない」という点では極めて愚直で誠実な世界です。

プログラミングにまつわる業界雑学・裏話

1. C言語は「マニュアル(MT)車」である

スレッド内でも例えられていますが、C言語などの低級言語(ハードウェアに近い言語)は「マニュアル車」によく例えられます。クラッチ操作(メモリ管理やポインタ)を間違えると一瞬でエンスト(クラッシュ)しますが、限界までエンジンの性能を引き出せます。一方、Pythonなどの現代的な言語は「自動ブレーキ付きのオートマ車」であり、事故を起こしにくい仕組みが裏で張り巡らされています。

2. 「過去の自分は最も恐ろしい他人」

エンジニア界隈の有名な格言に「半年前に自分が書いたコードは、他人が書いたコードに見える」というものがあります(Sone Masayuki氏も言及)。 プログラムを書くときは頭の中に完璧な仕様(構造)が浮かんでいますが、時間を置くとそれを忘れてしまうため、誰が見ても(未来の自分が読んでも)わかるように綺麗に整理して書く「可読性」という技術が非常に重宝されます。

3. 生成AI時代のプログラミング

近年(特にここ数年)はChatGPTやClaude、GeminiなどのAIエージェントが登場し、日常会話レベルの指示でコードが生成できるようになりました。 「コードを書く作業(コーディング)」自体はAIによってさらに一気に簡単になりましたが、「何を作りたいか」「作られたプログラムに不備やセキュリティ上の穴がないかを見抜く(論理的思考)」という人間の役割は、今なお難しさとして残り続けています。


先ほどのまとめと解説をさらに深掘りし、今回のQuoraスレッドが示唆している「少し変わった視点(メタ的な構造・心理学・社会学的なアプローチ)」を、日本語で追加解説します。

1. 「言語」という名前の認知バイアス(認知心理学的視点)

私たちは普段「プログラミング言語(Programming Language)」と呼びます。この「言語」という言葉自体が、初学者に大きな誤解(認知バイアス)を与えているという視点です。

  • 人間の言語(高文脈・ハイコンテクスト):

    日常会話は、文脈・表情・空気感・共通善・前提条件に頼って成立しています。「適当にやっておいて」で通じるのは、人間がお互いの脳内で欠損した情報を勝手に補完しているからです。

  • コンピュータの言語(低文脈・ローコンテクスト):

    プログラミング言語は「言語」というより、「数学の厳密な論理式」や「精密機械の組み立て設計図」に近いです。

変わった視点:

初初心者が挫折するのは「新しい語学を学ぶのが難しいから」ではなく、**「人生で初めて『忖度も空気読みも補完も一切してくれない超頑固な存在』と1対1で対峙させられるカルチャーショック」**が原因です。

人間の脳は「曖昧さ」を許容するように進化してきたため、極限の厳密さを求めるコンピュータ的思考(計算論的思考)は、**脳にとって本質的に「不自然で疲れる作業」**なのです。

2. ソフトウェアの本質「非物質性」と「暗闇の手探り」

建築、料理、自動車、DIYなどは、作業の経過や失敗が目に見えます(材料が焦げた、柱が曲がった、ネジが余ったなど)。

しかし、ソフトウェアには物理的な形がありません。

  • 暗闇での立体パズル:

    コードを書く作業は、「頭の中に巨大な目に見えない立体構造物(ロジック)を組み立て、エラーが出たら目隠しをしたまま手探りで壊れている1個のパーツを探す」ようなものです。

  • 「壊れていない」と「正しい」のギャップ:

    画面が動いていても、裏でメモリが漏れていたり、特定の条件でデータが消えるバグが潜んでいたりします。

変わった視点: 難しさの根源は「コードを書く作業」ではなく、**「見えない頭の中の概念モデル(モデル)と、実際の動作(現物)のズレを脳内で同期させ続けるストレス」**にあります。目に見えないものを想像し続ける抽象化能力が試されるため、難度が高く感じられます。

3. 「プログラマ不要論」という歴史的ディストピア(業界史の視点)

スレッド内でも「永久ループ」として語られていましたが、IT業界には「40年前から10年おきに『これでプログラマが不要になる!』という技術が登場し、結局プログラマの仕事が増える」という面白い歴史があります。

  1. 1980年代(4GL / 第4世代言語): 「英語に近い指示でSQLやDBを操作できる!プログラマ不要!」→ 複雑な条件に対応できず撃沈。

  2. 1990〜2000年代(UML / CASEツール): 「設計図(図形)を描けば自動でコードが生成される!プログラマ不要!」→ 複雑な例外処理を図で描く方が難しくて破綻。

  3. 2010年代(NoCode / LowCode): 「画面をドラッグ&ドロップするだけ!プログラマ不要!」→ ちょっとしたカスタマイズが無理で結局コードを書くことに。

  4. 2020年代(生成AI / LLM): 「自然語で指示すればコードが完成!プログラマ不要!」→ AIが出した「一見合っているが微妙に間違っているコード」のデバッグと保守で、より高度な人間の眼力が必要に。

変わった視点:

「プログラミングを簡単にするツール」が登場すると、プログラミングの難易度が下がるのではなく、**「そのツールを使って作るシステムの要求仕様が跳ね上がる」**という現象が起きます。

昔なら「文字が出るだけで感動」だったのが、現代は「リアルタイム同期・マルチデバイス対応・セキュリティ万全・秒間1万アクセス耐性」が当たり前です。ツールが簡単になればなるほど、人類はより複雑なものを求めるため、**難しさの総量は常に一定(トレードオフ)**なのです。

4. 「忖度(そんたく)」の逆転構造:実は人間側が「コードに忖度させられている」

質問者は「開発者が忖度して難しくしているのでは?」と疑っていましたが、実態は真逆です。

  • 現実世界のルールが破綻している: 法律、税制、会社の業務フロー、人間の感情などは、矛盾と例外に満ちています(例:「基本はAだけど、〇〇さんの決裁があればBでもOK。ただし月末はC」など)。

  • 無理やりロジックに落とし込む: エンジニアの仕事は、そうした「人間のぐちゃぐちゃで理不尽なルール(仕様)」を、コンピュータが理解できる綺麗な論理ツリーに変換する翻訳作業です。

変わった視点: システム開発で一番難しいのは「コードを書くこと」ではなく、**「人間側の支離滅裂なルールを整理し、例外の矛盾を暴くこと」**です。 プログラマは意図的に難しくしているどころか、人間界のカオス(カオス)をなんとか整理してコンピュータに伝える「人間と機械の間の苦しい板挟み調整役(忖度係)」を行っています。

まとめ:何が本当の「難しさ」なのか?

このQuoraスレッド全体を俯瞰すると、ひとつの面白い事実に気づきます。

  • 入門〜初級の壁: 「構文・文法・コンピュータの厳密さ」に慣れる難しさ(ツール・学習法・AIで劇的に緩和可能)。

  • 中級〜上級の壁: 「現実世界の複雑さ・状態の組み合わせ・人間の曖昧さ・変更への対応」に対処する難しさ(ツールが進歩しても絶対に消えない難しさ)。

つまり、「プログラミングという作業」自体はテクノロジーでどんどん簡単になっていますが、「複雑な現実世界を論理的に整理して構造化する」という人間の思考の難しさは、今後も残り続けると言えます。

0 件のコメント: