根本復(fù)雜性(essential complexity)指的是問(wèn)題與生俱來(lái)的、無(wú)法避免的困難。...與之相反,偶發(fā)復(fù)雜性(addidental complexity)是人們解決根本復(fù)雜性的過(guò)程中衍生的。...架構(gòu)師的責(zé)任在于解決問(wèn)題的根本復(fù)雜性,同時(shí)避免引入偶發(fā)復(fù)雜性。
《簡(jiǎn)化根本復(fù)雜性,消除偶發(fā)復(fù)雜性》Neal Ford
大多數(shù)項(xiàng)目是由人完成的,人才是項(xiàng)目成敗與否的基礎(chǔ)。如何幫助團(tuán)隊(duì)成員完成項(xiàng)目,這個(gè)問(wèn)題很值得靜下心來(lái)好好思考。
關(guān)于對(duì)話的技巧非常多,但有幾個(gè)簡(jiǎn)單的技巧可以顯著改善對(duì)話的效果:
1.不要把對(duì)話當(dāng)成對(duì)抗。如果你能看到他人的優(yōu)點(diǎn),并把溝通視為請(qǐng)教問(wèn)題的機(jī)會(huì),就會(huì)有所收獲,同時(shí)也能避免引起對(duì)方的戒備之心。
2.不要帶著情緒與人溝通。當(dāng)你處于憤怒、沮喪、煩惱,或者慌張的情緒中時(shí),對(duì)方很可能會(huì)誤認(rèn)為你的舉動(dòng)不懷好意。
3.嘗試通過(guò)溝通設(shè)定共同的目標(biāo)。有些人開(kāi)會(huì)時(shí)喋喋不休影響別人發(fā)言,與其命令他閉嘴,不如請(qǐng)他協(xié)助你提高其他人的參與度。告訴他有些同事比較內(nèi)向,發(fā)言前需要安靜地理清思路。請(qǐng)他在每次發(fā)言之前稍作等待,讓同事有機(jī)會(huì)表達(dá)意見(jiàn)。
首先與同事達(dá)成一致的目標(biāo),把處理沖突和矛盾的過(guò)程視為學(xué)習(xí)的機(jī)會(huì),控制住自己的情緒,那么每次溝通都會(huì)有所收獲,你會(huì)做得越來(lái)越好。
《關(guān)鍵問(wèn)題可能不是出在技術(shù)上》Mark Ramm
以溝通為中心,堅(jiān)持簡(jiǎn)明清晰的表達(dá)方式和開(kāi)明的領(lǐng)導(dǎo)風(fēng)格。Mark Richards
讓溝通事半功倍,起立發(fā)言是最簡(jiǎn)單、有效的方法!《起立發(fā)言》Udi Dahan
工程師總是想盡辦法尋求合作,談判者則絞盡腦汁占得先機(jī)。談判時(shí),絕不能在對(duì)方的第一個(gè)要求上妥協(xié)讓步。《我們常常忽略了自己在談判》Michael Nygard
眾所周知,堅(jiān)持技術(shù)測(cè)試是需要耐心和毅力的,無(wú)論是搭建合適的測(cè)試環(huán)境,采集適當(dāng)?shù)臄?shù)據(jù)集,還是編寫必要的測(cè)試用例,都須要投入大量的時(shí)間。提前開(kāi)展性能測(cè)試,能讓你有條不紊地逐步完善測(cè)試環(huán)境,為解決性能問(wèn)題節(jié)省下大量的時(shí)間和精力。《提前關(guān)注性能問(wèn)題》Rebecca Parsons
以維護(hù)流程通暢為重,以浪費(fèi)他人時(shí)間為恥?!恫萋侍峤蝗蝿?wù)是不負(fù)責(zé)任的行為》Niclas Nilsson
如果存在多個(gè)可實(shí)施方案難以取舍,“先簡(jiǎn)單后通用”原則可以成為最終的評(píng)判標(biāo)準(zhǔn)。挑選基于具體需求的簡(jiǎn)單方案,放棄鼓吹通用性的負(fù)責(zé)方案。而且簡(jiǎn)單的方案在實(shí)踐中完全有可能表現(xiàn)出更好的通用性。退一步來(lái)說(shuō),修改簡(jiǎn)單方案滿足需求,也比修改通用方案容易,因?yàn)橥ㄓ梅桨赋3T谧铌P(guān)鍵的地方使不上勁兒。
追求隨心所欲的靈活性,會(huì)使人們?cè)跓o(wú)意中錯(cuò)失(有些人甚至故意忽略)更簡(jiǎn)單的設(shè)計(jì)和更有價(jià)值的特性。《先確保解決方案簡(jiǎn)單可用,再考慮通用性和復(fù)用性》Kelin Henney
稱職的架構(gòu)師應(yīng)該通過(guò)示范領(lǐng)導(dǎo)團(tuán)隊(duì)。他能勝任團(tuán)隊(duì)的所有工作,從網(wǎng)絡(luò)布線到配置構(gòu)建流程,從編寫單元測(cè)試到擔(dān)任測(cè)試工作。對(duì)技術(shù)缺乏全面理解的架構(gòu)師,充其量只是個(gè)項(xiàng)目經(jīng)理?!都軜?gòu)師應(yīng)該親力親為》John Davies
架構(gòu)師應(yīng)該明白魚和熊掌不可兼得的道理。世上不存在十全十美的設(shè)計(jì)——既具有高性能,又具有高可用性;既高度安全,又高度抽象;有一個(gè)真實(shí)的歷史事件,軟件架構(gòu)師應(yīng)該爛熟于心,在與客戶或同事溝通時(shí)能派上用場(chǎng)。這就是瓦薩號(hào)戰(zhàn)艦的故事。
17世紀(jì)20年代,瑞典和波蘭之間爆發(fā)戰(zhàn)爭(zhēng)。瑞典國(guó)王迫于戰(zhàn)爭(zhēng)經(jīng)費(fèi)的壓力,急欲速戰(zhàn)速?zèng)Q,他下令建造一艘名為瓦薩號(hào)的戰(zhàn)艦。這可不是一艘普通的戰(zhàn)艦,其設(shè)計(jì)要求絕非同時(shí)代戰(zhàn)艦可比:戰(zhàn)艦長(zhǎng)60米,兩個(gè)炮臺(tái)上配備64門艦炮,可以將300名士兵從水路安全運(yùn)送到波蘭。時(shí)間緊迫,資金緊張,而且設(shè)計(jì)師從未設(shè)計(jì)過(guò)這種規(guī)模的戰(zhàn)艦,只能憑經(jīng)驗(yàn)和猜測(cè)著手設(shè)計(jì)。最終,工匠們按照設(shè)計(jì)說(shuō)明建造了戰(zhàn)艦。下水那天,瓦薩號(hào)在隆重的儀式中駛?cè)牒8郏Q完禮炮后,徑直沉入了海底。
瓦薩號(hào)的問(wèn)題很明顯。參觀過(guò)17、18世界大型戰(zhàn)艦的人都知道,甲板上空間有限而危險(xiǎn),作戰(zhàn)時(shí)情況更糟。建造一艘既能作戰(zhàn)又能運(yùn)兵的戰(zhàn)艦是一個(gè)巨大的錯(cuò)誤。設(shè)計(jì)師為了滿足國(guó)王的心愿,設(shè)計(jì)了一艘性能失衡、不堪一擊的戰(zhàn)艦。《取舍的藝術(shù)》Mark Richards
《不要輕易放過(guò)不起眼的問(wèn)題》全文 Dave Quick
即便是最精美的架構(gòu),最優(yōu)雅的框架,可復(fù)用性最高的系統(tǒng),也必須滿足下面的條件才可能被復(fù)用。
大家知道他們存在;
大家知道如何使用他們;
大家認(rèn)識(shí)到利用已有資源好過(guò)自己動(dòng)手。
《讓大家學(xué)會(huì)復(fù)用》Jeremy Meyer
《架構(gòu)里沒(méi)有大寫的“I”》全文 Dave Quick
兩條公認(rèn)的軟件開(kāi)發(fā)的真理:
復(fù)制是魔鬼;
重復(fù)性的工作拖累開(kāi)發(fā)進(jìn)度。
消滅重復(fù)的內(nèi)容是你的責(zé)任,為此,應(yīng)該重新研究框架,創(chuàng)造更完善的抽象機(jī)制,請(qǐng)專門制作工具的程序員幫你完成切面框架,或者使用代碼生成器。要想消滅重復(fù)內(nèi)容必須有人采取行動(dòng)。
這個(gè)人就是你。
《避免重復(fù)》Niclas Nilsson
計(jì)算機(jī)科學(xué)家設(shè)想的完美世界正在崩潰,我們?cè)撛趺崔k?克服所有困難的步驟都一樣,首先要接受現(xiàn)實(shí)。向令人懷念的調(diào)用堆棧架構(gòu)告別吧,忘掉那些程序員決定程序流程的日子,準(zhǔn)備好應(yīng)付隨時(shí)出現(xiàn)的亂序事件,不斷根據(jù)具體情境調(diào)整策略。用異步的、并發(fā)的請(qǐng)求代替一個(gè)接一個(gè)的方法調(diào)用。設(shè)計(jì)應(yīng)用時(shí),借助事件驅(qū)動(dòng)的過(guò)程鏈模型或狀態(tài)模型控制無(wú)序的狀況,通過(guò)調(diào)整、重發(fā),甚至試探的辦法糾正錯(cuò)誤。
《歡迎來(lái)到現(xiàn)實(shí)世界》Gregor Hohpe
架構(gòu)師會(huì)從主觀的判斷或潛在不確定需求出發(fā),產(chǎn)生調(diào)整解決方案的強(qiáng)烈沖動(dòng)。請(qǐng)記住一點(diǎn):試圖猜測(cè)未來(lái)的需求時(shí),錯(cuò)的概率是50%,錯(cuò)得很離譜的概率是49%。今天只需要解決今天的問(wèn)題就好?!洞_保簡(jiǎn)單的問(wèn)題有簡(jiǎn)單的解》Chad La Cigne
長(zhǎng)遠(yuǎn)看來(lái),系統(tǒng)維護(hù)將比項(xiàng)目初期的開(kāi)發(fā)消耗更多的資源。進(jìn)行系統(tǒng)架構(gòu)設(shè)計(jì)時(shí),牢記這點(diǎn)非常重要。在項(xiàng)目開(kāi)發(fā)初期走捷徑,可能會(huì)以日后付出高昂的維護(hù)費(fèi)用為代價(jià)。
碰到架構(gòu)問(wèn)題或設(shè)計(jì)缺陷,作為架構(gòu)師,一定要堅(jiān)持成本還很低廉時(shí)就動(dòng)手。擱置越久,為之付出的利息也將越高?!冬F(xiàn)在走捷徑,將來(lái)付利息》Scot ZMcphee
我的建議是:不要屈服于企圖使設(shè)計(jì)或?qū)崿F(xiàn)達(dá)到完美的誘惑!把目標(biāo)設(shè)定在“足夠好”就行,當(dāng)已經(jīng)達(dá)成目標(biāo)時(shí),就停下來(lái)。
你可能會(huì)問(wèn),究竟什么是“足夠好”?“足夠好”指得是,剩余的不完美之處,對(duì)系統(tǒng)的功能、可維護(hù)性或性能不會(huì)產(chǎn)生任何有深遠(yuǎn)意義的影響。架構(gòu)和設(shè)計(jì)協(xié)調(diào)一致;系統(tǒng)的實(shí)現(xiàn)正確可用,并符合性能需求;代碼整合簡(jiǎn)潔,文檔化良好。還可以做得更好嗎?當(dāng)然可以,但這樣已經(jīng)足夠好,所以就到此為止了吧。可以宣布設(shè)計(jì)勝利完成,然后轉(zhuǎn)入下一個(gè)任務(wù)了。
在我看來(lái),再設(shè)計(jì)和實(shí)現(xiàn)上追求完美,會(huì)導(dǎo)致過(guò)度設(shè)計(jì)和模糊混亂的解決方案,最終使系統(tǒng)難以維護(hù)。
《不要追求完美,足夠好就行》Greg Nyberg
如果出現(xiàn)下面這些關(guān)鍵詞,要小心了:
“如果。。。,會(huì)更酷。”實(shí)際上,任何語(yǔ)句如果帶有“酷”字,都是危險(xiǎn)信號(hào)。
“嘿,他們剛剛發(fā)布了YYY框架的XXX版本。我們應(yīng)該馬上升級(jí)!”
“由于我們?cè)谑褂肸ZZ,你知道,我們確實(shí)應(yīng)該重構(gòu)XXX。。。”
“XXX技術(shù)真的很強(qiáng)大!也許我們可以把它用于。。。”
《小心“好主意”》Greg Nyberg
如果都不知道一個(gè)東西應(yīng)該叫什么,那你肯定不知道它究竟是什么。如果你不知道它究竟是什么,那么你也肯定不能坐下來(lái)為它編寫代碼。
如果無(wú)法給出合適的命名,那也就無(wú)法繼續(xù)編程。如果發(fā)現(xiàn)自己需要多次更改命名,那么最好停下來(lái),直到弄清楚要做的究竟是什么。
《命名要恰如其分》Sam Gardiner
聰明的軟件價(jià)格昂貴,不易維護(hù),僵脆易折。所以,不要追求聰明,盡量用最淺顯易懂的質(zhì)樸方法,恰如其分的進(jìn)行設(shè)計(jì)。
《棄聰明,求質(zhì)樸》Eben Hewitt
軟件架構(gòu)師工作很大的一部分,是要選擇用以攻克難題的合適技術(shù)。精心選擇熟悉的武器,不到萬(wàn)不得已絕不輕易拋棄它們。這些技術(shù)在過(guò)去給你帶來(lái)了成功,盡量讓它們?cè)谖磥?lái)也能為你帶來(lái)勝利,同時(shí),以審慎的態(tài)度更新你的技術(shù)武器庫(kù)。
《精心選擇有效技術(shù),絕不輕易拋棄》Chad La Vigne
沒(méi)錯(cuò),你的客戶確實(shí)不是你的客戶。你的客戶的客戶,才是你的客戶。如果你的客戶的客戶贏了,你的客戶也就贏了。這意味著,你也贏了。
我們也不配稱得上真正關(guān)愛(ài)我們的客戶,如果不能更為關(guān)愛(ài)他們的客戶。
《客戶的客戶才是你的客戶》Eben Hewitt
《著重強(qiáng)調(diào)項(xiàng)目的商業(yè)價(jià)值》全文 周異
設(shè)計(jì)盡可能小的系統(tǒng),幫助成功交付,并推動(dòng)它向宏偉的遠(yuǎn)景目標(biāo)不斷演化。雖然聽(tīng)起來(lái)似乎是放棄了控制權(quán),甚至是在逃避責(zé)任,但是最終,利益相關(guān)者會(huì)感謝你。
《優(yōu)秀軟件不是構(gòu)建出來(lái)的,而是培育起來(lái)的》Bill de Hora