如何有邏輯的釐清事物的狀態?學習 FSM 有限狀態機

朱騏
PM的生產力工具箱
7 min readMay 10, 2021

一、為什麼要學習有限狀態機?

對於時常寫產品規格的 PM 來說,一定都會遭遇到同樣的問題:

產品功能的狀態很多,應該如何記錄比較好?

例如在電商網站中,消費者的購物流程狀態就包含:

  • 待下單
  • 待付款
  • 待出貨
  • 待收貨
  • 結束

狀態依據各家公司的後端系統設定各有差異,但是大致上不脫離這些狀態。

這些狀態有先後順序,甚至有不同的觸發關係。例如「待支付」與「待收貨」如果取消,都會變成「結束」。

這麼複雜的關係,應該如何表示才能一目了然呢?

答案是:使用有限狀態機 (FSM)。

二、有限狀態機簡介

「有限狀態機」的全名是 (Finite State Machine,中文翻譯為有限狀態機/狀態機,下均用狀態機)。

狀態機不是一台機器,而是一個數學模型,用來抽象化生活中事情的狀態。

狀態機經常被使用在「程式領域」,工程師在撰寫程式時,通常都會使用狀態機來釐清複雜的狀態變化。

除了寫程式,狀態機對產品經理、專案經理、或是任何想釐清複雜程序的人都非常有幫助。

你可能會問:「我看狀態機的圖片跟流程圖很相似,這兩者有什麼差異?」

簡單來說:

狀態機強調的是「狀態變化」,而流程圖則是強調「事件先後順序」。

雖然兩者使用的元素有重疊,但畫圖的重點不同,使用的時機也不同。

只要理解了概念,就連生活中的場景都可以使用狀態機釐清關係,文章最後面會有一道生活應用題。

三、有限狀態機元素組成

先來看一張簡單的狀態機:

「開門/關門」狀態機

這張圖描述了「門開著/門關著」兩個狀態(圓圈),並且定義了「開」跟「關」兩個動作(線上的文字)。

狀態中也標註了要變成這個狀態時,必須執行的動作(稱為進入動作)。例如「門關著」狀態的進入動作是「關門」,「門開著」狀態的進入動作是「開門」。

請注意 transition 指的是「狀態轉變」,transition condition/event 指的是「觸發狀態改變的條件」。

有限狀態機的 4 種元素

我們將上述的元素整理一下,得到了狀態機中 4 個重要元素:

  • state 狀態:一個狀態機中至少要包含 2 個狀態,例如「門開著」與「門關著」。
  • event 事件:用來觸發狀態變化的條件,有些文章也稱作 transition condition。例如「開門」與「關門」。
  • action 動作:「事件發生後」要執行的動作,例如進入動作的「關門。其實動作可以細分成 4 種類型:
1. 進入動作:進入這個狀態時,會執行什麼工作?2. 離開動作:離開這個狀態時,會執行什麼工作?3. 輸入動作:處於某狀態時,收到事件會執行什麼動作?(即執行動作但不轉變狀態)4. 轉移動作:轉移狀態過程中,會執行什麼動作?
  • transition 變換:一個狀態轉變為另一個狀態,例如「門開者」轉變成「門關著」。

Action 舉例

action 動作比較複雜,我們用「紅綠燈的燈號轉變」再舉一個例子。假設目前狀態為紅燈:

1. 進入動作:燈號顯示為紅色,並且播放紅色倒數計時2. 離開動作:紅燈倒數計時歸 03. 輸入動作:例如在紅燈狀態時收到「有人闖紅燈」事件,則發出警告:「現在是紅燈,禁止闖紅燈」4. 轉移動作:例如在紅燈轉變為綠燈過程中,發出提醒:「現在是綠燈啦,趕快走別滑手機」
紅燈示意圖

四、實戰案例,畫一張自動販賣機的有限狀態機

了解了全盤概念,我們一起用狀態機的概念畫一張自動販賣機的狀態機。

販賣機示意圖,圖片連結:http://www.alona.com.tw/product_tw.php?id=1

假設自動販賣機只賣 2 種飲料,分別是 20 元 和 50 元。這台販賣機只接受 10 元或 50 元的硬幣。

我們可以將販賣機的狀態分成:

  • default (初始狀態)
  • not_enough (錢不夠)
  • menu_20 (選單顯示可購買 20元 的飲料)
  • menu_20_50 (選單顯示可購買 20/50元 的飲料)
販賣機的狀態機 (簡單版)

這個狀態機的運作流程是:

  • default : 初始狀態為 default
  • not_enough
1. 投入 10 元時,狀態顯示為 not_enough。2. 再投入 10 元顯示 menu_20,此時可購買 20 元飲料、或繼續投幣直到累積超過 50 元可購買 50 元飲料。3. 投入 50 元顯示 menu_20_50,此時可購買 20 元或 50 元飲料。
  • menu_20:此時可購買 20 元飲料、或投入累積超過 30 元可購買 50 元飲料。
  • menu_20_50:此時可購買 20 元或 50 元飲料

購買完成回到 default 狀態時,要進行找零與彈出飲料。

在 default 狀態加上「進入動作」

參考資料

▶︎ 關於文章1/ 歡迎訂閱 我的電子報 獲得實用的生活與工作技巧,每週二中午 12:00 準時發刊2/ 想要掌握最新文章,可以點擊下方「Follow」我~3/ 如果你覺得文章寫的不錯,可以對文章拍手讓我知道 👏🏻▶ 關於我我是朱騏,一個組織能力超強的軟體產品經理,喜歡研究各種生產力工具、時間管理方法。1/ 我可以提供產品管理、時間管理、生產力工具的「個人問題諮詢」與「講座邀約」。2/ 若是個人諮詢,可以請我喝杯咖啡、吃頓晚餐,可透過 Email/ Facebook 跟我約時間,請參考「聯繫方式」。3/ 若是講座邀約,請直接使用 Email 聯繫。︎▶︎ 聯繫方式- 📪 Email:muhenry608@gmail.com- 💬 Facebook:請先加我個人好友並簡短說明想要諮詢的主題▶︎ 建立人脈歡迎使用 LinkedIn 與我交流,你可以「加我為好友」建立連結| LinkedIn @ Chi Chu 歡迎交流

--

--

朱騏
PM的生產力工具箱

線上寫作教練,擁有 6 年的 SaaS 產品經理 & 2 年軟體技術寫手工作經驗。我專注寫 (1)技術寫作 (2)數位寫作 (3) 個人知識管理的文章 🤝 歡迎講座邀約、諮詢,可參考 www.chichu.co/training