どの開発手法を採用すべき?

システム開発の進め方として「開発手法」って概念があります。

例えば、ウォーターフォール型開発、アジャイル開発といったものです。

開発手法は、実際の開発で様々な工夫・失敗を経て「こうやったらうまくいくんじゃないか?」と編み出されたものですが、開発手法を決める前に “サービスインまでの時間”と“SEの能力”を考慮する必要があります。

サービスインまでの時間

昔、システム開発というと、たくさんのSEが長い時間とお金をかけてウォーターフォール型モデルで開発する方式が主流でした。多額のお金がかかる以上、余計な支出はしたくない、絶対にミスはしたくない、といった背景がありました。

「余計な支出」の最たるものは、要件定義工程の失敗による“開発のやり直し“です。「ミス」の最たるものは、SEの作業ミスです。

これを最小限に抑えることを目的にできた手法がウォーターフォールモデルで、要件定義、基本設計、詳細設計、プログラミング、単体テスト、結合テスト、システムテスト、移行の各工程を順番に実施、次の工程に進む前に前工程の全ての作業がきっちり完了しているかExitクライテリア基準に沿って評価します。

このウォーターフォールの開発手法は、がっちりミスなく開発を進めやすいものの、リリースまでに時間がかかるというデメリットがあります。しかしながら、最近ではビジネスモデルの変化が早く、できるだけ早くリリースすることが求められるようになってきました。

その対策として、アジャイル開発のタイムボックスの概念や、ローコード開発などの手法が出てきました。つまり、要件を絞って作るものを減らし早くリリースする、GUIベースのドラッグ&ドロップ操作で簡単にプログラムを作りプログラミング工程の難易度を下げる、といったものです。

以上のように、サービスインまでの時間短縮のニーズに答える開発手法が、最近では主流となってきています。

SEの能力

システム開発の規模が大きくなるほど、たくさんのSEが参加しますが、ぶっちゃけ参加するSEが全員とても優秀です、なんてわけがありません。できるSEなんて10人のうち2,3人いればいい方で、あとは平均的な能力のSE、開発初めての新人SEとかです。

十分な開発経験がなければ、その分、ミスも増えるわけで、それが1人や2人では済まないとなると、組織的にどうやって品質向上できるか本気で対策を練る必要があるわけです。

究極の開発手法

私はそれぞれの開発手法の「いいとこ取り」をすれば究極の開発手法が出来上がると思うのです。ただし、その際、インプットを考慮します。

インプットとは、ユーザーのビジネススピード(いつまでにどこまでの機能をリリースしたいか)、ユーザー体制(開発への関与度合い等)、開発メンバーのスキルレベル、求められる品質、開発にかけられる予算、この5つのファクターです。

このファクターに対して、適している開発手法のメソッドを当てはめるのがよいと思います。例えば、開発規模がそれほど大きくなく、開発メンバーが全員優秀であれば、ユーザー要件の早期実現にフォーカスを当ててタイムボックスを短く設定してどんどんリリースする。反対に開発規模が大きく、一定数の未熟なSEがいるならペアプログラミングを導入したり、Exitクライテリアを厳格に設定する。また、ユーザーがシステム開発に不慣れなら、プロトタイプを作って、早い段階で開発成果物のイメージを持ってもらう、といった感じです。

開発手法自体が、たくさんのシステム開発プロジェクトの成功と挫折の結果として生み出されたものなのですから、何か一つの開発手法にこだわる必要なんて、そもそもないわけです。

各開発の最適解のやり方を導き出すためには、上述したインプットファクターだけでなく、それぞれの開発手法のメリット・デメリットと適性を理解している必要があるわけで、プロマネとしてそれなりの経験と実力が必要となります。

まとめ

システム開発でたくさんの機能を作っても、よく使われているのはそのうち2、3割くらいだったりします。可能であれば、優先度の高い機能から段階的に開発~リリースすることで開発規模を小さくしましょう。開発規模を小さくすることで、適用できる開発手法のメソッドが増えます。

その上で関係者(ユーザー・担当SE)と品質・予算のバランスを見てどのように開発を進めるか考えるのがよいと思います。

対顧客向けのWebサービスとかだと、最初から一通りの機能をリリースするしかないので開発規模は大きくなる傾向があります。大規模開発の場合は、基本的には、ウォーターフォール型モデル一択です。たくさんの関係者が関わるのでフェーズ分けをきっちりやらないと、ミスコミュニケーションによる手戻り・やり直しが簡単に起きてしまうので。ただし、ウォーターフォール型モデルをベースにしつつ、その中にプロトタイプ・ペアプログラミングなどの手法を組み込むのはありだと思います。

複数の開発手法を組み合わせるとしても「ユーザーへの仕様確認(要件定義)~設計~実装~テスト」が基本の開発サイクルで、これをどの単位・順序で行なうかを考えます。また、品質向上・コスト削減のために、テスト自動化ツール、CI/CD手法、ローコーディング開発の導入余地があるか検討しましょう。

タイトルとURLをコピーしました