如何繪畫狀態(tài)機(jī)來描述業(yè)務(wù)的變化

33 評(píng)論 79308 瀏覽 529 收藏 9 分鐘

對(duì)于設(shè)計(jì)過商品、訂單、優(yōu)惠券等復(fù)雜功能的PM來說,會(huì)發(fā)現(xiàn)很難描述清楚功能的本質(zhì)。因?yàn)榧夹g(shù)會(huì)反復(fù)的問,有幾種狀態(tài)啊,怎么轉(zhuǎn)移啊,啥時(shí)候轉(zhuǎn)移啊,什么時(shí)候截止?fàn)顟B(tài)啊,系統(tǒng)根據(jù)什么條件判斷狀態(tài)啊……

一、為什么需要使用狀態(tài)機(jī)?

講個(gè)親身的例子,去年我設(shè)計(jì)電商系統(tǒng)的訂單模塊,就犯過類似的問題。

  • 一開始參照淘寶的訂單系統(tǒng),將訂單設(shè)計(jì)為待付款、已付款、已發(fā)貨、已完成,已關(guān)閉等5個(gè)狀態(tài)。
  • 上線后很快就發(fā)現(xiàn)有問題。付款之后直接傳給倉庫那邊發(fā)貨,導(dǎo)致很多訂單信息明明有誤,但是來不及修改。用戶下單
  • 之后想改地址改商品,而發(fā)貨信息已經(jīng)傳給網(wǎng)倉了很難修改。
  • 然后我們不得不新增了一個(gè)中間狀態(tài)“已確認(rèn)”,讓客服審核無誤后,再傳給網(wǎng)倉走發(fā)貨流程。
  • 再后來我們發(fā)現(xiàn)除了主業(yè)務(wù)-下單購物之外,還需要兼顧支線業(yè)務(wù)-退款退貨,此時(shí)不得不需要引入“退款中”狀態(tài)并且增加退款子狀態(tài)機(jī)、退貨子狀態(tài)機(jī)。

以上這些我最開始是用文字描述,然后加上憑感覺畫的流程圖來表示,服務(wù)端RD很難理解,并且無法清楚所有狀態(tài)以及轉(zhuǎn)移條件,不得不多次反復(fù)確認(rèn)。

后來去搜索相關(guān)的資料,好好研究了一下狀態(tài)機(jī)這個(gè)概念,才發(fā)現(xiàn)其實(shí)用一張圖就可以表述清楚以上的一切。

接下來,我就來講講我對(duì)狀態(tài)機(jī)的理解和認(rèn)識(shí),希望對(duì)大家有點(diǎn)幫助。

二、狀態(tài)機(jī)的來源?

最早是電路設(shè)計(jì)領(lǐng)域里面的概念,具體來說是一種根據(jù)電路信號(hào)按照預(yù)先設(shè)定的狀態(tài)進(jìn)行轉(zhuǎn)移,協(xié)調(diào)相關(guān)信號(hào)動(dòng)作并完成特定操作的控制硬件。

后來軟件編程里面繼承了這種思想,用來表示有限多個(gè)狀態(tài)以及在這些狀態(tài)之間轉(zhuǎn)移和動(dòng)作的模型。簡稱為FSM(Finite State Machine),是常見的軟件設(shè)計(jì)模式之一。

對(duì)于PM來說,借鑒這種思想并融入到自己的產(chǎn)品思維中是很有必要的。據(jù)此設(shè)計(jì)業(yè)務(wù)實(shí)體的功能會(huì)更容易闡述本質(zhì),并且讓技術(shù)更容易理解。

三、狀態(tài)機(jī)是什么?

從PM的角度可以這樣定義,狀態(tài)機(jī)用來表示業(yè)務(wù)實(shí)體的全部狀態(tài)以及相互間如何轉(zhuǎn)移。

其中,業(yè)務(wù)實(shí)體是指客觀上可以相互區(qū)分的事物,比如訂單、優(yōu)惠券、商品、活動(dòng)……

當(dāng)然扯遠(yuǎn)一點(diǎn),大部分對(duì)象都是有狀態(tài)的概念,只是沒必要都畫個(gè)狀態(tài)機(jī)圖。

3.1 狀態(tài)機(jī)的描述方法

文字是最古老的方式,繁瑣并且不容易理解。
另外表格也可以描述,不夠形象,理解較慢。
我認(rèn)為圖形最佳,僅需一些節(jié)點(diǎn)表示狀態(tài)然后用有向線條連接。

3.2 常見的狀態(tài)機(jī)

舉一些例子讓大家對(duì)狀態(tài)機(jī)圖有個(gè)基本的認(rèn)知。

(1)燈泡狀態(tài)機(jī)

小時(shí)候第一堂物理課講解的電燈開關(guān)其實(shí)就是最簡單的狀態(tài)機(jī)。

(2)訂單狀態(tài)機(jī)

這個(gè)網(wǎng)購過的朋友應(yīng)該都接觸過,借鑒自淘寶。

3.3 狀態(tài)機(jī)的要素

從狀態(tài)機(jī)的內(nèi)在因果關(guān)系可以抽象出3大要素:

  • 現(xiàn)態(tài):是指當(dāng)前所處的狀態(tài)。
  • 條件:系統(tǒng)按照某一規(guī)則或者用戶執(zhí)行某個(gè)動(dòng)作后,,狀態(tài)會(huì)進(jìn)行遷移。
  • 次態(tài):條件滿足后遷移到的新狀態(tài)。

包含1個(gè)開始狀態(tài)和N個(gè)終止?fàn)顟B(tài),以及若干個(gè)中間狀態(tài)。當(dāng)?shù)竭_(dá)終態(tài), 狀態(tài)機(jī)停止。

注意:有些工程師會(huì)把條件和動(dòng)作分成2種要素,感覺不是特別恰當(dāng)。因?yàn)閯?dòng)作本身就是條件的一種。

四、怎么畫狀態(tài)機(jī)?

我習(xí)慣使用Axure,以它來講解怎么表示,其他工具方法類似。

4.1 要素怎么表示

“狀態(tài)”使用圓角矩形表示。

“條件”使用有向線條上的文字表示,比如系統(tǒng)怎么樣,或者用戶執(zhí)行xx動(dòng)作。

線條的方向表示狀態(tài)遷移。

一般情況下從左向右的畫圖順序表示了初始→終止的方向,所以無需單獨(dú)表示。復(fù)雜情況下可以用實(shí)心黑圓點(diǎn)初始狀態(tài),用實(shí)心黑圓點(diǎn)外包一個(gè)圓圈表示終止?fàn)顟B(tài)。

4.2 要素如何命名

狀態(tài)建議以”已+動(dòng)詞”的結(jié)構(gòu)來命名,比如已付款、已發(fā)貨。

條件建議以”動(dòng)作+結(jié)果”的動(dòng)賓結(jié)構(gòu)或者”表達(dá)式”來命名,以明確狀態(tài)遷移的具體條件。比如支付失敗、下單時(shí)間>72小時(shí)。

注意命名一般站在用戶立場,盡量命名標(biāo)準(zhǔn)化。

4.3 畫出狀態(tài)機(jī)

  • 理解業(yè)務(wù)實(shí)體有多少種狀態(tài)
  • 考慮每一個(gè)狀態(tài)因?yàn)槭裁礂l件而變化
  • 將狀態(tài)和狀態(tài)之間用條件有向連接
  • 形成狀態(tài)機(jī)圖
  • 和服務(wù)端RD討論并確定

4.4 畫圖注意點(diǎn)

不需要的狀態(tài)盡量去除,讓狀態(tài)機(jī)結(jié)構(gòu)最簡單。

明確只有一個(gè)初始狀態(tài),終止?fàn)顟B(tài)可能有多個(gè)。

合理實(shí)現(xiàn)各個(gè)狀態(tài)之間的切換。

方便擴(kuò)展,狀態(tài)有可能會(huì)增加,有可能會(huì)有子狀態(tài)機(jī)。

注意不要遺漏狀態(tài),比如優(yōu)惠券使用的狀態(tài)機(jī)可能需要“使用中”

不要搞混動(dòng)作和狀態(tài)的區(qū)別,命名本身就不一樣。而本質(zhì)上動(dòng)作是不穩(wěn)定的,一旦執(zhí)行完畢就結(jié)束了;而狀態(tài)是穩(wěn)定的,只要沒有外部條件觸發(fā)。

4.5 延展一下多維狀態(tài)機(jī)

剛剛這2個(gè)例子是最簡單的狀態(tài)結(jié)構(gòu)。只有一級(jí),只有一維。

比如退款退貨是訂單的逆向流程,形成了多個(gè)維度的狀態(tài)機(jī)。

?4.6 狀態(tài)機(jī)圖和流程圖的區(qū)別

經(jīng)常有人把狀態(tài)機(jī)圖給錯(cuò)認(rèn)為是流程圖的一種,其實(shí)他們本質(zhì)不一樣。

目的不一樣,流程圖表示的是流程,狀態(tài)機(jī)圖表示的是業(yè)務(wù)實(shí)體的狀態(tài)變化。

另外,流程圖中的節(jié)點(diǎn)一般是動(dòng)作,而狀態(tài)機(jī)圖的節(jié)點(diǎn)是狀態(tài)。

準(zhǔn)確來說,狀態(tài)機(jī)圖是UML語言中的一種。

五、總結(jié)

不是所有的業(yè)務(wù)實(shí)體都有必要產(chǎn)出狀態(tài)機(jī)圖,關(guān)鍵的建議產(chǎn)出。

最后留2個(gè)思考,可以一起討論下:

  1. 京東小程序的首頁,有個(gè)領(lǐng)券功能,試問它的狀態(tài)機(jī)有幾個(gè),分別怎么畫,是否有其他設(shè)計(jì)問題。
  2. 電商領(lǐng)域中優(yōu)惠券功能模塊有幾個(gè)業(yè)務(wù)實(shí)體,分別畫出狀態(tài)機(jī)圖。

#專欄作家#

作者:浪子,人人都是產(chǎn)品經(jīng)理專欄作家,業(yè)務(wù)型產(chǎn)品經(jīng)理,3年社交+4年電商的工作經(jīng)驗(yàn),個(gè)人公眾號(hào):langzisay。

本文由 @浪子 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 為啥sku全退是到了已完成狀態(tài)?

    來自廣東 回復(fù)
  2. 贊!看完這么多文章就你的文章最詳細(xì)易懂,感謝分享!另外能不能解答一下最后兩個(gè)思考呢

    來自廣東 回復(fù)
  3. 贊一個(gè)!遇到多、復(fù)雜狀態(tài)的時(shí)候確實(shí)應(yīng)該用狀態(tài)機(jī)來描述邏輯,比文字強(qiáng)太多!

    來自天津 回復(fù)
  4. sku是否全退是啥意思

    來自北京 回復(fù)
    1. 舉例:買了兩部手機(jī),退了其中一部。

      來自湖北 回復(fù)
    2. 準(zhǔn)確來說,應(yīng)該是買了一部iPhone8一部iPhoneX,退了其中一部。(這2者是不同的SKU商品)

      來自香港 回復(fù)
    3. 為什么款項(xiàng)沒有全退的情況下,后面還有sku是否全退的判斷,我理解沒有全額退款,必然只退了部分sku,所以狀態(tài)必然轉(zhuǎn)變?yōu)榇l(fā)貨或待收貨。請(qǐng)解答一下~

      來自北京 回復(fù)
    4. 同問

      來自浙江 回復(fù)
  5. 有兩個(gè)子狀態(tài)機(jī)不太理解,按照流程不是應(yīng)該先買家申請(qǐng)退貨,然后確定退回sku個(gè)數(shù),然后賣家確定后才能收到退款嗎

    來自上海 回復(fù)
  6. UML里面不是有個(gè)叫狀態(tài)圖的嗎?怎么弄出個(gè)狀態(tài)機(jī)的概念了

    來自廣東 回復(fù)
    1. 是一個(gè)東西,只是畫法有點(diǎn)區(qū)別。

      來自美國 回復(fù)
  7. 感覺狀態(tài)機(jī)圖也能畫出狀態(tài)和流程的結(jié)合體了,那還有流程圖的必要嗎?

    來自福建 回復(fù)
    1. 狀態(tài)機(jī)和一般的流程圖區(qū)別還是很大的,結(jié)合起來會(huì)搞得很混亂。根本沒辦法把狀態(tài)和流程講得清楚。

      來自美國 回復(fù)
  8. 好棒!簡單易懂!想請(qǐng)問一下作者,關(guān)于狀態(tài)機(jī)有沒有可以推薦的書籍或?qū)冢?/p>

    來自福建 回復(fù)
    1. 建議搜狀態(tài)機(jī)的文章看,書籍里面重點(diǎn)講解狀態(tài)機(jī)的只有uml書籍,比如火球大戰(zhàn)uml分析,軟件方法上之類的。

      來自上海 回復(fù)
  9. axure的flow里沒有開始結(jié)束狀態(tài)的圓圈 ??

    來自江蘇 回復(fù)
    1. 自制,so easy。

      來自上海 回復(fù)
  10. 狀態(tài)機(jī),不錯(cuò)的機(jī)

    回復(fù)
  11. 好吧,當(dāng)年都用rose畫狀態(tài)圖,中間用visio,現(xiàn)在用axure簡單畫

    來自江蘇 回復(fù)
    1. 從工具的角度來看,越來越不專業(yè)了。
      好奇什么原因?

      回復(fù)
    2. 效率一個(gè)比一個(gè)高。

      來自北京 回復(fù)
    3. 嗯,算是一個(gè)原因。

      來自上海 回復(fù)
  12. UML里面有種叫時(shí)序圖,可以表達(dá)出事件影響狀態(tài)的變化

    來自浙江 回復(fù)
    1. 嗯啊,感覺比活動(dòng)圖更適合表現(xiàn)具體的業(yè)務(wù)流程。
      不過當(dāng)下敏捷橫行,基本上都不畫比較規(guī)范的時(shí)序圖了。

      來自上海 回復(fù)
  13. 回復(fù)
  14. 最近也了解了狀態(tài)機(jī)的問題,諸位也可以去看看層次狀態(tài)機(jī)

    來自廣東 回復(fù)
    1. 求個(gè)層次狀態(tài)機(jī)在消費(fèi)領(lǐng)域APP的實(shí)際場景。

      回復(fù)
  15. 狀態(tài)泳道加動(dòng)作節(jié)點(diǎn)

    來自山東 回復(fù)
    1. 狀態(tài)機(jī)沒有泳道的概念啊,完全是不同的分析角度和對(duì)象

      回復(fù)
    2. 小白問個(gè)問題,求輕噴。。把你這個(gè)狀態(tài)機(jī)加上各個(gè)狀態(tài)不是就變成泳道圖了?這個(gè)和業(yè)務(wù)流程圖有什么區(qū)別?隨著業(yè)務(wù)的流動(dòng),狀態(tài)也有相應(yīng)的改變,怎么去區(qū)分呢?

      來自四川 回復(fù)
    3. 1、狀態(tài)機(jī)圖描述的是狀態(tài)的變化。泳道圖一般描述的是功能的具體步驟,一個(gè)是status,一個(gè)是action,本質(zhì)不一樣。
      2、這個(gè)是偏功能層面的,和業(yè)務(wù)流程圖是2個(gè)維度的。你可以看下我最新的文章。

      來自上海 回復(fù)
    4. 泳道圖方框里是“動(dòng)作”,狀態(tài)機(jī)連線上是“動(dòng)作”

      來自天津 回復(fù)
  16. 挺好

    回復(fù)