英文版:《Code Complete 2》
中文版:《代码大全(第二版)》
作者:Steve McConnell
译者:金戈 汤凌 陈硕 张菲
出版社:电子工业出版社
出版日期:2007 年8月
Jeff Atwood的推荐:Steve McConnell的这本书是软件开发领域里的《烹饪的乐趣》。如果你对这本书感兴趣,说明你热爱你现在的工作,你对你正在做的事情是认真的,并且你想不断地提升自己。Steve在这本书里指出,普通程序员每年所读的技术书籍不足一本。仅仅只需阅读这本书,你就有可能超越身边90%的程序员。这绝对是个好主意!
我非常喜欢这本书,以致于我在给自己的博客网站取名的时候也受到了它的启发——我把我们应该避免去做的事情都打上了“Coding Horror”的标签。没有比编程方面的恐怖案例更能给人带来乐趣了。但如果你不得不自己去应对某些恐怖,那么你的乐趣就会荡然无存。请你帮自己一个忙吧!要想读书,这本书是首选;要给身边其他的程序员推荐图书,这本书也是首选。
英文版:《The Mythical Man-Month》
中文版:《人月神话》
作者:Frederick P.Brooks Jr.
译者:UML China翻译组 汪颖
出版社:清华大学出版社
出版日期:2007 年9月
Jeff Atwood的推荐:毫无疑问,这是我们领域里惟一的一本经典图书。如果你还没读过,你应该觉得丢脸!
你知道关于IBM的那个废弃已久的OS/360系统及其开发团队的故事吗?如果你读了《人月神话》还不明白OS/360那回事,那你就是白读了!这本已经出版了30多年的图书有力地证明了一个观点:计算机也许会变,但人不会变。
英文版:《Don't Make Me Think》
中文版:《点石成金:访客至上的网页设计秘笈》
作者:Steve Krug
译者:DeDream'(蒋芳)
出版社:机械工业出版社
出版日期:2006 年8月
Jeff Atwood的推荐:这是我曾读过的、在“可用性”方面讲得最好的一本书。尽管这本书的副标题说的是“Web可用性”,但你不要被它迷惑了。Steve Krug在这本书里谈到了“可用性”所有的重要概念,而且入木三分。这本书读起来很有乐趣。如果“可用性”方面的书你只打算读一本,那就选这本吧!这本书包含有丰富的信息,而且以一种简洁、切实可行的方式展现在读者面前。它广泛适合于各类群体阅读,包括技术人员、非技术人员、用户、开发者、管理人员等等。
看一看下面的几幅漫画吧。是不是很纠结?永远也不要参加那样的会议!顺便说一下,解决这个问题的方法就是“可用性测试”。好好想一想:我们做决定的时候,是要无休无止地争吵、最后谁吵赢了谁说了算呢,还是要基于真实的数据?这种改变是一场革命!
英文版:《Rapid Development》
中文版:《快速软件开发》
作者:Steve McConnell
译者:席相霖等
出版社:电子工业出版社
出版日期:2002年1月
Jeff Atwood的推荐:这本书完整的标题应该是《快速软件开发——有效控制与完成进度计划》。我故意没把它写全,不仅仅因为副标题太长了、有点唐突,还因为它确实不怎么恰当。
这本书其实不是关于快速软件开发的。它讲的是失败的现实。绝大部分软件开发项目都会失败——他们的开发进度滞后于计划,做出来的东西不符合要求,甚至有时候根本就没有完成。这已经不存在争议了,因为它是一个统计事实。令人不快的现实是,你的团队必须非常优秀才能避免失败,要想成功概率就更小了。尽管这听起来让人沮丧——没错,现实让人很沮丧——但你还是要读一读这本书。
为什么呢?因为如果你能避免重复去犯你或者其他人犯过的错误,你就已经成功了一半。(严格来说,书里面说是成功了四分之一。但是,我觉得应该会更多一点。)这本书可以给我们的启示是,犯错误是好事,只要这些错误是全新的、活蹦乱跳的(可能会重复发生)。如果你一直在犯同样的错误,其实你在一开始就已经失败了。可悲的是,你对你正在犯的错误可能还浑然不知。
在我们的领域里,“惟一不变的就是变化”。这样的领域是不多的,而我们很不幸就身处其中。因此,我们惟一能做的就是拥抱变化,并且尝试各种不同的“快速”开发技巧。但不要走极端!我们不能假设:“自1970 年以来发生的变化是如此之大,以致于跟我们最新、最热门的技术比起来,所有的传统软件开发经验都已经过时、毫无用处了。”还是那个说法:计算机已经变了,但人没有变。在你开始做任何事之前,至少了解一下什么是行得通的、什么是行不通的。拿Steve McConnell的话来说,“在开始刷漆之前要先读一读油漆罐上的说明。”这听起来似乎是理所当然的,但在读了这本书之后你就会发现,我们领域里真正那样做的人简直就是凤毛麟角。
英文版:《Peopleware》
中文版:《人件》
作者:Tom DeMarco / Timothy Lister
译者:UML China翻译组
出版社:清华大学出版社
出版日期:2003年6月
Jeff Atwood的推荐:如果你曾经亲眼目睹一支全明星运动队在一个糟糕教练的带领下表现平平,你一定会喜欢这本书。不管你有多少“编程高手”,如果他们相互之间没有沟通,或者互不认同,结果你还是会失败。这本书还指出,不管开发人员多么有天赋,如果他们持续不断地受到各种干扰(哪怕干扰很细微),没有人能在这种情况下有效地开展工作。说白了,开发人员在人际技能方面并不见长,但具有讽刺意味的是:项目成功与否常常取决于人际的问题。如果你渴望成为真正的“团队领导”(而不是徒有虚名),你必须好好地读一读这本书。
尽管这本书里充斥着绝妙的、完全正确的观点,但它也暗示了:员工需要对工作场所有一定的控制权——这在大部分公司里完全是痴心妄想。不过,至少你会认识到,工作环境或你的团队有时候就是症结所在。更重要的是,你将学会如何去处理这些情况。
英文版:《The Design of Everyday Things》
中文版:《设计心理学》
作者:Donald A.Norman
译者:梅琼
出版社:中信出版社
出版日期:2010年3月
Jeff Atwood的推荐:开发软件可能给人带来难以置信的挫折感,因为过程中有太多的陷阱。我们所做的事中很多都是带有预防性质的:在一件事情还没出错之前,先试想它将会出错。这能使人心智衰弱,而且最终可能以一些负面的方式让人“心想事成”。在向不懂技术的人解释的时候,我有时候会说:这就像制造一块有1000个零件组成的手表一样,在哪怕最轻微的震动之下,任何一个零件都可能随机出错。这真是一份“好差事”啊!
毫无疑问,设计软件是很难的。但是,设计一扇门也是很难的。不管是热门的SQL引擎,还是卑微的鞋子,设计的细微差别会渗入你能触摸到的每一个角落。“魔鬼藏在细节之中。”读过这本书之后,你将对这句话有一个全新的体会。如果设计一扇门不像我们当初想的那样不费吹灰之力,也许我们也该停下来想一想了:为什么我们设计不出完美的软件呢?
英文版:《About Face 3: The Essentials of Interaction Design》
中文版:《About Face 3:交互设计精髓》
作者:Alan Cooper / Robert Reimann / David Cronin
译者:刘松涛
出版社:电子工业出版社
出版日期:2012年3月
Jeff Atwood的推荐:Alan Cooper是“Visual Basic之父”,他还是“可用性”方面的教父。说实话,我是很多年前读的这本书。这本书大约在1995年第一次出版,我就是在那时候买的。也就是说,我买的是最“老”的第一版。而如今已是第三版了!(用新版淘汰旧版,这可以认为是一种糟糕的可用性吗?)
在展现风格一致的图形用户界面方面,这本书和《GUI设计禁忌》一起被认为是具有教育性质的规则手册。但这本书满满地记录了更为通用的指导原则。在用来做范例的GUI问题中(很多都是古老的Windows 95界面),评判一下哪些已经基本被解决了(使用可视化的方式来展示对话框选择的效果)以及哪些还没有被解决(白痴的模态对话框让程序中止运行),这其实挺有趣的!
与《GUI设计禁忌》不同的是,这本书是在互联网应用盛行之前写的,因此它没有讨论到Web应用以及Web对GUI设计的影响。但这不要紧,它仍然是一本非常有用的书。在最近的一个.NET项目中,我在错误消息的处理方面所遵循的模型就源自于这本书。
英文版:《The Inmates Are Running the Asylum: Why High Tech Products Drive UsCrazy and How To Restore The Sanity》
中文版:《交互设计之路——让高科技产品回归人性》
作者:Alan Cooper
译者:Chris Ding(丁全钢)
出版社:电子工业出版社
出版日期:2006年3月
Jeff Atwood的推荐:Alan Cooper就是从这本书开始给大家推介了“人物角色”这个概念:与其把用户想象成抽象的、难以描述的、琢磨不透的一群人,还不如用“人物角色”来促使我们谈论一些具体的用户,他们有名字、有个性、有需求、也有目标。我们的用户想要一个打印预览的功能吗?谁知道呢?但如果作为客户经理的Gerry Manheim必须每周打印他的费用报告(这是他工作的一部分),你最好相信打印预览功能是必需的。其实没什么神奇的;像以前一样,归根结底你还是要知道你的用户是谁,以及他们真正想要的是什么——“人物角色”这个方法用来达到那个目的是再适合不过的了。
书里面还有一个有趣的分析:开发者倾向于认为自己能够代表“普通”用户来做出“可用性”方面的决定,但实际上,他们根本就不够格。开发者充其量只能算是异想天开的极端用户——“逻辑人”与“智人”的对抗。除非你碰巧是在开发一个编译器,而开发者正是最终用户……
这本书里还有一个容易被人忽视的“教训”:有时候,不管你的设计有多么优秀,你还是可能会失败。Alan Cooper在书中举了两个例子——一个是扫描仪软件,另一个是Web应用软件——Alan参与了咨询工作,事实也证明它们都是非常出色的软件,但因为某些原因它们没有取得商业上的成功,而这些原因跟“可用性”没有任何关系。有时候,不管你多么努力,伟大的产品还是会因为一些不受你控制的原因而失败。记住这些案例吧,不要被书里有些地方自鸣得意的论调冲昏了头脑!(顺便说一下,书中提到的“放在键盘后面的”USB扫描仪,我恰好也买过一个。我对它附带的扫描软件印象非常好。后来,我把这个扫描仪送给了我父亲。有一次我和父亲通电话的时候,在没有任何暗示的情况下,他居然向我说起了他非常非常喜欢那个扫描软件。这还是发生在这本书出版以前的事呢!)
不管怎么样,这是Alan Cooper的另一本杰作,它也是《About Face》的合理进化。在《About Face》里,Alan把目标用户都看成是“中庸的”;而在这本书里,他提炼出了更具体、也更容易在实践中应用的“人物角色”。
英文版:《GUI Bloopers》
中文版:《GUI设计禁忌》
作者:Jeff Johnson
译者:王蔓 刘耀明
出版社:机械工业出版社
出版日期:2005年2月
Jeff Atwood的推荐:遥想微软的Windows 95和苹果的System 7流行之时,那时候还真有一些关于GUI(图形用户界面)的设计准则。这本书就收录了这些核心准则,包括菜单上的省略号、对话框上按钮和文字的对齐方式等等。但有多少用户能真正理解这些准则呢?这是有争议的。不过,如果你遵循这些准则,你至少可以期望A程序的用户界面会跟B程序的表现得很相似。现如今,网络内容的表现形式鱼龙混杂,特别是每天都会有一些Flash设计新手另起炉灶,标新立异地自创一套GUI。因此,温故一下这门“经典的”关于GUI设计准则的课程还是很有好处的。
事实上,传统的GUI风格和基于浏览器的风格正在渐渐融合,它们彼此之间取长补短。现在,你会发现有很多桌面应用程序都采用了酷似浏览器的界面风格。这就是所谓的“引导性用户界面”(Inductive User Interface)。依稀记得大概是在2000年,我在Microsoft Money(一款财务管理软件)上第一次看到了这种界面风格。你应该能在WindowsVista、Windows7、Windows 8上看到更多的这种变化。
英文版:《Programming Pearls》
中文版:《编程珠玑》
作者:Jon Bentley
译者:谢君英 石朝江
出版社:中国电力出版社
出版日期:2004年3月
Jeff Atwood的推荐:对于是否要推荐这本书,我曾经犹豫过,因为它包含了一些非常底层的编码技术。但这本书里同时也蕴藏了相当多的软件工艺方面的“珍珠”,这使得它仍然值得所有开发者都去读一读。任何包含下面这种图片的图书都是很有价值的宝书。它就用来展示TRS-80与DEC Alpha之间48n比n3的算法复杂度差异吗?兄弟,拜托……没有比那更好的了!如果你不能幸运地跟一位大师级的程序员并肩而坐,并且在一起工作大约一年的时间,那么买一本《编程珠玑》就是退而求其次的最佳选择了。这本书是集体智慧的结晶,凝聚了很多技能娴熟的程序员的贡献,并最终汇编成了一个个精粹而容易被人理解的专题栏目。
我不想骗你!其实,这本书的很多章节你都可以忽略。比如说,像第11、13和14章谈到的排序、堆或者哈希算法,当今有很多成熟的库早已实现了这些基本技术,我想不出任何理由你需要去把它们重新实现一遍。但对于每一个枯燥的课本练习,这本书的确给出了一些实用的建议。你尽可以快速翻阅这本书,碰到有代码的部分就跳过去……听我的准没错!第7章“封底计算”是要点,那也许是我曾见过的在“估算”这个专题上最好的论述。它还用很大的篇幅去解释了那些疯狂的面试问题,而一些公司往往热衷于用那些问题来考验我们……
如果你还在犹豫,建议你到网上去读一读这本书的样章。最近,我把从“珍珠字符串”那一章学到的东西付诸实践,我在生成合成数据填入一个空数据库的时候使用了马尔科夫链——这也证明了在“封底计算”那一章谈到的性能估算技术。
英文版:《The Pragmatic Programmer: From Journeyman to Master》
中文版:《程序员修炼之道:从小工到专家》
作者:Andrew Hunt / David Thomas
译者:马维达
出版社:电子工业出版社
出版日期:2011年1月
Jeff Atwood的推荐:这本书让我想起了《编程珠玑》里的很多内容,但它事实上比《编程珠玑》更好,因为它不再拘泥于代码。作者摆脱了代码的束缚,转而专注于真实世界里已经被证明切实可行的方法,并把它们统统都收录进了这本书。严格来说,不是所有的事情都跟编程有关系。比如,自问“我为什么要做这件事?它究竟值得去做吗?”并不算是创意性思维,你恰恰应该每天都这么问问自己,以使你和你的同事始终保持清醒的头脑。这也正是这本书的可贵之处!
如果你想对这本书做更多的了解,你可以去看一看我在博客网站上发表的那篇“A Pragmatic Quick Reference”。那篇文章很好地概括了这本书的内容,它也可以作为你“修炼”时候的便捷参考。
英文版:《Designing Web Usability》
中文版:《Web可用性设计》
作者:Jakob Nielsen
译者:潇湘工作室
出版社:人民邮电出版社
出版日期:2000年11月
Jeff Atwood的推荐:Jakob Nielsen因为创办了关于“可用性”的网站(http://www.nngroup.com)而名噪一时。自从他在1989年出版了第一本书以来,他便开始了可用性专家的职业生涯。这是一本不折不扣的关于Web可用性设计的初级读本,因此跟Alan Cooper专注于GUI的图书还是有些不一样的。
信息多美丽!设计优良的GUI也是这样。
这个系列的3本书你不必都买,除非你是一个完美主义者(我猜你也许是个受虐狂),但前两本是很关键的。
Chris Sells曾经在2004年6月参加过Edward R. Tufte的一次研讨会,之后他对Tufte的图书发表了一些很有意思的见解。详见http://www.sellsbrothers.com。
英文版:《Mastering Regular Expressions》
中文版:《精通正则表达式》
作者:Jeffrey E.F.Friedl
译者:余晟
出版社:电子工业出版社
出版日期:2012年7月
Jeff Atwood的推荐:UNIX因为其复杂、令人费解而臭名昭著。正则表达式与它同病相怜。
我应该算得上是“保持通俗易用”俱乐部的正式会员,但我要为正则表达式破一回小例。如果正则表达式书写得当的话,它们可以在字符串操作方面为你节省大把大把的时间。我还从来没碰到过一个正则表达式派不上用场的项目呢!
一旦你钻进正则表达式的世界,你可能会沉醉于它们惊人的力量和潜能。请记住,绝对的权力导致绝对的腐败。不过,它也绝对可以让你酷毙了!