システム開発では「上流工程」という言葉をよく見かけます。ただ、エンジニアであっても、意外なほど漠然と使っていることも多いようです。
そもそも上流工程とは何なのか、各段階の概要と、下流工程とどのように連動しているのかについて、まとめてみました。
「V字モデル」、「アジャイル開発」それぞれでの考え方をご紹介します。
- もくじ
1.システム開発における「上流工程」とは
システム開発における「上流工程」とは、開発を始める前段階の、企画から設計に相当する工程のことを指しています。
そのため、おろそかな上流工程は、開発工程全体でのスケジュールの遅延やコード(ソフトウェア)品質の低下などトラブルの原因となります。特に、大規模なシステムの開発では、上流工程にて設計をしっかりと行う必要があるとされています。
ここからは、V字モデルを基に、上流工程について考えていきます。
V字モデル
まず、V字モデルとは左側を上流工程(設計・開発)、右側を下流工程(テスト・検証)とする考え方が一般的で、図にすると上記のようになります。
これは、ウォーターフォール型開発モデルを「実装」段階をポイントとして、前後に(V字形として)上流工程と下流工程を配置したものです。
上流工程はいくつかの段階に分けられます。その分け方について、いくつかの考え方がありますが、今回の記事では工程の時系列順に「要求定義」「基本設計」「詳細設計」「実装」の4つに分けています。
一方、下流工程は、上流工程の各段階と各テストを関連付けて考えます。「単体テスト」では詳細設計の内容を確認しつつモジュール単位で作成したコードをテストし、「結合テスト」では基本設計の内容を確認し、「システムテスト」では要求定義の内容を確認するということです。
V字モデルでの品質管理の基本的な考え方として、‟フェーズ単位で品質を作り込む"というものがあります。
言い方を変えると、不具合を次工程に送らないようにレビューやテストを行うことが重要ということです。
「上流工程」「下流工程」「V字モデル」といった考え方は、システム開発のさまざまな手法が発達する中で生まれたものです。
2.「上流工程」に対する「下流工程」について
下流工程とは
下流工程とは、実装が終わったものを徐々に結合しながらテストを行っていく工程です。
下流工程もいくつかのフェーズに分かれており、モジュールごとに実施される「単体テスト」、各モジュールを統合して実施される「結合テスト」、システム全体を対象に行われる「システムテスト」、そして(図にはありませんが)実際の業務運用に即した検証を行う「運用テスト」などがあります。
テストの結果に基づいて修正されたコードは再度テストにかけられ、各段階のテストをクリアできるまで繰り返されます。
すべてのテストで問題がなければ、晴れて新しいシステムの運用開始へと至ります。
上流工程に問題があると下流工程はどのような影響をうけるのか?
上流工程では、「設計からシステムを構成する各機能やモジュールのプログラミングまで」を、
下流工程では、「それら開発されたモジュールや機能が、正しく機能するかについて、単体テストからシステムテストまで」を行います。
下流工程でテストを行うことで、上流工程で開発されたモジュール単体や各機能の不具合、それらをシステムに組み込んだ後の不具合(スムーズな運用ができないなど)を洗い出すことができます。
しかし、上流工程に問題が多いと、下流工程やシステム自体の品質に悪影響を与えてしまいます。
例えば、完成したシステムに顧客から要望のあったモジュールや機能が組み込まれていなければ、顧客からクレームが来ます。
また、顧客からの要望をシステム開発に落とし込む要件定義に不備があれば、基本設計がやり直しになり、結果としてスケジュールの遅れが発生し、それを挽回するためのコストが増加することに繋がります。
さらに、スケジュールが遅れた結果、下流工程で十分なテストが行えなくなり、システムトラブルや品質の低下を招く恐れもあります。
このようなシステムでは、顧客企業の満足度も低くなりますし、開発ベンダーへの信頼や評判も低下し、win-winならぬlose-loseという結果になりかねません。
つまり、上流工程での抜け漏れは、スケジュールの遅延を招くだけでなく、下流工程でのテストの不足(抜け漏れ)、さらには顧客の満足度低下につながっていきます。
「いかに上流工程で品質を高めるか」が重要です。
3.V字モデルで見る「上流工程」の各段階
それではV字モデルでのシステム開発「上流工程」の各段階について見て行きます。
(1)要求定義
システム開発の最初の段階が「要求定義」で、前掲のV字モデルでは左側最上段に配置されます。
要求定義は開発するシステムに求められるクライアント側の要求やシステムで実現したいことをまとめたものです。
具体的には「現状の課題」「目標とする状態」「実現するために必要なシステム(機能)」を想定し、具体的なシステムや機能の概要を決めます。
そして開発側がクライアントニーズとしての要求定義に基づき、開発するシステムでどう実現するのか、顧客企業などクライアントや利用する対象となるエンドユーザーがどのようなことをしたいのかといった観点から、システムとしてどのようなものが必要なのかを要件定義として整理します。
顧客によっては「何を実現したいのか?」が明確になっていない場合もあります。
そのような場合には、開発ベンダーとも協力して必要な機能を洗い出す必要があります。
なお、本記事で使用しているV字モデルでは「要件定義」は独立した項目として扱っておらず、「要求定義」の中において一括で処理される流れになっています。
V字モデルで上流工程の「要求定義」に対応する下流工程は「システムテスト」になり、ここではその設計が推奨されます。
(2)基本設計(機能設計・外部設計)
「基本設計」は、前段階のクライアントやユーザーニーズから作成された要求定義を反映した要件定義を前提として、開発するシステムに実装する機能を設計するものです。
この設計作業は、システムを構築するための要素としてプログラミング言語やデータベースといった幅広い領域の知識、そして実際のビジネスの知識が必要となります。
「基本設計」は、要件定義の成果を元に画面や帳票といったユーザーインターフェイスの設計に相当します。
基本設計の良し悪しはソフトウェアの品質に直結するため、重要な工程です。そのため、基本設計を成功させるためには顧客とのコミュニケーションが大切になってきます。
なお、「基本設計」は「機能設計」や「外部設計」と呼ばれる場合があります。
V字モデルで上流工程の「基本設計」に対応する下流工程は「結合テスト」「機能テスト」です。
「結合テスト」は機能ごとに分割してプログラミングされたモジュール(部品を集めて機能を持たせたもの)を結合させることで、それらがサブシステムとしてそれぞれが適切に機能するかについて、そして「基本設計書・仕様書通りにプログラムが動作するか」について確認します。
「機能テスト」は文字通り、機能が仕様どおりに動作するかを検証するテストです。
(3)詳細設計
「詳細設計」では、基本設計で設計された機能について、開発者側からの視点でプログラムとして実現するようにシステムを設計します。
より具体的には「詳細設計」は、基本設計の成果を元に、機能単位のモジュールへの分割やモジュール間のインターフェイスを設計することに相当します。
システムの基本的な動作は詳細設計で定まります。基本設計では顧客とのコミュニケーションが必要でしたが、詳細設計は基本的に開発者側で進められます。
「詳細設計」と対をなす下流工程のテスト対象は「単体テスト」となります。
単体テストは「個々のソフトウェアコンポーネントのテスト」とJSTQBでは定義され、プログラマー向けにプログラミングの指示・設計ドキュメント、すなわち成果物として詳細設計書を作成するフェーズです。
この「コンポーネント」とは「ファイルやプログラムの構成要素」を指し、今まで本文中に登場したモジュールと同義で用いられることもあれば、もう少し広い意味で用いられることもある用語です。
ソフトウェアテストの用語としては独立してテストできるソフトウェアの最小単位を指し、テストの単位は関数、クラス、モジュール、コードおよびデータ構造など幅広く、また、開発手法によりテスト対象は異なります。
単体テストは、詳細設計で定義されたモジュールの動作と、モジュール間のインターフェイスの設定が正しいかを確認するテストです。
(4)実装
「実装」段階ではいよいよ開発が開始されます。
詳細設計書を確認しながら、プログラマーが実際にコーディングを行い、システム開発を行います。
4.アジャイル開発、品質保証と上流工程の関係
ここまで従来のウォーターフォールモデルから派生したV字モデルにおける上流工程と、関係する下流工程について解説しました。
一方、昨今では「アジャイル開発」と呼ばれる開発モデルも用いられています。
少人数の開発チームで短期間で繰り返して行う開発を繰り返すアジャイル開発では、ユーザーストーリーをベースに開発サイクルとして要件定義、設計、プログラミング、テスト、本番環境へのデプロイのサイクルを繰り返します。
ウォーターフォールモデルとアジャイル開発は対照的に思えますが、実際の現場では両者をミックスしたスタイル(ハイブリッド開発)での開発も行われています。
一例を挙げると、上流工程での要求定義はウォーターフォール型、基本設計-詳細設計-実装-単体テストはアジャイル型、下流工程の結合テスト、システムテスト、性能テストなどはウォーターフォール型で進める、というような場合があります。
ウォーターフォールモデルの上流工程の考え方、特に要求定義や要件定義はアジャイル開発でも必要な要素です。
ソフトウェアを作る方法、進め方は異なりますが、出来上がった製品に対して求められる品質は同じです。
要求を分析して、設計に落とし込み、テストで確認することに違いはありません。
まとめ
システム開発における「上流工程」とは、開発を始める前段階の、企画から設計に相当する工程のことを指します。V字モデルでいうと「要求定義」「基本設計」「詳細設計」「実装」の工程です。
システム開発は常に大規模化と複雑化していくものであり、それに伴いシステムの品質を保証することの難易度も上がってきています。もはやプログラマー各人が品質の高いコードを書くように心がける程度では、品質保証は難しくなっていると言えるでしょう。
また、品質を定量的に評価するためには、上流工程にQAチーム(Quality Assurance)を参加させるといったことも必要です。
上流工程と下流工程は、どちらもシステム開発の両輪です。成果物であるシステム全体の品質を高めるためには、なによりも上流工程の強化が求められると言ってよいでしょう。