如何繪畫狀態(tài)機(jī)來描述業(yè)務(wù)的變化
對(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è)思考,可以一起討論下:
- 京東小程序的首頁,有個(gè)領(lǐng)券功能,試問它的狀態(tài)機(jī)有幾個(gè),分別怎么畫,是否有其他設(shè)計(jì)問題。
- 電商領(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)載。
為啥sku全退是到了已完成狀態(tài)?
贊!看完這么多文章就你的文章最詳細(xì)易懂,感謝分享!另外能不能解答一下最后兩個(gè)思考呢
贊一個(gè)!遇到多、復(fù)雜狀態(tài)的時(shí)候確實(shí)應(yīng)該用狀態(tài)機(jī)來描述邏輯,比文字強(qiáng)太多!
sku是否全退是啥意思
舉例:買了兩部手機(jī),退了其中一部。
準(zhǔn)確來說,應(yīng)該是買了一部iPhone8一部iPhoneX,退了其中一部。(這2者是不同的SKU商品)
為什么款項(xiàng)沒有全退的情況下,后面還有sku是否全退的判斷,我理解沒有全額退款,必然只退了部分sku,所以狀態(tài)必然轉(zhuǎn)變?yōu)榇l(fā)貨或待收貨。請(qǐng)解答一下~
同問
有兩個(gè)子狀態(tài)機(jī)不太理解,按照流程不是應(yīng)該先買家申請(qǐng)退貨,然后確定退回sku個(gè)數(shù),然后賣家確定后才能收到退款嗎
UML里面不是有個(gè)叫狀態(tài)圖的嗎?怎么弄出個(gè)狀態(tài)機(jī)的概念了
是一個(gè)東西,只是畫法有點(diǎn)區(qū)別。
感覺狀態(tài)機(jī)圖也能畫出狀態(tài)和流程的結(jié)合體了,那還有流程圖的必要嗎?
狀態(tài)機(jī)和一般的流程圖區(qū)別還是很大的,結(jié)合起來會(huì)搞得很混亂。根本沒辦法把狀態(tài)和流程講得清楚。
好棒!簡單易懂!想請(qǐng)問一下作者,關(guān)于狀態(tài)機(jī)有沒有可以推薦的書籍或?qū)冢?/p>
建議搜狀態(tài)機(jī)的文章看,書籍里面重點(diǎn)講解狀態(tài)機(jī)的只有uml書籍,比如火球大戰(zhàn)uml分析,軟件方法上之類的。
axure的flow里沒有開始結(jié)束狀態(tài)的圓圈 ??
自制,so easy。
狀態(tài)機(jī),不錯(cuò)的機(jī)
好吧,當(dāng)年都用rose畫狀態(tài)圖,中間用visio,現(xiàn)在用axure簡單畫
從工具的角度來看,越來越不專業(yè)了。
好奇什么原因?
效率一個(gè)比一個(gè)高。
嗯,算是一個(gè)原因。
UML里面有種叫時(shí)序圖,可以表達(dá)出事件影響狀態(tài)的變化
嗯啊,感覺比活動(dòng)圖更適合表現(xiàn)具體的業(yè)務(wù)流程。
不過當(dāng)下敏捷橫行,基本上都不畫比較規(guī)范的時(shí)序圖了。
好
最近也了解了狀態(tài)機(jī)的問題,諸位也可以去看看層次狀態(tài)機(jī)
求個(gè)層次狀態(tài)機(jī)在消費(fèi)領(lǐng)域APP的實(shí)際場景。
狀態(tài)泳道加動(dòng)作節(jié)點(diǎn)
狀態(tài)機(jī)沒有泳道的概念啊,完全是不同的分析角度和對(duì)象
小白問個(gè)問題,求輕噴。。把你這個(gè)狀態(tài)機(jī)加上各個(gè)狀態(tài)不是就變成泳道圖了?這個(gè)和業(yè)務(wù)流程圖有什么區(qū)別?隨著業(yè)務(wù)的流動(dòng),狀態(tài)也有相應(yīng)的改變,怎么去區(qū)分呢?
1、狀態(tài)機(jī)圖描述的是狀態(tài)的變化。泳道圖一般描述的是功能的具體步驟,一個(gè)是status,一個(gè)是action,本質(zhì)不一樣。
2、這個(gè)是偏功能層面的,和業(yè)務(wù)流程圖是2個(gè)維度的。你可以看下我最新的文章。
泳道圖方框里是“動(dòng)作”,狀態(tài)機(jī)連線上是“動(dòng)作”
挺好