Upgrade to Pro — share decks privately, control downloads, hide ads and more …

形式手法を使って仕様をコーディングしよう

Avatar for mikan mikan
September 29, 2026

 形式手法を使って仕様をコーディングしよう

Avatar for mikan

mikan

September 29, 2026

More Decks by mikan

Other Decks in Technology

Transcript

  1. 1 DWG NO. FML-2026-009 REV. 01 2 第三角法 / THIRD

    ANGLE FIG. A 1 — STATE MACHINE ⌀256 A 題目 / TITLE 形式手法を使って 仕様をコーディングしよう 5 min ⌀28 画面の仕様を Quint でモデル検査する SECTION A-A B B 260 作成者 / DRAWN BY 行事 mikan (一瀬喜弘) / EVENT Mobile勉強会 ウォンテッドリー × チームラボ#25 1 名称 / TITLE 図面 形式手法を使って仕様をコーディングしよう 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 1 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  2. 1 FIG. 0 2 SPEAKER — GENERAL NOTES 自己紹介 A

    A SPEAKER WHO AM I — GENERAL NOTES object Mikan { val name = " 一瀬喜弘" val occupation = Engineer.Android val company = AbemaTV val favoriteBooks = listOf( " ) ソフトウェア設計の結合バランス", } B FIG. 0 — SPEAKER B X @mikanIchinose GitHub @mikanIchinose 名称 / TITLE 図面 1 自己紹介 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 2 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  3. 1 FIG. 1 2 FIELD OBSERVATION — TIMELINE 最近、TLで「形式手法」をよく見る A

    A 1 mizchi さん — Quint で Deno の分散サ ービス celld をモデル化してバグを発見 2 成瀬さん — takt に「形式仕様モード」 を導入し、AIとの合意内容を形式化 3 zenn.dev Boris Cherny さん — Opus 5.5 の登場時 に形式手法に言及 B Lean、TLA+、Quint… なんか流行ってる感がある 1 B zenn.dev 名称 / TITLE 図面 最近、TLで「形式手法」をよく見る 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 3 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  4. 1 FIG. 2 2 UNIT TEST VS MODEL CHECKING 形式手法

    ≒ 仕様専用のプログラミング言語 A A ユニットテスト モデル検査 1 書いたパターンだけ検証する 1 起こりうる状態遷移を全パターン網羅 2 「思いついたケース」が上限 2 設計上の不具合を実装前に見つける 3 性質が成り立つことを証明できる B B 名称 / TITLE 図面 1 形式手法 ≒ 仕様専用のプログラミング言語 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 4 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  5. 1 FIG. 3 2 KNOWN HAZARDS でも、ずっとマイナーだった A A 活用事例は分散アルゴリズム・クラウド・鉄道・航空などミッションクリティカルな領域くらい

    1 専用言語を読み書きできないといけない 2 その仕様が要求を満たしているか判断できないと、検査しても無意味 3 実装は別の言語で書く → 仕様と対応しているかの判定が難しい 4 仕様書と実装はどんどんズレる → 運用できるチームでない限り無用の長物 B B 名称 / TITLE 図面 1 でも、ずっとマイナーだった 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 5 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  6. 1 2 A A AIエージェントがハードルを下げた 専用言語の読み書きも、仕様→実装の翻訳もAIが肩代わり 曖昧な自然言語より、固く定義された仕様のほうがAIのハーネスになる B B 名称

    / TITLE 図面 1 AIエージェントがハードルを下げた 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 6 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  7. 1 FIG. 4 2 UI AS STATE MACHINE モバイルアプリの画面に使えないか? A

    A 1 UI層は画面をステートマシンとして扱われる(MVI) 2 形式仕様記述言語 Quint はステートマシンの記述が得意 3 → 画面の仕様を Quint で形式化してみる B B 名称 / TITLE モバイルアプリの画面に使えないか ? 図面 1 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 7 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  8. 1 FIG. 5 2 SPECIFICATION — TODO LIST 題材: TODOアプリの一覧画面

    A A 仕様 常に成り立つ(不変条件) 1 todo は id・タイトル・完了状態を持つ 1 追加された todo のタイトルは有効 2 追加ボタン → タイトル入力(draft) 2 id は重複しない 有効なタイトルで確定 → 末尾に追加 3 draft中は追加・チェック・削除できない 空文字・空白 → 破棄 遷移で成り立つ 3 チェックで完了。完了したものは非表示 1 4 todo は削除できる 完了したら元に戻らない 2 件数が減るのは削除時のみ 3 削除された id は再利用されない 4 確定 → 末尾に追加 or リスト不変 B B 名称 / TITLE 図面 1 題材: TODOアプリの一覧画面 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 8 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  9. 1 FIG. 6 2 STATE & ACTIONS Quint で仕様を書く: 状態とアクション

    A A var todos: List[Todo] var draft: bool // タイトル入力中か action confirm(title: str): bool = all { draft, if (isValid(title)) todos' = todos.append({ id: todos.length(), title: title, done: false }) else todos' = todos, draft' = false, B // 破棄 } B 名称 / TITLE 図面 1 Quint で仕様を書く: 状態とアクション 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 9 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  10. 1 FIG. 7 2 PROPERTIES Quint で仕様を書く: 性質 A A

    // 常に成り立つ val titlesValid = todos.select(t => not(isValid(t.title))) == [] val idsUnique // 1 = ids(todos).size() == todos.length() 手前(prev)と今を比べる val shrinkOnlyByDelete = todos.length() < prevTodos.length() implies lastAction == "delete" val noIdReuse = ids(todos).intersect(deletedIds) == Set() B $ quint verify todo.qnt --invariant=all_props --max-steps=10 B 名称 / TITLE 図面 1 Quint で仕様を書く: 性質 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 10 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  11. 1 FIG. 8 2 COUNTEREXAMPLE — 7 STEPS 見つかった不具合: id

    が重複する A A 最初の仕様で quint verify すると、7手 の反例が返ってくる State 操作 todos (id) 採番に使う 1-2 追加 → 確定 [0] 0 3-4 追加 → 確定 [0, 1] 1 5 id 0 を削除 [1] — 6-7 追加 → 確定 [1, 1] ← idsUnique 違反 1 todos.length() B B 名称 / TITLE 図面 1 見つかった不具合: id が重複する 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 11 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  12. 1 FIG. 9 2 ROOT CAUSE — ID ASSIGNMENT どこで生じたか:

    件数で id を採番していた A A action confirm(title: str): bool = all { draft, if (isValid(title)) todos' = todos.append({ id: todos.length(), title: title, done: false }) else todos' = todos, // draft' = false, } 破棄 1 B 2 削除すると todos.length() が縮む → 採番が巻き戻る B 巻き戻った番号が、まだ残っている todo の id とぶつかる 名称 / TITLE 図面 1 どこで生じたか: 件数で id を採番してい 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 12 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  13. 1 FIG. 10 2 CORRECTIVE ACTION — BEFORE / AFTER

    修正: 採番用のカウンタを状態に持つ A A BEFORE AFTER var todos: List[Todo] var draft: bool // confirm todos' = todos.append( { id: todos.length(), title: title, done: false }), B var todos: List[Todo] var draft: bool var nextId: int // 減らない // confirm todos' = todos.append( { id: nextId, title: title, done: false }), nextId' = nextId + 1, AFTER: quint verify --max-steps=10 → NO VIOLATION B 名称 / TITLE 図面 1 修正: 採番用のカウンタを状態に持つ 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 13 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  14. 1 FIG. 11 2 TOLERANCES 可能性と限界 A A 可能性 1

    限界 リリース後に見つかるバグを設計段階で 1 形式仕様記述言語を読めないといけない 2 書いた性質が要求に合っているかは人間が見極め 見つけられるかも 2 検証済みの仕様をAIに渡せば、レビュー る 不要な品質の実装が出せたらいいな 3 実装のバグがなくなるわけではない B B 名称 / TITLE 図面 1 可能性と限界 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 14 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2
  15. 1 2 A A 画面はステートマシン 仕様もコーディングしよう ご清聴ありがとうございました E N D

    O F D R A W I N G B B 名称 / TITLE 図面 1 画面はステートマシン、仕様もコーディング 図番 / DWG NO. 縮尺 / SCALE 頁 / SHEET FML-2026-009 1 : 1 15 / 15 作成者 / DRAWN 日付 / DATE 投影法 mikan (一瀬喜弘) 2026.09 第三角法 2