以前の職場では、完全なウォータフォールをやっていたとは言い切れないのですが、基本的に設計→製造→テスト→リリースという1回の流れでやっていたため、どちらかと言うとウォータフォールだったと思っています。その職場では、コーディングを﹁製造﹂と読んでいました。当然、設計というのは﹁設計書を作る﹂ことによって行われることであり、その設計書に基づいてコードというアウトプットを行うわけですので、コーディングは﹁製造﹂と考えるのは当然だと思います。
アジャイル開発を始めて感じた違いは多くありましたが、その一つはコーディングの考え方の違いです。以下はXPのプラクティスです︵Wikipediaより︶。
●テスト駆動開発
●ペアプログラミング
●リファクタリング
●ソースコードの共同所有
●継続的インテグレーション
●YAGNI
これらの共通的な基本的な考え方は、﹁変えることを前提としている﹂という点です。私は製造業で働いたことが無いので想像なのですが、例えば車を作る際に変えられるのは設計段階ではないでしょうか。工場での組立工程で作るものを変えるのは困難ではないかと想像します。とすれば、変化できることを前提として考えるアジャイルは、コーディングを設計であると考えているのではないでしょうか。
以下の比較は、車の製造とソフトウェア︵アジャイル︶開発の比較図です。車の製造に関しては詳しくないので想像が入ってます︵すみません︶。
![f:id:tsuyok:20130321234908p:plain f:id:tsuyok:20130321234908p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuyok/20130321/20130321234908.png)
こう考えると、ウォータフォールは製造業の考え方に似ていると感じます。まさに製造工程はコーディング以降であり、基本的にそこに変更がある場合は設計から影響が出る、ということになります。
コーディングは﹁製造﹂だと考えるとうまくいかないと言いたいわけではありません。コーディングが﹁設計﹂だと考えた所でうまくいくかどうかとは別の話だと思います。ただひとつ言えるのは、この2つの考え方の違いで行動は大きく違ってくるという点です。そういう意味で、ウォータフォールとアジャイルでの考え方の違いというのは、こういう点にも現れているのではないかと感じます。
ただ、個人的には、例えば汎用機時代と比較するとソフトウェア開発は複雑になっている点、機能︵要件︶変更をする欲求や必要性が日常茶飯事である点を考慮すると、コーディングを設計と考えるほうが、私の携わっているプロジェクトでは合っていると感じています。アジャイル開発を始めると、やり方だけでなくその考え方の違いに驚くことが多くあります。長年開発をやって来ましたが、このような新しい発見をさせてもらえるのはとてもありがたいと感じます。
![f:id:tsuyok:20130321234908p:plain f:id:tsuyok:20130321234908p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuyok/20130321/20130321234908.png)
![f:id:tsuyok:20130321234912p:plain f:id:tsuyok:20130321234912p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuyok/20130321/20130321234912.png)