学問に王道なしと言いますが、プログラミングを上達するために最も効果的であるにも関わらず、いまや誰もその有効性を指摘しなくなってしまった方法がひとつだけあります。

それは「写経(しゃきょう)」です。

写経・・・文字通り、教科書に書いてあるプログラムリストをそのまま書き写すことです。



「そんなバカな。そんなことで上達が早まったら苦労しない」

と思うかもしれません。

しかし、実際には写経ほど効果的な学習法はないのです。

例を示しましょう。

たとえば、プログラミングの授業で、サンプルプログラムの半完成品がファイルで配られたとします。

「ここのコメント欄を参考に、プログラムを完成させなさい」

と指示するのと、サンプルプログラムを紙だけで配り、「何も考えなくていいから一言一句、打ち込みなさい」と指示された場合、どちらが早くプログラミングが身につくかといえば、なにも考えずに写経した方なのです。

これはなぜでしょうか。

実のところ、当の筆者も、最初は前時代的な写経で教えることに懐疑的でした。

そこで最初はまさしくサンプルプログラムをファイルで配り、それを少しずつ改造することで教えるスタイルをとっていました。

ところがこのやり方では、全くうまくいかないことに二回目の授業で気付きました。

彼らは「なんとなく改造」はできるけれども、プログラムがどういう仕組で動いているか、理解できなくなっていたのです。

そして筆者自身も、新しいことを勉強するのに、サンプルプログラムをとってきて改造するのをやめて、サンプルプログラムを一度印刷し、一言一句、上から下まで写経すると、驚くほどコードへの理解が深まることに気づきました。

なぜかというと、写経というのは、「なにも考えなくて良い」と言われるものの、人間ですから考えてしまいます。しかも、一言一句、記号のひとつひとつまで、意味を噛み締めながら入力していきます。

すると、サラッとサンプルプログラムを眺めているだけでは気づかなかった細かい法則や作法、サンプルプログラムを制作した製作者の意図などといったものがどことなくつかめてくるようになるのです。

もちろん、最初は意味がわからないなあ、と思って写しても構いません。

それでも、打ち込んでいくと、打ち間違いをしても、「あれ、これは少し変だぞ」と気づくようになります。



「さっきまではこの順番で丸括弧が来ていたのに、ここだけカギ括弧になっていて変だぞ」などということに、本能的に気づくのです。

これは人間が言葉を覚えるのに似ています。

最初からすらすらと言葉を喋れる人間はいません。

最初は父親や母親の言葉を真似してしゃべります。意味もわからずしゃべります。

喋っているうちに、次第にこなれてきて、次に自分の意志を反映させてアレンジした文法を話すことができるようになります。

同じことを、いくら言葉を尽くしても、写経せずに一行ずつ解説しても理解できるようにはなりません。

特に難しい分野であればあるほど、写経の重要性は増していきます。

筆者の会社では月に一回程度、ディープラーニングの技術セミナーを開催しています。このセミナーのハイライトは、写経です。

いろいろ試した結果、これに落ち着きました。短時間で写経できる程度の短いサンプルプログラムをいくつか用意して、まず理論を学び、次に写経して入力し、さらに実験して、体感として機械学習を経験したあと、実際のソースコードを解説するという流れです。

写経のプロセスを経ているので、ただ解説を聞くのに比べて理解度が違います。

また、写経をミスるとそもそもうまくいかないので、どこが間違っていたのか探すことでさらに理解が深まります。

この「手を動かす」という経験が重要なのは、大人だけに限りません。



筆者らが開催している「秋葉原プログラミング教室」では、まず紙のプリントで理論を学び、紙の上でコーディングまで一通りやってから、PCやタブレットで実際のプログラミングを行う、というプロセスを重視しています。

とかくプログラミング教室というと、すぐにPCの前に子供を座らせてしまって、あとは教材を渡して放置・・・という展開になりがちです。子供は機械を目の前にすると興奮するので、まあ極端な話、ワープロだって夢中になって遊ぶんです。子供が表面上は喜んで見えるので親は満足するのですが、これではなにも身につきません。

仮にも「教室」であるからには、子どもたちがなんらかのスキルを見につけ、そしてスキルを身につけた結果、彼らの表現力が広がるような教育を行うのが理想です。

先日、改めて安倍内閣がプログラミング教育の義務教育化を標榜しましたが、実際にそれが学校に制度として導入されるのはまだ数年先です。

そして数年後には、プログラミングをとりまく環境は大きく変化しているはずです。

わずか一年前に突然ディープラーニングが大ブレイクし、今や誰もがディープラーニングを仕事に取り入れようと腐心しているような状況は、二年前には想像もつきませんでした。

この業界は動きがとてつもなく早いので、のんびりプログラミングを教えていたら、小学校を卒業する頃にはソロバン並みに時代遅れになっていても不思議ではありません。



筆者は職業柄、プログラミングを学ぶ意義、意味、有難味、というのをいろいろな言葉で説明するわけですが、先日ふと思ったことがありました。

「なんでプログラミングってこんなに楽しいんだろう?」

気が付くと、私は買ったばかりのゲームを投げ出して、プログラミングに没頭していたのです。

ゲームは全力で自分をもてなしてくれます。

それはそれで、心地良いものです。

ゲームの中で戦い、ゲームの中で成長し、ゲームの中でアイテムをゲットして、ゲームの中で恋に落ちて、ゲームの中で宿敵を倒す。

全て美しい。計算されつくされたエンターテインメントで、この素晴らしさはなんら否定される類のものではありません。

ただ一点、それが全てゲームの中で、始まって終わっているということを除けば、です。

翻って、プログラミングはどうでしょうか。

プログラミングで新しい武器を手に入れること、それは新しい言語を習得したり、新しいフレームワークを使いこなしたり、新しいプログラムを自分自身で作ることです。

そうして作った武器、自分のモノにした武器は、現実世界を文字通り変容させます。

磨いたスキルは、さらなる高みへ登るためのステップになります。

ゲームの中だけで使える武器を手に入れるのではなく、現実の世界を変容させる武器を手に入れる。実際に自分自身が成長し、新しいワザやスキルを覚えていく。これこそがプログラミングを学ぶことの本質的な快感でしょう。

世界には無数の偉大なプログラマーたちが作り、惜しげも無く公開し、全世界のプログラマーと共有している優れたソフトウェア技術が山のようにあります。

そうした偉大な先人たちのアイデアや見識を、まるで巨人の肩に乗るがごとく、かるがると利用して、そして自分の足では決して辿りつけない遥かな地平を望むとき、それは少年が生まれて初めて海を見た時に似た、言い知れぬ深い感動を覚えます。

まやかしではない、現実を変える力。

そして同時にいまだ世界中に点在する無数の魔法使いたちを意識するでしょう。

あなたのプログラミング技術がそこまで到達したとき、あなたもまた、魔法使いたちの門をくぐったのです。

プログラマーはプログラミングを極めるとプログラムを書かなくなります。

もちろん全く書かないわけではありません。ただ、最小限しか書かなくなります。

彼らにとっての魔法は、現実を変容させる力。

最も効率的なプログラムは、書かないこと。

そして必要があればすぐに書けること。

素早く、シンプルに、正確に、必要十分に。

一番大事なのは、次の魔法を見つけること。作ること、考える事。

だからプログラミングを極めるとどんどんプログラミング以外のことに目が向きます。

地理が、歴史が、経済が、英語が、ラテン語が、ありとあらゆる人間の知識体系が、魔法の材料になります。

ありとあらゆる現象が、学問が、キラキラと輝いて見えます。

そうした魔法使いたちの歩む第一歩が、写経なのです。

僕ら世代までのプログラマーはみんな写経を経験しています。

泥臭いようで居て、実はそれが一番確実で、力が身につく方法だということを知っているからです。