ソフトウェア開発プロジェクトは、なぜ計画通りにいかないのか

ソフトウェア開発プロジェクトは、事前に入念に計画をしていても、その通りに進行しないことがほとんどです。また、顧客が最初に欲しいと言ったものと、顧客が本当に欲しかったものが違っていた、ということも多々あります。

ハードウェア開発プロジェクトは計画通りに進むことが期待されるのに、なぜ、ソフトウェア開発プロジェクトは計画通りにいかないのでしょうか。それは、ソフトウェアに携わっているものがいい加減だからではなく、ソフトウェア開発プロジェクトの本質が、ハードウェア開発プロジェクトのそれとは全く異なっているからなのです。

事前に全てを計画し、その通りに開発を進行させる方法を、ウォーターフォール開発方法(以下、ウォーターフォール)と言います。ウォーターフォールでは、開発の初めに、完成までの計画を全て立てます。事前に全てを計画するため、後になって慌てることもなく、最後まで開発がスムーズに進行できる、というのが狙いです。

このウォーターフォールは、以下の点から、ハードウェアの開発で有効的だとされています。

  • 少しでもパーツが組み合わないと、全てがやり直しになってしまうこともあるため、後に調整することが難しい。
  • 経験者なら、過去に似たような作業を、別のプロジェクトでも何度も経験している場合が多いため、どの作業にどれほどの時間がかかるのか、どのような障害が考えられるか、などということを、比較的正確に把握している。

それに対して、ソフトウェア開発プロジェクトのほとんどは、全く新しいものを生み出すプロジェクトです。既に発明されたものを、今度は違う場所に作って下さい、というようなプロジェクトはありません。既にあるものなら、そのプログラムをコピーして使えばいいだけの話だからです。

また、ソフトウェア業界では、前のプロジェクトでは新しいとされていた技術が、次のプロジェクトでは古いものとなっている、ということも珍しくありません。開発者は常に新しい技術を学び続け、新しい技術を取り入れつつ、開発を進める必要があります。

顧客も、まだ発明されていない、自分たちが見たことがないものを欲しているため、具体的にどのようなものが欲しいのか、実際に製品を目にするまで、上手くイメージできません。そのため、自分たちが欲しいと言ったものが、本当に欲しかったものとは違っていた、ということが起こります。

まだ誰も見たことがないものを、新しい技術を用いて作り出すため、どれほどの時間がかかるのか、どんな障害が待っているのか、そもそも本当に顧客はそれが欲しいのか、把握するのが難しいのです。そんな状態で入念に計画をしても、開発途中で、計画と現実にずれが生じてしまうのは必然と言えます。

では、ソフトウェアは、どのように開発をすればいいのでしょうか。計画が当てにならないどころか、そもそも顧客が本当に欲しいものも分かりません。そんな問題を解決するために発明されたのが、アジャイルソフトウェア開発方法(以下、アジャイル)です。

アジャイルは、十二の原則からなる、四つの価値から成り立っています。以下が、アジャイルの宣言文です。

私たちは、ソフトウェア開発の実践あるいは実践を手助けをする活動を通じて、よりよい開発方法を見つけだそうとしている。この活動を通して、私たちは以下の価値に至った。

プロセスやツールよりも個人と対話を、

包括的なドキュメントよりも動くソフトウェアを、

契約交渉よりも顧客との協調を、

計画に従うことよりも変化への対応を、

価値とする。すなわち、左記のことがらに価値があることを認めながらも、私たちは右記のことがらにより価値をおく。1

アジャイルは、ソフトウェアの柔軟性を活かした開発方法です。ソフトウェアでは、パーツが噛み合わなくても、よっぽど根本的な問題でない限り、少しの調整で直ります。そのため、長い期間の入念な計画は、あまり必要ありません。それよりも、開発に未知な部分が多いため、色々な変化にすぐに対応できることの方が大切なのです。

アジャイルを形にする手法の一つに、スクラムというものがあります。スクラムでは、一定期間の小さなプロジェクト(スプリント)を繰り返し行うことで、常に現実に適応し続け、着実に完成に近づいていきます。スプリントの期間は、プロジェクトによって異なりますが、二週間が一般的です。

もし、一つのスプリントに収まりきらない仕事があれば、その仕事を細分化し、別々の仕事として、複数のスプリントに分けます。スクラムでは、基本的に、仕事が細分化されていればいるほど良いとされています。それは、大きな仕事(数週間から数ヶ月で終わるもの)を見積もるよりも、小さな仕事(数時間や数日で終わるもの)を見積もる方が簡単だからです。そして、小さな仕事の集合体として大きな仕事を見ることで、より正確に見積りをすることができると考えます。

一つのスプリントは、大まかに、下記のような流れで進行します。

  1. このスプリントではどの仕事をするべきかを、チーム全員で、1時間から2時間ほどかけて計画します。
  2. 計画を実行に移します。
    • 毎日一度、チーム全員で15分ほどのミーティングをし、昨日何をしたか、今日何をするか、計画を実行に移す上で障害があるか、ということを報告し合います。
  3. 開発の進行具合を、このスプリントで完成されたものの実演と共に、顧客に報告します。
  4. このスプリントで、何がうまくいったか、何がうまくいかなかったか、また、次のスプリントから何か新しいことを始めるべきかを、チーム全員で一時間ほど話し合います(レトロスペクティブ)。

このような短いスプリントを繰り返し行うことによって、次のような利点を得られます。

  • チーム全員で、短い期間のことだけを計画することで:
    • 未知の部分が少なくなり、計画の精度が上がります。
    • 今はどの仕事をすることが重要なのか、ということを、チーム全員で考え、同時にチーム全員に伝えることができます。
  • 開発をスプリントごとに区切ることで、今やるべき仕事に集中できます。
  • 毎日状況を報告しあうことで:
    • チーム全員が、プロジェクトの状況を常に把握することができます。
    • 困っているチーム員がいれば、すぐに助けることができます。
  • 開発状況を、完成されたものの実演と共に、頻繁に顧客に報告することで:
    • 顧客が常に開発状況を把握することができます。
    • 製品が顧客の要望とずれている場合、すぐに軌道修正を行うことができるので、開発に無駄がなくなります。
    • 今はどの仕事を優先するべきか、ということを、顧客の意見をもとに、常に再評価できます。
  • レトロスペクティブを頻繁に行うことで:
    • チーム全員が、常に向上精神を持ち続けることができます。
    • うまくいっていることは、今後もやり続けることができます。
    • うまくいっていないことは、すぐに止めることができます。
    • 色々なアイデアが生まれやすくなります(試したアイデアがうまくいかなかったとしても、次のスプリントですぐに修正することができるため、リスクを最小限に抑えながら、様々なことを試せます)。

ソフトウェア開発プロジェクトのほとんどは、新しいものを発明するプロジェクトなため、未知の部分が多くなります。そのため、あまり計画が当てになりません。その問題を解決するために発明されたのが、アジャイルです。アジャイルは、計画よりも、適応能力に重きをおきます。

アジャイルを形にする手法の一つに、スクラムがあります。スクラムでは、二週間ほどの短い期間のプロジェクト(スプリント)を繰り返し行うことで、完成に近づいていきます。スプリントごとに、その都度、計画、製品、チームを現状に適応させていくことによって、高い向上心をもったチームで、顧客の要望にかなう製品を、無駄なく開発することができます。

<参考文献>

  1. 「アジャイルソフトウェア開発宣言」 http://www.agilemanifesto.org/iso/ja/ (参照2016年3月6日)

Shogo Wada

楽しさと実用性の両立が好き。プログラマー。