Finite-State Machine (有限狀態機)


我很常用 FSM (Finite-State Machine, 有限狀態機)系統設計 (System Design) 或者 流程規劃 (Business Flow)。因為 FSM 的 有限性,容易 收斂邊界,同時在實作上也更容易聚焦。所以從設計角度,我覺得是個非常好的設計方法。當在 Reivew 別人的系統設計時,通常我也會觀察是否有類似 FSM 概念存在,缺乏有限性的邊界,通常系統的 可靠性穩定性 都不容易達成。

系統設計最常用的是 API Design自幹作業系統的 task 分析,流程規劃則是 專案管理 (Redmine / JIRA)、或者內部系統 (資產、人事) 等。也在工作時針對這部分整理過不少教育訓練素材以及相關概念解說,但好像沒有專注整理 FSM 的資料。

這篇從我在 FB 整理的資料開始,加上 Blog 已經寫過類似的資訊做個彙整。如果有在使用 AI 設計,這篇大概就是一個 SKILL.md 的整理。


設計 狀態機 的規則

零、定義狀態機的控制對象是什麼?

設計一個狀態機起手勢要先定義 對象 是什麼?通常是一個 名詞,舉例:

  • API 的 Resource?
  • 工單:像是 Redmine 裡的 Tracker 本身就是控制對象,VSTS 叫做 WorkItem Type.
  • 領域知識 的 業務名詞 / 專有名詞,像是 訂單 (Order)BOM 表DefectFeature … etc.

如果分不清楚,就會亂成一團。

一、有限的狀態 (States)

針對控制的對象,設計他的 狀態 (State),而狀態的規則如下:

  • 狀態名稱都是 名詞形容詞,狀態都是 單一 字彙組成
  • 狀態的數量控制在 十個以內 (不含頭尾),最好是 五個,超過都算複雜
  • 如果狀態數量很多,就要拆解狀態機,變成 有限巢狀狀態機 (Nested Finite State Machine, NFSM),又稱 Hierarchical State Machines (HSM),背後精神就是 分而治之

二、狀態的頭尾 (Start / End)

  • 只能有一種 初始狀態,注意,只能 一個
  • 但可以有多種 結束狀態,可以有 多個
  • 設計狀態機的起手式:先把頭尾抓好

三、狀態移轉 (Transitions)

  • 狀態移轉 (Transition) 是動詞,通常可以透過程式串接。
  • RPC Style 慣用動詞起手,那就是狀態移轉在用的詞
  • 狀態之間的移轉,可以透過狀態表 (State Table) 表示,如下是一個 EC2 的移轉:

四、狀態移轉事件 (Events)

  • 狀態移轉的前後,都可以有事件

五、帶入角色 (Roles) 的流動

  • 角色 (Role) 像是管理者、開發者、PM、QA … 等職能 (Functional) 別
  • 每個角色能夠執行的狀態移轉不一樣,需要個別定義
  • 每個角色都要考慮事件

範例

軟體開發流程中的 Bug 流程

  • 資源:Bug
  • 頭尾:New / Closed / Canceled / Limitation
  • Roles 有 Developer / Team Leader / Reporter (QA/Tester)
  • Transition: 依照角色做限制


Q and A

Q: 串起 CI / CD 的 Pipeline script (or gitlab-ci) 算不算狀態機?

Build 的過程可以有個 FSM、Deploy 的過程可以有個 FSM,除了這兩個,還有其他像是串接 UnitTest、Code Scan 都可以有自己的 FSM,整個串起來的流程可以用 NFSM 巢狀狀態機控制。

好像可以是一種 FSM ,但是大家知道,10 個專案,通常會有 100 種串法,這已經不是有限狀態機啦,而是無限發散機 XDD

實踐軟體工程基本的精神就是:分而治之 (Divide and Conquer)高內聚底耦合。前面提到的五個設計原則,都遵循這兩個基本精神。

Q: State 和 Status 這兩的字有啥差別?

  • State: 有限、可列舉的、可數的,紅綠燈 屬於於這種,只有三個,或者掛掉 XD
    • 電商訂單的狀態就是有限。
  • Status: 不確定、不可數,大概是 loop 中的 iterate 的概念,像是 HTTP 的 Status Code 屬於這種,提款機的故障代碼屬於 Status (故障原因有百百種 QQ

Q: 如果狀態超過十個會怎樣?

會很難懂,複雜度很高。

底下是是 TCP 的狀態機


source: https://en.wikipedia.org/wiki/File:Tcp_state_diagram.png

這篇 TCP 原始論文: “EFSM/SDL modeling of the original TCP standard (RFC793) and the Congestion Control Mechanism of TCP Reno“ ,整理了所有相關的 TCP 狀態圖,共有 38 張。下圖是用 NotebookLM 整理的狀態機,一共有 11 states.

Q: 使用 FSM 作為設計的相關論述?以及實際應用?

相關理論:

  • Mealy Machine (1955): A Method for Synthesizing Sequential Circuits by George H. Mealy.
    • 輸出取決於「目前狀態」與「輸入信號」。在實務中,這意味著它能比 Moore 機器以更少的狀態達成目的,且反應更迅速。
  • Moore Machine (1956): Gedanken-experiments on Sequential Machines by Edward F. Moore.
    • 輸出僅取決於「目前狀態」。優點是輸出信號穩定,不受輸入信號的突波(glitch)影響,對同步電路設計非常友好。
  • Raft 演算法 (2014): In Search of an Understandable Consensus Algorithm by Diego Ongaro and John Ousterhout.
    • 提出了 Replicated State Machine (RSM) 的概念。核心思想是:如果多個伺服器從相同的初始狀態開始,並以相同的順序執行相同的指令(Log),則它們最終會達到一致的狀態。
  • Data-Parallel FSMs (2014): Data-Parallel Finite-State Machines (Microsoft Research).
    • 探討 FSM 在並行運算(如 SIMD、多核)中的難題,提出如何利用「狀態收斂」特性來並行處理傳統上被認為是序列任務的 FSM 運算。

實務應用:

  • NPC AI 與 動畫控制:我在開發 Java 2D RPG Game,角色的「巡邏、追逐、攻擊」邏輯通常會使用 Hierarchical FSM (HFSM),這能有效減少狀態爆炸問題。
  • 前端 UI 狀態管理的 XState - 一個基於 Statecharts (Harel, 1987) 理論的工具
  • 分散式事務 (2PC/3PC):兩階段提交協定使用 FSM 來決定節點該 Commit 還是 Abort。
  • 服務發現與健康檢查:如 HashiCorp Consul 或 Go-kit 中的熔斷器(Circuit Breaker)邏輯(Closed, Open, Half-Open)
  • 作業系統的中斷處理與排程:管理進程生命週期(Ready, Running, Waiting, Terminated)本質上就是一個大型 FSM。

延伸閱讀

相關文章



Comments

2026/04/20 13:30:00





  • 全站索引
  • 關於這裏
  • 關於作者
  • 學習法則
  • 思考本質
  • 一些領悟
  • 分類哲學
  • ▲ TOP ▲