移動: トップ > ラボ > プログラミングのアイディア > スモールステップ開発
履歴:
統計:
目次:
このページの最終更新日: 2012/05/30
提案日: 2008/10/24

スモールステップ開発

概要

複雑な機能や大きな機能をうまく実装するために、スモールステップ開発といった開発方法を提案します。

スモールステップ開発は、はじめに最も機能を落とした最小限のソフトを作り、最小限のソフトが完成したら、落とした機能を1つずつ追加して、次第に拡大させながら最終的なソフトを完成させる、といったソフトの作り方のアイディアです。

スモールステップ開発では、実現したい機能を小さな機能に分けて、それらの機能を1つずつ段階的に実装します(スモールステップ化)。そのため、難しい機能が小さな機能に分割されて、より簡単な機能の組み合わせになり、容易に実装できるようになります。

背景

複雑な機能や大きな機能を実装するとき

ソフトを作り始める場面を考えます。何か実現したい機能があって、それを実現するためのソフトを作ろうと思います。何かソフトを作るとき、実現したい機能が簡単で規模が小さければ、その機能を思うままに実装しても、何も問題はありません。

しかし、実現したい機能が複雑になると、機能を思うままに実装できなくなってきます。どこからどのようにソフトを作ればよいのか分からなくなり、手が止まってしまうことがあります。複雑な機能は、頭の中だけで考えてパッと実装できるものではありません。複雑な機能をうまく実装できる方法が必要です。

一方、実現したい機能が大きくなると、一度にすべての機能を実装できなくなってきます。大きな機能を少しずつ部分的に実装していっても、なかなか全体が完成しません。完成しないままだと、目に見える成果が一向に上がらず、他人に進捗状況を説明するときに困ってしまいます。大きな機能でも、その都度成果が見えるように実装する方法が必要です。

そこで、複雑な機能や大きな機能をうまく実装するために、スモールステップ開発といった開発方法を提案するに至りました。

勉強方法

数学や物理など学校で学ぶ科目を勉強する方法の1つに、取り組む演習問題のレベルを自分が理解できる程度まで低くしてハードルを下げ、そこから少しずつレベルを上げて演習を繰り返すことで、スムーズに勉強を進める方法があります。レベルを少しずつ上げながら、小さなステップを繰り返し登ることで、はじめの頃は考えられなかったような問題が解けるようになります。

これと同じように、ソフト開発も、実装する機能を小さくしてハードルを下げ、実装の作業を簡単にしようと考えました。この小さなステップを繰り返す方法は、ソフト開発でも同様にうまく働くことが分かりました。これをベースに、実際どのような方法でソフト開発を進めればよいかを具体的に決めることで、スモールステップ開発が出来上がりました。

■何かアプリを作るとき、そのアプリでやりたいことをそのまま実装する。
■複雑/大きな機能を実装する場合の開発方法を提案
■勉強の方法の一つに、演習問題の1ステップを低くしてハードルを下げ、少しずつ出来るようになる方法がある。それと同じように、ソフト開発も実装の1ステップを小さくしてハードルを下げ、実装を簡単にする試み。同様にうまく働く。

どんなもの?

小さなステップずつ繰り返し追加実装する

方法文章
○「背景」からの流れを使わず、ここから読んでも分かるように新しく文章を書き始める。
○はじめに筆者が想像するその具体的な場面状況をまず読者に伝える。「~ときに/~の場合を考えます」のようなフレーズを使う。
○状況設定の後、そのアイディアがどんなものなのかを一言(最も短い例)で書く。「~といったアイディアです。」のようなフレーズを使う。限定しすぎたり不足があっても後の文章で修正できる。
○一言説明の後、アイディアの説明を1つの例に限定してそのシナリオ全部を書く。
取り残した部分、利点性質後で書く。

何かソフトを作るときに、はじめから高機能なソフトを目指さずに、はじめに最も機能を落とした最小限のソフトをなるべく早く完成させることを目指して、最小限のソフトが完成したら、落とした機能を1つずつ追加して、次第に拡大させながら最終的なソフトを完成させる、といったソフトの作り方のアイディアです。

この作り方をスモールステップ開発と呼ぶことにします。最小限のソフトに小さな機能を繰り返し追加することで、次第にソフトを完成させることから、小さなステップを何度も踏むイメージをスモールステップと表しています。

具体的な開発方法は?

スモールステップ開発は、簡単に表せば、次のようなステップを踏んで開発を進めます。

ステップ1. はじめに最も機能を落とした最小限のソフトを作る
ステップ2. ステップ1で作ったソフトに、小さな機能を1つだけ追加したソフトを作る
ステップ3. ステップ2で作ったソフトに、小さな機能を1つだけ追加したソフトを作る
...
 
ステップn. ステップ2以降を繰り返して、次第に機能を拡大させながら最終的なソフトを完成させる

以降では、これらのステップにしたがって具体的にソフトを作る様子を見ながら、スモールステップ開発とは、具体的にどのようにしてソフトを作る方法なのかを説明します。ここでは作成するソフトの例として、卓上型の計算機アプリケーションを作る場合を考えます。

どんなアプリを作るか考える

高機能な計算機アプリ [拡大]

まず、どんな計算機アプリを作りたいかを考えます。例えば、右の図にあるようなかなり高機能な計算機アプリを考えたとします。

このような高機能なソフトの作成を目指す場合でも、スモールステップ開発ではステップ1にあるとおり、はじめに最小限のソフトを作ります。はじめから実現したい機能すべてを実装するのではなく、一番基になる機能1つだけを実装します。

ステップ1の最小限のソフトを作ろうとすると、まずはじめに、先に思い描いた高機能なソフトから色々な機能を削ぎ落として、一番基になる最小の機能は何なのかを探す必要があります。

機能を分離して小さな機能に分ける

機能を分離 [拡大]

そこで、図の計算機アプリに含まれる色々な機能を分離して小さな機能に分けます。すると、例えば、図の[A]~[I]のように分けられます。[A]~[I]の機能は次のような内容になります。

[A] メニュー、別の計算機へ切り替え機能
[B] 計算履歴を式で表示する機能
[C] 計算結果の値を表示する機能
[D] 高度な関数(sin、log...)機能
[E] 値を記憶しておく機能
[F] リセット、ルート、逆数などの機能
[G] 整数を入力する機能
[H] 小数を入力する機能
[I] 四則演算、答えを出す機能

一番基になる最小の機能を決める

最小の機能[C]+[G]を実装した計算機アプリの完成イメージ [拡大]

機能が分離できたので、この中から一番基になる最小の機能を探します。何を最小の機能とすれば、ステップ1が実装しやすくなるか、といった観点から最小の機能を決めます。

ここでは、[C]+[G]を最小の機能と決めます。[C]+[G]を実装した完成イメージは、右の図のようになります。0~9の数字を入力してその値をただ表示するだけの機能です。この程度の大きさの機能であれば、ステップ1で簡単に実装できると考えました。最小の機能はアプリとして意味がなくても全く構いません。

しかし、最小の機能を何とするかは、その人の捉え方によってさまざまに異なります。例えば、最小の機能を[C]だけにすることも出来ます。この場合は、ゼロを表示するだけの非常に単純な機能になり、さらに簡単に実装できるようになります。一方で、最小の機能を[C]+[G]+[H]+[I]にすることも出来ます。この場合は、整数/小数の入力から四則演算までの大きな機能になり、一気に多くを実装する必要があります。

[C]だけを実装した計算機アプリの完成イメージ [拡大] [C]+[G]+[H]を実装した計算機アプリの完成イメージ [拡大]

もし、以前、計算機アプリに似たような機能を作った経験があるなら、最小の機能を[C]+[G]+[H]+[I]と決めても、ステップ1でスムーズに実装できると思います。反対に、計算機アプリをどう作るか見当も付かない場合は、最小の機能を[C]だけにして、ステップ1で[C]の実装に集中すればよいと思います。このようにして、ステップ1で簡単に実装できるか、といった観点から最小の機能を決めます。

実装の計画を立てる

最小の機能が決まれば、スモールステップ開発のステップ1へ進めますが、その前に全体の計画を立てておきます。計画では、先に分離した機能をどのような順番で実装するかを決めます。前述で決めた最小の機能を基にして、次にどの機能をどのような順で実装すれば、各ステップが実装しやすくなるか、といった観点から機能にある順番関係を見抜きます。

計算機アプリの例では、ステップ1で実装する最小の機能を[C]+[G]と決めました。これを基に、ステップ2で[A]~[I]のどの機能を追加実装すればよいかを考えます。[C]+[G]が整数を入力する機能なので、ステップ2では[H]の小数を入力する機能を追加すると決めます。数値の入力が完成したので、ステップ3で[I]の四則演算機能を追加すると決めます。

ステップ1で実装する最小の機能 [拡大] ステップ2で追加する機能 [拡大] ステップ3で追加する機能 [拡大]

[A]~[I]まですべての機能の実装順を決めると、例えば、次のような順番になります。

[C]+[G]→[H]→[I]→[F]→[E]→[D]→[B]→[A]

このようにして機能にある順番関係を見抜き、機能の実装順を決めていきます。順番を決めると、実装の計画表を書くことが出来ます。計画表では、どのステップでどの機能を実装するかを次のような表で表します。

ステップ [状態] 実装作業の内容
ステップ1 [未完] [C]+[G]の整数を入力して値を表示する機能を実装
ステップ2 [未完] [H]の小数を入力する機能を実装
ステップ3 [未完] [I]の四則演算、答えを出す機能を実装
ステップ4 [未完] [F]のリセット、ルート、逆数などの機能を実装
ステップ5 [未完] [E]の値を記憶しておく機能を実装
ステップ6 [未完] [D]の高度な関数(sin、log...)機能を実装
ステップ7 [未完] [B]の計算履歴を式で表示する機能を実装
ステップ8 [未完] [A]のメニュー、別の計算機へ切り替える機能を実装

この計画表を開発の中で使うことで、どのように開発が進んでいくか(工程)、全体としてどれぐらいステップがあるか(規模)、現在どこまで開発が完了しているか(進捗)、といった項目がいつも見えるようになります。

[状態]の項目は、まだ実装していないステップには[未完]、実装中のステップには[WIP]、実装が完了したステップには[完了]、といった状態を表す名前を書きます。

ステップ1を実装する

これまで、どんなアプリを作るか考えて、機能を小さく分離し、機能の実装順を決めて、実装の計画を立てました。ここまでは全て、ステップ1の実装を開始するための準備になります。ここまではまだ何もコードを実装せず、どのステップでどの機能を実装するか、といった実装の計画をずっと考えてきました。スモールステップ開発を行う場合は、コードを書く前にこれだけの項目を考える必要があります。

実装の計画が立てられれば、次にその計画に従ってステップ1を実装します。計画の際にステップ1で実装すると決めた最小の機能をここで実装して、最も機能を落とした最小限のソフトを作ります。

[C]+[G]の機能 [拡大]

計算機アプリの例では、ステップ1で[C]+[G]の整数を入力して値を表示する機能を実装します。右の図のようなソフトの完成を目指します。

[C]と[G]の実装は、例えば、まず[C]の表示部と[G]の数字ボタンのUIを作ります。数字ボタンが押されたら、その数字を内部の変数に入れて、表示部に数字を表示するコードを作ります。数字ボタンを1、2、3と押すと、表示部には1、12、123と表示させたいので、数字ボタンを押したら、10*0+1=1、10*1+2=12、10*12+3=123のように、10*[内部変数]+[入力数字]と計算するアルゴリズムを作ります。

ステップ1を実装し終わったら、そのソフトをテストするコードを作ります。必ずテストコードを作って動作を確認するところまで、ステップ1で行います。計算機アプリの例では、数字ボタンを押したら表示部に数字が正しく表示されるかをテストすればよいので、例えば、数字ボタンのクリックイベントに登録されたハンドラ関数を0から9まで順に呼び出して、表示部の値が0123456789となるかをチェックするテストコードを作ります。

このようにテストコードを作れば、何らかの実行可能なソフトが出来ます。実装したコードは必ず実行できるようにして、実行結果が確認できるようなソフトを作ります。この実行可能なソフト実行結果ステップ1の成果になります。これによって、ステップ1が完成したことを他人に説明できます。実行可能なソフトの挙動を見ることで、ステップ1とは何なのかを他人に説明できます。

ステップ1で機能を素早く実装できない場合は、機能が大きすぎです。計画の際にステップ1で実装すると決めた最小の機能が、まだ大きすぎたことが分かります。なので、この最小の機能をさらに小さく分離して、ステップ1では分離した機能のうちの1つだけを実装するように計画を変更します。

このようにステップ1で実装する機能は、その大きさや複雑さを十分落としたものにし、素早く実装できるようにします。ステップ1で機能をスムーズに実装できるかどうかは、計画の際にそのアプリの機能をどれだけ分離して、最小の機能をどれだけ簡素化するか、にかかっています。

計画の見直し

どんなによく計画してソフトを作っても、作っていくうちに、必ず始めの頃には思い付かなかったような機能が見つかることがあります。

計算機アプリの例では、はじめにアプリのGUIを思い浮かべながら計画を立てたので、例えば、キーボードから数字を入力する機能や、コピー&ペーストで数字を入力/出力する機能は、計画の時点では思い付きません。しかし、ステップ1を実装して、アプリを実際に使ってみると、キーボードから数字を入力したくなって、キーボード入力の機能に初めて気付くかもしれません。

一方で、ソフトを作っていくうちに、この機能は本当はこんな形で分離した方が良い、これらの機能は本当はこんな順番で実装した方が良い、と分かることがあります。ステップ1を実装して、具体的にコードの形にしてみて初めて機能の本質的な形が見え、上手な分離や効率的な実装順に気付くかもしれません。

そのため、ステップ1を実装した後に計画を見直し、必要であれば計画を修正します。ステップ1を実装してみて思い付いた機能があれば、計画表の中の適切な行に1行追加して機能を書き込みます。不必要と感じた機能があれば、別枠に実装を中止する機能の表を作ってそちらに項目を移します。

計画表では、不必要な機能であっても、消さずに内容を残しておきます。ずっと後になってから、やっぱり必要であったことが分かる場合があります。そのため、基本的に計画表の中から文字を消すことはせず、別表を作って項目を移すことで対応します。

ステップ1を実装してみて新しい機能の分離に気付けば、計画表の中の行を複数に分けて分離した機能に書き換えます。新しい実装の順番に気付けば、計画表の中の行を入れ替えて機能の実装順を変更します。

ステップ2を実装する

見直した計画に従ってステップ2を実装します。ステップ1で作ったソフトに、ステップ2で追加する機能を実装して、ソフトの機能を拡大させます。

[H]の機能 [拡大]

計算機アプリの例では、ステップ2で[H]の小数を入力する機能を実装します。右の図のようなソフトの完成を目指します。

[H]の実装は、例えば、ステップ1で作ったソフトに[H]の小数点ボタンのUIを追加します。小数点ボタンが押されたら、整数入力から小数入力へ切り替えるコードを作ります。小数入力に切り替わってから数字ボタンを1、2、3と押すと、表示部には0.1、0.12、0.123と表示させたいので、数字ボタンを押したら、0+0.1*1=0.1、0.1+0.01*2=0.12、0.12+0.001*3=0.123のように、[内部変数]+0.1^[入力回数]*[入力数字]と計算するアルゴリズムを作ります。

ステップ2の実装でも、ステップ1と同じ次の3点に注意して実装します。

  • ステップ2を実装し終わったら、実装した機能をテストするコードを作り、必ず実行して動作を確認する。
  • 実装したコードは必ず実行できるようにして、いつでも実行結果が確認できるようなソフトを作る。
  • ステップ2で実装する機能を小さく簡単にして、素早く実装できるように計画する。

計画の見直し

ステップ2を実装したら、計画を見直します。実装の毎に、計画を見直します。繰り返し計画を見直すことで、より良い計画へと近づけます。ステップ2でもステップ1と同じように、次に挙げる操作を行って計画表を見直します。

  • 思い付いた機能を計画表に追加
  • 不必要な機能を別表へ移動
  • 新しい機能の分離を計画表に書き込み
  • 新しい実装の順番へ計画表を入れ替え

ステップの実装と計画の見直しの繰り返し

ステップ3もステップ2と同じように、前のステップで作ったソフトに機能を追加実装して、計画を見直し、以降、ステップ3を追加実装→計画見直し→ステップ4を追加実装→計画見直し...のようにサイクルを繰り返します。

このようにして、各ステップを追加実装していくことで、次第に機能を拡大させながら最終的なソフトを完成させていきます。

開発方法のまとめ

計算機アプリの例に沿って、スモールステップの開発方法について説明してきました。最後に、細かい点を含めてもう一度、スモールステップ開発を次の表に整理します。スモールステップ開発は、次のようなステップを踏んで開発を進めます。

(考える) どんなアプリを作るか、完成をイメージする
(考える) 高機能なソフトから機能を分離して小さな機能に分ける
(考える) どの機能が一番基になるか、どの機能をどの順で実装するか、といった機能の順番関係を見抜く
(考える) 各ステップで追加する機能の内容、機能の追加順序を事前に計画する
ステップ1. はじめに最も機能を落とした最小限のソフトを作る
(考える) ステップ1を実装してみて、必要であれば今後の計画を見直す
ステップ2. ステップ1で作ったソフトに、小さな機能を1つだけ追加したソフトを作る
(考える) ステップ2を実装してみて、必要であれば今後の計画を見直す
ステップ3. ステップ2で作ったソフトに、小さな機能を1つだけ追加したソフトを作る
(考える) ステップ3を実装してみて、必要であれば今後の計画を見直す
...
 
ステップn. ステップ2以降を繰り返して、次第に機能を拡大させながら最終的なソフトを完成させる

[A]~[F]の機能の削ぎ落としを検討、ステップ1で実現する機能を決定実装順を決定→計画表を作成、ステップ1を実装→計画を再考...を繰り返し
■ スモールステップで開発する方法。はじめから高機能なアプリの作成を目指さず、はじめは最も機能を落とした、一番早く作成できるアプリの完成を目指す。早く作成できない場合は、機能を含めすぎ。アプリの実行を確認し終わってから次に進みます。落とした機能のうち1つを追加したアプリの完成を目指し(1つの機能の追加に集中する)、再度、アプリの実行を確認します。

■作りはじめは機能の数とレベルを十分落とすこと。はじめから高度なことが出来るアプリを目指さない。逆に、そのアプリの核となる機能だけにどれだけ絞りこめるか、そして機能のレベルをどれだけ低レベルに出来るか、にかかっている。
■作りはじめから実行できて結果が確認可能な全体を表すアプリを作ること。ある一部分の機能から作るのではなく、機能の数とレベルを十分落とした、最もトップレベルにあるアプリを作る。それを基に、落とした機能を付け足したり、機能のレベルを上げていき、完成へと近づけていく

■よく計画してソフトを作っていても必ず想定していなかった機能が出てくる...キーボードからの数字入力はどうする?、コピー&ペーストは?等...なので、実装→計画を再考...を繰り返しが必要
最後に思考ポイントを含めた開発方法の表を作る
どんなアプリを作るかイメージする→高機能なソフトから機能を小さく分離する→どの機能が一番基になるか、どの機能をどの順で実装するか、機能の順番関係を見抜く→各ステップでの機能追加の内容、機能の追加順を事前に計画する→実装を開始す

大切な6つのポイント

スモールステップ開発を行う上で大切になるポイントを次の表にまとめます。スモールステップ開発の持つ利点を効果的に得るためには、これらのポイントに注意します。

1. 最小限のソフトから作る
  ステップ1で一番最初に作るソフトは、最も機能をそぎ落とした最小限のソフトにします。最初のソフトには、実現したいことの中で最も核となる機能1つだけを実装します。核となる機能が大きい場合は、機能を分割して部分機能に解体し、その中で優先順位の最も高い部分機能1つだけを実装します。
2. 最小限のソフトを早く作る
  ステップ1で一番最初に作るソフトは、早く作って早く完成することを目指します。最小限の機能なので、早く作れるはずです。もし遅くなる場合は、追加する機能がまだ大きすぎです。さらに小さな機能へ分割して、素早く実装できるようにします。
3. 追加する機能は小さく分割する
  ステップ2以降では、事前に機能を小さく分割して、小さな機能を1つずつ追加するように十分計画します。1つのステップを小さくして(スモールステップ)、機能の追加を簡単にします。もし機能を追加している途中で複雑さを感じたら、まだ機能が大きすぎます。さらに小さな機能へ分割して、簡単なステップを複数回実装する形にします。
4. 小さな機能を早く追加する
  ステップ2以降でも、いつも早く作って早く完成することを目指します。小さな機能なので、早く追加できるはずです。もし遅くなる場合は、追加する機能がまだ大きすぎです。さらに小さな機能へ分割して、素早く追加できるステップを複数回実装する形にします。
5. 動作可能にしてから次のステップへ
  どのステップにおいても、次のステップに移る前に、必ず今のステップで動作可能なソフトを作ります。これによって、各ステップで動作可能なソフトが1つずつ完成します。期待通りの動作が得られるまでそのステップに留まり、必要なら前のステップで完成したソフトに立ち返ります。しっかり動作しないまま次のステップに移ると、原因究明がますます難しくなり、開発が破綻する原因になります。
6. 完全に完成させてから次のステップへ
  どのステップにおいても、次のステップに移る前に、必ず今のステップですべきことはすべて完成させておきます。中途半端になりがちなテストコードテスト結果の出力文章はきれいに直して完成させます。追加した機能のコメントはこのタイミングで付加します。次のステップに移ったら、前のステップのことなど絶対に面倒でやらなくなります。そのため、今のステップで出来ることは、今やっておく必要があります。

■大切なポイントを表化=最小から作る、いつも早く完成、いつも実行可能、小さな機能(ステップ)に分割、小さな機能を追加=だから早く完成できる

その他の効果的なポイント

上記の6つのポイント以外に、スモールステップ開発を行う上で、実施すると効果的なポイントを次の表にまとめます。以降で各項目の内容を詳しく説明します。

A. 各ステップでテストをする
B. 各ステップをフォルダで分ける
C. リファクタリングに1ステップを割く
D. 思い付いた便利な機能は実装しない
E. 始めから汎用化を考えない
F. 内容を表す図を描く
G. 計画表にマイルストーンを設定する
H. 計画表に書く内容
I. バグ表と見送り表を作る

A. 各ステップでテストをする

スモールステップ開発では1回のステップで1つの機能を追加しますが、1つの機能を追加し終わったら、その機能が正常に動作するかを確認するために必ずテストコードを作り、必ずテストを行うようにします。テストがうまくいくまでは、試行錯誤の汚いテストコードで構いません。代わりに、テストがうまくいったら、そこで終わらずに、テストコードをきれいに直して完成させます。

これによって、各ステップにはうまく動作するテストコードがそれぞれ完成し、各ステップは常に動作可能な状態になります。どのステップでも実際に実行して動作を確認でき、実行すれば正常にテストが動作して意味のある結果を見ることが出来ます。

正常に動作すれば、それだけでコードの価値がぐっと高まります。どのステップも正常に動作するので、過去のステップで作ったコードにもしっかり価値が残ります。テストコードがあれば、コードの動かし方や利用方法が分かり、他の用途へ再利用しやすくなります。常に動作可能なので、前までの全てのステップは確実に自分の成果として説明できます。それらが動作する様子や動作結果によって、進捗状況を他人に直ぐに説明できます。

B. 各ステップをフォルダで分ける

スモールステップ開発では1回のステップで1つの機能を追加し、どのステップでも動作可能な試作ソフトが完成します。この各ステップで作る試作ソフトとそのソースコード一式は、ステップごとにフォルダに分けて管理するようにします。1回のステップで1つのフォルダを作り、ステップを重ねるごとにフォルダの数が増えていきます。各フォルダには、そのステップで作った試作ソフトとソースコードがそれぞれ入っています。

前のステップが完成して新しいステップを作るときは、前のステップのフォルダを丸ごとコピーして、これを次の新しいステップのフォルダとします。フォルダの名前は、先頭に1から順に番号を振って、その後にそのステップで追加した機能を表す名前を付けます。例えば、「1 ○○機能を作成」、「2 ○○機能を追加」のようになります。もし適切なバージョン管理ソフトがあるなら、そちらの仕組みを使っても構いません。

これによって、開発の過程が履歴として記録され、開発の生い立ちが残ります。もし今のステップで機能追加に失敗した場合でも、保存されている1つ前のステップへ直ぐに立ち返ることが出来ます。バグがどうしても解決できない場合も、同様に立ち返り可能です。そのため、開発者は失敗を恐れず安心して機能追加に集中できます。

このように、各ステップでソースコードが丸ごと残るので、WinMerge等のテキスト比較ソフトを使えば、2ステップ間でコードがどのように変化したかが簡単に分かります。その変化の差分を見れば、そのステップで追加した機能に直結するコードが分かり、時間が経っても開発過程を理解できます。また、その差分を切り取ることで、その機能を実現するコードのみを簡単に抽出できます。

C. リファクタリングに1ステップを割く

リファクタリングをするときは、新しくリファクタリング用に1ステップを作って行います。1ステップの中で機能追加とリファクタリングを同時に行わずに、機能追加で1ステップ、リファクタリングで1ステップ、の2ステップに分けます。

そうしないと、リファクタリングに失敗したときに、機能追加が完成していた時点へ戻れなくなってしまいます。一度、機能追加が完成していたのに、その時点へ戻れなければ、損失になってしまいます。また、リファクタリングによってプログラムが動かなくなった場合に、その直前のコードがないと、以前の正常なコードと比較できず、原因の究明が難しくなります。

D. 思い付いた便利な機能は実装しない

ソフトを作っているときに、いろいろ便利な機能を思い付くかもしれません。アイディア豊富な開発者は、きっと、あんな機能があったら便利になる、こんな機能があったら面白い、とアイディアが尽きないかもしれません。しかし、それらは思い付くや否や直ぐに実装してはいけません

思い付いた便利な機能は、実装しない代わりにメモに残しておきます。このメモはとても貴重なものになります。ふとしたときに思い付くアイディアほど、いいアイディアが多いものです。後で見返した時に分かるように、要点をまとめてリスト化しておきます。しっかりメモに残すことで、実装したくなる気持ちをぐっとこらえ、実装はしません。

代わりに、ソフトの動作に不可欠な機能をまず実装して、ソフトの完成を第一に目指します。そうしないと、ソフトがいつまで経っても、未完成で中途半端なものに終わってしまいます。思い付いた便利な機能を、その都度実装していたら、なかなかソフトの開発が進まず、精神的に挫折してしまう危険が高くなります。

大抵の場合、思い付いた機能は、あれば便利だけど、あってもなくてもどちらでもよく、動作に必須ではありません。そのため、思い付いた機能は直ぐに実装せずに、必要不可欠な機能をまず第一に実装して、ソフトがとりあえず完成した後に、メモに残しておいた便利な機能をもう一度見返して、必要であれば実装します。

このようにすることで、開発がしっかり進んでいる実感が得られるようになります。また、ソフトをいち早く完成させることで、精神的に楽になります。

E. 始めから汎用化を考えない

今後の再利用を考えて、作成中のクラスや関数を汎用化して、もっと色々なデータが渡せるように拡張したり、それらを綺麗に整理してクラスライブラリを作ったりするかもしれません。しかし、ソフトの作り始めから、汎用化やライブラリ化を考えてはいけません

汎用化やライブラリ化を考えるときは、実際、ずっと後になってからで十分な場合がほとんどです。そのため、まずソフトの完成を第一に目指します。そして、ソフトが完成した後に、汎用化した方が良い場合は汎用化を考えます。

作り始めから汎用化を考え出すと、一向にソフトが完成しなくなってしまいます。汎用化は、今のクラスに便利な機能を追加してライブラリ化することなので、これは上記の「便利な機能を実装」することになり、良くありません。便利だけれど不必要な関数を実装するのに時間を取られて、一向に作業が進まなくなります。もし、途中で汎用化の良い案を思い付いたら、メモに残しておきます。

ソフトを作りながら汎用化を進めると、作業量が大幅に増えてしまいます。ソフトを作る途中で汎用化して綺麗に整理しても、ソフトを作っていたら必ず拡張が必要になり、せっかく整理した汎用化を崩して、その拡張を取り込んでから、また汎用化を綺麗に整理する、といった作業がずっと付きまとうことになり、作業量が大幅に増えます。なので、ソフトを作る作業汎用化する作業しっかり分離して考え、まずソフトを作る作業に集中して、ソフトが完成したら汎用化する作業に移ります。

作り始めからライブラリ化を考えても、どんなライブラリ構造がよいかは、そのソフトを何度も使ってみて初めて分かるものです。なので、まず初めにソフトを完成させる必要があります。もし、ソフトを作る途中でライブラリ構造の良い案が浮かんだら、メモに残しておきます。

F. 内容を表す図を描く

ソフトを作る作業の途中で、その作業の内容を表す図を頻繁に描くようにします。実行フロー図でもよいし、機能構成の図でも、データ構造の図でもよく、その内容を的確に表せる図を選びます。

図は無理に1つに収めようとせず、内容が多ければ、注目する点を変えて描くことで、複数の図に分けます。また、内容が多岐に渡り、1つの図で表せなければ、同じことを複数の異なる図法で描くことで、より自由に内容を表現します。

図に描き出さずに、頭の中のイメージだけを頼りにしていると、頭の中は自然によいところだけしか考えない傾向があります。そのため、図に描き出すことで、頭の中のモヤモヤした全容を明確にして、今どんな状況なのか、その実態をよりよく理解します。

作業しているその瞬間に描く図が、なによりその作業をもっとも的確に表します。そのため、作業が完了して時間が経ってからではなく、作業の最中になるべく合わせて図を描くようにします。これらの図は、後にドキュメントとしてまとめるときに大いに役立ちます。

G. 計画表にマイルストーンを設定する

スモールステップ開発では、どのステップでどの機能を実装するかを表にして計画表を作ります。このとき、実装するステップの数が20を超えるようなステップが多い場合には、項目が多すぎて計画表が見づらくなります。

そこで、いくつかのステップを区切りのよいところでまとめて、マイルストーンを設定します。マイルストーンはステップよりひと回り大きな単位の計画項目です。ステップといった小さな単位から、マイルストーンの大きな単位で計画表を捉えることで、項目が多すぎて見づらかった計画表を把握しやすくします。

H. 計画表に書く内容

スモールステップ開発の計画表には、どのステップでどの機能を実装するかをメインに書きますが、その他にも書いておくとよい項目があります。例えば、次の表にあるように、種類完了日コード行数を書き加えます。

   計画表
ステップ [状態] 種類 実装作業の内容 完了日 コード行数
ステップ1 [完了] アルゴ ○○機能を実装 2010/11/04 800
ステップ2 [完了] プログ ○○機能を実装 2010/11/07 1500
マイルストーン1 [完了] --- ○○機能を実装 2010/11/07 1500
ステップ3 [WIP] アルゴ ○○機能を実装    
ステップ4 [未完] アルゴ ○○機能を実装    
... ... ... ... ... ...

種類には、実装する作業がどのようなタイプになるかを書きます。例では、アルゴ(アルゴリズム)とプログ(プログラミング)の2種類を挙げています。アルゴは、例えば、ある方法でソートする機能や、数式に基づいてある計算をする機能など、アルゴリズムを実装するステップに付けます。一方、プログは、グラフを描画するフレームワークを作ったり、リファクタリングするなど、プログラミングに関係する機能を実装するステップに付けます。

計画表では、実装作業の内容を一列に並べるので、性質の異なる作業内容が混ざってしまいます。そのため、種類の項目を計画表に書くことで、作業内容の種類を明確に示し、実装内容を把握しやすくします。種類の項目は、アルゴリズム、プログラミングの他にも、テスト、レビュー、ドキュメント作成などが考えられます。

完了日は、そのステップで実装する作業が完了した日付を書きます。コード行数は、そのステップにある全てのソースコードの行数を書きます。コード行数の他にも、表に残しておくと良さそうなメトリクスがあれば、列に追加します。追加するメトリクスは、クラス数やテストケース数など、ツールを使って直ぐに計測できる数値にします。

完了日やコード行数を計画表に書くことで、開発の進捗状況を把握しやすくなります。また、今後の開発スピードや開発規模を大まかに見積もることが出来ます。

I. バグ表と見送り表を作る

スモールステップ開発では計画表を作ります。ここでさらに、計画表とは別の2つの表、バグ表見送り表を作って管理すると、より多くの効果を得られます。

バグ表には、次の表に挙げるように、発生したバグの内容とその原因/対策方法を書きます。バグに関する情報を記録に残すものです。

開発の中でバグが発生したら、まずバグの症状をバグ内容に追加します。次に、バグを直すためにコードを調べてバグの原因が分かったら、その原因を原因/対策にメモします。原因が分かれば対策方法も考えられるので、これによってバグが解決したら、最終的な対策方法を原因/対策に書き足します。同時に、完了日に日付を入れて、一連のバグ対策が完了します。

   バグ表
No. [状態] バグ内容 原因/対策 完了日
1 [完了] ○○で計算結果が一致しない  
      アルゴリズムの拡張に伴う初期値の設定を変更し忘れ。初期値を○○に変更して解消。 2010/11/02
2 [完了] ○○で計算結果がNull値になる  
      ○○の計算で値のチェックし忘れ。想定外の値になったら例外を出すように変更して対処。 2010/11/04
3 [WIP] ○○のときはじめに画面がちらつく  
      表示の順番に問題あり? 原因調査中。  
... ... ... ... ...

バグ表があれば、現在どんなバグがあるのかが一覧で分かります。多くのバグがあっても、忘れず全てに対応できます。また、原因/対策には、今後の開発で気を付けるべき点が残っていきます。将来、同じバグで悩まないように、気を付けるべき点を太字にして残します。

見送り表には、次の表に挙げるように、実装を計画していた機能の中で、今回は取りやめるものを書きます。実装を見送る機能の内容を記録に残すものです。

実装を計画する中で、いろいろな機能を考え付きます。開発を進める中で、あれば便利と思う機能を思い付くこともあります。しかし、開発期間や開発目的など、色々な事情でこれらの実装を見送る場合が多くあります。そんなとき、これらの実装を見送る機能は、見送り表に書いて記録に残します。

   見送り表
No. [状態] 機能の内容 予定
1 [中止] ○○機能 当面なし
2 [延期] ○○機能 次回のリリースへ延期
... ... ...  

見送り表があれば、折角思い付いた貴重なアイディアをしっかり記録に残すことが出来ます。また、開発が終了して時間が経った後でも、どの機能が未実装なのかが一覧で分かるので、以前の開発状況をよりよく把握できます。

■[ポイントの内容] + [それによってよくなる点] を記載する形式で
■そのステップで追加した機能を確認するためのテストコードを作る。各ステップでテストコードがそれぞれ出来る。実行可能とはこのテストが正常に動作して結果が見えること。テストがうまく動作するまでは適当な(柔軟な)テストコードでOK→テストがうまく動作したらそこで終わらずにテストコードをきれいに直して完成させる。 + [それによってよくなる点]
■各ステップで完成するプロトタイプアプリとソース一式はフォルダに分けてバージョン名を振り履歴として保存する。各ステップ間の変化がWinMerge等テキスト比較ソフトを使えば容易に分かる。その変更差分からコードの拡張部分が分かり時間が経っても理解しやすくなる。

■リファクタリングは1ステップを使って行う。1ステップの中で機能追加+リファクタリングとせずに、機能追加で1ステップ、その後リファクタリングに1ステップの、計2ステップ。機能追加で完成した時点に戻れなくなる。前回コードがないとリファクタリングでエラー担った場合、エラーを抽出できなくなる。
■アプリを作っているときに、いろいろ便利な機能を思いつくかもしれないが、それらは実装しないこと。思いついた機能はToDoメモに残しておき、アプリが動作に本当に必要な機能をまず実装していく。たぶん、思いついた機能は動作に必須ではない。アプリがある程度成熟したレベルになってから、もう一度これらの機能を見直し、リスト化して必要性から実装順序を決めて実装する。
■はじめから汎用化、クラスライブラリ化を考えないこと。ライブラリ化を考えるときはずっと後になってからで十分な場合が多い。なので、まずアプリの完成を目指せばよい。作りはじめからライブラリ化を考えると、一向に作業が進まなくなる。さらに、どんなライブラリの構造がよいかは、そのアプリを作って何度も使ってみて初めて分かるもの。もし、作っている最中によい案が浮かんだら、実装したくなる気持ちを殺して、コメントドキュメントに箇条書きでメモしておき、本当に必要になったときに再検討する + [それによってよくなる点]。
(上記の汎用化には、クラスに機能を実装していて、今は必要としていないけれど便利な関数を作って汎用的に使えるようにしたり。不必要な便利な関数を実装するのに時間を取られて、一向に進捗が進まなくなる。もし、作っている最中に案があれば、箇条書きでメモし必要になったときに再検討。)
■作業している途中で、その作業の内容を表す図を頻繁に描くこと。その作業のデータフロー図でもよいし、データ構造の図でも、実行フロー図でもよい。頭の中のイメージはしばしば、自然によいところだけしか考えない傾向があるが、図に出せば全容が分かる。作業しているその瞬間に描く図が、なによりそれをもっとも端的に表す。後からドキュメントにまとめようとするときに役立つ。
■計画表項目が多のい(20項目を超える)場合にマイルストーンを設定するとよい
■計画表に加えるとよい情報→完了日、バグリストなど

スモールステップ開発の利点

スモールステップ開発を使う利点を次の表にまとめます。以降で各項目の内容を詳しく説明します。

A. 難しい機能を簡単に実装できる
B. 変更内容を簡単に把握できる
C. 既にあるものに機能を追加する
D. 実行可能なアプリが完成する
E. 今何を実装しているのか分かる
F. 不確定要素の多い開発に役立つ
G. 1人でも実践できる

A. 難しい機能を簡単に実装できる

スモールステップ開発では、実現したい機能を小さな機能に分けて、それらの機能を1つずつ段階的に実装します(スモールステップ化)。そのため、難しい機能が小さな機能に分割されて、より簡単な機能の組み合わせになり、容易に実装できるようになります。難しい機能を一度に実装せず、小さな機能を1つずつ実装するので、実装の開始が楽になります。

スモールステップ開発では、一番基になる最小の機能を探して、はじめに実装する内容を計画します。そのため、難しい機能のレベルを極限まで落とすことが出来ます。ある部分を固定値にしたり、無視したりして、設定を具体化することで機能のレベルを落とします。本質と無関係な機能をとりあえず削ぎ落とすことで、考える範囲が狭まり、簡単に実装できるようになります。

B. 変更内容を簡単に把握できる

スモールステップ開発では、ステップごとにフォルダを作り、 各ステップで作るソースコード一式をフォルダに分けて管理します。そのため、2つのステップにあるソースコードをフリーの比較ツール(WinMergeなど)で比較すれば、変更箇所が色つきで表示されるので、簡単に変更内容を把握できます。

比較ツールの1つWinMergeを使うと、フォルダ間を比較したり、ファイル間を比較できます。フォルダ間の比較では、どのファイルに変更があるのかファイル単位で大まかに比較できます。ファイル間の比較では、ソースコードを1行単位で細かく比較できます。異なる箇所に色づけされるので、どの部分をどれぐらい変更したのかが一目で分かります。

ソースコード自体で変更部分を表すので、正確に変更内容を伝えられます。ドキュメントとソースコードが不一致になることもありません。また、スモールステップ開発の計画表を合わせて見れば、そのステップでどんな機能を実装したのかが分かります。

C. 既にあるものに機能を追加する

スモールステップ開発では、どのステップでも必ず何らかのソフトが完成します。そのため、前のステップで完成したソフトを基にして、次のステップで機能を追加実装すればよいだけになります。このように、前の完成物から次を作るので、実装が簡単になります。スクラッチから作るより、既にあるものに機能を追加する方が、考える範囲が狭まって実装が簡単になります。

一度に実装するのが難しい機能でも、機能を小さく分けて、前の完成物に1つずつ機能を追加することで、実装が簡単なまま難しい機能が実装できます。複数段のステップを使って簡単な実装を複数回行えば、難しい機能が簡単に実装できます。

D. 実行可能なアプリが完成する

スモールステップ開発では、どのステップでも何らかの実行可能なソフトが完成します。実行可能なので、ソフトを実際に使ってみることが出来ます。ソフトを実際に使ってみることで、それまでは気付かなかった改善点が分かることがあります。

実際にソフトの動作を見ることで、今まで頭の中だけで想像していた動作イメージが、はっきり分かるようになります。明確な動作イメージがあれば、次のステップを実装する際に役立ちます。

E. 今何を実装しているのか分かる

スモールステップ開発では、実装を開始する前に計画表を作ります。この計画表があるので、大規模な開発になっても、今何を実装しているのか、次は何を実装すればよいのかが常に分かります。実装に夢中になっても、計画表に立ち返ることで、自分の位置を見失うことはありません。また、自分だけではなく、他の人もこの計画表を見ることで、進捗状況を把握できます。

F. 不確定要素の多い開発に役立つ

スモールステップ開発は、研究段階のプロトタイプ開発のような、不確定要素の多い新規開発に役立ちます。スモールステップ開発では、1ステップを実装するごとに計画を見直し修正を加えられるので、開発途中のいかなる変更に柔軟に対応できます。そのため、実装してみないと分からないような不確定要素の多い開発に向いています。

一方で、内容が確定している開発にはスモールステップ開発でなく、ウォータフォール開発が向いています。内容が確定していれば、はじめにすべての開発計画を立てて計画を固定することが出来ます。また、計画を固定できるので、どこを誰が担当するかを大人数に割り振ることが出来ます。

G. 1人でも実践できる

スモールステップ開発は、1人からでも始められます。自分1人だけでも実践して効果を得ることが出来ます。なので、今何か開発をしていて、何らかの開発アプローチがほしいなら、スモールステップ開発を使ってみるのも選択肢の一つです。

[スモールステップで開発する利点]
■難しく見える機能がスモールステップ化で簡単に見えるようになる...難しい機能のレベルを極限まで落とせる(仮定条件をつけたり、設定を具体化したり)、本質と無関係な機能をとりあえず削ぎ落とせる
■コード自体で変更を訴えられる...ステップ間の2ファイルを比較ツールで色つき比較すれば変更箇所や変更内容が分かり、変更に関するドキュメントが減らせる
■前の完成物から次を作るので簡単...スクラッチから作るより既にあるものに少し追加する方が作業が平易→計算機の例: 始めの段階で、例えば、後に「()」の機能を追加することを考えてデータ構造を考え出すと、初期段階でも実装が難しくて出来なくなる←前に作ったベースがある、ということが大きな威力を持っている、一から作るなんで想像もできない
■どのステップでも、そこまでで何か実行可能なアプリが完成します。アプリを実際に使ってみることで、それまでは気付かなかった改善点がそこから分かることがある。高機能ではないが、途中で単純な計算機は完成するので、一応利用できるようになる←日常で役立てられる、成果が分かりやすい。
■計画表があるので、大規模でも今何を実装しているのか分かる、実装中に位置を見失うことはない

■フリーソフト開発など1~数人の小人数開発で役立つ、研究段階のプロトタイプ開発や不確定要素の多い新規開発に役立つ、大人数/確定した開発ではウォータフォール開発が向いている

スモールステップ開発の問題点

スモールステップ開発の問題点を次の表にまとめます。以降で各項目の内容を詳しく説明します。

A. 機能の分割に気付けない
B. 並行開発がしにくい
C. ソフトの規模が大きすぎると不向き

A. 機能の分割に気付けない

計画のときに機能の分割に気付けないと、スモールステップ開発の効果がなくなります。機能の分割は、計画する人の力に大いに頼っています。機能の分割は人にしか出来ない創造的な作業です。人の力に頼るので、誰でもすぐに計画できる、というわけには行きません。

実装する機能が複雑で難しいと、機能の分割に気付けず、1ステップが難しいままになり、実装できなくなる恐れがあります。実装する機能が大規模すぎると、分割した機能が爆発的に増えてしまい、機能をしっかり階層的に整理しないと、どこから実装すればよいか分からなくなる恐れがあります。

B. 並行開発がしにくい

スモールステップ開発は、ウォータフォール開発に比べて並行開発がしにくくなります。スモールステップ開発では、各ステップが逐次的に進む場合が多くあります。例えば、ステップ1で完成したコードをベースにして、ステップ2の機能を追加するような、ステップ1を実装しないとステップ2を実装できない場合です。このように、逐次的に進むステップ1とステップ2は、並行して開発できません。

さらに、スモールステップ開発では、ステップごとに計画を見直して修正します。そのため、今実装しているステップ以降の計画が確定しません。計画が不確定なので、前段と後段のステップを分けて並行開発するのが難しくなります。並行開発しても、前段で計画を変更すると、後段の開発に影響が渡って、変更の対応に多くの時間が取られてしまう恐れがあります。

C. ソフトの規模が大きすぎると不向き

ソフトの規模が大きくて、実装するステップが多すぎると、一向に完成しません。一向に完成が見えないと、途中で精神的に止めたくなる恐れがあります。いくつかマイルストーンを設けて規模を分割し、完成までを近づける錯覚が必要です。

ソフトの規模が大きくて、完成までに時間が掛かると、全体を覚えていられなくなります。各ステップで追加する機能を忘れてしまう恐れがあります。忘れないように、計画表に機能の内容を書きますが、どれだけ書き残しても完全には伝わりません。昔に追加しようと思い描いていた機能のイメージを忘れてしまう恐れがあります。

[問題点]
□計画時に複雑で難しい機能→作り方が分からない=機能分割に気づかない、機能の分割はその人の力に頼っている/計画時に大規模すぎて→どこから実装すればよいか分からない
□ウォータフォール開発に比べて並行開発がしにくい。理由: 各ステップが逐次的に進む(ステップ1を実装しないとステップ2を実装できない)ので。今実装しているステップ以降の計画が確定しない(毎回計画を見直す)ので。
□ステップが多すぎて→一向に完成しない、全体動作が見えない、実装中でない他の機能のToDoを忘れてしまう、一向に完成が見えなくて精神的に止めたくなる/時間がかかると→全体を覚えていられなくなる、昔のToDoイメージを忘れてしまう=どれだけメモしても完全には伝わらない

「分離」による簡単化のアプローチ

スモールステップ開発は「分離」によって作業を簡単化するアプローチを採ります。1回のステップで追加する機能の大きさをなるべく小さくして、各ステップで行う作業のレベルを落とし、難易度のハードルを下げます。

実現したい機能全体をなるべく小さな機能に分離することで、1回のステップで扱う範囲を狭めて、小さな機能1つ1つの追加に集中し、実装の作業を簡単にします。スモールステップ開発は、分離によって範囲が狭まり作業が簡単化する、といった「分離の利点を活しています。

スモールステップ開発は「分離」によって作業を簡単化するアプローチを採ります。1回のサイクルで追加する機能の大きさをなるべく小さくして、各サイクルで行う作業のレベル/ハードルを下げます。実現したい機能全体からなるべく小さな機能分離することで、1回のサイクルで扱う範囲をなるべく狭めて、小さな機能の追加に集中し、機能追加を簡単にします。分離によって、集中する範囲が狭まり、作業が簡単になる、といった「分離」のアプローチが本質にある。

世の中の似た機能

反復型開発

1970年頃に登場した反復型開発(Iterative and Incremental Development)と呼ばれる開発方法があります。スモールステップ開発のベースとなるものです。スモールステップ開発は基本的に反復型開発と同じ発想、同じ方向性を持ちます。

反復型開発は、差分開発、プロトタイプ型開発、スパイラルモデル(サイクルを回して小さな機能を順次追加し次第に大きくしていく)とも呼ばれます。しかし、反復型開発と言ってもかなり一般的な言葉で、具体的に開発の中で実践しようとしても、実際にどうするのかがはっきり決まっておらず、かなかな直ぐに実践できません。

そのため、スモールステップ開発は、反復型開発をベースにして、どのように開発するかをより具体的に決めて、それによって何がよくなるかを明確に考えたものです。スモールステップ開発は、直ぐに実践できるようにやり方を明確に示します。

UNIXの思想

UNIXの開発思想の1つに、「なるべく早くプロトタイプを作る」という言葉があります。これは、スモールステップ開発のポイントの1つにある、「各ステップで機能を素早く実装して、何らかの実行可能なソフトを作り上げる」といった点に通ずるところがあります。素早く実行可能なソフトを試作すれば、早くプロトタイプを作ることになります。

■1970年~のIterative and Incremental Development=反復型開発、差分開発、プロトタイプ型開発、スパイラルモデル(サイクルを回して小さな機能を順次追加し次第に大きくしていく)と同じ発想、すでに存在する考え方であった、ウォータフォール開発と対になる
■なるべく早くプロトタイプを作る by UNIX

アジャイル開発

1990年代半ば頃に形成されたアジャイル開発(Agile software development)と呼ばれる開発方法があります。アジャイル開発は、開発を反復させる方法や反復の期間など、より具体的にやり方を定義した、反復型開発の1つと言えます1)

アジャイル開発と同じように、スモールステップ開発も反復をベースにします。そのため、多くの点でやり方や考え方が似ています。アジャイル開発とスモールステップ開発の間で似ている点を次に挙げます。

1. アジャイル開発は、数週間から数ヶ月の短めの期間で頻繁に実用的なソフトウェアをリリースする
  スモールステップ開発でも、各ステップごとに実行可能なソフトを作ります。各ステップをなるべく早く実装できるように計画するので、短めの期間で各ステップが実装されます。
2. アジャイル開発は、開発全体を細かい反復に分割し、その期間中に開発~テストまでを完了させる
  スモールステップ開発でも、全体を小さな機能に分けて、1つずつ機能を追加します。1ステップで1機能を追加します。それぞれのステップで、機能の実装からテストコードの作成、テスト、正常な動作の確認までを行います。
3. アジャイル開発は、最初に重要な機能をコアとして作成し、次に重要とされる機能を追加拡張していくような開発スタイルが基本
  スモールステップ開発でも、はじめのステップ1で一番基になる最小の機能を実装し、次ステップから1つずつ機能を追加します。機能の追加を繰り返すことで、次第にソフトを拡張していくスタイルです。
4. アジャイル開発は、計画を立ててから実装する
  スモールステップ開発でも、実装する前に計画を立てて、計画表を作ります。どの機能をどのような順で実装するかを計画表にまとめます。
5. ソフトウェア開発において、重要かつ難しい作業の1つが「計画」を立てること
  スモールステップ開発では、計画のときに機能を分割します。機能の分割は、計画する人の力に大いに頼っています。機能の分割は人にしか出来ない創造的な作業で、誰でも出来るわけではない難しい作業です。
6. ストーリーバックログ=「ストーリー」と呼ばれる簡易な機能の記述をリスト化したものであり、アジャイル開発における作業管理の中心ドキュメント(XP開発での名称2))
  スモールステップ開発では、計画表を作ります。計画表には、各ステップで実装する機能の内容がリスト化されてあります。ステップ番号、状態、実装する機能の内容、の3列で表を作ります。「状態」列を見ることで、進捗を把握します。
7. アジャイル開発では、動くソフトウェアが一番の進捗把握である
  スモールステップ開発でも、各ステップごとに必ず実行できるようにして、結果が確認できるようなソフトを作ります。この実行可能なソフトと実行結果をそのステップの成果とします。これによって、ステップが完成したことを他人に説明します。
8. アジャイル開発では、シンプルさ、つまり仕事を多くしないことがポイントである
  スモールステップ開発では、思い付いた便利な機能は実装しないようにします。代わりに、ソフトの動作に不可欠な機能をまず実装して、ソフトの完成を第一に目指します。余分なことはせず、シンプルに考えて完成を急ぎます。
9. YAGNI「You Aren't Going to Need It」=いま必要なことだけを行なう。必要な機能だけのシンプルな実装に止める。将来を見越して余分なことはしない。
  スモールステップ開発では、思い付いた機能は直ぐに実装せずに、必要不可欠な機能をまず第一に実装して、ソフトがとりあえず完成した後にもう一度見返して、必要であれば実装します。
10. アジャイル開発は、仕様がなかなか固定できない
  スモールステップ開発でも、ソフトがどのような機能を持つか、どのようなデータ構造でどのように処理するかなどの仕様を固定できません。その都度、計画を見直して修正するので、将来変更になる可能性が十分にあります。この点は、2つの開発方法にある共通の欠点です。

一方で、アジャイル開発とやり方や考え方が違う部分があります。アジャイル開発とスモールステップ開発の間で違う点を次に挙げます。

1. スモールステップ開発は、1回の反復で1つの機能を実装
  スモールステップ開発では、1回の反復で1つの機能を実装します。1回の反復は1つの機能を追加する1ステップになり、反復を機能で区切ります。一方、アジャイル開発は、反復をある一定の期間で区切ります。
2. スモールステップ開発は、機能の分離に注力する
  スモールステップ開発では、計画のときにいかに機能を分離するかが非常に大切です。機能の分離に気付けないと、スモールステップ開発の効果がなくなります。一方、アジャイル開発では特にこの点に注目しません。
3. スモールステップ開発では、小さなステップを繰り返し実装することで、簡単に開発を進める
  スモールステップ開発では、簡単に開発を進めるために、1ステップで追加する機能を小さくして、実装の難しさをなるべく下げる方法を採ります。小さなステップを繰り返すことで開発を簡単にします。一方、アジャイル開発では、開発を簡単にする方法は特に提案されません。
4.  スモールステップ開発では、ミーティング/ステークホルダなどは考慮しない
  スモールステップ開発では、ミーティングの方法やステークホルダとの関わりなどは特に考慮しません。一方、アジャイル開発では、この点が大きなポイントの一つとして詳しく提案されています。
5. フリーソフト開発などの1人で開発する場合でも十分役立つ
  スモールステップ開発では、1人で開発する場合もチームで開発する場合も特に区別していないので、1人だけで開発を進める場合でも適用できます。そして、十分な効果を得られます。一方、アジャイル開発は、チーム開発の話が中心となります。

アジャイル開発: http://codezine.jp/article/detail/5459 → XP: http://codezine.jp/article/detail/5462
+ 数週間から数ヶ月の短めの期間で頻繁に実用的なソフトウェアをリリースする
+ 開発全体を細かい反復(イテレーション)に分割し、その期間中に開発~テストまでを完了させる(テスト駆動型開発
+ アジャイル開発は、最初に重要な機能をコアとして作成し、次に重要とされる機能を追加拡張していくような開発スタイルが基本
+ アジャイル開発では、実際には計画を立ててから実装します。
+ ソフトウェア開発において、重要かつ難しい作業の1つが「計画」です。
+ (XP固有2))ストーリーバックログ :「ストーリー」と呼ばれる簡易な機能の記述をリスト化したものであり、アジャイル開発における作業管理の中心ドキュメント
+ 動くソフトウェアが一番の進捗把握である
+ シンプルさ、つまり仕事を多くしないことがポイントである
+ YAGNI「You Aren't Going to Need It」の略。いま必要なことだけを行なう。必要な機能だけのシンプルな実装に止める。将来を見越して余分なことはしない。
+ 仕様FIXがなかなかできません(共通の欠点)
■相違点 :

+ 反復を1機能の実装として捉える、反復1回が機能追加の1ステップ⇔反復を期間で捉える。
+ 機能の分離に注力する⇔アジャイル開発ではこの点に注目しない。
+ 簡単に実装を進める戦略として、1ステップで追加する機能を小さくして実装の難しさをなるべく下げる、スモールなステップで簡単に⇔アジャイル開発で簡単にする方法は考えていない。
+ 早くプロトタイプを作るための具体的な方法を提供する。
+ ミーティングの方法やステークホルダとの関わり等は含めない⇔この点はアジャイル開発の大きなポイントの一つ。
+ フリーソフト開発などの1人で開発する場合でも十分に適用可能/役立つ⇔アジャイル開発はチーム開発の話がメイン

参考

1) http://codezine.jp/article/detail/5459
2) http://codezine.jp/article/detail/5462

 

更新履歴
2010/06/22
  • 書き始め
2010/11/15 v1
  • 初版作成

※ご意見、ご感想、改善点、その他の情報などがありましたら、メールにてお知らせ願います。

Copyright (C) 2002 - 2019 Simon.P.G. All Rights Reserved. Top | Simon.P.G. とは | 使用条件 | ご意見
inserted by FC2 system