10月
16
2008

プログラミングと高速道路仮説

ここ数日プログラミングをやっています。

少し前はC#で、今はC++で。

高級言語のRuby on Rails, Rubyをやっていたのだが、だんだんと低級言語に近づいていく。

この次は、アセンブリ言語かマシン語の予感。

高級言語や低級言語という言い方は、あくまでもコンピューターのハードに近いのが低級で人間の言語に近いのが高級という意味です。

とはいえ、プログラマーが1日に書くことのできるプログラム行数は言語に関わらず同じぐらいという仮説があります。Rubyで10行のプログラムで表現できることは、C#(Java)にすると30行ぐらい。C++にすると100行ぐらいかもしれないので、C++に比べるとRubyの方が生産性が10倍くらいいいかもしれません。

ここ数カ月くらい、Rubyを離れC#やC++を始めたのですが、以前と比べてプログラミングが楽になった気がします。
とはいえ、C#で数百行書いた程度で、C++に至ってはATL/WTLというライブラリを理解しながらサンプルプログラムを少しいじっているにすぎませんので、どこにどんな落とし穴があるかわかりません。

C#は御存じのとおり、マイクロソフトが用意してくれた.NET FrameworkというライブラリがありWindowsのアプリケーションを作るのは結構簡単だと感じました。

C++も昔はMFC、今はATL/WTLを使うのが主流だそうですが、こちらもライブラリが充実しています。Windowsでアプリケーションを作る作法さえ学べば、アプリケーションはC#よりも時間はかかりますが、いけそうに思います。

大昔の23年前にMacのアプリケーションをLightSpeed Pascalというので作ってみようと思い、MacintoshのQuickDrawなどを自習した時に比べると本が充実しているし、インターネットにはサンプルやチュートリアルがたくさんあるので楽そうです。

さてプログラミングをする上で何が重要か考えました。
RubyでもC#でもC++でもその選択の違いはあまりないように思いました。

どれもライブラリが充実しているからです。
ただライブラリに不足していることをしようと思うと大変です。

私が得意とするスクレイピングをやろうとすると、実はどの言語を選んでも自分でライブラリを作らなくてはいけないのです。

しかし、Rubyならば既存のライブラリを拡張するだけですみます。

C#の場合もWebアクセスするライブラリがありますが、複雑なことをしようと思うと不足していてかなりの部分を機能追加しなくてはいけません。
(Javaの場合は、Apacheプロジェクトにいいものがありますからもう少し楽なようです)

C++の場合はたぶん諦めます。まず自分でライブラリのすべてを自作しないといけません。たぶん1年ぐらいかかってしまうかもしれません。ライブラリを作るのが目的ではないので、他の言語に移った方がいいでしょう。C++のプログラムにRubyやPerl, Pythonなどを乗せてしまうことを考えるかもしれません。

そう考えると、言語の仕様以上にライブラリが重要だと思います。
そのライブラリは言語の性格や志向に合わせて、いろいろな人が作ったものだと思いますから、結局は言語とつながっているのかもしれませんけれど。

Perl, PHP, Python, Rubyというスクリプト言語は、ネットワーク志向なのでスクレイピングはやりやすいともいえます。C++, C#は、はなからそんなことをする傾向のない人たちが作ったともいえるかもしれません。結局言語が普及しても、マイノリティに必要な機能は追加されないかもしれません。

話はそれましたが、目的に合わせてライブラリを選ぶことが第一で、言語は第二といえるかもしれないと思った次第です。

このところ、C#ときてC++と触ってきたので、言語に対しての抵抗感がなくなりました。もうJavaもFORTHもPrologもAPLも何でも来い!
(↑一応、ちょっとかじったことのある変わった言語ばかりです。まつもとゆきひろさんの原稿と被ってしまいオリジナリティがないのだが、APLはData General社のラップトップ機のキーボードがAPLで書かれたものがあったり、FORTHは古い言語のうちの一つでもともと望遠鏡を動かすために作られたもので、最小の環境で最速で動くと言われていました。ただ使い勝手が悪かった。)

まあそんな幻想を抱いてしまうのも、それぞれの言語のもつライブラリとIDEの便利な機能がアプリケーションを作るという過程にそぉっと近づかせているせいかもしれない。

これが以前羽生名人と梅田さんの言っていた、「高速道路仮説」かもしれない。
高速道路に乗って、すぅっと目的地の近くまでは誰でもいけるような状態になっている。問題はそれから先。それから先は普通道路を走らなくてはいけないし、舗装されていない道もある。78%までは誰でも簡単に行けるという話。

この78%ですませるのが、一般的な受託開発の話。
まあ、プログラミングというよりコーディングだよね。

プログラミングとしては、落とし穴があったり、道路を自分で作らなくてはいけない場合もある。谷底で道を引けない場合もある。

そこでほとんどの人が諦めてしまうのだが、がんばってそこに橋をかけたり道をつくるのが、ライブラリを作ったりする偉い人。
(当初は下記のエルドラドを目指す人だったんだけれど、きちんと橋を架けるから立派だよね)

ここまでは目標があるからいいけれど、目標もなくどこにいくかわかないけれど、あっちの方にエルドラドがあるかもしれないから、行ってみようか!

というのが言語を作ったり、未踏をやる人。
ほとんどが途中で生き倒れなんだけれど、その屍をの上を乗り越えていってほしいと願っている人(生き倒れは俺だけだったりして)。

どれがいいとか悪いとかでなくて、それぞれ向き不向きがあると思う。

私もプログラミングが苦手なんだけれど、一番生き倒れが向いているかもしれな。今回、いろいろなプログラム言語を習ったので、生き倒れする幅が持てた。

それでやっと、ルールエンジン絡みのコーディングをJavaでもいけるかなという気になりました(また別の言語でいきます)。

Rubyの仕事がないので、、、、、
まあ、言語はなんでもいいかぁ。

えらい人は、どんな言語の要望が来ても、勝手に自分でDSL(ドメイン特定言語)を作ってしまうから。僕もえらい人になりたい!

コメントはまだありません »


コメント&トラックバック




トラックバック URL

コメントのRSS feed