低い品質でも動くソフトウエア :-)

1年間続けてきたプロジェクトの本番リリースをついに迎えた。
テストも不十分であったし、本番のデータを使用したテストも行う余裕もなかったので、やはり正月返上、休日も夜間も作業し、やっと落ち着いてきたところだ。

ところで最近改定になった「デスマーチ」を読んだのだが、今回のプロジェクトのようなプロジェクトがたくさんあるのだ、ということを改めて認識することができた。しかし、この本では明確にデスマーチを回避することはできるとは書いていない。

デスマーチプロジェクトにいた身としては、日々考えることがあったが、最近は「低い品質のアプリケーションを作る勇気を持つべきだったのでは」、と思うようになった。

というのも、いままでサポートしてきたチームの状況を見ると以下のように考え、高い品質と拡張性を考慮していたように思う。

  • この場合、業務追加があると困ったことになりませんか?業務追加を考慮した設計をしなければならないと思います。
  • ログ出力について、統一したルールや見解が必要です。早急に方針を決定してください。
  • この場合、更新にミスすると、履歴は消えてしまう。更新に失敗した情報を作成しておく必要がある。
  • 接続先が固定されています。環境ごとに設定をしなければいけなくなってしまうので、修正を検討してください。
  • 念には念を入れ、他のチームがチェック済みでも、当チームでも独自にValidationしましょう。
  • めったにおきないケースではありますが、考慮がもれているようです。今すぐ設計見直しをよろしくお願いします。

こういうことを考え実装してきたのだ。いろいろ考え始めるときりが無いぐらいいろいろある。どこかであきらめなければいけないのだが、ある程度満足したシステムを作りたいので、時間が許せば満足のいくシステム作りをするようにしているのではないだろうか。

これをやめるのだ。

結局満足いくシステムなんて絶対作ることはできない、とあきらめるのだ。しかし、あきらめていけないのは、顧客の要望を実現したアプリケーションを要求期間内で稼動に持っていくことだけだ。それ以外はすべて必要ないのだ。

もちろん、将来性や拡張性を考慮し、高い品質で障害に強いアプリケーションを作ることができればそれは最高だが、そんなものはできないのだ。ならば、まずは絶対に譲れない機能と守らなければいけない期間のみ守り、品質や将来性はすべて捨ててしまえばよいのだ。

ただ、こんなことを言っても納得する顧客はいないだろう。また、品質が低ければ、安定運用できず、それは大きな問題だ。なので、上記のような品質の低いアプリケーションは通常の納期の半分の期間で作り上げるのだ。

不可能だろうか。

いや、可能だ。このデスマーチプロジェクトの最後の追い込みはすごいものがあった。みんな、動かすことだけを考え、ソースのコピペもあれば、暫定対応のつもりのコードがそのまま生き残っていることもある。それでも動かすことだけを考えて作業をして、実際にリリースをすることができたわけだ。

ダメなのはこれが本当にリリースしなければいけない時期に行ったからなのだ。もし半分の期間で最低限のアプリが出来上がっていたら、あとはリファクタリングを残った期間にできる限り行い、可能な限りテストを繰り返すせば、自然と品質も固まっていく。このやり方なら、可能な限り品質を高め続けることができる。どこまでの品質を維持すべきかは難しい判断が必要だが、その回答は「期間の許す限り」が正解なのだ。

だいたい見えないアプリに対し、頭の中で考えすぎなのだ。まず作って動かして、問題があれば直せばよいのだ。そこが、

  • 良いものを作ろう。
  • 高い品質でお客様の満足を得よう。

なんて考えるから、設計の段階から十分に考えすぎ、時間をロスしているのだ。また、高いスキルが必要となってしまうのだ。頭の良い人だけで十分考え、想定どおりに進めばよいのだが、ほとんどの場合、想定どおりになんて行かない。そんな頭の良い人ばかりではないし、普通の頭の我々にとってはシステム開発は単純なレベルでは無くなっているのだ。

なので、

  • とにかく、早く動かす。

これ以外、考えず、コピペもOK、構成も変えられない、一箇所変えれば、すべてが台無しになるぐらいの低い品質でも、早く作成していれば、修正期間はたっぷりあるのだ。想像してほしい。何もないところで完璧に作成していこうとすることと、不完全でもすでに動くものがある場合、どちらが効率的に開発ができるだろうか。もちろん、フレームワークの導入などもリファクタリングの段階でも期間さえあればOKなはずだ。

ただ、「急がば回れ」な部分もあることはある。ただ、自分の周りを見ていると、高い品質を目指すばかりに、デスマーチに突入し、最終的には低い品質でOKとしていたり、開発自体が失敗しているプロジェクトを多く見る。それぐらいなら、まず品質を落としてでも、無駄なやり方でも動くものを早く作ることのほうが価値が高いのではないだろうか。そのことに気づいてほしいのだ。

そういえば、自分のチームも要求事項は山ほどあり、終わるわけがなかったのだが、期間を優先させ、ほとんどの機能を最低なレベルで抑えたため、予定通りの進捗を維持できたのだと思う。

一度、低い品質でも動くソフトウエア、ということを考えてはいかがだろうか。