本書是ACM Queue雜志和Communications of the ACM上“Kode Vicious”專欄系列文章的一個合集,主題涉及編程風(fēng)格、軟件工程、系統(tǒng)設(shè)計、網(wǎng)絡(luò)通信及項目管理這五大方面,每章都由針對軟件開發(fā)人員所面臨的日常問題的信件、回復(fù)和建議組成,旨在解決這些與每位軟件專業(yè)人員相關(guān)的問題,適合有一定經(jīng)驗的軟件開發(fā)人員閱讀。
適讀人群 :軟件開發(fā)人員
以Kode Vicious(KV)的身份,George V. Neville-Neil花了15年多的時間向每一位程序員以及與程序或程序員打交道的人分享深刻的見解和中肯的建議。在本書中,他匯集了自己關(guān)于構(gòu)建更有效的計算機(jī)系統(tǒng)的隨筆和蘇格拉底式對話!癒ode Vicious”專欄一直是ACM Queue和Communications of the ACM上最受歡迎的部分。本書還補(bǔ)充了KV的一些有趣和敏銳的探究,這些新材料闡述了更廣泛的主題,并解決了與每個軟件專業(yè)人員相關(guān)的問題。
本書作者直指問題核心,并就以下主題為程序員新手和老手提供了實用的經(jīng)驗。
? 手頭的代碼:對特定的一段代碼該做什么和不該做什么
? 編程難題:諸如測試和文檔編寫之類的圍繞代碼的問題
? 系統(tǒng)設(shè)計:從抽象、線程到安全的整體系統(tǒng)設(shè)計主題
? 機(jī)器對機(jī)器:分布式系統(tǒng)和計算機(jī)網(wǎng)絡(luò)
? 人類對人類:與開發(fā)人員、管理人員和其他人打交道
本書每章都匯集了直接針對計算機(jī)系統(tǒng)工作人員日常問題的信件、回復(fù)和建議。作者雖然對所提問題的回答總是以幽默的筆調(diào)撰寫,但給出的建議卻是嚴(yán)肅認(rèn)真的。
Preface 前 言
最壞的情況是什么?
—著名的遺言
歡迎來到我從未想過的嘗試—關(guān)于“Kode Vicious”的第一本書。事實上,我從未想過會為一本雜志寫專欄,也從未想過這個專欄會連載15年多,發(fā)表了100多篇文章。但生活就是充滿了奇怪的波折,尤其是當(dāng)你沒有足夠快地躲開一桌正在尋找受害者(我是說志愿者)的同伴時!
“所以現(xiàn)在我想拋出有史以來最糟糕的主意!彪S著Wendy A. Kellogg的這句話,創(chuàng)辦“Kode Vicious”專欄的想法誕生了。“專欄負(fù)責(zé)人應(yīng)該是編委會成員,態(tài)度‘有問題’的人,光頭的人。”在Queue創(chuàng)辦的早期,我是唯一光頭的編委會成員,盡管那時我已經(jīng)剃了十年的光頭。
2004年2月,我和Queue編委會的其他成員一起參加月度會議,我們聚在一起,試圖為Queue提出有趣的主題和作者。那時正值這本雜志的早期,剛創(chuàng)辦第四年,雖然已經(jīng)有幾期比較成功,但我們沒有固定的專欄作家。Eric Allman邀請我參加編委會會議,然后我為雜志寫了幾篇文章,并正在與人合著我的第一本書。但我從來沒有當(dāng)過專欄作家,盡管這個想法在當(dāng)時看起來很有趣—也許是因為晚餐時喝了太多酒,當(dāng)時我不知道如何著手。
創(chuàng)辦“Kode Vicious”專欄的想法實際上最初來自一個更具“禮儀小姐”風(fēng)格的專欄,基于Judith Martin的著名作品,我小時候和媽媽一起讀過她的作品。我會用其他人稱的方式來寫這些文章,這似乎是一個有趣的挑戰(zhàn)。第一個名字是Mother Code,我使用這個角色名向我們的編輯提交了兩篇文章。
我們討論時的一些個性素描可能有助于更好地了解當(dāng)時的情況:盡管母親從不嚴(yán)厲地提出建議或批評,但她的信念很堅定。這是一個堅強(qiáng)但靈活和善良的建議者形象。她在每篇文章上都有一句標(biāo)志性的簽名行,比如“別忘了擦鞋”或“記得穿膠鞋”,這與我們的受眾有關(guān)。比如:“記住,在將代碼簽入源代碼樹之前,請確保你的代碼已構(gòu)建。”
最后,出于幾個原因,這被證明是行不通的。最初的文章不成功,最重要的原因是以其他人稱來寫作非常困難。雖然一兩篇文章可能會以某種完全不同的形式出現(xiàn),但以更貼近自己的角色來寫作要比作為一個完全不同的人來寫作容易得多。面對現(xiàn)實吧,我駕馭不了“禮儀小姐”風(fēng)格。
實際上,我花了很長一段時間來確定要使用的角色,包括一些比較直觀的,如“Code Confidential”(代碼機(jī)密)和“Code Critic”(代碼評論家),以及令人尷尬的“Captain Safety”(安全隊長)、“Bug Basher”(Bug破壞者)和“Lint Picker”,然后才想到用“Vicious”(邪惡)這個詞作為筆名。接下來,它很快就從“Kid Vicious”“Code Vicious”和“Vicious Kode”最終變成了聽起來比較對的“Kode Vicious”。
隨著新名字而來的是一個新的個性素描:
有一顆金子般內(nèi)心的“壞蛋”?偸窃敢饨虅e人,但不想教那些不愿意學(xué)習(xí)的人。想象一個穿著Sex Pistols樂隊T恤的僧人,你會擔(dān)心如何帶他去吃飯。經(jīng)常用鼻子來給學(xué)生指路。
得以順利開始。我重寫了最初以Mother Code身份所寫的關(guān)于選擇編程規(guī)范的文章“So Many Standards”,并開始了我的專欄作家生涯。
那么,“Kode Vicious”背后的作者真的是一個大壞蛋嗎?他把同事扔出窗外?扎破討厭的營銷人員的輪胎?酗酒?毆打和斥責(zé)他的同事?答案既是肯定的也是否定的。
KV是一位諷刺家,認(rèn)識我并與我共事過的人可以很容易地看出我是如何在文章中寫出我所做的事情的。當(dāng)然,KV是我可能想成為的人,或者時不時地變成我的化身。通常,當(dāng)我參加一些會議,摘下眼鏡,大聲地把它扔在桌子上,然后用手摸著自己的光頭,心想怎么會有人這么笨時,我就想成為KV。如果你和我一起開會時看到我這樣做了,那就說明我覺得剛才說話的人是個傻瓜。事實是,與其去毆打或斥責(zé)那些愚蠢的人,不如把這些想法以KV的名義寫成文章,爭取給他們一些幫助。
想想文學(xué)對KV的影響是很奇怪的,但和其他作家一樣,我受好幾個人影響,其中最重要的是我的母親,我在“Standards Advice”中提到了她,她是一位嚴(yán)厲的批評家。我最喜歡的作家總是嚴(yán)厲的、直接的、喜歡招惹別人的。老實說,KV的很多特點是在效仿Hunter S.Thompson,他寫了三本真正偉大的書:Hell's Angels、Fear and Loathing in Las Vegas以及Fear and Loathing on the Campaign Trail'72。
另一個直接影響是Queue本身。15年來,與我們的編委會成員和客座專家(那些來參加Queue會議并幫助我們制定議題以及閱讀和評論雜志文章的人)交流,是我職業(yè)生涯中最令人驚嘆的學(xué)習(xí)經(jīng)歷之一。我很幸運(yùn)地遇見了一些真正有頭腦的人—有點醉心于葡萄酒,粗暴地用牛排刀指著桌子對面的我,告訴我為什么某個想法要么很有趣,要么完全是胡說八道。
我曾多次(包括在一封信中)被問到,我是否既寫了問題又寫了答案。在我最初寫這些文章的時候,沒有來信,所以我必須同時寫問題和答案。起初這是相當(dāng)困難的,我會盯著屏幕,離最后期限還有幾小時(我總是在最后期限甚至之后提交我的文章),我的編輯欄里除了“親愛的KV”之外什么都沒有。然后我學(xué)到了一個很好的技巧,從那以后我就一直在用。如果素材用完了,我所要做的就是打開一段源代碼并閱讀它。
作者簡介 About the Author
George V. Neville-Neil從事安全、網(wǎng)絡(luò)和操作系統(tǒng)方面的探索、寫作、教學(xué)和咨詢工作。作為FreeBSD基金會董事會成員,自2004年以來,他一直為Queue和Communications of the ACM撰寫“Kode Vicious”專欄文章。他是ACM Queue編委會成員,也是USENIX協(xié)會、ACM和IEEE的會員。
George與Marshall Kirk McKusick和Robert N. M. Watson合著了FreeBSD Operating System, Second Edition (Addison-Wesley, 2015)一書。他擁有美國東北大學(xué)計算機(jī)科學(xué)學(xué)士學(xué)位。在從事計算機(jī)和開源項目工作之余,George熱衷于旅行,會說多國語言,包括英語、日語、法語、荷蘭語和一些漢語。他也是一個狂熱的自行車愛好者。George目前住在紐約布魯克林,盡管他一生中有三分之一的時間都在為各種項目奔波。
Contents 目 錄
Donald E. Knuth(DK)撰寫的序
前言
致謝
作者簡介
第1章 手頭的代碼1
1.1 資源管理4
1.2 大內(nèi)存7
1.3 代碼排列10
1.4 代碼濫用12
1.5 嵌套傾向15
1.6 令人窒息的變化17
1.7 被詛咒的代碼19
1.8 強(qiáng)制異常21
1.9 一段不錯的代碼24
1.10 一些惡臭的東西27
1.11 日志記錄29
1.12 丟失31
1.13 復(fù)制33
1.14 五大編程問題36
1.15 語言上的迷失39
1.16 簽入注釋41
第2章 編程難題43
2.1 方法的頌歌44
2.2 C++里的“+”有多少47
2.3 時尚而現(xiàn)代的事物50
2.4 緩存缺失52
2.5 代碼探索55
2.6 輸入驗證63
2.7 與文檔打交道65
2.8 文檔都記錄什么68
2.9 暴躁的測試人員70
2.10 如何測試73
2.11 開啟測試模式76
2.12 維護(hù)模式78
2.13 盡早合并81
2.14 多核怪獸84
2.15 這不是一個產(chǎn)品86
2.16 海森堡bug89
2.17 我不想要你骯臟的PDF文件92
2.18 渴望PIN碼94
2.19 重新啟動97
2.20 代碼掃描器99
2.21 調(diào)試硬件101
2.22 健全性與可見性104
第3章 系統(tǒng)設(shè)計107
3.1 抽象109
3.2 驅(qū)動113
3.3 重新審視驅(qū)動115
3.4 變化的變化118
3.5 穿針引線121
3.6 線程是否依然不安全123
3.7 身份驗證與加密125
3.8 身份驗證回顧127
3.9 身份驗證的例子129
3.10 編寫跨站腳本133
3.11 網(wǎng)絡(luò)釣魚和感染138
3.12 用戶界面設(shè)計143
3.13 安全日志146
3.14 Java150
3.15 安全P2P154
第4章 機(jī)器對機(jī)器157
4.1 踩到腳趾158
4.2 匱乏的端口161
4.3 協(xié)議設(shè)計164
4.4 第一個來的167
4.5 網(wǎng)絡(luò)調(diào)試170
4.6 延遲174
4.7 長跑177
4.8 網(wǎng)絡(luò)即計算機(jī)180
4.9 擴(kuò)展失敗184
4.10 端口占用186
4.11 原始網(wǎng)絡(luò)189
4.12 毫無意義的PKI191
4.13 標(biāo)準(zhǔn)的標(biāo)準(zhǔn)193
第5章 人類對人類197
5.1 關(guān)于驕傲和其他198
5.2 你的是什么顏色201
5.3 被破壞的構(gòu)建203
5.4 什么是智能206
5.5 設(shè)計審查209
5.6 主機(jī)的命名213
5.7 主持面試216
5.8 神話219
5.9 過時的程序員221
5.10 擁有強(qiáng)大的力量224
5.11 信226
5.12 標(biāo)簽229
5.13 螺絲刀和錘子231
5.14 安全審查233
5.15 勿忘初心238
5.16 開源許可證241
5.17 如此多的標(biāo)準(zhǔn)244
5.18 書籍246
5.19 更多有關(guān)書籍的信息250
5.20 保持與時俱進(jìn)252
5.21 我的最后一招254