知識なく実践するアジャイルはPANDA"Poor And No-Disciplined Agile"なのか?

はじまり

上記の様にアジャイルサムライ読書会(湯島道場)の道場主と門下生の方から意見が来ましたのでそれへの回答です。
長文なので、Twitterではなくblogに書いています。

知識なく実践するアジャイルはPANDA"Poor And No-Disciplined Agile"なのか?

よく学生の頃からプログラムでお金を稼いでいる人*1と話すと、アジャイルな開発について「そのアジャイルっていうやつ、いつも自分がやっているやり方に似てますね」と言われます。
彼らにアジャイルについて調べたりしていたのか?と聞くと、言葉として聞いたこともない(もしくは言葉だけは知っている)、でも自然と似たやり方でやってきましたと答えます。
確かに細かいやり方を聞いてみると、ScrumとかXPのやり方が全部入っているかと言うとそういうことはなく*2、その中の一部のやり方を実践しているというものでした。

子供のやり方

@ShiroKappaさんが上で小さな子供の例を出されているので、同じく小さな子供を例にして、説明しましょう。
小さな子供たちが公園の砂場で砂のお城を作ろうと思いました。
その時、小さな子供たちはまず最初に砂のお城の設計図を書き、それに誤字・脱字がないことを何回も確認してから砂のお城を作り始めるでしょうか?
殆どの場合、設計図を書かずに砂場にしゃがみ込んでせっせと砂のお城を作り始めるはずです。
また、プラスチック製のスコップを家から持ってくるのを忘れた際、「プラスチック製のスコップがないから砂のお城作れない!」と言って砂のお城を作るのをやめてしまうでしょうか?
殆どの場合、スコップがないけど、自分の手を使って砂を掘ればいいやと考えて、せっせと砂のお城を作り続けるはずです。

何故出来るのか?

何故小さな子供たちや学生の頃からプログラムでお金を稼いでいる人たちがアジャイルの知識を得ていないのにアジャイルなやり方をしているのかというと、アジャイルなやり方が特別なやり方ではなく、やり方の効率・能率を上げると自然とアジャイルさが上がってくる為です。

悲劇の要因は何?

そもそもの要因はそれまでやってきた開発のやり方にあります。
他の業界でもそうですが、日本のIT業界ではウォーターフォール開発でシステムを構築するのが大多数です。
ウォーターフォール開発は特徴として、フェーズが明確に分かれています。
この明確にフェーズが分かれていることから、よく設計だけをする人、コーディングだけをする人、テストだけをする人という具合に人を明確に分けることが日本では一般的です。

これが当然という知識で、アジャイルな開発をするとどうなるでしょうか?
アジャイル宣言の背後にある原則にある通り、「動くソフトウェアを、2-3週間から2-3ヶ月というできるだけ短い時間間隔でリリースします。」をウォーターフォール開発の知識で実践しようとすると、2-3週間をフェーズに分けて、人を変えていくことになりますが、そうすると単純計算で1つのフェーズが1週間もない状態になります。
そうすると、1週間未満で人が入れ替わることになりますが、ウォーターフォール開発ではそんな短期間で入れ替わることはないので、不慣れな環境に出来る量は減ってしまいます。
また、1週間未満で人を入れ替えない(=同じ人が全フェーズを対応する)ということも考えられますが、今度は設計だけをする人、コーディングだけをする人、テストだけをする人という具合に人を明確に分けて来たことで、設計だけをする人がコーディングやテストの対応をしなければいけなくなり、不慣れな環境に出来る量は減ってしまいます。
2-3ヶ月でリリースする場合は上記の様にならず、対応出来そうですが、アジャイルな開発で2-3ヶ月毎にリリースしますというと大抵の人が遅いと言ったり、感じるものなので、これまた難しいところです。
また「要求の変更はたとえ開発の後期であっても歓迎します。変化を味方につけることによって、お客様の競争力を引き上げます。」の原則に関しては殆どのウォーターフォール開発を生業にしていた人が絶対ムリ!と言います。
これはウォーターフォール開発でテストフェーズの際に、お客様から「実は○○の機能を××の機能に変えて欲しい」という要望が出た場合、その機能に関して設計フェーズから全部やり直しをすることになるので、追加費用を貰わないと対応出来ない為です。

他にもアジャイル宣言の背後にある原則を見ていくと、ウォーターフォール開発をしてきた人の前提からすると、対応出来ないものがあります。

何故悲劇が起こるのか?

ウォーターフォール開発は計画駆動開発(Plan-Driven)でも計画重視(Predictive Plannning)を基本としています。
計画重視(Predictive Planning)で成功するには計画通りに行ったかどうかです。
成功は事前に要求が明確であり、安定していることに依存します。
そこで要求を安定化させることに注力するアプローチをし、要求を早期に確定させるやり方もその中の一つです。

一方、アジャイルな開発は計画駆動開発(Plan-Driven)でも適応的計画(Adaptive Plannning)を基本としています。
計画重視(Predictive Planning)とは異なり、適応的計画(Adaptive Plannning)は要件の安定性に依存しない様にしています。
適応的計画(Adaptive Plannning)では詳細に計画するのは直近の少しだけであり、そこから学習をするというサイクルを繰り返し繰り返し行います。
6ヶ月後といった遠くの計画について、詳細に計画しません。
そうすることでユーザによって、要件が途中で変更しても影響範囲を最小限にするというアプローチをしています。

上記の様にウォーターフォール開発とアジャイルな開発では基本となる考えもアプローチも異なります。

では、ウォーターフォール開発の知識(常識)で、アジャイルな開発をやろうとするとどうなるでしょうか?
答えは自ずと分かると思います。

悲劇が起こっているのは、(アジャイルな開発の)知識が無い為ではなく、今までのやり方が通用するという知識でアジャイルな開発をやろうとしている為です。

最後に

Tweetを見ても分かると思いますが、私は何も知識を得ることが間違っていると言っているわけではありません。
知識を得るだけで実践しない言い訳をすることに疑問を呈しただけです。
私は知識を得ることだけと行動するだけのどちらかしか出来ない場合、後者を即決する人間です。

私はこの記事を見た皆さんが“考えるだけの天才”ではなく、“考えて行動する天才”であると信じております。

*1:アルバイト

*2:特にScrumのやり方を取り入れているところは滅多にありません