本書是筆者圍繞軟件工程能力所做的系列培訓(xùn)的內(nèi)容匯編。這些內(nèi)容來(lái)源于筆者20多年以來(lái)對(duì)軟件工程的學(xué)習(xí)體會(huì)和項(xiàng)目實(shí)踐,以及對(duì)中國(guó)工業(yè)界軟件工程師的觀察和教育實(shí)踐。
關(guān)于軟件開(kāi)發(fā)的書已經(jīng)有很多,軟件工程師閱讀最多的書或許是對(duì)某種編程語(yǔ)言的深入解讀,或許是對(duì)某種架構(gòu)方法的闡述;蛟S由于意識(shí)上的偏差,很多軟件從業(yè)者即使已工作多年,但由于對(duì)軟件工程理論相關(guān)圖書閱讀較少,因此對(duì)軟件研發(fā)的基本理念和原則還是了解得不多。
編寫本書的目的是提升軟件工程師的基本意識(shí)。對(duì)于一名軟件工程師來(lái)說(shuō),具備正確的意識(shí)比掌握具體的知識(shí)更重要。如果具備正確的意識(shí),即使在工作中不記得具體的知識(shí)點(diǎn),也可以在需要的時(shí)候進(jìn)行查閱,而反過(guò)來(lái)就不是這樣了。
本書對(duì)一名軟件工程師應(yīng)具備的基本意識(shí)和所需掌握的基本方法進(jìn)行了全貌性介紹,同時(shí)內(nèi)容又不會(huì)過(guò)于理論化和艱深。由于篇幅限制,本書對(duì)很多內(nèi)容只做了入門性介紹,并向希望繼續(xù)深入學(xué)習(xí)的讀者提供了相關(guān)圖書參考建議。
真誠(chéng)希望讀者能夠從本書開(kāi)始,更多地去閱讀軟件工程方面的專業(yè)圖書,因?yàn)檐浖こ處煂?duì)軟件研發(fā)的學(xué)習(xí)和深入理解是永無(wú)止境的。
本書的目標(biāo)讀者包括:
(1)軟件工程師和管理者。本書中的多個(gè)章節(jié)已經(jīng)是百度內(nèi)部軟件工程師的必修課內(nèi)容。筆者也曾多次以“代碼的藝術(shù)”為題在多家知名互聯(lián)網(wǎng)企業(yè)做過(guò)分享,不僅僅是剛參加工作的軟件工程師給出了較好的反饋,很多資深軟件工程師也反饋良好。
(2)計(jì)算機(jī)和軟件方向的在校學(xué)生。本書介紹的很多方法是筆者在大學(xué)時(shí)就開(kāi)始使用的。很多本科生和研究生其實(shí)在學(xué)校就已經(jīng)開(kāi)始參加較復(fù)雜的軟件研發(fā)項(xiàng)目了,他們可以將本書介紹的方法立刻應(yīng)用在這些項(xiàng)目實(shí)踐中。更早地具備正確的軟件研發(fā)意識(shí),將為一個(gè)人后續(xù)的職業(yè)發(fā)展打下良好的基礎(chǔ)。
本書的內(nèi)容來(lái)源于培訓(xùn)課程材料或演講材料,在章節(jié)編排和內(nèi)容組織上仍然保持了培訓(xùn)課程和演講的原貌。每一章都有明確的主題,可以獨(dú)立閱讀,而全書的內(nèi)容又形成了一個(gè)完整體系。
全書組織如下(見(jiàn)圖P.1)。
第1章首先說(shuō)明了什么是軟件工程能力,闡述了軟件工程能力中的素質(zhì)要求。
第2~8章分別從代碼、文檔和項(xiàng)目管理這三個(gè)方面講解了實(shí)踐方法。
對(duì)于代碼,第2章“代碼的藝術(shù)”對(duì)其進(jìn)行了總體說(shuō)明,第3章重點(diǎn)說(shuō)明了代碼評(píng)審,第4章以Mini-spider為例說(shuō)明了方法如何運(yùn)用。
對(duì)于文檔,第5章說(shuō)明了如何寫好項(xiàng)目文檔,第6章說(shuō)明了做研究的基本方法。
對(duì)于項(xiàng)目管理,第7章簡(jiǎn)要說(shuō)明了如何做好項(xiàng)目管理,第8章重點(diǎn)說(shuō)明了如何做好項(xiàng)目溝通。
● 第1章 軟件工程能力
1.1 為什么要重視工程能力 / 3
1.2 什么是工程能力 / 5
1.2.1 工程能力的誤區(qū) / 5
1.2.2 工程能力的定義 / 6
1.3 怎樣提升工程能力 / 11
● 第2章 代碼的藝術(shù)
2.1 背景和初衷 / 17
2.2 代碼和藝術(shù) / 18
2.2.1 代碼也能成為藝術(shù)作品 / 18
2.2.2 軟件工程師和“碼農(nóng)” / 22
2.2.3 來(lái)自藝術(shù)的啟發(fā) / 24
2.2.4 寫代碼并非易事 / 26
2.3 好代碼和壞代碼 / 28
2.3.1 好代碼的特性 / 28
2.3.2 壞代碼的例子 / 33
2.4 好代碼從哪里來(lái) / 35
2.4.1 好代碼不止于編碼 / 35
2.4.2 需求分析和系統(tǒng)設(shè)計(jì) / 36
2.5 如何做好需求分析 / 41
2.5.1 如何描述需求 / 41
2.5.2 對(duì)需求分析的誤解 / 43
2.5.3 需求分析的重要性 / 47
2.6 如何做好系統(tǒng)設(shè)計(jì) / 47
2.6.1 什么是系統(tǒng)設(shè)計(jì) / 48
2.6.2 設(shè)計(jì)文檔的分類 / 49
2.6.3 什么是系統(tǒng)架構(gòu) / 50
2.6.4 系統(tǒng)設(shè)計(jì)的原則和方法 / 52
2.6.5 重視對(duì)外接口 / 56
2.7 如何寫出好代碼 / 59
2.7.1 代碼的溝通價(jià)值 / 59
2.7.2 模塊的設(shè)計(jì)方法 / 64
2.7.3 劃分模塊的方法 / 71
2.7.4 函數(shù)的設(shè)計(jì)方法 / 75
2.7.5 代碼塊的編寫注意事項(xiàng) / 85
2.7.6 軟件開(kāi)發(fā)中的命名 / 89
2.8 如何支持系統(tǒng)運(yùn)營(yíng) / 90
2.8.1 可監(jiān)測(cè)性的重要性 / 91
2.8.2 以BFE開(kāi)源項(xiàng)目為例 / 92
2.9 成為優(yōu)秀軟件工程師的三條路徑 / 93
2.9.1 路徑一:學(xué)習(xí)—思考—實(shí)踐 / 93
2.9.2 路徑二:知識(shí)—方法—精神 / 96
2.9.3 路徑三:基礎(chǔ)乃治學(xué)之根本 / 98
● 第3章 代碼評(píng)審
3.1 代碼評(píng)審的常見(jiàn)誤區(qū) / 103
3.2 為什么要做好代碼評(píng)審 / 104
3.2.1 代碼評(píng)審的重要意義 / 104
3.2.2 沒(méi)有做好代碼評(píng)審的后果 / 106
3.2.3 為什么要提升代碼質(zhì)量 / 106
3.2.4 為什么要提升編碼能力 / 108
3.3 如何做好代碼評(píng)審 / 108
3.3.1 代碼評(píng)審的常見(jiàn)問(wèn)題 / 109
3.3.2 代碼評(píng)審的正確態(tài)度 / 109
3.3.3 代碼評(píng)審的推薦步驟 / 111
3.3.4 對(duì)壞代碼的簡(jiǎn)單判斷 / 112
3.3.5 代碼評(píng)審的注意事項(xiàng) / 113
3.4 如何成為好的代碼評(píng)審人 / 116
● 第4章 “代碼的藝術(shù)”應(yīng)用
4.1 需求的分析 / 121
4.1.1 題目說(shuō)明 / 121
4.1.2 功能分析 / 122
4.2 軟件的架構(gòu) / 123
4.2.1 模塊切分 / 123
4.2.2 系統(tǒng)架構(gòu) / 128
4.2.3 軟件組裝 / 130
4.2.4 crawler 間的數(shù)據(jù)共用 / 132
4.2.5 數(shù)據(jù)封裝 / 133
4.2.6 crawler 的執(zhí)行邏輯 / 134
4.3 多線程機(jī)制 / 135
4.3.1 數(shù)據(jù)互斥訪問(wèn) / 136
4.3.2 臨界區(qū)注意事項(xiàng) / 138
4.3.3 任務(wù)的分發(fā) / 141
4.3.4 程序的優(yōu)雅退出 / 143
4.4 其他實(shí)現(xiàn)細(xì)節(jié) / 146
4.4.1 配置的讀取 / 146
4.4.2 種子信息的讀取 / 147
4.4.3 import 的使用 / 150
4.4.4 異常處理 / 151
4.4.5 構(gòu)造函數(shù)的使用 / 153
4.4.6 正則表達(dá)式的使用 / 154
4.5 延伸思考 / 156
4.5.1 實(shí)現(xiàn)對(duì)各網(wǎng)站的限速 / 156
4.5.2 從單機(jī)擴(kuò)展到分布式 / 157
● 第5章 項(xiàng)目文檔
5.1 正確認(rèn)識(shí)項(xiàng)目文檔 / 161
5.1.1 項(xiàng)目文檔的重要作用 / 161
5.1.2 項(xiàng)目文檔的常見(jiàn)誤區(qū) / 162
5.1.3 項(xiàng)目文檔的常見(jiàn)問(wèn)題 / 164
5.1.4 什么時(shí)候需要寫項(xiàng)目文檔 / 165
5.1.5 項(xiàng)目文檔是寫給誰(shuí)的 / 167
5.1.6 項(xiàng)目文檔的基本規(guī)范 / 169
5.2 項(xiàng)目文檔的編寫 / 170
5.2.1 編寫順序 / 170
5.2.2 文檔標(biāo)題 / 171
5.2.3 段落編寫 / 173
5.2.4 問(wèn)題劃分 / 176
5.2.5 表述模式 / 177
5.3 項(xiàng)目文檔中的圖片 / 179
5.4 文檔的評(píng)審 / 185
5.4.1 文檔評(píng)審常見(jiàn)問(wèn)題 / 185
5.4.2 文檔評(píng)審的方法 / 186
5.5 文檔的存放 / 187
5.5.1 文檔存放常見(jiàn)錯(cuò)誤 / 187
5.5.2 文檔存放的建議 / 188
5.5.3 文檔索引的例子 / 189
5.5.4 存放工具的選擇 / 192
5.6 文檔編寫工具 / 194
5.7 如何提高文檔編寫能力 / 195
● 第6章 做研究
6.1 什么是研究 / 199
6.2 如何做好研究 / 201
6.2.1 發(fā)現(xiàn)問(wèn)題 / 201
6.2.2 分析問(wèn)題 / 203
6.2.3 解決問(wèn)題 / 205
6.3 做好研究的必備素質(zhì) / 206
6.3.1 關(guān)于做人 / 206
6.3.2 關(guān)于做事 / 208
6.3.3 關(guān)于做學(xué)問(wèn) / 209
● 第7章 項(xiàng)目管理
7.1 重視項(xiàng)目管理 / 213
7.2 相關(guān)基本概念 / 215
7.3 項(xiàng)目管理的過(guò)程和步驟 / 218
7.3.1 項(xiàng)目啟動(dòng)和規(guī)劃 / 219
7.3.2 項(xiàng)目執(zhí)行和監(jiān)控 / 224
7.3.3 項(xiàng)目總結(jié)與回顧 / 227
● 第8章 項(xiàng)目溝通
8.1 項(xiàng)目溝通的重要性 / 233
8.2 項(xiàng)目溝通方式及對(duì)比 / 235
8.3 面對(duì)面溝通 / 238
8.4 電話溝通 / 239
8.5 會(huì)議溝通 / 240
8.6 IM 工具溝通 / 245
8.7 Email 溝通 / 247
● 附錄A 延伸閱讀圖書推薦
軟件工程和編程思想類 / 251
項(xiàng)目管理類 / 252
項(xiàng)目文檔編寫和閱讀類 / 252
產(chǎn)品設(shè)計(jì)類 / 253