《程序員的職業(yè)素養(yǎng)》是編程大師Bob大叔40余年編程生涯的心得體會(huì), 講解成為真正專業(yè)的程序員需要什么樣的態(tài)度、原則,需要采取什么樣的行動(dòng)。作者以自己以及身邊的同事走過(guò)的彎路、犯過(guò)的錯(cuò)誤為例,意在為后來(lái)人引路,助其職業(yè)生涯邁上更高臺(tái)階。 《程序員的職業(yè)素養(yǎng)》適合所有程序員,也可供所有想成為具備職業(yè)素養(yǎng)的職場(chǎng)人士參考。
編程大師Bob大叔40年編程生涯心得體會(huì)
講解成為真正專業(yè)程序員所需態(tài)度原則
業(yè)界好評(píng),廣受贊譽(yù)
助您職業(yè)生涯邁上更高臺(tái)階
Robert C. Martin,軟件開(kāi)發(fā)大師,設(shè)計(jì)模式和敏捷開(kāi)發(fā)先驅(qū),敏捷聯(lián)盟首任主席,C++ Report 前主編,被后輩程序員尊稱為"Bob大叔"。20世紀(jì)70年代初成為職業(yè)程序員,后創(chuàng)辦Object Mentor公司并任總裁。Martin還是一名多產(chǎn)的作家,至今已發(fā)表數(shù)百篇文章、論文和博客,除本書(shū)外,還著有《代碼整潔之道》、《敏捷軟件開(kāi)發(fā):原則、模式和實(shí)踐》、《UML:Java程序員指南》等。他最近創(chuàng)辦了cleancoders.com網(wǎng)站,專為軟件開(kāi)發(fā)人員提供教育視頻。
目 錄
第1章 專業(yè)主義 1
1.1 清楚你要什么 2
1.2 擔(dān)當(dāng)責(zé)任 2
1.3 首先,不行損害之事 4
1.3.1 不要破壞軟件功能 4
1.3.2 不要破壞結(jié)構(gòu) 7
1.4 職業(yè)道德 8
1.4.1 了解你的領(lǐng)域 10
1.4.2 堅(jiān)持學(xué)習(xí) 11
1.4.3 練習(xí) 11
1.4.4 合作 12
1.4.5 輔導(dǎo) 12
1.4.6 了解業(yè)務(wù)領(lǐng)域 13
1.4.7 與雇主/客戶保持一致 13
1.4.8 謙遜 13
1.5 參考文獻(xiàn) 14
第2章 說(shuō)"不" 15
2.1 對(duì)抗角色 17
2.2 高風(fēng)險(xiǎn)時(shí)刻 20
2.3 要有團(tuán)隊(duì)精神 22
2.3.1 試試看 24
2.3.2 消極對(duì)抗 25
2.4 說(shuō)"是"的成本 27
2.5 如何寫(xiě)出好代碼 34
第3章 說(shuō)"是" 37
3.1 保障用語(yǔ) 39
3.1.1 識(shí)別"缺乏保障"的征兆 40
3.1.2 真正的保障聽(tīng)起來(lái)是怎樣的 41
3.1.3 總結(jié) 43
3.2 學(xué)習(xí)如何說(shuō)"是" 43
3.2.1 "試試"的另一面 43
3.2.2 堅(jiān)守原則 44
3.3 結(jié)論 47
第4章 編碼 48
4.1 做好準(zhǔn)備 49
4.1.1 凌晨3點(diǎn)寫(xiě)出的代碼 50
4.1.2 焦慮時(shí)寫(xiě)下的代碼 51
4.2 流態(tài)區(qū) 53
4.2.1 音樂(lè) 54
4.2.2 中斷 55
4.3 阻塞 55
4.4 調(diào)試 57
4.5 保持節(jié)奏 60
4.5.1 知道何時(shí)應(yīng)該離開(kāi)一會(huì) 60
4.5.2 開(kāi)車(chē)回家路上 61
4.5.3 洗澡 61
4.6 進(jìn)度延遲 61
4.6.1 期望 62
4.6.2 盲目沖刺 62
4.6.3 加班加點(diǎn) 63
4.6.4 交付失誤 63
4.6.5 定義"完成" 64
4.7 幫助 64
4.7.1 幫助他人 64
4.7.2 接受他人的幫助 65
4.7.3 輔導(dǎo) 66
4.8 參考文獻(xiàn) 66
第5章 測(cè)試驅(qū)動(dòng)開(kāi)發(fā) 67
5.1 此事已有定論 69
5.2 TDD的三項(xiàng)法則 69
5.3 TDD的優(yōu)勢(shì) 70
5.3.1 確定性 70
5.3.2 缺陷注入率 71
5.3.3 勇氣 71
5.3.4 文檔 72
5.3.5 設(shè)計(jì) 72
5.3.6 專業(yè)人士的選擇 73
5.4 TDD的局限 73
5.5 參考文獻(xiàn) 74
第6章 練習(xí) 75
6.1 引子 75
6.1.1 10的22次方 76
6.1.2 轉(zhuǎn)變 77
6.2 編程柔道場(chǎng) 79
6.2.1 卡塔 80
6.2.2 瓦薩 81
6.2.3 自由練習(xí) 81
6.3 自身經(jīng)驗(yàn)的拓展 82
6.3.1 開(kāi)源 82
6.3.2 關(guān)于練習(xí)的職業(yè)道德 82
6.4 結(jié)論 83
6.5 參考文獻(xiàn) 83
第7章 驗(yàn)收測(cè)試 84
7.1 需求的溝通 84
7.1.1 過(guò)早精細(xì)化 86
7.1.2 遲來(lái)的模糊性 87
7.2 驗(yàn)收測(cè)試 89
7.2.1 "完成"的定義 89
7.2.2 溝通 91
7.2.3 自動(dòng)化 92
7.2.4 額外工作 93
7.2.5 驗(yàn)收測(cè)試什么時(shí)候?qū)懀烧l(shuí)來(lái)寫(xiě) 93
7.2.6 開(kāi)發(fā)人員的角色 94
7.2.7 測(cè)試的協(xié)商與被動(dòng)推進(jìn) 95
7.2.8 驗(yàn)收測(cè)試和單元測(cè)試 96
7.2.9 圖形界面及其他復(fù)雜因素 97
7.2.10 持續(xù)集成 98
7.3 結(jié)論 98
第8章 測(cè)試策略 99
8.1 QA應(yīng)該找不到任何錯(cuò)誤 100
8.1.1 QA也是團(tuán)隊(duì)的一部分 100
8.1.2 需求規(guī)約定義者 100
8.1.3 特性描述者 100
8.2 自動(dòng)化測(cè)試金字塔 101
8.2.1 單元測(cè)試 101
8.2.2 組件測(cè)試 102
8.2.3 集成測(cè)試 103
8.2.4 系統(tǒng)測(cè)試 104
8.2.5 人工探索式測(cè)試 104
8.3 結(jié)論 105
8.4 參考文獻(xiàn) 105
第9章 時(shí)間管理 106
9.1 會(huì)議 107
9.1.1 拒絕 107
9.1.2 離席 108
9.1.3 確定議程與目標(biāo) 109
9.1.4 立會(huì) 109
9.1.5 迭代計(jì)劃會(huì)議 109
9.1.6 迭代回顧和DEMO展示 110
9.1.7 爭(zhēng)論/反對(duì) 110
9.2 注意力點(diǎn)數(shù) 111
9.2.1 睡眠 112
9.2.2 咖啡因 112
9.2.3 恢復(fù) 112
9.2.4 肌肉注意力 112
9.2.5 輸入與輸出 113
9.3 時(shí)間拆分和番茄工作法 113
9.4 要避免的行為 114
9.5 死胡同 115
9.6 泥潭 115
9.7 結(jié)論 116
第10章 預(yù)估 117
10.1 什么是預(yù)估 119
10.1.1 保障 119
10.1.2 預(yù)估 120
10.1.3 暗示性保障 121
10.2 PERT 122
10.3 預(yù)估任務(wù) 125
10.4 大數(shù)定律 127
10.5 結(jié)論 127
10.6 參考文獻(xiàn) 128
第11章 壓力 129
11.1 避免壓力 131
11.1.1 保障 131
11.1.2 保持整潔 132
11.1.3 危機(jī)中的紀(jì)律 132
11.2 應(yīng)對(duì)壓力 133
11.2.1 不要驚慌失措 133
11.2.2 溝通 133
11.2.3 依靠你的紀(jì)律原則 133
11.2.4 尋求幫助 134
11.3 結(jié)論 134
第12章 協(xié)作 135
12.1 程序員與人 137
12.1.1 程序員與雇主 137
12.1.2 程序員與程序員 140
12.2 小腦 142
12.3 結(jié)論 143
第13章 團(tuán)隊(duì)與項(xiàng)目 144
13.1 只是簡(jiǎn)單混合嗎 144
13.1.1 有凝聚力的團(tuán)隊(duì) 145
13.1.2 如何管理有凝聚力的團(tuán)隊(duì) 146
13.1.3 項(xiàng)目承包人的困境 147
13.2 結(jié)論 148
13.3 參考文獻(xiàn) 148
第14章 輔導(dǎo)、學(xué)徒期與技藝 149
14.1 失敗的學(xué)位教育 149
14.2 輔導(dǎo) 150
14.2.1 DIGI-COMP I, 我的及時(shí)臺(tái)計(jì)算機(jī) 150
14.2.2 高中時(shí)代的ECP-18 152
14.2.3 非常規(guī)輔導(dǎo) 154
14.2.4 艱難的錘煉 155
14.3 學(xué)徒期 156
14.3.1 軟件學(xué)徒期 158
14.3.2 現(xiàn)實(shí)情況 159
14.4 技藝 160
14.5 結(jié)論 161
附錄 工具 162
第1章
專業(yè)主義
"噢,笑吧,科廷,老伙計(jì)。這是上帝,或者也可以說(shuō)是命運(yùn)或自然,跟我們開(kāi)的一個(gè)玩笑。不過(guò),不管這家伙是誰(shuí)或是什么,他真幽默!哈哈!"
——?霍華德,《碧血金沙》
這么說(shuō),你確實(shí)是想成為一名專業(yè)的軟件工程師,對(duì)吧?你希望能昂首挺胸向世界宣告"我是專業(yè)人士",希望人們充滿敬意地注視著你,對(duì)你禮遇有加。希望母親們會(huì)指著你告訴自己的孩子要成為像你這樣的人。這些都是你想要的,對(duì)吧?
1.1 清楚你要什么
"專業(yè)主義"有很深的含義,它不但象征著榮譽(yù)與驕傲,而且明確意味著責(zé)任與義務(wù)。這兩者密切相關(guān),因?yàn)閺哪銦o(wú)法負(fù)責(zé)的事情上不可能獲得榮譽(yù)與驕傲。
做個(gè)非專業(yè)人士可輕松多了。非專業(yè)人士不需要為自己所做的工作負(fù)責(zé),他們大可把責(zé)任推給雇主。如果非專業(yè)人士把事情搞砸了,收拾攤子的往往是雇主;而專業(yè)人士如果犯了錯(cuò),只好自己收拾殘局。
如果你不小心放過(guò)了某個(gè)模塊里的一個(gè)bug,以致公司損失了1萬(wàn)美元,結(jié)果將會(huì)怎樣呢?非專業(yè)人士會(huì)聳聳肩說(shuō):"狀況總是難免的嘛。"然后像沒(méi)事兒人一樣繼續(xù)寫(xiě)下一個(gè)模塊。而專業(yè)人士會(huì)自己為公司的那1萬(wàn)美元買(mǎi)單!
哇,自掏腰包?那可真讓人心疼唉!但專業(yè)人士就必須這么做。實(shí)際上,專業(yè)主義的精髓就在于將公司利益視同個(gè)人利益。看到了吧,"專業(yè)主義"就意味著擔(dān)當(dāng)責(zé)任。
1.2 擔(dān)當(dāng)責(zé)任
想必你讀過(guò)前面的引言了,對(duì)吧?如果沒(méi)有,趕緊翻回去讀一遍,因?yàn)楸緯?shū)將要講的內(nèi)容,都在其營(yíng)造的語(yǔ)境里展開(kāi)。
我曾因不負(fù)責(zé)任嘗盡了苦頭,所以明白盡職盡責(zé)的重要意義。
那是1979年,當(dāng)時(shí)我是一家叫Teradyne的公司的"負(fù)責(zé)工程師",所負(fù)責(zé)的軟件控制著一個(gè)測(cè)量電話線路質(zhì)量的小型機(jī)系統(tǒng)和微機(jī)系統(tǒng),該系統(tǒng)的中央小型機(jī)通過(guò)帶寬為300波特的撥號(hào)電話線與幾十臺(tái)控制測(cè)量硬件的外圍微機(jī)連接在一起,程序是用匯編語(yǔ)言編寫(xiě)的。
我們的客戶是各大電話公司的客服經(jīng)理,他們每個(gè)人都負(fù)責(zé)10萬(wàn)條甚至更多的電話線路。我的系統(tǒng)負(fù)責(zé)幫助這些服務(wù)區(qū)經(jīng)理?yè)屧诳蛻糁鞍l(fā)現(xiàn)各種線路故障并及時(shí)修復(fù)。這可以減少客戶投訴率,以免對(duì)此做監(jiān)測(cè)的公共設(shè)施委員會(huì)相應(yīng)下調(diào)電話公司收取的服務(wù)費(fèi)。簡(jiǎn)單地說(shuō),這些系統(tǒng)極其重要。
每天晚上,這些系統(tǒng)都會(huì)運(yùn)行"夜間例行程序",即中央小型機(jī)會(huì)通知外圍微機(jī)對(duì)所控制的電話線路進(jìn)行檢測(cè);每天早上,中央計(jì)算機(jī)就能獲取故障線路清單及其故障特征。根據(jù)這些報(bào)告,各服務(wù)區(qū)經(jīng)理會(huì)安排人員修復(fù)故障,這樣就不會(huì)有客戶投訴了。
一次,我對(duì)幾十個(gè)客戶推出了一版新。"推出"這詞可真是形象啊。我把軟件寫(xiě)在磁帶上,就把這些帶子"推出"給客戶了。客戶載入這些磁帶,然后重啟系統(tǒng)。
這一新修復(fù)了幾個(gè)小故障,還增加了客戶要求的一項(xiàng)新功能。之前我們?cè)U蠒?huì)在截止日期之前提供那項(xiàng)新功能。我連夜趕工,總算在約定日期前交付了磁帶。
兩天后,我接到現(xiàn)場(chǎng)服務(wù)經(jīng)理Tom的電話,他告訴我已經(jīng)有好幾個(gè)客戶投訴"夜間例行程序"沒(méi)能執(zhí)行完成,他們沒(méi)收到任何報(bào)告。我不由心頭一沉:為了按時(shí)交付軟件,我沒(méi)測(cè)試"例程"。我測(cè)試了系統(tǒng)的其他大部分功能,但測(cè)試"例程"要費(fèi)好幾個(gè)小時(shí),而當(dāng)時(shí)我又必須交付軟件。因?yàn)楣收闲迯?fù)部分都不涉及"例程"部分的編碼,所以我也沒(méi)擔(dān)心會(huì)有什么不妥。
收不到夜間報(bào)告,問(wèn)題可就大了。修理工們會(huì)一時(shí)無(wú)事可忙但隨后又要超負(fù)荷工作,而且,有些電話客戶也可能會(huì)在這期間發(fā)現(xiàn)故障并投訴。要是弄丟一晚的數(shù)據(jù),某一服務(wù)區(qū)經(jīng)理肯定會(huì)打電話臭罵Tom。
我啟動(dòng)實(shí)驗(yàn)室系統(tǒng),加載新軟件,然后開(kāi)始對(duì)"夜間例行程序"進(jìn)行測(cè)試。幾小時(shí)后,運(yùn)行中斷。"例程"運(yùn)行失敗!如果我在匆忙交付軟件前對(duì)此進(jìn)行測(cè)試,就不會(huì)發(fā)生服務(wù)區(qū)丟失數(shù)據(jù)的事了,服務(wù)區(qū)經(jīng)理們這時(shí)也不會(huì)炮轟Tom了。
我打電話給Tom,說(shuō)我能重現(xiàn)問(wèn)題了。Tom告訴我其他大部分客戶也已經(jīng)打電話抱怨了,并問(wèn)我什么時(shí)候能解決問(wèn)題。我說(shuō)我也沒(méi)把握,但正在努力。同時(shí)我告訴他應(yīng)該建議客戶倒回去使用舊版軟件。Tom發(fā)火了,說(shuō)那對(duì)客戶來(lái)說(shuō)無(wú)疑是個(gè)雙重打擊,因?yàn)榭蛻舨粌H為此丟失了一整個(gè)晚上的數(shù)據(jù),而且還無(wú)法使用事先保障的新功能。
故障排查非常困難,每次測(cè)試就要好幾個(gè)小時(shí)。及時(shí)次修復(fù)失敗了。第二次也沒(méi)能成功。我試了好幾次,等我發(fā)現(xiàn)問(wèn)題所在時(shí),好幾天已過(guò)去了。這期間,Tom每隔幾小時(shí)就打電話問(wèn)我問(wèn)題什么時(shí)候能解決,他也沒(méi)少讓我聽(tīng)那些服務(wù)區(qū)經(jīng)理對(duì)他喋喋不休的抱怨,并一再告訴我讓那些客戶重新起用舊軟件令他多么尷尬。
,我終于找出了缺陷所在,重新交付修復(fù)了問(wèn)題的新程序,一切恢復(fù)正常。Tom也平靜下來(lái),不再提這段插曲,畢竟,他不是我的上司。事后,我的老板過(guò)來(lái)對(duì)我說(shuō):"你好別再犯同樣的錯(cuò)誤。"我只能默默地點(diǎn)點(diǎn)頭。
經(jīng)過(guò)反省,我意識(shí)到未對(duì)"例程"進(jìn)行測(cè)試就交付軟件是不負(fù)責(zé)任的。為了如期交付產(chǎn)品,我忽略了測(cè)試環(huán)節(jié),整個(gè)過(guò)程中只考慮要如何保全自己的顏面,卻沒(méi)顧及客戶和雇主的聲譽(yù)。我本該早點(diǎn)兒擔(dān)起責(zé)任,告訴Tom測(cè)試還未完成、自己不能按時(shí)交付產(chǎn)品。那么做絕非易事,Tom一定會(huì)不高興,但客戶不會(huì)丟失數(shù)據(jù),客服經(jīng)理也不會(huì)打電話來(lái)轟炸。
1.3 首先,不行損害之事
那么,我們?cè)撊绾纬袚?dān)責(zé)任呢?的確有一些原則可供參考。援引"希波克拉底誓言"或許顯得有點(diǎn)夸張,但沒(méi)有比這更好的引據(jù)了。的確,作為一名有追求有抱負(fù)的專業(yè)人士,他的首要職責(zé)與目標(biāo)難道不正是盡其所能行有益之事嗎?
軟件開(kāi)發(fā)人員能做出什么壞事呢?從純軟件角度看,他可以破壞軟件的功能與架構(gòu)。我們會(huì)探討如何避免帶來(lái)這些破壞。
1.3.1 不要破壞軟件功能
顯然,我們希望軟件可以運(yùn)行。沒(méi)錯(cuò),我們中的大部分人今天之所以是程序員,是因?yàn)槲覀冊(cè)鴰?lái)了可用的軟件,而且希望能再度體驗(yàn)?zāi)欠N成功創(chuàng)作的喜悅。但希望軟件有用的不單單是我們,客戶和雇主也希望它們能用。是啊,他們出錢(qián),讓我們?nèi)ラ_(kāi)發(fā)那些能按照他們意愿運(yùn)行的軟件。
開(kāi)發(fā)的軟件有bug會(huì)損害軟件的功能。因此,要做得專業(yè),就不能留下bug。
"等等!"你肯定會(huì)說(shuō),"可是那是不可能的呀。軟件開(kāi)發(fā)太復(fù)雜了,怎么可能會(huì)沒(méi)bug呢!"
當(dāng)然,你說(shuō)的沒(méi)錯(cuò)。軟件開(kāi)發(fā)太復(fù)雜了,不可能沒(méi)什么bug。但很不幸,這并不能為你開(kāi)脫。人體太復(fù)雜了,不可能盡知其全部,但醫(yī)生仍誓言不傷害病人。如果他們都不拿"人體的復(fù)雜性"作托辭,我們又怎么能開(kāi)脫自己的責(zé)任呢?
"你的意思是我們要追求嘍?"你可能會(huì)這樣抬杠吧?
不,我其實(shí)是想告訴你,要對(duì)自己的不負(fù)責(zé)。代碼中難免會(huì)出現(xiàn)bug,但這并不意味著你不用對(duì)它們負(fù)責(zé);沒(méi)人能寫(xiě)出的軟件,但這并不表示你不用對(duì)不負(fù)責(zé)。
所謂專業(yè)人士,就是能對(duì)自己犯下的錯(cuò)誤負(fù)責(zé)的人,哪怕那些錯(cuò)誤實(shí)際上在所難免。所以,雄心勃勃的專業(yè)人士們,你們要練習(xí)的及時(shí)件事就是"道歉"。道歉是必要的,但還不夠。你不能一而再、再而三地犯相同的錯(cuò)誤。職業(yè)經(jīng)驗(yàn)多了之后,你的失誤率應(yīng)該快速減少,甚至漸近于零。失誤率永遠(yuǎn)不可能等于零,但你有責(zé)任讓它無(wú)限接近零。
1. 讓QA找不出任何問(wèn)題
因此,軟件時(shí),你應(yīng)該確保QA找不出任何問(wèn)題。故意發(fā)送明知有缺陷的代碼,這種做法是極其不專業(yè)的。什么樣的代碼是有缺陷的呢?那些你沒(méi)把握的代碼都是!
有些家伙會(huì)把QA當(dāng)作抓蟲(chóng)機(jī)器看待。他們把自己沒(méi)有全盤(pán)檢查過(guò)的代碼發(fā)送過(guò)去,想等QA找出bug再反饋回來(lái)。沒(méi)錯(cuò),有些公司確實(shí)按照所發(fā)現(xiàn)的bug數(shù)來(lái)獎(jiǎng)勵(lì)測(cè)試人員,揪出的bug越多,獎(jiǎng)金越多。
且不說(shuō)這么做是否會(huì)大幅增加公司成本,嚴(yán)重?fù)p害軟件,是否會(huì)破壞計(jì)劃并讓企業(yè)對(duì)開(kāi)發(fā)小組的信心打折扣,也不去評(píng)判這么做是否等同于懶惰失職,把自己沒(méi)把握的代碼發(fā)送給QA這么做本身就是不專業(yè)的。這違背了"不行損害之事"的原則。
QA會(huì)發(fā)現(xiàn)bug嗎?可能會(huì)吧,所以,準(zhǔn)備好道歉吧,然后反思那些bug是怎么逃過(guò)你的注意的,想辦法防止它再次出現(xiàn)。
每次QA找出問(wèn)題時(shí),更糟糕的是用戶找出問(wèn)題時(shí),你都該震驚羞愧,并決心以此為戒。
2. 要確信代碼正常運(yùn)行
你怎么知道代碼能否常運(yùn)行呢?很簡(jiǎn)單,測(cè)試!一遍遍地測(cè),翻來(lái)覆去、顛來(lái)倒去地測(cè),使出渾身解數(shù)來(lái)測(cè)!
你或許會(huì)擔(dān)心這么狂測(cè)代碼會(huì)占用很多時(shí)間,畢竟,你還要趕進(jìn)度,要在截止日期前完工。如果不停地花時(shí)間做測(cè)試,你就沒(méi)時(shí)間寫(xiě)別的代碼了。言之有理!所以要實(shí)行自動(dòng)化測(cè)試。寫(xiě)一些隨時(shí)都能運(yùn)行的單元測(cè)試,然后盡可能多地執(zhí)行這些測(cè)試。
要用這些自動(dòng)化單元測(cè)試去測(cè)多少代碼呢?還要說(shuō)嗎?全部!全部都要測(cè)!
我是在建議進(jìn)行百分百測(cè)試覆蓋嗎?不,我不是在建議,我是在要求!你寫(xiě)的每一行代碼都要測(cè)試。完畢!
這是不是不切實(shí)際?當(dāng)然不是。你寫(xiě)代碼是因?yàn)橄雸?zhí)行它,如果你希望代碼可以執(zhí)行,那你就該知道它是否可行。而要知道它是否可行,就一定要對(duì)它進(jìn)行測(cè)試。
我是開(kāi)源項(xiàng)目FitNesse的主要貢獻(xiàn)者和代碼提交者。在寫(xiě)作本書(shū)的時(shí)候,F(xiàn)itNesse的代碼有6萬(wàn)多行。在這6萬(wàn)行代碼中有2000多個(gè)單元測(cè)試,共2.6萬(wàn)多行。Emma的報(bào)告顯示,這2000多個(gè)測(cè)試對(duì)代碼的覆蓋率約為90%。
為什么只有90%呢?因?yàn)镋mma會(huì)忽略一些執(zhí)行的代碼。我確信實(shí)際的覆蓋率會(huì)比90%高許多。能達(dá)到嗎?不,達(dá)不到,只是個(gè)理想值。
但是有些代碼不是很難測(cè)試嗎?是的,但之所以很難測(cè)試,是因?yàn)樵O(shè)計(jì)時(shí)就沒(méi)考慮如何測(cè)試。的解決辦法就是要設(shè)計(jì)易于測(cè)試的代碼,好是先寫(xiě)測(cè)試,再寫(xiě)要測(cè)的代碼。
這一方法叫做測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD),我們?cè)陔S后的章節(jié)里會(huì)繼續(xù)談到。
3. 自動(dòng)化QA
FitNesse的整個(gè)QA流程即是執(zhí)行單元測(cè)試和驗(yàn)收測(cè)試。如果這些測(cè)試通過(guò)了,我就會(huì)軟件。這意味著我的QA流程大概需要3分鐘,只要我想要,可以隨時(shí)執(zhí)行完整的測(cè)試流程。
沒(méi)錯(cuò),F(xiàn)itNesse即使有bug也不是什么人命關(guān)天的事,也不會(huì)有人為此損失幾百萬(wàn)美元。值得一提的是FitNesse用戶上萬(wàn),但它的bug列表卻很短。
當(dāng)然,也不排除有些系統(tǒng)因其任務(wù)極其關(guān)鍵特殊,不能只靠簡(jiǎn)短的自動(dòng)化測(cè)試來(lái)判斷軟件是否已經(jīng)足夠高質(zhì)量,是否可以投入使用。而且,作為開(kāi)發(fā)人員,你需要有個(gè)相對(duì)迅捷的機(jī)制,以此判斷所寫(xiě)的代碼可否正常工作,并且不會(huì)干擾系統(tǒng)的其他部分。因此,你的自動(dòng)化測(cè)試至少要能夠讓你知道,你的系統(tǒng)很有可能通過(guò)QA的測(cè)試。
1.3.2 不要破壞結(jié)構(gòu)
成熟的專業(yè)開(kāi)發(fā)人員知道,聰明人不會(huì)為了新功能而破壞結(jié)構(gòu)。結(jié)構(gòu)良好的代碼更靈活。以犧牲結(jié)構(gòu)為代價(jià),得不償失,將來(lái)必追悔莫及。
所有軟件項(xiàng)目的根本指導(dǎo)原則是,軟件要易于修改。如果違背這條原則搭建僵化的結(jié)構(gòu),就破壞了構(gòu)筑整個(gè)行業(yè)的經(jīng)濟(jì)模型。
簡(jiǎn)言之,你必須保障,不需太高代價(jià)就可以。
不幸的是,實(shí)在是已有太多的項(xiàng)目因結(jié)構(gòu)糟糕而深陷失敗的泥潭。那些曾經(jīng)只要幾天就能完成的任務(wù)現(xiàn)在需要耗費(fèi)幾周甚至幾個(gè)月的時(shí)間。急于重新樹(shù)立威望的管理層于是聘來(lái)更多的開(kāi)發(fā)人員來(lái)加快項(xiàng)目進(jìn)度,但這些開(kāi)發(fā)人員只會(huì)進(jìn)一步破壞結(jié)構(gòu),亂上添亂。
描述如何創(chuàng)建靈活可維護(hù)的結(jié)構(gòu)的軟件設(shè)計(jì)原則和模式已經(jīng)有許多了。專業(yè)的軟件開(kāi)發(fā)人員會(huì)牢記這些原則和模式,并在開(kāi)發(fā)軟件時(shí)認(rèn)真遵循。但是其中有一條實(shí)在是沒(méi)幾個(gè)軟件開(kāi)發(fā)人員會(huì)認(rèn)真照做,那就是,如果你希望自己的軟件靈活可變,那就應(yīng)該時(shí)常修改它!
要想證明軟件易于修改,辦法就是做些實(shí)際的修改。如果發(fā)現(xiàn)這些改動(dòng)并不像你預(yù)想的那樣簡(jiǎn)單,你便應(yīng)該改進(jìn)設(shè)計(jì),使后續(xù)修改變簡(jiǎn)單。
該在什么時(shí)候做這些簡(jiǎn)單的小修改呢?隨時(shí)!關(guān)注哪個(gè)模塊,就對(duì)它做點(diǎn)簡(jiǎn)單的修改來(lái)改進(jìn)結(jié)構(gòu)。每次通讀代碼的時(shí)候,也可以不時(shí)調(diào)整一下結(jié)構(gòu)。
這一策略有時(shí)也叫"無(wú)情重構(gòu)",我把它叫作"童子軍訓(xùn)練守則":對(duì)每個(gè)模塊,每檢入一次代碼,就要讓它比上次檢出時(shí)變得更為簡(jiǎn)潔。每次讀代碼,都別忘了進(jìn)行點(diǎn)滴的改善。
這與大多數(shù)人對(duì)軟件的理解相反。他們認(rèn)為對(duì)可工作軟件不斷地做一系列修改是危險(xiǎn)的。錯(cuò)!讓軟件保持固定不變才是危險(xiǎn)的!如果一直不重構(gòu)代碼,等到不得不重構(gòu)時(shí),你就會(huì)發(fā)現(xiàn)代碼已經(jīng)"僵化了"。
為什么大多數(shù)開(kāi)發(fā)人員不敢不斷修改他的代碼呢?因?yàn)樗麄兒ε聲?huì)改壞代碼!為什么會(huì)有這樣的擔(dān)心呢?因?yàn)樗麄儧](méi)做過(guò)測(cè)試。
話題又回到測(cè)試上來(lái)了。如果你有一套覆蓋了全部代碼的自動(dòng)化測(cè)試,如果那套測(cè)試可以隨時(shí)快速執(zhí)行,那么你根本不會(huì)害怕修改代碼。怎樣才能證明你不怕修改代碼呢?那就是,你一直在改。
專業(yè)開(kāi)發(fā)人員對(duì)自己的代碼和測(cè)試極有把握,他們會(huì)極其瘋狂隨意地做各種修改。他們敢于隨心所欲修改類的名稱。在通讀代碼時(shí),如果發(fā)現(xiàn)一個(gè)冗長(zhǎng)的方法,他們肯定會(huì)將它拆分,重新組織。他們還會(huì)把switch語(yǔ)句改為多態(tài)結(jié)構(gòu),或者將繼承層次重構(gòu)成一條"命令鏈"。簡(jiǎn)單地說(shuō),他們對(duì)待代碼,就如同雕塑家對(duì)待泥巴那樣,要對(duì)它進(jìn)行不斷的變形與塑造。
1.4 職業(yè)道德
職業(yè)發(fā)展是你自己的事。雇主沒(méi)有義務(wù)確保你在職場(chǎng)能夠立于不敗之地,也沒(méi)義務(wù)培訓(xùn)你,送你參加各種會(huì)議或給你買(mǎi)各種書(shū)籍充電。這些都是你自己的事。將自己的職業(yè)發(fā)展寄希望于雇主的軟件開(kāi)發(fā)人員將會(huì)很慘。
有些雇主愿意為員工買(mǎi)各種書(shū)籍或送員工參加各種培訓(xùn)課程和會(huì)議。那樣挺不錯(cuò)的,說(shuō)明他們待你不薄。但可千萬(wàn)別就此認(rèn)為這些是雇主該做的。如果他們不為你做這些,你就該自己想辦法去做。
另外,雇主也沒(méi)義務(wù)給你留學(xué)習(xí)時(shí)間。有些雇主會(huì)這么做,有些甚至要求你這么做。但是還是那句話,他們待你不薄,你應(yīng)該適當(dāng)表示感激。因?yàn)檫@些優(yōu)待不是你理所當(dāng)然就該享有的。
雇主出了錢(qián),你必須付出時(shí)間和精力。為了說(shuō)明問(wèn)題,就用一周工作40小時(shí)的美國(guó)標(biāo)準(zhǔn)來(lái)做參照吧。這40小時(shí)應(yīng)該用來(lái)解決雇主的問(wèn)題,而不是你自己的問(wèn)題。
你應(yīng)該計(jì)劃每周工作60小時(shí)。前40小時(shí)是給雇主的,后20小時(shí)是給自己的。在這剩余的20小時(shí)里,你應(yīng)該看書(shū)、練習(xí)、學(xué)習(xí),或者做其他能提升職業(yè)能力的事情。
你肯定會(huì)說(shuō):"那我的家庭該怎么辦?還有我的生活呢?難道我就該為雇主犧牲這些嗎?"
在此,我不是說(shuō)要占用你全部的業(yè)余時(shí)間。我是指每周額外增加20小時(shí),也就是大約每天3小時(shí)。如果你在午飯時(shí)間看看書(shū),在通勤路上聽(tīng)聽(tīng)播客,花90分鐘學(xué)一門(mén)新的語(yǔ)言,那么你就都能兼顧到了。
做個(gè)簡(jiǎn)單的計(jì)算吧。一周有168小時(shí),給你的雇主40小時(shí),為自己的職業(yè)發(fā)展留20小時(shí),剩下的108小時(shí)再留56小時(shí)給睡眠,那么還剩52小時(shí)可做其他的事呢。
或許你不愿那么勤勉。沒(méi)問(wèn)題。只是那樣的話你也不能自視為專業(yè)人士了,因?yàn)樗^"術(shù)業(yè)有專攻"那也是需要投入時(shí)間去追求的。
或許你會(huì)覺(jué)得工作就該在上班時(shí)完成,不該再帶回家中。贊成!那20小時(shí)你不用為雇主工作。相反,你該為自己的職業(yè)發(fā)展工作。
有時(shí)這兩者并不矛盾,而是一致的。有時(shí)你為雇主做的工作讓你個(gè)人的職業(yè)發(fā)展受益匪淺,這種情況下,在那20小時(shí)里花點(diǎn)時(shí)間為雇主工作也是合理的。但別忘了,那20小時(shí)是為你自己的。它們將會(huì)讓你成為更有價(jià)值的專業(yè)人士。
或許你會(huì)覺(jué)得這樣做只會(huì)讓人精力枯竭。恰恰相反,這樣做其實(shí)能讓你免于枯竭匱乏。假設(shè)你是因?yàn)闊釔?ài)軟件而成為軟件開(kāi)發(fā)者,渴望成為專業(yè)開(kāi)發(fā)者的動(dòng)力也正是來(lái)自對(duì)軟件的熱情,那么在那20小時(shí)里,就應(yīng)該做能夠激發(fā)、強(qiáng)化你的熱情的事。那20小時(shí)應(yīng)該充滿樂(lè)趣!
1.4.1 了解你的領(lǐng)域
你知道什么是N-S(Nassi-Schneiderman)圖表嗎?如果不知道,那為什么不了解一下呢?你知道"米利型"(Mealy)和"摩爾型"(Moore)這兩種狀態(tài)機(jī)的差別嗎?你應(yīng)該知道的。你能不需查閱算法手冊(cè)就可寫(xiě)出一個(gè)快速排序程序嗎?你知道"變換分析"(Transform Analysis)這個(gè)術(shù)語(yǔ)的意思嗎?你知道如何用數(shù)據(jù)流圖進(jìn)行功能分解嗎?你知道"臨時(shí)傳遞數(shù)據(jù)"(Tramp Data)的意思嗎?你聽(tīng)說(shuō)過(guò)"耦合性"(Conascence)嗎?什么是Parnas表呢?
近50年來(lái),各種觀點(diǎn)、實(shí)踐、技術(shù)、工具與術(shù)語(yǔ)在我們這一領(lǐng)域?qū)映霾桓F。你對(duì)這些了解多少呢?如果想成為一名專業(yè)開(kāi)發(fā)者,那你就得對(duì)其中的相當(dāng)一大部分有所了解,而且要不斷擴(kuò)展這一知識(shí)面。
為什么要了解這些呢?這一行業(yè)發(fā)展迅速,許多舊見(jiàn)解似乎也已經(jīng)過(guò)時(shí)了,不是嗎?前半句似乎是顯而易見(jiàn)的。確實(shí),行業(yè)正迅猛發(fā)展,而有趣的是,從多個(gè)方面來(lái)看,這種進(jìn)展都只是很淺層的。沒(méi)錯(cuò),我們不再需要為拿到編譯結(jié)果苦等上24小時(shí),我們也已經(jīng)可以寫(xiě)出吉字節(jié)級(jí)別的系統(tǒng),我們置身覆蓋全球的網(wǎng)絡(luò)之中,各種信息唾手可得。但另一方面,我們還是跟50年前一樣,寫(xiě)著各種if和while語(yǔ)句。所以,改變說(shuō)多也多,說(shuō)少也少。
舊見(jiàn)解過(guò)時(shí)了這種說(shuō)法明顯是不對(duì)的。過(guò)去50年中產(chǎn)生的理念,已經(jīng)過(guò)時(shí)的其實(shí)很少。有一部分理論確實(shí)在慢慢淡出,比如說(shuō)"瀑布式開(kāi)發(fā)"的理論確實(shí)不再流行了。但這并不表示我們不需要了解它,不需要知道他的長(zhǎng)處和短處。
總的來(lái)說(shuō),那些在過(guò)去50年中來(lái)之不易的理念,絕大部分在今天仍像過(guò)去一樣富有價(jià)值,甚至寶貴了。
別忘了桑塔亞納的詛咒:"不能銘記過(guò)去的人,注定重蹈先人的覆轍。"
下面列出了每個(gè)專業(yè)軟件開(kāi)發(fā)人員必須精通的事項(xiàng)。
? 設(shè)計(jì)模式。必須能描述GOF書(shū)中的全部24種模式,同時(shí)還要有POSA書(shū)中的多數(shù)模式的實(shí)戰(zhàn)經(jīng)驗(yàn)。
? 設(shè)計(jì)原則。必須了解SOLID原則,而且要深刻理解組件設(shè)計(jì)原則。
? 方法。必須理解XP、Scrum、精益、看板、瀑布、結(jié)構(gòu)化分析及結(jié)構(gòu)化設(shè)計(jì)等。
? 實(shí)踐。必須掌握測(cè)試驅(qū)動(dòng)開(kāi)發(fā)、面向?qū)ο笤O(shè)計(jì)、結(jié)構(gòu)化編程、持續(xù)集成和結(jié)對(duì)編程。
? 工件。必須了解如何使用UML圖、DFD圖、 結(jié)構(gòu)圖、Petri網(wǎng)絡(luò)圖、狀態(tài)遷移圖表、流程圖和決策表。
1.4.2 堅(jiān)持學(xué)習(xí)
軟件行業(yè)的飛速改變,意味著軟件開(kāi)發(fā)人員必須堅(jiān)持廣泛學(xué)習(xí)才不至于落伍。不寫(xiě)代碼的架構(gòu)師必然遭殃,他們很快會(huì)發(fā)現(xiàn)自己跟不上時(shí)代了;不學(xué)習(xí)新語(yǔ)言的程序員同樣會(huì)遭殃,他們只能眼睜睜看著軟件業(yè)徑直向前,把自己拋在后面;學(xué)不會(huì)新原則和技術(shù)的開(kāi)發(fā)人員必將淪落,他們身邊的人都日益。
你會(huì)找那些已經(jīng)不看醫(yī)學(xué)期刊的醫(yī)生看病嗎?你會(huì)聘請(qǐng)那些不了解近期稅法和判例的稅務(wù)律師嗎?雇主們干嘛要聘用那些不能與時(shí)俱進(jìn)的開(kāi)發(fā)人員呢?
讀書(shū),看相關(guān)文章,關(guān)注博客和微博,參加技術(shù)大會(huì),訪問(wèn)用戶群,多參與讀書(shū)與學(xué)習(xí)小組。不懂就學(xué),不要畏難。如果你是.NET程序員,就去學(xué)學(xué)Java;如果你是Java程序員,就去學(xué)學(xué)Ruby;如果你是C語(yǔ)言程序員,就去學(xué)學(xué)Lisp;如果你真想練練腦子,就去學(xué)學(xué)Prolog和Forth吧!
1.4.3 練習(xí)
業(yè)精于勤。真正的專業(yè)人士往往勤學(xué)苦干,以求得自身技能的純熟精煉。只完成日常工作是不足以稱為練習(xí)的,那只能算是種執(zhí)行性質(zhì)的操作,而不是練習(xí)。練習(xí),指的是在日常工作之余專門(mén)練習(xí)技能,以期自我提升。
對(duì)軟件開(kāi)發(fā)人員來(lái)說(shuō),有什么可以用以操練的呢?乍一聽(tīng),這概念顯得荒唐。但是再仔細(xì)想一會(huì)兒,想想音樂(lè)家是如何掌握演練技能的。他們靠的不是表演,而是練習(xí)。他們又是如何練習(xí)的呢?首先,表演之前,都需要經(jīng)歷過(guò)特別的訓(xùn)練,音階、練習(xí)曲、不斷演奏等。他們一遍又一遍地訓(xùn)練自己的手指和意識(shí),保持技巧純熟。
那么軟件開(kāi)發(fā)者該怎樣來(lái)不斷訓(xùn)練自己呢?本書(shū)會(huì)用一整章的篇幅來(lái)談?wù)摳鞣N練習(xí)技巧,所以在此先不贅述了。簡(jiǎn)單說(shuō),我常用的一個(gè)技巧是重復(fù)做一些簡(jiǎn)單的練習(xí),如"保齡球游戲"或"素?cái)?shù)篩選",我把這些練習(xí)叫作"卡塔"(kata)。卡塔有很多類型。
卡塔的形式往往是一個(gè)有待解決的簡(jiǎn)單編程問(wèn)題,比如編寫(xiě)計(jì)算拆分某個(gè)整數(shù)的素?cái)?shù)因子等。做卡塔的目的不是找出解決方法(你已經(jīng)知道方法了),而是訓(xùn)練你的手指和大腦。
每天我都會(huì)做一兩個(gè)卡塔,時(shí)間往往安排在正式投入工作之前。我可能會(huì)選用Java、Ruby、Clojure或其他我希望保持純熟的語(yǔ)言來(lái)練習(xí)。我會(huì)用卡塔來(lái)培養(yǎng)某種專門(mén)的技能,比如讓我的手指習(xí)慣點(diǎn)擊快捷鍵或習(xí)慣使用某些重構(gòu)技法等。
不妨早晚都來(lái)個(gè)10分鐘的卡塔吧,把它當(dāng)作熱身練習(xí)或者靜心過(guò)程。
1.4.4 合作
學(xué)習(xí)的第二個(gè)方法是與他人合作。專業(yè)軟件開(kāi)發(fā)人員往往會(huì)更加努力地嘗試與他人一起編程、一起練習(xí)、一起設(shè)計(jì)、一起計(jì)劃,這樣他們可以從彼此身上學(xué)到很多東西,而且能在更短的時(shí)間內(nèi)更高質(zhì)量地完成更多工作。
并不是讓你花全部時(shí)間一直和別人共事。獨(dú)處的時(shí)間也很重要。雖然我很喜歡和別人一起編程,但是如果不能經(jīng)常獨(dú)處,我也一樣會(huì)發(fā)瘋。
1.4.5 輔導(dǎo)
俗話說(shuō):教學(xué)相長(zhǎng)。想迅速牢固地掌握某些事實(shí)和觀念,好的方法就是與由你負(fù)責(zé)的人交流這些內(nèi)容。這樣,傳道授業(yè)的同時(shí),導(dǎo)師也會(huì)從中受益。
同樣,讓新人融入團(tuán)隊(duì)的好辦法是和他們坐到一起,向他們傳授工作要訣。專業(yè)人士會(huì)視輔導(dǎo)新人為己任,他們不會(huì)放任未經(jīng)輔導(dǎo)的新手亂打亂撞。
1.4.6 了解業(yè)務(wù)領(lǐng)域
每位專業(yè)軟件開(kāi)發(fā)人員都有義務(wù)了解自己開(kāi)發(fā)的解決方案所對(duì)應(yīng)的業(yè)務(wù)領(lǐng)域。如果編寫(xiě)財(cái)務(wù)系統(tǒng),你就應(yīng)該對(duì)財(cái)務(wù)領(lǐng)域有所了解;如果編寫(xiě)旅游應(yīng)用程序,那么你需要去了解旅游業(yè)。你未必需要成為該領(lǐng)域的專家,但你仍需要勤勉,付出相當(dāng)?shù)呐?lái)認(rèn)識(shí)業(yè)務(wù)領(lǐng)域。
開(kāi)始一個(gè)新領(lǐng)域的項(xiàng)目時(shí),應(yīng)當(dāng)讀一兩本該領(lǐng)域相關(guān)的書(shū),要就該領(lǐng)域的基礎(chǔ)架構(gòu)與基本知識(shí)作客戶和用戶訪談,還應(yīng)當(dāng)花時(shí)間和業(yè)內(nèi)專家交流,了解他們的原則與價(jià)值觀念。
最糟糕、最不專業(yè)的做法是,簡(jiǎn)單按照規(guī)格說(shuō)明來(lái)編寫(xiě)代碼,但卻對(duì)為什么那些業(yè)務(wù)需要那樣的規(guī)格定義不求甚解。相反,你應(yīng)該對(duì)這一領(lǐng)域有所了解,能辨別、質(zhì)疑規(guī)格說(shuō)明書(shū)中的錯(cuò)誤。
1.4.7 與雇主/客戶保持一致
雇主的問(wèn)題就是你的問(wèn)題。你必須弄明白這些問(wèn)題,并尋求的解決方案。每次開(kāi)發(fā)系統(tǒng),都應(yīng)該站在雇主的角度來(lái)思考,確保開(kāi)發(fā)的功能真正能滿足雇主的需要。
開(kāi)發(fā)人員之間互相認(rèn)同是容易的,但把一方換成雇主,人們就容易產(chǎn)生"彼"、"此"之分。專業(yè)人士會(huì)盡全力避免這樣的狹隘之見(jiàn)。
1.4.8 謙遜
編程是一種創(chuàng)造性活動(dòng)。寫(xiě)代碼是無(wú)中生有的創(chuàng)造過(guò)程,我們大膽地從混沌之中創(chuàng)建秩序。我們自信地?zé)o誤的指令,稍有差錯(cuò),機(jī)器的錯(cuò)誤行為就可能造成無(wú)法估量的損失。因此,編程也是極其自負(fù)的行為。
專業(yè)人士知道自己自負(fù),不會(huì)故作謙遜。他們熟知自己的工作,并引以為榮;他們對(duì)自己的能力充滿自信,并因此勇于承擔(dān)有把握的風(fēng)險(xiǎn)。專業(yè)人士不是膽小鬼。
然而,專業(yè)人士也知道自己會(huì)摔跟頭,自己的風(fēng)險(xiǎn)評(píng)估也有出錯(cuò)的時(shí)候,自己也有力不從心的時(shí)候。這時(shí)候,如果他們攬鏡自照,會(huì)看到那個(gè)自負(fù)的傻瓜正對(duì)著自己笑。
因此,在發(fā)現(xiàn)自己成為笑柄時(shí),專業(yè)人士會(huì)及時(shí)個(gè)發(fā)笑。他從不會(huì)嘲諷別人,自作自受時(shí)他會(huì)接受別人的嘲諷。反之,他則會(huì)一笑了之。他不會(huì)因別人犯錯(cuò)就對(duì)之橫加貶損,因?yàn)樗?/p>
"毫無(wú)疑問(wèn),Bob大叔的這本新作又一次抬高了專業(yè)程序員的門(mén)檻。在書(shū)中,他從交互管理、時(shí)間管理、壓力管理、合作方法以及工具選擇等諸多方面,闡述了他對(duì)一名專業(yè)程序員的期望。Bob并不囿于對(duì)TDD和ATDD的傳授,他不僅解釋了每一名自視為專業(yè)人士的程序員所需要知道的東西,而且指出了他們需要在歷練尚淺的軟件開(kāi)發(fā)職業(yè)生涯中需要不斷精進(jìn)的內(nèi)容。" —— Markus G?rtner,it-agile公司博學(xué)軟件開(kāi)發(fā)者 "有一些技術(shù)書(shū)頗具啟發(fā)和教益,有一些則讀來(lái)輕松喜悅且富有趣味,但很少有技術(shù)書(shū)籍能夠同時(shí)兼具所有這四個(gè)特色。我感覺(jué)Martin所有的書(shū)都可歸入此列。本書(shū)也不例外。 閱讀、學(xué)習(xí)和守持書(shū)中的教誨,你將可以信心滿滿地把自己訓(xùn)練為軟件專業(yè)人士。" ——George Bullock,微軟公司博學(xué)程序經(jīng)理 "如果計(jì)算機(jī)科學(xué)學(xué)位要求有`畢業(yè)后必讀書(shū)單`,本書(shū)當(dāng)在其列。在現(xiàn)實(shí)的職業(yè)生涯中,糟糕的代碼不會(huì)因?qū)W期結(jié)束就此消失,程序員也不會(huì)因加班加點(diǎn)開(kāi)夜車(chē)編碼便可獲得A級(jí)評(píng)分,而雪上加霜的是,你還必須抽出精力與人打交道。就算你是個(gè)編程高手,也并不一定就可以稱為專業(yè)人士。本書(shū)描述了邁向?qū)I(yè)程序員的修煉旅程……而且閱讀起來(lái)確實(shí)異常有趣。" ——Jeff Overvey,伊利諾伊大學(xué)厄本那-香檳分校 "本書(shū)遠(yuǎn)不只是給出了一套規(guī)則或指導(dǎo)方針,它還包含了無(wú)數(shù)來(lái)之不易的智慧和知識(shí),這些寶貴財(cái)富通常只有經(jīng)歷過(guò)多年的試錯(cuò),歷經(jīng)由初級(jí)學(xué)徒修煉成為大師級(jí)工匠的整個(gè)過(guò)程才能獲得。如果你期望自己能成為軟件專業(yè)人士,那么本書(shū)不容錯(cuò)過(guò)。" ——R.L. Bogetti?,Baxter Healthcare公司系統(tǒng)主設(shè)計(jì)師
很好
還沒(méi)仔細(xì)看,看后再評(píng)價(jià)。
不多說(shuō),好東西
沒(méi)見(jiàn)過(guò)這么慢的物流
不錯(cuò)
部分紙業(yè)有稍微破損
書(shū)很好 沒(méi)有質(zhì)量問(wèn)題 值得一買(mǎi)
好書(shū) 好書(shū)
不錯(cuò)
很好的書(shū)
????
《程序員的職業(yè)素養(yǎng)》是編程大師Bob大叔40余年編程生涯的心得體會(huì), 講解成為真正專業(yè)的程序員需要什么樣的態(tài)度、原則,需要采取什么樣的行動(dòng)。作者以自己以及身邊的同事走過(guò)的彎路、犯過(guò)的錯(cuò)誤為例,意在為后來(lái)人引路,助其職業(yè)生涯邁上更高臺(tái)階。 《程序員的職業(yè)素養(yǎng)》適合所有程序員,也可供所有想成為具備職業(yè)素養(yǎng)的職場(chǎng)人士參考。
下了兩次單,一次兩本一次三本,都是今天送到為什么差別這么大呢?這兩本書(shū)壓皺了就算了,連封面都臟兮兮的好么?買(mǎi)書(shū)就是為了閱讀體驗(yàn),新書(shū)都這樣的話那還不如去看電子書(shū)了。當(dāng)當(dāng)買(mǎi)了這么多次書(shū),這次最不爽了,本來(lái)以前買(mǎi)書(shū)都只在當(dāng)當(dāng),這次真讓人傷心,以后要考慮換一家網(wǎng)站了。另外三本就非常好,連袋子膜都還在。
對(duì)于沉溺于技術(shù)世界的IT屌絲助益匪淺,理性太久了,來(lái)點(diǎn)感性吧。
老外的書(shū)(翻譯本)讀起來(lái)比較有感覺(jué),里面案列都寫(xiě)的不錯(cuò),很有收獲。
剛剛收到書(shū),隨便翻閱了頁(yè) 感覺(jué)還是不錯(cuò)的。值得一看
看了前面幾章,很有收獲,有一定工作經(jīng)驗(yàn)后再看體會(huì)更深
書(shū)很好,送貨的快遞太爛了!!!說(shuō)是次日到貨,拖了4天!
思想不錯(cuò),對(duì)你的職業(yè)觀會(huì)產(chǎn)生影響,越早看越好
現(xiàn)在確實(shí)需要把軟件工程師職業(yè)道德與責(zé)任提到日是日程上來(lái)了,需要這類書(shū)籍的大量涌現(xiàn)。
看Bob大叔的書(shū),還要追溯到《敏捷軟件開(kāi)發(fā)——原則、模式與實(shí)踐》。這是一本改變我對(duì)軟件看法的書(shū),也使得我徹底擺脫了一個(gè)純編碼者的思維,繼而轉(zhuǎn)向以研究設(shè)計(jì)架構(gòu)、分析用戶需求為中心的軟件開(kāi)發(fā)方式,可謂一部有重要影響力的書(shū)。這個(gè)以后會(huì)有專文描述,在此不贅述啦。 其后看了《Clean Code》(干凈代碼),此書(shū)可以認(rèn)為是敏捷軟件開(kāi)發(fā)一書(shū)的具體化。那本以思想為主,這本以代碼細(xì)節(jié)為主。
看了大師的經(jīng)歷分享,感覺(jué)自己不再孤單。成長(zhǎng)意味著歷練。專家之路其修遠(yuǎn)兮,唯實(shí)戰(zhàn)才是根本。謝謝Bob大叔的分享~~~~
本來(lái)對(duì)這本書(shū)名不太感冒,由于是Robert.C.Martin的經(jīng)典著作就翻來(lái)看看,一看進(jìn)去就愛(ài)不釋手了,內(nèi)容有很多前人的經(jīng)驗(yàn)和心血,非常受用
這本書(shū)篇幅不長(zhǎng),但是內(nèi)容很不錯(cuò)。不是學(xué)習(xí)代碼,而且學(xué)習(xí)如何做一名合格的程序員。
不僅是程序員,對(duì)于相關(guān)領(lǐng)域感興趣的人都可以讀一讀,深入淺出,詼諧幽默!而且干貨很多
Robert C.Martin的大名咱就不說(shuō)啥了。這本書(shū)寫(xiě)的深入淺出,感覺(jué)像讀一本小說(shuō),流暢自然,但自然而然的就學(xué)到了很多東西。結(jié)合工作經(jīng)驗(yàn),常有種“確實(shí)如此”的感覺(jué)。看完此書(shū)第一個(gè)感覺(jué)就是:大叔也是跌跌撞撞一路走來(lái),什么時(shí)候才能成為大叔這種級(jí)別的高手呢!成為一名專業(yè)的程序員有很長(zhǎng)的路要走,這本書(shū)亦值得一再品讀。
程序員的職業(yè)素養(yǎng),提高水平,就從這本書(shū)開(kāi)始吧。