新聞中心
- “All models are wrong, some models are useful”?——George Box
沒(méi)有放之四海皆準(zhǔn)的好與壞的標(biāo)準(zhǔn)。下面我對(duì)于衡量軟件架構(gòu)好壞的AAA原則:

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到道外網(wǎng)站設(shè)計(jì)與道外網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋道外地區(qū)。
- 可考核(Accountable):好的軟件架構(gòu)讓每個(gè)團(tuán)隊(duì)都有自己負(fù)責(zé)的業(yè)務(wù)目標(biāo)
- 可自主(Autonomous):好的軟件架構(gòu)讓每個(gè)團(tuán)隊(duì)都一定的自主性可以獨(dú)立往前跑,而不總是被其他團(tuán)隊(duì)阻塞
- 可復(fù)用(Amortized):好的軟件架構(gòu)鼓勵(lì)對(duì)未來(lái)投資,使得基礎(chǔ)設(shè)施的成本可以被攤銷
可考核>>可自主>可復(fù)用。在上世紀(jì)90年代,代碼復(fù)用是面向?qū)ο笊鐓^(qū)的熱門(mén)話題。然后SOA和DDD又來(lái)告訴我們“可自主”才是最重要的。但是我發(fā)現(xiàn)實(shí)踐中,無(wú)論是“可自主”還是“可復(fù)用”都很模棱兩可。很難用這兩個(gè)原則去說(shuō)服其他人,用X的方式來(lái)分解問(wèn)題會(huì)比用Y的方式來(lái)分解問(wèn)題更好。但是如果你說(shuō),這么分解可以讓每個(gè)團(tuán)隊(duì)更可考核,就顯得特別理所當(dāng)然。
開(kāi)發(fā)者無(wú)法估算工作量
“可考核性”是一切的關(guān)鍵。我認(rèn)為“缺乏可考核性”是現(xiàn)在的軟件開(kāi)發(fā)模式***的危機(jī),這個(gè)問(wèn)題比”無(wú)法管理所謂的復(fù)雜性“還要更嚴(yán)重。
開(kāi)發(fā)者是無(wú)法估算工作量在行業(yè)里也不算什么秘密了。這帶來(lái)了很多根本性問(wèn)題:
因?yàn)槲覀儫o(wú)法知道真正多少人才是必須的,所以中層管理總是比著招聘人頭上限,盡可能的加人。為什么會(huì)這樣做?很簡(jiǎn)單,他們的薪酬和他們所管理的人頭數(shù)是成正比的。
把軟件重構(gòu)得”更可維護(hù)“沒(méi)有商業(yè)價(jià)值。什么叫可維護(hù)性?問(wèn)題如果解決不了,扔更多的人進(jìn)去總是可以解決的。軟件工程又不是造火箭,能有多難?根本無(wú)法證明重構(gòu)可以節(jié)省多少人力,因?yàn)榫蜎](méi)有可對(duì)標(biāo)的重構(gòu)前的應(yīng)投入人力。
要解決這個(gè)問(wèn)題,我認(rèn)為不是去搞明白開(kāi)發(fā)工作量的評(píng)估的魔法。恰恰相反,如果我們和業(yè)務(wù)負(fù)責(zé)人是以同一個(gè)團(tuán)隊(duì)的方式來(lái)工作,我們就壓根不需要去估算工作量。每個(gè)軟件開(kāi)發(fā)團(tuán)隊(duì)都有應(yīng)該有“唯一的一個(gè)”對(duì)應(yīng)的業(yè)務(wù)團(tuán)隊(duì),業(yè)務(wù)團(tuán)隊(duì)背什么樣的OKR,技術(shù)團(tuán)隊(duì)就背什么樣的OKR。要讓團(tuán)隊(duì)可考核,最重要的是只對(duì)一個(gè)業(yè)務(wù)負(fù)責(zé)。
上面是一個(gè)典型的組織架構(gòu)圖。每個(gè)小團(tuán)隊(duì)的OKR,要和其上一級(jí)團(tuán)隊(duì)的OKR對(duì)齊。OKR里面的關(guān)鍵產(chǎn)出要是可度量的,才能讓每個(gè)團(tuán)隊(duì)真正對(duì)某個(gè)事情負(fù)責(zé)。
典型的壞的軟件架構(gòu)是這樣的:有大量的微服務(wù)團(tuán)隊(duì)。業(yè)務(wù)負(fù)責(zé)人總是需要直接去找多個(gè)微服務(wù)團(tuán)隊(duì)才能達(dá)成他的目標(biāo)。每個(gè)需求都需要和多個(gè)不同的軟件團(tuán)隊(duì)重復(fù)溝通。每個(gè)技術(shù)團(tuán)隊(duì)都沒(méi)法清楚地說(shuō)明白他們以及他們的微服務(wù)負(fù)責(zé)的業(yè)務(wù)目標(biāo)是什么。正因?yàn)槿绱?,技術(shù)們無(wú)法說(shuō)清楚自己對(duì)業(yè)務(wù)到底有什么價(jià)值。
讓我們?cè)購(gòu)?qiáng)調(diào)一遍:軟件架構(gòu)的“頭號(hào)目標(biāo)”應(yīng)該是讓每個(gè)分解出來(lái)的團(tuán)隊(duì)都能夠有業(yè)務(wù)目標(biāo)去負(fù)責(zé)。
Bounded Context
在大的尺度上,架構(gòu)就是分解Bounded Contexts(參見(jiàn)領(lǐng)域驅(qū)動(dòng)開(kāi)發(fā),DDD)。這就是把業(yè)務(wù)的組織架構(gòu)圖體現(xiàn)到軟件的世界里:
以電商領(lǐng)域?yàn)槔?,業(yè)務(wù)被分解為上面這些Bounded Contexts。沒(méi)有一個(gè)技術(shù)團(tuán)隊(duì)可以覆蓋橫跨這些Bounded Contexts的業(yè)務(wù)流程的。這并不是啥壞事情,大的問(wèn)題被分解為了小問(wèn)題,業(yè)務(wù)和技術(shù)在一個(gè)Bounded Context的范圍內(nèi),攜手朝著共同的目標(biāo)去努力。
虛擬空間和智慧體
一個(gè)Bounded Context對(duì)于一個(gè)團(tuán)隊(duì)來(lái)說(shuō)仍然太大了。至少在微服務(wù)的心智下是這么認(rèn)為的。如何把它進(jìn)一步分解為更可管理的小塊呢?我的模型是“虛擬空間和智慧體”。我們做為程序員所做的事情,簡(jiǎn)單來(lái)說(shuō)就兩個(gè):
虛擬空間
有點(diǎn)智慧的“機(jī)器人”和我們?nèi)祟愐黄鹪谔摂M空間里交互
虛擬空間和我們?nèi)馍硭幍奈锢砜臻g是一樣的,它都是構(gòu)建在因果關(guān)系上的。有兩種法則主導(dǎo)這些因果:
- 自然法則:大自然自身的內(nèi)在規(guī)律
- 社會(huì)法則:一個(gè)人造的體系,人們通過(guò)模仿自然法則創(chuàng)造出類似穩(wěn)定的規(guī)則系統(tǒng)去構(gòu)建穩(wěn)定的社會(huì)秩序
比如引力是自然法則。而“借錢要還”是社會(huì)法則。兩者的工作方式是類似的,給定某些前因,根據(jù)法則,就必須有某些后果。我們使用C/C++/Java/GO/……等來(lái)描述這些法則。從光線跟蹤算法到word文本編輯器到電商交易平臺(tái),從構(gòu)建規(guī)則的角度來(lái)說(shuō)是差不多的?!胺▌t”必須是靜態(tài)的可預(yù)測(cè)的,就像用水泥構(gòu)建了我們的真實(shí)世界一樣。
在我們構(gòu)建的虛擬空間智商,我們作為人類彼此之間進(jìn)行交互,例如社交網(wǎng)絡(luò)和交易。由人類扮演的角色正逐步被我們縮寫(xiě)的人工智能的"機(jī)器人”所替代。例如,之前是人工的編輯去挑選內(nèi)容,現(xiàn)在可能是機(jī)器人來(lái)產(chǎn)生新聞,給你準(zhǔn)備每天開(kāi)屏的首頁(yè)?!皺C(jī)器人"正變得越來(lái)越復(fù)雜,某天他們會(huì)從虛擬空間里出來(lái),直接走向物理空間。
“虛擬空間”和“機(jī)器人”這兩種軟件代碼的工作方式差異性是很大的?!疤摂M空間”從原因推導(dǎo)出結(jié)果,來(lái)維護(hù)自然和社會(huì)的秩序?!皺C(jī)器人”的工作方式是相反的,它收集事實(shí)反推出模型來(lái)***化其目標(biāo)。把智能的部分和系統(tǒng)的其他部分明確地區(qū)分出來(lái)至關(guān)重要。我們作為人類希望規(guī)則是靜態(tài)的從而構(gòu)建出穩(wěn)定的預(yù)期。如果“法則”總是不斷在變,“虛擬空間”看起來(lái)就像是“魔法空間”,它就變得和我們從真實(shí)空間獲得的生活體驗(yàn)很不一樣了。
軟件開(kāi)發(fā)中的Model,View,Controller(MVC)的概念可以用來(lái)解釋“虛擬空間”。人類和“機(jī)器人”是所謂的智慧體。Model根據(jù)自然和社會(huì)法則定義的因果去維護(hù)數(shù)據(jù)的完整性。View和Controller提供了便捷的接口給人類和“機(jī)器人”去交互。
所有權(quán)==著作權(quán)
“虛擬空間”這部分仍然太大了。業(yè)務(wù)流程可能會(huì)有很多個(gè)步驟,例如:
而且不同的Bounded Context的業(yè)務(wù)流程之間也是有集成關(guān)系的:
可考核性問(wèn)題的根源是編程語(yǔ)言里缺乏對(duì)完整因果鏈的直接描述能力。我們可以在白板上畫(huà)一個(gè)清楚的業(yè)務(wù)流程圖,但是在寫(xiě)代碼的時(shí)候就不需要切分成很多細(xì)碎的服務(wù)和函數(shù)來(lái)表達(dá)。之所以工作流引擎總是被拿出來(lái)考慮,因?yàn)樗拿枋瞿芰鸵鉀Q的問(wèn)題有良好的映射。但是BPMN并不是一種編程語(yǔ)言。
步驟與步驟之間有很強(qiáng)的因果關(guān)系。在產(chǎn)品詳情頁(yè)展示的促銷,也應(yīng)該體現(xiàn)在購(gòu)物車?yán)?,也?yīng)該體現(xiàn)在收銀頁(yè)面上,也應(yīng)該體現(xiàn)在最終的收據(jù)里。我們使用的“function”的概念,頂多只能用來(lái)描述500ms內(nèi)發(fā)生的事情的因果關(guān)系。對(duì)于前面所述的業(yè)務(wù)流程,我們切分成了很多個(gè)步驟,同時(shí)又按照使用方的不同,切成成了很多個(gè)面向用戶的服務(wù)。從而因果關(guān)系就被隱藏在這些龐雜的實(shí)現(xiàn)細(xì)節(jié)之中了。軟件跑起來(lái)就像一場(chǎng)接力賽,一個(gè)服務(wù)把職責(zé)接過(guò)來(lái),搞一搞之后,又傳遞給另外一個(gè)服務(wù)。理想的情況是,代碼本身就應(yīng)該體現(xiàn)流程圖,讀起來(lái)就像流程圖。
更糟糕的是,現(xiàn)在的切分方式并沒(méi)有明確的劃線的原則。這就頻繁導(dǎo)致了團(tuán)隊(duì)之間關(guān)于誰(shuí)應(yīng)該負(fù)責(zé)什么的爭(zhēng)論。高度政治化的組織氛圍導(dǎo)致了開(kāi)發(fā)者情緒上的沮喪。同時(shí),具有諷刺意味的是,在大家彼此搶活的同時(shí),又因?yàn)槁氊?zé)切分得太碎,導(dǎo)致又沒(méi)有一個(gè)團(tuán)隊(duì)能夠?qū)θ重?fù)責(zé)。
對(duì)于解決這個(gè)問(wèn)題,目前能夠做到的“***實(shí)踐”就是在一堆微服務(wù)團(tuán)隊(duì)上架一個(gè)門(mén)面團(tuán)隊(duì)?!八袡?quán)==著作權(quán)”,我們只愿意對(duì)自己所寫(xiě)的東西負(fù)責(zé)。這個(gè)人性,無(wú)法改變。為了給這些可憐的家伙具有所有權(quán)的感覺(jué),我們必須允許一層很薄的代理層,或者叫所謂的調(diào)度服務(wù)來(lái)把微服務(wù)給“屏蔽"在后面。但是這種代理一層的做法經(jīng)常導(dǎo)致了很低的團(tuán)隊(duì)自主性。
理想的編程語(yǔ)言,應(yīng)該能夠提供“function”一樣的東西去直接描述業(yè)務(wù)流程。業(yè)務(wù)上的同時(shí)行進(jìn)的并發(fā)流程應(yīng)該可以像多線程編程一樣,用消息傳遞的方式來(lái)描述。這樣,我們可以給每一個(gè)可切分出來(lái)的業(yè)務(wù)流,分配一個(gè)獨(dú)立的軟件團(tuán)隊(duì)去端到端負(fù)責(zé)。他們可以對(duì)自己負(fù)責(zé)的事情100%負(fù)責(zé)。這些人和業(yè)務(wù)運(yùn)營(yíng)人員,以及編寫(xiě)出來(lái)的“機(jī)器人”合在一起作為同一個(gè)團(tuán)隊(duì),共同負(fù)責(zé)這個(gè)業(yè)務(wù)流的收益和虧損。而不是單獨(dú)把技術(shù)摘出來(lái),成為一個(gè)共享的成本中心。
協(xié)作單元
除此之外,還有一個(gè)事情是有問(wèn)題的。之前由編程語(yǔ)言提供的模塊化單元,例如assembly/package/class這些,就是我們團(tuán)隊(duì)之間彼此協(xié)作的單元。然而現(xiàn)在不是這樣了?,F(xiàn)在越來(lái)越多的人,要求軟件模塊有獨(dú)立版本,能夠獨(dú)立的部署。因?yàn)檫@樣才能支持多個(gè)團(tuán)隊(duì)的獨(dú)立性。這就導(dǎo)致了大量的微服務(wù)的做法。
但是我們是否“總是”需要用不同的編程語(yǔ)言不同的工具來(lái)實(shí)現(xiàn)微服務(wù)?語(yǔ)言的差異和彼此割裂的工具導(dǎo)致跨團(tuán)隊(duì)溝通更加困難。你可以擁有你的流程,擁有你的服務(wù),但是這不阻礙你和你的伙伴們用同一門(mén)語(yǔ)言啊。一門(mén)編程同時(shí)扮演了3個(gè)角色:它連接了機(jī)器,它連接了開(kāi)發(fā)者,它同時(shí)又連接了團(tuán)隊(duì)。今天編程語(yǔ)言更多是僅僅作為一種連接機(jī)器和開(kāi)發(fā)者個(gè)體之間的工具,團(tuán)隊(duì)之間宏觀上是彼此割裂的。
解決方案應(yīng)該是把軟件作為一個(gè)整體來(lái)思考,而不是被狹隘的“操作系統(tǒng)進(jìn)程”的視角給限制了。構(gòu)建新的微服務(wù)的成本,應(yīng)該和后臺(tái)用function啟動(dòng)一個(gè)線程沒(méi)有多大區(qū)別。理想的編程語(yǔ)言里,我們有各種各樣的function,但是執(zhí)行機(jī)制不同。
本文題目:什么樣的軟件架構(gòu)是好的?
當(dāng)前地址:http://m.fisionsoft.com.cn/article/djesojj.html


咨詢
建站咨詢
