搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
代码之美
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787111251330
  • 作      者:
    Andy Oram,Greg Wilson编
  • 出 版 社 :
    机械工业出版社
  • 出版日期:
    2009
收藏
编辑推荐
  

    38位大师级的程序员,一步步讲解他们的项目架构,开发时的种种折中考虑(tradeoffs)以及何时必须打破常规,寻求突破。
    全球38位高手、众多语言之父经典之作。
    本书收录的是软件设计领域中的一组大师级作品。每一章都是由一位或几位著名程序员针对某个问题给出的完美的解决方案,并且细述了这些解决方案的巧妙之处。
    本书既不是一本关于设计模式的书,也不是一本关于软件工程的书,它告诉你的不仅仅是一些正确的方式或者错误的方式。它让你站在那些优秀软件设计师的肩膀上,从他们的角度来看待问题。
    本书给出了38位大师级程序员在项目设计中的思路、在开发工作中的权衡,以及一些打破成规的决策。

展开
作者简介
    全球38位顶尖高手、众多语言之父经典之作
展开
内容介绍
    《代码之美》介绍了人类在一个奋斗领域中的创造性和灵活性:计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。《代码之美》33章,有38位作者,每位作者贡献一章。每位作者都将自己心目中对于“美丽的代码”的认识浓缩在一章当中,张力十足。38位大牛,每个人对代码之美都有自己独特的认识,现在一览无余的放在一起,对于热爱程序的每个人都不啻一场盛宴。 虽然《代码之美》的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。
展开
精彩书评
    重新擦亮思考的火花  <br>    《代码之美》这本书已经成为经典。关于它本身的赞美之辞已经不少了,不过到底从这本书里该读些什么东西,我倒是有些思考。  <br>    上世纪九十年代初期,当时正在加州大学埃尔文分校攻读博士学位的Douglas Schmidt在观察了他所参与的软件项目开发实践之后,得出一个结论,即未来的软件开发将越来越多地体现为整合(integration),而不是传统意义上的编程(programming)。换言之,被称为 “软件开发者” 的这个人群,将越来越明显地分化:一部分人开发核心构件和基础平台,而更多地人将主要是配置和整合现有构件以满足客户的需求,类似现代汽车、机床和家用电器制造业的产业格局即将到来。面对这一前景,博士生Schmidt一方面写文章对于其进步意义大加赞扬,另一方面毫不犹豫地投入到核心构件及平台的开发阵营中去。他很清楚,在这样一种分工体系中,由于软件整合产业很难出现垄断局面,因此大多数利润总是被截留在上游,人当然要往高处走,整合是好事,但他老兄宁可让别人来做这个好事。  <br>    事实上,软件产业中大多数看上去挺靠谱的预测都被历史的发展无情地抛到垃圾堆里了,然而Schmidt博士生的这个预测却惊人的准确,其后十几年软件工业的发展完美地印证了他当年的判断。因此,他本人基于这一预测所选择的人生道路也一帆风顺。如今已经是教授的Douglas Schmidt先后创造了ACE、TAO、CIAO等一系列分布式计算基础件,先后主导了美国学界和国防领域内若干重大科研与实际开发项目,称为世人公认的分布式计算架构领导者。  <br>    抛开他个人的辉煌不说,“整合化”趋势实际上已经深刻地改变了世界软件工业的面貌,从而也影响了身为晚进者的我们的命运。如今大部分的程序员实际上是在整合与配置现有资源以满足需求,而不是真正意义上的“编程”。这当然是一件好事,整合同样需要深刻的洞察力和创新精神,优秀的整合者与天才的程序员一样不可多得,甚至更加罕见。然而我们也不能不承认,大多数整合性的工作是机械的,简单的,重复的,欠缺创意的,深入的思考往往不必要。因此,在这个整合为王的时代里,思考的精神在钝化。更有甚者,互联网和搜索引擎的出现大大加速了这种钝化,几乎所有的问题都有人解决并且张贴在互联网上了,因此独自思考和解决问题已经成了不必要的、降低效率的行为,不但不时髦,而且不经济。软件开发迅速成为一个强调搜索和短期记忆力的技能,我想这是50年前第一代程序员们做梦也没有想到的。  <br>    老实讲,就整体而言,我仍然认为这是一种进步。任何一个产业的成熟,无不伴随着分工的明晰、技能的简化和从业门槛的降低。与少数人享受思考乐趣的需求相比,大多数人享受便宜而无处不在的软件服务的需求显然远为重要。但是,对于身处软件行业中的个体来说,思考力的削弱和丧失却是不折不扣的悲剧。这一点不必过多解释,正在苦苦寻找自己核心竞争力的开发者们都知道我说的是什么意思。几年来对中国开发者社群的近距离观察使我确信,尽管作为一个产业,中国软件一直享受着比较快的成长,但是总体而言,中国的软件开发者越来越迷惘、焦躁和不自信。这一情况当然是由多种原因导致的,但开发者们每念及此,多抱怨体制、产业、市场等身外之物,实在也有失偏颇。评心而论,这几年中国软件技术界的生存环境还是有了很大改善,对于那些真正出类拔萃的程序员来说,过上一种充实自信的生活并不困难。摆在每一个个体面前的主要问题还是在于能否出类拔萃,而这就需要我们重新找回思考的能力。具备强悍思考能力的人,也就具备强悍的解决问题的能力,而这样的开发者永远都是产业中的稀缺资源。  <br>    我认为这正是《代码之美》这本书的一个重要价值。合作的诸位大师级作者,给我们一个很好的机会,让我们能够一边阅读,一边思考,找回深思熟虑的智慧火花。这本书里所讲的每一个问题,可以说都是程序员在工作中会遇到或者至少会擦边的问题,既没有故弄玄虚的文字游戏,也没有携带了领域知识的私货,只有朴实而实际的一个个问题。虽然不是以提问的方式给出,但在整个阅读的过程中,我们还是能够找到很多机会与大师互动,不断地发现问题和解决问题。我在阅读中经常感到,看上去一个很简单的问题,却被这些大师们一层一层挖掘的如此深入,到最后阶段不由得令人感到战栗和震撼。看着这些智慧的光芒,我们不但可以领略大师之所谓称为大师的秘密,而且也认识到思考的真谛。因此,千万不要想看小说一样一带而过,那样会错过本书95%的价值!我们不是要阅读这些文字,而是要与文字背后的作者交流学习,一点一点把自己的心得记下来,对于作者提出的新问题,先自己思考,直接写程序尝试,争取跟上大师的思路,甚至可能需要反复几遍,才能真正读通这本书。这样的精力不会是白费的,读者应当认识到,当我们拥有这本书的时候,我们获得了怎样宝贵的机会,可以在相对比较短的时间里有效地提升自己的思考能力。这是一个机会,也是一次考验,我绝对相信,通过了这次考验的读者,会在思考和解决问题的能力上有一个大的进步。  <br>    我希望自己能够以这样的态度读这本了不起的书,以此文与其他读者朋友共勉之。  <br>    ——孟岩
展开
精彩书摘
    第3章 我从未编写过的最漂亮的代码<br>    Jon Bentley<br>    我曾经听一位大师级的程序员这样称赞到,“我通过删除代码来实现功能的提升。”而法国著名作家兼飞行家Antoine de  Saint-Exupéry的说法则更具代表性,“只有在不仅没有任何功能可以添加,而且也没有任何功能可以删除的情况下,设计师才能够认为自己的工作已臻完美。” 某些时候,在软件中根本就不存在最漂亮的代码,最漂亮的函数,或者最漂亮的程序。<br>    当然,我们很难对不存在的事物进行讨论。本章将对经典Quicksort(快速排序)算法的运行时间进行全面的分析,并试图通过这个分析来说明上述观点。在第一节中,我将首先根据我自己的观点来回顾一下Quicksort,并为后面的内容打下基础。第二节的内容将是本章的重点部分。我们将首先在程序中增加一个计数器,然后通过不断地修改,从而使程序的代码变得越来越短,但程序的功能却会变得越来越强,最终的结果是只需要几行代码就可以使算法的运行时间达到平均水平。在第三节将对前面的技术进行小结,并对二分搜索树的运行开销进行简单的分析。最后的两节将给出学完本章得到的一些启示,这将有助于你在今后写出更为优雅的程序。<br>    3.1  我编写过的最漂亮代码<br>    当Greg Wilson最初告诉我本书的编写计划时,我曾自问编写过的最漂亮的代码是什么。这个有趣的问题在我脑海里盘旋了大半天,然后我发现答案其实很简单:Quicksort算法。但遗憾的是,根据不同的表达方式,这个问题有着三种不同的答案。<br>    当我撰写关于分治(divide-and-conquer)算法的论文时,我发现C.A.R. Hoare的Quicksort算法(“Quicksort”,Computer Journal 5)无疑是各种Quicksort算法的鼻祖。这是一种解决基本问题的漂亮算法,可以用优雅的代码实现。我很喜欢这个算法,但我总是无法弄明白算法中最内层的循环。我曾经花两天的时间来调试一个使用了这个循环的复杂程序,并且几年以来,当我需要完成类似的任务时,我会很小心地复制这段代码。虽然这段代码能够解决我所遇到的问题,但我却并没有真正地理解它。<br>    我后来从Nico Lomuto那里学到了一种优雅的划分(partitioning)模式,并且最终编写出了我能够理解,甚至能够证明的Quicksort算法。William Strunk Jr.针对英语所提出的“良好的写作风格即为简练”这条经验同样适用于代码的编写,因此我遵循了他的建议,“省略不必要的字词”(来自《The Elements of Style》一书)。我最终将大约40行左右的代码缩减为十几行的代码。因此,如果要回答“你曾编写过的最漂亮代码是什么?”这个问题,那么我的答案就是:在我编写的《Programming Pearls, Second Edition》(Addison-Wesley)一书中给出的Quichsort算法。在示例3-1中给出了用C语言编写的Quicksort函数。我们在接下来的章节中将进一步地研究和改善这个函数。<br>    【示例】 3-1 Quicksort函数<br>    void quicksort(int l, int u)<br>    {int i, m;<br>    if (l 〉= u) return;<br>    swap(l, randint(l, u));<br>    m = l;<br>    for (i = l+1; i 〈= u; i++)<br>    if (x[i] 〈 x[l])<br>    swap(++m, i);<br>    swap(l, m);<br>    quicksort(l, m-1);<br>    quicksort(m+1, u);}<br>    如果函数的调用形式是quicksort(0, n-1),那么这段代码将对一个全局数组x[n]进行排序。函数的两个参数分别是将要进行排序的子数组的下标:l是较低的下标,而u是较高的下标。函数调用swap(i,j)将会交换x〔i〕与x〔j〕这两个元素。第一次交换操作将会按照均匀分布的方式在l和u之间随机地选择一个划分元素。<br>    在《Programming Pearls》一书中包含了对Quicksort算法的详细推导以及正确性证明。在本章的剩余内容中,我将假设读者熟悉在《Programming Pearls》中所给出的Quicksort算法以及在大多数初级算法教科书中所给出的Quicksort算法。<br>    如果你把问题改为“在你编写那些广为应用的代码中,哪一段代码是最漂亮的?”我的答案还是Quicksort算法。在我和M. D. McIlroy一起编写的一篇文章("Engineering a sort function," Software-Practice and Experience, Vol. 23, No. 11)中指出了在原来Unix qsort函数中的一个严重的性能问题。随后,我们开始用C语言编写一个新排序函数库,并且考虑了许多不同的算法,包括合并排序(Merge Sort)和堆排序(Heap Sort)等算法。在比较了Quicksort的几种实现方案后,我们着手创建自己的Quicksort算法。在这篇文章中描述了我们如何设计出一个比这个算法的其他实现要更为清晰,速度更快以及更为健壮的新函数——部分原因是由于这个函数的代码更为短小。Gordon Bell的名言被证明是正确的:“在计算机系统中,那些最廉价,速度最快以及最为可靠的组件是不存在的。”现在,这个函数已经被使用了10多年的时间,并且没有出现任何故障。<br>    考虑到通过缩减代码量所得到的好处,我最后以第三种方式来问自己在本章之初提出的问题。“你没有编写过的最漂亮代码是什么?”。我如何使用非常少的代码来实现大量的功能?答案还是和Quicksort有关,特别是对这个算法的性能分析。我将在下一节给出详细介绍。
展开
目录
译者序<br>序<br>前言<br>第1章 正则表达式匹配器<br>1.1 编程实践<br>1.2 实现<br>1.3 讨论<br>1.4 其他的方法<br>1.5 构建<br>1.6 小结<br><br>第2章 Subversion中的增量编辑器:像本体一样的接口<br>2.1 版本控制与目录树的转换<br>2.2 表达目录树的差异<br>2.3 增量编辑器接口<br>2.4 但这是不是艺术?<br>2.5 像体育比赛一样的抽象<br>2.6 结论<br><br>第3章 我编写过的最漂亮代码<br>3.1 我编写过的最漂亮代码<br>3.2事倍功半<br>3.3 观点<br>3.4 本章的中心思想是什么?<br>3.5 结论<br>3.6致谢<br><br>第4章 查找<br>4.1. 耗时<br>4.2. 问题:博客数据<br>4.3. 问题:时间,人物,以及对象?<br>4.4. 大规模尺度的搜索<br>4.5. 结论<br><br>第5章 正确、优美、迅速(按重要性排序):从设计XML验证器中学到的经验<br>5.1 XML验证器的作用<br>5.2 问题所在<br>5.3 版本1:简单的实现<br>5.4 版本2:模拟BNF语法——复杂度O(N)<br>5.5 版本3:<br>第一个复杂度O(log N)的优化<br>5.6 版本4:<br>第二次优化:避免重复验证<br>5.7 版本5:<br>第三次优化:复杂度 O(1)<br>5.8 版本 6:<br>第四次优化:缓存(Caching)<br>5.9 从故事中学到的<br><br>第6章 集成测试框架:脆弱之美<br>6.1. 三个类搞定一个验收测试框架<br>6.2. 框架设计的挑战<br>6.3. 开放式框架<br>6.4. 一个HTML解析器可以简单到什么程度?<br>6.5. 结论<br><br>第7章 美丽测试<br>7.1 讨厌的二分查找<br>7.2 JUnit简介<br>7.3将二分查找进行到底<br>7.4 结论<br><br>第8章 图像处理中的即时代码生成<br><br>第9章 自顶向下的运算符优先级<br>9.1. JavaScript<br>9.2. 符号表<br>9.3. 语素<br>9.4. 优先级<br>9.5. 表达式<br>9.6. 中置运算符<br>9.7. 前置操作符<br>9.8. 赋值运算符<br>9.9. 常数<br>9.10. Scope<br>9.11. 语句<br>9.12. 函数<br>9.13. 数组和对象字面量<br>9.14. 要做和要思考的事<br><br>第 10章 追求加速的种群计数<br>10.1. 基本方法<br>10.2. 分治法<br>10.3. 其他方法<br>10.4. 两个字种群计数的和与差<br>10.5. 两个字的种群计数比较<br>10.6. 数组中的1位种群计数<br>10.7. 应用<br><br>第11章 安全通信:自由的技术<br>11.1 项目启动之前<br>11.2剖析安全通信的复杂性<br>11.3 可用性是关键要素<br>11.4 基础<br>11.5 测试集<br>11.6 功能原型<br>11.7 清理,插入,继续……<br>11.8 在喜马拉雅山的开发工作<br>11.9 看不到的改动<br>11.10 速度确实重要<br>11.11 人权中的通信隐私<br>11.12 程序员与文明<br><br>第12章  在BioPerl里培育漂亮代码<br>12.1. BioPerl和Bio::Graphics模块<br>12.2. Bio::Graphics的设计流程<br>12.3. 扩展Bio::Graphics<br>12.4. 结束语和教训<br><br>第13章 基因排序器的设计<br>13.1 基因排序器的用户界面<br>13.2 通过Web跟用户保持对话<br>13.3. 多态的威力<br>13.4 滤除无关的基因<br>13.5 大规模美丽代码理论<br>13.6 结论<br><br>第14章 优雅代码随硬件发展的演化<br>14.1. 计算机体系结构对矩阵算法的影响<br>14.2 一种基于分解的方法<br>14.3 一个简单版本<br>14.4 LINPACK库中的DGEFA子程序<br>14.5 LAPACK DGETRF<br>14.6递归LU<br>14.7 ScaLAPACK PDGETRF<br>14.8 针对多核系统的多线程设计<br>14.9 误差分析与操作计数浅析<br>14.10 未来的研究方向<br>14.11 进一步阅读<br><br>第15章 漂亮的设计会给你带来长远的好处<br>15.1. 对于漂亮代码的个人看法<br>15.2. 对于CERN库的介绍<br>15.3. 外在美(Outer Beauty)<br>15.4. 内在美(Inner Beauty )<br>15.5. 结论<br><br>第16章,Linux内核驱动模型:协作的好处<br>16.1 简单的开始<br>16.2 进一步简化<br>16.3 扩展到上千台设备<br>16.4 小对象的松散结合<br><br>第17章  额外的间接层<br>17.1. 从直接代码操作到通过函数指针操作<br>17.2. 从函数参数到参数指针<br>17.3. 从文件系统到文件系统层<br>17.4. 从代码到DSL(Domain-Specific Language)<br>17.5. 复用与分离<br>17.6.分层是永恒之道?<br><br>第18章  Python的字典类:如何打造全能战士<br>18.1. 字典类的内部实现<br>18.2. 特殊调校<br>18.3. 冲突处理<br>18.4. 调整大小<br>18.5. 迭代和动态变化<br>18.6. 结论<br>18.7. 致谢<br><br>第19章 NumPy中的多维迭代器<br>19.1 N维数组操作中的关键挑战<br>19.2 N维数组的内存模型<br>19.3NumPy迭代器的起源<br>19.4 迭代器的设计<br>19.5 迭代器的接口<br>19.6 迭代器的使用<br>19.7 结束语<br><br>第20章 NASA火星漫步者任务中的高可靠企业系统<br>20.1 任务与CIP<br>20.2 任务需求<br>20.3 系统架构<br>20.4 案例分析:流服务<br>20.5 可靠性<br>20.6 稳定性<br>20.7 结束语<br><br>第21章  ERP5:最大可适性的设计<br>21.1  ERP的总体目标<br>21.2 ERP5<br>21.3 Zope基础平台<br>21.4 ERP5 Project中的概念<br>21.5 编码实现ERP5 Project<br>21.6 结束语<br><br>第22章 一匙污水<br><br>第23章 MapReduce分布式编程<br>23.1 激动人心的示例<br>23.2 MapReduce编程模型<br>23.3 其他MapReduce示例<br>23.4 分布式MapReduce的一种实现<br>23.5 模型扩展<br>23.6 结论<br>23.7 进阶阅读<br>23.8 致谢<br>23.9 附录:单词计数解决方案<br><br>第24章 美丽的并发<br>24.2  软件事务内存<br>24.3 圣诞老人问题<br>24.4 对Haskell的一些思考<br>24.6 致谢<br><br>第25章  句法抽象:syntax-case 展开器<br>25.1. syntax-case简介<br>25.2. 展开算法<br>25.3. 例子<br>25.4. 结论<br><br>第26章 节省劳动的架构:一个面向对象的网络化软件框架<br>26.1 示例程序:日志服务<br>26.2 日志服务器框架的面向对象设计<br>26.3 实现串行化日志服务器<br>26.4 实现并行日志服务器<br>26.5 结论<br><br>第27章 以REST方式集成业务伙伴<br>27.1 项目背景<br>27.2 把服务开放给外部客户<br>27.3 使用工厂模式转发服务<br>27.4 用电子商务协议来交换数据<br>27.5 结束语<br><br>第28章 漂亮的调试<br>28.1 对调试器进行调试<br>28.2 系统化的过程<br>28.3 关于查找的问题<br>28.4 自动找出故障起因<br>28.5 增量调试<br>28.6 最小化输入<br>28.7 查找缺陷<br>28.8 原型问题<br>28.9 结束语<br>28.10 致谢<br>28.11 进一步阅读<br><br>第29章 把代码当作文章<br><br>第30章 当你与世界的联系只有一个按钮<br>30.1 基本的设计模型<br>30.2 输入界面<br>30.3 用户界面的效率<br>30.4 下载<br>30.5 未来的发展方向<br><br>第31章 Emacspeak:全功能音频桌面<br>31.1 产生语音输出<br>31.2 支持语音的Emacs<br>31.3 对于在线信息的简单访问<br>31.4 小结<br>31.5 致谢<br><br>第32章 变动的代码<br>32.1 像书本一样<br>32.2 功能相似的代码在外观上也保持相似<br>32.3 缩进带来的危险<br>32.4 浏览代码<br>32.5 我们使用的工具<br>32.6 DiffMerge的曲折历史<br>32.7 结束语<br>32.8 致谢<br>32.9 进一步阅读<br><br>第33章 为“The Book”编写程序<br>33.1 没有捷径<br>33.2 给Lisp初学者的提示<br>33.3 三点共线<br>33.4 不可靠的斜率<br>33.5 三角不等性<br>33.6 河道弯曲模型<br>33.7  “Duh!”——我的意思是“Aha!”<br>33.8 结束语<br>33.9 进一步阅读<br>后记<br>作者简介
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证