本书是ACM Queue杂志和Communications of the ACM上“Kode Vicious”专栏系列文章的一个合集,主题涉及编程风格、软件工程、系统设计、网络通信及项目管理这五大方面,每章都由针对软件开发人员所面临的日常问题的信件、回复和建议组成,旨在解决这些与每位软件专业人员相关的问题,适合有一定经验的软件开发人员阅读。
适读人群 :软件开发人员
以Kode Vicious(KV)的身份,George V. Neville-Neil花了15年多的时间向每一位程序员以及与程序或程序员打交道的人分享深刻的见解和中肯的建议。在本书中,他汇集了自己关于构建更有效的计算机系统的随笔和苏格拉底式对话。“Kode Vicious”专栏一直是ACM Queue和Communications of the ACM上最受欢迎的部分。本书还补充了KV的一些有趣和敏锐的探究,这些新材料阐述了更广泛的主题,并解决了与每个软件专业人员相关的问题。
本书作者直指问题核心,并就以下主题为程序员新手和老手提供了实用的经验。
? 手头的代码:对特定的一段代码该做什么和不该做什么
? 编程难题:诸如测试和文档编写之类的围绕代码的问题
? 系统设计:从抽象、线程到安全的整体系统设计主题
? 机器对机器:分布式系统和计算机网络
? 人类对人类:与开发人员、管理人员和其他人打交道
本书每章都汇集了直接针对计算机系统工作人员日常问题的信件、回复和建议。作者虽然对所提问题的回答总是以幽默的笔调撰写,但给出的建议却是严肃认真的。
Preface 前 言
最坏的情况是什么?
—著名的遗言
欢迎来到我从未想过的尝试—关于“Kode Vicious”的第一本书。事实上,我从未想过会为一本杂志写专栏,也从未想过这个专栏会连载15年多,发表了100多篇文章。但生活就是充满了奇怪的波折,尤其是当你没有足够快地躲开一桌正在寻找受害者(我是说志愿者)的同伴时!
“所以现在我想抛出有史以来最糟糕的主意。”随着Wendy A. Kellogg的这句话,创办“Kode Vicious”专栏的想法诞生了。“专栏负责人应该是编委会成员,态度‘有问题’的人,光头的人。”在Queue创办的早期,我是唯一光头的编委会成员,尽管那时我已经剃了十年的光头。
2004年2月,我和Queue编委会的其他成员一起参加月度会议,我们聚在一起,试图为Queue提出有趣的主题和作者。那时正值这本杂志的早期,刚创办第四年,虽然已经有几期比较成功,但我们没有固定的专栏作家。Eric Allman邀请我参加编委会会议,然后我为杂志写了几篇文章,并正在与人合著我的第一本书。但我从来没有当过专栏作家,尽管这个想法在当时看起来很有趣—也许是因为晚餐时喝了太多酒,当时我不知道如何着手。
创办“Kode Vicious”专栏的想法实际上最初来自一个更具“礼仪小姐”风格的专栏,基于Judith Martin的著名作品,我小时候和妈妈一起读过她的作品。我会用其他人称的方式来写这些文章,这似乎是一个有趣的挑战。第一个名字是Mother Code,我使用这个角色名向我们的编辑提交了两篇文章。
我们讨论时的一些个性素描可能有助于更好地了解当时的情况:尽管母亲从不严厉地提出建议或批评,但她的信念很坚定。这是一个坚强但灵活和善良的建议者形象。她在每篇文章上都有一句标志性的签名行,比如“别忘了擦鞋”或“记得穿胶鞋”,这与我们的受众有关。比如:“记住,在将代码签入源代码树之前,请确保你的代码已构建。”
最后,出于几个原因,这被证明是行不通的。最初的文章不成功,最重要的原因是以其他人称来写作非常困难。虽然一两篇文章可能会以某种完全不同的形式出现,但以更贴近自己的角色来写作要比作为一个完全不同的人来写作容易得多。面对现实吧,我驾驭不了“礼仪小姐”风格。
实际上,我花了很长一段时间来确定要使用的角色,包括一些比较直观的,如“Code Confidential”(代码机密)和“Code Critic”(代码评论家),以及令人尴尬的“Captain Safety”(安全队长)、“Bug Basher”(Bug破坏者)和“Lint Picker”,然后才想到用“Vicious”(邪恶)这个词作为笔名。接下来,它很快就从“Kid Vicious”“Code Vicious”和“Vicious Kode”最终变成了听起来比较对的“Kode Vicious”。
随着新名字而来的是一个新的个性素描:
有一颗金子般内心的“坏蛋”。总是愿意教别人,但不想教那些不愿意学习的人。想象一个穿着Sex Pistols乐队T恤的僧人,你会担心如何带他去吃饭。经常用鼻子来给学生指路。
得以顺利开始。我重写了最初以Mother Code身份所写的关于选择编程规范的文章“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会议并帮助我们制定议题以及阅读和评论杂志文章的人)交流,是我职业生涯中最令人惊叹的学习经历之一。我很幸运地遇见了一些真正有头脑的人—有点醉心于葡萄酒,粗暴地用牛排刀指着桌子对面的我,告诉我为什么某个想法要么很有趣,要么完全是胡说八道。
我曾多次(包括在一封信中)被问到,我是否既写了问题又写了答案。在我最初写这些文章的时候,没有来信,所以我必须同时写问题和答案。起初这是相当困难的,我会盯着屏幕,离最后期限还有几小时(我总是在最后期限甚至之后提交我的文章),我的编辑栏里除了“亲爱的KV”之外什么都没有。然后我学到了一个很好的技巧,从那以后我就一直在用。如果素材用完了,我所要做的就是打开一段源代码并阅读它。
作者简介 About the Author
George V. Neville-Neil从事安全、网络和操作系统方面的探索、写作、教学和咨询工作。作为FreeBSD基金会董事会成员,自2004年以来,他一直为Queue和Communications of the ACM撰写“Kode Vicious”专栏文章。他是ACM Queue编委会成员,也是USENIX协会、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 大内存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 时尚而现代的事物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 这不是一个产品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章 系统设计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 网络钓鱼和感染138
3.12 用户界面设计143
3.13 安全日志146
3.14 Java150
3.15 安全P2P154
第4章 机器对机器157
4.1 踩到脚趾158
4.2 匮乏的端口161
4.3 协议设计164
4.4 第一个来的167
4.5 网络调试170
4.6 延迟174
4.7 长跑177
4.8 网络即计算机180
4.9 扩展失败184
4.10 端口占用186
4.11 原始网络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