忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

少しずつ確実にプログラムを書く

テスト駆動開発は大きな目標を小さな目標に分割して、それを一つ一つ着実に達成しながら大きな目標を達成するということをやっている気がします。


Moneyオブジェクトの例

ケント・ベックは『テスト駆動開発』で、テスト駆動開発の例として、株取引のために各国の通貨を扱うMoneyクラスをプログラムしています。Moneyクラスはお金の計算を行います。そのため、ベックははじめに次の2つのTO DOリストを書きました:

レートが2:1の場合、$5+10 CHF = $10
$5*2=$10

ポイントは、彼はこの2つのかんたんな具体例を使って、株取引で使えるようなお金の計算クラスを作ろうとしたことです。いきなり難しいプログラムを作るのではなく、まずはかんたんに検証できる例から始めたのです。彼は次のように述べています:

まずどのテストが必要だろうか。リストを見ると、1つ目のテストは複雑に見える。こういう時には、小さく始めないと何もできない。まずは乗法から取り掛かることにする。

「1つ目のテストは複雑に見える」!?1つ目の$5+10CHF=$10というのも結構かんたんに見えます(少なくとも小学生レベルです)が、彼の単純さの追求は徹底しています。じっさい、1つ目と2つ目どちらがかんたんかと言われれば、2つ目なのは間違いありません。物理学者も単純なモデルを重宝するそうですが、それと同じでしょう。アインシュタインが言ったように、「なるべく単純にせよ」です。

彼はこの調子で、たくさんのかんたんな目標に分解していき、一つ一つ達成していきます。リストの1つ目もたくさんの目標に分解し、風をひいて意識がもうろうとしていても5分もあれば達成できそうな目標にしていきます。つまり、彼のしたことを図にするとこうなります。

左が、プログラムをある程度書いてからそれをテストする場合、右がテスト駆動開発、つまり小さな達成すべきテストを書き、テストに合格するようにプログラムを書いていく場合です。図の中の●は現在地、◎は達成すべき目標を表しています。テスト駆動開発は小目標が達成されたかどうかを短時間に確認しながら進んでいるといえます。

しかし左側のやり方では、プログラムを書いているうちに「このプログラムはきちんと動くのだろうか?」という不安に押しつぶされる危険性があります。これはある意味、猿のタイプライター方式でシェークスピアを書くようなものと似ていて、一度にすべてをうまくプログラムしないといけないというプレシャーと戦わなければいけないのです。

何を小目標にすべきか?

ところで、目標を小目標に分解するとこところまではいいのですが、一体何を小目標にすべきなのでしょう?どうやって小目標をリストアップすればいいのでしょう?たとえば、お金のクラスを書きたいというときに、本のタイトルを検索するプログラムを書いても何の意味もありません。関係ないからです。もちろん、それくらいわかりやすい例だったらいいのですが、プログラムを書いていると、「これは必要だ」と思ったのに、あとでやっぱり必要でなかったということがときどきあります。ということは、小目標を設定するのにはある種の予知能力というか…予測する力が必要なのです。

上の2項目あるリストの場合、「お金を扱う完璧なクラスがあるとしたら、これくらい出来るだろう」という考えで小目標が作られているように思えます。つまり、「お金クラスが存在する」という流れを作り出すのです。「お金クラスが存在する」なら、「$5*2=$10」くらい計算できるでしょう。「お金クラスが存在する」なら、「レートが2:1の場合、$5+10CHF=$10」くらい計算できるでしょう。

ある意味、人間の思考と似ていて、思い込みの強化か何かのようです。出来の悪い生徒に勉強を教える時、わざとかんたんな問題(一桁の足し算とか)からやらせて自信をつけさせるそうですが、それはきっと「自分は問題を解けるのだ」という思い込みを作るためなのだと思います。プラシーボ効果のように、思い込めばうまくいくこともありますからね。

テスト駆動開発がプラシーボ効果だと言うつもりはありませんが、何か似たメカニズムで、ある意味でほぼ同じ現象を引き起こしているという見方もできるかもしれません。「このプログラムはきっと正しく動作する。なぜなら、今までテストに合格してきたからだ」というのは別に間違った考えではなく、むしろ経験に基づく確たる自信とみなすべきです。そしてこのような自信を持つためには、目標をかんたんにする必要があります。難しすぎる目標は、失敗のまま終わり、自信の喪失につながります。だから2×5=10というような、呆れるほどかんたんな小目標に分解する必要があるのでしょう。

ちなみに、この小目標というのは、ある程度のランダム性を持つのが普通で、単純であるべしということ以外にはあまりこだわるべきではないでしょう。ベックか誰かが言っていたと思うのですが、テスト駆動開発をすると、同じ目的のプログラムでも、やるたびに過程がかわるのだそうです(実演する時、事前に練習してるからこんなにスムーズに行くのでは?と疑われたそうです)。それは思いついた時小目標を気軽に追加するからですが、結局小目標というのは本来の目標のための手段であって、目標さえ達成できれば小目標はなんでも良いのです。東京から大阪へ行くにはいろんな乗り物や道すじがありますが、最終的に大阪に着くならどれを選んでもいいのです。

拍手[0回]

PR