高校時代の数学の先生の教えに倣い「プログラミングは頭じゃなく手で覚えるのです」を説く

高校時代の数学の先生は授業中に剣道着のまま竹刀を持ち歩いて数学を教えていたという人で(今なら問題になってるかも?)、言ってみれば文武両道的な感じだった。実際に剣道部顧問もされていたので有段者だったとは思う。件の先生とはあまり交流を持たなかったので詳しいところは聞いていないけれど……。

その数学の先生は、口癖のように「数学は頭でやるのではないんです。手でやるんです」と言っていた。
どう考えても、頭を使わない数学というのはありえなくて、記憶にしろ計算にしろ頭で考える時間のほうが長い。計算過程を確かにノートや解答用紙には書くけれど、これは別に出て数学をやっているわけじゃなくて、頭で考えた結果を書き起こしているに過ぎない。
当時は、そう思っていた。

しかし大学や専門学校の授業には、必ずと言っていいほど「演習授業」というのがある。講義で学んだことを演習授業で実践するのだ。そしてこの演習授業の時間は、たとえば情報系や機械系などの場合ではかなり長く(たとえば2~3コマ)とられている科目もある。数学でも演習授業はある。これは演習問題を解くという作業を繰り返す授業だ。
高校時代にはわからなかったことだ(私があほなだけかもしれないけど……)。

私自身、プログラミング学習でそのように感じることは多々あるし、思い返せば「手で覚える」ことを繰り返してきたのだと改めて感じる。別にこれは体育会系的修練や長い下積み経験の強要などではなく、少なくとも凡人は同じ(ような)ことを何度も繰り返しやることで身についていくものだと思っている。

また写真や絵画といった芸術や文化においてもまったく同じだと思うが、最初は他人の模倣から入っていくものだ。プログラミングという芸術とは対極にあるようなものにおいても同じことが言えると思う。そういう意味では、私が子供の頃はインターネットなど存在せずパソコン通信も高校時代にようやくバイト代で始められるようになった時代。プログラミング関連の書籍などわずかしかなく学習方法はほぼ独学だった。情報が少ないので雑誌に掲載されている短いプログラムを「読解」しながら頭でプログラムを実行したり、まだお年玉貯金では購入できなかったパソコンを電器屋の店頭展示を使ってプログラミングしたりしていたものだ。

その環境の良し悪しはともかく(というかそういう時代だったのだからしょうがない)、ひたすら1冊の雑誌や書籍に掲載されていたプログラムにかじりついて徹底的に模倣し、理解しながらプログラムを改造していく、改造すると動かなくなる、それをデバッグする、という作業の繰り返しをすることで学んでいったという事実が浮かび上がるのだ。これは演習授業や下積み経験といった「繰り返すことで体が覚える」方法論を図らずも実践していたということになる。

今ではコンピュータ関連書籍の棚はちょっと大きな書店に行けば棚2~3個分はゆうにあるほど充実していて、プログラミング言語も数多く、入門書から資料まで幅広く出版されていて学習には困らない。インターネットには質問箱系のサイトもあって、基本的なことですら他人から回答(解答?)をもらうことができる。これはいい傾向だとは思うけれど、同時に学習の濃度は薄くなり、結果的にプログラミングというものを習得できる人の数は決して情報量に比例して多くなっているとは思わないし、世の中や業界をみていてもそうは思えないのである。また最近のプログラマを見ていると、検索サイトで他人のサンプルプログラムを理解せずそのまま利用する「コピペプログラマ」が(国籍を問わず)増えているような気もしている。理解しないからデバッグもできないし仕様を満たす実装もできないので、これはもはやプログラマだとかエンジニアとは呼べない。

ともあれ私がプログラミングをこれからやりたいと思っているけれど、どこから手を付けていいのかわからないという人にアドバイスをあえてするとしたら、以下のことをお勧めしてみたい。

入門書1冊と資料系書籍1冊

入門書はたくさん出ている。たとえばAndroidアプリ開発の書籍などは有象無象である。何を選べばいいのかすらわからないほどである。この中から何を選ぶのはか、自分が読みやすいものを選ぶしかないので、Amazonなどで他人の評価にまどわされながらネット注文するのではなく、大型書店に出向いて自分で読むところから始めてみるのがいいと思う。自分が読みやすい、あるいは気に入った本でないと、たぶん途中で読むことすら挫折することになる。せめて導入部分だけでも読む方がいい。
入門書だけでは不安だという人は、プラス1冊すればいいだろう。ただし入門書が2冊あっても何の意味もないので、もう1冊はなんでも網羅的に記載された資料系書籍を1冊買っておけばいい。入門書でわからなかった、あるいはもっと具体的に知りたい用語や仕組みを調べられるのは資料系書籍だろう。ただし最近ではウェブで調べればある程度は見つかるので、あえて資料系の書籍を買う意味があるかどうかは趣味の問題といえなくもない。本が好きな人は買ってしまえばよい。Androidなどでは英文だがドキュメントはGoogleが完ぺきなものを用意している。もちろんマニュアルなので判りにくい。それを補うのが資料系書籍という見方もできる。

複数のサンプルプログラム

入門書の選び方で私がお勧めしたいのは、短くてもいいからサンプルプログラムがたくさん掲載されているものだ。入門書といってもいろいろあり、たとえばある程度実用性の見えるプログラムを2~3本掲載し、そのプログラムをベースに解説していくパターンのものや、実用性に関係なく個々の機能説明をするための短いプログラムを掲載して解説しているものなどがある。前者でも入門書として優秀なものもたくさんあるのだけれど、「手で覚える」機会が数少ない。長いものを一度入力したら、あとは本を読むだけになってしまう傾向があるだろう。
また短いプログラムをたくさん入力する意味はあとで述べるが、1つには成功体験の積み重ねがしやすいということだ。短いぶん完成までの時間も少なくて済む。

数をこなす

長いプログラムを延々入力して理解したり、入力しながら解説を読むのは、かなりしんどい。むしろ短いプログラムを何度も何度も入力して体で覚えていくことが大切だ。頭で最初理解できなくても、体を動かすことで頭が働いていくことは多くの方々が経験しているはずだ。
そして数をこなすことで成功体験(あるいは失敗体験)も数多く得られる。「ああできた、じゃあこれをこうしただろうだろう?」という考えを何度もすることでプログラムというものへの恐怖心や改良によって得られる失敗体験(デバッグ)と成功体験(デバッグを経て完成)がバランスよく得られる。

コピペやダウンロードは絶対しない

ちょっと前まではサンプルプログラムが収録されたCD付き書籍はあたりまえだったし、最近では出版社サイトからダウンロードができるようになっているのが一般的になってきた。これによって入力の手間をばっさり省いて学習に専念できる……と思っている人が、最近やたら多すぎである気がする。
私ははっきり言えば、これはサービスではなく嫌がらせだと思っている。
プログラミング入門者がプログラムを自らの手を使わずに学習することは、結果的にこれまで上で述べてきた経験取得のための機会をすべて放棄することを意味する。しかし入門者にとって必要なのは、これらの経験であると述べてきた。つまり、こうしたダウンロードやCDに依存するということは、もはや入門者は自らの学習機会の半分は放棄したも同然なのだ。
出版社としてはそうしたことを「サービス」として提供するのが一般的になってきている。商売上必要なのだろうけれど、そもそもこれが「商売上必要」になってしまうことのほうがおかしいし、だからこそプログラミング入門者が挫折ていく人の数も減らないのだと思っている。消費者サービスというのは消費者の手間を省くことではなくて、消費者が望む経験を得られることなので、それを消費者自身が勘違いしている場合、「プログラム入力という面倒な作業をすることなくプログラミングの学習ができる」という本末転倒な発想になる。心当たりのある人は、今一度自分が何を習得したいのかを考え直す方がいいだろう。
いわゆる上流工程的な業務が主体で知識だけあれば事足りる人であればある程度通用するかもしれないが、私の経験上、自分である程度のプログラムが書けない人やデバッグセンスのない人にシステム設計なんてできないと思っている。まあこの話は今回の論点からずれるので機会があったら別立てで書くことにしたい。

入力!入力!入力!

本に掲載されているプログラムは、ひたすら自力で入力すること。これは強くお勧めしたい。
なぜなら、これで同じことを繰り返すという経験が多数得られるからだ。
また、一度入力したプログラムの一部分が他のサンプルプログラムで繰り返し使われている場合があったとしても、絶対にコピペ(コピーして貼り付ける)をしてはいけない。これを1回やったら学習機会を自ら1回放棄したと思ってよい。

こうしたことを書くと「何だ精神論か」と思われてしまうのがとても悲しいのだが、理論的学習だけで人は成長しないのである。知識と経験はバランスであり相互依拠するものだ。なぜなら、そもそも「知識」とは先人の経験の積み重ねを整理し体系化したものであるからだ。合理的学習のための知識があり、それを礎に経験を積み重ねていく。手を動かし目で見て頭で理解するというフェーズを何度となく繰り返すことで、脳内のシナプスの結合を太くさせる。そうすることで、単に個々のサンプルプログラムだけでは見えてこなかったものが体系的に整理され頭に入ってくるようになる。個々のサンプルプログラムでは「とりあえずこれ入力しておく」という扱いで書かれてる部分でも、多くのサンプルプログラムの同じ個所を何度も何度も入力することで、そのプログラムの意味が見えてくることも多いのである。とにかく真似をし続けることで、真似している対象の意味を繰り返しの中から見出し理解する。次に経験するときにはそれを違う形で生かすことで、今度は真似からオリジナルへと変えていく原動力となる。つまり、サンプルプログラムから足を洗い、自分で考えてプログラムを書くことができるようになるのだ。

恐れずに”壊す”

最後にお勧めしたいのは、入力し終えたサンプルプログラムを”改造”すること。改造すると「壊れる」場合もあるが、それでいい。壊してしまえばいい。元に戻すには最悪もう一度入力しなおせばいい。その手間は惜しむべからずだ。
改造するには、理解が必要である。つまり、理解していなければ改造ができない。逆に改造することで理解の助けになることもある。たとえは悪いが医学の世界では動物実験などは「知識をベースにして”改造”し、その結果から新たな理解を得る」という作業の一種だと思っている。プログラミングでいえば、ごく簡単な改造が理解を助ける場合もある。たとえばプラス記号をマイナスにしてみたり、不等号の向きを逆転させたり、途中でif文の条件を追加してみたり、変数の初期値を変更してみたり、for文の繰り返しの数を多くしてみたり、などが相当するだろう。もっと高度に”改造”したいなら、ある部分を別の書き方にしてみたり、同じような個所をうまくまとめてみたり、冗長な部分を合理化してみたりするのがいいだろう。

この正月休みでプログラミングを……と思っている方に、少しでも参考アドバイスになれば幸いである。

Androidプログラミングバイブル SDK 4/3/2対応 (smart phone programming bible)iPhone/iPad/iPod touch プログラミングバイブル iOS 6/Xcode 4対応 (smart phone programming bible)Windows8プログラミングバイブル Windowsストアアプリ&HTML5/CSS/JavaScript編 (smart phone programming bible)

コメントを残す

メールアドレスが公開されることはありません。