最近ソフトウェアエンジニアリングに置ける開発手法に関して考えている。

ぶっちゃけ言ってしまうと「やっぱりTDDっぽいのがいいな」というところに落ち着きつつあるのだが、厳密にTDDをしたほうがよい、と思ってるわけではない。TDDとかExtremeプログラミング、Agileプログラミングにしても理想はいいんだけど、原理主義っぽい使い方は現実にそぐわないと思ってるからだ。

前置きはこれくらいにしておいて・・・重要だと思うのは以下の点:

  1. 開発サイクルに自動テストツールを組み込む
  2. エンジニアによるバグ/不具合発見時には「動かない」は許可しない。必ず再現コードを提出してもらう
  3. テストを自動テストツールを組み込む(=次回リリース前にはかならずテストを実行できる状態にする)
  4. テストが通るまで修正を続ける
という開発サイクルを取るべきだ、という結論に落ち着きつつある。

当たり前と言えば当たり前なんだけれども、開発をしている人はバグを例えば口頭で説明されたらその場で直して「直したよ!」って言って終わっちゃう事も多いので、そういう事を回避したい、という思いから上記サイクルを強く推奨したいのだ。

開発エンジニアとしてはバグを修正するために製品コードに手を入れるのは簡単だ。でもマーフィーの法則ではないけれども「一度起こったバグは必ずもう一度起こる」と俺は信じている。他のコードに手を入れた瞬間か、バージョンアップ時にコードを書き換えた時か・・・とにかくバグは起こるべくして起こる。

でもテストを作成せずに製品コードに手を入れてしまった瞬間、そのバグが起こったという事実さえ記録に残らない。次回起こるかどうかチェックができない。「なんでまた起こったんだ?」というクライアントの問いに答えられない。

それらを解決するのはリグレッションテストを増やす事しかないと俺は考えている。

とにかくあれだ、make test必須ってことだ。t/ディレクトリの中がt/regression-*.tというファイルで埋まってる状況こそ望ましいはずだ。世の諸君、テストを書くんだ!

さてここからは余談だが、そういう事を踏まえるとMVCを使う別の理由が見えてくる。

MVCは一般的にコードとプレゼンテーションを分けるのに使う、と言われがちだが、MVCパターンを使う事によって以下のようなシナリオを防げる:

  1. Webアプリで不具合発生
  2. 修正するも、テストが書けないとエンジニアに言われる
  3. 「なんで?」と聞いても「Webサーバを通さないとテストできないから」「うちのネットワーク構成だと本番サーバーにアクセスせざるを得ない」とか言われる
  4. テストがない状態で運用。将来また問題が起きないかどうか((((;゜Д゜)))ガクガクブルブルしながら過ごす
それがどうMVCとだと解決できるかというと、WebアプリがうまくMVC構造になっているとロジックがほとんどモデルに落ちてくる。

するとモデルは当然Webサーバと結合してない(べき)なので単体でテストできる!

やった!テストできるじゃん!

ちなみにモデルなら・・・と書いたけど、Catalystのような構造になっていればCだってVだって同じようにバラして単体テストできる。

そういうわけでMVCの利点を話す時は旧来の利点だけでなく「テストが容易に書ける」と足したほうがいいと思う。

世の諸君!テストを書くんだ!ボーイズ・ビー・アンビシャス!どげんかせんといかん!All Your Tests Are Belongs To Us!

# 最後わけわからんくなった。