作者:[美] Robert C. Martin
翻譯:章顯洲 余晟
https://book.douban.com/subject/11614538/
第一章 專(zhuān)業(yè)主義
1.1 清楚你要什么
專(zhuān)業(yè)主義的精髓在于將公司利益視同個(gè)人利益。所以犯錯(cuò)不是“在所難免的”,而是應(yīng)當(dāng)極力避免,并勇于承擔(dān)后果。
1.2 擔(dān)當(dāng)責(zé)任
1.3 不行損害之事
- 不破壞軟件功能
讓QA找不出問(wèn)題,而不是讓QA幫忙檢查 - 確信代碼能正常運(yùn)行
要考慮單元測(cè)試,測(cè)試覆蓋率,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD) - 自動(dòng)化QA
- 不破壞結(jié)構(gòu)
所有軟件項(xiàng)目的根本指導(dǎo)原則是:軟件要易于修改。
不破壞結(jié)構(gòu)并不表示盡量少修改代碼,相反,如果期望自己的軟件靈活可變,就應(yīng)該時(shí)常修改它。
事實(shí)是,大多數(shù)開(kāi)發(fā)人員不敢不斷修改代碼,因?yàn)楹ε赂膲牧恕_@里就又回到上面的“自動(dòng)化測(cè)試”,如果有自動(dòng)化測(cè)試,并且測(cè)試覆蓋率也很高,那么就不會(huì)害怕改壞了。
1.4 職業(yè)道德
職業(yè)發(fā)展是個(gè)人的事情,雇主沒(méi)有義務(wù)考慮這些,也沒(méi)有義務(wù)給你培訓(xùn),送你參加會(huì)議等等。
職業(yè)道德是:
- 你自己要計(jì)劃每周工作的時(shí)間,比如60小時(shí),其中40小時(shí)是給雇主的,剩下的20小時(shí)是給自己做提升使用。
- 了解你的領(lǐng)域
工作中涉及到的東西都要去了解,否則只能寫(xiě)寫(xiě) if-else, while 之類(lèi)的代碼了。
以下是每個(gè)專(zhuān)業(yè)軟件開(kāi)發(fā)人員必須精通的事項(xiàng):
設(shè)計(jì)模式:GoF 書(shū)中(設(shè)計(jì)模式)的23種模式
設(shè)計(jì)原則:必須了解SOLID原則,而且要深刻理解組件設(shè)計(jì)原則
方法:XP、Scrum、精益、看板、瀑布、結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計(jì)等
實(shí)踐:TDD、OOP、結(jié)構(gòu)化編程、CI&CD&CD、結(jié)對(duì)編程
工件:UML圖、DFD圖、結(jié)構(gòu)圖、Petri網(wǎng)絡(luò)圖、狀態(tài)遷移圖表、流程圖、決策表
堅(jiān)持學(xué)習(xí)
堅(jiān)持練習(xí)(業(yè)精于勤)
合作
輔導(dǎo)(教學(xué)相長(zhǎng))
了解業(yè)務(wù)領(lǐng)域(熟悉行業(yè)背景,不能全按照規(guī)格說(shuō)明去編碼,而是要能夠辨別、質(zhì)疑一些需求)
與雇主/客戶保持一致
謙遜(每個(gè)人都會(huì)犯錯(cuò),所以不要嘲笑別人,自己出錯(cuò)了能坦然接收別人的嘲笑)
第二章 說(shuō)“不”
能就是能,不能就是不能。不要說(shuō)“試試看”。 - 尤達(dá)
這一章介紹了“專(zhuān)業(yè)程序員要竭盡所能地追求和捍衛(wèi)自身的目標(biāo),從而會(huì)和管理者產(chǎn)生對(duì)抗”,“高風(fēng)險(xiǎn)時(shí)刻更應(yīng)該說(shuō)不”,“團(tuán)隊(duì)精神是為整體目標(biāo)著想,而不是試試看”。而這些前提都是開(kāi)發(fā)人員人員能夠做到較好的項(xiàng)目排期,并且有理有據(jù)地對(duì)管理者說(shuō)“不”,同時(shí)也不能總說(shuō)不,否則就是能力問(wèn)題了。
第三章 說(shuō)“是”
3.1 承諾用語(yǔ)
口頭上說(shuō)、心理認(rèn)真、付諸行動(dòng)。
“缺乏承諾的”的征兆:
- 我們要。。。
- 我需要。。。
- 。。。應(yīng)當(dāng)。。。
- 讓我們。。。
- 希望。。。
- 但愿。。。
真正的承諾:我將在(時(shí)間點(diǎn))之前完成(某個(gè)任務(wù))
言必行行必果,如果沒(méi)做到的話,要如何應(yīng)對(duì)呢?
- 之所以沒(méi)成功,是因?yàn)槲壹南M谀衬橙プ鲞@件事。
- 之所以沒(méi)成功,是因?yàn)槲也惶_信是否真能完成得了
即使目標(biāo)無(wú)法完成,也能全力前進(jìn),離目標(biāo)更近。 - 之所以沒(méi)成功,是因?yàn)橛行r(shí)候我真的無(wú)能為力。
突發(fā)事件出現(xiàn)后,盡快去調(diào)整別人對(duì)你的預(yù)期(越快越好)。
總結(jié):估算日期、確定最后期限、交流溝通等等,做出承諾會(huì)令人害怕,但是可以建立個(gè)人的信譽(yù)(reputation)。
3.2 學(xué)習(xí)如何說(shuō)“是”
-
“試試”的另一面
image.png - 堅(jiān)守原則
首先,測(cè)試、文檔、代碼整潔性這些是不能夠省略的,因?yàn)槭÷赃@些也不能保證更快完成。多年的經(jīng)驗(yàn)是,打破這些紀(jì)律和原則,更會(huì)拖慢進(jìn)度。
然后,嘗試說(shuō)服管理者確實(shí)無(wú)法做到,可以找
最后,如果實(shí)在不行,必須要做到,也得給自己爭(zhēng)取利益,不管是加人也好、調(diào)休也好。
3.3 總結(jié)
專(zhuān)業(yè)人士不需要對(duì)所有請(qǐng)求都回答“是”。不過(guò),應(yīng)該努力尋找創(chuàng)新的方法,盡可能做到有求必應(yīng)。當(dāng)專(zhuān)業(yè)人士給出肯定回答時(shí),他們會(huì)使用承諾用語(yǔ),以確保各方能夠明白無(wú)誤地理解承諾內(nèi)容。
第四章 編碼
4.1 做好準(zhǔn)備
編碼要求聚精會(huì)神,要避免:
- 心煩意亂時(shí)寫(xiě)代碼
- 疲勞時(shí)寫(xiě)代碼(比如加班,凌晨3點(diǎn))
- 焦慮時(shí)寫(xiě)代碼
4.2 流態(tài)區(qū)
其實(shí)就是效率很高的狀態(tài)。
但是這種狀態(tài)其實(shí)是一種”淺層冥想”狀態(tài),敲出的代碼會(huì)增多,但是理性思考就少了。
結(jié)對(duì)編程的好處在于任何一方都不會(huì)進(jìn)入流態(tài)區(qū)。
4.3 阻塞
寫(xiě)不出來(lái)的時(shí)候要學(xué)會(huì)調(diào)整狀態(tài)。做些事情,而不是死盯著屏幕。
4.4 調(diào)試
4.5 保持節(jié)奏
也就是調(diào)整狀態(tài)。
4.6 進(jìn)度延遲
4.7 幫助他人
第五章 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
TDD不光是一種技巧,也是一種思維方式。
三大原則:
- 編好失敗單元測(cè)試之前,不要編寫(xiě)任何產(chǎn)品代碼。
- 只要有一個(gè)單元測(cè)試失敗了,就不要再編寫(xiě)代碼;無(wú)法通過(guò)編譯也是一種失敗情況。
- 產(chǎn)品代碼恰好能夠讓當(dāng)前失敗的單元測(cè)試成功通過(guò)即可,不要多謝。
這樣測(cè)試代碼、產(chǎn)品代碼、測(cè)試代碼、產(chǎn)品代碼。。。同步增長(zhǎng),互為補(bǔ)充。
5.3 TDD的優(yōu)勢(shì)
- 確定性
單元測(cè)試通過(guò)了,對(duì)產(chǎn)品就有把握了。 - 降低缺陷注入率
- 勇氣
有助于重構(gòu)、修改糟糕代碼 - 文檔
單元測(cè)試即文檔。 - 設(shè)計(jì)
測(cè)試代碼的一個(gè)問(wèn)題是必須隔離出待測(cè)試的代碼,這樣有助于代碼的解耦,也就有助于開(kāi)發(fā)出更好的設(shè)計(jì)。
(先寫(xiě)產(chǎn)品代碼,很容易寫(xiě)出一大坨耦合的代碼,不利于測(cè)試;先寫(xiě)測(cè)試代碼就可以避免) - 專(zhuān)業(yè)人士的選擇
5.4 TDD的局限
測(cè)試代碼也可能很糟糕。。。
還有一些其他場(chǎng)景,不適合TDD
等等
第六章 練習(xí)
為開(kāi)源項(xiàng)目貢獻(xiàn)代碼。
第七章 驗(yàn)收測(cè)試
7.1 需求的溝通
- 避免過(guò)早精細(xì)化
需求總會(huì)變化的,突發(fā)事件也總是會(huì)發(fā)生的,在這之前想要確定最終交付的一項(xiàng)項(xiàng)的功能,就有點(diǎn)浪費(fèi)精力了。 - 明確需求
跟客戶直接隔著一層又一層,就會(huì)導(dǎo)致信息的丟失,也就會(huì)導(dǎo)致對(duì)需求理解的偏差。
7.2 驗(yàn)收測(cè)試
- 什么叫完成?
QA + 需求方都確認(rèn)了,才叫完成。 - 溝通
- 自動(dòng)化
- 額外工作
5.驗(yàn)收測(cè)試什么時(shí)候?qū)懀烧l(shuí)寫(xiě)
業(yè)務(wù)方+QA > 業(yè)務(wù)分析員+QA > QA > Dev
避免同一個(gè)人既寫(xiě)了代碼又寫(xiě)了測(cè)試。 - 測(cè)試的協(xié)商與被動(dòng)推進(jìn)
- 驗(yàn)收測(cè)試和單元測(cè)試
- GUI及其他因素
- CI
7.3 結(jié)論
編寫(xiě)自動(dòng)化的驗(yàn)收測(cè)試可以避免交流中的誤解。
第八章 測(cè)試策略
8.1 QA應(yīng)該找不到錯(cuò)誤
QA和Dev是一個(gè)團(tuán)隊(duì)的,而不是對(duì)立的。
8.2 自動(dòng)化測(cè)試金字塔
從下往上,覆蓋率由高到低:
單元測(cè)試,組件測(cè)試,集成測(cè)試,系統(tǒng)測(cè)試,Web自動(dòng)化測(cè)試,人工探索式測(cè)試。
第九章 時(shí)間管理
9.1 會(huì)議
- 拒絕一些會(huì)議
- 提前離席
- 確定議程與目標(biāo)
- 站會(huì)(盡可能快)
- 迭代計(jì)劃會(huì)議
- Retro
- 爭(zhēng)論/反對(duì)(爭(zhēng)論之所以花費(fèi)很多時(shí)間,是因?yàn)楦鞣蕉寄貌怀鲇辛Φ淖C據(jù))
9.2 注意力(精力)
- 睡眠
- 咖啡因
- 恢復(fù)
- 肌肉注意力
- 輸入與輸出
9.3 時(shí)間拆分和番茄工作法
劃分時(shí)間段,比如25分鐘一個(gè)時(shí)間段,這段時(shí)間內(nèi)只做一件事,25分鐘結(jié)束后再處理這段時(shí)間內(nèi)發(fā)生的事情。
25分鐘專(zhuān)注+5分鐘休息,4輪過(guò)后休息30分鐘。
9.4 排好優(yōu)先級(jí)
9.5 避免死胡同里浪費(fèi)時(shí)間
9.6 避免陷入泥潭
9.7 結(jié)論
專(zhuān)業(yè)開(kāi)發(fā)人員要注意管理自己的時(shí)間和精力,排好優(yōu)先級(jí),認(rèn)清當(dāng)前的狀況,并避免走入死胡同和陷入泥潭。
第十章 預(yù)估
第二章 說(shuō)“不” 里已經(jīng)提到了預(yù)估的重要性。
10.1 區(qū)分預(yù)估和承諾
10.3 預(yù)估任務(wù)
按照斐波那契數(shù)列預(yù)估(1,2,3,5,8)
10.4 大數(shù)定律
大任務(wù)分割為小任務(wù),預(yù)估,加和,這樣預(yù)估準(zhǔn)確率高一些
10.5 結(jié)論
專(zhuān)業(yè)開(kāi)發(fā)人員一旦做了承諾,就會(huì)提供確定的數(shù)字,按時(shí)兌現(xiàn)。
但是大多數(shù)情況下,他們不會(huì)做這種承諾,而是提供概率預(yù)估,來(lái)描述期望的完成時(shí)間和可能的變數(shù)。
第十一章 壓力
11.1 避免壓力
- 承諾
- 保持整潔
- 危機(jī)中的紀(jì)律
11.2 應(yīng)對(duì)壓力
- 不要慌張
- 溝通
- 依靠紀(jì)律原則
- 尋求幫助
11.3 結(jié)論
能回避壓力的時(shí)候盡可能回避,無(wú)法回避時(shí)則勇敢直面壓力。
可以通過(guò)慎重承諾、遵循自己的紀(jì)律原則、保持整潔來(lái)回避壓力。
直面壓力時(shí),保持冷靜,多與人溝通,堅(jiān)持原則,尋求他人幫助。
第十二章 協(xié)作
12.1 程序員與人
- 與雇主
多了解業(yè)務(wù) - 與程序員
互相學(xué)習(xí)、互相幫助
12.3 結(jié)論
編程就意味著與人協(xié)作,與人交流。
第十三章 團(tuán)隊(duì)與項(xiàng)目
13.1 只是簡(jiǎn)單的混合嗎
- 有凝聚力的團(tuán)隊(duì)
- 如何管理有凝聚力的團(tuán)隊(duì)
- 項(xiàng)目承包人的困境
13.2 結(jié)論
團(tuán)隊(duì)比項(xiàng)目更難構(gòu)建。因此,組件穩(wěn)健的團(tuán)隊(duì),接手一個(gè)又一個(gè)的項(xiàng)目,整體移動(dòng),形成凝聚力,不斷磨合,一直共同工作,成為不斷交付項(xiàng)目的強(qiáng)大引擎。
第十四章 輔導(dǎo)、學(xué)徒期與技藝
14.1 失敗的學(xué)位教育
14.2 輔導(dǎo)
14.3 學(xué)徒期
14.4 技藝
14.5 結(jié)論
學(xué)校傳授的是計(jì)算機(jī)編程的理論,還缺少原則、實(shí)踐、技能。需要軟件行業(yè)中的每一代人去引導(dǎo)下一代人。
讀后感
這本書(shū)的內(nèi)容本身就很務(wù)虛,作者通過(guò)大量的、大段的舉例說(shuō)明,來(lái)描述他想要表達(dá)的思想。
而這些思想又不是各自獨(dú)立的,分為十四個(gè)章節(jié),相互交織在一起,導(dǎo)致一些重復(fù)(比如多次提到需要溝通,還有關(guān)于測(cè)試,團(tuán)隊(duì)協(xié)作,團(tuán)隊(duì)精神等等),所以顯得有些混亂。
同時(shí)這十四個(gè)章節(jié)涵蓋的面又有些廣,從個(gè)人技能到與人協(xié)作,再到輔導(dǎo)、學(xué)徒,稍顯零散。
不過(guò)可以看出,這些思想是作者經(jīng)年累月的寶貴的人生經(jīng)驗(yàn),還是可以讓讀者在多個(gè)方面產(chǎn)生共鳴的。
記住這些經(jīng)驗(yàn),在工作中時(shí)刻提醒自己,一定可以有所收獲的。
簡(jiǎn)單地總結(jié)一下:
- 提高預(yù)估、排期的能力,從而可以從容地說(shuō)“不”,說(shuō)“是”,提高個(gè)人的聲譽(yù),減小壓力;
- 溝通交流,不僅要與業(yè)務(wù)方交流業(yè)務(wù),還要與管理者交流進(jìn)度,還要與其他程序員交流技術(shù),互相幫助;
- 管理好時(shí)間,不光是工作上,減少無(wú)意義的會(huì)議、管理精力、排好優(yōu)先級(jí)、避免死胡同和泥潭,還要給自己保留提升個(gè)人技藝的時(shí)間,勤加練習(xí);
- 建立個(gè)人的原則,例如不輕易承諾、保持整潔、不能為了工期而削減測(cè)試代碼等等,這些紀(jì)律也可以幫助你說(shuō)“不”,說(shuō)“是”,以及應(yīng)對(duì)壓力;
- 團(tuán)隊(duì)凝聚力是完成項(xiàng)目的前提;
- 怎么才算完成?開(kāi)發(fā)人員要做到自己測(cè)試沒(méi)問(wèn)題,然后再交給QA,等QA和業(yè)務(wù)方都確認(rèn)后才算完成。
不是說(shuō)代碼寫(xiě)完了就完了的。
做到了上面的這些,才能算作專(zhuān)業(yè)人士,才能算是具有程序員的職業(yè)素養(yǎng)!
P.S. 雖然本身很務(wù)虛,但也通過(guò)大量的舉例,提出了一些務(wù)實(shí)的建議和方法,比如:
- 多了解技能領(lǐng)域:設(shè)計(jì)模式、設(shè)計(jì)原則、方法、實(shí)踐、工件等
- 編碼是一項(xiàng)腦力+體力勞動(dòng),所以需要身體做好準(zhǔn)備,要避免疲勞、焦慮時(shí)編碼
- 時(shí)間管理里,減少會(huì)議時(shí)間、減少無(wú)意義的爭(zhēng)論(讓數(shù)據(jù)說(shuō)話)
- 預(yù)估任務(wù)時(shí),(1,2,3,5,8),拆分任務(wù)再預(yù)估
- 項(xiàng)目交付快要失敗前,及時(shí)溝通,降低別人的期望,保護(hù)你自己的聲譽(yù),也減小你的壓力