鄭昀:技術人間自有法則在

来源:https://www.cnblogs.com/zhengyun_ustc/archive/2020/04/18/12728998.html
-Advertisement-
Play Games

通過本次講座,我想強調的是,You!Leaders!一定要通過層層疊加的“Rules”建立起本能反應,一遇到類似的事情,應激般的就知道該怎麼設計,怎麼行動,怎麼救火。 而這些“Rules”是經歷了血與火的洗禮鑄造的,每一條都有來由有去路。 等有一天你依據本能(也就是你自建的法則)行事的時候,你就會體... ...


創建於2019/4/28 最後更新於2020/4/16 關鍵詞:法則,規則,捷徑,災難,劫難 提綱:
  1. 人間法則零:手中無刀,但心中要有刀
  2. 人間法則一:捷徑充滿荊棘
  3. 人間法則二:儘早統一規格
  4. 人間法則三:災難錦囊
  5. 自建法則 法則長存
 
 

法則零:手中無刀,但你的心中要有刀

軟體工程和技術領域里雖說法無定法,需求和流程隨便怎麼做都可以,但也並非可以天馬行空恣意妄為,稍不留意就可能天塌地陷牆倒屋塌,釀成不可收拾之慘劇。下麵我就說道說道。 2020年1月底2月初,首都醫科大學附屬復興醫院出現醫護人員感染新冠肺炎事件,最終累計確診34人,既有醫護也有患者和家屬,原因也非常“感人”:一位有武漢接觸史的老太太,本來屬於“新冠肺炎疑似病例”在發熱門診看病,但卻突發奇想,通過院領導的關係,托關係找心內科ICU主任韓某,愣是從防護森嚴的發熱門診病房轉進了雲淡風輕的心內科ICU,結果橫掃一片。 我一直說,工程師團隊和醫護團隊都是專業領域機構,管理方式有相似之處。那麼在這個案例里,管理者犯了什麼錯誤?心中無原則! 心中無原則,會有一百萬種死法。 原則!專業團隊的管理者心中一定要有原則,你有了原則,才能要求大家“講政治,守規矩”!同樣,在做設計的時候,先把設計願景、設計分階段目標、設計原則寫下來,在此基礎上畫地為牢再做設計推演,莫要天馬行空恣意妄為。手中無刀,心中有刀。  

法則一:捷徑充滿了荊棘

外行總覺得軟體開發有捷徑,有銀彈。還是那句話,有一百萬種死法等著您呢! XDD 話說時間回到2019年12月20日,波音公司設計研製的載人飛船“星際客機(CST-100Starliner)”正要從卡納維拉爾角發射,執行它的第一次飛行測試任務。按照計劃,飛船將在這次無人試飛中將與國際空間站對接,為宇航員送上聖誕禮物。但是就在與火箭分離後,飛船上的一個關鍵設備出現了異常,可以簡單理解為飛船的一個時鐘錯誤,讓飛船誤以為自己正處於提升近地點的變軌過程中。在預設程式里,變軌是需要很高精度的姿態和軌道控制的,因此飛船的 48 台姿軌控發動機開始瘋狂工作,在短時間內消耗了大量燃料。由於“星際客機”消耗了過多的燃料,與國際空間站的對接試驗不得不取消,原定於12月28日返回的飛船不得不提前到12月22日返回地球。   2020年2月28日,調研報告終於出來了,波音公司承認,星際客機軟體系統的程式存在嚴重缺陷。這份報告顯示,飛船和火箭助推器的時鐘不一致(運維同學可能會心一笑,這真的是非常經典的基礎維護錯誤),而飛船的 Mission Elapsed Timer 提前輪詢了火箭助推器的時間,從而提前開始了錯誤的計時併進入了錯誤的軌道。 這些明顯的錯誤完全可以被提前測試出來。於是調查小組對測試的流程進行了檢查。他們發現軟體測試走了捷徑:波音公司縮短了對該飛行器軟體的關鍵測試,他們將整個飛行過程分成了幾個小單元分別進行測試,但最後卻沒有做完整的、端到端的集成測試,即沒有進行時長為 25 個小時的整體測試。 NASA 載人航天業務負責人道格·洛夫羅表示,波音公司的問題是“根本性的”和廣泛的“軟體過程故障”。波音的這種軟體質量控制,還不知道會導致系統中到底存在多少個 Bug,“到底只有這兩個還是會有幾百個”。   看到這裡,你會不會擦一擦頭上的汗欣喜道:幸好這隻是無人飛船,而且還只是第一次執行飛行任務而已,有則改之,無則加勉嘛。 更可怕的還在後面呢。 彭博社曾指出:波音 737 MAX 把軟體系統外包給了印度外包公司 HCL 和 Cyient 的軟體工程師,比起美國正職軟體工程師每小時 35 至 40 美元的工資,印度外包的時薪只需要 9 美元,便宜了四五倍呢。更進一步,波音的分包商與供應商同樣選擇將工程外包到印度,降低成本以保證利益最大化。一位前波音軟體工程師在 2015 年表示,企業將裁掉 90% 經過了熟練培訓的員工,用“外包”來代替他們,從而縮減開支。 軟體外包絕對不是“一包了之”,它是一個需要發包方和承包方高度協作的過程,貼身服務周期長,可變因素太多太多,這使得發包方和承包方都同時面臨極大風險。我們見識過太多的外包失敗案例,不差波音這一個。 波音的 787 型飛機計劃 70% 使用外包,最終導致了延期三年還交付不了,波音表示:“我們同時在技術、工具和供應鏈上做了太多改變,超出了我們的管理能力”。   哪有什麼捷徑啊?只有外行領導的一廂情願而已。   1999年 NASA 當年發射了兩艘火星探測器,心想這下總是雙保險了吧。結果,一個失聯,一個在火星墜毀。咋回事呢?也是同樣的鍋:集成測試做得不好。 第一架名叫火星氣候探測者。1999年9月23日失聯於地球太空。 RCA報告這麼寫道: 它的飛行系統軟體使用公制單位“牛頓”計算推進器動力,而地面人員輸入的方向校正量和推進器參數則使用英制單位“磅力”,1磅力=4.4482216152605牛頓,導致探測器進入大氣層的高度有誤。 在該探測器的悲劇中,軌道模型來自於屬於政府部門的NASA(採用公制單位如米和釐米等),而飛行控制軟體來自於私營承包商洛克希德·馬丁公司。 洛克希德·馬丁公司的碼農們沒有按照飛船工程的介面規範設計軟體,而是習慣性直接使用了英制單位,大禍在上天前就已經註定。 (圖2 當時的諷刺漫畫 Remember the Mars Climate Orbiter incident from 1999, 左邊宇航員背上是NASA,右邊是Lockheed,即洛克希德)   第二架名叫“火星極地著陸者”。1999年12月3日墜毀於火星錶面。 (圖3 火星極地著陸者號登陸火星藝術效果照)   RCA報告執筆者無奈地寫下: RCA類型:缺乏集成測試! 有一個甲小組測試探測器的腳落地過程(leg fold-down procedure),即探測器的三個著陸支架如果觸地了,制動發動機就會提前關機。 有一個乙小組測試飛船著陸過程的其他部分。乙小組總是在開始測試之前重置電腦、清除數據位。 這兩個小組的工作都沒什麼問題,但就是沒有合在一起測試。 沒想到著陸支架伸展出來的這個動作產生了意外的信號,制動發動機以為已經觸地了,於是在探測器距離火星錶面還足足有40米的時候就提前關機了。咔咔,蛋碎。   最後說一句,圖快懶省事兒,不做集成測試,不做回歸測試,尤其是涉及軟硬體的,您真的會死得很難看。  

法則二:儘早統一規格,別讓雜草到處長

技術團隊人多了,就會分好多組,併發幹活,人上一百,形形色(sai)色(sai),如果沒有居中協調人,比如一個 CTO 或者 大 PM,就很可能會各自為戰,完全取決於技術 Leader 的喜好和意識。這會有什麼問題呢? 這裡有一個經典故事:阿波羅13號。很多人可能都看過這部據真實事件改編的電影。 1970年4月,阿波羅13號發射升空之後,液氧貯存罐意外爆炸,指令艙和服務艙失去了兩個氧氣罐中所有的氧氣,所幸宇航員沒有受到影響。面對這種情況,NASA 不得不放棄原定的登月計劃,改為以順利返回地球即生還為最重要目標。經過緊張計算,地面指揮中心發現可以借用登月艙的資源保證宇航員生存,所以原本設計供兩名宇航員使用兩天的登月艙需要容納三名宇航員生存四天,但這樣就會存在極大的風險,宇航員可能窒息而死。 果不其然,登月艙的二氧化碳氫氧化鋰過濾罐不堪重負,好在天無絕人之路,指令艙有備用的過濾罐。這時候才發現,登月艙和指令艙的過濾罐由不同供應商提供,所以一個介面為方形,一個介面為圓形,並不相容。 (動圖1 電影《阿波羅13號》中尋找解決二氧化碳問題的片段) 天上和地上只能同時想辦法,在“每一克重量都極寶貴”的飛船上想出辦法來解決這個問題…… (圖4 宇航員們臨時拼裝的二氧化碳過濾裝置,工程師們將其戲稱為“郵箱”) 當然,燒腦大戰之後,最終還是成功地解決了這個問題,如上圖所示。   技術 Leader 們,平常多聚會多碰頭吧,很多東西從文檔上根本看不出來,只能靠當面多溝通多交流,才會發現這種潛在隱患……  

法則三:災難錦囊,大恩不謝

災難我們見得多了//不愧是老兵~ 每臨大事有靜氣,不信今時無古賢//但是我們每次都慌得不行~ 關鍵是每次災難都不一樣//它不重樣誒,你待我何~ (圖5 北京有家飯館,樓里掛了一塊匾,上面寫著四個字:何事驚慌)   如果災難真的來臨,我們該怎麼辦? 在著名的“4英寸發射”事件中,Christopher Kraft 給航天任務定下的第一法則:如果你不知道發生了什麼,那你就什麼也不要做(If you do not know what to do, don't do anything)。 在這次阿波羅12號飛船升空遭雷擊的事故中,宇航員本來可以啟動逃生程式的,但關鍵時刻他們想到了這條原則,所以什麼也沒有做,最終在指揮中心的 Aaron 給出了著名的經典的明確的指令:“try SCE to AUX”,登月行動得以順利進行。 作為對比,1960年10月24日,前蘇聯發生了與“4英寸發射”類似的航天事故,結局則要慘痛許多。 那麼讓我們看看發生了什麼? 1960年,前蘇聯發射火星探測器,前兩次都失敗了,如果第三次再失敗,就必須再等兩年才會出現行星連線的機會。 火箭此時已加註了燃料,但還是有些問題,為了不錯過發射時機,為了報答赫魯曉夫去年提拔自己為炮兵主帥的知遇之恩,聶傑林元帥毅然決然地拒絕了拜科努爾發射現場總指揮延期發射的忠告,堅持要求在發射臺上對火箭進行全面檢查。 總工程師只得違規准許對各個不同系統並行檢查,而不是按照規定一項一項來。 聶傑林希望趕在國慶節前發射,能省的步驟就省,即使這樣,災難發生前工程師們也連續工作了72個小時,為了趕時間工程師們在裝滿燃料的火箭底下檢查點火系統,一個燃料泵有燃料泄漏,電路也有一些短路,搞定之後,他們卻已經沒有時間重新檢查,因為元帥已經到了。參謀總長索科洛夫建議暫緩發射,但聶傑林斥責他是懦夫,索科洛夫一氣之下離開基地,反而他因此幸存了下來。 聶傑林本人親臨現場督戰,原本按照規定,所有不直接參与發射準備工作的人員都應到地下水泥掩蔽部去,但聶傑林卻坐在火箭不遠處的凳子上,可謂是盡心儘力。發射場主任兩次懇請他轉移到安全地方,他都置之不理。 可惜的是,火箭雖然叫“二炮”,但它畢竟不是炮。 (圖6 拜科努爾發射中心爆炸現場) 這枚火箭的第二級火箭有自己獨立的時鐘,它按原計劃點火了,結果引發整枚火箭爆炸,3000度以上的火海吞噬了發射場,跟聶傑林一塊坐在火箭旁邊的幾十名將校級火箭專家、技術人員當場團滅。聶傑林燒得連點灰燼都沒有留下,只找到半塊被燒焦的元帥肩章和已經熔化了的辦公保險箱的鑰匙。這些東西後來都被裝進骨灰盒,安葬在克裡姆林宮的宮牆下。 (圖7 拜科努爾發射中心爆炸後)   切換到我們的場景,如果你已經完全容器化了,那麼災難發生的時候,系統運維工程師拍馬趕到之後,一定是:
  • 重啟相關應用;
  • 如果不行,先流量切換多活機房,保證服務正常提供;
  • 目標只是分鐘級最快速度恢復,保證SLA四個九!
  • 不需要做任何其他事情,
  • don't do anything,
  • 不要寄希望於工程師短時間內定位問題,不需要的~
  • 先恢復服務!除此之外的任何事情可能都是奢望,甚至是干擾。
 

自建法則 法則長存

不,沒有什麼法無定法,技術的世界里一定是有法則的,否則你會死得很難看,別指望我來救你,我救都救不贏。 通過本次講座,我想強調的是,You!Leaders!一定要通過層層疊加的“Rules”建立起本能反應,一遇到類似的事情,應激般的就知道該怎麼設計,怎麼行動,怎麼救火。 而這些“Rules”是經歷了血與火的洗禮鑄造的,每一條都有來由有去路。 比如說,我在2018年定義的 DevOps 新八榮八恥,每一條都是血肉長城:
  1. 以隨時可擴容、可縮容、可重啟、可切換機房流量為榮,以不能遷移為恥。
  2. 以可配置為榮,以硬編碼為恥。
  3. 以系統互備為榮,以系統單點為恥。
  4. 以交付時有監控報警為榮,以交付裸奔系統為恥。
  5. 以無狀態為榮,以有狀態為恥。
  6. 以標準化為榮,以特殊化為恥。
  7. 以自動化工具為榮,以人肉操作為恥。
  8. 以無人值守為榮,以人工介入為恥。
  如何自建法則? 從錯誤中學習錯誤!   『學校里學習最好的學生可能往往是那些最不善於從錯誤中學習的人,因為他們已經習慣了把錯題當成失敗的代名詞,而不是把犯錯看成學習的機會,這反而成為他們進步的主要障礙。走入社會之後,聰明的人必須善於擁抱自己的錯誤和不足,從而能遠遠超過那些與他們水平相當,但更自負的同學、同輩。』 這也就是為什麼平凡人可為非凡事的緣故! 『不要患得患失,要朝著目標努力前行。要自省自警,別人對你很到位的批評,是你能得到的最寶貴的建議。想想看,你的滑雪教練告訴你,你摔跟頭是因為你滑行中的重心移動不對,此時你要是認為他在責罵你,你該多麼愚蠢和低效。同理,你的上司,我,也可能會指出你工作中的缺點,有則改之,繼續努力就是了。』 等有一天你依據本能(也就是你自建的法則)行事的時候,你就會體會到我的良苦用心了!   -EOF- 推薦閱讀: 系統問題應當如何排查?看看NASA著名的“10釐米發射”吧,2019,https://mp.weixin.qq.com/s/zhyu4OXXSJjsde_MmdavXA try SCE to AUX,輓救登月的傳奇指令【修訂版】,2018,https://mp.weixin.qq.com/s/xhhg259Fd4s5XE_Fjqc3eA “阿波羅“登月中的工程管理一瞥,2018,https://mp.weixin.qq.com/s/-u0TtSBA5EynVpTkuSVdog 《阿波羅8號,NASA的驚險大躍進》,2019 I,臨危受命,https://mp.weixin.qq.com/s/fbsAdCY5xJm2D6qlVWq0sQ II,技術準備,https://mp.weixin.qq.com/s/NcrALrIPyUs4LK4M2DJyoA III,悲劇年份,https://mp.weixin.qq.com/s/2JCFdJkhOXL2HPh5VEJ54A IV,發射,https://mp.weixin.qq.com/s/bUjpO9fyEiSrm4lco42PyA 俄國內德林飛彈事故,2017 https://www.chinatimes.com/cn/realtimenews/20170525005219-260417?chdtv   細數半個世紀以來折戟火星的“登陸者”,騰訊太空,2016,https://mp.weixin.qq.com/s/ltfItsUQtOKHMwhaRFboDw   關於資料庫‘狀態’欄位設計的思考與實踐,2017,https://www.jianshu.com/p/03522e3938c0 交互水深 10 | 以 [ 訂單狀態 ] 為例,聊聊產品策劃的八字法則,2018,https://zhuanlan.zhihu.com/p/35199144
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天我們來談談Web和前端開發過程中需要學習什麼?前端開發需要使用什麼開發工具?也簡單介紹前端開發前景和薪水。 前端工程師的主要職責: 前端工程師在不同的公司有不同的功能,但性質相似。 1、網站設計與網頁界面開發 2、做網站界面開發 3、Web界面開發,前端數據綁定,前臺邏輯 4、設計、開發、數據 ...
  • 公司組織機構是樹形機構,每個層級的機構可能有下屬機構,依次遞進到最末不可細分的末端機構。為了方便查找與維護,採用樹狀格式展現表格數據,點擊展開下級機構。 1. 首先設計資料庫表結構,關鍵是本級機構編號deptid與上級機構編號abvbranch create table RQ_DEPT ( dept ...
  • 環境:chrome 80 演習:用 `Generator`封裝$.ajax Promise 第一次請求成功,接著請求第二次 多個請求全部成功,才執行下一步操作 多個請求,全部執行完畢後進行操作 Generator 第一次請求成功,接著請求第二次 多個請求全部成功,才執行下一步操作 ...
  • 現在使用的js語法,基本是ES5的規範 ,15年出的ES6的規範增加了很多其他語法,要看瀏覽器的支持情況,如果瀏覽器不支持那麼就會報錯 ES6 塊級作用域 關鍵字let, 常量const,對象字面量的屬性賦值簡寫,賦值解構,函數參數 - 預設值、參數打包、 數組展開(Default 、Rest 、S ...
  • 這是一組非常容易弄混的參數!都是描述某個盒子元素的寬度、高度以及上或左的距離偏移量。 1. offsetWidth / offsetHeight(不包括外邊距) offsetWidth:返回元素的寬度(content+padding+border) offsetHeight:返回元素的高度(cont ...
  • p5.js完成星際穿越特效 歡迎關註我的 "博客" ,⬅️點他即可。 星際穿越,是模仿漫天星辰撲面而來的感覺。 最關鍵的在於對透視的掌握。 參考資料:The Coding Train 00 思路構想 1. 星星是一個圓,會隨機的出現在屏幕的任何位置; 2. 星星會從遠處到眼前: 圓的大小 來表示遠近 ...
  • 這次作業完成了一個開環可選層電梯調度系統。第二次迭代加入了容量限制、多部電梯,第三次迭代加入了電梯樓層分工、增添電梯請求。 1. 系統架構 MainClass用於對各個子系統的組裝,發送請求至Schedule Schedule用於接收來自MainClass、Executor的信息,更新狀態 Exec ...
  • 在整體應用架構中,非生產環境情況下,一般 1GB 或者 2GB 的 RAM 就足夠了。如果我們將這個應用程式劃分為 20 或 30 個獨立的微服務,那麼很難期望 RAM 仍將保持在 1GB 或 2GB 左右。特別是如果我們使用 Spring Cloud 的時候。 首先,準備三個服務,Eureka 服 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...