二十年左右的時間列林,敏捷(agile)軟件開發(fā)走完了從一小撮人的游戲到軟件業(yè)內(nèi)的某種政治正確的慢慢征途。agile成為了一個good- words,和所有類似命運(yùn)的詞(as democracy狞贱、liberty、 republic etc.)相似,它的所指和能指實(shí)際上發(fā)生了分離台颠。所以真實(shí)世界中的軟件設(shè)計(jì)水平,就我看到的情況而言勒庄,并沒有發(fā)生什么質(zhì)的提升串前。大部分實(shí)際工作中的代碼還是毫無設(shè)計(jì),如一盤糾纏在一起的的意大利面实蔽。
我猜kent Beck或者Linus這種有些天才的人(或者說非常適合這一行的人)荡碾,是很難理解那種隨手代碼(不顧及單一職責(zé),隨便加到某個函數(shù)以實(shí)現(xiàn)功能的代碼)是怎么產(chǎn)生的局装。SOLID原則也好坛吁,設(shè)計(jì)模式也好,DDD也好铐尚,甚至做到clean code,做好依賴關(guān)系管理拨脉,抽象都是第一步。但需要承認(rèn)宣增,抽象和設(shè)計(jì)玫膀,這本身是很困難的。有可能大部分人就不具各抽象思考問題的能力爹脾。能不能在工作中教會大家抽象思考呢?很難帖旨,少數(shù)人可以學(xué)會箕昭,大部分不行。想在項(xiàng)目中落地解阅,幾乎不可能落竹。即便某些有設(shè)計(jì)的代碼合入具體項(xiàng)目,如果沒有非常明確的邊界和維護(hù)的手段瓮钥,也會很快的腐敗筋量,這樣的例子太多了。
精英(專業(yè))團(tuán)隊(duì)碉熄,當(dāng)然可以落地軟件設(shè)計(jì)桨武。敏捷是價值觀驅(qū)動的方法論集合。價值觀這東西锈津,本身就充滿了精英主義的味道呀酸。軟件設(shè)計(jì)并不帶來當(dāng)期利益,大部分項(xiàng)目線的領(lǐng)導(dǎo)者其實(shí)只關(guān)心當(dāng)前版本琼梆。當(dāng)大型軟件腐化到大部分人都覺得它應(yīng)該改造一下 了性誉,它的改動成本已經(jīng)太大了,或者性能惡化的太嚴(yán)重了的時候茎杂。這個時候肯定已經(jīng)不是改造代碼错览,改動架構(gòu)的好時機(jī)了。改動引入故障的巨大風(fēng)險(xiǎn)煌往,幾百上千人的編程習(xí)慣倾哺,捉襟見肘的人力,和不確定的結(jié)果都會讓這種努力變得艱難而危險(xiǎn)刽脖。打個比方羞海,肝癌感到疼的時候,已經(jīng)是晚期了曲管。
某種程度上却邓,我們也并不希望大型項(xiàng)目中所有的人都是能力全面,價值觀正確的精英院水。要求一個程序員編碼的時候腊徙,要關(guān)注業(yè)務(wù)拆分的正確性,關(guān)心軟件設(shè)計(jì)的合理性檬某,同時還要關(guān)心性能昧穿。人應(yīng)該專注于一個點(diǎn),專業(yè)分工才是效率的源泉橙喘。業(yè)務(wù)團(tuán)隊(duì)就應(yīng)該全心全意的關(guān)心業(yè)務(wù)时鸵。可運(yùn)行、 可監(jiān)控的架構(gòu)設(shè)計(jì)就是來支撐這個目標(biāo)的饰潜。架構(gòu)不應(yīng)該落在文檔和pPT中初坠,編程規(guī)范,xxx規(guī)范彭雾, 培訓(xùn)這都不夠碟刺。架構(gòu)應(yīng)該可以約束分析和編碼過程,提供合適的目錄結(jié)構(gòu)薯酝、依賴關(guān)系半沽、拆分方式、實(shí)現(xiàn)模板(或者DSL)吴菠、非業(yè)務(wù)優(yōu)化方法和某些業(yè)務(wù)/代碼分析工具(以獲得某些feature間可能的關(guān)聯(lián)性)者填。這樣,才可能從根本上落地軟件設(shè)計(jì)做葵、以及減緩代碼的腐化(和性能的持續(xù)惡化)占哟。我們沒辦法期望所有開發(fā)人員都是經(jīng)驗(yàn),但架構(gòu)師酿矢,或者架構(gòu)團(tuán)隊(duì)需要承擔(dān)這個責(zé)任榨乎。對于大型項(xiàng)目來說(數(shù)百上千人),這倒是有可能實(shí)現(xiàn)的瘫筐。
再具體的描述-下架構(gòu)師的職責(zé)吧蜜暑。
1.? 合理的將系統(tǒng)拆分為組件,組件的規(guī)模應(yīng)該控制在7-10人可以維護(hù)策肝,組件的邊界應(yīng)該非常清晰肛捍,不存在函數(shù)調(diào)用,不存在共享數(shù)據(jù):只有消息接口; 在這個基礎(chǔ)上驳糯,做好組件內(nèi)設(shè)計(jì),這是軟件設(shè)計(jì)落地的主要戰(zhàn)場:
2.? 組件內(nèi)分層氢橙,基礎(chǔ)設(shè)施酝枢,實(shí)現(xiàn),邏輯描述;邏輯描述和實(shí)現(xiàn)是非常不同的悍手,被雜合在一起是一 般項(xiàng)目的常態(tài)帘睦,是實(shí)現(xiàn)引入的非本質(zhì)復(fù)雜性之源;
3. 邏輯描述層,DSL可能是必須的選擇坦康,用通用語言(特別是c/C++) 描述某種特定業(yè)務(wù)的邏輯竣付,表達(dá)力欠奉:
4.單一職責(zé)拆分原則,如果是以module和feature的交點(diǎn)進(jìn)行拆分滞欠,那么必須在框架結(jié)構(gòu)中明確的提供實(shí)現(xiàn)這兩個概念的元素古胆,或者在DSL中也應(yīng)該有描述它們的關(guān)鍵字;
5.依賴關(guān)系管理,應(yīng)該有機(jī)制讓邏輯描述層生成接口,而讓實(shí)現(xiàn)層依賴這些接口逸绎,向抽象和接口依賴;
6.? 基礎(chǔ)設(shè)施抽取惹恃,甚至可以將基礎(chǔ)設(shè)施庫(數(shù)據(jù)結(jié)構(gòu))某些業(yè)務(wù)常用的操作封裝成DSL的語法元素:
7.? 非業(yè)務(wù)優(yōu)化,主要是內(nèi)存親和性優(yōu)化棺牧,最好能在DSL的轉(zhuǎn)換器中實(shí)現(xiàn)巫糙, 這是嵌入式系統(tǒng)相對專業(yè)和小眾的領(lǐng)域;
8. 分析工具, 代碼規(guī)范檢測颊乘、代碼質(zhì)量評價(主要是拆分結(jié)果和依賴關(guān)系方向進(jìn)行評價)和業(yè)務(wù)不同feature關(guān)系形式化分析的工具;
大概就是這些內(nèi)容参淹,2-5是更核心的。 1往往是業(yè)務(wù)本質(zhì)決定的乏悄。