技術方案設計的方法

程式設計一生 發表於 2020-11-21

背景

 

前段時間接手了一個還處於方案設計階段的工作,我重新做了設計。覺得新方案比舊方案業務清晰明朗、解決了舊方案的缺陷。我就很高興,跟同事聊這個事情。同事就問我是怎麼想到這些的呢。

 

我說了一些細節的,但是沒有把核心本質講出來。我覺得這是個很難回答的問題。因為一個方案怎麼更合適,主要因素包含業務理解、個人經驗、思維邏輯。這3個要素一般都是靠經年累月的積累才獲得的。從這些中提取出別人可以學習和使用的方法確實不是一會兒就能想出來的事情。

 

市面上可以看到的關於技術方案設計的經典的書都沒有仔細的去講這個問題。比如《人月神話》講的是專案大了怎麼辦、《架構即未來》講的是架構擴充套件性的問題。那對於最普通的CURD(建立更新讀取刪除)系統究竟怎麼去設計。都是做CURD的,架構師和普通開發區別在哪裡。本文就來探討一下這個問題。

 

CURD系統怎麼做出技術含量

 

我前幾年在面試別人的時候,遇到過一些面試者,已經帶領別人做過專案了。可能人家的管理能力是不錯的。專案管理是個博大精深的學問,可能一個專案在不同的階段,更上層會找不同的管理者來做。

 

比如初創團隊,會找些善於創業、擅長打造敏捷團隊的管理者。這樣的管理者可能會比較善於鼓舞團隊士氣。而到了一定階段,專案業務量起來之後,不再求快,而是求穩。這時候管理者可能會換人,新的管理者做事並不那麼快,但是做決策的路很正。路很正怎麼理解,打個比方說:別人提了需求,前一個領導人很好,人家來需求他就接。這個領導不是,他會分析利弊和領域、業務是否合適放在這裡。再比如更一層領導提了一個需求,要求什麼什麼時間做完。這個領導會去分析上層領導更本質的需求,寧可延期,要做穩做好。而專案穩定之後,繼續穩定下去已經沒有什麼業績了。這時候可能會再換領導,這個領導會帶來一些原來積累的規劃、方法。

 

總之,這個面試者可能有這些能力,但是我們要招聘一個技術人員,先考察硬實力,所以很自然的先請他介紹之前的專案做了什麼和怎麼做的。他自己也很沒底氣的說就是CURD嘛。給人感覺就是沒有想法,在工作過程中思考的少。

拿一個後臺管理系統來說,要對重要資料進行新增修改刪除,一般需要稽核、審計,敏感資料脫敏,甚至需要資料灰度。將這整套流程串聯起來,需要一個工作流系統,可能會用到工作流引擎。目前有些資料脫敏已經用上了NLP(自然語言處理)技術。這裡面每一步都涉及知識點。

 

資料模型


有限狀態機設計

 

剛才提到後臺管理系統裡用到稽核、審計、灰度。這三個可以與業務流程分離,做成三個工具元件。稽核有稽核狀態:稽核中、稽核成功,稽核失敗。灰度也有待灰度、灰度中、灰度成功、灰度失敗四種狀態。

 

假如有一條資料,目前它的狀態可以分成資料狀態:有效資料和無效資料。另外還有稽核狀態和灰度狀態。這時候資料模型(可以簡單理解成資料庫的資料表設計)應該設計成三個狀態用三個資料欄位表示呢,還是用一個資料欄位來表示這三種狀態呢。

 

這要看情況,一般來說,如果三種狀態之前是相互獨立的,比如:稽核中是否可以待灰度,也可能是灰度中?對於一個工作流系統來說,一般要先稽核通過才會進行灰度流程。就是說各個狀態是互斥的。所以設計成三個欄位,程式的判斷邏輯會很複雜,因為有些組合是不成立的。這時候更合理的一個設計是用一個狀態欄位表示,通過狀態機流轉來控制。

 

設計方案中可以通過類似下面的流轉圖來體現:

技術方案設計的方法

 

 

 

實際方案設計過程中我改造了一下,狀態正常從左到右流轉,將終態用不同的形狀(這裡用橢圓)來表示。這樣表示秩序感強些,更好理解。

技術方案設計的方法

 

 

 

資料表設計

 

在資料表設計時,要至少考慮資料型別、是否預設、是否為空和索引設計。比如對於錢什麼的,需要用decimal(10,2),具體精確到多少位,要根據業務理解來定。對於加密字元什麼的,加密如果是md5的,可以用char,而不用varchar來提高效率。

 

這裡面就好像《紅樓夢》裡的臺詞一樣,每條都很有學問。所以面試時的場景題也經常愛讓進行一個資料表設計。

 

 

流程設計

 

我比較建議在一個設計方案開始時先把設計流程圖先給出來,便於對方案有個整體認知。

 

流程圖也很有學問,【億圖】軟體上把流程圖分成了下面的子類。

技術方案設計的方法

 

我個人最常用的是泳道圖和BPMN。BPMN可以簡單理解為業務流程圖和泳道圖差別不大。就是在普通流程圖基礎上增加一個分類,這個分類可以是階段、也可以是執行者這些。就是給流程圖多增加一個維度的資訊,理解起來更清晰。

技術方案設計的方法

 

總結

 

在設計方案裡還必須要有里程碑和未來規劃。有句廢話叫只怕有心人。在工作中,往往工作出色的並不是最聰明的,也不是花時間最長的。而是真正用心做的人。特別是設計方案,建議多用前人和大家總結的設計模板。模板最能代表一種設計思路。自己想到的、設計模板想到的都要考慮清楚,把方案做細。

 

遇到具體的問題,要做業界調研。之前聽過一個實習生做的方案,他說業界調研的時候並沒有查到特別相關的方案資料。當時我的領導就說了一句特別值得思考的話:如果沒有查到,肯定是你的檢索關鍵詞不對。

 

我後來反覆斟酌這句話,發現能想到的檢索關鍵詞才是真正體現自己對業務理解的。同時,業界調研的時候不僅要對業務相關做調研,需求可以分解,具體到每個步驟也需要調研。調研過程是個極好的學習機會。

 

下功夫和不下功夫的區別,想想《紅樓夢》,之所以這麼多紅學者。人家紅樓夢的作者設計每句話都是劇透,人物說出的話,都會被啪啪打臉。裡面的每道菜譜都是值得專業廚師來研究的。這都是心用到了。優秀架構師也是這樣煉成的。之所以說這個廢話,因為我就被diss過方案做的不夠細,我也看過別人的方案不夠細的。時常回想被diss不夠細的那句話,覺得真的是金玉良言。心懷感激。