ハッカーと遅延評価勉強法

日本の(というかはてな界隈)ハッカーはほぼ「遅延評価勉強法」をしている気がします。
僕はまだまだ世界のハッカーについて詳しくもないし、日本のハッカーですら、はてな界隈で有名な人を知っているくらいです。それでも、上記のような確信を持ちました。

遅延評価勉強法とは

遅延評価勉強法とは、僕が知る限りでは、id:amachangさんのブログで作られた造語です。元はプログラム用語の「遅延評価」から来ています。
「遅延評価」という言葉を調べてみると、「ある式を、その結果が本当に必要になる時点までは評価しないでおくテクニック」とあります。そのメリットは、「条件次第で捨ててしまうような値を事前に準備することは非効率的である。このような場合遅延評価を行うと必要なときだけ値が計算されるので計算量を低減できる」とありました。
ここから遅延評価勉強法とは、「その知識が必要になった時に初めて勉強する方法」です。もっと言えば、「○○を学んだから××をやってみる」ではなく、「××をやりたいから○○を勉強する」と定義できます。

遅延評価勉強法を行っていると思われるハッカー

プログラミングを勉強するときに、本とかドキュメントを読んで一ページ目から順に勉強する人が多い。たしかに、これもいい勉強方法の一つだとは思う。でも、僕はこれが苦手だ。楽しくない。だから、僕は目的を分割して必要な部分だけ飛び飛びに学んでいる。ジグゾーパズルを作るみたいな感じ。ジグゾーパズルを作るときに左上から一個ずつ探していたら時間がかかってしょうがない。必要なところから評価(具現化)するというところは、遅延評価的なのかなとか思った

いい機会なので、私の言語学習法をこの際披露することにしましょう。私の場合、一番の特徴は、「必要を感じるまで学ばない」「本当の問題に出会った時に、それを全力で解く」「学ぶ時には『原典』に当たる」ということでしょうか。私はこれを「遅延学習」と呼んでおります。実はこのことはコンピューター言語に限った事ではないのですが、コンピューター言語の場合、このことが特に顕著です。

技術的な困難さなんて関係なくて、アイデアを表現できるかどうかだと思った。言っても無駄なんだろうけど…

これは、まずアイデアが先にあるべきで、その実現方法はあとから考えるととれるので、遅延評価なのではと感じました。


ここまでだと、「たった3人だけじゃん。たまたまだよ」と思うと思います。僕もそう思ってましたし、そもそもこの勉強法の共通点に気がついてませんでした。
しかし、昨日のNHKの番組(第82回 ウェブデザイナー・中村勇吾(2008年4月1日放送) | NHK プロフェッショナル 仕事の流儀)を見て、本日のにぽたんさんの記事を読んだ時、これは確信に変わりました。

(プログラミングやWebデザインの)学校に行ったり本読んだりとかは全くしていない。その時々で凄くいいものを作る人がいて、その真似をしていた。変化の激しい世界で1つの体系を完全に習得するのは意味がない。その時々で瞬時に反応しながらやっていく反射神経が大切。

やりたい真似したいと思ったら直にやってみるという方法ですね。これも、「○○したい」が先に来ています。

理解するのに苦労したコンピュータ関連のトピックは?

理解するのに苦労するトピックはあえて追わないようにしているので、特にありません。そういったネタはいつか理解したいと思ったときに追えば知識欲が伴うのですぐ理解できるのではないかと感じています。そう思わないうちに苦労して理解しようとするのは時間がもったいない気がします。

これも、「必要になるまでは学ばない」ということに当てはまります。さらにここ。

プログラマーの能力は生まれ持ったセンスによる部分が大きいと思いますか?

まったく逆で後天的なものの方が大きいと思ってます。ただ、効率的な学習の仕方などはきっと存在するでしょうが、それをみつけられないうちはプログラマーとしてあまりパッとしないのではないかと思うこともあります。

ここで、にぽたんさんは効率的な学習の仕方が大切とおっしゃっていますし、前半で「そう思わないうちに苦労して理解しようとするのは時間がもったいない気がします」ということも、「必要ないのに学ぶのは効率的ではない」と、正に遅延評価と言えると思います。

具体的遅延評価勉強法

ここからは憶測ですが、遅延評価勉強法を具体的にやるとすれば、それは、「Webのソースを読む」、「Webからコードを持ってきてごにょごにょいじってみる」ということになるのかなと思います。
ハッカーに「良いプログラマーになるためにやることは?」と聞くと、「ソースを読む」ということが必ずといって良いほどでてきます。逆に、「ソース読んでいない人はだめだ」という表現もよく言われていると思います。
この「ソースを読む」とは、そもそも「これどうやって動いているんだ?」と思って初めて実行するものだと思うのです。つまり、遅延評価勉強法です。

何故遅延評価勉強法がいいのか

これも僕の憶測ですので、間違いが多々あるかもしれません。
僕が思う、遅延評価勉強法のメリットは、「投資対効果が極めて高い」ことだと思います。
「遅延評価」に対する言葉として「先行評価」がありますが、「遅延評価勉強法」に対し「先行評価勉強法」があるとすれば、それは、「本を最初から全部読む」とか「言語をやるからにはまず文法だ」とか、従来の日本式の学校での勉強に近いものだと思います。
先行評価勉強法には、「○○をやりたい」に当たる目標がまったくありません。それなのに勉強するということは、「何のために勉強するのか」も分かりませんし、なにより面白くないと思います。そんなことをして覚えたものが役に立つはずもなく、すぐ忘れてしまいます。時間をかけたのに自分のスキルがあがらないので、まったくの時間の無駄です。
一方、遅延評価型勉強法は、先に「○○をやりたい」というものがあり、しかも、それは「今」必要なものなので、にぽたんさんの言葉を借りれば知識欲が伴います。しかも、学んだことがすぐ何らかの形でアウトプットされます。「今」必要にせまられているため、得た知識からソースを書いたりするのは当然ですから。
実際に手を動かしアウトプットすることで、体験を通じて学ぶことができます。ただ書いてあることを読んだだけと、自分で試行錯誤を繰り返し手を動かして学んだ知識のどちらが習得効果が高いかは推して知るべしです。先行評価勉強法には体験すらないのです。
この遅延評価勉強法が良いのではと説明されている記事もありました。

わたしが過去にどのようなソースコードの読み方をしてきたのかを振り返ってみると、プログラミング能力の向上を目指したコードの読み方のヒントがあるかもしれません。
まず1つは、「全体を読もうとしない」ことです。ソースコードには「物語」はないので、全体を通して読む必要はありません。面白そうなところをつまみ食いして、先人の知恵を学べばそれで十分です。
もう1つは、「目的を持って読む」ことです。何かを学ぼうと思ってソースコードを読めば、効果的に読解して知識を得ることができます。


まぁ、考えて見れば「lazy」なハッカーは意味のないことに時間を使うわけもなく、最小の労力で最大の成果をだそうとするので、効率を重視するのは当然でしょう。その結果、皆、遅延評価勉強法に似たような学び方をするのではないかと思いました。
あ、本を読むなという話ではないですよ(汗)ハッカーは本も読むと思います。読み方が違うだけだと思います。

追記

あと、重要だなと思ったのは、「どういう仕組みで動いているんだろう」とか思ったら、勉強しようと思ったら、それを理解するまで試行錯誤をやめないことです。
「うーん。分からないからやめよう」としていると、遅延評価勉強法では何も身につかないと思います。コードとかひっぱってきて何か作ったとき、「できたー!」で終わらせず、「さて、動いたけど、どんな仕組み動いているかなー」ってところを理解するのがポイントかと思います。
「使っているものの仕組みを知れ!仕組みの分からないものを使うのは怖いと思え!」って感じでしょうか。