プログラムのコツはある日突然ひらめくとおもう。

はてなダイアリーの人気記事にこんなエントリーがありました。
d:id:hyoshiok:20090429#p1

大学のクラスルームで教えているようなC言語の文法を15回に渡って教えるような講座でPostgreSQLの開発者になれるか、あるいは即戦力的なスキルが身につくかというとほとんど身につかないし絶望的なまでに実践的ではない

たしかに、大学の授業でプログラムはできるようにならにと思う。

これは、ほんの少しの間だけ、携帯電話機のミドルウェアプログラマとしてC++をやってたときひしひしと感じました。
プログラミングとは、要件定義、設計からテスト、デバッグ、納品までがプログラミングなわけで、文法をしってても何にもならないことはたくさんあります。
また、世の中はあまりきれいでないコード(納期に追われた開発者がかいた適当なコードとか)があふれています。
OSがもってるAPIを利用するとき、否応なしに、もしかしてきれいではないコードを追いながら利用しなければなりません。
ここは、いくら言語仕様を知っていてもどうにもならないなぁと思いました。

プログラムは「コツ」がつかめるかどうかだとも思う。

でも、だからといって、「実践」だけこなせばプログラムができるようになるかといえば、そうでもない気がします。
結局、自転車に乗れるようになるプロセスにそっくりで、「ある日突然コツをつかむ」のがプログラムなんじゃないのかな、と私は思います。
私は、プログラマをやったのは半年しかないしもう辞めてしまったので、今でもスパゲティコーダーですが、「順序、分岐、繰り返し」の感覚はつかんだと思います。
プログラムって、この感覚さえあればとりあえず0からプログラムを作ることはできるし、あとは実践と知識だと思ってます。

「コツ」をつかむにはどうしたら良いのでしょう?

実践は先のエントリで言及されていますが、一方で、やっぱり大学でやるC言語の講座もやっぱり重要じゃないかなと思います。
たとえば、ネットワークエンジニアをやってた時も「作業はすごく早いけど、ちょっとしたルーターの仕様を、ネットワークの基礎知識がないために理解できず、作業中はまってしまう人」がいたのを思い出します。知識は実践をこなすための「燃料」になると思うのです。
やりながら学ぶ、たとえば「DBからデータを読み、書きだす処理」を行ったら、実際、言語はどういうプロセスでもってデータを読み書きさせているか知識として知ることではじめて「スキル」になるんじゃないかなーと私は思うのでした。


偉そうにいってしまいましたが、私も実践してかつ学ぶことができていないのでやらなければなりません・・・。