ウォーターフォールと多重請負の構造問題(1)

2018年8月4日土曜日

システム開発 システム業界問題

t f B! P L
 現在のSIerを中心とした受託開発業界にはいくつかの重層的問題を抱えた発注元にとっても開発者にとっても不利益になる構造的問題を抱えています。
 この問題について「ウォーターフォールと多重請負の構造問題」というタイトルで何回かに分けて説明したいと思います。
 今回は第一回ですが、問題の解説に入る前にシステム開発の基礎知識の解説を行います。まずは開発手法についての解説です。

システム開発手法

システム開発の発注に少しでも関わったことのある人にとっては「ウォーターフォール開発」という言葉は聞いたこともあるしょう。とても基礎的な概念なので説明を必要としない人も多いと思います。
 しかし、念のためこの基礎的概念をこのサイトでは私の解釈で説明していきます。
 本サイトはIT素人にシステム開発を理解して貰うことを目的にしている為、初歩的なことも説明していきます。

 もの作りには「作る順番」というものがありその段取りを管理する手法が必ずあります。ソフトウェアの開発の世界では私の知る限り次の四種類の開発手法があります。

(1)ウォーターフォール開発
(2)アジャイル開発
(3)プロトタイプ型開発
(4)バザール開発
詳細な解説はネット上で識者が解説していますので検索して調べてみてください。ここでは簡単に説明します。

(1)ウォーターフォール開発


 もっとも基本的なソフトウェアの開発手法です。要件(何を作るか)を定め、設計し、開発(プログラム)し、検収(テスト)して納品・導入(リリース)する。
というように抽象的な概念を定めて、階段を一段一段降りていくように、工程の順番ごとに詳細な仕様を定め最後に具体的ソフトウェアを作る。ていう単純な開発手法であり工程管理方法でもあります。
 先に着手する要件など抽象的工程を「前工程」、後で着手するものを「後工程」と呼びます。

前工程) 要件定義→設計→開発→検収→納品・導入 (後工程

 ウォーターフォールは工程管理が表面的・概念的には単純に見えるため、(頭の悪い)システム発注者や開発依頼者に進捗の説明がし易い。ガントチャートにより進捗を一見明確に説明できているように見える。よって長い間システム開発の工程管理手法として使用されてきました。今も日本のエンタープライズシステム開発の現場では現役です。日本だけみたいですが。

 わかりやすいデメリットとしては前工程が完成しないと後工程に進めない。前工程に間違いがあった場合は、後工程から前工程に戻って修正し、再び後工程の該当部分を作り直さなければならない点です。
例えば設計にミスがあり、そのことが開発工程で発覚すると、いったん設計工程に戻り設計書を修正してから、開発に戻り修正した設計書の該当部分を修正しなければなりません。一工程の手戻りならまだ良いですが、二工程・三工程前の間違いが発覚するとその工程以降の着手済み工程は全て手戻り修正対象になります。前工程で間違いばかり繰り返し手戻り作業を何度も繰り返していれば、簡単に開発コストは二倍にでも三倍にでもなります。当然納期も何倍も遅れます。
なお、手戻りは間違いだけでは無く、「仕様変更」でも同じことが起きます。
 つまり「最初にどんなソフトウェアを作るか完全に決めなければ作ることができない」開発手法です。通常これができる発注者は存在しません。

(2)アジャイル開発


 ウォーターフォールの仕様変更が困難な欠点を解消した、開発手法です。日本語では「反復開発」と呼ばれるようです。
 一週間、あるいは一ヶ月というように一定期間を反復期間として定め、その期間ごとにウォーターフォールの「要件定義→設計→開発→検収→納品・導入」を実施します。 
 反復期間は完成するまで何度も繰り返します。反復期間ごとに稼働するソフトウェアをリリースします。開発は重要度の高いものから先に開発実装し、反復するごとに機能を追加していきます。途中で仕様変更があった場合も「新機能」と解釈して次の反復期間に開発するので、工程管理上は手戻り作業というものが発生しません。全て新機能開発と解釈します。
 反復期間のことをイテレーション(iteration)と呼びます。(他にタイムブロックあるいはスプリントと呼ぶ場合もあります)
 長所として仕様変更がやりやすい。開発の初期段階から必要最小限の機能で動くソフトウェアが使用できる為、実務にテスト的に導入して実用テストを行いながら、次に開発する機能を考えることができる。つまりソフトウェアを作りながら試行錯誤できるということです。
 言い換えれば「最初にどんなソフトウェアを作るか完全に決めなくても開発できる」という長所があります。
 他には重要な機能がら開発できる為、開発後半ではあまり重要で無い機能を開発していることになり、終盤に予算が不足して中断しても、重要機能は完成している為、損害は少なくなります。
 開発の初期からソフトウェアを使用できるのでかなり長期間使いながら検収を行うことができるのもメリットです。
 短所としては開発当初に何を作るか決めないため、総開発費と納期が分からない点です。

(3)プロトタイプ型開発


 これはエンタープライズ系システム開発ではほぼ採用されることはありません。
 簡単に言ってしまうと、最初に一人から五人ぐらいの少人数の優秀なプログラマーが基本機能を満たすソフトウェアの中核部を最初の段階で開発し、ユーザーにβ版としてリリースしてしまい、そのご開発者を増員して肉付けしていくようにソフトウェアを開発していくという手法です。最初のβ版がプロトタイプです。
 Windows 95 などを開発した中島聡さんの著書によれば、彼もこの手法を採用しているようで、「最初の二割の時間で全体の八割を開発する」そうです。そして残り八割の時間は製品のクオリティ向上に使用するということです。ソフトウェア開発を知らない人にはわかりにくいかも知れませんが「この世にバグの無いソフトウェアは存在しない」のです。どんなにコストと時間を投入しても必ず僅かなバグは隠れているものなのです。しかし実務上は問題の無い品質のソフトウェアを開発することは可能なので「残り八割の時間は製品のクオリティ向上に使用する」という表現になるのです。
 プロトタイプ開発にも色々種類があります。開発を複数回に分けて反復開発する場合もあるようです。アジャイルとの違いは反復期間の周期を一定に定めていないのと期間が長いこと。アジャイルは目的の機能が完成しなければ一部機能の実装を次回期へ回しリリースしますが、プロトタイプは目的の機能が完成するまでリリースしません。
 アジャイルは期間が固定で機能を変更しますが、プロトタイプは機能が固定で期間を動かします。
 また、プロトタイプをそのまま本番開発に使うものもあれば、プロトタイプで発注元の合意が得られたら最初から作り直す開発手法もあります。

(4)バザール開発


 Linuxなどのオープンソースソフトウェアの開発に採用されている開発手法です。
 これはエンタープライズ系システム開発ではほぼ採用されることはありません。
 私もこの開発手法は経験したことが無いので書籍などで読んだ知識で説明します。

 システム開発では予め開発メンバーを決めてから開発に当たりますが、この開発手法ではリーダーなど中核メンバー以外は開発者を固定しません。途中で参加するものも居れば途中から抜け出ていく者も居ます。
 世界中のボランティアプログラマーがオンラインでGitなどのバージョン管理ツールを用い完全非同期の共同作業でソフトウェアを開発します。
 開発に参加している人々の呼称はチームでは無くコミュニティと呼ばれます。人数や労働時間、働く場所などは一切制約を受けず自由です。
 コミュニティによって開発手法はそれぞれ工夫していて異なると思いますが、基本的な形態は以下のようになるようです。
 最初のバージョンのソフトウェアはリーダーが単独開発してリリースします。
 開発ソースコードは最新版と安定版の二種類に分かれます。新機能の企画は最新版で実験的に実装されリーダーとコミュニティの承認を受けた機能のみ安定版へ移植されます。
 開発は特に管理者のいない自己管理で行われ(リーダーによる指導はあります)、品質の維持はコミュニティメンバーによる無数のレビューとテストとデバッグとリファクタリングによりクオリティを高めていきます。言い換えれば「ソースコードが競争する」ことにより品質を高めます。
 ソフトウェアは細かくバージョンアップを繰り返し、稼働するソフトウェアを少しずつアップグレードしながらリリースします。この点はアジャイルに似ています。
 この開発手法はいつ目的の製品が完成するか分かりません。むしろ作りながら試行錯誤を繰り返し半永久的にアップグレードを繰り返すので開発は終わりません。
 だからこそエンタープライズ系システム開発には向いていないでしょう。どちらかと言えば汎用パッケージソフトに向いているかもしれません。

以上、開発手法の解説でした。
受託開発業界の問題を理解するために必要なことなので頭に入れておいてください。
また、システムを発注するときも、ウォーターフォールとアジャイルの知識は必要です。
次回は「多重請負」について解説したいと思います。

このブログを検索

Translate

人気の投稿

自己紹介

自分の写真
オッサンです。実務経験は Windows環境にて C#,VB.NET ,SQL Server T-SQL,Oracle PL/SQL,PostgreSQL,MariaDB。昔はDelphi,C,C++ など。 趣味はUbuntu,PHP,PostgreSQL,MariaDBかな ?基本無料のやつ。

QooQ