現行業務と起きている事故
新任エンジニアとして WAN NYAN CLINIC の予約システムを引き継ぎます。この10分は修正案を出さず、 現場の担当者、日々の操作、実際に起きた事故を、同じ事実に基づいて読み解きます。
現行業務
- 受付
- 予約を確認し、来院を受け付け、診察室へ案内し、会計までの状態を更新する。
- 獣医師
- 受付済みの予約から診察を開始し、担当者と開始時刻をカルテへ残す。
- 飼い主
- 予約と連絡先を預け、受付から失敗理由や次の案内を受け取る。
引き継ぎ初日に確認した2件
会計を終えた Mugi へ、もう一度請求してしまった
会計担当は診察を終えた Mugi の飼い主から4,800円を受け取り、予約を会計済みにしました。 その後、獣医師が同じ予約で「診察開始」を押すと、システムは操作を止めず、予約を診察中へ戻しました。 受付は会計前の来院だと判断し、飼い主へ同じ金額をもう一度請求しました。
SQLite には、「会計済み」にした変更履歴と、「診察中」になっている現在の予約内容が、同じ予約 ID に残りました。
事故を調べた担当者へ、飼い主の連絡先まで見せてしまった
二重請求の経緯を確認するために予約の変更履歴を開くと、操作名や時刻だけでなく、 操作後の予約内容まで丸ごと保存されていました。調査に不要な飼い主の氏名、メールアドレス、電話番号も閲覧できる状態でした。
変更履歴が増えるたびに、同じ個人情報を含むデータが SQLite へ追加されます。
この時点では原因を決めつけません。次の節で画面操作と SQLite に残った内容を照らし合わせ、 現在の予約内容と変更履歴のどこに問題があるかを確認します。
画面操作の結果がデータベースにどう残るか
画面で操作すると、現在の予約内容と、各操作を行った後の変更履歴が SQLite に保存されます。 サーバーを起動し直しても両方のデータは残り、 「デモを初期状態へ戻す」を実行したときだけ初期状態へ戻ります。ここでも修正はせず、事故報告と現在の動きがどこで結び付くかを確認します。
現在の操作
| 担当 | 画面で行う操作 | 現在の記録 |
|---|---|---|
| 受付 | 予約検索、来院受付、診察室への案内、会計完了を入力する。 | 予約の現在の状態と操作を行った時刻を更新する。 |
| 獣医師 | 受付済みの予約から診察を開始し、診療内容を入力する。 | 担当者、開始時刻、診療内容を残す。 |
| 会計担当 | 診察料、検査料、処方料を確認して会計をする。 | 請求額と会計をした時刻を残す。 |
現在の予約内容と変更履歴を見比べる
デモ画面では、SQLite から読み出したデータを JSON 形式で表示します。 JSON は、この画面でデータの内容を示す形式です。別の種類のデータを保存しているわけではありません。
| 画面に表示されるもの | 何が入っているか | 何を確かめるか |
|---|---|---|
| 現在の予約内容 | 予約 ID、動物 ID、飼い主 ID、現在の状態、各操作の時刻。 | 想定外の状態や ID の取り違え、不正な診察結果が残っていないか。 |
| 予約の変更履歴 | 履歴 ID、操作名、時刻、その操作を終えた直後の予約内容。 | 現在の予約内容と食い違っていないか、不要な個人情報が含まれていないか。 |
| 不整合の警告 | 予約状態、ID、現在の予約内容と変更履歴の食い違い、個人情報の有無。 | 事故を再現した後、どのデータに問題が残ったか。 |
レビューと持ち帰り
班で「誰が、どの操作をし、何が起き、現在の予約内容と変更履歴にどう残ったか」を1件ずつ共有します。 Session 00 では事故を修正しません。Session 02 から Session 07 で、状態、ID、入力と個人情報、失敗、実行のたびに変わる値、予約内容と変更履歴の食い違いを順に改善する理由を確認します。