猜你喜欢
程序员修炼之道:通向务实的最高境界(第2版)

程序员修炼之道:通向务实的最高境界(第2版)

书籍作者:[美] David ISBN:9787121384356
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:9912
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

《程序员修炼之道》之所以在全球范围内广泛传播,被一代代开发者奉为圭臬,盖因它可以创造出真正的价值:或编写出更好的软件,或探究出编程的本质,而所有收获均不依赖于特定语言、框架和方法。时隔20年的新版,经过全面的重新选材、组织和编写,覆盖哲学、方法、工具、设计、解耦、并发、重构、需求、团队等务实话题的最佳实践及重大陷阱,以及易于改造、复用的架构技术。本书极具洞察力与趣味性,适合从初学者到架构师的各阶层读者潜心研读或增广见闻。


编辑推荐

√ 屹立 20 年影响力大作,成功案例数以千万计,凌驾于任何语言|框架|方法之上。

√ 面向未来重写全部内容,从程序员责任与职业发展,到灵活|易适配|可重用架构。

√ 53个核心话题|99个高能提示,阐明软件开发走向卓越之路及途中各种典型陷阱。

√ 编程界传奇人物云风操刀翻译,至理|奥义|案例|技巧之原著精微,无不掘至毫巅。

◎与“软件腐烂”做斗争

◎持续学习

◎避免知识重复的陷阱

◎写出有弹性、动态、适配性强的代码

◎驾驭基本工具的力量

◎避免依赖巧合编程

◎学习真正的需求

◎解决并发代码的底层问题

◎防范安全漏洞

◎建立务实程序员构成的团队

◎对你的工作和事业负责

◎无情而有效地做测试,包括基于特性的测试

◎组建务实的入门套件

◎取悦你的用户

前言

新版前言

在20世纪90年代,我们在与一些项目存在问题的公司合作时,发现总是在对每个人说同样的话:也许你应该在发布之前先测试一下。为什么代码只能在 Mary 的机器上构建?为什么没有人问一下用户呢?

为了节省与新客户打交道的时间,我们开始做笔记。这些笔记最终变成了《程序员修炼之道》这本书。令人惊讶的是,这本书似乎引起了大家的共鸣,在过去的二十年间,这本书一直很受欢迎。

但是二十年对于软件领域来说已经过了好几代。如果一个开发者从 1999 年直接穿越到今天的团队中,面对这个陌生的新世界一定会备感挣扎。但20世纪90年代的世界对今天的开发者来说同样陌生。书中所引用的 CORBA、CASE 工具,以及索引、循环这些东西,放在今天,充其量不过略显古雅有趣,而更多的会给人带来困扰。

与此同时,二十年对常识没有丝毫影响。技术可能改变了,但人没有。实践和方法中的闪光点,在今天看来光芒依旧。在这些方面,本书保鲜如初。

所以,当我们要出版这本二十周年纪念版的时候,必须做出抉择——是回顾和更新前一版中引用的技术后就大功告成,还是充分借鉴这平添的二十年丰富经验,重新审视前一版所推崇的实践背后的种种假设。

最终,我们两者都做了。

因此,这本书有点像忒修斯之船。书中大约三分之一的主题是全新的,而其余的大部分都被部分或全部重写了。我们的目的是,让内容变得更清晰、更贴切,并在某种程度上不受时间的影响。

我们做了一些艰难的决定。删除了参考资料附录,这样做既因为它无法持续更新,也因为当你有此需要时很容易就能搜索获得。我们重新组织了与并发有关的主题,这是因为考虑到当前有着大量的并行硬件,却缺乏处理并行的好方法。我们还添加了一些内容来反映不断变化的认知和环境,从我们帮助发起的敏捷运动,到对函数式编程语境的日益接受,再到对隐私和安全性方面日益增长的需求。

然而有趣的是,我们之间关于版本内容的争论比写第一个版本时要少得多。重要的东西更容易辨别,这已是我们的共识。

无论如何,这本书最后就是这个样子了,请享用吧。你也许可以从中吸取一些新的做法,也许会觉得我们建议的某些东西是错的,不妨把它们都带到你的工作中去,然后给我们反馈。

但是,最重要的是,记住过程要开心。

这本书是如何组织的

这本书是许多短小主题的合集。每一个主题都针对特定的话题而独立成章。你会发现大量的交叉引用,这有助于把各个主题连贯起来。你可以以任意次序随意阅读这些主题——这不是一本需要从头到尾阅读的书。

偶尔你会看到一个写有提示n的框起来的标签块(比如位于第XVII页的提示1:关注你的技艺)。这些提示不仅是文中的重点,在我们眼里也是一条条生命——我们每天都赖以为生。

我们已尽可能适时地在书中加入了练习和挑战。练习通常有相对简单的答案,而挑战则更加开放。为了让你理解我们的思维方式,在附录里我们列出了这些练习的答案,但是拥有唯一正确答案的问题并不多。挑战或许能用于高级编程课程中的小组讨论,或许能作为论文写作的基础。

本书还有一个简短的参考文献,列出了我们明确引用的图书和文章。

名字有什么含义

“我用一个词,”矮胖子相当傲慢地说,“总是同我想要说的恰如其分的,既不重,也不轻。”

—— 路易斯·卡罗《爱丽丝镜中奇遇》

在整本书中,你会发现各种各样的行话——要么原本是完好的英语单词,却被曲解为技术词,要么是一些可怕的合成词,由那些对语言充满怨恨的计算机科学家赋予其意义。当我们第一次使用这些行话时,会尝试定义它们,或者至少对其含义给出解释。当然,肯定还有漏网之鱼,而且像对象和关系型数据库这种已被广泛使用的,再下一次定义就有点画蛇添足了。如果你遇到一个以前没见过的术语,请不要跳过它,不妨花点时间去查一下,可以在网上查,也可以在计算机科学的课本上查。如果有机会还可以给我们发邮件投诉,这样我们就可以在本书下一版中增加一个定义。

既然话已至此,我们决定报复一下计算机科学家。有时候,明明有一些非常好的术语,对某个概念表达得很好,但我们却决定不使用这些术语。为什么?因为现有的术语通常局限于特定的问题领域,或者特定的开发阶段。而本书的基本哲学之一就是,我们推荐的大多数技术都是通用的:例如模块化,它就能同时适用于代码、设计、文档和团队组织。当某个传统术语被拿来在更广泛的场景下使用时,却会造成困惑——我们似乎无法摆脱该术语从最初就开始背负的历史包袱。当这种情况发生时,我们只好发明自己的术语,助纣为虐地让语言继续堕落。

源码与其他资源

本书中的大部分代码都是从可编译的源文件中提取出来的,这些源文件可以从我们的网站上下载。

在那里,你还可以找到我们认为有用的资源链接、本书的更新内容,以及其他有关《程序员修炼之道》项目进展的新闻。

给我们反馈

收到你的来信我们会很高兴。我们的电子邮件地址是 [email protected]

第二版鸣谢

在过去的二十年里,有成千上万关于编程的有趣对话曾让我们开心不已,其中不乏在会议、课程,甚至是飞机上与人们的偶遇。每一次经历,都会加深我们对开发过程的理解,并为此版本的更新添砖加瓦。感谢所有人(而且,当我们犯错误的时候,请继续提醒)。

感谢本书 Beta 测试过程的参与者,是你们的问题和评论,帮助我们把事情解释得更清楚。

在进行 Beta 测试之前,我们曾与一些人分享过本书。感谢 VM (Vicky) Brasseur、 Jeff Langr、 Kim Shrier 给予的详细评论,感谢 José Valim 与 Nick Cuthbert 的技术审核。

感谢 Ron Jeffries 让我们用数独的例子。

非常感谢培生集团的人,是他们让我们以自己的方式来创作这本书。

特别感谢不可或缺的 Janet Furlow,她掌控着一切,让我们的工作没有走样。

最后,向所有在过去的二十年里一直致力于让编程变得更好的务实的程序员们发出一声呐喊:再接再厉,更创二十年辉煌。

目录

序 XVII

新版前言 XXI

第一版前言 XV

提示1:关注你的技艺 XVII

如果你不关心怎么做好,为什么还要花时间去开发软件呢?

提示2:思考!思考你的工作 XVII

关掉辅助驾驶,由自己掌控,持续不断地评估所做的工作。

第1章 务实的哲学 1

1 人生是你的 2

提示3:你有权选择 3

人生是自己的。把握住人生,让它如你所愿。

2 我的源码被猫吃了 3

提示4:提供选择,别找借口 5

提供选择而不是去找理由。不要只说做不到;解释一下都能做些什么。

3 软件的熵 6

提示5:不要放任破窗 7

只要看到不好的设计、错误的决策、糟糕的代码,就赶紧去纠正。

4 石头做的汤和煮熟的青蛙 9

提示6:做推动变革的催化剂 10

你无法强迫人们去改变,但可以展示美好未来,并帮助他们参与创造。

提示7:牢记全景 10

不要过度沉浸于细枝末节,以免察觉不到周围正在发生的事情。

5 够好即可的软件 11

提示8:将质量要求视为需求问题 12

让用户参与对项目真实质量需求的确定。

6 知识组合 14

提示9:对知识组合做定期投资 16

养成学习的习惯。

提示10:批判性地分析你读到和听到的东西 18

不要受供应商、媒体炒作或教条的影响,根据自身和项目的实际情况来分析信息。

7 交流! 20

提示11:英语就是另一门编程语言 20

将英语视作一门编程语言。写文档和编程一样要遵循 DRY 原则、ETC、自动化等。

提示12:说什么和怎么说同样重要 23

如果无法有效交流,任何伟大的想法都是没有意义的。

提示13:把文档嵌进去,而不要栓在表面 24

与代码隔离的文档,很难保持正确并及时更新。

第2章 务实的方法 27

8 优秀设计的精髓 28

提示14:优秀的设计比糟糕的设计更容易变更 28

适合使用者的事物,都已经过良好设计。对代码来说,这意味着必须适应变化。

9 DRY——邪恶的重复 30

提示15:DRY——不要重复自己 31

系统中的每一条知识,都必须有单一且无歧义的权威陈述。

提示16:让复用变得更容易 39

只要复用方便,人们就会去做。创建一个支持复用的环境。

10 正交性 40

提示17:消除不相关事物之间的影响 41

设计的组件,需要自成一体、独立自主,有单一的清晰定义的意图。

11 可逆性 48

提示18:不设最终决定 50

不要把决定刻在石头上,而要将其视为写在沙滩上的东西,时刻准备应变。

提示19:放弃追逐时尚 50

尼尔·福特说过:“昨日之最佳实践,即明日之反模式。”要基于基本原则去选择架构,而不应盲从于流行。

12 曳光弹 51

提示20:使用曳光弹找到目标 53

通过不断尝试并看清着弹点,曳光弹可确保你最终击中目标。

13 原型与便签 57

提示21:用原型学习 58

制作原型旨在学习经验,其价值不在于过程中产生的代码,而在于得到的教训。

14 领域语言 60

提示22:靠近问题域编程 61

用问题领域的语言来做设计和编程。

15 估算 67

提示23:通过估算来避免意外 67

开始之前做估算,能提前发现潜在问题。

提示24:根据代码不断迭代进度表 72

利用实施过程中获得的经验来精细化项目的时间尺度。

第3章 基础工具 74

16 纯文本的威力 75

提示25:将知识用纯文本保存 76

纯文本不会过时。它能够让你的工作事半功倍,并能简化调试和测试工作。

17 Shell游戏 79

提示26:发挥 Shell 命令的威力 80

当图形化界面无法胜任时,使用 Shell。

18 加强编辑能力 82

提示27:游刃有余地使用编辑器 82

既然编辑器是至关重要的工具,不妨了解一下如何用它更快更准确地实现需求。

19 版本控制 85

提示28:永远使用版本控制 87

版本控制为你的工作创造了一个时间机器,可以用它重返过去。

20 调试 90

提示29:去解决问题,而不是责备 91

Bug 到底来自你的失误还是别人的失误真的不重要——它终究是你的问题,需要你来修复。

提示30:不要恐慌 91

不管是对银河系搭车客,还是对开发者来说,都应这样。

提示31:修代码前先让代码在测试中失败 93

在你修 Bug 前,先创建一个聚焦于该 Bug 的测试。

提示32:读一下那些该死的出错信息 93

大多数异常都能告诉失败之物与失败之处。如果足够幸运,你甚至能得到具体的参数值。

提示33:“select”没出问题 97

在操作系统或编译器中发现 Bug 非常罕见,甚至在第三方产品或库中也是如此。Bug 大多出现在应用程序中。

提示34:不要假设,要证明 97

在真实环境中证实你的假设——要依赖真实的数据及边界条件。

21 文本处理 99

提示35:学习一门文本处理语言 99

既然每天都要花大量的时间与文本打交道,何不让计算机帮你分担一二?

22 工程日记 101

第4章 务实的偏执 103

提示36:你无法写出完美的软件 103

软件不可能是完美的。对于在所难免的错误,要保护代码和用户免受其影响。

23 契约式设计 104

提示37:通过契约进行设计 107

代码是否不多不少刚好完成它宣称要做的事情,可以使用契约加以校验和文档化。

24 死掉的程序不会说谎 113

提示38:尽早崩溃 114

彻底死掉的程序通常比有缺陷的程序造成的损害要小。

25 断言式编程 115

提示39:使用断言去预防不可能的事情 115

如果一件事情不可能发生,那么就用断言来确保其的确不会发生。断言在校验你的假设,要使用断言在不确定的世界中将你的代码保护起来。

26 如何保持资源的平衡 119

提示40:有始有终 119

只要有可能,对资源进行分配的函数或对象就有责任去释放该资源。

提示41:在局部行动 122

将易变的变量维持在一个范围内,打开资源的过程要短暂且明显可见。

27 不要冲出前灯范围 127

提示42:小步前进——由始至终 127

永远小步前进,不断检查反馈,并且在推进前先做调整。

提示43:避免占卜 129

只在你能看到的范围内做计划。

第5章 宁弯不折 130

28 解耦 131

提示44:解耦代码让改变更容易 132

耦合使事物紧紧绑定在一起,以至于很难只改变其中之一。

提示45:只管命令不要询问 133

不要从对象中取出值,在加以变换后再塞回去,让对象自己来完成这些工作。

提示46:不要链式调用方法 135

当访问某事物时,使用的点号不要超过一个。

提示47:避免全局数据 137

最好给每个方法增加一个额外的参数。

提示48:如果全局唯一非常重要,那么将它包装到API 中 137

……但是,仅限于你真的非常希望它是全局的。

29 在现实世界中抛球杂耍 139

30 变换式编程 149

提示49:编程讲的是代码,而程序谈的是数据 151

所有的程序都在变换数据——将输入转换为输出。开始用变换式方法来设计吧!

提示50:不要囤积状态,传递下去 156

不要把数据保持在函数或模块的内部,拿出来传递下去。

31 继承税 162

提示51:不要付继承税 165

考虑一下能更好满足需求的替代方案,比如接口、委托或mixin。

提示52:尽量用接口来表达多态 167

无需继承引入的耦合,接口就能明确描述多态性。

提示53:用委托提供服务:“有一个”胜过“是一个” 167

不要从服务中继承,应该包含服务。

提示54:利用 mixin 共享功能 169

mixin 不必承担继承税就可以给类添加功能,而与接口结合可以让多态不再令人痛苦。

32 配置 170

提示55:使用外部配置参数化应用程序 170

如果代码对一些在应用程序发布后还有可能改变的值有所依赖,那么就在应用外部维护这些值。

第6章 并发 174

33 打破时域耦合 175

提示56:通过分析工作流来提高并发性 176

利用用户工作流中的并发性。

34 共享状态是不正确的状态 179

提示57:共享状态是不正确的状态 180

共享状态会带来无穷的麻烦,而且往往只有重启才能解决。

提示58:随机故障通常是并发问题 186

或许时间和上下文的变化能暴露并发Bug,但并发Bug无法始终保持一致,也很难重现。

35 角色与进程 187

提示59:用角色实现并发性时不必共享状态 188

使用角色来管理并发状态,可以避免显式的同步。

36 黑板 193

提示60:使用黑板来协调工作流 195

使用黑板来协调不相关的事实和代理人,能同时保持参与者之间的独立性和孤立性。

第7章 当你编码时 198

37 听从蜥蜴脑 199

提示61:倾听你内心的蜥蜴 201

当编程举步维艰时,其实是潜意识在告诉你有什么地方不对劲。

38 巧合式编程 204

提示62:不要依赖巧合编程 207

只能依赖可靠的事物。注意偶然事件的复杂性,不要混淆快乐的巧合与有目的的计划。

39 算法速度 210

提示63:评估算法的级别 214

在开始编程前,对这件事情大概会花多长时间要有概念。

提示64:对估算做测试 214

针对算法的数学分析无法说明所有问题,尝试在目标环境中测试一下执行代码的耗时。

40 重构 216

提示65:尽早重构,经常重构 219

像除草和翻整花园那样,只要有需要就对代码进行重新编写、修订和架构,以便找到问题的根源并加以修复。

41 为编码测试 220

提示66:测试与找 Bug 无关 221

测试是观察代码的一个视角,可以从中得到针对设计、接口和耦合度的反馈。

提示67:测试是代码的第一个用户 222

用测试的反馈来引导工作。

提示68:既非自上而下,也不自下而上,基于端对端构建 225

创建一小块端到端的功能,从中获悉问题之所在。

提示69:为测试做设计 228

写下代码之前先从测试角度思考。

提示70:要对软件做测试,否则只能留给用户去做 230

无情地测试,不要等用户来帮你找 Bug。

42 基于特性测试 231

提示71:使用基于特性的测试来校验假设 231

基于特性的测试将会进行你从未想过的尝试,并会以你不曾打算采用的方式操练你的代码。

43 出门在外注意安全 238

提示72:保持代码简洁,让攻击面最小 241

复杂的代码给 Bug 以滋生之沃土,给攻击者以可趁之机。

提示73:尽早打上安全补丁 243

攻击者会尽可能快地部署攻击,你必须快上加快。

44 事物命名 245

提示74:好好取名;需要时更名 249

用名字向读者表达你的意图,并且在意图改变时及时更名。

第8章 项目启动之前 251

45 需求之坑 252

提示75:无人确切知道自己想要什么 252

他们或许知道大概的方向,但不会了解过程的曲折。

提示76:程序员帮助人们理解他们想要什么 253

软件开发更像是一种由用户和程序员协同创造的行为。

提示77:需求是从反馈循环中学到的 254

理解需求需要探索和反馈,因此决策的结果可以用来完善最初的想法。

提示78:和用户一起工作以便从用户角度思考 255

这是看透系统将如何被真正使用的最佳方法。

提示79:策略即元数据 256

不要将策略硬编码进系统,而应该将其表达为系统的一组元数据。

提示80:使用项目术语表 259

为项目的所有特定词汇创建一张术语表,并且在单一源头维护。

46 处理无法解决的难题 260

提示81:不要跳出框框思考——找到框框 261

在面对无法解决的难题时,识别出真正的约束。可以问自己:“必须这样做才能搞定吗?必须搞定它吗?”

47 携手共建 264

提示82:不要一个人埋头钻进代码中 267

编程往往困难又费力,找个朋友和你一起干。

提示83:敏捷不是一个名词;敏捷有关你如何做事 267

敏捷是一个形容词,有关如何做事情。

48 敏捷的本质 267

第9章 务实的项目 271

49 务实的团队 272

提示84:维持小而稳定的团队 272

团队应保持稳定、小巧,团队中的每个人都应相互信任、互相依赖。

提示85:排上日程以待其成 274

如果你不把事情纳入日程表,它们就不会发生。反思、实验、学习、提高技能,这些事都应放入日程表。

提示86:组织全功能的团队 276

围绕功能而不是工作职能组织团队。不要将 UI/UX 设计者从程序员中分离出去,也不要分开前端和后端;不要区分数据建模者和测试人员,以及开发和设计。构建一个团队,这样你就可以渐进地不断迭代端到端的代码。

50 椰子派不上用场 277

提示87:做能起作用的事,别赶时髦 279

不要仅仅因为别的公司正在那么干就采纳一项技术或采用一个开发方法,而是要采用自己所处环境中对团队有效的东西。

提示88:在用户需要时交付 281

不要卡着流程要求,刻意等到几周甚至几个月后才交付。

51 务实的入门套件 281

提示89:使用版本控制来驱动构建、测试和发布 282

利用提交或推送来触发构建、测试、发布,利用版本控制的标签来进行生产部署。

提示90:尽早测试,经常测试,自动测试 283

每次构建都跑一下的测试,要比束之高阁的测试计划有效得多。

提示91:直到所有的测试都已运行,编码才算完成 283

无须多言。

提示92:使用破坏者检测你的测试 285

在一个单独的源码副本中特意引入 Bug,验证测试能否将其捕获。

提示93:测试状态覆盖率,而非代码覆盖率 286

要识别并测试重要的程序状态,只测试一行行的代码是不够的。

提示94:每个 Bug 只找一次 286

只要人类测试者找到一个 Bug ,就应该是该 Bug 最后一次被人类发现。从此之后,自动化测试完全可以发现它。

提示95:不要使用手动程序 287

计算机能一次又一次,按照同样的次序,执行相同的指令。

52 取悦用户 288

提示96:取悦用户,而不要只是交付代码 289

为用户开发能够带来商业价值的解决方案,并让他们每天都感到愉快。

提示97:在作品上签名 290

过去的工匠在为他们的作品签名时非常自豪,你也应该这样。

53 傲慢与偏见 290

跋 292

提示98:先勿伤害 293

犯错在所难免,确保犯错后没人会因此受难。

提示99:不要助纣为虐 294

因为这样做你也有变成纣王的风险。

参考文献 295

练习的参考答案 297

译者跋 312


短评

如果你喜欢本书的第一版,那么一定要读这个新的版本。

2020-03-30

我读过5遍信不信,每个字都磨出了感情……爱看技术书的程序员,看看可以往上走走;不爱看技术书的程序员,看看可以轻松刷出阅读成就感。

2020-03-30

程序员修炼之道:通向务实的最高境界(第2版)的书评

其实两年之前(那是我还在上大三)就曾在书店里看到这本书,当时可能是被书名所蛊惑吧,看到"修炼之道"这四个字就感觉这本书书名太唬,拿起来翻了翻也没看到什么有关"修炼"的实质内容,于是就将它搁置了。 两年的时间里,实习和工作让我积攒起了一定的代码量和项目经验,同时...

2010-03-02 21:54:53

1 我的源码让猫给吃了 不要寻找借口,从自身找原因 2 软件的熵 一句话:不以善小而不为,勿以恶小而为之. 从初期就要做好规范,不要因为是poc这样的前提而放松对代码的规范,现在的项目就 有这种问题,初期的时候有人认为(自己也有这种想法)等到以后正式开发的时候再规范 ,而往往还...

2009-11-12 19:35:33

<>中文版的书名被译作《程序员修炼之道》,这倒和原书的副标题“From Journeyman to Master”有些贴切,按照书中的指点修炼,不说变为大师,成为一个“靠谱”的程序员应该问题不大。 <>出版于1999年,距今已有接近10年...

2010-01-06 15:12:54

很久以前买的这本书,忘记在哪里看到这部书的推荐了,有大牛很卖力的推荐,于是去买了一本。 坦白讲,那个时候自己是完完全全的菜鸟,从大学里出来,除了会编程啥也不懂,这本书在当时真的是指路明灯。 书中的道理很浅显,可是对于菜鸟却是至理名言。基本为你勾勒了一个成熟...

2009-11-30 16:21:46

都说这书很好,机缘巧合我跟利未借了这本书。 我想从这本书找找有没有适合美术的修炼之道。 读的过程中,我发现的确有,而且老外归纳总结的很有条理。 分享如下: 关于个人的修炼 1、保持技术直觉,喜爱尝试并接受新事物 2、保持好奇心,喜欢提问 3、批判的思考者,不要盲从 ...

2009-12-02 09:35:16

如果自己开公司给员工培训的话,朋友的观点是要给程序员培训算法。 我认为第一个要讲的就是这本书的内容,第二个就是时间管理。其实在程序员修炼之道里,就有很多关于时间管理的内容,它们是相互补充的。比如程序员的美德——懒惰,就是要提高效率,就是要节约时间。 为什么不...

2008-12-09 20:43:07

我大约是在高二或者高一的时候在学校附近的一个书店里看到的这本书, 只要在这间书店押100元, 就可以在这里借书回去看。《程序员修炼之道》,听这名字就感觉不错。 我把它拿回家,封面很深沉,纸张手感很好,排版也更不用说。那个时候我刚开始学C语言,而这本书...

2009-11-08 10:49:02

这本书翻译很好。当然,由于文化背景的原因,有些东西,本来很流畅可读的,译成中文,就不那么生动了,这也是事实。不过,不能怪译者,目前的水平已经难能可贵了。前人早已说过,Poetry is what gets lost in translation.(Frost?) 注意,我是此书出版社的竞争者,完全没有必...

2007-09-17 18:14:59

记得四年前刚开始工作时从公司拿到的第一本书,就是这本《程序员修炼之道》(英文版),作为新入职员工study group的学习材料,当时在senior engineer带领下和其他同事一起学习了这本书。虽然之前就听说这是一本好书,当时看的时候也只是觉得讲的都有道理,但这些是很自然的啊...

2009-09-07 16:30:38

一、书评:值得一年读一次 二、对46条建议的个人感受 三、快速参考列表 一、书评:值得一年读一次 ------------------------------------------------------------------------------------- 在《代码大全》的“赞誉”中,有个叫John Robbins的同学认为《代码大全》应该每年都...

2010-04-05 13:26:15

标签
软件工程,程序员,计算机,成长,編程,精进,修炼,设计模式