翻譯 :丁興華html
歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。 git
有報道稱Kelly Johnson在冷戰期間的洛克希德公司工做時,創造了KISS('keep it simple, stupid')這個原則:建議系統應該設計的儘可能簡單。github
雖然複雜度歷來不是任何項目的明智設計目的,可是它在追求新特性和新組件時會天然產生。KISS原則鼓勵設計者經過制定簡單的目標來主動抵抗這種誘惑,這樣製造出來的產品才能保證更好的可維護性、健壯性和靈活性。好比在噴氣式戰鬥機中,這或許意味着一架飛機能夠在激戰的戰場上用少許工具便可維修。數據庫
在他任職期間,洛克希德的臭鼬工廠準備生產U2和SR-71飛機,他們優秀的工程學留下的遺產至今影響着咱們。編程
著名的SR-71,臭鼬工廠的一款旗艦機型。雖然沒有特別簡易但速度極快。安全
咱們中有許多人由於求知慾立志在工程領域工做。技術自己很酷,新技術更甚。咱們想使用被你們熱議的東西。服務器
咱們的新聞,聚會,會議甚至對話都傾向於那些被積極開發和大力推廣的閃耀的新技術,舊組件默默的運行後在消逝的幕後。架構
隨着時間流逝,技術不斷累加卻不多移除。任其發展,產品不斷堆積後變成一堆由雜亂補丁聯結起來的龐大東西。這種影響至關危險:運維
更多的組成部分意味着認知上的複雜。若是一套系統變得難於理解,那麼開發者若是沒有理解全部錯綜複雜的關係則在修改時很容易引發漏洞或者誤操做。編程語言
在產品中的任何操做都不是完美的。技術棧中的每一個組件均可能失敗, 並且在足夠大的規模下,某些部分會一直出錯。
隨之而來更多的工程師會趨向於萬金油型,而不是精通某一方面。若是遇到一個極其惡性的問題,因爲缺乏深刻了解的專家形成更難去分析診斷和修復了
即使瞭解這些,擴展工具的本能也很難被抑制。通常狀況下,說服力是咱們工做的核心能力之一,而且我也能用它來講服咱們本身並且咱們的同事也以爲把新技術引入現有技術棧相當重要。一個基於Go語言的高可用性鍵值對存儲將會把咱們現有的正常運行時間和故障恢復提升到一個新的高度。這個實時事件流會把一個不可變分類帳變成整個平臺的基石。這優秀的新容器運維繫統會把開發和擴展的簡易程度上升到新的高度。大多數狀況下,退一步冷靜客觀的思考會揭示他們的用法後可能會先暫緩,直到他們被確保嚴格審查過以後,而且十分了解他們將要如何融入到現有體系結構中(以及將要被替換的部分)。
R.巴克明斯特.富勒在他1938年出版的書《去往月球的九個步驟》中描述了「少費多用」這個想法。
在愈來愈少的東西上作愈來愈多的事情,直到你能夠不依賴任何東西作完成一切
這個想法建議在輸入相同的前提下經過持續提升系統效率來提高生產力。應用在科技上則意味着在人力和基礎設施支持度不變的前提下創建可擴展支持更多更活躍用戶的技術棧。能夠經過構建更穩定、更自動化和更少故障的系統來達到這個目標,由於它們在複雜度上升的趨勢中固有的部分已經被理解、利用甚至逆轉轉。
在Heroku的很長一段時間裏,咱們有一個很是雄偉並充滿抱負的少費多用目標。咱們瞭解的正常應用平臺都是指「用戶空間」,而內部基礎設施被稱爲「核心空間」。咱們想打破核心的嵌套,把核心逐步遷移到可支持的用戶空間,重構以後Heroku能夠在Heroku裏運行。少費多用的最終表現是:核心會減小體積直至徹底消失。它包含的特殊組件也將會廢棄,造成一個簡單的完美統一的技術棧。
在Heroku的歷史中有幾個實踐極簡和少費多用的例子:
用來追蹤全部應用,用戶,版本和配置等等的核心數據庫。曾經是被託管在一臺定製版的AWS實例上的snowflake。最終被簡化爲Heroku的Postgres數據庫,並且只是成爲與其它用戶數據庫一同被管理的另外一個結點而已。
整個產品中能被廢棄的部分都廢棄了。舉個例子,ssl:ip插件(爲應用提供SSL/TLS終端)以前由一臺獨立提供的服務器運行,被更好(也更便宜)的亞馬遜SSL服務徹底終結。隨着SNI支持的普遍應用,ssl:endpoint終將接替。
全部非暫時數據會被移除Redis,這樣Postgres能夠只用來爲內部應用存儲和操做長期數據。這使得技術棧擁有在Redis宕機的狀況下也能正常在線的附加優點。
在誤用多語言開發產品以後,最後一個用Scala編寫的組件也被廢棄。用更少的程序語言種類意味着整個系統能夠被被更多的工程師更容易的操做。
處理Heroku組織的組件本來在它本身的微服務內運行。一段時間後咱們微服務擴張的有點過大,因此爲了簡化操做,咱們把一部分微服務移回核心部分。
爲了認清移除或者替換舊技術的影響,咱們創造了一個儀式,象徵性的把廢棄的組件餵給叫「燃燒派對」的火焰。本來消耗在這些項目上的時間與精力會在新產品上發揮得同樣好,甚至更好。
在Heroku,咱們按期舉辦「燃燒派對」去體現廢棄舊產品與技術的影響
在生產中實踐極簡主義大多數狀況下是爲了瞭解現有問題。達到這個目的後,緩解措施顯而易見:
廢棄舊技術。有引入什麼新東西嗎?找機會廢棄大體至關的老舊技術。若是你準備引入Kafka,可能你就要捨棄Rabbit或者NSQ。
創建通用服務約定。在數據庫、編程語言/運行環境、任務隊列、網頁服務,反向代理等等方面統一標準。若是不能統一,則儘可能標準化。
傾向於簡潔性且減小可變更部分。嘗試去保持系統內容儘可能少以方便理解與操做。雖然在一些狀況下可能有更合適的技術但因爲與任務不太匹配致使妥協。
不要在新技術剛發佈的當天,甚至那年就使用它。經過它人的審查,找問題還有穩定它來節省你的時間與精力。若是它沒有獲得著名社區的長期支持,永遠避免使用它。
避免定製化技術。你編寫的軟件必需要你維護。當已經有良好支持且恰好適合(或者基本適合)你的公用解決方案時不要本身作。(原文succumb to NIH應爲succumb to NHH)
使用服務。你安裝的軟件須要你去操做,從它激活那一刻起。總有人要抽出固定時間去維護它們,解決問題,安裝更新。當有一個好用的公用服務時不要本身再作一份。
不是說新技術永遠不應被引入,而是說應該理智防護性的去作這件事,用批判的眼光去思考它是否適合與時俱進(但願是更加先進)的架構。
一個法國詩人同時也是飛行員先鋒安託萬·德·聖埃克蘇佩裏說過:
當它無可增減的時候,彷佛就達成了完美。
無可增減
咱們中的大多數人都能從更簡單,更保守,更直接的體系結構中受益,只有經過構建一個穩定而近乎可完美操做的極簡技術棧,咱們才能盡情推進新產品與想法。
原文:https://brandur.org/minimalism
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及雲服務器等套餐
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 網易雲容器服務微服務化實踐—微服務測試及鏡像化提測全流程實踐