テストツールの開発について(設計編)

前回は要件定義について書かせていただきましたが、今回は設計について学んだことを記事にします。

[システム開発の工程]

システム開発の工程は上図の左から右(上流から下流)へ流れていきますが、下流に行くに従って具体化されていき、コンピュータが理解できる形へ落とし込まれていきます。

設計はなぜ必要なのか

前回の記事:テストツールの開発について(要件定義編)でも触れましたが、今回の開発は社内で使用するツールであり、規模も小さくイメージを具体化しやすかったことから頭の中にあるイメージをもとにいきなりコードを書いていきました。設計らしき作業をしたのは画面のモックを作ったぐらいです。あとからドキュメント(設計書と呼べるようなものではありません・・・)を書いたのですが、なぜ設計が必要なのか、そもそも論を考えてみたいと思います。

私には計画性がなく、せっかちなところがあり、プログラムを書く前に計画しなさいと度々指摘を受けてきました。自身の課題だと認識していたこともあり、少しづつ目的を達成するまでの工程を計画するなかで感じたことは以下です。

  • 進捗が明確になり、周囲と共有できる
  • 規模が大きく複雑であればあるほど手戻りを少なくできる
  • 結果的に計画をしたほうがいきなりコードを書くよりも時間が短縮できる(規模が大きい場合)
  • あとから変更が生じたときにも対応しやすい
  • どのようなテストをすればよいかがわかりやすい

大規模で複雑な、大勢がかかわっているようなシステムなら計画がないとベクトルが揃わず早々に空中分解してしまいます。チームが必要な開発であればあるほど設計は重要であると思いますし、そのシステムが長寿なものであれば、適切に整備され続けた設計書により運用・保守のコストを大きく低減できるものだと思います。

当たり前のことかもしれませんが、あらためて設計(計画)の必要性について頭の整理をしました。

外部設計(基本設計)・内部設計(詳細設計)

設計書を書くにあたって混乱したのが、外部設計、内部設計、基本設計、詳細設計のような用語があり、そもそもこれはなんなのか、それぞれのフェーズでなにをどこまで記述すべきなのかということです。設計と実装を一人で行っていたことも境界があいまいになり混乱の原因となったかもしれません。

V字モデル

システム開発の基本であるV字モデルを見れば、各設計項目に対するテストが定義されています。詳細設計は単体テスト、基本設計は結合テストでそれぞれ実施する項目について設計すればよいということがわかります。また、単体テストを実施する内容を基本設計書には書かないというようなこともわかるでしょう。

基本・詳細設計/外部・内部設計

基本設計と外部設計、詳細設計と内部設計を同一のものとして扱っている資料が多く、それぞれは同じものを異なる視点でみているものだとはじめは思っていました。ですが、どうやら概念は違うもののようです。

基本と詳細について、機能毎に概略を基本設計に示し、実装可能なレベルで詳細設計に示すというように理解しましたが、システムが複雑になればなるほど、概略から詳細へ何段階にもわたって設計しなければ、全体像とそれを構成する部分を人が理解できない場合があります。すなわち、基本と詳細はきれいに二分されるものでなく、設計しようとするシステムによりいくらでも中間の段階がありえるということがわかりました。

外部と内部についてはどうでしょうか?外部設計は設計対象を外からみたもので、内部設計は設計対象を内からみたものという記述をみつけました。はじめはシステムの内?外?とハテナマークがいくつも浮かびましたが、さまざま資料を読んでいくうちに、システムを使用する側にとって入力と出力およびそれに関連するインターフェイスが直接目に触れる部分であることから境界の外側であるのに対し、内側とは入出力を処理する部分だというように理解しました。

外側と内側も明確に分かれているものではなさそうです。なぜなら入力と出力、それから処理についてはいくつも連鎖させることができるからです。これもシステムが複雑であればあるほど境界が曖昧になっていきます。

[基本ー詳細、外部ー内部概念図]

以上のことからシステムの規模が非常に大きい場合は下図のような設計もありえるということです。

まとめ

設計に関して学ぶなかで私が疑問に感じた概念部分を頭の整理として記事にしました。詳細設計で使用される様々な図表などは作成しませんでしたが、いずれも他者(後工程を担当する人)が理解できる共通言語で複雑なシステムを説明するものだということが理解できました。

当たり前のことですが、ドキュメントは人の為に記載されるものであり、人が有効に活用できて初めて意味を持つものだということをあらためて感じるとともに、現実世界をモデル化し、システムに落とし込むこれまでの積み重ねの凄さを実感した次第です。

テストツールの実装に関してはまとまり次第、記事にしていきたいと思います。