連載
NAgileで始める実践アジャイル開発

第3回 ソフトウェアの良い設計を行うコツ

NAgiler 黒石 高広 & 小井土 亨
2006/02/25
Page1 Page2 Page3

1. はじめに

Back Issue
1
.NET+アジャイルなら本当に幸せになれるのか?
2 ソフトウェア開発をシンプルにする考え方のコツ

 ソフトウェア開発ではこれまで、設計の重要性が繰り返し提言されてきた。良い設計ができれば、仕様を満たして正しく動作するだけでなく、理解や変更がしやすく、さらに再利用しやすいシステムとなる。逆に、そのようなシステムが実現できているのなら、それは良い設計であったといえるだろう。

 では、良い設計が実践できているかというと、できていないことの方が多いのではないだろうか。例えば以下のような状況を聞くことは決して少なくない。

良い設計が実践できていない例:

  • 不具合を修正してリリースしたら、その影響によりほかの個所で不具合が発生し収束に時間がかかった

  • ほぼ同じコードが複数個所に大量に存在するため、1つの目的の修正でも数多くの同じ修正が必要となった

  • 修正した場所と本来関係ない個所で問題が発生してしまった

  • 機能アップする場合、修正するより作り直す方が早かった

 それでは良い設計を実践し、このような状況に陥らないようにするにはどうすればよいのだろうか?

 本稿では、ソフトウェアの良い設計を行うコツについて「NAgileの視点」で考察する(NAgileについての概要は第1回の記事を参照されたい)。また、それを実践するためのテスト系のN*ツールの紹介と、その効果的な利用方法を解説する。

 以降の解説部分は、前回同様に会話形式の物語として話を進める。登場人物は以下の2人だ。なお本稿のサンプル・コードはすべてC#で記述している。

登場人物:
師匠:ナジャイラ師(マスター)(♂)
NAgiler(ナジャイラー=.NETにおけるアジャイル開発の実践者)。謎の多い人物。ちょっと偉そう。だが、実は弟子思い。
弟子:点網 滝(てんもう たき)(♀)
.NET開発者。ウォーターフォール型の開発を行っているが、アジャイル開発を明るく真摯(しんし)な態度で学ぼうとしている。
 
※ご注意 ……本稿の物語やそこで交わされる会話はすべてフィクションであり、実在の人物、団体などとは一切関係ありません。登場人物の役柄はストーリー上の設定であり、筆者や読者を代表するものではありません。あくまでフィクションとしてお読みください。

■■“NAgile”ではソフトウェアの設計はしなくてもよい!?■■

さっそくですが師匠、NAgileによるアジャイル開発では、プログラミングだけに集中して、設計は行わないと聞きましたが、これは本当なんですか?

それは、まったくの誤解だ。確かにアジャイル開発では、ウォーターフォール型の開発のように、開発ライフサイクル全体の前半に設計を集中的に行ったりはしない。だがアジャイル開発では、開発が継続される間、ずっと設計に投資するのだ。つまりNAgileでは設計がより重要視される。これは、開発期間中における仕様変更などのリスクを上手にコントロールするという考え方に基づいている。

ウォーターフォール型の開発では、後半の変更コストが増大するのを避けるため、できるだけ前半、できれば初期の段階で仕様を確定させ、後々に仕様の変更が発生しないようにします。これができなければ一人前のSEではないと教えられましたが、このやり方は間違っているんですか!?

 

必ずしも間違ってはいない。例えば開発の対象が明確で、仕様変更などのリスクがないケースなら、むしろそのやり方の方が有効だ。しかし現在では、そのようなシンプルな開発案件はほとんどない。なぜなら、顧客にとって高い価値を生むシステムというのは常に新しい挑戦であることがほとんどだからだ。そのようなシステムでは、未経験の仕様を決定せねばならないことも多く、当然ながらこれには多くのリスクが付きまとう。

 

要するにウォーターフォール型の設計スタイルが好ましいか、アジャイル開発型の設計スタイルを採用すべきかというのは、ケース・バイ・ケースであり、案件次第ということですね。

 

そのとおりだ。アジャイル開発では高いビジネス価値を生むシステムを対象としているので、ここでは仕様変更などのリスクの高いソフトウェア開発を対象として話を進める。

■■アジャイル開発が長期間の設計に投資する理由■■

それでは話を少し戻して、なぜアジャイル開発が長期にわたって設計に投資し続けるのかを説明する。ビジネスで競争力を付けるためには、新しい挑戦が必要になる。新しい挑戦には、未経験の領域が存在する。また、ビジネスの提供速度や顧客ニーズへの対応速度も重要な価値となる。これらを極限まで高めるために必要となるのが

「変化を受け入れる」

ことである。

   
!? ……何だか設計から話がずれてきている気がするのですが……。
   

そうではない。そもそも設計とは問題を解くことなので、あるのは唯一の正解ではなく、最適解にすぎない。状況が変われば問題も変わり、最適解も変わる。設計の本質は、変化を内在していることにある。変化を恐れていては、設計の本質を見極めることはできない。

 つまり、設計に対するプチ・パラダイム・シフトが必要だ。この極意を一言で言い表すならこうだ。

「日々設計を改善する」

 つまり、固定的設計ではなく、インクリメンタル設計を行う必要があるということだ。

■■NAgileにおける設計のコツ「インクリメンタル設計」■■

 この考え方は、特に未経験の領域に対するシステム開発においては合理的である。当然、未経験な領域に対する知識は、開発の初期段階では十分とはいえない。この状態で、十分な設計をすること自体にそもそも無理がある。

 建築理論家として著名なC・アレグザンダーは『まちづくりの新しい理論』の中で、

「あるものが全体として成長しているという時、その全体性こそが成長の絶え間ない創造者であり、起源であり、母体である。……中略……成長が始まった時点では、それがどのように展開するか予測できない」

と述べている。ビジネスを成長させることを命題とするとき、改善は避けて通れない重要な本質ということである。

はぁ……(さらに、離れてきている気が……)。で結局、具体的にはどうしたらよいのですか?

   

具体的には、「変更容易性」を設計の最優先指針とする。つまり、変更を予測した設計ではなく、現時点で求められている最もシンプルな方法で設計することだ。そして、必要に応じて再設計する。

   

再設計すると余計なコストが増えると思うのですが……。

   

確かに純粋に初めから再設計するとコストは増大する。しかしそれにも対処法がある。

 効果的な対処方法の1つが、「テスト容易性」(=テストできること)を設計時の指針とし、自動テストを作成するというものだ。設計段階で、「テスト対象は何か?」「利用方法はどうするか?」などを常に考えて、自動テストを作成する。このように自動テストを作成することで、変更することが簡単になるので、再設計時のコストを低減させられるのだ。

 ここで作成する良いテストの条件には、以下のようなものがある。

良いテストの条件:

  • テスト目的が明確である
  • テストを独立して実行できる
  • 繰り返し実行できる

 このような条件を満たしている良いテストは、以下のような「変更容易性」を高める効果があるので、良いテストを作ることが変更容易性のある設計への近道となる。

変更容易性:

  • クラスやメソッドが1つの機能を実現している
  • クラスやメソッドの独立度が高い
  • クラスやメソッドが、ほかのクラスやメソッドとの依存度が低い
  • 特定の環境への依存度が低い
 

なるほど。アジャイル開発での設計の考え方やコツが少し理解できました。アジャイル開発ではこの良いテストが設計書になるから、やはりアジャイル開発ではドキュメント・ベースの設計は行わないんですよね?

違う。アジャイル開発では、良いテストのテスト・コードを重要な設計ドキュメントの1つとするだけだ。当然、UMLを用いた設計ドキュメントなども必要に応じて作成する。これについては数日前に、井坂 十蔵氏から(「開発をもっと楽にするNAgileの基本思想 第1回 アジャイル開発ではドキュメントを書かないって本当?」で)聞いたはずだが……。

 ここで、良い設計の特性をまとめておく。

良い設計の特性:

  • 正確性
    → 仕様を正しく満たしていること。
  • 一貫性(統一性)
    → 設計上の個々の概念が首尾一貫して、ぶれがない。
  • 理解性
    → 設計結果が読みやすく理解しやすいこと。
  • 変更容易性
    → 機能強化などに伴う変更が容易であること。

 また、設計と実装の時間ギャップをできるだけ少なくすることも重要だ。少しテストを作成したら少し実装を行う、というリズムが大きな効果を生む。このリズムによって、設計を検証しながら確実に開発を進めることができ、「日々設計を改善する」が実践される。

設計という行為としてテストを利用する場合、必然的にテストをまず初めに作成することになる。テストファーストは、NAgileの最初の一歩である。そこで、次に良いテストを実現するための基礎ツールについて話す。

 

 INDEX
  NAgileで始める実践アジャイル開発
  第3回 ソフトウェアの良い設計を行うコツ
  1.NAgileにおける設計のコツ「インクリメンタル設計」
    2.テストファーストの基礎ツール
    3.データアクセス層でのテストファースト

インデックス・ページヘ  「NAgileで始める実践アジャイル開発」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間