2008年02月09日 00:05 [Edit]

私の言語遅延学習法 - 三つのルール+1

つっこみが遅くなりました。

新しくプログラミング言語を覚えたいときに行うべき10の練習問題 | IDEA*IDEA
404の人とかが突っ込んでくれそうな気がするので気軽にいってみます。

いい機会なので、私の言語学習法をこの際披露することにしましょう。


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

必要を感じるまで学ばない

私の場合、長らく「プログラマー」としてより「ネットワークエンジニア」としての仕事が長かったため、ある言語を学ぶきっかけは、「システム直して」というものが多かったのです。そこでは実にさまざまな言語で環境が構築してあって、それを解析するのにその言語の知識が必要となりました。

そうなってから学ぶと、なにしろ「いつまでに直せ」という締め切りがありますから、いやでも学びます。スカウターの数値が跳ね上がるのです。

本当の問題に出会った時に、それを全力で解く

言語を学ぶ際の状況が上のような理由なので、問題は今そこに実際にあるわけです。そしてこれが重要なのですが、その問題はかつて「解かれて」いるのです。それを「解き直す」のが私の仕事なのですが、このかつて「解かれている」というのが非常に重要なのです。

なぜかというと、ある言語にとってその問題が解けるか否かというのは、決してトリビアルな設問ではないのです。例えば「ローカルファイルを読んで書く」という、多くの言語にとって単純な仕事でも、JavaScript (のブラウザーにおける実装)ではそのことそのものがわざと「できない」ようになっていたりします。それよりもさらにトリビアルそうな文字列操作さえ、APLでは「問題のスコープを超えていた」りします。

そういう事由があるので、全ての言語向けの「練習問題」を作るというのはなかなか難しいのです。

しかし実地の問題であれば、前任者はどんな理由であれ、その言語でその問題を解こうとしたことはわかります。その言語で解けるという公算があったから、その言語を使用したのです。これは実に大きなヒントなのです。

学ぶ時には「原典」に当たる

たとえば、PerlであればCGI本とかではなく、ラクダ本に当たる、というのがこれの意味するところです。もちろんCならK&R。なぜ原典でなければならないか。

それは、原典には、その言語の設計者の意図が書かれているからです。それで、その言語は何が得意で何が不得意なのかもわかる。結果的に易しく「こうやれば出来る」が書いた本よりも、「こういう人向けに作りました」がわかる原典の方が優しいのです。

ただし、以上がきちんと機能するためには、一つ重要な前提条件があります。

基礎をしっかり抑えておく

あるコンピューター言語を学ぶ、というのは、ある意味この応用編に過ぎないという見方も出来ます。私が scheme → C/Assembly Language という、Computer Science の古典的カリキュラムを支持する理由がそれなのです。世界は Church と Turing の間にある。この両極端を最初にしっかり学んでおけば、たいていのコンピューター言語はこの間のどこかに収まっているのですから怖くないのです。

その意味で、最近のちょっとした悩みは、Assemblerを教える方法。かつてはAssemblerを学ぶというのは、CPUを学ぶと同義でしたが、最近は Intel IA-32 にしろ PowerPC にしろ、CPUとAssemblyの距離感がずいぶんと増しています。MIPSは素直だったな(遠い目)。

それではVMを作るのがいいかというと、VMもまたCPUから「遠い」。最近のCPUはほとんどRegister Machineなのに、VMはほとんどStack Machine。しかし、CPUを学ばないとTuringの世界をきっちり学んだことにはならない。かといってCASLってどうよとも思いますし。

Perl/Python/Ruby/PHPのような「現場言語」から入ると、どうしても「その言語が得意とする領域」ばかりを猟色し、その結果「栄養が偏る」ことになりがちです。急がば回れともいいます。本気でコンピューターと付き合うのであれば、基礎も固めておきましょう。

Dan the Polyglot


この記事へのトラックバックURL

この記事へのトラックバック
人生は練習と思ってる所が本番で、本番と思ってる所はオマケだ。http://d.hatena.ne.jp/teruyastar/20131207/1386476138年末の記事に反響があったのですが、「ずっと本番って、その努力ほんとに報われるのか?」という意見をもらいました。あと関連で、「基礎が大事」という
もらえる経験値を最大化する「正しい努力」のまとめ【teruyastarはかく語りき】at 2014年01月12日 02:23
404 Blog Not Found:私の言語遅延学習法 - 三つのルール
404 Blog Not Found:私の言語遅延学習法 - 三つのルール【】at 2012年01月19日 04:13
熱もやっと引いてきたので。 中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント - 分裂勘違い君劇場 ちょっと囓っただけの素人が自分を過信して陥る三つの罠? - カレーなる辛口Javaな転職日記
そろそろ3つのポイントについて「弾言」しとくか【404 Blog Not Found】at 2008年10月27日 18:45
私自身、遅延学習法の実践者なのだけど、それだけにその欠点もよくわかる。 勉強が苦手な人向けの「遅延評価勉強法」 : ロケスタ社長日記たとえばプログラムを勉強するときに、「書籍を1ページ目からやる」のではなく「2ch型掲示板が作りたいから必要なところを勉強する」の...
遅延学習法の限界【404 Blog Not Found】at 2008年05月08日 08:15
1 404 Blog Not Found:The Pursuit of Happiness 左記より引用 しかしこの本の本当の魅力は、最初の20ページに満たない「序文」にある。”Perl”が単なる電脳言語の枠を超えて、ポストモダニズムのシンボルになった理由が、すべてそこに凝縮されている。実はAmazon本家では...
死ぬまでに、原典にできれば原著であたりたい一冊はなんですか?【どんなジレンマ】at 2008年03月15日 09:12
 小飼弾さんのエントリーより。「遅延学習」とはまたすばらしいネーミングで! 私の場合、一番の特徴は、「必要を感じるまで学ばない」「本当の問題に出会った時に、それを全力で解く」「学ぶ時には『原典』に当たる」ということでしょうか。私はこれを「遅延学習」と呼ん
[つぶやき]遅延学習【KASOKEN satellite】at 2008年02月10日 19:58
この記事へのコメント
assemblerを勉強するならH8やろうぜH8
Posted by WireWire at 2008年02月10日 04:02
ただ、asmを必要になることって、どうしようもないバグをデバッガでCPUの挙動を追うとか、コンパイラのバグ見つけるとか、うーん。最近はあまりないような
Posted by cool at 2008年02月10日 03:58
言いたいことはわかるのですが、
必要を感じるまで学ばない=その言語に関する経験はゼロという人を、
クリティカルな現場に入れるというのは問題だと思うのです。
Posted by a at 2008年02月09日 19:56
 Assembler なら、8086 でしょう。IA-32のCPUさえ積んでりゃ、今、目の前のマシンで実際にregisterもmemoryも動かせますぜ。マイコンはわざわざ買ってこないといけないし、誰かさんが考えた嘘マシンをエミュレータで動かしても虚しいだけ(Knuth先生ごめんなさい).
 FreeなDOSでリアルモードでbootしてnasmなんかを使えば実機で 8086 Assembly Language Programming が楽しめちゃいますよ!  
Posted by 寿命 at 2008年02月09日 19:21
「遅延学習法」は電気工学や物理、化学、数学などにも効果があります。
Posted by taka.BRK at 2008年02月09日 14:39
ツッコミ遅いな〜
Posted by 浜田 at 2008年02月09日 13:27
現場では誰も情報が専門の人間をほしがらない。
文系で若くて体力あって素直で文句言わない人が良い。
仕事なんてできたってできなくたって、時間請負だから関係ない。
Posted by 問題として at 2008年02月09日 13:16
距離感はともかく、アセンブリ言語で実用性のあるプログラムを書くということは、「アセンブリ言語を覚える=CPUの仕様を理解する」というのは変わらないですよ。基礎学習でCASLを使ったとしても、CASLで飯は食えませんしねぇ
Posted by しげ at 2008年02月09日 12:48
うちの大学でも、実験で テンキー付き?のZ80搭載のワンボードマイコンみたいなのでアセンブラやってましたよ。
期間はほんの少しでしたが、楽しかったものです。
今でもやってるはずです。

実践度?から言えば、既存アプリの逆asmでのハックなんかで得た知識が、普段開発する際にも役立ってます。
こういう改造はプログラマーでなくても面白いですしね。

ただ、asmを必要になることって、どうしようもないバグをデバッガでCPUの挙動を追うとか、コンパイラのバグ見つけるとか、うーん。最近はあまりないような。
別として、基礎だからやっとけって話ですよね……。
Posted by もみもみさん at 2008年02月09日 10:14
TK80...なにもかもみな懐かしい
Posted by Sio at 2008年02月09日 09:14
> 全ての言語向けの「練習問題」を作るというのはなかなか難しい

その点で「どう書く?org」はなかなかいいなと思います。

とりあえず 1ヶ月間わざと不便な言語で解いてみて

> ある言語にとってその問題が解けるか否かというのは、決してト
> リビアルな設問(些細な問題)ではない

ということが実感できました。

眼前の問題に対して、自分の持てる言語の中から最適なものを選ぶ
ということもまた大切なのですね。
Posted by silverwire at 2008年02月09日 05:29
Z80のプログラムを組む演習はしました。ただ、CPUは全加算回路の設計図で止まりました・・・
Posted by とおりすがりのがくせい at 2008年02月09日 03:56
私も大学時代はコンピュータサイエンスを専攻していましたが、Z80 のワンボードマイコンを作る、というのと、簡単な CPU を作る、というのが演習カリキュラムにありました。15年くらい前ですが、今でも同じような演習が残っているのか……
Posted by ichiohta at 2008年02月09日 02:55
私の大学では、IA32の代わりにY86というのをやっています。
Posted by rin at 2008年02月09日 02:14
背後にあるのが生のメモリ+CPUなのかバーチャルマシンなのかをわきまえずに
「CもJavaも書いたことがあります。だからC++もちょっとは書けます」
とか言うエンジニアはエンジニアとして信用しないです。

現場では「ほぅ!それはたのもしい」とか言ってしまうんだけどorz
Posted by tori at 2008年02月09日 01:55