談?wù)劶夹g(shù)架構(gòu)的設(shè)計(jì)方法
這篇文章我其實(shí)更想跟大家聊聊一些常用的思考方法,思考問(wèn)題的方式對(duì)了,往往可以幫助大家少走彎路。
常用思考方法
技術(shù)常用思考方法
技術(shù)思考本質(zhì)還是結(jié)構(gòu)化思考,所以常見(jiàn)的結(jié)構(gòu)化思考方法也是適用的。這也是大家會(huì)看到很多技術(shù)架構(gòu)師都會(huì)用一些方法論去分析問(wèn)題的原因。但這里我不是重新去論述這些常見(jiàn)的技巧,而是分享從技術(shù)實(shí)戰(zhàn)中得到的一些思考方法,為此我分為了技術(shù)架構(gòu)設(shè)計(jì)的方法和技術(shù) Leader 的思考方法兩類。
技術(shù)架構(gòu)思考方法
0--->1
這個(gè)思考方法的含義是:
當(dāng)我們?cè)谝欢衙悦:突靵y中不知道如何下口時(shí),應(yīng)該先貼近問(wèn)題本身,還原客觀事實(shí),并快速形成 1 個(gè)能夠拉起認(rèn)知并快速討論迭代優(yōu)化的版本。大家圍繞著這樣的一個(gè)初始版本去疊加和豐富其他維度的內(nèi)容,直到方案的共識(shí)。
我舉一個(gè)實(shí)際的 CASE,大家在談某平臺(tái)能力升級(jí)的方案時(shí)候會(huì)經(jīng)常喜歡用 PPT 畫一些模塊圖,試圖通過(guò)一些抽象的詞匯來(lái)厘定清楚邊界,核心概念。大家以為是在講本質(zhì)講原則但實(shí)際所有人聽(tīng)了都是云里霧里,不知所云。因?yàn)橥ㄟ^(guò)概念去推導(dǎo)概念是無(wú)法真正回答問(wèn)題的。
而比較好的應(yīng)對(duì)方法我總結(jié)為以下三個(gè)步驟:
- 用戶視角的客觀世界還原
用戶故事的串聯(lián),基于交互流程和真實(shí)的數(shù)據(jù)來(lái)描繪這件事在客觀世界中用戶視角看來(lái)是怎么發(fā)生的。這就是我們找準(zhǔn)一個(gè)大家都能夠共識(shí)的視角,讓所有人快速把客觀事實(shí)搞清楚畫出來(lái)這個(gè) 1,而這個(gè) 1 就是后續(xù)討論的靶子 。這個(gè) 1 的表現(xiàn)形式我認(rèn)為往往都是很簡(jiǎn)單的,要么是交互時(shí)序圖,要么是 Excel 表格,而不是復(fù)雜的模塊概念圖。
- 客觀信息的結(jié)構(gòu)化整合與提煉
只是樹(shù)立起來(lái) 1 這個(gè)初始版本,還遠(yuǎn)遠(yuǎn)不夠。因?yàn)榈谝粋€(gè)步驟只是將模糊、混亂的東西通過(guò)一種方法信息化表達(dá)出來(lái),這還遠(yuǎn)遠(yuǎn)達(dá)不到使用的程度。所以還需要將上述信息進(jìn)行結(jié)構(gòu)化的整合與提煉,因?yàn)樾畔⒅挥薪?jīng)過(guò)結(jié)構(gòu)化才能夠變成有意義的知識(shí),才能夠與之前的經(jīng)驗(yàn)形成互動(dòng),也才能夠進(jìn)行初版的設(shè)計(jì)加工。比如對(duì)數(shù)據(jù)流的處理,就會(huì)發(fā)現(xiàn)有哪些是可以合并的同類項(xiàng),有哪些平衡校驗(yàn)邏輯等。
- 加入多元視角的檢驗(yàn)與抽象
通過(guò)第二步的處理把 1 這個(gè)版本變得更加豐滿,但是要形成完整的可實(shí)施方案還遠(yuǎn)遠(yuǎn)不夠。我們還需要加入更多維度的校驗(yàn)和抽象,比如進(jìn)一步抽象以看透其本質(zhì),比如加入重要異常,ROI,合理性等擴(kuò)展性等多方的視角去做校驗(yàn)。
所以大家以后在遇到很多方案談不清楚的時(shí)候,不要去聽(tīng)別人講什么原則,概念,價(jià)值等等虛頭巴腦的東西。把大家拉回來(lái),回到最簡(jiǎn)單的最樸素的東西來(lái)對(duì)焦,那就是 一張交互序列圖 或者 一張表格。越快速?gòu)囊欢衙悦V锌焖偬釤挸鲞@個(gè) 1 ,就越容易快速拿到結(jié)果。
1--->0
這個(gè)思考方法的含義是:
當(dāng)我們?cè)谧鲆粋€(gè)方案時(shí)面臨無(wú)數(shù)因素?zé)o法抓住關(guān)鍵點(diǎn)時(shí),我們應(yīng)該考慮刪除法(把這個(gè) 1 拿掉不要行不行)去尋找決定性因素,以確保我們是真正的抓到了關(guān)鍵點(diǎn)。
我舉一個(gè)實(shí)際的 CASE,每年都會(huì)做技術(shù)規(guī)劃,相信這是很多架構(gòu)師/Leader 很痛苦的事。痛苦的根源就是在腦子里面有無(wú)數(shù)需求,有無(wú)數(shù)的待優(yōu)化點(diǎn),也有無(wú)數(shù)的想法在縈繞,看到每個(gè)點(diǎn)覺(jué)得值得在新一年做攻堅(jiān)。最終多半形成的就是一個(gè)表格,把今年要做的事羅列下,最多還排個(gè)優(yōu)先級(jí),好一點(diǎn)的換個(gè)形式變成 xmind 或者 PPT,再稍微好一點(diǎn)的可能會(huì)搭配上業(yè)務(wù)的目標(biāo)和策略打法。但透過(guò)這些表面現(xiàn)象,其本質(zhì)就是一個(gè)表格,沒(méi)有抓住重點(diǎn)的表格。相信大家應(yīng)該都看得蠻多的了。
如何應(yīng)對(duì)這類問(wèn)題我總結(jié)為一下幾個(gè)技巧:
- 因果判斷法
很多時(shí)候我們都在談,要抓住事情的本質(zhì),要具備化繁為簡(jiǎn)的能力,其實(shí)就是在談通過(guò)表面的結(jié)果去探究真實(shí)的原因。所以在看哪些是決定性因素時(shí),大家不妨用因果法去檢驗(yàn):這個(gè)因素到底是深層次原因還是誘導(dǎo)的結(jié)果。
- 樹(shù)干樹(shù)枝法
有時(shí)候各個(gè)因素之前并不是單純的因果關(guān)系,而是依附關(guān)系,就像是樹(shù)枝依附在樹(shù)干上一樣。而我們要找到?jīng)Q定性因素,可以嘗試這個(gè)方法去檢驗(yàn):如果把這個(gè)因素去掉會(huì)不會(huì)影響全局,是不是導(dǎo)致結(jié)論不成立。通過(guò)這樣多輪的分析,是可以繪制出來(lái)樹(shù)干的與樹(shù)枝的關(guān)系,這個(gè)樹(shù)干就是要找的決定性因素。
- 支點(diǎn)撬動(dòng)法
有時(shí)候各個(gè)因素之間可能沒(méi)有直接或者間接關(guān)系,或者這個(gè)關(guān)聯(lián)關(guān)系太弱很難通過(guò)以上兩個(gè)手段去確定關(guān)鍵點(diǎn)??梢試L試支點(diǎn)撬動(dòng)的辦法,即尋找可以激發(fā)這一堆要素的關(guān)鍵要素。我之前給團(tuán)隊(duì)舉一個(gè)例子,國(guó)家抓經(jīng)濟(jì)肯定不可能是米面糧油各種瑣碎地抓,肯定是找到幾個(gè)關(guān)鍵點(diǎn)起到支點(diǎn)撬動(dòng)的作用,如房地產(chǎn)行業(yè)。抓住這個(gè)就能夠帶動(dòng)上下游產(chǎn)業(yè),進(jìn)而激發(fā)各行各業(yè)。
以上是目前實(shí)踐下來(lái)的抓取關(guān)鍵點(diǎn)的一些方法。但這里一定也要注意一個(gè)粒度問(wèn)題,千萬(wàn)不要走極端。比如一提關(guān)鍵點(diǎn),就去思考本質(zhì),一提到本質(zhì)就去找根因,一找根因就挖到人性,然后得出來(lái)就是人性的原罪問(wèn)題。這種都是沒(méi)有任何營(yíng)養(yǎng)的做法,也不利于事情的推動(dòng)解決。
1--->2
這個(gè)思考方法的含義是:
當(dāng)我們思考一些抽象問(wèn)題/方案時(shí)候,需要對(duì)問(wèn)題進(jìn)行拆分(一分為二),通過(guò)分而治之的方法來(lái)確定每個(gè)小問(wèn)題的邊界,通過(guò)對(duì)小問(wèn)題的解決來(lái)降低全局的思考難度,以盡快形成解決方案。
這個(gè)應(yīng)該不需要舉例子了,大家日常都應(yīng)該有所接觸,這里只是列舉幾個(gè)比較典型的技術(shù)架構(gòu)動(dòng)作:
- 縱深拆解
拆解是非常好的一個(gè)將問(wèn)題分而治之的辦法,但要注意的是要做有機(jī)的拆解而不是物理的分解。比較典型的案例就是關(guān)于故障指標(biāo)這個(gè)課題的處理,我是見(jiàn)過(guò)有團(tuán)隊(duì)層層分解,把故障指標(biāo)分解到每個(gè)同學(xué)身上,這是極其錯(cuò)誤的做法,也不可能得到想要的結(jié)果。我們應(yīng)該是要做拆解,就是把要守住故障指標(biāo)這個(gè)結(jié)果拆解成哪幾類關(guān)鍵動(dòng)作,進(jìn)而要求團(tuán)隊(duì)關(guān)鍵動(dòng)作做到位,而不是強(qiáng)行分解指標(biāo)。
- 橫向解剖
做過(guò)實(shí)際研發(fā)的同學(xué)一定遇到一些業(yè)務(wù)需求的討論,很多時(shí)候來(lái)來(lái)回回扯不清楚,而且經(jīng)常會(huì)出現(xiàn)產(chǎn)品說(shuō)這是技術(shù)架構(gòu)問(wèn)題,技術(shù)架構(gòu)說(shuō)這是業(yè)務(wù)需求問(wèn)題,業(yè)務(wù)方說(shuō)這是產(chǎn)品設(shè)計(jì)問(wèn)題的現(xiàn)象。要解決這個(gè)僵局就需要把這個(gè)問(wèn)題進(jìn)行解剖,一層一層解剖清楚,把業(yè)務(wù)需求問(wèn)題描述清楚,把產(chǎn)品設(shè)計(jì)搞清楚,把技術(shù)方案搞清楚。每一層都面向上游屏蔽下游的細(xì)節(jié),才有可能把問(wèn)題定義得清楚。一般來(lái)說(shuō),將這件事參與的角色進(jìn)行解剖會(huì)更容易看得全面,更透徹。
以上是我實(shí)踐對(duì)問(wèn)題拆分的一些方法技巧,凡事多看幾層終歸是能夠更加有結(jié)構(gòu)性地認(rèn)知事情本事,也越有利于問(wèn)題的解決。
1--->N
這個(gè)思考方法的含義是:
當(dāng)我們思考一些技術(shù)方案時(shí)候,不要僅局限在當(dāng)時(shí)當(dāng)刻的條件約束,要適當(dāng)考慮系統(tǒng)的承載從 1 變到 N 的過(guò)程中的對(duì)系統(tǒng)架構(gòu)帶來(lái)的挑戰(zhàn)。
做技術(shù)架構(gòu)師的都知道做架構(gòu)要求有前瞻性,不能被業(yè)務(wù)拖著走。但很多時(shí)候我們其實(shí)沒(méi)有仔細(xì)思考如何才能夠做到前瞻性,我總結(jié)為最關(guān)鍵的考慮的因素就是時(shí)間,把時(shí)間拉長(zhǎng)來(lái)考慮關(guān)鍵生產(chǎn)資料可能發(fā)生什么變化,通過(guò)去架構(gòu)這種變化所得出來(lái)的方案就具備了前瞻性。一般意義上來(lái)說(shuō),我們平臺(tái)演進(jìn)的生產(chǎn)資料抽象地歸納為三類:
- 業(yè)務(wù)場(chǎng)景:這是最原始的生存資料,更是平臺(tái)演進(jìn)的源動(dòng)力。典型的如市場(chǎng)份額變化,用戶體價(jià)值的變化,競(jìng)對(duì)動(dòng)態(tài)等。
- 團(tuán)隊(duì)組織:是人創(chuàng)造了平臺(tái),也是主導(dǎo)平臺(tái)的演進(jìn)發(fā)展,這個(gè)生產(chǎn)資料如果不能得到有效利用,充分釋放能動(dòng)性就會(huì)出現(xiàn)平臺(tái)無(wú)法支持業(yè)務(wù)快速發(fā)展,同時(shí)人也在平臺(tái)中內(nèi)卷。
- 技術(shù)架構(gòu):技術(shù)架構(gòu)其實(shí)本身也是非常重要的生產(chǎn)資料,這是很多人會(huì)忽略的地方。大家想一個(gè)最簡(jiǎn)單的例子,同一個(gè)變量分散在多個(gè)地方導(dǎo)致語(yǔ)義不清,維護(hù)成本巨大就明白了。
針對(duì)這幾個(gè)生產(chǎn)資料我抽取了幾個(gè)技巧去思考如何從 1 擴(kuò)張到 N:
- 架構(gòu)考慮所有可能性但做有限明確實(shí)施
從業(yè)務(wù)場(chǎng)景的變化情況來(lái)看,的確充滿很多不確定性。也遇到過(guò)一種典型的業(yè)務(wù)與架構(gòu)的死循環(huán)的情況:前端業(yè)務(wù)面臨太多不確定性需要技術(shù)架構(gòu)給予專業(yè)意見(jiàn)和評(píng)估,但是技術(shù)架構(gòu)認(rèn)為業(yè)務(wù)啥都想不清楚還要我評(píng)估這評(píng)估那,兩邊就開(kāi)始互相死鎖。
而比較好的做法就是架構(gòu)能夠基于自己的經(jīng)驗(yàn)和業(yè)務(wù)變化的理解,將可能性進(jìn)行羅列考慮,然后給出來(lái)基于 XX 業(yè)務(wù)假設(shè)下,系統(tǒng)架構(gòu)需要 XX 量級(jí)的工作量做 XX 樣的能力迭代升級(jí),可以做到 XX 的業(yè)務(wù)效果和價(jià)值,但需要進(jìn)一步 XX 的業(yè)務(wù)輸入。這就是架構(gòu)考慮所有的可能性的含義,是需要給予業(yè)務(wù)的選擇。
但技術(shù)架構(gòu)實(shí)施卻未必是要留有太多的空白,架構(gòu)要大但是實(shí)施要小,對(duì)于值得留白的地方做好擴(kuò)展設(shè)計(jì),對(duì)于實(shí)在看不清楚的地方就要明確攔截(寧愿不做也不錯(cuò)做),將可能性留足但也不瞎埋坑。
- 沒(méi)有靠譜的人只有靠譜的機(jī)器
我常常去聽(tīng)一些故障復(fù)盤會(huì)議,在談以后如何改進(jìn)的時(shí)候很多同學(xué)都價(jià)值觀爆棚,說(shuō)以后XX類變更都加簽上我來(lái)審核一道,我確認(rèn)沒(méi)問(wèn)題再往后走。雖然這種精神值得鼓勵(lì)但是這種做法實(shí)在是很不值得推薦,這樣沉淀出來(lái)的平臺(tái)其實(shí)是非常脆弱的,在做技術(shù)方案時(shí)一定要思考能夠交給系統(tǒng)的絕對(duì)不能用流程,能夠做到領(lǐng)域模型校驗(yàn)的千萬(wàn)不要靠旁路系統(tǒng)的側(cè)面印證(如不必要場(chǎng)景下的核對(duì))。
- 提前思考“幸福”的煩惱
很多技術(shù)同學(xué)都希望做高并發(fā)大流量的系統(tǒng),但很多時(shí)候在寫代碼的時(shí)候身體很誠(chéng)實(shí),怎么簡(jiǎn)單怎么來(lái)。實(shí)際做的時(shí)候既不考慮大流量也不考慮高并發(fā),對(duì)于資損風(fēng)險(xiǎn)考慮也極其少,而且基本上都很有道理:現(xiàn)在的業(yè)務(wù)量沒(méi)到不需要考慮那么多,這種事發(fā)生概率極其小一期先這樣......要對(duì)技術(shù)架構(gòu)做提前思考就必須從每行代碼做起,提前考慮高并發(fā)大流量和嚴(yán)謹(jǐn)性。
通常來(lái)說(shuō)大家其實(shí)都比較喜歡從 0 到 1 的過(guò)程,按照互聯(lián)網(wǎng)的迭代式打法,后面的 1 到 N 的過(guò)程也會(huì)被不斷壓縮。所以提前在 0 到 1 的過(guò)程加入 1 到 N 的架構(gòu)預(yù)判非常重要,因?yàn)楹芏鄷r(shí)候結(jié)構(gòu)性的問(wèn)題在最開(kāi)始就決定了,而且只有一次機(jī)會(huì)。
-1<--->1
這個(gè)思考方法的含義是:當(dāng)我們思考一些技術(shù)方案時(shí)候,不要一條道走到黑,要前后、上下、左右、正反多個(gè)方面去思考,讓技術(shù)方案具備更多維的視角。
我把常用的技巧總結(jié)如下:
- 正反思考法
日常也 review 了很多同學(xué)產(chǎn)出的架構(gòu)方案和系分以及測(cè)分,大家對(duì)于正常業(yè)務(wù)需求功能的論述基本上都沒(méi)有啥大問(wèn)題,按部就班去寫就可以。但普遍的問(wèn)題都是對(duì)問(wèn)題的反面論述不多,如支付正常流程濃墨重彩,退款/拒付等逆向流程就沒(méi)那么細(xì)致,業(yè)務(wù)功能正常流轉(zhuǎn)論述很飽滿但是異常場(chǎng)景就寥寥幾筆。但正面與反面結(jié)合起來(lái)才是完整的一體,而且對(duì)反面的思考其實(shí)是對(duì)正面的有益補(bǔ)充。而且通常來(lái)說(shuō),我們?cè)谡娉霈F(xiàn)的概率大于反面,但是反面出現(xiàn)差錯(cuò)的影響所需要付出的精力卻遠(yuǎn)遠(yuǎn)大于正面。
- 極限思考法
在 review 技術(shù)架構(gòu)方案風(fēng)險(xiǎn)相關(guān)的內(nèi)容時(shí),我都會(huì)特意問(wèn)一下,如果出現(xiàn) XX 問(wèn)題最壞的業(yè)務(wù)影響是什么。為什么是問(wèn)最壞的業(yè)務(wù)影響,是因?yàn)槿绻勶L(fēng)險(xiǎn)那肯定都是有一點(diǎn)點(diǎn)的,不利于大家去深究最關(guān)鍵的問(wèn)題。通過(guò)極限設(shè)問(wèn),其實(shí)是激發(fā)大家去做最壞的打算,有了最終極的兜底手段才能夠更樂(lè)觀去做技術(shù)變更。
- 對(duì)稱思考法
在 review 代碼或者邏輯結(jié)構(gòu)時(shí),在深挖細(xì)節(jié)和關(guān)鍵點(diǎn)后,我時(shí)常會(huì)拔出來(lái)看看整體的邏輯結(jié)構(gòu)是不是飽滿,是不是對(duì)稱,是不是美。最簡(jiǎn)單的例子就是寫了 if 我一定要有 else,不然沒(méi)對(duì)稱結(jié)構(gòu)就讓我很不舒服。因?yàn)槲蚁嘈艑?duì)稱的美就是一種生產(chǎn)力,因?yàn)槊赖臇|西一定是簡(jiǎn)潔且直達(dá)本質(zhì)的。而我們寫程序要的就是邏輯清晰簡(jiǎn)單直達(dá)業(yè)務(wù)本質(zhì),邏輯結(jié)構(gòu)清晰的基本上沒(méi)大問(wèn)題,不清晰(如變量瞎命名,方法無(wú)語(yǔ)義)的深挖下去多半都能發(fā)現(xiàn)大問(wèn)題。根源就是邏輯清晰代碼才清晰,代碼不清晰基本上就是邏輯混亂,邏輯混亂就會(huì)產(chǎn)生 BUG。
M*N ---> M+N
這個(gè)思考方法的含義是:當(dāng)我們思考技術(shù)問(wèn)題時(shí),可以嘗試從系統(tǒng)耦合的角度去思考,嘗試找一些突破口。
我舉一個(gè)實(shí)際的 CASE,高速公路網(wǎng)的連接不是把所有目的地之間都修一條高速公路,而是會(huì)選擇修建復(fù)用的高速公路主干道 + 分支道路的方式來(lái)組織這個(gè)網(wǎng)絡(luò)。一條一條串聯(lián)的方式就是耦合在一起的,這就是 M * N。通過(guò)主干道 + 分支道路的方式 就是解耦的,M + N 就能夠組建這個(gè)高速網(wǎng)絡(luò)。
在技術(shù)架構(gòu)上如何運(yùn)用解耦這個(gè)技法,我有如下幾個(gè)提煉。
- 解耦上下游關(guān)聯(lián)性
在業(yè)務(wù)和技術(shù)架構(gòu)發(fā)展的前期,把很多東西糅雜在一起是最快解決問(wèn)題的方法。但隨著業(yè)務(wù)和平臺(tái)架構(gòu)的進(jìn)一步演進(jìn),勢(shì)必是要做解耦,目的就是重新去界定各個(gè)模塊的邊界,平衡新的業(yè)務(wù)發(fā)展要求下各方發(fā)展快慢的訴求差異,通過(guò)解耦互相松綁快速發(fā)展。
這種技法在服務(wù)化的分布式架構(gòu)中非常常見(jiàn),基本上跨域的平臺(tái)架構(gòu)升級(jí)都有解耦的影子。
- 解耦各個(gè)角色的依賴
解耦上下游關(guān)聯(lián)性其實(shí)更多是在技術(shù)模型的抽象上,但在落入到技術(shù)模型范疇之前,還有就是我們?cè)谧龈映橄蟮慕鉀Q方案探討時(shí)要注意解耦各個(gè)角色之間的依賴。上述【架構(gòu)考慮所有可能性但做有限明確實(shí)施】中提及的就是最好的案例。其實(shí)這里的本質(zhì)表達(dá)就是,技術(shù)架構(gòu)的設(shè)計(jì)應(yīng)該要與商業(yè)選擇,產(chǎn)品設(shè)計(jì)等解耦開(kāi)來(lái)。
通過(guò)這一層的解耦其實(shí)能夠多個(gè)角色之間基于 SLA 去交互,并且能夠基于自身的專業(yè)思考給予對(duì)方更多的選項(xiàng)和可能性。很多時(shí)候的前瞻性和競(jìng)爭(zhēng)力可能就是比別人多一個(gè)選擇。
解耦思考法其實(shí)很有意思,幾乎所有的大型平臺(tái)架構(gòu)升級(jí)都有這個(gè)思考法的影子,所以下次沒(méi)啥思路的時(shí)候可以從這個(gè)角度做一個(gè)審視思考,說(shuō)不定是有新的收獲。
小結(jié)
以上是我在做技術(shù)架構(gòu)方案時(shí)沉淀總結(jié)的一些思考方法,這些思考方法不可能解決遇到的所有實(shí)際問(wèn)題,只能算是一個(gè)思考提示,在遇到問(wèn)題可以嘗試從這幾個(gè)方法去看看是否有靈感?;诜椒ㄕ摰遣痪窒抻诜椒ㄕ摬攀欠椒ㄕ撟畲蟮囊饬x和價(jià)值
作者簡(jiǎn)介:知明,螞蟻金服國(guó)際事業(yè)群資深技術(shù)專家,全球資金平臺(tái)技術(shù)負(fù)責(zé)人,負(fù)責(zé)了螞蟻全球化進(jìn)程中底層資金清結(jié)算、外匯等平臺(tái)能力的搭建和迭代演進(jìn)。