天天看點

架構師必須了解的30條設計原則基本原則功能選擇服務端設計和并發分布式系統使用者體驗難點總結

  衆所周知,架構師的角色,更偏向于策劃、而非指揮,塑造、而非支配,其存在的意義,在于引導大家讨論、而非自己主宰一切。

  但是,具體應該如何執行呢?本文作者整理了 30 個公認的架構原則,來幫助大家解決此問題。也許有的原則,你從未聽說,但你看完就能快速學會。

  相信你學會了,工作起來也會事半功倍,或許還可幫你避免很多無用的加班!

  我們在設計軟體的過程中,把握的一個關鍵點是:軟體架構并非由架構師負責設計。我們的架構不是由架構師制定,然後交給其他人來實施。

  相反,架構的設計任務由真正編寫代碼的團隊負責。架構師負責對工程師設計的架構進行修複、策劃和改進。我們的架構團隊是指導員和把關人,而非獨裁者。

  在短期内,由一位架構師來制定架構的确既快捷又實惠。但是,從長遠來看,我們會組建一個團隊,讓他們自己不斷思考、改善架構,并從他們的錯誤中來提升自己。

  當我們專注于團隊時,他們自然會随着時間的推移而變得更好。架構團隊的首要任務是:盡可能保證架構容易執行。此外,架構評審也存在缺陷。

  就像 Paul (@pzfreo)描述的架構評審那樣:架構師參與進來,聽一會,發表一點評論然後就走了。作為一名架構師,你對架構發表自己的看法和意見無可厚非。但是,如果你不夠投入和細心,你的意見可能會讓團隊感到困惑,團隊就無法确定正确的做法到底是什麼。

  接下來我會将30個架構原則一一列出,其中一些原則是衆所周知的,而有些則源于我的個人經驗和心血。

基本原則

原則1: KISS (Keep it simple,sutpid) 和保持每件事情都盡可能的簡單,用最簡單的解決方案來解決問題。

原則2:YAGNI(你不需要它)原則 ,隻在需要時建構。

原則3:先學會爬,然後再學會走,最後學會跑。換句話說,先保證能夠正常運作,然後優化它使其更好,最後逐漸讓它變得完美。使用疊代開發,采用靈活開發模式。為每個功能制定一個開發周期(最多2周),然後不斷疊代。

原則4:自動化測試是建構穩定、高品質産品的唯一方法。通過自動化測試提升創造力,所有一切都可以自動化!在設計時應當好好考慮自動化。

原則5:注重投資回報率(ROI)并将最多的注意力放在最重要的地方。

原則6:了解使用者并相應地平衡資源。大多數産品都有數千個最終使用者,大緻需要20個開發人員和100個 DevOps 人員。不要花費數月的時間來建構一個不太可能使用 DevOps 的使用者界面(他們更喜歡腳本)。這是原則5的特例。

原則7:功能的設計和測試盡可能獨立。如果在設計時考慮到這一點,長遠來看,它将省去很多麻煩,否則隻有一切建構完成時你才可以開始測試整個系統。此外,遵循這個原則,版本釋出也會更加順利。

原則8:警惕搜尋引擎中花裡胡哨的架構方案。我們天生都喜歡令人奪目的設計。如果你按奈不住, 就可能把太多根本不需要的功能和解決方案引入到你的架構中。

功能選擇

原則9:想要準确知道使用者如何使用我們的産品是很難的。是以我們要推行MVP(最小可行産品)。該理念的核心在于:先制定一些用例,完成用例所涉及的相關功能,立即釋出産品,然後根據回報和經驗對産品進行優化。

原則10:盡可能減少功能,如有疑問則将其删除。許多功能可能從未使用,你隻需為其留一個擴充接口即可。

原則11:聽取客戶的意見,看他們想要什麼功能。

原則12:當客戶要求的功能影響到其他子產品時,要勇于和客戶辯論。從大局出發,嘗試找到另一種方法來處理問題。就像 Fords 所說的那樣“每當我問顧客需要什麼的時候,他們總是會說需要跑得更快的馬”。請記住,你才是專家。你應該主導一切,做出正确和專業的決定。雖然使用者可能當時有些疑惑,但最終他們會感謝你的。

服務端設計和并發

原則13:要知道一個server是如何運作的,從硬體到作業系統,直到程式設計語言。優化IO調用的數量是你通往最好架構的首選之路。

原則14:遵循 Amdhal 的同步定律。線程之間共享的可變資料會降低程式速度。如果可以,請使用并發資料結構,并且僅在必要時使用同步。盡可能少地使用鎖。如果你打算線上程鎖期間阻塞,請確定自己足夠了解具體細節,因為這裡存在極大的隐患。

原則15:如果你的設計是基于事件驅動的非阻塞架構,那就不要阻塞線程或者線上程中執行 IO 操作。一旦這樣做,系統将慢如蝸牛。

分布式系統

原則16:無狀态系統具有良好的擴充性。我們要盡可能了解和使用無分享架構。

原則17:除非你能夠掌控用戶端和伺服器的所有代碼,否則消息傳遞失敗的情況在所難免。盡量減少你的系統依賴的因素(例如使用原則18)。

原則18:盡可能實施幂等操作。這樣它就很容易恢複,你至少可以保證傳遞沒問題。

原則19:了解 CAP 定理。可擴充的事務(分布式事務)是很難的 。盡可能使用補償,基于 RDBMS 的事務很難擴充。

原則20:分布式系統共識不支援擴充,也無法進行組通信,不支援群集範圍内的可靠消息傳遞。其最大節點限制大約是八個節點。

原則21:在分布式系統中,你很難隐藏分布式系統中的延遲和故障。(參見分布式計算的謬誤解釋 )。

使用者體驗

原則22:了解你的使用者以及他們的目标:他是新手、專家還是臨時使用者?他對計算機科學了解多少?極客看重擴充功能,開發人員關注示例和腳本,普通人則更在乎界面。

原則23:最好的産品應當不需要使用者手冊,使用者應該一看就會用。

原則24:當你無法在兩個選項之間做出決定時,請不要通過配置選項的方式來呈現問題。這會給使用者和架構師帶來麻煩。對于系統如何運作的細節,他們沒有你了解,他們怎麼能做出決定呢?最好的方案是找到一個每次都有效的選擇;其次是自動做出選擇;第三個方案是添加配置參數并設定合理的預設值。

原則25:始終具有合理的配置預設值。

原則26:設計不良的配置會制造麻煩,始終配置幾個示例值。

原則27:詢問使用者配置值的時候,注意選擇使用者無需即可設定的值(例如,不要問使用者需要的最大緩存條目數量,而是要問他想要用于緩存的記憶體數量)

原則28:如果發現未知配置,則抛出錯誤。永遠不要忽視它。在調試過程中,無提示的配置錯誤會浪費我們很多調式時間。

難點

原則29:嘗試新語言很容易,但要正确使用卻很難。除非公司願意組建一個十人團隊并花一年的時間來學習,否則盡量不要這樣做。如果你仍不死心,請閱讀有關語言設計的五個問題後再做定奪。

原則30:可組合的拖放 UI 很難實作,除非團隊準備投入10人年的資源,否則不要去做。最後,談一下我的感受。在理想情況下,一個平台應當由多個正交元件組成,每個元件負責一個方面(例如,安全性、消息傳遞、注冊、調解、分析,等等)。使用這些功能建構的系統将是最佳的。不幸的是,現實中我們很難達到這樣的狀态。因為在項目初始狀态時,很多事情是不确定的,你無法做到這樣的獨立性,現在我認為在開始的時候适當的重複是必要的,當你嘗試鏟除他們的時候,你會發現引入了新的複雜性,分布本身就意味着複雜。有時候治愈的過程要比疾病本身更加的糟糕。

總結

作為一個架構師,我們應該像園丁一樣思考、塑造、策劃和去除雜草而不是定義和建構。雖然在短期内,由一位架構師來制定架構的确既快捷又實惠。但是,從長遠來看,團隊的力量才是最強的。如果你不夠投入和細心,你隻指出錯誤,但是不道明錯誤原因,那麼你的意見可能會讓團隊感到困惑。避免這種情況的一種方法是擁有一套普遍接受的原則,這些原則是讨論架構時遵循的基本點,也是初學者學習架構的好資源。是以想成為 一名優秀的架構師,還是需要長期的磨練以及時間的驗證,當然随時保持學習的狀态也是非常重要的。當你學會更多知識,你便會更清晰的解決各種複雜的架構問題。

繼續閱讀