ai-driven-development legacy-migration blazor

未実装ボタンを「動いている風」にしない — 偽の完成を防ぐ UI 戦略

移行途中のフッターボタン群を全部隠すと利用者が混乱します。かといって全部実装すると工数が爆発します。「導線だけ実装して、未対応メッセージで明示する」の中間解にしました。

W
渡邊 賢

なぜ書いたか

レガシー画面を移行するとき、フッターのボタン群(帳票出力、一括承認、CSVエクスポートなど)が 本体機能と比べて重い ことがよくあります。本体だけ移行して、フッターを「全部後回し」にすると、利用者にとっては「ボタンが消えた、機能が減った」に見えます。今回はその中間解の話です。

何が問題か

選択肢は3つあります。

  1. 全部実装してから移行: 工数が爆発する。本体機能のリリースが大幅に遅れる
  2. 未実装ボタンを完全に隠す: 利用者から「機能が消えた」と見える。問い合わせが増える
  3. 暫定実装でとりあえず動かす: スタブ実装で「動いている風」に見せる。最も危険

3つ目が一番事故ります。「動いている風」のボタンを利用者が押して、何も起きないか、変な結果が出ます。実体がないことを利用者は知らない。

やったこと

中間解として、「導線だけ実装して、押すと未対応メッセージを出す」 を採用しました。

<button class="btn-secondary" @onclick="ShowNotImplemented">
    帳票出力
</button>

@code {
    private void ShowNotImplemented()
    {
        // 移行未完了の機能であることを明示
        ShowToast("この機能は次回リリースで対応予定です。", ToastLevel.Info);
    }
}

ポイントは:

  • ボタン自体は表示する: 利用者が「機能が消えた」と思わない
  • 押せる: 押すと未対応であることを 明示的に 知らせる
  • 誤操作にならない: 何かが処理されたフリをしない

なぜこれが「導線だけ実装」と呼べるか

mapping上では、このボタンは「導線あり、本処理は未対応」として扱います。本処理を実装するスライスを後で切るときに、ShowNotImplemented() を本処理に差し替えるだけで完了します。

「動いていないことが分かるボタン」がある状態は、利用者にとっては不便ですが、最も誠実な状態 です。

わかったこと

  • 「動いている風」を作ると、開発者と利用者の認識ズレが必ず発生します。動いていないことを明示するほうが、結局は信頼されます
  • 未対応メッセージは、「いつ対応予定か」も書けると尚良い。書けないなら「今後のリリースで対応します」程度でもOK
  • AIに画面を作らせるとき、未実装機能を どう扱うか を最初に決めておかないと、勝手にスタブ実装で動いている風を作りがちです

関連

「未決を成果として残す」という考え方とつながります(未決をプロジェクトの進捗として残す)。未実装ボタンも、未決の一形態として 可視化したまま運用 する、という思想です。

次にやること / 未解決の問題

  • 未対応メッセージのデザインがまだ画面ごとに揺れている。共通コンポーネント化したい
  • 「いつ対応予定か」をmappingから自動的にメッセージに反映する仕組みを試したい
person

渡邊 賢

等差級数的Commit 運営 / ICD VIETNAM.LLC General Manager

AI駆動開発と段階的なレガシーモダン化をテーマに、日々の試行錯誤をこのブログに記録しています。

プロフィール詳細 arrow_forward

似たような課題に困っている方、一緒に考えませんか。

AI駆動開発・Vibe Coding・レガシーマイグレーションに関するご相談を受け付けています。