見出し画像

モデルを活用したソフト開発方法論を採用するメリットと留意点

1. はじめに

 筆者は、過去、モデルを活用したソフトウェア開発を経験する機会があった。この開発手法は、モデルベース開発(以下、MBD)やモデル駆動開発(MDD)と呼ばれる。

 MBD、MDDという開発手法があることは知っていたが、情報が少なく、混乱することも多かった。そこで、実体験を基にして「採用するメリット」と「留意点」をまとめる。

 この開発手法を検討している人は、参考にしてほしい。

2. 今回の定義

 筆者が考えるMBD、MDDと、読み手が考えるものとは別物という可能性もあるため整理する。

 MBDは、モデルベース開発(MBD:Model based Development)と呼び、対象のモデルを作成し、コード生成する手法である。

 MDDは、モデル駆動開発(MDD:Model Driven Development)と呼び、UMLのモデルを作成し、開発する手法である。

 筆者も両社の違いを厳密に述べることはできないが、参考文献[1]を読む限りMBDは、「Mathwork社が提供するSimulinkを使用したもの」で、MDDは「UMLを使用したもの」と考える。

 今回は定義論に足を踏み入れず、MBD、MDDをまとめて、「モデルを活用したソフト開発」と定義する。

3. モデルを活用したソフト開発とは

 一般的なソフト開発とモデルを活用したソフト開発の違いを示す。

3.1 一般的なソフトウェア開発

 一般的な開発手法は、仕様、設計、実装、テストの順番に進む(図1)。

図1 一般的なソフトウェア開発の手順

 図1には、ウォーターフォール型をベースとした一般的な開発手順である。顧客が求める仕様を作成し、設計書を作成する。設計書をもとに、コーディングを実施し、動作が正しいかテストして完成という流れだろう。

3.2 モデルを活用したソフトウェア開発

 モデルを活用したソフト開発について解説する。

3.2.1 開発手順

 モデルを活用したソフト開発では、従来の開発方法と異なり、プログラミングを行う前にモデルを記述してソフトウェア開発を行う(図2)。

図2 モデルを活用したソフトウェア開発

 図2は、モデルを活用したソフト開発の手順である。一般的な開発と異なり、設計を行った後に、モデル作成する。作成したモデルから、コードを自動生成し、正しい動作をするかテストする。

3.2.2 モデルからコード生成のイメージ

 モデルからコード生成するイメージを解説する。もっともイメージしやすいものは、フローチャートに処理を記述し、コード生成するイメージである(図3)。

図3 モデルからコード生成へのイメージ

 図3は、フローチャートからCコードを生成したイメージである。フローチャートに入出力、条件分岐、処理などを記述しておくと、Cコードが生成できる。

 コード生成の範囲は、ツールによってさまざまで、「関数を生成して中身は空」「コードをすべて生成し、実行可能ファイルまで作る」というものもある。

3.2.3 モデルの振る舞いを確認できる

 ツールによっては、モデルの振る舞いを確認できるものもある(図4)。

図4 ふるまいの確認イメージ

 モデルに対して入力データを設定することによって、動作を確認することができる。また、正しいことを確認した状態で、C/C++などのコードを自動生成できる。

3.3 一般的な開発方法との相違点

 一般的な開発であっても、設計工程ではUML(アクティビティ図、状態遷移図、シーケンス図)を作成する。これは、ある意味では、これもモデルを活用したソフト開発ともいえる。しかし、モデルを活用したソフト開発では、ツール上で動く設計書や生成コードと紐づいたモデルがある点が異なる。

4. 採用するメリット

 モデルを活用したソフト開発を採用するメリットを下記に示す。

4.1 設計書を作成することを強制できる

 この開発手法では、必ず設計書を強制できる点である。一般的な開発では、例えば、開発期間が確保できないため、最小限の仕様だけ作成し、コードだけ作るといった場合がある。この場合、仕様からコードまで地続きのドキュメントが残らないというケースも少なくない。

 モデルを活用することで、コード生成可能なモデルを書く必要があるため、設計資産として必ずモデルが残る。

4.2 ソフトウェア全体を俯瞰しやすい

 モデルは、プログラムよりも文字によりも抽象度が高く、全体像を俯瞰しやすい(図5)。

図5 モデルとコードの対比

 図5に示す状態遷移図とそれに対応したプログラムで考える。見てわかる通り、if文やswitch文で記述するよりも全体像は把握しやすい。

4.3 モデルのふるまいを確認できる

 作成したモデルに様々な入力データを与えることで、モデルの動作をプログラムを作成することなく確認できる。例えば、図4のモデルにOpenEvtとCloseEvtの値を入力することができる。また、その中の処理の結果も確認できる。

 モデルを作成した段階で、バグなどを検出するできると、手戻りが減るため、上流工程で品質の作りこみができる。

5. 留意点

 4項でメリットを述べたが、留意点も存在する。

5.1 開発方法論に万能はない

 ある一つの方法によって、すべてを解決することは不可能である。これは、モデルを活用したソフト開発においても当てはまる。よって、ある組織には最適かもしれないが、必ずし自社にフィットするとは限らない。

5.2 プログラムがモデルに形態を変えただけ

 作成するモデルは、文字で記述するプログラムか図やブロックであるかといった違いであり、広く考えればプログラミングをしていることに何ら変わりはない。結果、多くの一般的な開発手法と同様に発生する。

5.2.1 記述し間違うとバグになる

 一般的なプログラミング同様に、モデルを記述ミスは発生する。例えば、加算と減算を取り違えれば、当然バグになる。これらは、従来のプログラミングと変わらない。

5.2.2 わかりやすいけどわかりづらい

 モデルは全体像を俯瞰しやすいメリットはあるが、優先順位が非常にわかりづらい。

 次のようなモデルがあったと考える。どこの処理が最初に始まって、最後はどれかわからない。例えば、赤枠から先に動くかもしれないし、緑枠が先かもしれない。文字ベースのプログラムと異なり、モデルを見てもわからない。

5.3 生成コードは解読困難

 モデルからコード生成できて便利と思うかもしれないが、生成コードを解読することは非常に困難である。例えば、あくまでもツール側が知っている出力規則に従っているだけであり、人間が解読するのは困難である。

 予想される反論は、2つあるだろう。

(1) モデルがわかればコードを見る必要はない

 「モデルとコードは紐づいているのであれば、コード側を知る必要がない」と思う人もいるだろう。しかし、問題が起きるのは、コードとして動作をする箇所であることも少なくない。例を下記に示す。

例:ソフトを動作中、突然ハングすることがわかった。

 このような場合、具体的に原因を特定するには、生成コードを見る必要がある。モデルで確認できるのは、事象がわかってからの話である。この際、生成コードを解読し、事象を確認するのは、通常以上に大変である。

 もちろん、同様の入力データを作成し、モデルに入力して確かめることができるかもしれない。しかし、再現しない場合は、結局のことろ、生成コードをステップ実行してくことになる。

(2) 可読性が高いモデルを作成し、コード生成を行う

 確かに、コード生成したときに可読性が高くなるコードを書くという方法もある。しかし、それならば、わざわざモデルを活用したソフト開発を採用するのではなく、直接コードを書けばよいのではないかと思うわけである。

5.4 人材がそろっていない

 この方法を採用する場合は、人材教育の初期コストも観点として加えるべきである。

 モデルを活用したソフト開発は、やはり、一般的な開発手法と比べると、人材が少ない。例えば、キャリア10年のエンジニアがいたとしても、モデルを活用したソフト開発はやったことがない人はざらにいる。彼らは、この開発を説明すると、「このようなやり方をやるより直接コードを書いたほうが早い」というだろう。結果、採用しても使い物になるには少なくとも3か月はかかる。

6. おわりに

 今回は、モデルを活用したソフト開発の経験から、メリットと採用する際の留意点について述べた。

 この手法を採用することで、下記の点がメリットである。
・設計工程を強制することができる
・全体を俯瞰しやすい
・ふるまいを確認しやすい

 一方、採用する留意点としては、下記がある。
・プログラムがモデルに変わっただけで、一般的な開発方法と同じ問題は発生する。
・生成コードは解読困難
・教育にコストがかかる

 上記を参考にしてモデルを活用したソフト開発を採用するべきか・見送るべきか考えてもらえれば幸いである。

参考文献

[1] 平成23年度モデルベース開発技術部会活動報告書 https://www.ipa.go.jp/archive/files/000026871.pdf


この記事が気に入ったらサポートをしてみませんか?