連載
|
|
1. はじめに
Back Issue
|
||||
|
ソフトウェア開発ではこれまで、設計の重要性が繰り返し提言されてきた。良い設計ができれば、仕様を満たして正しく動作するだけでなく、理解や変更がしやすく、さらに再利用しやすいシステムとなる。逆に、そのようなシステムが実現できているのなら、それは良い設計であったといえるだろう。
では、良い設計が実践できているかというと、できていないことの方が多いのではないだろうか。例えば以下のような状況を聞くことは決して少なくない。
|
それでは良い設計を実践し、このような状況に陥らないようにするにはどうすればよいのだろうか?
本稿では、ソフトウェアの良い設計を行うコツについて「NAgileの視点」で考察する(NAgileについての概要は第1回の記事を参照されたい)。また、それを実践するためのテスト系のN*ツールの紹介と、その効果的な利用方法を解説する。
以降の解説部分は、前回同様に会話形式の物語として話を進める。登場人物は以下の2人だ。なお本稿のサンプル・コードはすべてC#で記述している。
|
※ご注意 ……本稿の物語やそこで交わされる会話はすべてフィクションであり、実在の人物、団体などとは一切関係ありません。登場人物の役柄はストーリー上の設定であり、筆者や読者を代表するものではありません。あくまでフィクションとしてお読みください。 |
■■“NAgile”ではソフトウェアの設計はしなくてもよい!?■■
|
ウォーターフォール型の開発では、後半の変更コストが増大するのを避けるため、できるだけ前半、できれば初期の段階で仕様を確定させ、後々に仕様の変更が発生しないようにします。これができなければ一人前のSEではないと教えられましたが、このやり方は間違っているんですか!? |
|
必ずしも間違ってはいない。例えば開発の対象が明確で、仕様変更などのリスクがないケースなら、むしろそのやり方の方が有効だ。しかし現在では、そのようなシンプルな開発案件はほとんどない。なぜなら、顧客にとって高い価値を生むシステムというのは常に新しい挑戦であることがほとんどだからだ。そのようなシステムでは、未経験の仕様を決定せねばならないことも多く、当然ながらこれには多くのリスクが付きまとう。 |
|
要するにウォーターフォール型の設計スタイルが好ましいか、アジャイル開発型の設計スタイルを採用すべきかというのは、ケース・バイ・ケースであり、案件次第ということですね。 |
|
そのとおりだ。アジャイル開発では高いビジネス価値を生むシステムを対象としているので、ここでは仕様変更などのリスクの高いソフトウェア開発を対象として話を進める。 |
■■アジャイル開発が長期間の設計に投資する理由■■
それでは話を少し戻して、なぜアジャイル開発が長期にわたって設計に投資し続けるのかを説明する。ビジネスで競争力を付けるためには、新しい挑戦が必要になる。新しい挑戦には、未経験の領域が存在する。また、ビジネスの提供速度や顧客ニーズへの対応速度も重要な価値となる。これらを極限まで高めるために必要となるのが 「変化を受け入れる」 ことである。 |
|
!? ……何だか設計から話がずれてきている気がするのですが……。 | |
そうではない。そもそも設計とは問題を解くことなので、あるのは唯一の正解ではなく、最適解にすぎない。状況が変われば問題も変わり、最適解も変わる。設計の本質は、変化を内在していることにある。変化を恐れていては、設計の本質を見極めることはできない。 つまり、設計に対するプチ・パラダイム・シフトが必要だ。この極意を一言で言い表すならこうだ。 「日々設計を改善する」 つまり、固定的設計ではなく、インクリメンタル設計を行う必要があるということだ。 |
■■NAgileにおける設計のコツ「インクリメンタル設計」■■
この考え方は、特に未経験の領域に対するシステム開発においては合理的である。当然、未経験な領域に対する知識は、開発の初期段階では十分とはいえない。この状態で、十分な設計をすること自体にそもそも無理がある。
建築理論家として著名なC・アレグザンダーは『まちづくりの新しい理論』の中で、
|
と述べている。ビジネスを成長させることを命題とするとき、改善は避けて通れない重要な本質ということである。
はぁ……(さらに、離れてきている気が……)。で結局、具体的にはどうしたらよいのですか? |
|||||
具体的には、「変更容易性」を設計の最優先指針とする。つまり、変更を予測した設計ではなく、現時点で求められている最もシンプルな方法で設計することだ。そして、必要に応じて再設計する。 |
|||||
再設計すると余計なコストが増えると思うのですが……。 |
|||||
確かに純粋に初めから再設計するとコストは増大する。しかしそれにも対処法がある。 効果的な対処方法の1つが、「テスト容易性」(=テストできること)を設計時の指針とし、自動テストを作成するというものだ。設計段階で、「テスト対象は何か?」「利用方法はどうするか?」などを常に考えて、自動テストを作成する。このように自動テストを作成することで、変更することが簡単になるので、再設計時のコストを低減させられるのだ。 ここで作成する良いテストの条件には、以下のようなものがある。
このような条件を満たしている良いテストは、以下のような「変更容易性」を高める効果があるので、良いテストを作ることが変更容易性のある設計への近道となる。
|
|||||
なるほど。アジャイル開発での設計の考え方やコツが少し理解できました。アジャイル開発ではこの良いテストが設計書になるから、やはりアジャイル開発ではドキュメント・ベースの設計は行わないんですよね? |
|||||
違う。アジャイル開発では、良いテストのテスト・コードを重要な設計ドキュメントの1つとするだけだ。当然、UMLを用いた設計ドキュメントなども必要に応じて作成する。これについては数日前に、井坂 十蔵氏から(「開発をもっと楽にするNAgileの基本思想 第1回 アジャイル開発ではドキュメントを書かないって本当?」で)聞いたはずだが……。 ここで、良い設計の特性をまとめておく。
また、設計と実装の時間ギャップをできるだけ少なくすることも重要だ。少しテストを作成したら少し実装を行う、というリズムが大きな効果を生む。このリズムによって、設計を検証しながら確実に開発を進めることができ、「日々設計を改善する」が実践される。 |
|||||
設計という行為としてテストを利用する場合、必然的にテストをまず初めに作成することになる。テストファーストは、NAgileの最初の一歩である。そこで、次に良いテストを実現するための基礎ツールについて話す。 |
INDEX | ||
NAgileで始める実践アジャイル開発 | ||
第3回 ソフトウェアの良い設計を行うコツ | ||
1.NAgileにおける設計のコツ「インクリメンタル設計」 | ||
2.テストファーストの基礎ツール | ||
3.データアクセス層でのテストファースト | ||
「NAgileで始める実践アジャイル開発」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|