# 技術野郎の復讐(原題: Revenge of the Nerds) Paul Graham, May 2002(2002年5月 国際ICADユーザ会議での基調講演に加筆) **中心主張**: 1958年に作られた Lisp が今なお最もパワフルなのは、それが技術ではなく**数学**だったからだ。言語は等しくない——言語間のパワーの差はコードサイズに直結し、コードサイズは開発時間に直結する。にもかかわらず大抵のマネージャーはこの事実を無視する。この二つを合わせると、そのまま金儲けのレシピになる。 **実践指針** - 「全ての言語は等価だ」という前提に出会った場面では、それは安心できるから広まっている信念であって事実ではないと疑え。等価なら、なぜ Java の開発者はわざわざ新しい言語を作ったのか。 - 難しい問題を解こうとしている場面では、選択肢は「(a) パワフルな言語を使う (b) 同等のインタプリタを弱い言語で書く (c) 自ら人間コンパイラになる」の三つしかないと認識せよ。無自覚に (c) をやっていることが多い。 - 自分のコードにパターンの繰り返しを見つけた場面では、それは抽象化が足りていないサインだと読め。マクロを書くべきコードを手で展開している可能性が高い。 - 言語選択が問題になるかを見極める場面では、要求の高さで判断せよ。既存部品をつなぐ小さな糊付けプログラムなら手に馴染んだ言語でよい。競争が激しく難しい問題を解くなら言語の力が効く。 - 「業界の最良慣行 (Industry best practice)」という言葉が出てきた場面では、それが技術的最適解ではなく**上司を責任から護るための選択**であることを見抜け。最先端であるべき技術決断に会計の作法を持ち込むと誤った答えになる。 - ソフトウェアビジネスで勝ちたい場面では、見つけられるうちで一番難しい問題に目をつけ、手に入る一番パワフルな言語を使い、ライバルの髪のとんがった上司が中庸な技術へ戻っていくのを待て。 - ベンチャーを立ち上げる場面では、ベンチャーキャピタルや買収候補を喜ばせるために製品を設計するな。ユーザーを喜ばせるように設計せよ。ユーザーを獲得すれば残りは後からついてくる。 **根拠となる事例・考え方** - Lisp の起源: McCarthy はプログラミング言語を作ろうとしたのではなく、チューリングマシンのより便利な代替物を定義する**理論的実験**をしていた。万能 Lisp 関数 eval を紙の上で書いたところ、大学院生の Steve Russell が「これを機械語に翻訳すればインタプリタになる」と気付いて実装してしまった。数週間のうちに理論的実験が言語に変化した。 - **Lisp の9つのアイディア**: (1) 条件式 (2) 関数型(関数がデータ型の一つ) (3) 再帰 (4) 動的型付け (5) ガベージコレクション (6) 式でプログラムが構成される(式と文を区別しない) (7) シンボル型 (8) シンボルと定数の木によるコードの表現 (9) 言語の全てが常に在ること(読み込み時・コンパイル時・実行時が分離していない)。1〜5は広く普及、6は主流に現れ始め、8と9はいまだ Lisp 特有。 - 8番と9番は McCarthy が実装するとは考えもしなかったものを Steve Russell がやってのけたために、意図せず Lisp に入った。この二つを合わせると「プログラムを書くプログラム」=マクロになる。 - Fortran は Lisp と正反対に設計された。Fortran I はアセンブリ言語に数式が付いたもので、サブルーチンが無く分岐だけだった。二つの樹は発生以来近づき続けている。 - ITA Software の航空料金検索プログラム(Orbitz にライセンス)は20万行の Common Lisp。Travelocity と Expedia が支配する市場に技術で参入した実例。ITA の社長談として「一行の Lisp は20行の C コードを置き換えられる」。 - コードサイズが3倍なら開発時間も3倍かかり、人を増やしても補えない(Fred Brooks『人月の神話』)。競争の激しい市場では2〜3:1の差でも致命的。 - 付録では「アキュムレータ生成関数」(数nを取り、数iを取ってnをiだけ増加させその値を返す関数を返す)を Common Lisp / Perl 5 / Smalltalk / JavaScript / Python / Java で書き比べ、言語の力の差を具体化している。Java 版は Ken Anderson によるインタフェース+クラスの実装で、他より格段に冗長。 - **グリーンスパンの第10規則**: 「全ての十分に複雑な C もしくは Fortran プログラムは、後付けの、不完全な仕様とバグを持ち、遅い、Common Lisp の半分の実装を含んでいる」。 - Peter Norvig は『Design Patterns』の23パターンのうち16が Lisp では「全く見えないか、あるいはより簡潔である」ことを発見した。 **キーワード** - **髪のとんがった上司**: (a) テクノロジーを何も知らず (b) テクノロジーについて非常に強い意見を持つ管理職。「全ての言語はだいたい等しい」と信じている。 - **グリーンスパンの第10規則**: 弱い言語で難問を解くと、結局 Lisp の劣化実装を書くことになるという皮肉。 - **業界の最良慣行 (Industry best practice)**: 意思決定者を責任から護るための選択。あなたをトップにはせず、単に平均にする。 - **eval**: Lisp 式の値を計算する万能 Lisp 関数。McCarthy が紙上の証明のために書き、Russell が実装した。 - **nerd(ナード)**: 流行や人付き合いより知的な物事に興味を惹かれる人。訳註では「オタク」より広い概念で、"Revenge of the professors" に近いと説明されている。