川村渇真の「知性の泉」

力ずくから科学的な手法へ


力ずくで進めているシステム開発が多い

 コンピュータを使ったシステム開発と聞けば、素人の目には、科学の粋を集めた近代的な作業が思い浮かぶかも知れない。確かに、モニターとキーボードを使っている姿を見たら、そんな印象を受けるだろう。しかし実際には、科学的手法からほど遠く、力ずくで前に進んでいることが多い。コンピュータを使っているからといって、科学的とは限らないからだ。
 もう少し詳しく見てみよう。代表的な作業として、プロジェクト管理、ニーズ分析、テストなどが挙げられる。プロジェクト全体を管理してるといっても、数個の工程に分けただけで、大まかに見ている場合が多い。トラブルは大きくなった時点でないと気付かないし、当初の開発日程から遅れることは常識化しつつある。ニーズ分析の作業でも、調査やインタビューの結果を集めて、何となくまとめているだけだ。テストに関しては、マトモに実施している開発がかなり少ない。もし実施しているとしても、試験項目をきちんと設計している例は非常にまれだ。
 実際、以上のような話はかなり前からあった。システム開発の現場では、仕様書や設計書を紙に書き、プログラムも紙に書いてから打ち込んでいた。通常の事務作業と変わらないやり方であり、コンピュータ化がもっとも遅れている部分と、開発者自身でも指摘していた。いろいろなツールが登場したことで、作業自体はコンピュータ化が進んだ。しかし、コンピュータを使っているからといって、作業の内容が科学的に変わったわけではない。大切なのは、それぞれの作業の中身だ。考え方や手順が科学的にならなければ、力ずくで作業している場合と大差はない。

科学的な手法を幅広く利用すべき

 力ずくで進める開発では、できあがったシステムの品質を高めるのは難しい。また、作業効率も上げられず、予定より遅れる原因になりやすい。開発全体での質と効率を向上させるには、システム開発に含まれるいろいろな作業を、科学的なものに変える必要がある。
 もっとも代表的な例は、テストの作業だ。何も考えずにソフトを動かしていては、多くのバグを発見することができない。どのような操作を試したらよいのか、テスト全体での試験項目科学的に設計し、テストのし忘れを防ぐことが大切である。結果として、テストの効率が向上し、限られた時間内に多くのバグを発見できる。試験項目には、エラー処理の確認や、機能と機能の組合せなども含まれる。複数の機能を組み合わせると、膨大な数の試験項目が考えられ、全部を試すことはできない。バグが多く発見できる組み合わせを設計して、テストの効率を上げることが大切だ。
 プロジェクト管理なら、管理の目的から必要な管理項目を導き出す。開発に含まれる全作業を洗い出し、それぞれに必要な作業時間を求める。作業ごと担当者を決め、作業の順番も規定する。それがプロジェクトの計画となり、実際に作業した結果と比べながら、作業の進み具合や、トラブル箇所の発見に役立てる。
 開発の中心部分である設計でも、多くの科学的な手法が役立つ。信頼性や処理速度の向上だけでなく、変更へ柔軟性を高めるための最新の技法は、科学的な分析から生まれたものだ。その中には、ソフトウェアの再利用を可能にする技術も含まれる。
 以上のような考え方は、開発に含まれる全部の作業に適応すべきである。システム開発全体を、力ずくから科学的な手法へと転換することで、開発の質と効率を向上させる。

実用性を重視した工夫が必要

 科学的な手法を押し進め、正確さを追求するほど、作業の手間は増える。とくに困るのが、実際の成果を生み出すわけではない管理に関わる部分だ。その部分に多くの手間を割かれたら、本来の開発に割り当てるべき時間が減ってしまう。できるだけ手間をかけず、効率的に作業することが求められる。つまり、実際の作業で使いやすいように改良し、実用的な方法に仕上げなければならない。
 作業効率を向上させるには、実際に何が必要なのかを見極めて、いろいろな工夫を加える必要がある。たとえば、プロジェクト管理なら、管理項目数を少なくするためには、どんな管理項目を選び、どのような基準で善し悪しを判定すべきなのか求める。そのためには、現実の開発で発生したトラブルを参考にして、本当に必要な管理項目を導き出すしかない。
 テストにおける試験項目の設計でも、全部の項目を一度に考えるのではなく、上手に分けて考えたほうが、良い試験項目を設計できる。現実のテスト作業やバグの出方などを考慮し、どのよう分け、どんな考え方で試験項目を設計するのかが工夫の中心となる。
 設計の作業は、もっとも工夫が必要となる部分だ。まず、どんな点を考慮して設計すべきなのか、設計での視点を考える。処理内容の把握性など、今まで重視されなかった点も含めなければならない。次に、どのような設計ルールを適用したら、目的の視点を満足できるのか考える。把握性を向上させるために、変数名の付け方、オブジェクトの切り分け、関連性の明示方法など、非常に多くの工夫が盛り込める。ユーザーから見える部分の設計でも、使い勝手を向上させるとか、操作ミスを防止するとか、工夫の余地は無限にある。
 これらの工夫を求めるのにも、実は、科学的な思考を必要とする。改良すべき点を探すとか、思いついた工夫を評価するとき、科学的に考えなければならない。その意味から、実用性を重視した工夫を加えることも含め、全体として科学的な思考が基礎となる。このような技術はいろいろあり、開発のほとんどの作業で何かの技術が役立てられる。1つだけ使うのではなく、すべての工程で利用することが大切で、開発の質や効率を大きく向上できる。

開発ごとの最適な実施レベルを決めて利用

 もう1つ考慮すべきなのは、対象となる開発ごとに、求められる信頼性や使える資源が異なる点だ。高い信頼性を求められるシステムなら、高信頼性設計や十分なテストを実施する。逆に、重要度が低いシステムで、資源を多く投入できない開発なら、テストでの試験項目数や回数を減らし、プロジェクト管理での管理項目数も最小限で済ませる。このように、開発に求められるレベルに合わせて、手間を省く度合いを調整することも大切だ。
 ただし、上手に手間を省くといっても、手抜きという意味ではない。少ない時間内で、可能な限り十分に行う必要がある。そのためには、手間を省かないときの実施方法をきちんとマスターしておきたい。また、仕様書を書くなどの部分は手間を省きにくいので、素早く書けるだけの能力を身に付けておくべきだ。そうしたうえで、重要度の低い部分から手間を省けば、開発の質を低下させずに済ませられる。
 このコーナーの目的は、“科学的で実用的な開発作業”を実現するための技術やノウハウの紹介にある。良いシステムを構築したいと思ったら、顧客や商品のコード体系をどのように設計したらよいかや、運用しやすく設計するにはどんな点を考慮すべきかなど、多くの技術を知りたいはずだ。今まで実施しなかったのは、良いやり方を“知らなかった”からにすぎない(このこと自体、別な意味で問題だが)。もし知っていたら、実施する人も多いだろう。ここで紹介する技術は、開発能力を幅広く向上させたい人にとって、本当に役立つ内容ばかりだ。システム開発は奥が深いので、マスターすべき技術に終わりはない。

(1998年1月8日)


下の飾り