愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

プログラミング言語について語るときに僕の語ること

僕はしばらく前までプログラミング言語についての議論を戦わすのが好きな人間だった。

今でもそういう会話が嫌いではないとはいえない。というか好きか嫌いかで言うと好きな方かもしれない。今でもそういった会話、「何とか言語はこういうとこがいけない」「それに比べると(俺の使っている)○○言語はうんたらかんたら」というトークは、茶飲み話としてはそうとう楽しいと思う。酒の席で語るにはもってこいの話題だ。でも、それは職業としてエンジニアをやるいい大人がツバを飛ばして語るような話題ではない、と思う。

なぜそう思うか、と問われれば答えは明快で、その言語を使うコンテキストを無視して言語の優劣を語ることには意味がないと思うからだ。


非常に大雑把な括りをさせて貰えば、いわゆるスクリプト言語および動的な型付けを行う言語は、「少数の一定水準を越えたチームが最大限の効率を発揮するために設計された言語」だと思っている。

例えばPerlでシンボルテーブルを操作するようなモジュールにしても、Rubyでopen classやらを駆使して便利な使い方を可能にするライブラリにしても、その背景にあるのはその言語を使うエンジニアへの信頼だ。節度のある大人が分量を守って使用することを前提として、それらの機能をLaryやMatzは提供しているのだ。(もう一つの有名なスクリプト言語、Pythonに関する記述がないのは僕の不勉強によるところなので勘弁して下さい)

こういった機能を持つ言語は、10人以下の少数精鋭のチーム、または20人以下のある程度の水準を保ったチームにおいては非常に生産性の高い言語になり得る。では、そのチームが100人を越えたらどうなるだろうか?100人の全員が一定水準を越えていれば間違いなく素晴らしい生産性を発揮するだろう。でも現実問題として、100人の人間がいたなら、そのうち素晴らしいエンジニアは3〜4人くらいで、中堅のエンジニアは10人くらいで、後はたぶんゴミだろう。採用やらの努力で優秀なエンジニアの割合を高めることはもちろん可能だけど、それでもそのうち6割は「こいつに自由にやらせると皆が破滅してしまう」というエンジニアになるだろう。


そこで、Javaだ。懐かしきBig daddyだ。僕は常々Javaとかもう滅びてもいいんじゃないか、と思っている。JVMの上で動く言語はもう充分あるし、もうJava言語をクールだと思う人間なんてこの世に一人もいないだろうと。


ところが、Javaはクールなのです!Javaは、動的型付けを行う言語や最新の言語(何が最新なんです?)を知った人間にとってはゲロが出そうなほど機能が乏しい。クロージャもJava 7あたりで漸く喧々諤々の議論の末に導入されたらしいし、杓子定規なクラスベースの抽象化しか出来ないし、もう書くこと自体がかったるくてしょうがない。Eclipseで補完すればいいよって?補完したところで、コード自体の冗長さがなくなるわけじゃないだろう?芭蕉は、「古池や 蛙飛び込む 水の音」という名句を残した。でも、それだけじゃSyntax Error、意味が通じなかったので芭蕉はその後に「寂しくもあるか秋の夕暮れ」と仮にEclipseで補完したとしよう。でも、それは元の句だけで充分なんじゃないの?

Javaは言語仕様だけでいうと非常に貧しい言語だ。出来ることが非常に少ないし、自由度もない。でもやっぱりクールなのだ。オーマイガッ!オーマイガッ!出来ることの少ない言語が何でクールなんだ?こんなの絶対おかしいよ!僕等の求めている言語はもっと自由な言語なんだ!Javaでももっと色々したいよ!

ということなんだけども、100人のチームでプログラムを書く場合、60人は間違いなくどうしようもないエンジニアになってしまうんだ。理想の職場はそうでないけども、現実と理想は違っているんだ。ちょうど僕の隣でほむほむが寝ていないようにね。

60人のどうしようもないエンジニアがコードを書く際には、可能な限り自由度は小さい方がいい。2人のチーフエンジニアが設計して、10人の優秀なエンジニアが設計したインタフェースに則ってコードを書けばまずまずの結果を出せると思われる。もちろんいくら設計がしっかりしていても、予めインタフェースが完全に定まっていたとしても、だめなコードは量産可能だ。それでも、だめなコードの中から元のコードにおける設計やインタフェースをぶち壊すことは不可能だ。そう、Javaならね。リフレクションはJava文化の中では禁則事項なんじゃないの?それを無制限に許せばJavaがJavaである意味は無くなってしまうと思うけども。<この記事を読んで僕がJavaを馬鹿にしていると思った人は一回休んで3マス戻る>


というわけで、5人の精鋭で何かを作るための言語と、100人のエンジニアで何かを作る言語と、10000人のエンジニアで何かを作るための言語は当然違っていて然るべきなのだ。どの規模の開発においても自分の使っている言語がベストだ、と思うならあなたは宗教法人を設立すべきで、職業としてエンジニアをやることは諦めた方がいいだろう。いや、諦めなくてもいいけど振り返ってもいい気がする。

以上のような考察から、僕個人としてはScalaはいい言語だと思うけれども今のJavaを押しのけてエンタープライズ開発?のメインストリームに成ることはないと思っている。理由は簡単で、ScalaはJavaより色々なことが出来るからだ。

非常に極端な見解を述べさせてもらうならば、全ての言語は「いちユーザに無限の権限を許す言語」と「いちユーザの権限を可能な限り制限するように設計された言語」のスペクトルの間に存在する。左側の究極はマクロを持つLispで、それは元の言語仕様すら拡張可能な尖ったナイフだけども、20人の中に一人でもサイコパスが居たらチーム全員のはらわたを引きずり出すようなハメになるだろう。右側の究極は僕の狭い見識によればJavaで、自由度が少ない代わりにそこから生まれるのは全員おそ松くんで、その中からジャック・ザ・リパーが産声を上げる可能性を極力無くすことが出来る。


以上が、僕が「コンテキストを無視してプログラミング言語の優劣を語るのはほとんど意味がない」と思う理由です。コンテキストを無視して語ることが出来る部分もあるとは思いますが、僕はもうそういうペダンティックな議論をする元気がなくなってしまいました。


(以上の文章の口調はポール・グレアムのエッセイからパクったものだし、僕は現実としてJavaを使った大規模開発に関わった経験があるわけでもないので、その辺はネタとして楽しんで頂けると幸いです)


7つの言語 7つの世界

7つの言語 7つの世界