本書是ACM Queue雜志和Communications of the ACM上“Kode Vicious”專欄系列文章的一個合集,主題涉及編程風格、軟件工程、系統(tǒng)設計、網(wǎng)絡通信及項目管理這五大方面,每章都由針對軟件開發(fā)人員所面臨的日常問題的信件、回復和建議組成,旨在解決這些與每位軟件專業(yè)人員相關的問題,適合有一定經(jīng)驗的軟件開發(fā)人員閱讀。
適讀人群 :軟件開發(fā)人員
以Kode Vicious(KV)的身份,George V. Neville-Neil花了15年多的時間向每一位程序員以及與程序或程序員打交道的人分享深刻的見解和中肯的建議。在本書中,他匯集了自己關于構建更有效的計算機系統(tǒng)的隨筆和蘇格拉底式對話!癒ode Vicious”專欄一直是ACM Queue和Communications of the ACM上最受歡迎的部分。本書還補充了KV的一些有趣和敏銳的探究,這些新材料闡述了更廣泛的主題,并解決了與每個軟件專業(yè)人員相關的問題。
本書作者直指問題核心,并就以下主題為程序員新手和老手提供了實用的經(jīng)驗。
? 手頭的代碼:對特定的一段代碼該做什么和不該做什么
? 編程難題:諸如測試和文檔編寫之類的圍繞代碼的問題
? 系統(tǒng)設計:從抽象、線程到安全的整體系統(tǒng)設計主題
? 機器對機器:分布式系統(tǒng)和計算機網(wǎng)絡
? 人類對人類:與開發(fā)人員、管理人員和其他人打交道
本書每章都匯集了直接針對計算機系統(tǒng)工作人員日常問題的信件、回復和建議。作者雖然對所提問題的回答總是以幽默的筆調撰寫,但給出的建議卻是嚴肅認真的。
Preface 前 言
最壞的情況是什么?
—著名的遺言
歡迎來到我從未想過的嘗試—關于“Kode Vicious”的第一本書。事實上,我從未想過會為一本雜志寫專欄,也從未想過這個專欄會連載15年多,發(fā)表了100多篇文章。但生活就是充滿了奇怪的波折,尤其是當你沒有足夠快地躲開一桌正在尋找受害者(我是說志愿者)的同伴時!
“所以現(xiàn)在我想拋出有史以來最糟糕的主意!彪S著Wendy A. Kellogg的這句話,創(chuàng)辦“Kode Vicious”專欄的想法誕生了!皩谪撠熑藨撌蔷幬瘯蓡T,態(tài)度‘有問題’的人,光頭的人!痹赒ueue創(chuàng)辦的早期,我是唯一光頭的編委會成員,盡管那時我已經(jīng)剃了十年的光頭。
2004年2月,我和Queue編委會的其他成員一起參加月度會議,我們聚在一起,試圖為Queue提出有趣的主題和作者。那時正值這本雜志的早期,剛創(chuàng)辦第四年,雖然已經(jīng)有幾期比較成功,但我們沒有固定的專欄作家。Eric Allman邀請我參加編委會會議,然后我為雜志寫了幾篇文章,并正在與人合著我的第一本書。但我從來沒有當過專欄作家,盡管這個想法在當時看起來很有趣—也許是因為晚餐時喝了太多酒,當時我不知道如何著手。
創(chuàng)辦“Kode Vicious”專欄的想法實際上最初來自一個更具“禮儀小姐”風格的專欄,基于Judith Martin的著名作品,我小時候和媽媽一起讀過她的作品。我會用其他人稱的方式來寫這些文章,這似乎是一個有趣的挑戰(zhàn)。第一個名字是Mother Code,我使用這個角色名向我們的編輯提交了兩篇文章。
我們討論時的一些個性素描可能有助于更好地了解當時的情況:盡管母親從不嚴厲地提出建議或批評,但她的信念很堅定。這是一個堅強但靈活和善良的建議者形象。她在每篇文章上都有一句標志性的簽名行,比如“別忘了擦鞋”或“記得穿膠鞋”,這與我們的受眾有關。比如:“記住,在將代碼簽入源代碼樹之前,請確保你的代碼已構建!
最后,出于幾個原因,這被證明是行不通的。最初的文章不成功,最重要的原因是以其他人稱來寫作非常困難。雖然一兩篇文章可能會以某種完全不同的形式出現(xiàn),但以更貼近自己的角色來寫作要比作為一個完全不同的人來寫作容易得多。面對現(xiàn)實吧,我駕馭不了“禮儀小姐”風格。
實際上,我花了很長一段時間來確定要使用的角色,包括一些比較直觀的,如“Code Confidential”(代碼機密)和“Code Critic”(代碼評論家),以及令人尷尬的“Captain Safety”(安全隊長)、“Bug Basher”(Bug破壞者)和“Lint Picker”,然后才想到用“Vicious”(邪惡)這個詞作為筆名。接下來,它很快就從“Kid Vicious”“Code Vicious”和“Vicious Kode”最終變成了聽起來比較對的“Kode Vicious”。
隨著新名字而來的是一個新的個性素描:
有一顆金子般內(nèi)心的“壞蛋”?偸窃敢饨虅e人,但不想教那些不愿意學習的人。想象一個穿著Sex Pistols樂隊T恤的僧人,你會擔心如何帶他去吃飯。經(jīng)常用鼻子來給學生指路。
得以順利開始。我重寫了最初以Mother Code身份所寫的關于選擇編程規(guī)范的文章“So Many Standards”,并開始了我的專欄作家生涯。
那么,“Kode Vicious”背后的作者真的是一個大壞蛋嗎?他把同事扔出窗外?扎破討厭的營銷人員的輪胎?酗酒?毆打和斥責他的同事?答案既是肯定的也是否定的。
KV是一位諷刺家,認識我并與我共事過的人可以很容易地看出我是如何在文章中寫出我所做的事情的。當然,KV是我可能想成為的人,或者時不時地變成我的化身。通常,當我參加一些會議,摘下眼鏡,大聲地把它扔在桌子上,然后用手摸著自己的光頭,心想怎么會有人這么笨時,我就想成為KV。如果你和我一起開會時看到我這樣做了,那就說明我覺得剛才說話的人是個傻瓜。事實是,與其去毆打或斥責那些愚蠢的人,不如把這些想法以KV的名義寫成文章,爭取給他們一些幫助。
想想文學對KV的影響是很奇怪的,但和其他作家一樣,我受好幾個人影響,其中最重要的是我的母親,我在“Standards Advice”中提到了她,她是一位嚴厲的批評家。我最喜歡的作家總是嚴厲的、直接的、喜歡招惹別人的。老實說,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è)生涯中最令人驚嘆的學習經(jīng)歷之一。我很幸運地遇見了一些真正有頭腦的人—有點醉心于葡萄酒,粗暴地用牛排刀指著桌子對面的我,告訴我為什么某個想法要么很有趣,要么完全是胡說八道。
我曾多次(包括在一封信中)被問到,我是否既寫了問題又寫了答案。在我最初寫這些文章的時候,沒有來信,所以我必須同時寫問題和答案。起初這是相當困難的,我會盯著屏幕,離最后期限還有幾小時(我總是在最后期限甚至之后提交我的文章),我的編輯欄里除了“親愛的KV”之外什么都沒有。然后我學到了一個很好的技巧,從那以后我就一直在用。如果素材用完了,我所要做的就是打開一段源代碼并閱讀它。
作者簡介 About the Author
George V. Neville-Neil從事安全、網(wǎng)絡和操作系統(tǒng)方面的探索、寫作、教學和咨詢工作。作為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)一書。他擁有美國東北大學計算機科學學士學位。在從事計算機和開源項目工作之余,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 強制異常21
1.9 一段不錯的代碼24
1.10 一些惡臭的東西27
1.11 日志記錄29
1.12 丟失31
1.13 復制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 維護模式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 調試硬件101
2.22 健全性與可見性104
第3章 系統(tǒng)設計107
3.1 抽象109
3.2 驅動113
3.3 重新審視驅動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)絡釣魚和感染138
3.12 用戶界面設計143
3.13 安全日志146
3.14 Java150
3.15 安全P2P154
第4章 機器對機器157
4.1 踩到腳趾158
4.2 匱乏的端口161
4.3 協(xié)議設計164
4.4 第一個來的167
4.5 網(wǎng)絡調試170
4.6 延遲174
4.7 長跑177
4.8 網(wǎng)絡即計算機180
4.9 擴展失敗184
4.10 端口占用186
4.11 原始網(wǎng)絡189
4.12 毫無意義的PKI191
4.13 標準的標準193
第5章 人類對人類197
5.1 關于驕傲和其他198
5.2 你的是什么顏色201
5.3 被破壞的構建203
5.4 什么是智能206
5.5 設計審查209
5.6 主機的命名213
5.7 主持面試216
5.8 神話219
5.9 過時的程序員221
5.10 擁有強大的力量224
5.11 信226
5.12 標簽229
5.13 螺絲刀和錘子231
5.14 安全審查233
5.15 勿忘初心238
5.16 開源許可證241
5.17 如此多的標準244
5.18 書籍246
5.19 更多有關書籍的信息250
5.20 保持與時俱進252
5.21 我的最后一招254