著作一覧 |
子供が等比数列のn番目を求めるってやつの帰納的な解き方と関数化して解くってやつをやっているのを見ていて、これってまさにプログラミングとコンピューティングの微妙なところに関係する考え方だな、と考える。
コンピュータを利用することで帰納的な解き方を現実的な処理時間で利用できる。しかし空間計算量が増える(時間もかかるがそれは無視する、この場合は)。そこを気にしなければ、関数にする直接のメリットはない。だが、うまく関数化できた時の気持ち良さは失われる。
割と良く見るコピぺコードに、レジストリや名前サービスからの読み込みがあって、3行くらいのインスタンス変数への読み込み処理が10回くらい連続する。
関数にするにはたかが3行なので、こういう時こそコピぺとなり、ルックアップする名前と、代入先の変数名だけが異なるコードがだらだら並んでいる。
おれはこれが大嫌いなのだが、確かに関数化したからと言って、それ程のメリットも無い。既にGetProfileStringだのlookupByNameだのが関数になっているわけだし。16Kしかないシステムに無理矢理コードを押し込める必要もなくテストをすれば名前の書き間違い程度はすぐに直せるので特に困ることも無い。
しかし、逆にこの程度のコードすら関数化できないのであれば、より高度な関数化など、到底できないだろうとも考えられる。したがって、この程度の細部であっても同じコードが出てきたらうまく片付けるほうが良いのではないか。割れ窓は細部に忍び込む。
これはおそらく感覚の問題になってくるのではないだろうか。
等比数列を綺麗に関数化できて、たくさん並んだ階乗の足し算が消されていくのを見るときの気持ち良さみたいな味わいを抜きにしたプログラミングなんて、全くつまらない。この快感は上で挙げたような細部にすら存在する。
おそらく、本当のプログラミング教育における重要なことは、その快感を味合わせることなのではなかろうか。しかし、その快感がどのようなものかは、経験に基づく想像力を要し、その想像力は最初に例とした等比数列の関数化を求めた時のような、抽象的な経験によってしか培われない。そのような快感を味わうことなくいきなりプログラミングを始めたとしたら、それはひどく味気ないものだろう。であれば、汚いコードを平然と記述できる心性も多少の想像がつく。
ジェズイットを見習え |