習うきっかけは、これでいいと思う。

プログラミング言語を身につける唯一の方法 - ぼくはまちちゃん!(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の今とこれから(前編) − @IT
yugui 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