【譯文】追求生產極簡主義
翻譯 :丁興華
歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。
有報道稱Kelly Johnson在冷戰期間的洛克希德公司工作時,創造了KISS('keep it simple, stupid')這個原則:建議系統應該設計的盡量簡單。
雖然復雜度從來不是任何項目的明智設計目的,但是它在追求新特性和新組件時會自然產生。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
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及雲服務器等套餐
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 網易雲容器服務微服務化實踐—微服務測試及鏡像化提測全流程實踐
【譯文】追求生產極簡主義