Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1483613
  • 博文数量: 465
  • 博客积分: 8915
  • 博客等级: 中将
  • 技术积分: 6365
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-30 15:05
文章分类

全部博文(465)

文章存档

2017年(33)

2016年(2)

2015年(4)

2014年(29)

2013年(71)

2012年(148)

2011年(178)

分类: Delphi

2012-11-16 14:32:13

Jolt 大奖精选丛书

代码阅读(含光盘1) 权威精选植根于开发实践的最佳读物

() 斯宾耐立思 (Spinellis,D.)

左飞, 吴跃, 杨宁译

ISBN 978-7-121-17481-0

20128月出版

定价:79.00

16

416

宣传语:一项技术产品只有在获得了Jolt奖之后才能真正成为行业的主流,一本技术图书只有在获得了Jolt奖之后才能真正奠定经典的地位。

Jolt大奖素有软件业之奥斯卡的美称,本丛书精选自Jolt历届获奖图书,以植根于开发实践中的独到工程思想与杰出方法论为主要甄选方向。作者使用了超过600个现实的例子来向你展现如何甄别代码的好坏;如何阅读,应当注意什么,以及如何使用这些知识来改进自己的代码。本书在一些现实中的大型实例基础上,论述了代码阅读的策略,并向读者展示了如何将这些代码阅读和代码理解的技艺运用于实践。

本书荣获2003Jolt世界图书大奖,参阅本书对于大专院校相关专业的师生、计算机领域的从业人员或程序设计爱好者都大有裨益。

出版说明

经久不息的回荡

今时的读书人,不复有无书可读之苦,却时有品种繁多而无从择优之惑,甚而专业度颇高的技术书领域,亦日趋遭逢乱花迷眼的境地。此时,若得觅权威书评,抑或有公信力的排行榜,可按图索骥,大大增加选中好书的命中率。然而,如此良助,不可多得,纵观中外也唯见一枝独秀——素有软件业奥斯卡之美誉的Jolt奖!

震撼世界者为谁

在计算设备已经成为企业生产和日常生活之必备工具的今天,专业和大众用户对于软件的功能、性能和用户体验的要求都在不断提高。在这样的背景下,如何能够发挥出软件开发的最高效率和最大效能,已经是摆在每一个从业者面前的重大课题,而这也正是Jolt大奖横空出世的初衷及坚持数年的宗旨。

Jolt大奖历时20余年,在图书及软件业知名度极高,广受推崇。奖如其名,为引领计算机科学与工程发展主流,Jolt坚持将每年的奖项只颁给那些给整个IT业界带来震撼结果的图书、工具、产品及理念等,因一流的眼光及超高的专业度而得以闻名遐迩,声名远播。

除图书外,Jolt针对软件产品设有诸多奖项分类,如配置管理、协作工具、数据库引擎/数据库工具、设计工具/建模、开发环境、企业工具、库/框架、移动开发工具等。但图书历来是Jolt大奖中最受瞩目且传播最广的一个奖项分支。Jolt曾设有通用类图书、技术类图书等分类,每个分类又设有卓越奖Jolt Award,一般为一个)和生产力奖Productivity Award,一般为23个)。获奖技术图书一经公布,即打上经典烙印,可谓一举震撼全世界(赞助商Jolt可乐的广告词)。

作为计算机技术图书的厚爱者,我们总在追问——是谁在震撼世界,是谁在照亮明天?Jolt大奖恰似摆在眼前的橱窗,让我们可以近距离观看潮流在舞蹈,倾听震撼在轰鸣!

朝花夕拾为哪般

Jolt像是一年一度的承诺,在茫茫书海中为我们淘砺出一批批经得起岁月冲刷的杰作,头顶桂冠的佳作也因而得以一批批引进中国,为国人开阔了眼界,滋补了技术养分。然而,或因技术差距造就的生不逢时、水土不服,或因翻译、制作的不如人意,抑或是疏于宣传等诸多原因,这些经典著作在国内出版后,尽管不乏如获至宝的拥趸,却仍不为诸多人所知,从而与大量本应从中获益的读者擦肩而过。既然这生生错失的遗憾本不该发生,则更不应延续。为此,我们邀国外出版同行、国内技术专家一道,踏上朝花夕拾之路,竭力为广大读者筛选出历久弥新、震撼依旧的Jolt图书精品。

Jolt获奖图书皆由业界专家一致评出,并得到软件从业人员的高度认可,虽然这些书今天读来,不再能看到上世纪史诗时代那般日新月异的理论突破,以及依赖于高深繁复的科学研究所取得的系统化成果,更多是在日复一日的开发实践中总结和提炼出来的工程思想和方法论。重新选材之所以有所弃取,从Jolt多年来的评奖规律中可窥端倪——

一万小时真理见

凡是在工程思想领域取得革命性、颠覆性突破的图书,就被归于震撼获奖分类。比如,从基于过程的程序设计模型过渡到面向对象的全新模型,就是软件开发思想上的一次带来巨大震撼的革命;再比如,打破传统的瀑布模型而转向持续集成的软件交付模型,这也是一场业界的重大思想转变。像这样的重大思想突破,可以说是数年甚至数十年一遇的,而荣获Jolt大奖的图书中更为常见的,则是基于最佳实践的生产效率获奖者。获得此类殊荣的图书,都是作者们从平凡的、重复的,甚至用一般人的眼光看来不怎么起眼的日常开发实践中,以独具的慧眼、过人的耐心和大胆的创新,闯开一条不平常道路的心血与经验总结。

这些图书所涉及的主题,都是普通的软件开发人员每天要面对的工作——代码阅读、撰写测试用例、修复软件问题……但就是这样貌似平淡无奇的工作,是否能每一天、每一个项目都做好,着实拉开了软件开发人员素质的差距,也决定了软件企业开发出来的产品和服务的质量。我们中国有一句古话,叫做熟能生巧;某位著名企业家也说过一句家喻户晓的名言:把简单的事千百万次地做好,就是不简单的。这些朴素而实际的真理,同样也是本套丛书最能彰显的所谓程序员精神。它建立在脚踏实地的实践基础之上,也充满了对于自由和创新的向往。

名作可堪比名曲

就不因岁月流逝而褪色来说,与这些Jolt名作相媲美者,只有那些百年响彻、震撼古今的经典名曲。希望本丛书带给大家的每部著作,也如百听不厌的乐曲,掩卷良久方余音绕梁,真知存心。仔细想来,软件开发与古典音乐岂非有异曲同工之妙?既是人类心智索问精确科学的探究,亦是寻觅美学享受的追求。工程是艺术的根基,而艺术是工程的极致。衷心地希望各位读者能够认真阅读本丛书的本本珍品,并切实地用于自己的日常工作中,在充分享受大师魅力的同时,为中国的软件事业谱写更多、更震撼的乐章。

 

电子工业出版社博文视点

一二年春 

原作者中文版序

中国是首个将我的开源视角系列作品再版的国家。这可能有很多原因,而其中一个特别吸引人的原因与孔子的著作有关,他在《论语》中广泛地强调了学习研究的重要性。回顾之前撰写《代码阅读》和《代码质量》的历程,我了解到,实际上,我鼓励了那些从事开发工作的同事和学生借助研究学习软件代码来提升他们自身的知识和技能,这正是我遵循孔子金玉良言的一种方式。

《代码阅读》一书阐述了开发者应当如何阅读已有的代码。关于为何要进行代码阅读,不少人也给出了许多现实中的原因:修正问题、添加特性、寻找有用的片段,或者作为你所在机构质量控制流程的一部分对其进行复查。然而,进行代码阅读最重要的原因其实是从中学习。从已有的高质量代码中,我们可以学习如何将严谨的代码风格应用于实践,如何编写有用的注释,如何编排代码以方便他人读懂,如何选择有意义的标识符,以及如何将复杂的代码组织为可管控的部分。另外,通过研究代码,我们还可以学习到新的算法、API及架构。简而言之,阅读代码可以帮助我们成为更加优秀的程序员。

《代码质量》一书,退后一步,方为大观。当代码被组装为程序时将会产生所谓的聚现属性:可靠性、安全性、CPU利用率、空间占用率、可移植性及可维护性。尽管这些属性可能看起来抽象且难以约束,但是诸多成功的经验表明,借助研究专家级的代码,我们可以学习到许多极好的提升代码质量的方法。我们可以从中发现严谨的错误测试、安全证书的保守处理、高效的算法、灵巧的抽象技术及应用于实践中的基本设计模式。简而言之,这将有助于我们成为极其优秀的程序员。

伟大的哲学家孔子曾经提过:学而不思则罔,思而不学则殆。因此我推荐大家主动花些时间来研究已有的代码并从中予以学习。

Diomidis Spinellis

20119月于雅典

今年恰逢十二五开局之年,在全球软件技术和产业格局孕育重大调整之际,我国软件产业也在工业化、信息化两化融合的大背景下迎来了又一个快速发展的新阶段,这其中机遇与挑战并存。当下软件和信息服务业市场的规模不断扩大,物联网作为又一个万亿元级别的产业将产生千亿元级别的服务外包。预计到2020年,全球潜在的服务外包市场需求将达到1.651.8万亿美元,大力发展软件业及信息服务业将成为各国抓住新机遇、全面深度参与全球化、提升软件产业技术力量的重要途径。目前我国软件产业规模虽已过万亿元,但在核心技术、基础软件等方面仍有很大发展空间。

高素质人才的储备是推进产业健康快速发展的根本保证。高端软件人才的大量持续涌现,关键在于教育,这其中高校无疑要发挥重要的作用。我们高校软件教育者既要继续贯彻党的教育理念,进一步深化我国高级软件人才培养体系的发展进程;同时又要看到我国与欧美等高水平软件人才教育国家之间的距离,师夷长技,以求在全球化浪潮中谋得一席之地。作为一位优秀的软件教育者,Diomidis Spinellis教授的某些理念无疑是非常值得我们学习和借鉴的。他以人类学习自然语言的认知规律为出发点,独辟新径,强调借助代码阅读来提高编程能力。目前这一思潮也已逐渐由欧美向我国渗透。

代码阅读是每一个软件从业人员经常进行的活动,其重要性对于每一个开发者不言而喻,但人们更多的是在本着修改前人代码而进行此项活动的,换言之,仅仅使用了代码阅读的工作属性,而未见开发其学习属性。其实,代码阅读还帮助人们完成了观察模仿创造这样一个过程的初始阶段。南朝刘勰《文心雕龙》里讲观千剑而后识器,与之类似,清乾隆年间蘅塘退士还说熟读唐诗三百首,不会作诗也会吟,这都是强调了观察对于之后创造的重要性(巧合的是写诗和写代码的观察都是借助阅读来完成的)。

令人遗憾的是,一直以来,许多人都认为阅读代码不是件容易的事情,不仅不容易,很多时候还非常枯燥;即使是自己写的代码,有时隔一段时间再回顾也会不知所云。很多人在自己的编码生涯中都或多或少有过一些阅读代码的经历,有自己的一些方法,但也仅仅是一些个人实践而已,缺乏对整体的把握,经常是只见树木不见森林(很多时候仅仅能看到一小部分树木)。为了在学习的过程中少走一些弯路,业界代码阅读与质量提升方面的开宗明义之作——Diomidis Spinellis教授所撰写的两部经典之作《代码阅读》和《代码质量》无疑是推荐给每位从业人员的理想读物。这两部曾荣获美国Jolt软件开发震撼大奖的作品,影响了一代程序员,是相关领域中的经典名作。

我阅读了两部书的译稿,并非常欣喜地将它们推荐给每一位读者。该书译者和编辑们严谨、认真的工作使得本版最大程度地还原了作者的原意,相信经由他们的辛勤努力,必将能为广大读者献上一道惊艳的佳作。

欧阳修说:立身以立学为先,立学以读书为本。衷心希望广大读者借由本书立学解惑,提升自我。

 

李战怀

2011岁末

由国际知名的Addison-Wesley出版社推出的高效软件开发系列丛书为现代软件开发的方方面面提供了专业的建议和意见。收录在该系列中的书籍本本都是技术方面声名卓著的佳作,这些书籍的作者在创作时煞费苦心,力求作品篇幅适中、易于阅读,同时保证作品的价值能够历久弥新,不会随时光的流逝而渐显黯淡。系列中的每一本都描述了一项软件开发的核心话题,这些内容可能是业界专家们在开发中始终秉承的,也可能是需要本书的读者们引以为戒的,而之所以这样做,目的只有一个,就是要创造出最杰出的软件。

希腊教授Diomidis Spinellis的两部著作《代码阅读》和《代码质量》均收录在此系列中。其中,本书作为该领域的开山之作,曾荣获美国第14软件开发年度震撼大奖。在IT产业蓬勃发展的今日,电子工业出版社顺应时代发展和广大读者希冀,隆重推出了《Jolt获奖系列》书丛,《代码阅读》和《代码质量》再次被收入其中。经典之作《代码阅读》得以拨云开雾,同广大中国读者见面。

当今世界,互联网迅猛发展,开源软件大行其道,海量的优质代码犹如一座丰富的宝藏正热切地等待着每一位开发人员去发掘,去阅读。正如本书英文原版序言的作者Dave Thomas所说的那样:没有哪位伟大的小说家从未读过其他人的著作,也没有哪位伟大的画家从来没有研究过他人的画作。阅读代码显然是每个软件开发人员都必须做的事情。一方面,可能是出于向优秀范例程序学习的目的,另一方面,也可能是出于代码复用的目的。于是,人们总会出于这样或那样的原因去阅读代码(有可能是别人的,也有可能是自己写的)。然而,长久以来,如何正确地阅读代码,实现去粗取精?如何高效地阅读代码,做到得心应手?始终没有一套完备的指导法则。

直到本书出现,我们才豁然开朗,原来代码阅读也是有章法可依的,也是一门学问。众所周知,本书是第一部专门将代码阅读作为一项独立活动加以论述的书籍,即使在其出版多年之后的今天,也依然是该领域的扛鼎之作。正如本书作者所说的那样:代码阅读应该得到正确地训练,并用做提高编程能力的一种方法。值得注意的是,目前,在国外先进的计算机教育体系中,代码阅读课程、活动和实践已纳入到相应的正规课程安排之中。

在中国,各大技术论坛、专业网站也为广大从业人员和程序设计爱好者提供了大量可交流的代码资源。作为译者,我们真诚地将该书推介给国内的读者,希望借由本书,可以推动开源运动,使更多人获益,也可以推动代码共享与阅读的方法与实践,提高国人学习编程的效率,以期获得事半功倍的效果。

说到学习编程,我不禁想到了最近网上热炒的蹭课哥。据悉,来自山东菏泽,现年27岁的农村青年贾作胜,原本高中毕业后,由于家庭经济困难等原因,未能如愿继续深造。后来,进城打工的他成为了清华大学的一名普通的保安员。业余时间,他一直刻苦学习,还常到教室旁听各种课程和名家讲座。天道酬勤,今年这位往日的蹭课哥,凭借旁听和自学,考上了山东师范大学。同样是保安,我又不禁想到了一个我身边的真实的例子。这个故事我不止一次讲起,还曾经在我的一本书的序言里引用过。若干年前,我所在公司楼下有一位与众不同的小保安。说他与众不同是因为当时经常能看到他捧着一本厚厚的《Java编程思想》之类的书在啃读,这种争分夺秒、刻苦学习的形象当时给我们很多人留下了深刻的印象。功夫不负有心人,这位保安后来顺利转型,成为了一名软件工程师。

无论是过去还是现在,都有如此之多的形形色色的人因为各种原因前仆后继地在努力钻研编程。我也曾经在文章中指出,研读他人的代码是学习编程的道路上,除动手实践外最重要也最必要的学习方法之一。本书的读者可能已经在行业内摸爬滚打多年,也可能初出茅庐,可能是高等院校计算机相关专业的学生,也可能只是某个角落里默默奋发的小保安。无论你是其中的哪一个,我都真心地希望本书能够在你成长为编程达人的道路上助一臂之力。我希望能够有更多像小保安一样的人得以华丽转身。若能如此,我心足矣。

怀揣着这样的心情,我们始终秉持着一丝不苟的态度,力求把经典之作原汁原味地带给中国读者。而一本专业技术领域的译作得以成功问世,其中之波折也是再所难免。幸得多位业内专家不吝指导,使得我们的工作备感鼓舞。在本书翻译之初,Diomidis Spinellis教授即给我们提出了许多宝贵的建议,他的指导给予了我们极大的帮助。此外,中国计算机学会数据库专业副主任、西北工业大学博士生导师、计算机学院副院长李战怀教授审阅了译稿,并欣然为本书作序推荐,感激之情,溢于言表。

本书得以顺利付梓,我们还要感谢中国航空工业集团第一飞机设计研究院工程师张贵、西安市公安局网监支队秦磊、西安交通大学电信学院研究生杨骥。三人在各自的技术方向上拥有丰富的实践经验,其中,张贵曾参与开发多个大型飞行模拟器项目,而杨骥和秦磊的研究方向则分别侧重于嵌入式开发和网络安全方面。以上诸位在百忙之中积极参与了本书的翻译工作,对于他们严肃认真的工作态度,笔者表示由衷敬佩。

最高品质的图书始终是作译者永恒的追求。但有一千个读者,就有一千个哈姆雷特。因此,我们也真诚地希望本书的读者能够把阅读中的所想所得与我们分享,也欢迎就书中可能存在的纰漏与我们沟通交流,从而使本书日臻完善,以利来者。联系邮箱:heiswk@qq.com

 

左飞

2011年秋

 

1  导论       1

1.1  为何以及如何阅读代码      2

1.1.1  将代码作为文献       2

1.1.2  将代码作为范例       5

1.1.3  维护   6

1.1.4  演进   6

1.1.5  重用   8

1.1.6  检查   8

1.2  如何阅读本书      9

1.2.1  排版约定   9

1.2.2  图表   11

1.2.3  练习   12

1.2.4  辅助材料   13

1.2.5  工具   13

1.2.6  提纲   13

1.2.7  关于伟大语言的争论    14

进阶阅读       15

2  基本编程元素       17

2.1  一个完整的程序   17

2.2  函数和全局变量   22

2.3  while循环、条件和块 26

2.4  switch语句   29

2.5  for循环 31

2.6  breakcontinue语句  34

2.7  字符和布尔表达式      36

2.8  goto语句      39

2.9  局部重构      41

2.10  do循环和整数表达式       46

2.11  再论控制结构     49

进阶阅读       55

3  高级C数据类型    57

3.1  指针      57

3.1.1  链式数据结构   58

3.1.2  数据结构的动态分配       58

3.1.3  引用调用   59

3.1.4  数据元素的访问       60

3.1.5  数组类型的参数和返回结果   61

3.1.6  函数指针   63

3.1.7  用做别名的指针       65

3.1.8  指针和字符串   67

3.1.9  直接内存访问   69

3.2  结构体   70

3.2.1  组合数据元素   70

3.2.2  从函数中返回多个数据元素   71

3.2.3  映射数据的组织方式       71

3.2.4  以面向对象方式编程       73

3.3  联合体   75

3.3.1  有效利用内存空间   75

3.3.2  实现多态   76

3.3.3  不同内部表征的访问       77

3.4  动态内存分配      79

3.4.1  空闲内存管理   81

3.4.2  包含动态分配数组的结构体   83

3.5  typedef声明  85

进阶阅读       87

4  C数据结构    89

4.1  向量      90

4.2  矩阵和表      94

4.3     98

4.4  队列      100

4.5  映射      103

4.5.1  散列表       106

4.6  集合      108

4.7  链表      109

4.8     117

4.9     122

4.9.1  节点存储   122

4.9.2  边的表示   124

4.9.3边的存储      127

4.9.4  图的属性   129

4.9.5  隐含结构   129

4.9.6  其他表示方法   130

进阶阅读       130

5  高级控制流程       131

5.1  递归      131

5.2  异常机制      137

5.3  并行性   141

5.3.1  硬件和软件的并行性       142

5.3.2  控制模型   143

5.3.3  线程实现   148

5.4  信号      151

5.5  非局部跳转   154

5.6  宏替换   157

进阶阅读       162

6  应对大型项目       163

6.1  设计和实现技术   163

6.2  项目的组织   165

6.3  编译过程与makefile文件   172

6.4  配置      179

6.5  版本控制      184

6.6  项目专用工具      191

6.7  测试      196

进阶阅读       203

7  编码规范和约定    205

7.1  文件的名称和组织      206

7.2  缩进      208

7.3  格式编排      210

7.4  命名约定      213

7.5  编程实践      217

7.6  过程规范      219

进阶阅读       220

8  文档       221

8.1  文档类型      221

8.2  阅读文档      222

8.3  文档中存在的问题      234

8.4  其他文档来源      236

8.5  常见的开源文档格式   239

进阶阅读       245

9  架构       414

9.1  系统结构      248

9.1.1  集中式存储库和分布式方法   248

9.1.2  数据流架构       252

9.1.3  面向对象结构   254

9.1.4  分层架构   257

9.1.5  层次   260

9.1.6  切片   261

9.2  控制模型      263

9.2.1  事件驱动系统   263

9.2.2  系统管理器       266

9.2.3  状态转移   268

9.3  元素包装      270

9.3.1  模块   270

9.3.2  命名空间   272

9.3.3  对象   276

9.3.4  泛型实现   287

9.3.5  抽象数据类型   292

9.3.6         292

9.3.7  进程和过滤器   296

9.3.8  组件   297

9.3.9  数据存储库       299

9.4  架构重用      301

9.4.1  框架   301

9.4.2  代码向导   302

9.4.3  设计模式   303

9.4.4  领域专有的架构       305

进阶阅读       308

10  代码阅读工具      311

10.1  正则表达式 312

10.2  用编辑器浏览代码    314

10.3  grep搜索代码       317

10.4  找出文件的差异 325

10.5  开发自用工具    326

10.6  借助编译器阅读代码 329

10.7  代码浏览器与美化器 333

10.8  运行时工具 338

10.9  非软件工具 342

可用工具与进阶读物    343

11  完整示例      345

11.1  概况     345

11.2  攻克计划     347

11.3  代码重用     348

11.4  测试与调试 354

11.5  文档     361

11.6  观察报告     362

附录A  源代码致谢人员名单    363

附录B  源代码致谢人员名单    363

附录C  源代码致谢人员名单    363

阅读(1448) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~