08 - 架構設計三原則

優秀程序員和架構師之間還有一個明顯的鴻溝需要跨越,這個鴻溝就是“不確定性”;
對于編程來說,本質上是不能存在不確定的,而對于架構設計來說,本質上是不確定的,同樣的一個系統,A 公司和 B 公司做出來的架構可能差異很大,但最后都能正常運轉。

選擇

相比編程來說,架構設計并沒有像編程語言那樣的語法來進行約束,更多的時候是面對多種可能性時進行選擇

  • 是要選擇業界最先進的技術,還是選擇團隊目前最熟悉的技術?如果選了最先進的技術后出了問題怎么辦?如果選了目前最熟悉的技術,后續技術演進怎么辦?
  • 是要選擇 Google 的 Angular 的方案來做,還是選擇 Facebook 的 React 來做?Angular 看起來更強大,但 React 看起來更靈活?
  • 是要選 MySQL 還是 MongoDB?團隊對 MySQL 很熟悉,但是 MongoDB 更加適合業務場景?
  • 淘寶的電商網站架構很完善,我們新做一個電商網站,是否簡單地照搬淘寶就可以了?

架構設計領域并沒有一套通用的規范來指導架構師進行架構設計,更多是依賴架構師的經驗和直覺

  • 架構設計時遵循這幾個原則,有助于你做出最好的選擇
    1. 合適原則
    2. 簡單原則
    3. 演化原則

合適原則

  • 合適原則宣言:“合適優于業界領先”

再好的夢想,也需要腳踏實地實現!這里的“腳踏實地”主要體現在下面幾個方面

  1. 將軍難打無兵之仗

大公司的分工比較細,一個小系統可能就是一個小組負責,阿里的中間件團隊有幾十個人,而大部分公司,某個業務團隊可能就十幾個人。十幾個人的團隊,想做幾十個人的團隊的事情,而且還要做得更好,不能說絕對不可能,但難度是可想而知的

  • 沒那么多人,卻想干那么多活,是失敗的第一個主要原因。
  1. 羅馬不是一天建成的

業界領先的很多方案,都是經過幾年時間的發展才逐步完善和初具規模的,經歷過的挑戰和踩坑,都是架構設計非常關鍵的促進因素,單純靠拍腦袋或者頭腦風暴,是不可能和真正實戰相比的

  • 沒有那么多積累,卻想一步登天,是失敗的第二個主要原因。
  1. 冰山下面才是關鍵

大多的時候,業界領先的方案其實都是“逼”出來的,“業務”發展到一定階段,量變導致了質變,出現了新的問題,已有的方式已經不能應對這些問題,需要用一種新的方案來解決,通過創新和嘗試,才有了業界領先的方案

  • 沒有那么卓越的業務場景,卻幻想靈光一閃成為天才,是失敗的第三個主要原因。
  • 真正優秀的架構都是在企業當前人力、條件、業務等各種約束下設計出來的,能夠合理地將資源整合在一起并發揮出最大功效,并且能夠快速落地

簡單原則

  • 簡單原則宣言:“簡單優于復雜”
  • 軟件領域的復雜性體現在兩個方面:
  1. 結構的復雜性
  • 結構復雜的系統幾乎毫無例外具備兩個特點:
    1. 組成復雜系統的組件數量更多;
    2. 同時這些組件之間的關系也更加復雜。
  • 以圖形的方式來說明復雜性:
兩個組件組成的系統

三個組件組成的系統

四個組件組成的系統

五個組件組成的系統
  • 組件越多,就越有可能其中某個組件出現故障,從而導致系統故障
    • 假設組件的故障率是 10%
    • 有 3 個組件的系統可用性是(1-10%)×(1-10%)×(1-10%)= 72.9%
    • 有 5 個組件的系統可用性是(1-10%)×(1-10%)×(1-10%)×(1-10%)×(1-10%)=59%
  • 某個組件改動,會影響關聯的所有組件,這些被影響的組件同樣會繼續遞歸影響更多的組件
    • 以上面圖中 5 個組件組成的系統為例,組件 A 修改或者異常時,會影響組件 B/C/E,D 又會影響 E
    • 這個問題會影響整個系統的開發效率,因為一旦變更涉及外部系統,需要協調各方統一進行方案評估、資源協調、上線配合
  • 定位一個復雜系統中的問題總是比簡單系統更加困難
    • 首先是組件多,每個組件都有嫌疑,因此要逐一排查
    • 其次組件間的關系復雜,有可能表現故障的組件并不是真正問題的根源
  1. 邏輯的復雜性

意識到結構的復雜性后,那我們是不是可以,用最簡單的結構,就是整個系統只有一個組件,即系統本身,所有的功能和邏輯都在這一個組件中實現

顯然這樣做是行不通的,原因在于除了結構的復雜性,還有邏輯的復雜性,即如果某個組件的邏輯太復雜,一樣會帶來各種問題

  • 邏輯復雜幾乎會導致軟件工程的每個環節都有問題,假設現在淘寶將這些功能全部在單一的組件中實現,可以想象一下這個恐怖的場景
    1. 系統會很龐大,可能是上百萬、上千萬的代碼規模,“clone”一次代碼要 30 分鐘
    2. 幾十、上百人維護這一套代碼,某個“菜鳥”不小心改了一行代碼,導致整站崩潰
    3. 需求像雪片般飛來,為了應對,開幾十個代碼分支,然后各種分支合并、各種分支覆蓋
    4. 產品、研發、測試、項目管理不停地開會討論版本計劃,協調資源,解決沖突
    5. 版本太多,每天都要上線幾十個版本,系統每隔 1 個小時重啟一次
    6. 線上運行出現故障,幾十個人撲上去定位和處理,一間小黑屋都裝不下所有人,整個辦公區鬧翻天
    7. 誰都無法忍受這樣的場景...
  • 復雜的電路就意味更強大的功能,而復雜的架構卻有很多問題
    • 原因在于電路一旦設計好后進入生產,就不會再變,復雜性只是在設計時帶來影響
    • 而一個軟件系統在投入使用后,后續還有源源不斷的需求要實現,因此要不斷地修改系統,復雜性在整個系統生命周期中都有很大影響
  • 復雜算法導致的問題主要是難以理解,進而導致難以實現、難以修改,并且出了問題難以快速解決
    • ZooKeeper 功能雖然相對簡單,但因使用ZAB協議,系統實現卻比較復雜
    • etcd 采用的是 Raft 算法,相比 ZAB 協議,Raft 算法更加容易理解,更加容易實現
  • 無論是結構的復雜性,還是邏輯的復雜性,都會存在各種問題,所以架構設計時如果簡單的方案和復雜的方案都可以滿足需求,最好選擇簡單的方案

演化原則

  • 演化原則宣言:“演化優于一步到位”。

從和目的、主題、材料和結構的聯系上來說,軟件架構可以和建筑物的架構相比擬。
—— 維基百科

  • 對于建筑來說,永恒是主題;而對于軟件來說,變化才是主題
  • 架構設計的一個誤區:試圖一步到位設計一個軟件架構,期望不管業務如何變化,架構都穩如磐石
  • 考慮到軟件架構需要根據業務發展不斷變化這個本質特點,軟件架構設計其實更加類似于大自然“設計”一個生物,通過演化讓生物適應環境,逐步變得更加強大:
    • 首先,生物要適應當時的環境
    • 其次,生物需要不斷地繁殖,將有利的基因傳遞下去,將不利的基因剔除或者修復
    • 第三,當環境變化時,生物要能夠快速改變以適應環境變化;如果生物無法調整就被自然淘汰;新的生物會保留一部分原來被淘汰生物的基因
  • 軟件架構設計同樣是類似的過程:
    • 首先,設計出來的架構要滿足當時的業務需要
    • 其次,架構要不斷地在實際應用過程中迭代,保留優秀的設計,修復有缺陷的設計,改正錯誤的設計,去掉無用的設計,使得架構逐漸完善
    • 第三,當業務發生變化時,架構要擴展、重構,甚至重寫;代碼也許會重寫,但有價值的經驗、教訓、邏輯、設計等(類似生物體內的基因)卻可以在新架構中延續
  • 實際架構設計時,應認真分析當前業務的特點,明確業務面臨的主要問題,設計合理的架構,快速落地以滿足業務需要,然后在運行過程中不斷完善架構,不斷隨著業務演化架構

小結

本文介紹了面對“不確定性”時架構設計的三原則,分別是合適優于業界領先、簡單優于復雜、演化優于一步到位

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • 可是一旦涉及“選擇”,就很容易讓架構師陷入兩難的境地,例如: 如果選了最先進的技術后出了問題怎么辦?如果選了目前最...
    hedgehog1112閱讀 742評論 3 3
  • 合適原則、簡單原則、演化原則,架構設計時遵循這幾個原則,有助于做出最好的選擇。 合適原則 合適原則宣言:“合適優于...
    星夜95閱讀 825評論 0 1
  • 成為架構師是每個程序員的夢想,但并不意味著把編程做好就能夠自然而然地成為一個架構師,優秀程序員和架構師之間還有一個...
    yoku醬閱讀 310評論 0 1
  • 筆記 業務千變萬化,技術層出不窮,設計理念也是百花齊放,看起來似乎很難有一套通用的規范來適用所有的架構設計場景。 ...
    空谷幽心閱讀 3,279評論 0 51
  • 第68篇 極客時間《從0開始學架構》課程筆記。 編程的本質是『確定性』,同樣一段代碼,在任何時候執行,結果應該是確...
    短暫瞬間閱讀 2,517評論 0 0