什麼是工程師文化?
[來源酷殼]html
四年前,我在QCon上演講了一個《建一支強大的小團隊》(整理後的PPT分享於這裏)提到了工程師文化,今天,我想在這裏再寫一篇關於工程師文化的文章,一方面是由於我又有了一些想法和體會,另外一方面,由於我也正走在創業的道路,毫無疑問,要建一個有濃重的工程師文化的團隊或公司,因此有必要把本身的相關想法形有成白底黑字的「字據」,以供打本身的臉——「要是將來沒有作到,這篇文章就打我將來的臉」 || 「這篇文章太幼稚了,將來的我會打我如今的臉」,固然,若是要打臉,我但願是前者。程序員
Again,這篇文章不是招人的貼子,由於我以爲,招聘第一重要的事,不是發招聘廣告或是找獵頭挖人,而是先得讓本身變成一個能配得上真正工程師的公司,而後再談吸引人的事。shell
爲何要工程師文化
看看最近二十年來社會的發展,計算機和互聯網已經滲透到了這個社會的每個角落,各式各樣的計算機技術成爲了整個世界發展的強大引擎,各式各樣的創新,不管是業務創新仍是技術創新,都是依託於技術的快速演進,技術成了解放生產力提升社會運做的效率的中堅力量。以美帝爲首的技術創新公司着着實實的改變着這個世界和人類的生活和生產習慣。編程
今天,每一個從事計算機行業的技術人員都應該感到幸運,由於,咱們不但選對了行業,也出生在了正確的時代,能夠感覺到史無前例的刺激和變化,相比起咱們的父輩,咱們的人生,能經歷這樣的時代,實在是一種幸運。因此,選對了職業並出生在了正確的年代的咱們,此時只須要思考的一個問題,那就是,我是否呆在了正確的地方用正確的方式作事?安全
在我看來,這個世界上有三種商業公司,微信
- 運營或銷售驅動型的公司。這類的公司以運營和營銷見長,技術對於他們來講,更多的只是爲了支持大規模的營銷活動,以及成本上的控制,因此,基本上來講不太須要技術創新。這種公司最大的問題就是缺少安全感。
- 產品驅動型的公司。這類公司以產品見長,經過創造能提高用戶生活體驗的產品見長,技術對於他們來講,除了支持大規模的在線用戶以外,他們會更多的去尋找那些爲了加強用戶體驗,提升整個業務流程效率的技術創新。好比: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 & Latency不能更差——這意味着,功能要爲性能讓路,由於性能變差了,用戶就要買更多的資源)
- 正確的組件抽象。抽象是簡化的一部份,一方面,抽象意味着重用和通用,另外一方面抽象意味着強大的擴展性,以適配各類可能性。最重要的是,抽象意味着技術能力的輸出,不管是內部的其它團隊還外部的團隊。好比: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微信公衆帳號能夠在手機端搜索文章