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 表、Defect、Feature… 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 Circuitsby George H. Mealy.- 輸出取決於「目前狀態」與「輸入信號」。在實務中,這意味著它能比 Moore 機器以更少的狀態達成目的,且反應更迅速。
- Moore Machine (1956):
Gedanken-experiments on Sequential Machinesby Edward F. Moore.- 輸出僅取決於「目前狀態」。優點是輸出信號穩定,不受輸入信號的突波(glitch)影響,對同步電路設計非常友好。
- Raft 演算法 (2014):
In Search of an Understandable Consensus Algorithmby 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。
延伸閱讀
相關文章
- 協同合作系統建制與導入 - 以 Redmine 為例
- Study Notes - Step Functions
- Issue Tracking in Redmine
- 自幹作業系統 - Task and Scheduler
- 聊聊 API First 開發策略
- 純手工遊戲開發心得紀錄 - Java 2D RPG Game



