2012/07/06

自由なプログラム

こんにちは、このブログがウクライナやラトビアで大人気なようで有頂天になっている@tomoodaです。 いつもプログラミングの技術についてなんだかヘンテコな理屈をこね回してばかりなんで、今回は技術というより楽しさみたいな話をしてみます。

オレはブルックススキーなんで、ソフトウェアについて考える時にはいつもブルックスがソフトウェアの4つの本質的困難として掲げた複雑性や同調性、可変性、不可視性を基準として考えを纏めるようにしています。これらの本質的困難というのは、実はソフトウェアの楽しさの裏返しにもなっています。つまり、複雑性は複雑なものを組み上げて動かす楽しさ、同調性はレゴや機械をうまく制御したり人間と調和して対話する楽しさ、可変性は既にあるゲーム等を改造して遊ぶ楽しさ、そして不可視性は物体としての実体がないことの楽しさ。ん?物体としての実体がないと何が楽しいんだろう?もうちょっと掘り下げてみましょう。

ソフトウェア以外に、物体としての実体がないのにアレコレできて楽しいものって、どんなものがありますかね?1つは魔法の呪文です。世界中いろいろな所に魔法の物語があります。イギリス発の魔法学校の物語があったり、日本にも魔法少女のアニメがいっぱいありますね。あれって、なんで楽しいんでしょう?たぶん、物体としての実体がないからこそ、どんな魔法でも創造できちゃうんですね。だから楽しいんですよ。魔法学校の話のほうなんて、もう状況設定からして荒唐無稽で支離滅裂。そんな伝統社会の常識からの自由があの作品の面白さなんですよ。常識からの自由、物理的実体からの「自由」が魔法の呪文の根底にあると思う訳です。

昔、呪文が本気で信じられていた時代もありました。その頃は、呪文は「実体がないのに面白いもの」ではなく、まさに物理世界の根源と思われていたのだろうと思います。その時代の呪文は、実体がないという不可視性よりも森羅万象との同調性が重視されていたのではないでしょうか。話はちょっと横道に逸れてしまいましたが、ようするにソフトウェアの不可視性からくる楽しさというのは、魔法の呪文をつくるような楽しさがあるし、同時に魔法の呪文と同様に物理的な物体を動かしたり人間にイタズラできたりする。プログラマは現代の魔法使いなのだと思います。

不可視性の楽しさの根底にあるものを「物理的実体からの自由」と書きましたが、これこそオレがソフトウェアに惹かれた原点でもあります。小学生の頃、友達から「ハムやらない?」と誘われたのがそもそもの発端。そこから電子工作の楽しさに取り憑かれました。それまでは自宅の1Fの町工場で材料と工具を借りてベニア板とか鉄線とかで工作するのが趣味だったのが、ベニア板や鉄線では滅茶苦茶難しそうなことが、トランジスタやICを線でつなげるだけで実現できる。LEDが生き物みたいに光って動く。そして部品屋(浜松のマルツ電波)に入り浸るようになって、マルツの1Fでマイコンに出会ってしまった。MZ-80Bと書かれた小さなテレビで、ハンダ付けしなくても鳥がパタパタと羽ばたいている。何十行ぐらいの英語みたいのを入れると、動くらしい。まさにこの瞬間、この少年の将来の職業が確定しました。ツ

というわけでオレがプログラミングをはじめたのは「物理的実体からの自由」だったわけですが、ソフトウェアにまつわる自由は物理的実体だけじゃなくて、色々あるわけです。フリーソフトウェア、つまり政治的自由を求めるソフトウェアなんかは代表例ですね。フリーソフトウェア運動がプログラマから出てきているという歴史的経緯から言っても、ソフトウェアって、色々な意味で本来自由なものなんだろうな、ソフトウェア作りに身を投じている人は結構な割合で自由に惹かれてきたんだろうな、と思う訳です。

その一方で、静的型付けだとか、契約プログラミングだとか、形式手法だとか、プログラムに対する厳格な制約を適用する技術も沢山あります。これらは一見すると自由を制限するようにも思えるかもしれませんが、実際にはこれらは「この制約を守る限り、自由にやっていいよ」という自由裁量を確保するための技術とも言えます。つまり、「どうやって実現するのかという方法の自由」です。方法の抽象化と呼んでもいいかもしれません。指定された制約を守ればよいということは、つまり、「ここは、こうに決まってるだろ、業界の常識だぞ?」とか「実はお客さんにこういう提案しちゃったから、この実装じゃ駄目だよ。」みたいな暗黙の制約を排除して、プログラマの書きたいように書いて楽しむ事ができるわけです。自由を満喫しましょう。

では動的型付けはどうでしょう?もちろん、これもやはり自由のための技術という説明ができます。動的型付けが実現しようとする「極限までの遅延」とはつまり、「極限まで実装を選択する自由を残す」ということです。ある式を評価する時の具体的な実装コードを、まさに評価している最中にまで保留して、実装コードからくる制約をできるかぎり遅延させて、自由でいられる時間を引き延ばしています。動的型付けもやはり「どうやって実現するのかという方法の自由」を実現するための技術なのです。自由っていいですね。

最近ではVMで動作するプログラム処理系が増えてきました。これもやはり計算機械という物理的実体を抽象して自由を確保するための技術です。計算機械は、1つ1つの機械語のインストラクションが駆動します。プログラムを書くということは、計算機械に適切なタイミングで適切なインストラクションを供給することです。計算機械は物理法則で動いています。プログラミング言語の大切な機能は、この「計算機械」を抽象することです。物理法則で動く計算機械を抽象することで自由を確保することです。そしてVMというアーキテクチャはその抽象をアーキテクチャで実現しようというものです。

計算機械を仮想化することで物理的実体から自由になるという意味では、仮想化サーバやクラウドコンピューティングもやはり同様ですね。JS上でLinuxが動きました、なんて話を聞いてワクワク楽しい気分になるのは、やっぱりCPUやOSに縛られない、自由だからという要素もあるかもしれません。

もう、いっぱいありすぎて、1つ1つ挙げていったらキリがないです。でもこれは当然のことです。あのブルックスさんがソフトウェアの本質とまで言っていることなのだから。オレの狭い了見で書いたこの駄文だけではほんの氷山の一角です。他の3つの本質的困難についてもやっぱり沢山あると思います。複雑性のほうは、もうこれこそがソフトウェア工学の華といってもいい分野ですね。個人的には、ソフトウェア工学は複雑性に集中しすぎてないかな、という印象があって、でも最近はUIとかUXとかアジャイルとかTDDとか、他の3つの本質的困難=本質的楽しさに切り込んでいく分野も出てきていて、どんどん楽しくなってきました。

ブルックスさん自身が語るプログラミングの楽しさについては、この抜粋がわかりやすいです。さすがです。オレなんて、これをプリントアウトして会社のキャビネに貼ってます。どうです、オレってスイーツなブルックス信者でしょ?

で、結局何が言いたかったかというと、なんで「楽しさ」について書こうと思っていたのに、気付いたら技術のことばかり書いちゃうのかなー、ってことです。シ