對(duì)于剛剛成為軟件工程師的新手來(lái)說(shuō),知道如何編寫(xiě)代碼只是成功了一半。你可能很快就會(huì)發(fā)現(xiàn),學(xué)校并沒(méi)有教授在現(xiàn)實(shí)世界中至關(guān)重要的技能和工作中必要的流程。本書(shū)恰恰填補(bǔ)了這一環(huán)節(jié),它是作者十多年來(lái)在大型公司指導(dǎo)初級(jí)工程師工作的教程,涵蓋軟件工程的基礎(chǔ)知識(shí)和best實(shí)踐。
本書(shū)第1~2 章講解當(dāng)你在公司開(kāi)啟你的職業(yè)生涯時(shí)會(huì)發(fā)生什么;第3~11 章會(huì)擴(kuò)展你的工作技能,教你如何使用現(xiàn)有代碼庫(kù)、解決和防止技術(shù)債、編寫(xiě)生產(chǎn)級(jí)軟件、管理依賴關(guān)系、有效地測(cè)試、評(píng)審代碼、交付軟件、處理On-Call 時(shí)的事故和構(gòu)建可演進(jìn)的架構(gòu)等;剩余章節(jié)涵蓋管理能力和職業(yè)階梯的提升等相關(guān)內(nèi)容,例如敏捷計(jì)劃、與管理者合作以及成長(zhǎng)為資深工程師的必經(jīng)之路。本書(shū)中非常重要的一部分內(nèi)容是教你如何應(yīng)對(duì)糟糕的管理,以及如何調(diào)整自己的節(jié)奏。
本書(shū)內(nèi)容不僅淺顯易懂,還覆蓋整個(gè)軟件開(kāi)發(fā)周期,是一本技術(shù)主管希望每名新入行的工程師在開(kāi)始工作之前都能閱讀的書(shū)。
(1)這是一本 “課外”書(shū)。知道如何編寫(xiě)代碼,僅僅是“戰(zhàn)斗的一半”。像與資深導(dǎo)師喝咖啡一樣,本書(shū)將教授你學(xué)校里計(jì)算機(jī)課沒(méi)有涉及的技能。
(2)這是一本有態(tài)度的書(shū)。公司之間總有差異,基本原理總是相通。書(shū)中構(gòu)建團(tuán)隊(duì)的經(jīng)驗(yàn)取自那些快速成長(zhǎng)的、由風(fēng)險(xiǎn)投資公司資助的或者準(zhǔn)上市的硅谷公司。
(3)這是一張進(jìn)軍職場(chǎng)“線路圖”。資深之路選擇多,請(qǐng)主導(dǎo)你自己的晉升。本書(shū)涵蓋構(gòu)建、測(cè)試和運(yùn)行生產(chǎn)軟件的現(xiàn)代實(shí)踐,使團(tuán)隊(duì)更強(qiáng)大和使隊(duì)友更默契的行為和多種方法,供你選擇。
(4)作者是Zymergen 的軟件工程副總裁和Apache Samza的作者,在 PayPal、LinkedIn、WePay 和 Twitter等主要科技公司擁有十多年的經(jīng)驗(yàn)。
克里斯·里科米尼(Chris Riccomini):
軟件工程師,創(chuàng)業(yè)公司投資者和顧問(wèn),在PayPal、領(lǐng)英和WePay等大型科技公司擁有超過(guò)十年的工作經(jīng)驗(yàn);在職業(yè)生涯中一直參與開(kāi)源項(xiàng)目的工作,是Apache Samza的作者。
德米特里·里亞博伊(Dmitriy Ryaboy):
軟件工程師和工程經(jīng)理;目前擔(dān)任Zymergen公司的軟件工程副總裁;曾就職于不同的公司和組織,包括勞倫斯伯克利國(guó)家實(shí)驗(yàn)室、Cloudera和Twitter;幫助創(chuàng)建和發(fā)展了多個(gè)開(kāi)源項(xiàng)目,包括Apache Parquet。
第 1 章 前面的旅程 1
1.1 你的目的地 1
1.2 你的旅程地圖 2
1.2.1 新手營(yíng) 3
1.2.2 試煉之河 5
1.2.3 貢獻(xiàn)者之角 5
1.2.4 運(yùn)維之海 6
1.2.5 勝任之灣 6
1.3 前進(jìn)! 7
第 2 章 步入自覺(jué)階段 8
2.1 學(xué)習(xí)如何學(xué)習(xí) 9
2.1.1 前置學(xué)習(xí) 9
2.1.2 在實(shí)踐中學(xué)習(xí) 9
2.1.3 運(yùn)行實(shí)例代碼 11
2.1.4 閱讀 11
2.1.5 觀看講座 13
2.1.6 適度地參加會(huì)議和聚會(huì) 14
2.1.7 跟班學(xué)習(xí)并同有經(jīng)驗(yàn)的工程師結(jié)對(duì) 15
2.1.8 用副業(yè)項(xiàng)目實(shí)踐 16
2.2 提出問(wèn)題 17
2.2.1 動(dòng)手調(diào)查一下 17
2.2.2 設(shè)置一個(gè)時(shí)間限制 17
2.2.3 寫(xiě)下全過(guò)程 18
2.2.4 別打擾別人 19
2.2.5 多用“非打擾式”交流 20
2.2.6 批量處理你的同步請(qǐng)求 20
2.3 克服成長(zhǎng)的障礙 21
2.3.1 冒充者綜合征 21
2.3.2 鄧寧-克魯格效應(yīng) 22
2.4 行為準(zhǔn)則 23
2.5 升級(jí)加油站 23
第3 章 玩轉(zhuǎn)代碼 25
3.1 軟件的熵 26
3.2 技術(shù)債 26
3.3 變更代碼 29
3.3.1 善于利用現(xiàn)有代碼 30
3.3.2 過(guò)手的代碼要比之前更干凈 32
3.3.3 做漸變式的修改 33
3.3.4 對(duì)重構(gòu)要?jiǎng)?wù)實(shí) 33
3.3.5 善用IDE 34
3.3.6 請(qǐng)使用VCS 的最佳實(shí)踐 34
3.4 避“坑”指南 35
3.4.1 保守一些的技術(shù)選型 36
3.4.2 不要特立獨(dú)行 39
3.4.3 不要只分叉而不向上游提交修改 40
3.4.4 克制重構(gòu)的沖動(dòng) 40
3.5 行為準(zhǔn)則 42
3.6 升級(jí)加油站 42
第4 章 編寫(xiě)可維護(hù)的代碼 44
4.1 防御式編程 45
4.1.1 避免空值 45
4.1.2 保持變量不可變 46
4.1.3 使用類型提示和靜態(tài)類型檢查器 46
4.1.4 驗(yàn)證輸入 47
4.1.5 善用異常 49
4.1.6 異常要有精確含義 50
4.1.7 早拋晚捕 51
4.1.8 智能重試 52
4.1.9 構(gòu)建冪等系統(tǒng) 53
4.1.10 及時(shí)釋放資源 53
4.2 關(guān)于日志的使用 54
4.2.1 給日志分級(jí) 55
4.2.2 日志的原子性 56
4.2.3 關(guān)注日志性能 57
4.2.4 不要記錄敏感數(shù)據(jù) 59
4.3 系統(tǒng)監(jiān)控 59
4.3.1 使用標(biāo)準(zhǔn)的監(jiān)控組件 60
4.3.2 測(cè)量一切 63
4.4 跟蹤器 64
4.5 配置相關(guān)注意事項(xiàng) 64
4.5.1 配置無(wú)須新花樣 65
4.5.2 記錄并校驗(yàn)所有的配置 66
4.5.3 提供默認(rèn)值 67
4.5.4 給配置分組 67
4.5.5 將配置視為代碼 67
4.5.6 保持配置文件清爽 68
4.5.7 不要編輯已經(jīng)部署的配置 68
4.6 工具集 68
4.7 行為準(zhǔn)則 70
4.8 升級(jí)加油站 71
第5 章 依賴管理 72
5.1 依賴管理基礎(chǔ)知識(shí) 73
5.1.1 語(yǔ)義化版本 74
5.1.2 傳遞依賴 75
5.2 相依性地獄 76
5.3 避免相依性地獄 80
5.3.1 隔離依賴項(xiàng) 80
5.3.2 按需添加依賴項(xiàng) 81
5.3.3 指定依賴項(xiàng)的版本 82
5.3.4 依賴范圍最小化 84
5.3.5 保護(hù)自己免受循環(huán)依賴的影響 84
5.4 行為準(zhǔn)則 85
5.5 升級(jí)加油站 85
第6 章 測(cè)試 87
6.1 測(cè)試的多種用途 87
6.2 測(cè)試類型 88
6.3 測(cè)試工具 91
6.3.1 模擬庫(kù) 91
6.3.2 測(cè)試框架 92
6.3.3 代碼質(zhì)量工具 93
6.4 自己動(dòng)手編寫(xiě)測(cè)試 95
6.4.1 編寫(xiě)干凈的測(cè)試 95
6.4.2 避免過(guò)度測(cè)試 96
6.5 測(cè)試中的確定性 98
6.5.1 種子隨機(jī)數(shù)生成器 99
6.5.2 不要在單元測(cè)試中調(diào)用遠(yuǎn)程系統(tǒng) 99
6.5.3 采用注入式時(shí)間戳 99
6.5.4 避免使用休眠和超時(shí) 102
6.5.5 記得關(guān)閉網(wǎng)絡(luò)套接字和文件句柄 102
6.5.6 綁定到0 端口 103
6.5.7 生成唯一的文件路徑和數(shù)據(jù)庫(kù)位置 103
6.5.8 隔離并清理剩余的測(cè)試狀態(tài) 103
6.5.9 不要依賴測(cè)試順序 104
6.6 行為準(zhǔn)則 105
6.7 升級(jí)加油站 105
第7 章 代碼評(píng)審 107
7.1 為什么需要評(píng)審代碼 107
7.2 當(dāng)你的代碼被評(píng)審時(shí) 109
7.2.1 準(zhǔn)備工作 109
7.2.2 用評(píng)審草案降低風(fēng)險(xiǎn) 110
7.2.3 提交評(píng)審請(qǐng)勿觸發(fā)測(cè)試 111
7.2.4 預(yù)排大體量的代碼修改 111
7.2.5 不要太在意 112
7.2.6 保持同理心,但不要容忍粗魯 113
7.2.7 保持主動(dòng) 113
7.3 評(píng)審別人的代碼時(shí) 114
7.3.1 分流評(píng)審請(qǐng)求 114
7.3.2 給評(píng)審預(yù)留時(shí)間 114
7.3.3 理解修改的意圖 115
7.3.4 提供全面的反饋 115
7.3.5 要承認(rèn)優(yōu)點(diǎn) 116
7.3.6 區(qū)分問(wèn)題、建議和挑剔 116
7.3.7 不要只做橡皮圖章 117
7.3.8 不要只局限于使用網(wǎng)頁(yè)版的評(píng)審工具 118
7.3.9 不要忘記評(píng)審測(cè)試代碼 118
7.3.10 推動(dòng)決斷 118
7.4 行為準(zhǔn)則 119
7.5 升級(jí)加油站 120
第8 章 軟件交付 121
8.1 軟件交付流程 121
8.2 分支策略 122
8.3 構(gòu)建環(huán)節(jié) 125
8.3.1 打包需要帶版本號(hào) 126
8.3.2 將不同的資源單獨(dú)打包 127
8.4 發(fā)布環(huán)節(jié) 129
8.4.1 請(qǐng)勿只想著發(fā)布 129
8.4.2 將包發(fā)布到倉(cāng)庫(kù) 130
8.4.3 保持版本不變性 131
8.4.4 頻繁發(fā)布 131
8.4.5 對(duì)發(fā)布計(jì)劃保持透明 132
8.4.6 撰寫(xiě)變更日志和發(fā)行說(shuō)明 132
8.5 部署環(huán)節(jié) 133
8.5.1 自動(dòng)部署 133
8.5.2 部署的原子性 134
8.5.3 獨(dú)立地部署應(yīng)用 134
8.6 展開(kāi)環(huán)節(jié) 136
8.6.1 系統(tǒng)監(jiān)控 137
8.6.2 特性開(kāi)關(guān) 137
8.6.3 熔斷器 138
8.6.4 并行的服務(wù)版本梯隊(duì) 139
8.6.5 摸黑啟動(dòng) 141
8.7 行為準(zhǔn)則 143
8.8 升級(jí)加油站 144
第9 章 On-Call 146
9.1 On-Call 的工作方式 147
9.2 On-Call 技能包 148
9.2.1 隨時(shí)響應(yīng) 148
9.2.2 保持專注 148
9.2.3 確定工作優(yōu)先級(jí) 149
9.2.4 清晰的溝通 150
9.2.5 跟蹤你的工作 151
9.3 事故處理 152
9.3.1 分流 153
9.3.2 協(xié)同 154
9.3.3 應(yīng)急方案 155
9.3.4 解決方案 157
9.3.5 后續(xù)行動(dòng) 159
9.4 提供支持 162
9.5 不要逞英雄 164
9.6 行為準(zhǔn)則 165
9.7 升級(jí)加油站 165
第 10 章 技術(shù)設(shè)計(jì)流程 167
10.1 技術(shù)設(shè)計(jì)的V 形結(jié)構(gòu) 168
10.2 關(guān)于設(shè)計(jì)的思考 169
10.2.1 定義問(wèn)題 170
10.2.2 著手調(diào)查 171
10.2.3 進(jìn)行實(shí)驗(yàn) 172
10.2.4 給些時(shí)間 173
10.3 撰寫(xiě)設(shè)計(jì)文檔 174
10.3.1 文檔持續(xù)變更 174
10.3.2 了解撰寫(xiě)文檔的目的 175
10.3.3 學(xué)會(huì)寫(xiě)作 176
10.3.4 保證文檔是最新的 176
10.4 使用設(shè)計(jì)文檔模板 177
10.4.1 概要 178
10.4.2 現(xiàn)狀與背景 178
10.4.3 變更的目的 178
10.4.4 需求 179
10.4.5 潛在的解決方案 179
10.4.6 建議的解決方案 180
10.4.7 設(shè)計(jì)與架構(gòu) 180
10.4.8 測(cè)試計(jì)劃 181
10.4.9 發(fā)布計(jì)劃 181
10.4.10 遺留的問(wèn)題 181
10.4.11 附錄 181
10.5 協(xié)作設(shè)計(jì) 182
10.5.1 理解你的團(tuán)隊(duì)的設(shè)計(jì)評(píng)審流程 182
10.5.2 不要讓人驚訝 183
10.5.3 用設(shè)計(jì)討論來(lái)進(jìn)行頭腦風(fēng)暴 183
10.5.4 為設(shè)計(jì)出力 184
10.6 行為準(zhǔn)則 185
10.7 升級(jí)加油站 185
第 11 章 構(gòu)建可演進(jìn)的架構(gòu) 187
11.1 理解復(fù)雜性 188
11.2 可演進(jìn)的設(shè)計(jì) 189
11.2.1 你不是真的需要 189
11.2.2 最小驚訝原則 191
11.2.3 封裝專業(yè)領(lǐng)域知識(shí) 193
11.3 可演進(jìn)的API 193
11.3.1 保持API 小巧 194
11.3.2 公開(kāi)定義良好的服務(wù)端API 194
11.3.3 保持API 變更的兼容性 195
11.3.4 API 版本化 198
11.4 可持續(xù)的數(shù)據(jù)管理 199
11.4.1 數(shù)據(jù)庫(kù)隔離 199
11.4.2 使用schema 201
11.4.3 schema 自動(dòng)化遷移 203
11.4.4 保持schema 的兼容性 206
11.5 行為準(zhǔn)則 207
11.6 升級(jí)加油站 208
第 12 章 敏捷計(jì)劃 210
12.1 敏捷宣言 210
12.2 敏捷計(jì)劃的框架 211
12.3 Scrum 框架 212
12.3.1 用戶故事 213
12.3.2 任務(wù)分解 214
12.3.3 故事點(diǎn) 214
12.3.4 消化積壓 216
12.3.5 沖刺計(jì)劃 216
12.4 站會(huì) 217
12.5 評(píng)審機(jī)制 218
12.6 回顧會(huì) 219
12.7 路線圖 220
12.8 行為準(zhǔn)則 221
12.9 升級(jí)加油站 222
第 13 章 與管理者合作 223
13.1 管理者是做什么的 223
13.2 溝通、目標(biāo)與成長(zhǎng) 224
13.2.1 一對(duì)一面談 225
13.2.2 PPP 227
13.2.3 OKR 229
13.2.4 績(jī)效考核 230
13.3 向上管理 232
13.3.1 接收反饋 232
13.3.2 給予反饋 233
13.3.3 討論你的目標(biāo) 235
13.3.4 事情不順時(shí)要采取行動(dòng) 236
13.4 行為準(zhǔn)則 238
13.5 升級(jí)加油站 239
第 14 章 職業(yè)生涯規(guī)劃 241
14.1 邁向資深之路 241
14.2 職業(yè)生涯建議 242
14.2.1 T 型人才 242
14.2.2 參加工程師訓(xùn)練營(yíng) 243
14.2.3 主導(dǎo)你自己的晉升 244
14.2.4 換工作需謹(jǐn)慎 246
14.2.5 自我調(diào)節(jié) 247
14.3 結(jié)尾寄語(yǔ) 248