習うきっかけは、これでいいと思う。
プログラミング言語を身につける唯一の方法 - ぼくはまちちゃん!(Hatena)たぶんこれかな…なにか作りたいものがある
またはなにかを作る必要がある
なんて状況以外で、マトモにプログラミング言語を習得してる人って ぼくほとんど見たことないんだけど、みなさんはどうでしょう…!
けど、これでは「身に付かない」と弾言しちゃう。
なんでそう言い切るか、というと、「作りたい」ものがあって、それを実際にその言語で「作った」のにも関わらず、全然身に付いていない言語が私にはあるから。
たとえば、shell script。
これとの付き合いは、perlよりも古い。にも関わらず、私は未だに shell script を「書き下ろす」ことはない。適当にrc.d
からコピーしてから必要なところを書き直す。case
を閉じるのがesac
であることは、書いた端から忘れてしまう。
このように「書いた端」から忘れる言語は、BASICからtclまで枚挙にいとまがない。その一方で、C/C++やPerlやJavaScriptのように、人様に書き方を教えるレベルになって、しかし今でも「そんな書き方があったのか」という言語や、RubyやPythonのように文句をいいつつも「こんなところいいよね、あんなところいいよね」という目が離せない言語もあれば、schemeやcommon lispのように「やっぱすごいはこの言語」と感じつつも、なぜか仕事をそれで片付ける気にならない言語もある。luaやhaskellのように、自分でも気がつかないうちにずいぶんと使うようになった言語も。
なにが、そのような違いになったのだろうか。
その言語で遊んでいてどれだけ楽しいか、なのではないだろうか。
作れなければ、覚える気にはならない。
しかし遊ばなければ、覚えられない。
Webを見回せば、その傾向はいっそう顕著だ。「これすご」と思うコードは、たいてい「遊び人」たちが書いている。はまちちゃんにしてからがその一例だし、私もそれに入るだろう。サイボウズ・ラボの中の人々に至っては「いつ仕事しているのか」を通り越して、「遊ぶのが仕事」にしか見えない(よね?:)。
その観点から言うと、言語というのは「簡単」であればいいというものでもないようだ。BASICは簡単で、それでいて結構立派なものが作れる立派な言語だが、なぜかそれで遊ぶという気にはなれなかった。Shell Scriptに至っては「え?それって遊べるの」という気にさえなる。
ところが、Perl Programmersと来たら、遊ばざるものプログラマーにあらずという感じで、詩は書くわゴルフはするわで、付き合っていたら自分まで遊び人になっていた。
その一方で shell script としての使われ方も健在で、Perlを必要とする言語も少なくない。戯れにどれくらいあるのかをFreeBSDのPortsで調べてみたら、こうなった。
% fgrep /usr/ports/lang /usr/ports/INDEX-7 |\ fgrep perl-5.8.9 | awk -F'|' '{print $1}' | \ egrep -v ^p5 asn1c-0.9.21 bigloo-3.2b.2 cim-3.37_1 clojure-mode.el-20081222 csharp-mode.el-0.7.0 dylan-2.4.0_1 ecl-0.9l_1 emacs-lisp-intro-2.04 eperl-2.2.14_3 erlang-r13b01_5,1 erlang-lite-r13b01_5,1 etoile-languagekit-0.4.1_1 expect-5.44.1.11_1 fpc-units-2.2.4 fsharp-1.9.6.16 gambas-1.0.19_3 gambas2-2.13.0 gambas2-base-2.13.0 gambas2-components-2.13.0 gcc-3.4.6_3,1 gcc-4.2.5.20090325 gcc-withgcjawt-4.2.5.20090325 gcc-4.3.4.20090705 gcc-4.4.1.20090721 gcc-4.5.0.20090716 gdc-0.24_6 ghc-6.8.3_5 gnat-2009_1 gnat-gcc-4.1.2_4 gnat-gcc-4.2.2_2 gnat-gcc-4.3.2_2 gnat-glade-2005_1 gnustep-base-1.18.0 gpc-20060325_1 gprolog-1.3.0 guile-1.8.6_1 icc-8.1.038_1 icc7-7.1.042_1 ifc-8.1.034 ifc7-7.1.040_1 ironpython-1.0.1_2 klogoturtle-0.6_6 kroc-1.5.r5858 lafontaine-0.4.1_3 llvm-gcc4-2.5 ucblogo-5.5_4 maude-2.3_1 mdk-1.2.1_7 mlton-20070826_3 mono-2.4.2.2_1 mono-basic-2.4.2 moscow_ml-2.01_3 mozart-1.3.1.20040616_5 nbc-1.0.1.b32_1 neko-1.8.0 caml-mode-3.01_2 ocs-2.3k_1 osb-jscore-0.5.2_2 otcl-1.13_3 parrot-1.4.0 pecl-perl-1.0.0 perl-5.8.9_3 pfe-0.33.70 php4-4.4.9 php4-overload-4.4.9 php5-5.2.10 pike76-7.6.112_4 pike78-7.8.316_1 pugs-6.28.0 q-7.11_1 ruby18-perl-0.2.9 ruby-1.8.7.160_4,1 scriba-20b0_2 sdcc-2.9.0 sdcc-2.9.1.2009.05.18 see-2.0.1131_1 see-devel-3.0.1376_2 tcc-0.9.25 tuareg-mode-1.45.6_1,1 twelf-1.5R1 vala-0.6.1 whitespace-0.3_2
PHPやghcはおろか、rubyやgccまで入っていたのには私でもびっくりした(pythonが入っていないのにはさすが:)。が、これらのインストーラーの作者にとっての perl は、私にとっての shell script のようなものではないだろうか。
開発コアメンバが語るRubyの今とこれから(前編) − @ITyugui Perlも使いこなせばスゴイんですけどね。私が今Perlを知っているぐらいに当時からPerlを使いこなしていたら、Rubyを使おうと思わなかったかもしれませんね。ただ、Perlってプロフェッショナルレベルとラクガキレベルで、ものすごく落差があるので、下のレベルでぐちゃぐちゃやってると訳が分からなくなるんです。
ものすごく落差がある、けど、落書きでも動くというのは言語の生き残りにとってかなり重要なのではないだろうか。もし Perl 5 が Perl 4 との互換性をばっさり切っていたら、Perl 5はずっと「あばたの少ない」言語になっていたのは確かだろう。しかしこれだけの言語を影で支えるのもまた無理だったのではないか。
しかし、Perlに影で依存するこれらの言語のユーザーは、だからといってPerlを覚えないだろうし、また覚える必要もない。これらの人々にとって、Perlは「知らないところで仕事をきちんと片付けてくれさえすればいい」のだから。
portupgrade
がrubyで書かれているかを知らなくても portupgrade は使いこなせるし、、trac
がpythonで書かれていることを知らなくても trac は使いこなせる。そして MediaWiki が PHP で書かれていることを知らなくてもMediaWikiは使いこなせる。どころかそもそもMediaWikiという名前を知らなくてもWikipediaは誰にでも使える。
しかしこれらのソフトウェアを書けるレベルまで言語を覚えたいとなると、「作りたい」だけでは息切れしてしまうのではないか。
断言しきってしまおう。作(りたい|る必要がある)だけでは、作った端から忘れると。そして35歳を待たずして限界が来ると。
あっという間に過ぎた545日のプログラミング暦を振り返り、負け戦を恥じる。 - どんなジレンマ出来たことは少なく、出来ないことは多い。理解したいのなら・先に進みたいのならすべきことは山のようにある。スクリプトを動かして簡単なプログラムを作るという関門は越えたのですが、次の関門で苦戦しています。じつは、次の関門が「何か」もまだ手探りなのです。そりゃ、越えられるわけないですよね。作り、継続している人達の凄さに憧れを抱き、私も「プログラミングができるようになる臨界」を超えたいです。
よって、私の答えは「今度は遊ぼう」、だ。「仕事になって」なくていい。「役立たず」でも構わない。一つでもそれで「やりたいことをやるのではなく、この言語で何か書くことそのものが今やりたいこと」に思わずなってしまう言語が見つかれば、もうプログラミングは一生ものなのではないか。
Dan the Player
これを好む者はこれを楽しむ者に如かず。
孔子の時代から、人間というのは変わっていないということでしょうか。