コードを読む能力
こちらのブログ「/home/siddhi」に、大卒で就職試験に来る志望者たちの実力不足を嘆く記事があった。特にコードを読む能力について書かれているが、下のような簡単な問題を出したところ、まともに答えられる人が少なくて驚いたというのだ。
問:この関数fは何をしているか。
int function f(somestruct *a) {
int x = 0;
if (NULL == a) {
return 0;
}
x += f(a->left);
x += 1;
x += f(a->right);
return x;
}そして僕は見事に解けなかったわけだ。というか、20秒ほどにらめっこした後、答を見てしまった。答を見てしまうとそれはもう簡単な問題である。答を出せなかった自分がとても恥ずかしくなった。これはなかなか危機感を誘う事実だ。これでは先のブログで嘆かれる無能な新卒まっしぐらである(まだ卒業しないが)。
で、コードを読む能力が高いというのはどういうことなのかを少し考えてみた。
ひとつには、単純に論理力があればコードを読解できるはずである。たとえば上の問題ならば、関数が int を返している時点で何らかの数か数値を求める関数だと分かる。あとは再帰構造を頭の中で実行する思考力があれば、少し時間はかかっても答が出せるはずだ。
問題は、「少し時間がかかっても」というところである。ここで、プログラミングのクリシェに関する知識量がものをいう。クリシェがなぜ存在するか。いちいち考えていると長くなる問題のうち、利用価値の高いものがクリシェとして残っているのだ。つまり知識があれば考える必要がない。上の問題ならば、a が left と right というプロパティを持っていると見た時点で木じゃないかと思えれば、あとは int を返していることから数を数えているのかもしれないという前提をもって脳内実行に取り掛かれるから、答を出すのが格段に早くなる。
ところで、ここまでアルゴリズムについて話してきたが、プログラミングにはこれとはまた違った次元があると思う。アルゴリズムの少し斜め上、デザインパターンの次元だ。僕はいま、アンケート作成のWEBアプリを作っているが、実際僕はこちらの次元を徘徊している場合が多い。作業の大部分はともすれば設定ファイルで済んでしまいそうな内容で、「アルゴリズム」と呼ぶと大仰だ。いうなればプログラムというよりマークアップなのである。が、なぜマークアップだけでプログラムができるかと言うと、その下にデザインパターンがあるからだ。
この次元のコードを読むにはデザインパターンの知識がものを言う。だがこちらは、書いた人がパターンに関する間違った認識を持っている場合や、そもそもパターンを使っていない場合を想定しなければならない。つまりは脳内の空間でいかに忠実にプログラムを実行できるかの占める割合が大きいのではないだろうか。肝になるのは論理力、想像力だ。
コードを読む力は作業効率にかかわる。先のブログに出ていた例だが、たとえばポールがケビン先輩のコードを使って別の機能を開発するとしよう。ここでポールはケビン先輩のコードを読んで仕組みや意図を汲み取らなければいけない。そうでないと、ポールは「正しい」コードを書くことができず、結果的にコードをハックし、プログラムはスパゲッティ状態に陥る。このようなことは少ない経験の中にたしかにあった。(しっかりドキュメントしろ、というような話は今はおいておくとして。)
そして当然、読めなければ書けるわけがないのである。
常日頃から思考力を鍛えておきたいものだ。デザインパターンやアルゴリズムに関する知識もしっかり蓄えておく必要がある。
本文中にヒントも出たが、上の問題の答は、「二分探索木のノードの数を求める」だった。解けましたか?
訂正:正確には「二分木」でした。
追記:「a が left と right というプロパティを持っている」事に加えて、left も right も a と同じ構造体であることが重大なヒントでした。やはりこれくらいはすぐに読み取れるようになりたい。
on February 7th, 2007 at 02:00
ぐべら解けんかった...
再帰構造って今学期のテストに出たばっかやのになぁ...無念すぎる.
デザイン力,コード読解力ってすごい難しいと思う.知識ではない.
料理人や演奏家に似てる.知識に直してみれば割と簡単なことだったりするのに,同じことをしているはずなのに,素人とプロでは雲泥の差がある.
素人とプロを分ける最も重要な要素は「興味」だと思う.思考力,論理性,持続性もそうだけど,まず興味がなければ,考えようと思わないし覚えようと思わないし続けようと思わない.興味という要素は,教わることも教えることもできないから尚更難しい.でも地道に基礎を固めて,ある程度知能を発揮できるようになれば,興味も強まって,加速的に上達できる.スタートが一番重要なんだなと思う.それゆえに,子供の頃からコンピュータに興味を持ち,ハックしまくってきた人達が羨ましい.彼らはもう何も考えなくても何も努力しなくても,頭が勝手に考えるし,体が勝手に努力するのだから.
on February 7th, 2007 at 02:50
ぐべら解けんかった…
そして反射的に関連情報を見つけるべく検索エンジンを開こうとする衝動にかられている自分がいた。
改めて自分が「覚える事を怠けている」ことを認識しました。
知識を脳ミソに蓄えなくてもよくなるのがITの素晴らしいところ、と言うエラい人がたまにいるけれど、それは無理のある話だと思う。なぜなら、脳ミソの処理能力(何千何万という記憶から瞬時に関連情報を結びつける)を超えるシステムができない限り、マルコの言う「少し時間がかかっても…問題」は解決し得ないからね。大体脳の仕組みだってまだ分からないというのに。
あぁ、こんなのだからスパゲッティを作るのが上手くなってしまうわけだ。
精進しますw 開発合宿が楽しみであります。
on February 7th, 2007 at 03:06
> 料理人や演奏家に似てる.
その例えは分かりやすい。
知識があれば考える必要がない、は語弊があるな。知識が読解を手助けする、という事が言いたかった。二分木についてちゃんとした知識を持ってたら解けそうだと思ったから。
羨ましい、か。これは興味深い点やで。
興味はあってもある程度の実力のある状態にないと、そこから先へ進むためのモチベーションが沸かないってのは確かにあるな。じゃあ逆に、その人たちに力づくで追いつく必要はなくて、ある程度力を発揮できるところへさえ持って行けばいいのでは?
と、言いたくなるんやけど、そう簡単に行かんのはおれ自身もよく知ってる。おれにとって音楽がそれや。もっと小さい頃からピアノを習ったり質の高い音楽に囲まれて生活していたかったと思う。「才能のある人が羨ましい」と思う。でもこれは、羨まれる当人たちが聞くと「うだうだ言ってないで練習したらこれぐらいはできるのに」と思うはず。
on February 7th, 2007 at 03:17
@キタール:
これは体系的に学んでないと相当に難しい問題やと思う。
そして調べたと聞いて大変重要なことに気がついた。「二分木のノードを数える関数を書け」なら、Wikipediaで調べて30分で書けるかもしれないけど、上に書いた問題だと二分木を知らなければ調べることすら出来ない。
ITはいまのところ「定義→意味」言い換えれば「キー→値」方向のインデックス化はかなりのレベルに達してるけど、「値→キー」方向ではまだまだ使い物にならないな。やっぱり当面の間はキタールの言うように脳内のオーガニックな知識が必要なんやろう。
on February 7th, 2007 at 03:40
>「うだうだ言ってないで練習したらこれぐらいはできるのに」
それはかなりもっともやし,実際それ以外道は無い.
しかし,素人とある一線を越えた人の「練習」は意味が違うと感じる.つまり,素人は上達したいから辛くても練習する.一方,ある一線を越えた人は楽しいから練習する.
これはドラムを練習している時に思った.始めたばっかりの時は何が重要なのかも分からんし,苦痛だった.が,最近は練習自体がめちゃくちゃ楽しい.上達したいから,というよりは練習したいから練習している,といった感じ.昔と比べて今の方がやることは多いし忙しいはずやのに,練習に対するモチベーションは今の方が圧倒的に上.
これはあらゆる技術に共通するような気がする.素人から見たら地獄のような苦行でも,当人からしてみればこの上ない娯楽.プログラマが地獄に居るか天国に居るか,みたいな違いやな.どっちも同じくらい働いてるのに.(むしろ天国に居るプログラマの方が数倍仕事しているはず)
ある一線を越えた人が,まだ超えていない素人に向かって「うだうだ言ってないで練習したらこれぐらいはできるのに」と言うことは,正論だが残酷なことだなぁと思う.
http://www.excite.co.jp/News/bit/00091169354317.html
↑これ思い出した.
on February 7th, 2007 at 03:57
言い換えれば,技術は無くても「練習(勉強)が楽しい」レベルまで持っていけたら,後はどうにでもなると思う.
ただ,そのレベルに到るまでの条件がある気がする.
まず少しでも興味を持っていること.そして,近くに自分よりレベルの高い人がいること(ある一線を越えた人が望ましい).後者は何気に重要な気がする.軽音のドラムの先輩は,全員あるレベルに達していた人ばかりだったから,ある意味幸運だったのかも.それと,自分と同レベルか,自分より少し上のレベルのライバル的存在がいること.そういう意味で,ピラマツとうっちゃんは凄くいい存在だった.環境って大事やな.
長文失礼しますた.
on February 7th, 2007 at 21:15
少しでも興味を持っているってのは既に満たしている気がするけどな。それがなければ羨ましいと思いさえしない。たとえばおれはダンスの達人をすごいなとは思っても羨ましいとは思わない。
単純な話やけど下手でも練習が楽しい、ということが充分ありえると思うけどなぁ。そこに必ずしも地獄のような苦痛はない。あと、上達が楽しいから練習するというのは素人でもプロでも共通だと思う。
環境は大事や。間違いない。ライアンキタールばんざいやで。あとプログラミングの世界はネット上にすごい人がゴロゴロいるしすごいプログラムが山ほどあるから、ある意味恵まれてる。