プログラミングの学習に写経ってあんま意味ないんじゃないかなぁ

写経で身につけるプログラミングの基本 | Social Change! って記事が話題になってて
自分はあまり意味が無い、と常々思っていた。以下その理由。

写経が効果的なのは一行で実行できるものだけ

プログラミングで、最初に覚えるべき概念は、四則演算、条件分岐、繰り返し、配列、オブジェクト指向、あとはちょっとした命名規則あたりだろうか。これらの概念を覚えるのに、本に載ってるコードをタイプするという行為ははっきり言って視野が狭い作業である。ものを書き込むという作業は、その前後にしか想像力の触手が絡まない。

学び始めの初心者に、メモ帳でJavaのコードを写経させるのは拷問に近いことだ。いや、自分がそうだったのだけど…。はいはい public static void main(String args[])

プログラミングの学習で大事なのは、読んで理解すること。一行ずつ字句的に解釈して、そして自分の欲しい結果との差分を抽出し、そのように操作する方法を理解すること。その意味では原文の、自分で書いたのものを少しずつ変えていく、というところには同意。ただ入り口が写経かコピペかは問題にならない。


対話型インタプリタで一行ずつ実行して、エラーが起きるパターン、起きないパターンを学ぶのが学習サイクルを回す最短コースだろう。 (だから初心者は補完付きインタプリタがある言語で入門したほうがいい pythonのipython , rubyirb, nodeのnode )


写経するぐらいならエディタを鍛えたほうがよい。初心者の起こすシンタックスエラーのほとんどは、インデント補助とハイライトで気づける。未定義変数、シンタックスエラーで質問しに来ないでほしい。
Emacs/Vimなら auto-complete, neocomplecache などで長ったらしい変数名補完し、スニペット呼び出しで簡単なブロックを作成してしまえばいい。


手が覚えるもの

手で覚える、という考え方があるのには同意する。僕は大学受験では日本史が一番得意で、その勉強方法はもっぱら教科書を読んで自分でノートを作りまとめ直すことだった。 (日本史だけ偏差値が75ぐらいあった)
とはいっても、日本史では記述のために漢字を覚えなければならなかったり、また中世の人名には家系に連なるシンボリックな意味があったりした。そのため書くことメリットが大きかったのだが、プログラミングについては、これらのほとんどは適用されない。日本史と違って一度書いたコードは最利用されるので、覚えている必要はない。

良い言語は覚えるべきことを最小限にしてくれる。それらを覚えて初めて、再帰関数やデータ構造などの、計算機科学的なものに入門できる。
基礎的な概念が身に付いているなら、パラダイムが似た言語は 〜基礎文法最速マスターの内容をインタプリタで実行して覚えれば、だいたいの言語の違いなんかは吸収できる。

一度に複数のことを考えない

効率がいいプログラミングのためには、いかに短期記憶の認知負荷を減らして本質的な作業に従事するかが大事だと思う。
ぼくは最初「集合知プログラミング」でPythonを勉強していたのだが、Pythonの文法になれるまでは集合知的なアルゴリズムのなにひとつも理解できず、そこまで思考が行き着かなかった。(いまもさして覚えていない。Pythonは覚えたが)

集合知プログラミング

集合知プログラミング

モノによるけど、ロジックを実装する以外のコーディングでは、ぐぐってサンプル見つけて自分のコードに織り込む作業がほとんどを占める。ロジックに絡まない部分は出来る限り考えないことでエラーが減らせる。自分のアプリの為のロジックと手続きを切り離すためにオブジェクト指向が使える。

LLでライブラリマネージャを使ってゴリゴリやるときは、特にその傾向が顕著だと思う。公開ライブラリのサンプルを写経していては生産性もクソもない。

ライブラリの挙動確認、単体テスト程度ならインタプリタでやる。ここらへんは写経的に覚えるところだが、テストに通ったコードはインタプリタの履歴ごとコピペして、自分用のスニペット化して保存する。そしたら同じコードを二度書くことはない。

ここらへん踏まえると、紙のプログラミングの本はとても効率が悪いな、と思ってしまうわけで。オライリー電子書籍で買うに限る。あ、Web+DB総集編買いました。