2006-02-08

バグがちらほらと出始めた。時期が時期だけにシステムに関わる部分のバグは慎重に修正せねば。

残りの期間もあとわずかなので、無理にでもテンションをあげて乗りきっていきたい。

プログラマの開発効率 プログラマの開発効率 - Nao_uの日記 を含むブックマーク はてなブックマーク - プログラマの開発効率 - Nao_uの日記 プログラマの開発効率 - Nao_uの日記 のブックマークコメント

特に根拠も提示せずにプログラマの生産性は人によって100倍になると書いてましたが、その根拠でも。

  • 作業の組み立て方の差

組合せというのは大きな問題です。ゲームのコマンド入力等で「たたかう」「どうぐ」「じゅもん」「にげる」といった4つの選択肢があるとします。一人パーティのゲームであれば組合せは4通りです。2人であれば「たたかう」+「たたかう」、「たたかう」+「じゅもん」といったように組合せが増えて4×4の16通り、4人なら4×4×4×4で256通りになります。こうした爆発する組合せについて、それぞれ正しく動作することを確認して行くことは大変手間がかかります。

まっとうなプログラマであれば、パーティ一人一人の行動を他のパーティとは影響が無いように注意して作ります。こうすることで、4×4×4×4×…といった組合せではなくて4+4+4+4+…といった項目に抑え込んで手間が増えないようにします。もっと良いプログラマであれば、人数に関係なく4通りのコマンドをテストするだけで問題ないように作るでしょう。

確認項目が4つで済むプログラマと16通りで済むプログラマ、256通り確認しなければいけないプログラマ、では作業効率に大きな差ができます。しかもこれはパーティが増えればもっと差が大きくなるのです。100人パーティとか考えたくなります。

できないプログラマというのは問題をどんどん大きく育ててしまうので、結果的に作業効率に差ができてしまいます。

  • 作業量の差

もちろん、最初に選択されても2番目に選択されても最後に選択されても問題なく動作する「たたかう」コマンドや、いつ、誰が選択しても動作する「たたかう」コマンドというのは、256通り確認しなければ行けない「たたかう」コマンドに比べれば作るのが難しいはずです。でも、それができるかどうかが大きな分かれ目になります。

256通りの確認が必要なコマンドを作るのは、確認が4つで済むコマンドよりも簡単でしょう。ですので、この人はどんどんコマンドを作っていきます。こうして「できない人」は「できる人」がコマンド1つを作り上げる間に10個も20個もコマンドを作り上げるのです。ここだけ見ると「できる人」が1つ作る間に20個作るわけですから「できない人」は20倍の作業速度に見えてしまいます。しかし、「できる人」がコマンドを4つ、つまり全部作ったときには「できない人」は100個くらい、まだ半分も出来上がっていないことになります。

問題を小さくして取扱しやすくする、というのはよい戦略です。しかし、物には限度があり細かくしすぎると却って手間がかかるようになります。よいプログラマであればこのバランスを知っています。

書いたプログラムの量が少なければバグも少なくなる。

平民的プログラミングのススメ 平民的プログラミングのススメ - Nao_uの日記 を含むブックマーク はてなブックマーク - 平民的プログラミングのススメ - Nao_uの日記 平民的プログラミングのススメ - Nao_uの日記 のブックマークコメント

いまどき、そんな貧民的プログラミング思考をするのはプログラム職人として恥ずかしいことだ。

しかし、個人的に最近気になってることとしては、一方でやたらと富豪的プログラミングが度を過ぎていて、プログラムが機能として破綻していることもよく見掛ける気がするのだ。 破産的プログラミングとでも呼ぼうか。

そういうわけで、僕は「富豪的プログラミング」という言葉は (↑のような誤解に基づくプログラミングを招くので) あまり好きではない。やっぱり緻密な計算量評価に基づいた最適な処理が物を言うことは多いと思うのだ。

僕の基本的な考え方は、「一番性能に影響する入力サイズ n」というものを考えて、最適な実装をしたときの計算量から定数倍(1桁)または O(log n) 程度しか変わらないなら、奢ったプログラミングを許容する、という感じ。一方で入力サイズが小さいと判っているものに関しては、徹底的に楽で綺麗なプログラミングを奢る、というような感じかな。

この手の「奢るべきでない場所をちゃんと考えるプログラミング」こそが本来の富豪的プログラミングだと思うのだが、言葉の響きに「抑制的」なものがないのがよろしくないのだろうか。というわけで、「無駄に金は使わないけど、奢るべきところでケチケチして後ろ指さされたりはしない、ごく普通のマットウな社会人としての生き方」と対比させて表題の「平民的プログラミング」となるわけだが、いいネーミングは何か無いかな。

計算量と簡潔さのトレードオフ