本書以Facebook(Meta)等硅谷企業(yè)的研發(fā)經驗為背景,結合作者17年的研發(fā)經驗,講解了如何實現(xiàn)個人和團隊的高效研發(fā)。
全書主要從以下5個方面對硅谷的高效研發(fā)方法進行了總結,提供了非常系統(tǒng)的指導原則和實踐指南。
(1)研發(fā)效能綜述
主要了講解研發(fā)效能的定義、模型,以及研發(fā)效能度量的正確方法。希望借此幫助讀者梳理出研發(fā)效能的主脈絡,構建一幅清晰的知識圖譜。
(2)個人高效研發(fā)實踐
主要講解如何提高個人研發(fā)效能,具體涉及深度工作、Git、命令行、VIM、工具環(huán)境集成等內容,旨在幫助讀者提高技術的專精程度和持續(xù)成長。
(3)研發(fā)流程優(yōu)化
主要講解研發(fā)流程優(yōu)化的基本目標和原則、代碼優(yōu)化、分支管理、DevOps、團隊協(xié)同等,希望幫助讀者深入理解研發(fā)過程中的關鍵流程,以及流程優(yōu)化的基本原則,從而能夠針對自己的實際情況,找到合適的工程實踐,讓軟件開發(fā)的整個流程更加順暢、高效。
(4)團隊高效研發(fā)實踐
主要講解團隊高效研發(fā)實踐過程中各關鍵步驟的高效工程方法,內容涉及研發(fā)環(huán)境搭建、代碼審查、合理處理技術債、開源利弊分析、測試等,同時對研發(fā)流程及工程方法的趨勢進行解讀,希望幫助讀者掌握這些具體工程方法的正確使用。
(5)管理和文化
系統(tǒng)分析了硅谷研發(fā)團隊的管理和文化,尤其是Facebook的工程師文化,并根據(jù)作者在國內公司的具體落地經驗,給出推薦的文化引入和建設方法。
什么是研發(fā)效能,為什么要關注研發(fā)效能
●為什么寫作本書
近這十幾年,國內互聯(lián)網產業(yè)的發(fā)展速度不亞于硅谷,在商業(yè)模式創(chuàng)新方面甚至完成了超越,但是我們在研發(fā)效能方面始終比較落后。難以否認的是,在互聯(lián)網行業(yè)繁榮發(fā)展的背景下,國內很多公司采用了拼工時的做法,卻忽略了應該關注的研發(fā)效能。
你是否也曾為下面這些問題感到困擾?
團隊角度:
1)加班也不少,但是產品發(fā)布還是常常延期,上線后產品問題頻發(fā)。
2)從需求分析、產品設計、開發(fā)、測試到部署一個環(huán)節(jié)都不少,但終發(fā)布的產品卻與用戶需求偏差很大。
3)產品發(fā)布上線時出現(xiàn)大量提交、合并,導致后時刻出現(xiàn)很多問題,團隊成員集體熬夜加班,卻將大把的時間花在了等待環(huán)境、等待驗證上。
4)開發(fā)提測質量不好,大量壓力聚集到測試這一步,導致代碼返工率很高。引入單元測試、代碼審查,效果卻不明顯。
個人角度:
1)疲于應付業(yè)務,沒有精力去精進技術。
2)工作過程中有大量的電話、即時聊天消息干擾,工作思路常常被打斷。
3)對眾多的工具(比如Git、命令行)的使用僅限于表層,工作效率較低,想提高卻因為工具太多不知道從何下手。
4)有知識焦慮,但是沒有找到好的辦法系統(tǒng)地提高個人工作效率。
這其實是研發(fā)效能出現(xiàn)了問題。那么,研發(fā)效能到底是什么呢?一提到研發(fā)效能,很多人的反應都是開發(fā)的速率,也就是能否快速開發(fā)、發(fā)布產品。但事實上,速率只是效能的三大支柱之一。
相比快,產品開發(fā)更重要的是方向正確,因為不能為用戶和公司真正提供價值的產品做了也是白做。另外,高效能還需要有可持續(xù)性,否則短期的高產出可能會嚴重傷害長期的產出。比如,連續(xù)熬夜加班雖然短期能增加一定的產出,但其帶來的身體問題會導致后續(xù)工作效率低下,得不償失。
因此,研發(fā)效能的完整定義應該是持續(xù)為用戶產生有效價值的效率。它包括有效性(Effectiveness)、效率( Efficiency)和可持續(xù)性(Sustainability )三個方面。簡單來說,就是能否長期、高效地開發(fā)出有價值的產品。對于團隊研發(fā)效能和個人研發(fā)效能來說,其核心都是這三個方面,只不過在價值的側重點上有所不同。團隊研發(fā)效能更注重對公司、團隊、客戶產生價值,而個人研發(fā)效能更注重個人的產出、技術的成長、個人的提高。
可喜的是,近幾年,國內越來越多的公司開始在研發(fā)流程、工具、文化等方面下功夫,很多百名研發(fā)人員規(guī)模的公司開始組建專門的效能團隊,以提高整個公司的研發(fā)效能。
這是一個很好的現(xiàn)象和趨勢。但很多公司在推進研發(fā)效能的時候,常常不知道從何下手,或者花了精力、加大了投入卻看不到效果,產出抵不上投入。比如,我在一些公司做內訓和顧問工作的時候,經常會遇到類似以下案例的情況。
1)想通過指標度量的方式來衡量團隊的效能,要求每個團隊達到一定的測試覆蓋率。研發(fā)團隊在產品完成后進行突擊來編寫單元測試,終達到了要求,但產品質量卻沒有提高。
2)引入業(yè)界先進工程實踐,學習Google使用大的代碼倉,但因為基礎設施不成熟,對大量二進制文件支持很差,結果算法團隊有很多的二進制模型文件,每次執(zhí)行git clone命令都需要半小時,導致怨聲載道。
3)希望建設工程師文化來提高產出和活躍氣氛,跟公司管理層以及HR商量了好幾條價值觀在公司宣傳推廣,還組織了幾次團建活動,但是收效甚微,大家真正工作起來還是老樣子。
這些問題的根源都在于,軟件開發(fā)的靈活性決定了研發(fā)效能提升的困難性:需要關注的點太多,可以使用的方法也很多,但如果只是簡單照搬業(yè)界研發(fā)實踐的話,效果往往不好,有時甚至會造成負面效果。
●本書結構
在本書中,分五個部分系統(tǒng)講述如何做到研發(fā)的高效能。
研發(fā)效能綜述(第1~3章)。這一部分講解研發(fā)效能的定義、模型,并著重介紹研發(fā)效能度量的正確使用方法,希望幫助讀者梳理研發(fā)效能的主脈絡,構建清晰的知識圖譜。
個人高效研發(fā)實踐(第4~15章)。這一部分講解如何提高個人效能,具體涉及深度工作、Git、命令行、Vim、工具集成等內容,旨在幫助讀者提高技術的專精程度,實現(xiàn)持續(xù)成長。每個開發(fā)人員都應該提高自己的效能,只有這樣才能持續(xù)學習、持續(xù)提高,避免被業(yè)務拖著跑。
研發(fā)流程優(yōu)化(第16~21章)。這一部分講解研發(fā)流程優(yōu)化的基本目標和原則、代碼優(yōu)化、分支管理、DevOps、團隊協(xié)同等話題,希望幫助讀者深入理解研發(fā)過程中的關鍵流程以及流程優(yōu)化的基本原則,使讀者能夠針對自己的實際情況,找到合適的工程實踐,讓軟件開發(fā)的整個流程更加順暢、高效。
團隊高效研發(fā)實踐(第22~30章)。這一部分講解團隊高效研發(fā)實踐過程中各關鍵步驟的高效工程方法,內容涉及研發(fā)環(huán)境搭建、代碼審查、合理處理技術債、開源利弊分析、測試等,同時對研發(fā)流程及工程方法的趨勢進行解讀和展望,希望幫助讀者加深對這些具體工程方法的理解,并學會正確地使用這些方法。
管理和文化(第31~36章)。這一部分系統(tǒng)分析硅谷管理和文化,尤其是Facebook的工程師文化,并根據(jù)我在國內外公司的具體落地經驗,給出推薦的文化引入和建設方法。
這里要著重強調一下個人高效研發(fā)實踐部分。團隊由個人組成,所以團隊研發(fā)效能和個人研發(fā)效能密不可分。然而,個人研發(fā)效能是很多公司和團隊在進行提效工作時容易忽略的一個點。所以在本書中我會在個人效能方面多花一些筆墨,介紹如何從指導思想、工具、溝通等方面提高個人效能,往10x 程序員的方向努力。
研發(fā)效能和軟件開發(fā)一樣,都具有很大的靈活性,提高研發(fā)效能不是生搬硬套就能做好的。所以我會著重講解目標,帶你深入了解效能實踐背后的原理,然后才是具體的實踐。因為只有深刻理解原理,才能靈活運用。
同時,我會分享大量成功的案例,帶讀者一起了解國內外公司的優(yōu)秀做法,分析它們成功的經驗。當然,我也會分享失敗的案例,分析其背后的原因。不過更重要的是,我希望讀者能夠跟著我一起分析,通過對比思考,找到真正適合團隊和自身的實踐。這正是我寫作本書的真正初衷。
前言 什么是研發(fā)效能,為什么要關注研發(fā)效能
●部分 研發(fā)效能綜述
第1章 高效學習、實踐方法論3
1.1 使用黃金圈原則3
1.2 如何有效落地實踐4
小測試7
第2章 研發(fā)效能定義及模型8
2.1 為什么要關注研發(fā)效能8
2.2 研發(fā)效能定義9
2.3 提高研發(fā)效能的坑9
2.4 研發(fā)活動的本質10
2.4.1 軟件研發(fā)本質之一:流水線11
2.4.2 軟件研發(fā)本質之二:靈活性12
2.5 研發(fā)效能模型12
小測試14
第3章 效能度量謎題15
3.1 研發(fā)效能度量的定義和作用16
3.2 效能度量的三個失敗案例16
3.3 效能難以度量的三大原因18
3.4 效能度量的正面案例19
3.5 使用效能度量的根本原則20
3.6 正確使用效能度量的方法21
小測試27
●第二部分 個人高效研發(fā)實踐
第4章 精準打擊目標:通過提高準確性來提高投入產出比32
4.1 以終為始,尋找重要的任務33
4.1.1 自己定義任務33
4.1.2 聚焦目標,以終為始33
4.1.3 無情的篩選,少即是多34
4.2 追根究底,尋找效的解決方案34
4.3 高效溝通,利用信息的準確傳遞來尋找、調整目標35
4.3.1 同理心原則36
4.3.2 外在與內在同樣重要36
4.3.3 冰山原則37
4.3.4 建設性沖突37
4.4 管理者視角38
第5章 唯快不破:如何利用速度提高個人研發(fā)效能39
5.1 應用高效實踐提高完成任務的速度39
5.2 應用快速迭代的思路獲取快速反饋40
5.2.1 完成比完美更重要40
5.2.2 讓代碼盡快運行起來41
5.2.3 設置本地代碼檢驗機制42
5.2.4 盡早解決合并沖突43
5.3 管理者視角43
第6章 不僅是當下的成功:持續(xù)地提高個人研發(fā)效能45
6.1 精力管理45
6.1.1 擁抱無聊,控制手機依賴46
6.1.2 用反向行事日歷來確保休息和高效工作46
6.2 使用80/20原則尋找研發(fā)活動中的關鍵因素47
6.3 對關鍵活動進行優(yōu)化48
6.3.1 研發(fā)活動中長期有效的原則48
6.3.2 高頻發(fā)生的活動49
6.4 目標驅動和興趣驅動相結合51
6.5 管理者視角52
第7章 高效選用工具提高研發(fā)速度54
第8章 工程師常見工作任務的系統(tǒng)性工具優(yōu)化56
8.1 個任務類別:操作系統(tǒng)上的通用操作56
8.2 第二個任務類別:輸入和編輯59
8.3 第三個任務類別:知識管理62
8.4 第四個任務類別:瀏覽網頁64
8.5 第五個任務類別:編程65
8.6 小結65
第9章 高效Git基本操作66
9.1 Git和代碼原子性66
9.2 Git支持原子性的五種基本操作67
9.3 小結80
第10章 實現(xiàn)代碼提交的原子性的Git工作流81
10.1 工作流一:使用一個分支完成所有需求的開發(fā)81
10.2 工作流二:使用多個分支完成所有需求的開發(fā)97
10.3 小結101
第11章 每個開發(fā)人員都應該學一些Vim104
11.1 Vim簡介104
11.2 Vim的前世今生105
11.3 Vim的兩大特點105
11.4 小結108
第12章 高效學習Vim的實用技巧110
12.1 學習Vim的命令模式和命令組合方式110
12.2 學習Vim常用的命令113
12.3 在更廣泛的工作場景中應用Vim技能118
12.4 小結120
第13章 高效命令行環(huán)境選擇和設置122
13.1 為什么要使用命令行122
13.2 命令行配置的四個步驟124
13.3 小結133
第14章 研發(fā)場景的有效命令行工具134
14.1 日常操作中的工具和技巧134
14.2 開發(fā)中的常見工作143
14.3 小結146
第15章 工具的高效集成147
15.1 工具集成147
15.1.1 使用管道對命令行工具進行集成147
15.1.2 IDE和周邊工具集成150
15.2 提高工具一致性151
15.3 小結153
●第三部分 研發(fā)流程優(yōu)化
第16章 研發(fā)流程優(yōu)化的基本目標和原則157
16.1 尋找用戶價值157
16.2 提高用戶價值的流動效率158
16.3 小結162
第17章 代碼入庫之前的流程優(yōu)化163
17.1 規(guī)范化、自動化核心步驟163
17.2 提供快速反饋,促進增量開發(fā)166
17.3 小結168
第18章 代碼入庫之后的流程優(yōu)化169
18.1 三個持續(xù)的定義和作用169
18.2 CI/CD流水線的原則及具體實踐171
18.3 案例:Facebook如何落地CI/CD來提高效能172
18.4 小結174
第19章 選擇適當?shù)姆种Ч芾聿呗蕴岣吡鞒毯彤a品質量175
19.1 共主干分支管理和發(fā)布策略175
19.2 共分支管理策略的優(yōu)點178
19.3 其他主要分支方式180
19.4 如何選擇、應用分支管理策略181
19.5 小結182
第20章 使用全棧思路打通開發(fā)和運維184
20.1 DevOps和SRE的異同184
20.2 DevOps和SRE的目標、原則185
20.3 落地實踐187
20.4 小結189
第21章 研發(fā)流程中的高效信息流通190
21.1 團隊成員愿意共享是有效溝通的前提191
21.2 設計流程和使用工具,推動研發(fā)信息高效溝通192
21.3 溝通工具的選用技巧194
21.4 小結195
●第四部分 團隊高效研發(fā)實踐
第22章 研發(fā)環(huán)境:讓開發(fā)人員不再操心環(huán)境199
22.1 開發(fā)機器200
22.2 IDE200
22.3 本地環(huán)境與聯(lián)調環(huán)境201
22.4 開發(fā)過程中使用的各種工具、數(shù)據(jù)和配置203
22.5 測試環(huán)境與類生產環(huán)境203
22.6 提供高效研發(fā)環(huán)境的原則204
22.7 小結204
第23章 代碼審查:高效代碼審查實踐206
23.1 代碼審查的作用206
23.2 代碼審查方法的分類207
23.3 代碼審查方法選擇的三個成功案例210
23.4 小結212
第24章 代碼審查:如何有效引入、執(zhí)行代碼審查213
24.1 引入代碼審查的步驟和方法213
24.2 推進代碼審查的兩個關鍵操作216
24.3 推行代碼審查的兩個關鍵原則218
24.4 小結220
第25章 合理處理技術債:讓快速研發(fā)可持續(xù)222
25.1 技術債的成因223
25.2 技術債的影響223
25.3 處理技術債的兩個基本原則223
25.4 控制技術債的四個步驟224
25.5 小結226
第26章 開源:從Phabricator的開源歷程看開源利弊228
26.1 Phabricator開源過程的關鍵步驟229
26.2 開源對公司的利弊233
26.3 小結234
第27章 高效上云:運用云計算提高效能235
27.1 云計算的優(yōu)勢235
27.2 云計算的挑戰(zhàn)及解決方法238
27.3 小結239
第28章 測試左移:測試如何應對新的開發(fā)模式240
28.1 測試左移的定義240
28.2 測試左移的四個原則241
28.3 小結243
第29章 測試右移與高效部署:應對頻繁發(fā)布帶來的挑戰(zhàn)244
29.1 三種部署方式的定義244
29.2 目標246
29.3 原則247
29.4 具體實踐247
29.4.1 部署階段的實踐247
29.4.2 發(fā)布階段的實踐249
29.4.3 發(fā)布后階段的實踐249
29.5 小結250
第30章 持續(xù)進步:研發(fā)流程、工程方法趨勢解讀和展望251
30.1 協(xié)作方式的發(fā)展趨勢251
30.2 云計算平臺的發(fā)展趨勢252
30.3 應用開發(fā)的發(fā)展趨勢254
30.4 AI方面的發(fā)展趨勢255
30.5 小結256
●第五部分 管理和文化
第31章 業(yè)務目標和技術目標兩手抓:打造高效團隊的三個步驟259
31.1 尋找目標259
31.2 目標管理260
31.3 任務執(zhí)行261
31.4 小結263
第32章 從奈飛的著名PPT談硅谷公司文化264
32.1 定義核心價值觀265
32.2 在招聘、流程方面設計方案推動文化建設266
32.3 持續(xù)推動文化建設267
32.4 關于奈飛公司文化的思考268
32.5 小結268
第33章 Facebook創(chuàng)造力引擎:工程師文化270
33.1 Facebook的工程師文化270
33.2 Facebook推行工程師文化的具體實踐271
33.3 個人角度感受Facebook工程師文化帶來的效果272
33.4 小結273
第34章 Facebook工程師文化實踐三大原則之一:讓員工做感興趣的事274
34.1 Facebook工程師文化落地的三大原則274
34.2 讓員工做感興趣的事275
34.3 Hackathon落地經驗277
34.4 小結278
第35章 Facebook工程師文化實踐三大原則之二:讓員工擁有信息和權限279
35.1 讓員工擁有信息279
35.2 讓員工擁有權限281
35.3 Facebook之外的落地經驗282
35.4 小結283
第36章 Facebook工程師文化實踐三大原則之三:績效調節(jié)284
36.1 360度績效考評系統(tǒng)285
36.2 360度績效考評系統(tǒng)的兩個原則286
36.3 360度績效考評系統(tǒng)的問題287
36.4 績效考評落地實踐287
36.5 小結288
結束語 超越昨天的自己,享受成長的快樂289