プログラミング言語の選択

プログラミング言語の選択は、ソフトウェアの価値を決定する大きな要素の一つだと思っている。言語はソフトウェアが依存する規格の中で最も大きい物だからだ。規格の重要性については、

で書いた。ソフトウェアは、同じ言語で書かれたソフトウェア同士で互いに依存しあう関係――エコシステムを作る。勝ち組のエコシステムに入っていたら、ソフトウェアの価値も向上する。

プログラミング言語の選択は規格の観点からのみ行われるわけではない。生産性も重要な観点だ。言語によって生産性は大きく変わる。Cを触った後に、Javaでコーディングしたら、すごく楽に感じる。ついに私もプログラミングの才能が開花したのかと勘違いしてしまうほどスムーズに作業が進んでいく。道具に操られている状態ではあるが、同じ手間でアウトプットが多く出ることは良いことだ。

しかし、言語の選択で厄介なのは、言語自体が持っている利点以上に人間の慣れの方が生産性に影響を与えることだ。言語は思考に枠組みを与えて整流化する道具だから、一つの言語に慣れてしまうとその言語の思考法に頭が固定されてしまう。慣れない言語を用いるとその言語を使うときに自然な思考をするのは難しい。その結果、生産性が落ちるのは避けられない。

また、出来上がったものも一見新しい言語で書かれているが、中身は慣れた言語であるということがよくある:FORTRANっぽく書かれたC++とか、Cっぽく書かれたJavaとか。書いた時の苦労は垣間見れるが、読むのはきつい。多分こういうのは書き直すべきなのだろう。*1

この点でC++は最低の言語だと思っている。手続きでもオブジェクト指向でもどうとでも書けてしまう。クラスを使わずに構造体に関数ポインタを突っ込んだようななんちゃってオブジェクト指向もできてしまう。C++からオブジェクト指向を除いた言語か、C++からCを除いた言語なら使えるかもしれない。規約を作ればいいのだが、言語仕様も巨大なのに規約も巨大になってしまうと少なくとも私は持て余してしまう。

プログラミング言語はワラワラと新しいのが出てくるが、新しい言語の導入は結構大きい話だ。

保守的にならざるを得ない。余計に難しくないか?というものをシェルスクリプトで作るのも姑息的な経営判断としてはありだと思う。私がやらされるはめになったら、

#!/bin/sh
python - << END
# Python code
...
END

というような実は中身はPythonという手抜きをこっそりしてしまいたくなるが……やりません。なぜならこんなコードは前述のC風のJavaと変わらず、他の人が保守できなくなるからです。手抜きコードの保守までしたくはない。

また、既存のコードはやっぱり資産です。それが古臭いものでもだ。技術的負債という言葉はあまり好きではない。いかにも作業者からだけの視点だからだ。中身全く知らないのに資産だから書き換えるなと言っている人がいたらこれも一方的な視点とは思いますが。

で、既存のコードは資産なので流用ができるなら流用したらいい。その場合は同じ言語を使うのが正しいでしょう。もちろん、価値のないコードは捨てていけばいいと思っています。絶対通らないルートとかです;いつか使うかもしれないコードが使われることはない。

私は新しい言語の導入には慎重な立場で、流行っているからと新しい言語に飛びつくことをあまりしたいと思わない。そうすると新しい言語の導入が目的になりがちだ。作って動いただけでは価値を見いだせない;それ何が面白いの?と思います。

Web系の会社などで先進的な事例として、Scala使いましたとか、Go言語使いましたとか見ると、そりゃあ羨ましい気持ちにはなります。実験的な試みは悪いことではないです。しかし、エコシステムの成熟度の問題とか慣れの問題とか既存資産の活用の問題とかを考慮しても、それを上回るエンジニアリング的なメリットがあったのか、あるいはそのソフトウェアを使う側のメリットに繋がったのがが読み取れないと、これは失敗事例なのかなと思います。もちろん、その言語なりサービスがその後盛り上がったら「ぐぬぬ」と黙る。

私は言語の選択で冒険するより、何を作るかで冒険した方が有益だと思っている。面白いもの作りたいなあ。

Guide to ScalaーScalaプログラミング入門

Guide to ScalaーScalaプログラミング入門

*1:それができたら苦労はないが――