什麼是工程師文化?-陳皓
四年前,我在QCon上演講了一個《建一支強大的小團隊》(整理後的PPT分享於這裡)提到了工程師文化,今天,我想在這裡再寫一篇關於工程師文化的文章,一方面是因為我又有了一些想法和體會,另一方面,因為我也正走在創業的道路,毫無疑問,要建一個有濃重的工程師文化的團隊或公司,所以有必要把自己的相關想法形有成白底黑字的“字據”,以供打自己的臉——“要是未來沒有做到,這篇文章就打我未來的臉” || “這篇文章太幼稚了,未來的我會打我現在的臉”,當然,如果要打臉,我希望是前者。
Again,這篇文章不是招人的貼子,因為我覺得,招聘第一重要的事,不是發招聘廣告或是找獵頭挖人,而是先得讓自己變成一個能配得上真正工程師的公司,然後再談吸引人的事 。
為什麼要工程師文化
看看最近二十年來社會的發展,計算機和網際網路已經滲透到了這個社會的每一個角落,各式各樣的計算機技術成為了整個世界發展的強大引擎,各式各樣的創新,無論是業務創新還是技術創新,都是依託於技術的快速演進,技術成了解放生產力提高社會運作的效率的中堅力量。以美帝為首的技術創新公司著著實實的改變著這個世界和人類的生活和生產習慣。
今天,每個從事計算機行業的技術人員都應該感到幸運,因為,我們不但選對了行業,也出生在了正確的時代,可以感受到前所未有的刺激和變化,相比起我們的父輩,我們的人生,能經歷這樣的時代,實在是一種幸運。 所以,選對了職業並出生在了正確的年代的我們,此時只需要思考的一個問題,那就是,我是否呆在了正確的地方用正確的方式做事?
在我看來,這個世界上有三種商業公司,
運營或銷售驅動型的公司 。這類的公司以運營和營銷見長,技術對於他們來說,更多的只是為了支援大規模的營銷活動,以及成本上的控制,所以,基本上來說不太需要技術創新。這種公司最大的問題就是缺乏安全感。
產品驅動型的公司 。這類公司以產品見長,通過創造能提升使用者生活體驗的產品見長,技術對於他們來說,除了支援大規模的線上使用者之外,他們會更多的去尋找那些為了增強使用者體驗,提高整個業務流程效率的技術創新。比如:UI的互動方面的,整個業務流程方面的。這種公司最大的問題,就是容易被別人模仿和抄襲。
技術驅動型的公司 。這類的公司相信技術能改變世界,他們更多的是用強大的工程技術來創造有顛覆性的東西,更多的是用各種自動化的技術取代人類。比如:近代的蒸汽機技術取代了大量的人工,數字技術取代了大量資訊傳遞的人工,現代,這類公司還希望通過人工智慧來取代愚蠢的人類來做決定。這種公司最大的問題就是可能做出叫好不叫座的東西。
這三種公司都可能成功,也都有問題,但是,無一例外,他們都需要強大的技術支撐,只不過,他們把技術所放在的位置不一樣。
無論你有多麼的看不起技術人員,你都無法否認,你今天的生活相當的依賴這幫工程師,沒有他們,你恐怕都不知道怎麼生活了。鄧爺爺幾十年前就說過——“科學技術是第一生產力” ,無論什麼樣的科學技術的理論要落地都會依賴於工程技術有多先進。
所以,在今天,作為一個IT或網際網路公司,“工程師文化”不是一個問題,而是一個常識 !
工程師文化的特徵
我下面羅列的這些特徵,來源於:Google的《重新定義公司》,我在Amazon的工作經歷,37Signals的《Rework》,Quora上的What Makes Good Engineering Culture? Slideshare上的What Makes Good Engineering Culture,以及我最近這半年來的一些實踐。
簡單說來,我可以簡單的把這多的工程師文化的總結成兩大類:“自由” 和 “效率” 。
本來還應該有個“創新”,但我個人認為,創新的前提是——在自由的環境下對提高效率的痴迷,就一定會發生創新。
創新不是憑空出現新的東西,其實,觀察一下人類的發展史,不難發現,幾乎所有的創新基本上跳出原來的思維模式用新的思維模式對原有問題的效率進行質的提升 。比如:通訊、交通、醫療、教育、生活……幾乎全都是在優化效率。
所以,如果你的精神不自由,你很難跳出老的思維模式,你用老的思維模式你一定不會想到新的方法和方式,如果不是對效率的提升,這個創新可能會不接地氣。
因此,我認為,工程師文化就是自由加效率!
自由
首先,工程師文化意味的創新文化,工程師都是有創新衝動的人,因為手裡有創造技能的人通常都會有想創造點什麼的衝動。而創新的源泉水來源於精神的解放,精神自由才會引發各式各樣的奇思怪想,才會有常人覺得不可能的瘋狂想法和想像力,而這些想法和想像力導致了創新。
精神上的自由具體表現在:
自我驅動 。自己管理自己是最好的管理。最失敗的管理就是家長和保姆式的管理。興趣出發的工作才可能迸發出真正的動力。
靈活的工作時間和地點 。工程師們更多的是腦力工作,而不是體力工作,工作上時間和地點的自由安排可以讓工程師們的腦力工作更有效。Remote是一個很不錯的工作方式,開源社群基本上都是這鐘方式。和Remote有關的話題可參看37Signals的這本書《Remote》
資訊平等 。這意味著,全體員工得到的是原始資訊,而不是被管理者們層層加工消化後的資訊,資訊的遮蔽很容易造成誤解和完全錯誤的行為。資訊的平等,大的包括戰略、方向、目標、財務,小的包括文件、程式碼、和知識的共享等。同樣,也表現在意見表達上,任何人都有可能表達自己的意見和建議的平等機會,這樣才會激發出更多的思路和思辯,從而有不同的更好的思路出現。而不是,大家都看到了問題,而沒有人敢說。在Google除了程式碼全員共享,還有Thanks God, It’s Friday的文化,每週五,高管們會出來,任員工提各種尖銳的問題,在Amazon,程式碼和文件基本上全員開放,包括財務報表也對員工開放,另外,除了所有的NB的Principle SDE隔三岔五都會有一個Principle Talk(有很多Talk相當令人開腦洞),還有Amazon內部的Up the River文化,每年會選出一批公司最聰明最有想法的人集思會,討公司下一步的和戰略,並可以把相應的KPI直接按給Senior VP。
不害怕錯誤 。處理錯誤的正確的姿勢是分析總結教訓,而不是懲罰故障人。前者讓人改善進步,後者讓人萎縮不前。最大的錯誤就是不敢犯錯,最大的問題就是不敢直面問題。
寬鬆的審批系統甚至沒有審批系統 。審批通常暗示著三件事,1)對人的不完全信任,2)繁瑣的流程,3)思維上的束縛。這些都是創新和想像力的天敵。一個公司的監管、審批、流程越重,這個公司的活力也就越差。
20%的自由時間 。這是Google公司提出來的,員工有20%自由的時間做自己想做的專案,Gmail就是這麼出來的。
效率
工程師天生是追求效率的。有人說認為程式設計師花大量的時間做自動化的工具,還不如人肉的效率高,比如,寫自動化的指令碼花5個小時,而重複做這件事200次只花3個小時。有這樣的理解的人根本不懂工程。
一方面,這個工具可以共享重用,更多的人可以從中受益,這次我花5個小時開發這個工具,下次只用1小時改一下就可以用在別的地方,這是養眼於未來而不是眼下的成本。更重要的是,這是一種文化,一種提高效率的文化,他會鼓勵和激發出更多的這樣的事情發生。如果你因為一個程式設計師花大量的時間開發自動化的工具,而認為這個程式設計師沒有效率,對之批評甚至懲罰的話,那麼你就扼殺了提高效率的文化 (關於效率,大家可以看看我的另一篇文章《關於加班和效率》,你會真正瞭解什麼是效率)
人類之所以比別的動物聰明就是會使用和發明工具 ,而古語也有云:“工欲善其事,必先利其器”,看看美軍的裝備你就知道戰爭工具的好壞有多重要了,一個公司的強大之處在執行力,而執行力的強大之處在於你有什麼樣的支援工具。這些,已經不是工程師文化,而是人類發展的文化 。
針對於工程師文化來說,尤其是軟體工程,提升工程效率的具體表現如下:
簡化 。簡化不是簡陋,簡單的東西通常意味著使用者更好理解,也意味著更容易的維護和運維。就像阿里推行的“小而美”,就像喬布期推崇的“沒有產品手冊簡單易用的產品”,就像Amazon推行的Working Backwards裡說的那樣,一個新的產品或功能,產品經理需要寫三個文件:媒體公關文、使用者手冊、常見問題,三個文件不準備超過兩頁A4紙,且不準用任何圖片說明。
殘酷無情的推行自動化 。編寫程式的最本質的目的就是自動化,看看人類發展史上自動化了多少東西。對於自動化來說,不僅僅只是消除人肉的重複勞動,更重要的是,很多事情人完全乾不過機器,比如:加一臺機器,程式在秒級就可以完成,而人是永遠不可能達到這樣的速度的,再比如:電商中用程式管理數量巨大的訂單的自動化系統,加再多的人都完成的不可能像機器那樣完成的又好又快。自動化需要大力開發提高生產力的工具,比如:持續整合,持續部署,自動化運維,基礎自動化運維,甚至自動化的運營工具。(Amazon的軟體工程中對自動化和簡代相當迷戀)
避免無效率的組織架構和無效率的管理 。這體現在這些方面:1)扁平化的組織架構,2)努力用自動化工具取代支援型的工作,3)不超過10個人的全棧小團隊,4)不按人員的技能分工而是按其負責的產品或功能分工(關於分工,請參看《讓我們來談談分工》),5)開會不是解決問題,開會是表決提案,6)通過產品的目標或信條Tenets來減少溝通和決策過程(Amazon裡的每個部門,每個團隊,每個產品都有自己的Tenets,這個Tenets標明瞭要什麼不要什麼,這樣可以避免很多扯皮和難纏的trade-off的決擇,比如:AWS的幾個信條:運維是最高優級的——這意味著只要是會讓運維變得複雜的需求都可能會工程團隊被拒掉,Throughput & Laentcy不能更差——這意味著,功能要為效能讓路,因為效能變差了,使用者就要買更多的資源)
正確的元件抽象 。抽象是簡化的一部份,一方面,抽象意味著重用和通用,另一方面抽象意味著強大的擴充套件性,以適配各種可能性。最重要的是,抽象意味著技術能力的輸出,無論是內部的其它團隊還外部的團隊。比如:Google的MapReduce/BigTable/ProtoBuffer,FaceBook的Thrift,還有Amazon內部的WebService框架Coral Service、處理日誌監控的Timber,以及全線AWS產品都用到的Amazon Lock Framework(一個分散式鎖框架)……
開發高質量的產品 。因為高質量的程式碼,不但可以容易的修改和維護,還可以因為少處理線上故障,從而有更多的時間去為未來做更多創造性的工作。這意味著需要有非常嚴謹的Design Review,Code Review,以及測試,關於Code Review,可以參看這篇文章《從Code Review 談如何做技術》,關於嚴謹的測試,可以參看這篇文章《如果做效能測試》
不斷的提高標準以及招聘最好的人 。取法其上,得乎其中,取法其中,得乎其下,取法其下,法不得也。如果一個公司或一個團隊想變得越來越好,越來越強大的話,就必需要不斷的提高自己的工作標準,提高工作標準意味著要不斷地培養和招聘更好的人。在Amazon和Google的招聘官中都有一個叫Bar Rasier的人,這個人就是為了提高招聘標準而設立的。
建立一個持續改善的文化 。一個好的組織,一個好的團隊,是需要不斷反思前進的,這需要全體員工一起來的。微觀層面上,在專案做完後需要有一個總結會分析專案中的得失,在故障出現後,需要有故障分析會,反思得失,在Amazon,嚴重的故障,需要寫一個COE(Correction of Errors)的文件,其中有一節叫“Ask 5 Whys”,讓你自己問自己至少5個為什麼。在巨集觀層面,一個公司每年都應該做一定的工作資料分析或是員工調查,比如,是否招聘到了不錯的人、工作的投入產出比,員工在哪些地方花時間了,等等,然後不斷的用技術手段來改善。(Amazon每年的工程師員工調查表是我活那麼大見過的最細最細的調查表了, 問題除了對公司、經理、文化的,還有從,日常工作、開發環境、持結整合,測試自動化、產品質量、軟體架構、軟體維護、線上問題處理、年度計劃、資料倉儲建設、通用工具投票……這個員工調查直接導致公司的對工程的投資方向)
工程師文化如何落地
如果你要讓任何文化在公司內得到執行,你有下面幾個手段可以選擇:
通過政治手段:你需要把三個地方——招聘、績效考核心 & 升職 。比如,你要落地工程師文化中的簡化和自動化,那你你在招聘的時候,你需要把懂簡化和喜歡自動化的人招進來,然後在績效考核和升職的地方設定上一條硬性指標——你今年簡化了什麼?自動化了什麼?如果沒有,對不起不但不能升職,績效可能還不達標。
通過經濟手段:讓不做這事的成本 > 要做這個的成本。 然後,正常的人類都會選擇成本低的方案。比如,如果你要推行Design/Code Review/UT以提高質量,你就把QA和OPS團隊全挪到一邊去,讓Dev團隊自己測試,自己負責,這樣等這些Dev重複多次手動測試,處理多次線上的弱智故障,他們就會自然而然的寫自動化測試和做Code Review了,而QA和OPS團隊只是幫Dev你做工具罷了,而測試和運維的事全是你DEV的Ownership,出了故障也是Dev自己負責,於是,他們就會發現,不做Code Review和UT的成本遠遠大於做C Code Review/UT的成本,他們就會去做成本低的事的。
最後,工程師文化要落地,還有幾個小條件,
第一,團隊要小,Ownership很重要,Eat Your Own Dog Food。 沒有人幫你擦屁股,自己的屎自己吃,沒有痛苦,不會產生想進步的動力。
第二,熱愛學習和嘗試 ,學習嘗試新的技術,開拓眼界,學習嘗試新的思維方式,否則,呆在原地,原有的思維方式只會讓你在原地打轉轉。
第三,老闆更多的相信技術而不是管理 。相信技術會用技術來解決問題,相信管理,那就只會有制度、流程和價值觀來解決問題。
其它
說了這麼多,時代還在發展,不過,這是我這麼多年經歷或看到的工程師文化的東西了。最後吐幾個槽——
對於996和加班這個事,對於工程師來說從來都不是問題,在解決技術問題或是創造的時候,工程師是個很自覺的群體,基本不需要有別人驅動,工程師是最樂意Work Hard的人了。我相信幾乎所有走上程式設計這個職業的人來說,基本上都是興趣所至,覺得程式設計很有趣,但卻被各個公司996搞得對程式設計毫無興趣。為什麼,你們這些公司要向中國的教育學習呢?人家本來對這事有比較高的興趣的,但就是要通過考試/KPI/996這些東西把人家的興趣一點一點的磨滅掉,把人變成機器、奴隸、牲口,讓人對學習和工作產生了厭倦和討厭,會是你們這些管理者們所希望的?是不是隻有把人變得不思進取了,你們才會管理? 就像《軟體開發中的兩種管理方式》中說的第一種人一樣?
另外,我不知道,為什麼我一說這些東西,就會有很多人(包括程式設計師自己)來和我說我是個理想主義者,這些已經不是什麼理想了,已被很多成功的公司用了很多很多年了。只是你沒有見到過罷了。還有的人說,因為中國的國情不同。這更讓我費解了。這讓我想到了當年大清朝派了一堆人出國考察後回來後,說外國的那套共和的東西不符合中國國情,最終也在歷史的潮流中被淹沒掉了。另外,什麼叫“中國的國情不同”?中國有全世界數一數二的網際網路使用者,也有全世界數一數二的市場,不再是以前那個一窮二白的年代了,中國的國情到底有哪些不同呢?
我不知道各位工程師是為什麼活的?但我覺得,我們選擇了一個刺激的職業,也趕上了這個行業大發展的時代,我們不妨捫心自問一下,你是否願意讓自己的能力、青春和熱情就這樣被磨滅了?
(全文完)
(轉載本站文章請註明作者和出處酷 殼 – CoolShell.cn,請勿用於任何商業用途)
相關文章
- 什麼是工程師文化?工程師
- 陳皓:為什麼我反對純演算法面試題演算法面試題
- 是什麼造就了優秀的開發者/工程師文化?工程師
- 陳皓:一個 fork 的面試題面試題
- 陳皓:程式碼執行的效率
- 陳皓:Why C++ ? 王者歸來C++
- 陳皓:C++的坑真的多嗎?C++
- 陳皓:程式設計師技術練級攻略程式設計師
- 運維工程師是什麼?做什麼?運維工程師
- 技術管理進階——什麼是公司文化
- [轉載] 陳皓:一些重要的演算法演算法
- 什麼是全棧工程師?全棧工程師
- 什麼是工程師思維工程師
- 公司的電腦為什麼卡——因為缺少工程師文化工程師
- [轉載] 陳皓——程式設計師技術練級攻略程式設計師
- 陳皓:關於閏秒(leap second)的小知識
- 陳皓:做個環保主義的程式設計師程式設計師
- 什麼是SRE工程師?SRE工程師和運維有什麼區別?工程師運維
- 陳皓:給程式設計師新手的一些建議程式設計師
- 陳皓(@左耳朵耗子):我的精神家園(圖靈訪談)圖靈
- 爬蟲工程師是幹什麼的爬蟲工程師
- SRE工程師到底是做什麼的?工程師
- 運維工程師核心工作是什麼?用什麼運維工具好?運維工程師
- 什麼是FPGA工程師的核心競爭力FPGA工程師
- Python工程師是做什麼的?前景如何?Python工程師
- 你對全棧工程師的理解是什麼?全棧工程師
- 什麼是Linux運維?Linux運維工程師需要做什麼?Linux運維工程師
- Python全棧指什麼?全棧工程師的意義是什麼?Python全棧工程師
- 教你成為全棧工程師(FullStackDeveloper)〇-什麼是全棧工程師全棧工程師Developer
- 程式設計師週刊(第1期):餓了麼的技術文化是什麼?程式設計師
- 什麼是10x工程師(10x engineers)?工程師
- 如果工程師會寫詩,世界該是什麼樣?工程師
- 是什麼讓初級工程師走投無路?工程師
- 成為軟體工程師最精彩的地方是什麼?軟體工程工程師
- 什麼是cookie,什麼是sessionCookieSession
- 什麼是DNS,什麼是HostsDNS
- 什麼是模式? 什麼是框架?模式框架
- 這是什麼這是什麼