主頁 > 軟體工程 > 工程師應該如何對待自己的錯誤

工程師應該如何對待自己的錯誤

2021-06-13 06:25:48 軟體工程

繼上次講的管理者如何對待工程師團隊犯錯誤之后,我再說說工程師怎么對待自己的錯誤,

RCA報告制度是我的研發四板斧之一,也是我最為重視的環節,我會和涉及到的所有人一一確認BUG和故障的所有細節,直到我能完全理解并建立因果鏈為止,RCA報告由我撰寫或至少由我修改一直改到我滿意為止,

但很多工程師剛到我的團隊,遇到這種場合,都會有點靦腆,有點扭捏,有點不好意思,還有工程師不愿自曝其丑,總覺得我改都改了,領導這是生氣了嗎,領導你問這么細干啥呀,總想對推理程序一帶而過,

圖片

 

在我這里,允許失敗,允許犯錯,做IT不可能一帆風順,不可能沒有意外,就算內部沒發布沒更新沒問題,外部也會給你當胸一拳,所以我常說“災難隨時會到來”,

“有一種愚蠢的觀點認為,在NASA不允許失敗,”埃隆·馬斯克說,“但在這里(注:指SpaceX),失敗是可以選擇的,如果你沒有把事情搞砸過,說明你的創新能力不夠強,”——Ozan Varol

按這種說法,也不是什么失敗都可以被接受,我對高級別錯誤見獵心喜,反對愚蠢的低級錯誤,尤其是反復犯同一類低級錯誤,

工程師死于什么?

工程師死于聽天由命和漫不經心,

圖片

 

有研究人員對71名外科醫生在10年時間里做過的6500臺心臟手術做了調查分析,他們發現,那些把手術搞砸了的外科醫生會在隨后的手術中表現更差,結果表明這些外科醫生不僅沒有從他們的錯誤中吸取教訓,反而還強化了壞習慣,——Ozan Varol

所以工程師應該有意識地用清晰易懂的證據鏈,論述清楚根本原因,撰寫RCA報告,并廣而告之,讓其他工程師一起從這個錯誤中吸取教訓,把不好的習慣提前消滅,

 

第一個例子:

曾有產品經理反饋,她多次發現我們的一款App在蘋果手機上會出現打開后首頁選單消失的現象,再次打開后則選單顯示,此問題復現時機不確定,

工程師分析后發現,首頁選單的動態顯示用了一個臨時性方案:由H5資源中的JSON檔案配置,

選單項之所以消失,是因為從網路下載的存盤于沙盒檔案目錄 Library/Cache 中的新H5資源檔案夾丟失了,所以不顯示首頁選單,

網上大多數文章中對這個 Library/Cache 目錄的描述是:程式重啟后并不會丟失資料,只是不會被iCloud同步,而實際上蘋果的檔案中給出的說明是,當設備存盤空間不足時,系統可能會自動洗掉此目錄中的檔案,

本地H5檔案夾丟失后,解壓出來的是App包里的老H5資源,所以下一次打開的時候能顯示首頁選單(只不過是上一個版本的),

工程師找到根本原因之后,明白了兩個道理:

第一條,盡量不要使用臨時方案,迫不得已采用了臨時方案,也要盡早改造為通用方案,別給自己埋雷,

第二條,使用官方相關API時,一定要親自查閱通讀官方原版API DOC,不要道聽途說,不要嚼別人嚼過的饃,

所以他將H5資源從 Library/Cache 目錄,轉移到 Documents 目錄,確保H5資源相關的檔案不會丟失,同時首屏選單,從H5中的JSON控制,改為由服務器統一下發,

 

我們積攢了數百份翔實的RCA報告,每攢一批RCA就會全員發布,

為了提升從失敗中吸取教訓的能力,NASA在一份名為“飛行規則”的檔案中羅列了人類在航天飛行中犯過的錯誤,這份記錄過去的規則可以為未來提供指導,它匯集了幾十年來的航天失誤和錯誤判斷,讓人們以史為鑒,該檔案記載了自20世紀60年代以來載人航天飛行中出現的數千種例外情況及解決方案,描繪了每次事故的前因后果,并在更宏大的背景下賦予它們意義,為子孫后代保留了這種制度化的知識,有了這本手冊,NASA的員工只要關注新的問題即可,無須做不必要的重復作業,

——Ozan Varol

雖然我不知道一代代工程師有多少人認認真真讀過一遍RCA,但我對每一個案例都印象深刻,每當發生BUG或故障,我都能聯想起歷史上一宗宗相似的案例,為團隊提供思路,

工程師不要覺得那些都是過時的冊子,都是別人犯的錯,我不會犯這些錯誤,但你連是什么錯誤都不知道,你憑什么不會重復犯錯?

圖片

 

第二個例子,

一天業務方反饋說資料大屏里有一個學生的消費趨勢和他的消費明細對不上,

工程師進一步分析其他學生消費資訊發現并不是一個學生資料問題,而是共通性問題,這才發現Kafka集群的目標topic有五個磁區,但消費端只消費了其中三個磁區的資料,這是為什么呢?

原來前不久大資料服務“移山”里的實時訂閱監控告警某topic的消費延遲較大,于是就擴了兩個磁區,但是下游消費者并未感知到磁區的變化,依舊只消費舊的三個磁區資料,造成計算結果偏小,那這又是為什么呢?

工程師探究之后發現,FlinkKafkaConsumer配有動態感知磁區變化的開關(flink.partition-discovery.interval-millis),打開開關后,便可以動態感知磁區變化,就不用重啟消費端了,由于實時計算動態感知有性能損耗,所以官方默認是關閉的,從性能和資源利用率及我們實際情況綜合考慮,也不需要開啟動態感知引數,以后如果磁區調整變多,會打開這個開關的,就不用統一重啟所有消費者了,工程師得到的教訓是,對于商業產品涉及的集群,任何與其相關變化調整要做方案評估再操作,不可太隨意,

 

當我與一些企業高管談論失敗時,他們中的一些人認為:如果失敗是可以容忍的,那么失敗的次數就會成倍增加,失敗意味著犯錯,而犯錯是需要追責的,這些高管認為,如果不對責任方做出處罰,最終就會培養出一種“失敗也無所謂”的企業文化,允許失敗的存在,這些想法與幾十年來的研究結果格格不入,——Ozan Varol

這也就是我上一篇文章所抨擊的企業高管,

你完全可以創造一種環境,允許聰明人失敗,且讓他們不自鳴得意,你可以允許人們承擔高質量的風險,但你也可以設定高標準,你用不著容忍那些草率的失敗——所謂草率的失敗,指的是因為心不在焉而反復犯同樣的錯誤或反復失敗,你可以獎勵那些“聰明人的失敗”行為,懲罰表現不佳的人,當你正在打造那些可能會失敗的東西時,必須要接受一些無法避免的錯誤,人們不應該為聰明的失敗承擔責任,而應該為沒有從中學到經驗承擔責任,——Ozan Varol

在這種環境下,那些仍然不愿意公開談論失敗的工程師,那些仍然對“總結經驗教訓”敷衍潦草的工程師,注定將一事無成,

圖片

 

這其中的奧秘,是一種叫“心理安全”的東西:

1995年的一項研究發現,每一位住院病人的用藥錯誤次數達到了1.4次,在這些錯誤中,大概有1%的病人得了并發癥,身體受到傷害,哈佛商學院教授埃德蒙森決定深入挖掘原因,她派一名助理研究員去醫院實地觀察醫療團隊的做法,該助理發現,較好的醫療團隊并沒有犯更多的錯誤;相反,他們只是上報了更多的錯誤,

這些團隊擁有開放的氛圍,員工認為探討錯誤的做法是安全的,他們更愿意與他人分享失敗的經驗,并積極努力減少失敗,所以他們的表現更為優秀

埃德蒙森把這種氛圍稱為心理安全,用埃德蒙森的話來說,心理安全是指“在實作雄心勃勃的績效目標程序中,沒有人會因為犯錯、提問或求助而受到懲罰或羞辱”

研究表明,心理安全能促進創新,當人們可以暢所欲言,提出挑釁性的問題和半成型的想法時,挑戰現狀就變得更容易了,心理安全也提升了團隊學習能力,在心理安全的環境中,若上司提出可疑要求,雇員就會提出質疑,而不是一味地服從命令,在埃德蒙森的研究中,表現最好的醫院團隊是由一位身先士卒、極其平易近人的護士長領導的,她積極地促進開放式環境的形成,在接受采訪時,護士長說她的團隊允許在“一定程度上犯錯”,而“非懲罰性的環境”對發現和解決錯誤至關重要,在該團隊作業的護士們證實了護士長的話,一位護士指出,“這里的員工更愿意承認錯誤,因為護士長會幫助你”,在這個團隊中,護士們勇于為自己的錯誤承擔責任,正如護士長所說的那樣,“護士們往往會因為犯錯而自責,她們對自己的要求比我任何時候對她們的要求都嚴格得多”,

表現最差的兩個醫療團隊則有著截然不同的氛圍,在這兩個團隊中,犯錯意味著受懲罰,一位護士稱,她曾卷入一起醫療事故中,在給一名病人抽血時,她不小心傷到了病人,護士長立刻對她進行“審判”,護士回憶說:“簡直太丟臉了,仿佛我是兩歲大的孩子似的,”另一位護士說“醫生們喜歡擺架子”,如果你犯了錯,“他們恨不得把你的腦袋擰掉”,還有一位護士稱,犯錯后的感覺就像是“被叫進校長辦公室”,結果,如果發生用藥錯誤,護士們會故意掩蓋訊息,免受短期的尷尬和痛苦,然而這種做法忽略了保持沉默的長期后果,即病人因為用錯藥而受傷或死亡,反過來,這種環境會形成惡性回圈,那些表現最差、最需要改進的團隊也最不可能上報錯誤;而如果錯誤沒有上報,團隊便無法改進,

我相信每一位對職場高度和人生高度有所追求的工程師都不會愿意置身于那種沒有心理安全的團隊環境,一旦你偶然間加入了一個愿意明確承諾支持“聰明人的失敗”和善意的風險承擔行為的團隊,請珍惜它,因為真的不多見,

圖片

-END-

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/286873.html

標籤:其他

上一篇:可視化前端編程平臺(LowCode or NoCode)

下一篇:工程師應該如何對待自己的錯誤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more