コードを書く前に設計を完成させるな

http://www.hyuki.com/d/200606.html#i20060616

思うに、ソフトウェアも、本も、想像以上に複雑で大きなものであり、人間が誤りなく全体の設計を前もって行うというのは不可能なのではないか。設計が不要だとか、コードがすべてだという気持ちはさらさらないけれど、「コードを書かずに行う設計には何かしら本質的な限界がある」とは言えそうだ。

テストのないコードの信頼性が低いように、コードのない設計の信頼性は低いのではないか。

よっぽどシンプルなコードでない限り、コードレビューしたところで、1発でコンパイルが通り、1発で完全に動作するということは無い。コードレビューするまえに何回もコンパイルしてるし、数回は実行してる。フィードバックがないと正しいコードはかけない。
設計も同じ。いくらレビューしたところで、コードを書き始める前に「設計完」ってしちゃうと、いざコードを書き始めてみると「あ、ここのこと考えてなかった」ってなっちゃう。

「設計・コーディング・テスト」をフェーズとして完全に分離するというのは、管理者が進捗管理をサボりたい(もしくは、能力がない)から言っているだけであって、そんな方法ではソフトウェアは作れない。プログラマは断固、フェーズの分離を拒否しなければならない。
「手戻りは悪いこと」ってのは、無理矢理フェーズを分離しようとして、コーディングをする前に設計書を完成させてレビューしようとするから。フェーズ移行にコストがかかるから手戻りが悪いことになっているのであって、最初からフェーズを分離しなければフィードバックは良いこと。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。