The Witness Logo
2025-12-31
#雑記

コンパイルエラーだらけの日常とCPUを震わす一撃

「Aって、具体的にどういう意味ですか?」

あなたは、純粋な質問をしただけなのに、相手を怒らせてしまった経験はないだろうか。

僕にはある。文脈の中で「A」が指すものが定義されていなかったから、それをクリアにしたかっただけで、決して「お前の言ってることは意味不明だ」と攻撃したかったわけではない。

「あなたの発言を否定しているわけではなく、単に理解が追いついていないので教えてほしいんです」

そう補足しても、相手の自尊心を傷つけてしまったようだ。なぜ、純粋な質問が攻撃として受け取られてしまうのか。なぜ、悪気のない確認が人を不快にしてしまうのか。

その理由が、最近ようやく言語化できた。僕の頭の中には、いつの間にか「コンパイラ」が住み着いてしまっていたのだ。

コンパイルエラーを吐き続ける脳内システム

コンパイラとは、プログラミングにおいて、人間が書いたソースコードをコンピュータが実行可能な形式(機械語)に変換する翻訳プログラムのことである。文法的な誤りや定義されていない変数が一つでもあれば、コンパイラは即座にエラーを吐き出し、処理を停止させる。

僕の場合、受験勉強で数学や英文解釈に没頭する過程で、このコンパイラのような厳密な処理系が脳内に構築されてしまったらしい。

日常会話において、参照されている変数が何を指しているかが曖昧なとき、僕の脳内コンパイラは反射的にエラーを検知する。「え、それって何? 定義されてないよ」と警告灯が点滅し、それ以上の解釈プロセスを停止させてしまうのだ。

しかし、世の中の「普通」のコミュニケーションは、もっと寛容だ。

「あれやっといて」「いい感じで頼む」

未定義の変数、不明確なスコープ、型の不一致。これらが日常的に飛び交っている。形式的には「はい」か「いいえ」でしか答えられない質問(Boolean型)に対して、「それは状況によりますね」という曖昧な回答(String型)が返ってくることさえある。

多くの人は、コンパイラではなく「インタプリタ」として機能しているのだろう。エラーがあっても、文脈で補完しながら、その場その場でなんとなく実行していく。いわば、常に lint(構文チェック)が甘い状態で、any 型が飛び交う世界を生きているのだ。

以前、ある場面で「好ましい行動をどう定着させるか」を議論していたときのことだ。僕は真面目にこう提案した。

「その行動を取ることを、メンバー同士で相互監視すればいいんだと思うんですよね」

すると相手は苦笑いしてこう言った。「それは綺麗な言葉で『文化』と呼ぶんですよ」と。

僕が言いたかったのは「良いとされる行動に対してフィードバックが発生する自律的なシステム」のことであり、機能的には「相互監視」という言葉が最も正確にその状態を表していると考えていた。しかし、人間にとってその言葉はあまりに冷たく、管理社会的で、直感的な不快感を覚えてしまう言葉だ。

機能的に正しい言葉と、人の感情に届く言葉は違う。僕のコンパイラは、過剰に「正確さ」に最適化されすぎていた。常にstrict modeで動作し、少しの型揺れも許容しない。それが、誰かを傷つけ、「細かいやつだ」と疎まれる原因になっていたのである。

早期リターンの美学と会話の非効率

僕のコンパイラは、コードで言うところの「早期リターン」を好む。

これは名著『リーダブルコード』でも推奨されている原則で、「条件を満たさないなら、深いネストを作る前にさっさと処理を終了して値を返す」という考え方だ。

例えば、「週末の旅行先をどこにするか」という会話を想像してほしい。僕の脳内では、以下のような処理が走っている。

javascript
function decideTravelDestination(budget, schedule, mood) {
  // 予算が3万円未満なら、海外や沖縄は議論する前に除外する
  if (budget < 30000) {
    return "近場の温泉";
  }

  // 休みが1日しかないなら、宿泊プランは考える範囲から除外する
  if (schedule.length < 2) {
    return "日帰りドライブ";
  }

  // ここまで来て初めて、広範な解について議論する
  return analyzePreferences(budget, schedule, mood);
}

しかし、実際の会話はこうはいかない。予算が3万円という時点で解の探索範囲は絞られているはずなのに、「北海道でカニ食べたいね〜」といった、すでに除外されたはずの広大な解空間をダラダラと探索し続ける。

そんなとき、僕のコンパイラは叫び出したくなる。「その議論、予算制約の if 文ですでに false が返っています。それ以降の処理はCPUリソースの無駄です」と。

論理の積み上げにおいても同様だ。ある主張をするなら、それを 80%裏付ける最大の根拠 から提示すべきだ。大きな石から順に瓶に入れていくように。

それなのに、いきなり5%の細かい小石(枝葉末節な事例)から始まる議論を見ると、メモリオーバーフローの警告が出る。「その細かい話を聞くためのメモリ領域を確保する前に、まず全体のアウトラインを定義してください」と言いたくなる。

不確実性が残るとしても、それを定量的に評価できるなら、意思決定は数式で表現できるはずだ。期待値 EE は以下のように算出される。

E=Psuccess×Rsuccess+Pfailure×RfailureE=Psuccess×Rsuccess+Pfailure×Rfailure

ここで PP は確率、RR はリターンである。もし95%の確率で成功し(Psuccess=0.95Psuccess=0.95)、失敗時の損失(RfailureRfailure)が許容範囲内であれば、残りの5%の不確実性は無視して「Go」の判断ができるはずだ。

論理とは、このように効率的に正解へ到達するためのアルゴリズムなのである。

論理を貫通する「アセンブリ言語」としての情熱

そんなガチガチのコンパイラ脳を持つ僕だが、そのシステムを完全に無効化された経験がある。今の会社への入社を決めたときのことだ。

当時、当時の役員の方に「両親に入社を反対されている」とこぼしたとき、彼は即座にこう言った。

「じゃあ、ご両親に会いに行こう。地元まで説明に行くよ」

この一言を聞いた瞬間、僕の頭の中のコンパイラは機能停止した。ロジックも、条件分岐も、早期リターンも、すべてが吹き飛んだ。

本来なら、「役員がわざわざ地元まで行くコスト」と「一人の社員を採用するリターン」を天秤にかけ、合理的かどうかを判断すべき場面だ。しかし、そんな計算をする前に、僕は「あ、この人についていこう」と決めていた。

これは一体何だったのか。

今にして思えば、あのとき彼は高級言語(論理)ではなく、アセンブリ言語(情熱・胆力)で直接僕のCPUに命令を書き込んだのだ。

人間は本来、コンパイラなどという高邁なツールを持たず、感情というアセンブリ言語で動いている。だから「論理的に話してくれ」と言っても通じないことが多い。僕らはもともと、高級言語をネイティブにはコンパイルできないからだ。

逆に、僕のように後天的にコンパイラを実装してしまった人間は、アセンブリを直接読むのが苦手になる。いちいち高級言語に翻訳して理解しようとする。

しかし、「本物」の情熱はコンパイラを貫通する。それは、通常のプロセスを強制的に中断させて実行権を奪う、CPU割り込みのようなものだ。

「この人は本気だ」「この人の言うことなら信じられる」

そう感じさせる胆力は、どんなに精緻なロジックよりも速く、深く、相手の行動原理(CPU)に直接届く。

論理とは「気持ちよさ」への迂回路にすぎない

結局のところ、僕たちが求めているのは「納得感」という名の「気持ちよさ」なのだろう。

僕のような人間は、論理のブロックを積み上げ、「矛盾がない」という状態を作ることに快感を覚える。コンパイラがエラーを吐かない状態こそが、精神衛生上の「気持ちよさ」なのだ。

一方で、人間は論理など経由せずとも、もっとダイレクトに「感情の共鳴」で気持ちよくなれる。そちらの方が、生物として健全な姿なのかもしれない。全ての場面でコンパイラを回し続けていたら、誰だって疲弊してしまう。

仕事という戦場においては、確かにコンパイラは強力な武器になる。感情だけで動くCPUは暴走しやすいし、バグも多い。だからこそ、僕たちは論理を鍛える。

しかし、その先には「論理を超えた一撃」が存在することも忘れてはいけない。

コンパイルエラーを吐き続ける毎日を過ごしながらも、僕はどこかで論理で武装したその奥にある、生身のCPUを震わせてくれる「アセンブリ言語の直撃」を待っているのかもしれない。