コラム:開発者が学ぶべきこと(3)
プログラミングって一体何だろう


Tim Romero(ティム・ロメロ)
2003/11/13

誰もソフトウェアのことを分かっちゃいない

 あるクライアントが、新規雇用の件で悩んでいた。「いい人材なんだが、彼女がプログラミングとは何かを、ちゃんと理解できているのか疑問なんだ」という。私は実際にそのプログラマと会ったわけではなかったので、クライアントの言葉が正しいかどうかの判断はつかなかった。いまもそのプログラマのことは知らないままなのだが、あのときクライアントがいったことには、一理あると考えるようになった。というのは、この世で誰もプログラミングが何であるかを理解できる人なんていないということだ。そしてこのことは、別に悪いことでも何でもない。

 プログラミングが特別難しいものだといっているわけではない。少なくとも高エネルギー宇宙物理学や一般相対性理論のような難しさはない。しかし、プログラミングにおける困難さは、ほんのささいな部分以外はすべて人間の理解を超えるものなのだ。

 世の中には天才プログラマもいる。しかし天才プログラマだからといって、彼らが自分たちのやっていることを理解しているとは限らない。最高のプログラマは、自分がいま実際に書いているプログラムのことは完ぺきに理解しているだろう。しかしそれ以上のことは分かっていないのだ。

 有能な建築家や土木工学の専門家であれば、青写真を見ただけで自分のデザインした建築物でなくとも、大昔に建築されたものだとしても、それがどんな建築物なのか思い描くことができるだろう。しかし、プログラミングにおいてこのようなことはあり得ない。

 2000年(Y2K)問題のころを思い出してほしい。多くの企業経営陣は、自社で管理している古いソフトウェアを理解する者が実はIT部門に誰もいなかったという事実に驚いていたではないか。事実、この業界では、アーサー・C・クラークには悪いが、「十分に古いテクノロジは魔法と見分けがつかない」というジョークさえあるのだから()。

)アーサー・C・クラーク:「十分に進化したテクノロジは魔法と見分けがつかない」(Any sufficiently advanced technology is indistinguishable from magic)と語ったSF作家。クラークの第3法則として有名。

これを「進化」と呼んでいいのか?

 通常エンジニアリング分野で「進化」を計る物差しは、最終的に出来上がるものの品質がどれだけ向上したかが判断材料となる。例えば橋を軽く安全に作ったり、新材料を利用して建築コストを下げたり、より小さくて速いトランジスタを開発したり、スターターモーターの信頼性を向上させたり、燃焼室の効率を上げたりといった具合だ。

 その反対に、ソフトウェアは進化の結果として、大きくて遅いプログラムを生み出した。おまけに進化を遂げたプログラムは、古い技術で開発したものよりソフトウェアエラーが起こりやすいものとなったのだ。ここで1つはっきりさせておかなくてはならないことがある。「ソフトウェアエラー」とは、プログラマが指示したとおりにプログラムが動かないということを意味する。プログラム自体は指示どおりに動いているが、プログラマがこのようなプログラムを作るつもりではなかったという「プログラミングエラー」とは違うものだ。

 新技術というものは、最終的に出来上がる製品にどの程度貢献したかで価値が決まるのではなく、エンジニアが自分のやっていることに対してどの程度理解力を深めることができるかどうかでその価値が決まる。つまり、その技術を使うことで、プログラミングにおける複雑さにうまく対処できるかどうかが重要なのだ。このことは、昔のハイレベル言語であったCOBOLやFORTRANをはじめ、最近のオブジェクト指向のプログラミング手法についてもいえることだ。

 もちろん、コンピュータ・プログラミングはほかのエンジニアリング分野と違って、物理的な限界はなく、人間の理解の限界があるのみだ。つまり、ソフトウェアプログラムを理解しさえすれば、どんなプログラムでも作ることが可能なのである。これは、例えば橋の建設などには当てはまらない。橋が建設可能かどうかということは、いくらエンジニアが橋の建設における課題をすべて理解していても、物理的な課題をクリアしていない限り建設することは不可能なのだ。

プログラミングは矛盾だらけ

 矛盾することなのだが、より複雑なシステムを扱うために生まれた新技術というものは、ソフトウェアに対する理解を深めるために使われることはなく、より複雑なプログラムを開発するために使われている。プログラマから見ると、プログラミングの複雑さというものはいつも変わらない。プログラミングはいつだって心地よいものではないし、人間の理解を超えている。

 プログラミングにおける唯一の限界は、人間が扱うことのできる複雑さに限界があるという点である。ここで何が可能か不可能かが決まる。この観点からすると、プログラミングを理解できる人間なんて誰もいないということは明白である。そして不思議なことに、プログラマが自分のやっていることを理解していないということが、ソフトウェアエンジニアリングにおける進化に結び付いているのである。

筆者プロフィール
Tim Romero(ティム・ロメロ)●米国ワシントンDC出身。1991年に来日し、インターネット金融取引システムなどの開発を手掛けるヴァンガード(Vanguard)を設立。同社がデジタルガレージに買収された後、取締役として2002年9月まで在籍。現在は東京やサンフランシスコの企業とともに、エンジニアリングおよび開発プロセスの改善、技術管理の合理化に向けた活動を行っている。なお、本コラムは不定期での掲載を予定している。

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。