ウォーターフォールとアジャイルの違いについて考える。

TDDBC in Tokyo のUstを見て、ウォーターフォールとアジャイルの違いについて気づきがあったのでまとめてみる。ちなみに、僕は本当のアジャイル開発をやったことがないので、アジャイル開発に対する記述はイメージが大部分を占めていることを先に断っておく。

ちょっと前まで、僕はアジャイル開発を難しいものだと思っていた。ウォーターフォール開発でうまくできないのに、アジャイル開発でうまくできるはずがないとも。最近はちょっと、それは違うんじゃないかと思っていたけど、確信がなかった。けど、以下を見てそれは確信に変わった。

動作するきれいなコードを書くには

  • きれいな設計をしてそれをコードに落とし込む きれいな設計を追求するとコードを書くところに辿り着けない(完璧主義の呪い)
  • 動作するコードを書いて、それをきれいにしていく(リファクタリングしていく)という手法もある コードを書いてみて初めて気づくこともある。
前者はウォーターフォール開発、後者はアジャイル開発と置き換えるとイメージ沸きやすい。

念のため断っておくと、前者をウォーターフォールと見立てたのは僕の感想であって、TDDBCでそのような言葉は一切出ていない。ただ、そう捉えて差し支えないように思う。

ウォーターフォールとアジャイルの決定的な違い

ウォーターフォール開発とアジャイル開発の決定的な違いは、完成までのアプローチ方法にある。そんなの開発プロセスを見るだけでわかるけど、アプローチが違うということは、アジャイル開発の1サイクルを切り取ったらウォーターフォールのように設計・実装・テストが綺麗に分かれるわけではないということ。アジャイル開発では設計・実装・テストがほとんど同時進行的に進んでいく。と思う。(もちろん、ウォーターフォールを何度も繰り返すような方法論もあるとは思う)

ウォーターフォールができないとアジャイルができるわけがない、という幻想

アプローチが全く違うわけだから、ウォーターフォール開発でパフォーマンスを発揮できないエンジニアがアジャイルでパフォーマンスを発揮できたり、その逆も、というのは当然ありえる。

たとえば、今までウォーターフォール開発しか経験してこなかった人が、アジャイル開発で開発するのにはそれなりにリスクがある、というのは割と理解が得やすいと思う。逆に、今までアジャイル開発しかしてこなかった人がウォーターフォール開発をやるのも同様のリスクが存在すると考えられないだろうか。

つまり、「ウォーターフォールができないとアジャイルができるわけがない」は全くの幻想で、ウォーターフォールとアジャイルで求められるものは全く異なると考えるのが妥当だ。「アジャイルならできるけど、ウォーターフォールはできないよ」ってエンジニアも近い将来でてくると思う。(すでにいるかも?)

ウォーターフォールvsアジャイル

さて、将来開発手法はどう変化していくか、と考えると、ぶっちゃけウォーターフォール開発は過去の遺物になると思う。理由は2つ。

  1. 手戻りできないウォーターフォールは変化に弱い これだけ早いスピードでITが進化し続けていると、ウォーターフォール開発では変化のスピードについていけない。大規模開発になればなるほど、それは顕著になる。小規模開発でならウォーターフォールでも問題ないだろうけど、むしろアジャイルが小規模向きなのでウォーターフォールの生きる道は現状で大規模開発にしかない。ここで息の根を止められるとどうしようもない。
  2. クラウド化やプログラム言語・FWの進化によって開発コストはどんどん低くなる クラウド化やプログラム言語の進化によって開発コストは下がり、開発に数年を要するような大規模案件は今後どんどん減っていく。 開発規模が小さくなればなるほど、ウォーターフォールに比較してアジャイルの利点が目立っていくので、大規模開発自体がなくなるとウォーターフォール死亡。

もちろん、ウォーターフォールもまだ十数年は残っていくとも思う。なぜなら日本の開発現場がそれに対応できないからだ。アジャイル開発をやるためには、設計も出来てコードも書ける人材が必要だ。研修を2週間程度受けてJavaが書けることになったPGの出る幕はないし、コードの書けない自称SIerも邪魔なだけだ。だけど残念ながら、そういう人たちが仕事にありつけるほどにIT開発現場は人不足になっている。アジャイル開発に移行していくには、ウォーターフォール開発を続けていても幸せになれないと気づく必要があるけど、それにはもう少し時間がかかると思う。