設計者の発言

業務システム開発とデータモデリングに関する語り

人数ではなく技能を確保するためのシフト管理システム公開

 拙書『データモデル大全』の第8章図8-14(203ページ)にもとづくレファレンスモデルを公開した。例によって、基本設計情報(業務フロー、データモデル、機能モデル、業務マニュアルを含む)と、これらにもとづいて実装されたシステムがバンドルされている。データモデルは次のとおり。

 ▼図1.シフト管理のための基本的なモデル Staffshift1

 拠点(病棟や居酒屋の店舗に相当する)毎に、曜日毎のシフト(日勤、夕勤等)が決められていて、これにもとづいて月間のシフト(拠点稼働予定)が展開される。また、それぞれのシフト毎にどのような技能(居酒屋であれば調理やホール係といったスキル)がどの程度確保されるべきかが管理されており(拠点稼働予定別技能サマリ)、要員から提示されたシフト申請とすりあわされる。各要員にはあらかじめ保有技能が登録されていて、各シフトで技能要件が満たされているかどうかが評価される。

  技能要件が満たされているかどうかは、具体的には「拠点稼働予定別技能サマリ」上の「技能充当率」として示される。その計算過程は、図2に置いたワークファイル「シフト申請技能明細WK」を含めて眺めるとわかりやすい。そのデータは各要員が勤務可能としたシフト毎に自動的にCRUDされ、それを拠点稼働予定別技能サマリのキーで集計することで、技能充当率が得られる。論理的には必要のないテーブルであるが、これを実装することで計算過程がわかるだけでなく、充当率の計算が容易になる。この種の正規化崩しのテクニックも知っておいて損はない。

 ▼図2.ワークファイルを含むモデル Staffshift2

 バンドルされている実システムについて説明しよう。何といってもそのウリは、シフト申請にもとづいて月間の各シフトへの要員を自動割当するための平準化処理が提供されている点だ。ここでも上述のワークファイルが効果的に使われている。

  すなわち平準化処理では最初に、勤務可として申請されたシフト申請をすべて確保(山積み)して、技能充当率を再計算する。続いて充当率が過剰であるシフトから確保を少しずつキャンセル(山崩し)してゆく。その際に、要員をどの順序で選んでキャンセルするかが肝心だ。それが、ワークファイル上の練度指数が低く、かつ余剰確保数(上限シフト数以上に確保されているシフトの数)の多い要員の順、だったりする。そのようにして特定のシフト確保をキャンセルする度に、全体を再計算し、再度充当率がもっとも過剰なシフトを選んで同様の処理を繰り返す。シンプルだがそれなりに合理的な平準化を達成できる。

  これは「組み合わせ問題」に対する解法のひとつだが、この場合、ロジックをどんなに複雑にしても、たとえ量子コンピュータやAIを駆使しても最適解を導き出すことは困難だ。なぜならこの要件では、シフト別技能の需要に対する供給が恒常的にひっ迫していることが予想できるからだ。供給が潤沢であれば工夫次第で最適解を発見できるが、供給が少ないと需要を満たす答がそもそも存在しない。したがって、上述の平準化処理は「せいぜい人手による調整作業を始めるためのまあまあな確保具合」を自動設定するためのものでしかない。とはいえ、あるとないとでは作業効率がまるで違うので、こういった補助機能が欠かせない。

  このシステムの最大の特徴は、各シフトが単純な要員数で賄われるとは考えない点、つまり文字通り「数を恃(たの)まない」点である。要員毎に保有技能の練度は異なるので、「どれだけ要員をかき集めたか」ではなく「いかに練度の高い要員を確保できたか」がシフト要件の充当に寄与する。また、充当率が「要員が保有する技能練度の合算値」として算出される点にも注意したい。つまり、前回記事で説明した「掛け算スキル」には対応していない。こういった特性や制約を理解すれば、シフト管理の広範な要求を扱うための有意義な教材となるだろう。このモデルを使ってさまざまなローコード基盤での実装を紹介するイベントも計画している。活用してほしい。