川村渇真の「知性の泉」

システム開発には様々な技術が必要


大規模ソフトウェアの開発は非常に特殊で難しい

 ソフトウェア・システムの開発は遅れるのが当たり前、と言われことが多い。他の分野の開発で、このように表現されるものはほとんどないだろう。システムの規模が大きいほど難しく、遅れる度合いも大きい。見過ごせないのは、遅れようと思って遅れるわけではない点だ。懸命に努力しても遅れる原因は、この種の開発が持つ特殊性に他ならない。
 では、他の分野の開発に比べて、何が違うのだろうか。まず挙げられるのは、システム全体の論理の複雑さである。大規模システムの場合には、全体の分岐や計算の数が途方もなく大きな値になる。そんな複雑なもので全部の整合性を正しく作ることは、並大抵の作業ではない。またソフトウェアの場合は、各モジュールの関係する度合いが極端に大きい。分岐の数が多くて密接に関係していれば、全体を的確に把握することなど、表現できないぐらい困難だ。このようなシステムは、他の分野では見あたらない。機械部品の設計なら、どんなに部品点数が多いといってもソフトの比ではない。また、関係する部分が目に見えるため、全体を把握しやすい。ソフトウェア開発における論理の複雑さは、飛び抜けて高いのだ。
 ソフトウェアのシステム開発では、難しくする原因がもう1つある。最後に近い段階にならないと、全体像が目に見えないのだ。数多くのプログラムを組み合わせて実現し、それらが動くようになるのは、テストの最終段階である。他の分野の多くの製品では、何度か試作機を作り、修正を加えながら改良していく。ところがシステム開発の多くは、何と“一発勝負”である。何度か試作を繰り返したいが、時間も費用もかかりすぎて現実的ではない。試しに作った結果を見て、新しく作り直す方法が使えないのだ。仕方がないので、最初の分析と設計段階で注意深く作業することが求められる。分析結果が悪いと、出来上がったシステムはニーズに合わず、使いものにならないと評価される。後から無理矢理に修正することも可能だが、システムの質はどんどんと低下して、理想の姿からは遠のく。

信頼性や有用性を向上させるために必要

 以上のように、ソフトウェアのシステム開発は本当に難しい仕事だ。このような特徴を持つので、成功するには様々な技術が必要となる。プロジェクト管理や仕様書記述方法のように開発全体に関わるもの、ニーズ分析のように上流工程で使われるもの、テストや運用のように下流工程で用いるものなど、いくつもの技術が生まれている。これらはすべて、今まで行われた開発の経験から来ている。また、今でも少しずつ改良されたり、まったく新しい手法が生まれたりしている。
 システム開発は“一発勝負”のため、何度も作り直すことが出来ない。また、基本構造の大きな変更は無理なので、ニーズ分析やデータ分析などの上流工程の技術ほど重要性が高い。このような技術が使われるのは、失敗をできるだけ避けたいからである。ソフトウェアの技術力がいくら高くても、ニーズに合わないシステムを作ったのでは、ほとんど役に立たない。何を作るのかを間違わないために用いる技術で、“一発勝負”の開発だから必要となる。作る機能を的確に規定できれば、やり直しできない開発での成功確率を向上できる。
 システムの成功や失敗といった、単純な結論だけを重視するのではない。出来上がったシステムの品質の向上も期待できる。ニーズ分析が的確なほど、役に立つ機能が増えて、有用性を高められる。また、後からの手直しが減ることで、余分なバグの発生を抑えられる。きちんとしたテストやレビューにより、システム全体でバグを少なくできる。まともな仕様書を作れば、きちんとレビューできるとともに、後でシステム変更する際の工数を大きく減らせる。各行程での品質が向上すると無駄な作業が減り、全体での開発効率も上がる。などなど、良い面が多い。システムとしての信頼性や有用性を向上させるために必要な技術なのだ。なお、このような効果は、開発が難しいシステムほど大きい。

開発工程をシステム的に運営するためのもの

 ソフトウェアのシステム開発では、「開発している対象はシステム的だが、開発自体の作業工程はシステム的からほど遠い」と言われることが、昔は多かった。ニーズをきちんと分析せずに作り始めたり、仕様書を書かずにプログラムだけ作ったりしていたからだ。前者では、用途に合わないシステムが出来上がる。後者では、システムの安定性を確保するのが難しいだけでなく、問題や変更の生じたプログラムを変更するのも困難だ。このような方法で開発が行われるのは、大きなシステムの開発を、1本のプログラムを作るのと同じに見ていたためだろう。
 最近では、状況が変わりつつある。先進的な方法で開発する組織では、きちんとした開発手法を用いるのが当たり前になった。プロジェクト管理やニーズ分析の技術を利用することで、大きなシステムの開発にも何とか対応できる。ただし、未だに旧態依然とした開発方法を用いる組織もある。開発でのトラブルが多く、信頼性や有用性を高めることが出来ずにいる。先進的な開発者はどんどんと技術を向上させるので、そうでない開発者との差はかなり大きく、ますます広がっているのが現状だ。
 大規模開発で必要となる技術は、開発の作業工程をシステム的に運営する道具といえる。大きな問題が発生しにくいように、開発全体をコントロールするのが目的だ。そう考えると、各技術の必要性や重要性を理解しやすいだろう。

大事な情報が世の中に出てきていない

 非常に残念なことだが、ここで紹介する技術の多くは、世間に広く出回っていない。コンピュータ関連の出版物を見ると、プログラミング言語の解説と狭い意味のプログラミング技法に集中している。きちんとしたテスト技法、信頼性や柔軟性を高めるためのプログラミング技法、分かりやすい仕様書の書き方、将来まで見据えたデータ・フォーマットの設計方法、使いやすいレイアウト画面の設計方法、運用しやすいシステム機能や作業ルール、システムの目的や持つべき機能を明らかにするニーズ分析手法、問題点の発見や開発効率を把握できるプロジェクト管理など、たくさんの役立つ技術は見逃されたままだ。
 このような現状では、自分で勉強してレベルを向上しようと思っても、なかなか実現できない。こんな状況を少しでも改善するために、システム開発の重要な技術を取りあげてみたい。それこそ、難しいシステムを開発するために必要な技術、つまりシステム開発の王道である。

 なお本コーナーでは、他のコーナーと重複する内容(プロジェクト管理や汎用的な設計術など)は省略する。そちらのコーナーも参照してほしい。

(1997年10月27日)


下の飾り