Edited at

写経でプログラミングが上達するか

More than 5 years have passed since last update.

ここで言う写経というのは、プログラミング言語を習得するときに、サンプルコードやチュートリアルを自分の手で打ち込む行為を指します。

写経、やっている人結構多いと思います。

私もやります。

プログラミング言語は「黙って写経」──カーネルハッカー・小崎資広(4)

これまでにも、例えばブログ界隈なんかで「写経いいよ」という話が出て、Twitter なんかで「じゃあ俺も写経やってみよう」なんて盛り上がる、という流れは何度となくあったと思います。

(以下、上記記事からの引用、敬称略)


(小崎)黙って写経は意外とね、勉強の方法としてはかなり上位でいい感じ。

(西尾)指先しか動いてないですけど。

(小崎)でも意味あるんだよ、それでも。

(西尾)確かに、ただ読んでると眠くなってしまったり、自分は読んでるつもりでページをめくっているけれども実は頭には入らずに全部素通りしていたりしますよね。指を動かして打っているとそういうことにならない。そういう意味では写経ってすごく意味があるんですね。

(小崎)意味があるんです。


確かになるほどな、と思わされます。

カーネルハッカーがそう言うのであればなおさらです。


ただ写経すればいいか

だけど、実際やってみると、「そうでもないかな」と思うことがあります。

無意識的に書籍の見開き 1 ページ分ぐらい打ち込み終えてしまった後とか。

プログラミングに限らず、スポーツでも楽器でもなんでもそうですが、同じ訓練を積んでも上達する人・しない人はいます。

生まれ持ったセンスや才能によるところもあるでしょう。

本当にトップクラスに行けるかどうかであれば、才能はかなり重要かもしれません。

ですがここでは、平均的な人から「この人はちょっとすごいな」と思われるかどうか、ぐらいのレベルを問題にしましょう。

そのぐらいのレベルで考えると、問題になるのは 「練習をしながら何を考えているか」 ではないでしょうか。


考えながらやらなくては意味がない

先にも書いた通り、写経は意外と無意識的にできます。

私は英語の勉強として、英文を書き写すことがありますが、あれも同じ。

スポーツや楽器でいうと、基礎的なトレーニングをボーっとやっちゃう感じでしょうか。

基礎的なトレーニングというのは、本来明確な目的があってやるものです。

ギターのクロマティックスケールを使った練習 (半音ずつ、1 弦ずつ上昇・下降しながら弾く) であれば、各指の独立性を高めようとか、きれいに音が出るようにフレットの近くをきちんと押さえようとか、それを無駄な力を使わずにやろうとか。

それと同じで、写経のときにも、目的意識を持ちながら行う必要があるでしょう。

誰に言われるでもなく写経にたどり着いた人は、ほぼ必然的に目的があってそこにいると思うので、問題ないと思います。

誰かの影響で「そうか、写経いいのか」となった人は、何を目的にそれをやるのか明確にするところから始めないと、危ないかもしれません。


写経から何を得るか


基礎的な文法

最もわかりやすいところではやはりこれでしょう。

「この言語では文末にセミコロンはいらないんだな」とか、「エラー処理が面倒な言語だな」とか。

特に、自分が既に知っている言語との差異を意識しながらやることが多いです。

個人的には、意味の分からない構文があっても、とりあえず気にせず書き進めて、終わったら特に気になったものをいくつか調べるのがいいと思ってます。


言語固有の文化

文法とも似ていますが、文法的には既に知っている言語とそんなに大きな差はなくても、変数や関数の命名など、違っているかもしれません。

実際に何かを作るときのために、意識に刷り込むようにしておくといいでしょう。


設計に関する洞察...?

これが得られるかどうかは意見が分かれるところかもしれません。

私個人としては、「写経が設計の理解を助けてくれることはある」と思ってます。

これなんかは特に、考えてやらないと何も得られずに終わると思います。

コードを眺めるだけでもいいんだけど、無意識的に飛ばして読んだりできないように写経する、という感じでしょうか。

コードを一度頭に入れるために必要な作業であって、そこから洞察を得るには自分の頭でよく考えることが必要でしょう。


自分で実際に書いて、実行したことがある、という自信

これは結構大きいんじゃないでしょうか。

一度も書いたことのない言語を書き始めるのは、なかなか億劫ですが、「書いて、実行したことがある」という自信があればかなり違うでしょう。

ちゃんと脳内に刷り込むように写経していれば、やりたいことからコードへの変換も速いはずです。

単純に、一度実行したことがある、ということは手元に実行環境ができているので、何か作り出すときの障壁が少ない、というのもあるかもしれません。

(これは意識関係ない)


まとめ

ひとことでいえば「手段と目的をはき違えるな」で済むところを長々と書いてしまい申し訳ございません。

「何が得られるか」「そのために何を考えるか」についてはいろんな意見があると思うので、ぜひともコメントください。