なぜソフトウェアを開発するのでしょうか?それは、ソフトウェアによって、ある領域の特定の問題を解決するためと言えるでしょう。そのために必要不可欠なのが、モデリングです。モデルを作成する活動を行うことで、ソフトウェアの価値を高めることができます。
モデルとは
モデルには様々な種類があり、目的によって使い分けられます。本記事ではモデルという単語は、「ソフトウェアでアプローチする対象領域の問題を解決するためのモデル」とします。
モデルの例
先ほどモデルを定義しましたが、イメージが湧きづらいので具体例を用いて説明します。
ソフトウェアを構築するために「履歴書」のモデルを作成するとします。実際に履歴書を書いたときのことを思い出すと、以下のような要素が抽出できるでしょうか。
- 名前
- 経歴
- 志望理由
- 顔写真
しかし、現実の履歴書には次のような要素も含まれます。
- 筆跡
- 履歴書のフォーマット
- 履歴書を書くときの気持ち
しかし、このような要素全てをソフトウェアに落とし込むことは不可能でしょう。問題を解決するために、必要な要素はモデルに取り込みたいですし、不要な要素は取り込みたくありません。
ここで、「どの要素を取り込むか」という工程が必要になります。このプロセスが抽象化であり、その成果物がモデルということになります。
良いモデル、良くないモデル
良いモデルとは
良いモデルとはどのようなモデルなのでしょうか。
このような質問をすると、分かりやすいモデル、粒度が適切なモデル、拡張性のあるモデル...といったことが挙げられることがあります。
しかし、「問題解決のために、物事の特定の側面を抽象化したもの」という定義から考えると、「良いモデルとは、問題を解決できるモデル」と言えるでしょう。いかに理解しやすく、美しく見えても、問題が解決できなければ、それは目的を達成できない、良くないモデルということになります。
良くないモデルの例
例として、人事担当者の採用管理(会社の採用選考に応募してきた人の管理)のアプリケーションを考えます。
人事担当者は採用管理業務をスプレッドシートを使用した手入力によって運用で行っていましたが、ミスの発生や作業効率の悪さが問題になっていました。そこで、アプリケーションを開発して運用をシステム化することにより、この問題を解決することを目指します。
実装行うために以下のモデルを考えました。
あらかじめ求人が登録されており、それに対して応募者、採用選考というのが登録されます。採用選考のステータスは「書類選考→1次面接→2次面接→最終面接→内定」というステップを辿ります。
このモデルを元に実装し、アプリケーションを現場で運用したところ、次のような問題が発生しました。
- 書類選考の前に面接があるのに、設定できない
- 面接は3次、4次もあるのに追加できない
- 求人関係のない応募も許可したいのに設定できない
これでは現場の運用に適用できません。つまり、もともと目指していた問題解決ができないということです。
もし、このアプリケーションの実装が、可読性や拡張性が高く、自動テストも完璧でバグが全くでないようなものだったとしましょう。そのアプリケーションは高い価値を生み出せるでしょうか?
いいえ、そうはなりません。モデルが良くないと、実装がどんなに素晴らしくても良い(問題解決ができる)ソフトウェアにはならないのです。
良いモデルを作るには
良いモデルを作るにはどうすれば良いのか、重要な2つのアプローチがあります。
- 問題解決の領域のエキスパートと会話する
- 運用して得られた発見をモデルに還元する
というものです。それぞれ解説していきます。
エキスパートと会話する
採用管理アプリケーションを有用なものにするには、まず採用管理領域に詳しい人、つまり人事担当者に話を聞くことが必要でしょう。
ソフトウェアの開発によくあるのは、十分にモデリングやヒアリングを行わず、開発者の部分的な理解のみで実装を進めてしまうパターンです。そのような場合、求められているものとのすれ違いに気づくには時間がかかります。そして気づいた時点では既にコードやデータが目指したい形とは異なっており、大きな修正コストが必要になってしまいます。(多くの場合、このコストを払うことができず、徐々に理想と現実が乖離します)
このような事態を避けるためには、早い段階でモデリングをエキスパートと一緒に行い、モデルに知識を反映することが必要です。
運用して得られた発見をモデルに還元する
エキスパートと会話することは重要ですが、彼らはソフトウェア開発のエキスパートという訳ではありません。リリースして運用いてみたら意外な改善点があった、ということは必ず発生します。この発見をモデルに反映することが、モデルを改善するためのもう一つの重要な点です。最初からモデルは完成せず、徐々に改善していくものという考えが重要です。
最後に
ソフトウェアを開発していく上で最初のモデルを作成することは、その後の開発や運用に大きな影響を与えます。適当にならず時間をかけてモデリングを行うことをお勧めします。
また、本記事での話はDDD(ドメイン駆動設計)に通じます。