2018-04-27 《程序員的職業(yè)素養(yǎng) - The Clean Coder》

作者:[美] 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 不行損害之事

  1. 不破壞軟件功能
    讓QA找不出問(wèn)題,而不是讓QA幫忙檢查
  2. 確信代碼能正常運(yùn)行
    要考慮單元測(cè)試,測(cè)試覆蓋率,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)
  3. 自動(dòng)化QA
  4. 不破壞結(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è)道德是:

  1. 你自己要計(jì)劃每周工作的時(shí)間,比如60小時(shí),其中40小時(shí)是給雇主的,剩下的20小時(shí)是給自己做提升使用。
  2. 了解你的領(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)。

“缺乏承諾的”的征兆:

  1. 我們要。。。
  2. 我需要。。。
  3. 。。。應(yīng)當(dāng)。。。
  4. 讓我們。。。
  5. 希望。。。
  6. 但愿。。。

真正的承諾:我將在(時(shí)間點(diǎn))之前完成(某個(gè)任務(wù))
言必行行必果,如果沒(méi)做到的話,要如何應(yīng)對(duì)呢?

  1. 之所以沒(méi)成功,是因?yàn)槲壹南M谀衬橙プ鲞@件事。
  2. 之所以沒(méi)成功,是因?yàn)槲也惶_信是否真能完成得了
    即使目標(biāo)無(wú)法完成,也能全力前進(jìn),離目標(biāo)更近。
  3. 之所以沒(méi)成功,是因?yàn)橛行r(shí)候我真的無(wú)能為力。
    突發(fā)事件出現(xiàn)后,盡快去調(diào)整別人對(duì)你的預(yù)期(越快越好)。

總結(jié):估算日期、確定最后期限、交流溝通等等,做出承諾會(huì)令人害怕,但是可以建立個(gè)人的信譽(yù)(reputation)。

3.2 學(xué)習(xí)如何說(shuō)“是”

  1. “試試”的另一面


    image.png
  2. 堅(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ì)神,要避免:

  1. 心煩意亂時(shí)寫(xiě)代碼
  2. 疲勞時(shí)寫(xiě)代碼(比如加班,凌晨3點(diǎn))
  3. 焦慮時(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不光是一種技巧,也是一種思維方式。
三大原則:

  1. 編好失敗單元測(cè)試之前,不要編寫(xiě)任何產(chǎn)品代碼。
  2. 只要有一個(gè)單元測(cè)試失敗了,就不要再編寫(xiě)代碼;無(wú)法通過(guò)編譯也是一種失敗情況。
  3. 產(chǎn)品代碼恰好能夠讓當(dāng)前失敗的單元測(cè)試成功通過(guò)即可,不要多謝。

這樣測(cè)試代碼、產(chǎn)品代碼、測(cè)試代碼、產(chǎn)品代碼。。。同步增長(zhǎng),互為補(bǔ)充。

5.3 TDD的優(yōu)勢(shì)

  1. 確定性
    單元測(cè)試通過(guò)了,對(duì)產(chǎn)品就有把握了。
  2. 降低缺陷注入率
  3. 勇氣
    有助于重構(gòu)、修改糟糕代碼
  4. 文檔
    單元測(cè)試即文檔。
  5. 設(shè)計(jì)
    測(cè)試代碼的一個(gè)問(wèn)題是必須隔離出待測(cè)試的代碼,這樣有助于代碼的解耦,也就有助于開(kāi)發(fā)出更好的設(shè)計(jì)。
    (先寫(xiě)產(chǎn)品代碼,很容易寫(xiě)出一大坨耦合的代碼,不利于測(cè)試;先寫(xiě)測(cè)試代碼就可以避免)
  6. 專(zhuān)業(yè)人士的選擇

5.4 TDD的局限

測(cè)試代碼也可能很糟糕。。。
還有一些其他場(chǎng)景,不適合TDD
等等

第六章 練習(xí)

為開(kāi)源項(xiàng)目貢獻(xiàn)代碼。

第七章 驗(yàn)收測(cè)試

7.1 需求的溝通

  1. 避免過(guò)早精細(xì)化
    需求總會(huì)變化的,突發(fā)事件也總是會(huì)發(fā)生的,在這之前想要確定最終交付的一項(xiàng)項(xiàng)的功能,就有點(diǎn)浪費(fèi)精力了。
  2. 明確需求
    跟客戶直接隔著一層又一層,就會(huì)導(dǎo)致信息的丟失,也就會(huì)導(dǎo)致對(duì)需求理解的偏差。

7.2 驗(yàn)收測(cè)試

  1. 什么叫完成?
    QA + 需求方都確認(rèn)了,才叫完成。
  2. 溝通
  3. 自動(dòng)化
  4. 額外工作
    5.驗(yàn)收測(cè)試什么時(shí)候?qū)懀烧l(shuí)寫(xiě)
    業(yè)務(wù)方+QA > 業(yè)務(wù)分析員+QA > QA > Dev
    避免同一個(gè)人既寫(xiě)了代碼又寫(xiě)了測(cè)試。
  5. 測(cè)試的協(xié)商與被動(dòng)推進(jìn)
  6. 驗(yàn)收測(cè)試和單元測(cè)試
  7. GUI及其他因素
  8. 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ì)議

  1. 拒絕一些會(huì)議
  2. 提前離席
  3. 確定議程與目標(biāo)
  4. 站會(huì)(盡可能快)
  5. 迭代計(jì)劃會(huì)議
  6. Retro
  7. 爭(zhēng)論/反對(duì)(爭(zhēng)論之所以花費(fèi)很多時(shí)間,是因?yàn)楦鞣蕉寄貌怀鲇辛Φ淖C據(jù))

9.2 注意力(精力)

  1. 睡眠
  2. 咖啡因
  3. 恢復(fù)
  4. 肌肉注意力
  5. 輸入與輸出

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 避免壓力

  1. 承諾
  2. 保持整潔
  3. 危機(jī)中的紀(jì)律

11.2 應(yīng)對(duì)壓力

  1. 不要慌張
  2. 溝通
  3. 依靠紀(jì)律原則
  4. 尋求幫助

11.3 結(jié)論

能回避壓力的時(shí)候盡可能回避,無(wú)法回避時(shí)則勇敢直面壓力。
可以通過(guò)慎重承諾、遵循自己的紀(jì)律原則、保持整潔來(lái)回避壓力。
直面壓力時(shí),保持冷靜,多與人溝通,堅(jiān)持原則,尋求他人幫助。

第十二章 協(xié)作

12.1 程序員與人

  1. 與雇主
    多了解業(yè)務(wù)
  2. 與程序員
    互相學(xué)習(xí)、互相幫助

12.3 結(jié)論

編程就意味著與人協(xié)作,與人交流。

第十三章 團(tuán)隊(duì)與項(xiàng)目

13.1 只是簡(jiǎn)單的混合嗎

  1. 有凝聚力的團(tuán)隊(duì)
  2. 如何管理有凝聚力的團(tuán)隊(duì)
  3. 項(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é)一下:

  1. 提高預(yù)估、排期的能力,從而可以從容地說(shuō)“不”,說(shuō)“是”,提高個(gè)人的聲譽(yù),減小壓力;
  2. 溝通交流,不僅要與業(yè)務(wù)方交流業(yè)務(wù),還要與管理者交流進(jìn)度,還要與其他程序員交流技術(shù),互相幫助;
  3. 管理好時(shí)間,不光是工作上,減少無(wú)意義的會(huì)議、管理精力、排好優(yōu)先級(jí)、避免死胡同和泥潭,還要給自己保留提升個(gè)人技藝的時(shí)間,勤加練習(xí);
  4. 建立個(gè)人的原則,例如不輕易承諾、保持整潔、不能為了工期而削減測(cè)試代碼等等,這些紀(jì)律也可以幫助你說(shuō)“不”,說(shuō)“是”,以及應(yīng)對(duì)壓力;
  5. 團(tuán)隊(duì)凝聚力是完成項(xiàng)目的前提;
  6. 怎么才算完成?開(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í)的建議和方法,比如:

  1. 多了解技能領(lǐng)域:設(shè)計(jì)模式、設(shè)計(jì)原則、方法、實(shí)踐、工件等
  2. 編碼是一項(xiàng)腦力+體力勞動(dòng),所以需要身體做好準(zhǔn)備,要避免疲勞、焦慮時(shí)編碼
  3. 時(shí)間管理里,減少會(huì)議時(shí)間、減少無(wú)意義的爭(zhēng)論(讓數(shù)據(jù)說(shuō)話)
  4. 預(yù)估任務(wù)時(shí),(1,2,3,5,8),拆分任務(wù)再預(yù)估
  5. 項(xiàng)目交付快要失敗前,及時(shí)溝通,降低別人的期望,保護(hù)你自己的聲譽(yù),也減小你的壓力
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,136評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,714評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,452評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,818評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,997評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,292評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,510評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,721評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,121評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,429評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,235評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,480評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容