[书目20160623]编程匠艺——编写卓越的代码

本文转自:http://blog.chinaunix.net/uid-13164110-id-3410985.html

 

编程匠艺——编写卓越之代码 

 

[美]Pete Goodliffe(皮特.古德利弗)著

韩江 译

 

再序

顿时仍开能够重印,本身就是认证了它的值得到了读者的承认,在今时今,已属于正确。所以时隔三年,我则一度不在本来的工作岗位上,也尚乐于还不怕立即本开说几词。

即时按照开说了呀呢?其实为尚无什么屠龙秘笈,无非还是关于软件编码的有些通常的大实话,一些确切的经验之谈。它的亮点,一是于完好,二是具体要同时明显,三凡是踏踏实实。总的来说,我当这仍开比较好地连了软件开发当中真正有效的事物,而且不分包花哨的玩笑。这是名贵的。

软件开发行业还未曾了走来青春期,离成熟还颇为。行业跟人一样,所谓成熟,就是说试了了诸多想法,狂也疯狂过了,疯啊狂了了,痛定思痛,返璞归真的那么相同种植状态。软件开发这个行当,给狂想提供了特别特别的戏台。每个程序员都希望变成大师,而权威似乎就要体现于五光十色炫酷的代码、框架、程序库上面,所以各种看上去非常挺的想法层出不穷,程序员们周期性地为流行的新型词汇而发狂狂。但是这样长年累月的履,很多丁实在还是看明白了,大多数酷炫绝技最后身败名裂,尘归尘土归土,留下来经久不衰的,还是那些低调、朴实、透明的技巧。这本书里描述的,大多数属老沉淀结晶出来的物,所以值得信赖。

差一点年前,我到一个术会议,一各项发言人是程序员出身的天使投资人,他当评价另一个依技能成之年青人常说,那个有有,其实技术好差劲,但是他干吗成功?因为他做出了一流的出品,而且是个商业天才,所以中标了。很风趣的同段话,做出了头等的活,技术水平还能为“平庸”吗?软件开发行业有一个特地隆重而且旁若无人的圈子文化,大多数开发者都当圈子里不亦乐乎,不是将成果,而是将点子来比较高下,把大部分活力用来捧场同行。不过我倡导开发者经常站在圈子外面审视自己,这样会于轻保障头脑的复明。归根结底,社会或因为你是否会交到高质量的、易于维护和扩充的成品来评价而的力及档次,并且与你对号入座的看待。所以开发者到底该怎样规划好的进化路子,其实是值得反思的。

本人认为这本开好就好于未曾小花花架子,都是确实的好东西。所以就是是三年之后,五年后,也还值得再念。

孟  岩      

2011年7月吃北京

推荐序

信息产业几乎是放水平高的家业,其长进之快,让身处中的我们既是感到兴奋与动,也不时困惑和惶恐。信息技术的变更最为抢、太痛,一切都在迅速革新中,作为技术人员,我们今天习又赖以安身立命的事物,很快就会见化故纸堆里的古董。人生总是待持续积累才能够进一步活动更强之,如果找不交同一起可以积累提升,而且给市场所认同的着力竞争力,事业的摩天大厦是建筑不起的。于是一个严格的题材就是布置在各一个技术人员的前头——什么才是咱们的主干竞争力?

二十年前,人们认为软件开发者的着力竞争力应该反映于外的才智和朴实的功底达标,要精通算法、硬件、编译、计算机体系布局,要产生天马行空般的想像力和创造力,能够单枪匹马单打独斗。至于什么组织协作、编码规范、单元测试、最佳实践,都是对天才的匪必要之牢笼。

大概到了20世纪90年间中叶,风水变了。随着软件之层面更为老,以及当代操作系统、面向对象技术、软件开发工具、程序库及框架的推广,“平台”和“工具”变得越来越重要了。大多数时,开发者不需要协调开实现有力量,他所负之平台已准备好了现的零部件供下,有的上还是应用程序中最繁琐、最复杂的有的已由框架或程序库实现好了。因此,人们普遍认为,一个开发者的骨干竞争力大可怜程度达到见也对平台和工具的解与操纵,并寄这种理解创造性地构筑产品,或者再次恰当地说,一种创造性地组装产品的力量。你还于也正琢磨出的一个快算法而洋洋得意吗?旁边那位借助程序库里供的机件,已经迅速地就了上上下下功能模块;你发明了一个新的视频格式以及相应之codec?很了不起!不过其他一个新发茅庐、连快傅里叶变换算法都勾不出来的集体就冲sourceforge上的开源组件做出产品来,并且播得充满互联网都是了。当然,黑客们还是具备不可代替的价值,总是能够找到自己之岗位;但是对那些强调组织征战、快速行进之店来说,一个熟练掌握MFC、Delphi、J2EE、ASP.NET或者LAMP的开发者可能又实用,能还实用地也合作社带动价值。因此,这样的程序员便一时改成商家之命根子,众人眼中的王牌。

而是切莫交十年下来,问题还要并发了。流行的阳台以及工具而走马灯般你正唱了我上:昨天还当啊领悟了MFC、Delphi而美,今天即发现使用主流都是Web了;刚刚啃了艰深的EJB2,抬眼一看也发现它们已深受Spring的拥趸们批倒批判臭了;上个月尚是因在敏捷Java领域的改革派,这个月就让同广大嘴上无毛的RoR粉丝给划至改革的对立面去了;ASP.NET还并未学踏实呢,微软以准备好ASP.NET
MVC、ASP.NET
AJAX、Silverlight等等一律大堆新东西让你咋了。这样下去,什么时是个头?把团结的主导竞争力建立于这些瞬间便没有的昙花上,难道不是把少的性命投入到最的瞎折腾之中也?难道只有生研究到平等中舒舒服服的杀柜里,到了三十差不多载就是寻求所谓的“转型”,顺着一长非常可靠的“职场路线”攀或是乱,最后当局无关或好无被“战略裁员”的托福之下头顶玻璃天花板光荣退休,才是中国程序员的归宿?什么才是程序员可以长期积累,不断增强,不但可安身立命,而且能落实梦想、成就事业的为主竞争力也?回答好者题材,对于今天之开发者来说,可能比较控制以及通某项具体技术意义重要得差不多。

在我看来,当代程序员的着力竞争力至少应反映于如此几接触上:有踏实的根基,活跃的想像力和创造力,快速的上学能力,具备行业及领域知识,以及规范的软件工艺能力。而在就中,专业软件技术是无比中心、也是无限重点的同码。

哟是明媒正娶软件技术呢?就是无可非议地开发软件的力,更具体地说,是经过一致多级有组织的、有规则、流程化、可检验、可再次的行作为,协作式开发大质量次的力量。对于一个程序员来说,这是公的看家老本,对于一个软件团队来说,这是你们的立足之基。算法不见面,可以查资料慢慢掌握;不了解行业,可以边举行边学,逐渐深入;缺乏更新,可以站于巨人肩膀上耐心寻找;甚至基本功不足,也得以自弥补,可是一旦没有举行软件的正规态度与实施技能,没有制作合格软件的工艺水平,连一段落高质量之次第都勾不下,试问你还剩余什么?

经近三十年的流年,人们最终认识及,在规模化团队合作的景象下,决定软件出品质量之不再是私有的才智,也无是指什么神灵技术,而是团队的工艺实践。是否以相同初步就是形成了开发计划?是否针对这个计划开展了必需的确认、维护及跟?必要之标准文档是否做了?是否形成了客观之架构?是否确切地挑选了开发工具和编程语言?是否建构了适应团队渐进协作的优良的工具及办事平台?是否同样开始就形成了劲的短核查、控制以及钉政策并总严格地实施?是否制订了连续一致的编码标准,并且通过诸如代码走查等加以保证?是否发总体的测试制度?是否有明显的习性优化及软件安全性保障过程?是否以合生命周期贯彻了从严的版管理、配置管理、发布管理以及软件维护退役管理法?这些的的问题,是索要耐心和密切地用实际实践细节来解惑的。当一个集团对于这些问题且被出了明确而平的报并且用行动来推行之时节,他们即使是一个正式的、具有主导竞争力的团。而当一个私有开发者能够针对这些问题有着不错的思想意识,并且经过施加自己的影响力推动集体为科学的倾向发展的上,他即使是一个存有主导竞争力的开发者。一个兼有核心竞争力的集体和开发者,是可以不断进步的,是具有把握时机之力量的;一旦时机适宜,他们便净有或实现重新特别的对象。

十多年以前国内外软件界对工艺的问题并无厚。大部分口要么执迷于技术本身,指望某平等龙一个面向有的技术会同劳永逸地解决软件开发中的享有问题,要么就是是将题目大而化之乎“软件工程”,企图以指令性的道,在总的范围达到之所以管理取代工艺。在当下有限独趋势及,程序员要么为视为可以尽放纵之孤胆英雄,要么被视为英雄编程技术最终出现前不得不在的过渡品,或者管理指令的机械的执行体,“人”的维度消失了。这种对人口以及工艺细节的忽视为反映于术创作方面。软件工程、面向对象、编程技巧及成品手册之类的做汗牛充栋,而认真谈到软件工艺之书屈指可数。

直到20世纪90年代中期,随着部分软件出品的范围越来越不行,微软率先认识及工艺问题的最主要,于是出版了像《代码大全》、《编写清晰的代码》等一律多样探讨这等同题材之著述。直到20世纪90年间后期,当悉工业界从面向对象和软件工程的幻影泡沫被移动出来以后,才起来认真完善地审视软件工艺的问题,而且经过快捷运动、把软件工艺的要害和核心实行提到了一个小心的职上。事实上,敏捷运动可以看是软件工艺之复苏运动。此外,随着《代码大全2》、《软件工艺》、《代码阅读》、《程序员修炼之志》等经典作品的问世,在术书籍领域也穿插出现了相同批判专门探讨软件工艺之编。这仍《编程匠艺》也是其一世界面临之均等遵照佳作。

本书是同等管宏观讨论软件构造工艺实践的编,从软件开发的计划至架构设计,从编码风格规范及软件缺陷的检测和治本,从程序员工具箱的布及团体合作精神之培训,这本开还给予了确切、风趣而具启发性的讨论。这些议论,既来定位、理论性一面,也发出技术性的现实性建议,对于组织负责人、高级开发者和每一个意在很快前进的程序员具有明显的指导意义。如果读者认同软件工艺之要紧,那么好说就本书是帮读者建构自己核心竞争力的平论难得的作品。特别值得一提的是,这按照开中文版的翻译流畅自然,在不少地方都反映出译者的认真态度与翻译功力。对于同如约翻译由英文的技艺创作来说,这活脱脱是一个大大的加分。

自然,一本书的覆盖面与功效到底是片的,核心竞争力的起和建构归根到底是一个艰难实践的历程,不同性格的人数也终将有不同之对象与法。但是我深信不疑,对于有心人来说,只要我们连地探究和实践,都见面得到自己之着力竞争力,做一个出备的食指,争取以及等待时机的偏重,最终实现协调的人生目标。

读之开有感而发,借题发挥,是为评价。

 

孟  岩      

《程序员》杂志技术主编

2008年7月于首都 

译者序

用作专司软件开发的程序员,你势必遇到过这么的景况:自以为到的代码,在品种将收场之上,却连会发现还发无数情节需改。更有甚者,由于人口之更动,那些他们遗留下来的“老代码”,作为时间留给程序员和品类组的极致充分遗产,却可能会见成项目组的难。

除外受制于人类自身之缺点之外,还有由于组织而带来的题材,如客户需求不止改变、必须以点滴的日与预算里完成项目,来自内部所谓“项目管理”的种种压力,等等。天啦,这些题材我们多方口都撞了。

列宁曾于看守所中描绘下了《怎么惩罚?》,指导了俄国之十月革命。而以软件业,从一代宗师Frederick
P.
Brooks的《人月神话》开始,就于查找“怎么处置”这个“银弹”了。然而,“狼来了”在屡被喊出来后,已经特别少有人相信了。我们要承认,这些还是一向层面的题材,目前还免克赢得化解。但是,本书的撰稿人Pete
Goodliffe认为,至少我们得以动用部分智,减少一些出及之痛。因为,除了支付,人生还有众多尤为美好的事物在相当在我们。我们这次也可高喊“银弹来了”。没有最好,只有更好,谁知道这次未是确实吗?

显赫国画大师齐白石于青春的时段,曾经开过木匠。据说有雷同不成外跟师傅去让地主干活,在路上迎面走来另外一针对性木匠师徒。齐先生的师傅说,赶紧叫旁人让路。师徒俩立在路边,老师恭敬地注视那片口逐年走远。齐白石不免除,问师傅:同是木匠,你自师徒为什么要让他们让路。老师傅回头说:为什么?别人是举行细活的,我们是举行粗活的。

Pete
Goodliffe在业界的新春快要超过好多人的岁数了,此君曾经读书多个世界、不同之编程语言与余搭,并且已于利用无同等流程的商店里从事开发。在本书中,他拿多年压箱底的部分传统想法和技术告诉了豪门,这些都是时与智慧的重组,相信不管开发人员、项目经理甚至测试人员,都可以从中发现阿里巴巴启金库的钥匙。

这就是说本书来啊特色也?对于想询问内容的普通读者来说,本书至少有以下特征:

1.临近实际
《编程匠艺——编写卓越之代码》是本书的书名,但也是笔者的勤学苦练所在。人生发生三单境界,最后一个哪怕是“看山是山,看水是和”。这是废话吗?当然不是,作者对是被出了极端好之解答。作为程序员,我们尽欣赏争论不同工具、平台、方法之间的优劣。而作者却由此多年历,力图告诉我们相应如何提高质量,并改为平等誉为好之程序员。这些方法就是如点石成金的指,它们是方法论,而未是对准现实的家伙要平台的传教。我们现在所缺乏的,恰恰是这些能够而好再也上同级的手段,而未是那些特殊的技术细节。

2.情节丰富的 
很少出平等本书能涵盖如此多的领域,并且还这样扎实。作为一如既往叫做程序员,我们或永远无法上全面。而需处于同一种植持续不断地增长的状态,总会来再次多的事物需要学习。那么下一样步该举行呀吧?这里虽发出答案。

3.只是看作“秘要心法”
本书不仅契合入门者,也契合用加强的开发人员,以及那些想治本好所谓代码猴子的项目经理们。与《项目经理案头手册》一样,这本开啊将变为每人的案头手册或者枕边书,可以当作应急或提升的伎俩。如果后遇到了问题,可以天天参阅相关的章节。

4.心思决定整个 
这词话对为?有矣美妙心态,不肯定行,如果没,肯定非常。我们经常羡慕吃老外以四五十年之岁还会延续致力编程,为什么咱们很啊?可能不同的读者都见面找到属于自己之答案!Pete
Goodliffe具有开阔的视野,扎实的根基,广泛的欣赏,带有一栽程序员应该负有的崇高和休闲。这正是我们这浮躁的一代中主动探讨之一世程序员所未抱有的。

末尾禁不住要抱怨一下,作者Pete
Goodliffe以他加上的阅历与欣赏,给翻译带来了未略的劳动,比如由于对乐之喜好,所有章节的题都来源于英国底歌曲名称。为了了解上之直观,我们以翻译的历程中使的是“信达雅”中之“雅”,以担保国内读者能生快切入主题。本书每段开和做的经过遭到,作者都引用了史及还是本社会中一些名家的名言,这给翻译多了重重的难度,但是由方便精辟,这些名言也可是称为点睛之笔。尤为值得欢欣鼓舞之是,此君对我中华文化竟然为有得的功夫,孔夫子同大的哲理名言竟然屡屡面世,而且能够方便地表述出这些圣人之想想对软件开发有安启示,这挺勿略,难为了作者,也真正难为了译者。从外作者的笔下,让咱们真的体会到了友好国家之文化源远流长。这自一个边也体现出东海西海,千圣一心。

此书为了我们一个飞成功进阶的好范例。我道它还如一个程序员的入门或者修行心法。从此入门,我们可掉运动多弯路。同时,我们吧如力争像佛经中“般若波罗密”所谈的那样:大聪明及对岸,最后连佛法也如渡河之筏子一样,成佛后随即抛弃。我重新要的是,看罢是开的读者们,最后能够拍案而起,大声说:我可以了。

 

译  者   

2007-12-2 于北京

前言

即时即是《编程匠艺——编写卓越之代码》要达标的目的。这本开之情节恐怕没有有人向您传授了:如何“在切实世界面临”正确地编程。《编程匠艺——编写卓越之代码》填补了教科书中所短的始末。的确,这按照开讨论了完美代码的技术细节和难点。但除它还包再多之始末:如何以正确的不二法门编写正确的代码。

立刻是什么意思为?在现实世界中,编写好的代码有多更之义:

— 编写在技术上优雅的代码

— 编写可保护的代码,让其他人也可看得清楚

知道并改写其他人所编写的乱七八糟的代码

跟另外程序员良好地并肩作战工作

万一变成一个编码高手,你用有所这些能力(甚至又多)。

君必了解代码那神秘之人命:当您输入代码之后,会有啊?

你必须有审美的力量:区分优美之代码和丑陋的代码。

卿还非得在实践中运用理论的心机:认真想并缓解以下问题,什么时候利用简化的操作是情理之中之,什么时候开始动手代码设计,以及什么时已和继承(实用的“提前退出”原则)等

本书以帮而实现这些目标。

你将念到哪当软件工厂面临求得生存,如何观察战场连询问敌人,如何制定战术以逃避敌人的圈套,以及哪些以种种困顿面临开的确帅的次第

软件开发是一个有意思的生意。这个职业在飞地提高,充满了瞬间即逝的兴元素以及变幻莫测的风尚、致富的计划和新见解的传播者。

它并无熟。我未是宣称自己生什么神奇的答案,但自委有一些自经验的、有用的建议与大家享受。

本书没有象牙塔中之反驳,而仅仅是具体世界的更和有些好之惯。

若是消化了立即仍开之内容,你以不仅会成平等叫做再好之程序员,而且你拿成软件工厂遭相同号又不错的常住居民,一称真正的代码战士,你拿拟到编程匠艺的艺

倘就听起并无令人激动,那么可能你该考虑当队伍里谋职了。

做得还好

那,是啊用“优秀”的程序员和“糟糕”的程序员区分开的吧?更主要之是,是啊用“杰出”的程序员和才是“够格”的程序员区分开的也?

那心腹并不仅在于他们之技术力量——我曾见了无数针对语言专业了然于心、能够写起深紧凑和于人玩味的C++程序的程序员,他们才华横溢,但是她们写出来的代码却非常糟糕。

自身吧曾见了更多谦逊的程序员,他们坚持修好节俭的代码,但是她们所编写的主次却百般优雅与仔细。

委的分别是呀?好的程序设计来源于于你的千姿百态。而好之态势在你打探职业化的艺术,以及对编写最好之软件的意志力追求,而不任软件工厂的下压力有多要命。

态度就是比如相同给透镜,我们由此它们来拘禁世界。这对透镜为咱的办事和作为增添了色彩。

优质的代码需要由艺术大师精心编制,而不是出于懒散的程序员随意地粗制滥造。通向优秀代码的征程是由好的愿望铺便改为的。

苟变成突出之程序员,我们得学会从完美的意起步,培养积极的意,并而这种健康的千姿百态发扬光大。

当本书中,我们拿见到哪些就即或多或少。书中涵盖了大量之主题,小到实用的代码编写问题,大及集体架构性问题。在拥有这些主题中,我都着重强调了呀是不错的神态与章程。

 

姿态——前进的角度

照软件开发的世界,随着调查及归类的递进,我越来越相信如果典型的程序员脱颖而出的凡姿态。字典中对“态度”(attitude)的定义是这样的:

态度

1.心情,看法:心理或感情的状态;性情。

2.飞行器姿势,姿态:飞机轴相对于有一样参照直线或平面(如地平线)所处

的位置。

首先只概念并没有啊令人奇怪的远在,那么第二个也?实际上,第二个概念比第一单又有发表意义。

我们怀念像有三漫漫纵贯飞机的轴线:一修从旁的尾翼到外一侧的尾翼,一久从机头到机尾,还有平等长达和眼前片长达轴线垂直相交于其交点处。飞行员因这三长条轴线来恒定飞机,它们定义了机前实施路线的角度。这名飞机的航空姿态(attitude)。如果飞机的飞行姿态不得法,那么只要出充分粗之外力施加到飞机达,飞机就见面极大地距离它的目的地。飞行员必须天天盯住飞机的飞姿态,特别是在起飞与属等关键时刻。

虽这听起来如一个干燥的励志片,但她的确是咱的软件开发工作的一个适度比喻。飞机的“态度”决定了它发展的角度,而我辈的姿态则决定了咱们于成功编码的路的大方向。程序员的技术能力有多胜并无紧要,如果他要么她的能力没有丁健康态度的支撑,那么工作仍以凡同等宗痛苦之饭碗。

荒唐的态度好引致或刹车一个软件项目,所以保持是的腾飞角度来进展编程是必不可缺的。你的千姿百态还是阻碍,要么促进你的个人成长。要惦记成为再精的程序员,我们得确保有不错的神态。

孰应该看这按照开

明白,那些梦想加强他们代码质量的人数该读这本书。我们且期盼成为更好之程序员;如果您无这种期盼,那么就仍开就不适合您。

汝或许是相同誉为工作之程序员,很可能曾经入行多年。

卿恐怕是一样叫作高年级的生,熟知编程的概念,但是不顶自然该怎么样用这些概念付诸于行。

苟您方接受指导,或正在指导某个新手,读这本开啊会见大有裨益。

您得就有所编程经验。本书并无是若教你怎样编程,而是告您怎么还好地编程。当我尽力避免语言的歧义和教条时,我急需举出一些代码示例。这些示例大部分凡是使用C、C++或Java语言编写的,因为这些语言是今天盛行的语言系统。读这些事例并不需要你是某种语言的大家,所以即便你免是一等的C++程序员,也绝不惶恐。

自身借而你当作本书的读者,正在或者即将在软件工厂的下压力下编制代码。这一般意味着你让雇于一个商业性的开支组织,但您闹或当开发一个零乱的开放源码开发项目,或成一个受雇为老三正在提供软件的枪手(项目承包方)。

本书包含如何内容

本书的根本在于程序员的态度,但她并非是千篇一律论心理学教科书。我们拿深入探讨许多主题,包括:

— 源代码的体制

— 防御性的编码技巧

— 如何有效地调试程序

— 良好的社协作技巧

— 管理而的源代码

迅猛地浏览一下目录,你就是可了解本书所蕴涵的情节。选择这些主题的说辞是什么啊?我既来好多年从事培训新程序员的干活,在此期间这些主题反反复复地被提出。我吧就当软件工厂面临任职多年,看到了无数同样尽又同样尽出现的题材,而这些题材还是暨以上主题相关的。

一旦你能够征服这些编程的束缚,那您拿由一个读书编程的初手成长也平员真正的编码高手。

本书的团组织形式

自家曾竭尽全力将即时仍开写得爱阅读。传统的格言这样说,你当从头开始并着力干活至最后。忘掉这词话吧。你一点一滴可拿起这按照开,打开你感兴趣的章节,并起那边读由。每个章节都是单身的,其中起过多使得之陆续引用,可以要你了解各章之间是哪结束合在一起的。当然,如果您欣赏以传统,从头读由为未错过是一个好之精选。

各个章节都坐相似的组织编写,你免会见发觉任何特殊。每一样章节还好分成下几乎只有:

本章主题

当各段的平从头,我会列有该区块的要领。你可以打此间询问内容梗概。浏览一下这些主题,你虽会理解将关乎哪些方面的内容。

回主体

这边都是碰头给你觉得本书物有所值的动人的始末。

当段主体中见面瞬间出现局部“关键理念”。这些主要理念强调了重在的技术、问题与态度,所以针对这些情节要挺关心。其格式是如此的:

重中之重概念  重要内容。注意!

总结

于每段的尾声,这等同小节将总结该章所讨论的主题。它也整章内容提供了一个概括性的视图。如果您确实时间有限,也得以只读每章的重中之重理念跟这些总结部分。千万别告诉别人就是我说之。

接下来,我用比可以程序员和糟糕程序员的所作所为方式,来总你应有力求以的要害态度。如果您有胆,也可因这些事例来评论一下温馨,但愿事实不会见为您无与伦比哀伤!

任何请求参见

这列表会拿您带相关的区块,并说明其是怎样和当下的主题相关的。

思考

最终,我以列出一些待思想的问题。这些问题并无游离于全书之外——它们是各章不可缺失的同部分。它们并无是若而想起刚刚所阅读之主题,相反,这些题目的目的是设您进行考虑,并联想到该章之外的情节。这些题目分为两组:

— 深入思考  这些题材用深刻地研究各章的主题,并提出一些根本之论点。

— 了解自己  这些题目拿暗访你跟软件开发团队的行事习惯以及编码成熟度。

甭略过这些题材!即使你特别懒,以至于不思以下来认真想每个题目的答案(相信我,思考这些题材的答案会要你受益无穷的),至少也当读一念这些题材并顺便开来思考。

本书的尾声一有含有了针对性这些题材的答案和议论。这并无是同一法直接的答案集——这些问题备受杀少好一直用“是”或“否”来回答。在公考虑并拿走答案后,不妨与自身的答案做个比较。我之众多“答案”都蕴涵了有各章中莫涉及的附加信息。

节——详细说明

本书的各一样段还拿讨论一个独立的主题,涉及现代软件开发的一个有血有肉问题领域。这些题目是人们编写糟糕之代码或不好地修代码的周边原因。各章节所描述的不利方法和态度,将如站于第一线的卿生命力更精神。

本书共分为六篇;每一样首的目录页列出了各篇所包含的段,并简短描述了每个章节所蕴涵的情节。这些篇将由内而外地展开讨论。我们拿从该编写“何种”代码开始动手,最终着眼于我们应“如何”编写这种代码。

俺们的座谈起代码表面初始,主要是打总的角度解析哪些编写源代码。我特别用即时有的在全书的极前头,因为剪裁代码是程序员们所真正关心的。

第1篇:代码表面

本篇描述了支付源代码的切实细节。我们用钻防御性编程的技术,以及哪编写代码的格式和版式。然后,我们以延续深究如何呢代码命名暨召开笔录。编写注释和处理错误的艺也暗含在本篇中。

第2篇:代码的秘密生命

通下去,我们将讨论编写代码的过程,即什么创建代码和处理代码。我们用了解构造代码的工具、测试方法、调试技术、编译可执行程序的没错过程以及优化等内容。最后,我们用考虑如何勾勒有平安之次第。

第3首:代码的变异经过

然后,我们用从再广的角度谈谈构造源代码的题目。我们将讨论代码设计方案的支付、软件的系布局与源代码是安随时间而成长(或老化)的顶问题。

生一致步,我们拿上“宏观”层面,抬起来看看身边有的从业——软件工厂遭之生活。如果非是一个支付小组的成员,我们是勿可能勾有大软件的,接下去的老三首包含了哪在团队受到获益的技能及道。

第4篇:“一群”程序员

程序员不容许生存于真空中。(这亟需来奇的呼吸装备。)在本篇中我们用跻身更广的世界,看同样禁闭好之开习惯,以及哪些以这些习惯融合到事情程序员的平常工作屡遭。本篇还隐含了优良的私有及团组织编程技巧,以及本维护系统的使用方法。

第5篇:开发进程的一部分

以本篇中,我们以讲述软件开发过程的一些平整:书写规范、执行代码审查与时光预算的魔法。

第6篇:从高处俯瞰

最终一篇将起高处为下审视开发过程,研究软件开发方法论,以及不同之编程规则。

怎样行使本书

起头读到尾,或打君感兴趣之地方读起,都没有问题。

重要的凡,你要是带在同种植开阔的合计去读《编程匠艺——编写卓越之代码》这按照开,并考虑什么以您所读到之情节以及公所开的事体上。聪明之总人口打友好的一无是处被上,而重复明白之人头虽由他人的错误受学习。从旁人的经验中读书总是好的,所以当朗诵了及时本书之后,就好了解你所崇敬的程序员的视角。浏览各章之后的问题并和这些程序员进行讨论。

指望您在就学编码匠艺的时节,能够收获快乐。读了以后,回顾一下,看看有微微匠艺是公肯承受的,你的匠艺提高了略微,以及若的情态是否有所改进。如果什么为没有有,那么这本开便没戏了。我信任结果不会见是这么的。

于先生的一些提议

马上是千篇一律比照指导更比较少的程序员的生好之工具书。对于这或多或少,我在作本书的进程被特地展开了考虑,并且本书都证实有助于增高程序员的成熟度和洞察力。

读本书的特级方式,并无是为此某种方式一口气学完所有内容。相反,最佳办法应是各自阅读各章,然后与接受而点的初手讨论该区块的内容。各章最后列有的题材可以当讨论的起点,所以打这些问题初步谈论,不失为一个吓方法。

目 

第1首  代码表面第一片

第1章节  善于防守:健壮代码的防御性编程技巧    3

1.1  向美好的代码前进      3

1.2  设想:最充分的挑      4

1.3  什么是防御性编程?   6

1.4  又蛮而蛮之社会风气   8

1.5  防御性编程技巧   9

1.5.1  使用好的编码风格和客体之筹划   9

1.5.2  不要仓促地修代码       9

1.5.3  不要相信任何人       10

1.5.4  编码的靶子是清,而不是简单   11

1.5.5  不要让任何人开他们无拖欠做的补工作       11

1.5.6  编译时打开所有警告开关       12

1.5.7  使用静态分析工具   13

1.5.8  使用安全之数据结构       13

1.5.9  检查有的归值   14

1.5.10  审慎地拍卖内存(和另外宝贵的资源)     14

1.5.11  在宣称位置初始化所有变量  15

1.5.12  尽可能推迟一些声称变量     15

1.5.13  使用正规语言工具  15

1.5.14  使用好之确诊信息日志工具  16

1.5.15  审慎地开展强制转换     16

1.5.16  细则  16

1.6  约束      17

1.6.1  约束的情       19

1.6.2  移除约束   19

1.7  总结      22

1.8  另请求参见      22

1.9  思考      24

1.9.1  深入思考   24

1.9.2  结合自己   24

第2回  精心布局:源代码的版面与体裁       26

2.1  什么是非同小可   27

2.2  了解您的读者      27

2.3  什么是好的样式   29

2.4  使用括号      30

2.4.1  K&R括号风格  30

2.4.2  悬挂式的括号风格   31

2.4.3  缩进的括号风格       32

2.4.4  其他的括号风格       33

2.5  主宰一切的风格   33

2.6  内部风格(以及当何用其)   35

2.7  设立专业      37

2.8  正义的烽火   39

2.9  总结      40

2.10  另请求参见    42

2.11  思考     42

2.11.1  深入思考  42

2.11.2  结合自己  43

第3节  名正言顺:为发生意义的事物起出义之称呼    45

3.1  为什么我们应当适中地命名呢   47

3.2  我们对啊进展命名   47

3.3  名字游戏      48

3.3.1  描述性       48

3.3.2  技术上对       48

3.3.3  符合语言习惯   49

3.3.4  恰当   49

3.4  具体细节      50

3.4.1  命名变量   51

3.4.2  命名函数   52

3.4.3  命名类型   53

3.4.4  命名名字空间   54

3.4.5  命名宏       55

3.4.6  命名文件   56

3.5  玫瑰不给玫瑰      57

3.5.1  保持前后一致   58

3.5.2  利用上下文       58

3.5.3  使用对你方便之称呼       59

3.6  总结      59

3.7  另请求参见      61

3.8  思考      62

3.8.1  深入思考   62

3.8.2  结合自己   63

第4章  不言自明:编写“自文档化”代码的技艺    64

4.1  自文档化的代码   66

4.2  编写自文档化代码的技能   69

4.2.1  使用好之体制编写简单的代码       69

4.2.2  选择出义之名   70

4.2.3  分解为原子函数       70

4.2.4  选择描述性的门类   71

4.2.5  命名常量   71

4.2.6  强调要的代码       72

4.2.7  分组相关信息   72

4.2.8  提供文件头       72

4.2.9  恰当地处理错误       73

4.2.10  编写有义之笺注  73

4.3  实用的自文档化方法   74

4.3.1  文学性编程       74

4.3.2  文档化工具       76

4.4  总结      78

4.5  另请求参见      79

4.6  思考      79

4.6.1  深入思考   79

4.6.2  结合自己   81

第5章  随篇注释:如何编写代码注释    82

5.1  什么是代码注释   83

5.2  注释看上去是怎样的      84

5.3  多少注释是适宜的      84

5.4  注释中应有产生头什么   85

5.4.1  解释为何,而不是安   85

5.4.2  不要描述代码   86

5.4.3  不要取代代码   86

5.4.4  确保注释有因此   86

5.4.5  避免分心   88

5.5  实践      88

5.6  从审美的角度看注释   89

5.6.1  一致性       89

5.6.2  清晰的片注释   90

5.6.3  缩进的诠释       90

5.6.4  行尾注释   91

5.6.5  帮助您读书代码       91

5.6.6  选择一样种植保护资金比逊色之品格       92

5.6.7  分隔板       92

5.6.8  标志   92

5.6.9  文件头注释       93

5.7  使用注释      94

5.7.1  帮助您编例行程序       94

5.7.2  错误修正通告   95

5.7.3  注释过时   95

5.7.4  维护与架空的诠释   96

5.8  总结      97

5.9  另请求参见      98

5.10  思考    98

5.10.1  深入思考  98

5.10.2  结合自己  99

第6回  人非圣贤:处理不可避免的情——代码中

的谬误情形    100

6.1  从何而来      101

6.2  错误报告机制      102

6.2.1  不报告       103

6.2.2  返回值       103

6.2.3  错误状态变量   104

6.2.4  异常   104

6.2.5  信号   106

6.3  检测错误      107

6.4  处理错误      108

6.4.1  何时处理错误   109

6.4.2  可能的反馈       110

6.4.3  代码示例   112

6.5  使地狱浮现   116

6.6  管理漏洞百出      118

6.7  总结      119

6.8  另请求参见      119

6.9  思考      120

6.9.1  深入思考   120

6.9.2  结合自己   121

第2首  代码的密生命第一片

 第7节  欲善其事,先利其器:使用工具构建软件      125

7.1  什么是软件工具   126

7.2  为什么而当一齐工具      128

7.3  使工具发挥作用   129

7.3.1  了解它能够举行来什么   130

7.3.2  学习怎么样驾驶它       130

7.3.3  了解它们可啊任务       131

7.3.4  检查其是否可用       131

7.3.5  找到了解又多信息之路       131

7.3.6  查明新本子何时起       132

7.4  哪个工具      132

7.4.1  源代码编辑工具       133

7.4.2  代码构建工具   136

7.4.3  调试和查工具       138

7.4.4  语言支持工具   140

7.4.5  其他工具   141

7.5  总结      142

7.6  另请求参见      143

7.7  思考      144

7.7.1  深入思考   144

7.7.2  结合自己   145

第8段  测试时:测试代码的魔术       146

8.1  反思现实      148

8.2  谁、是呀、何时与为什么   149

8.2.1  我们为什么而测试   149

8.2.2  谁来拓展测试   150

8.2.3  测试的内容发生若干什么       150

8.2.4  何时进行测试   151

8.3  测试并无麻烦……   152

8.4  测试的种类   156

8.5  选择单元测试用例      160

8.6  为测试而规划      163

8.7  看!不要因此手      164

8.8  面对故障该怎么处置      165

8.9  你可知管住它为      166

8.9.1  缺陷跟踪网   166

8.9.2  bug审查    168

8.10  总结    169

8.11  另请求参见     169

8.12  思考    170

8.12.1  深入思考  170

8.12.2  结合自己  171

第9段  寻找缺陷(调试):当工作进行得无顺利

每每欠怎么收拾    172

9.1  生活之真面目   173

9.2  bug的种类    174

9.2.1  从塞外看   174

9.2.2  从前后看   175

9.2.3  从再近处看       178

9.3  消灭害虫      180

9.3.1  地下的路   181

9.3.2  地上的路   181

9.4  搜寻bug       182

9.4.1  编译时错       182

9.4.2  运行时左       184

9.5  如何修正缺陷      188

9.6  预防      190

9.7  除蜂剂、驱虫剂、捕蝇纸   190

9.7.1  调试器       190

9.7.2  内存访问校验器       191

9.7.3  系统调用跟踪   191

9.7.4  内核转储   191

9.7.5  日志   191

9.8  总结      192

9.9  另请求参见      193

9.10  思考    194

9.10.1  深入思考  194

9.10.2  结合自己  194

第10章节  代码构建:将源代码转换为而实施代码的进程      196

10.1  语言障碍    197

10.1.1  解释型语言     198

10.1.2  编译型语言     199

10.1.3  字节编译型语言     200

10.2  小题大举行    201

10.3  构建软件版本    203

10.4  怎样才好不容易一个上佳之构建系统    206

10.4.1  简洁  206

10.4.2  一致  207

10.4.3  可再与保险  207

10.4.4  原子性     208

10.4.5  能够应付错误  209

10.5  技术细节    210

10.5.1  目标的抉择     210

10.5.2  内务处理  212

10.5.3  依赖关系  212

10.5.4  自动构建  213

10.5.5  构建配置  214

10.5.6  递归地使用make    215

10.6  请发布自己吧 215

10.7  构建大师是万能的吗 218

10.8  总结    218

10.9  另请求参见    219

10.10  思考   219

10.10.1  深入思考       220

10.10.2  结合自己       220

第11章节  追求速度:优化程序与编辑高效之代码  222

11.1  优化是什么 223

11.2  是啊而代码不尽如人意 224

11.3  为什么不开展优化呢 225

11.4  为什么要开展优化     228

11.5  优化的有血有肉细节 229

11.5.1  证明您待开展优化     230

11.5.2  找有运行得太缓慢的代码  230

11.5.3  测试代码  232

11.5.4  优化代码  233

11.5.5  优化后  233

11.6  优化的技术 233

11.6.1  设计变更  234

11.6.2  代码更改  237

11.7  编写高效的代码 241

11.8  总结     243

11.9  另请求参见     244

11.10  思考   244

11.10.1  深入思考       244

11.10.2  结合自己       245

第12段  不安全感综合征:编写安全的次序  247

12.1  危险    248

12.2  敌人    250

12.3  借口,都是托辞 252

12.4  感到挺脆弱 253

12.4.1  不安全的设计和系统布局     253

12.4.2  缓冲溢起  254

12.4.3  嵌入的询问字符串  255

12.4.4  竞争状况  255

12.4.5  整数溢起  256

12.5  防范措施    257

12.5.1  系统设置技术  258

12.5.2  软件设计技术  258

12.5.3  代码实现技术  260

12.5.4  规程技术  261

12.6  总结    261

12.7  另请求参见    262

12.8  思考    263

12.8.1  深入思考  263

12.8.2  结合自己  263

第3篇  代码的朝三暮四过程首先有的

 第13段  崇尚设计:如何编写产生精彩的软件设计       267

13.1  边设计边编程    268

13.2  我们设规划啊 269

13.3  为什么如此忙乱 270

13.4  良好的软件设计 271

13.4.1  简洁  272

13.4.2  优雅  273

13.4.3  模块化     274

13.4.4  良好的接口     275

13.4.5  可扩展性  278

13.4.6  避免重复  278

13.4.7  可移植性  279

13.4.8  符合语言习惯  280

13.4.9  良好地文档化  280

13.5  如何规划代码    280

13.5.1  设计艺术及过程     281

13.5.2  设计工具  282

13.6  总结    285

13.7  另请求参见    285

13.8  思考    286

13.8.1  深入思考  286

13.8.2  结合自己  287

第14章节  软件体系结构:奠定软件设计的基本功      288

14.1  什么是软件体系结构 289

14.1.1  软件蓝图  289

14.1.2  视图  290

14.1.3  在何时和何处进行系统结构设计  292

14.1.4  用体系布局来做呀     293

14.1.5  关于组件和连续     294

14.2  什么是有口皆碑的系布局    295

14.3  体系布局风格    297

14.3.1  没有系统布局  297

14.3.2  分层的系布局     298

14.3.3  管道和过滤器体系布局  299

14.3.4  客户端/服务器系统布局 299

14.3.5  基于组件的体系布局     302

14.3.6  框架  303

14.4  总结    303

14.5  另请求参见    304

14.6  思考    305

14.6.1  深入思考  305

14.6.2  结合自己  305

第15节  改良与革命:代码是哪成长之      307

15.1  软件腐烂    308

15.2  警告信号    310

15.3  代码是怎样成长的    312

15.4  相信不容许的务 315

15.5  对这我们得以开来什么? 316

15.5.1  编写新代码     316

15.5.2  维护现有代码  317

15.6  总结    319

15.7  另请求参见    319

15.8  思考    320

15.8.1  深入思考  321

15.8.2  结合自己  321

第4篇  “一过多”程序员第一部分

 第16回  代码猴子:培养正确的编程态度跟措施       325

16.1  各种各样的猴子 326

16.1.1  卖力工作之程序员  327

16.1.2  代码猴子  328

16.1.3  权威  329

16.1.4  半权威     330

16.1.5  傲慢的上才     331

16.1.6  牛仔  333

16.1.7  规划者     334

16.1.8  老前辈     335

16.1.9  狂热者     336

16.1.10  单线条程序员       337

16.1.11  拖沓者    338

16.1.12  勉强的团负责人   339

16.1.13  你   340

16.2  理想之程序员    340

16.3  那么该怎么处置    341

16.4  最愚蠢的人 342

16.5  总结    343

16.6  另请求参见    343

16.7  行为表格    344

16.8  思考    345

16.8.1  深入思考  345

16.8.2  结合自己  345

第17段  团结就是是力量:团队协作以及私程序员  347

17.1  我们的社——概览 348

17.2  团队组织    350

17.2.1  管理措施  350

17.2.2  责任分开  350

17.2.3  组织和代码结构     352

17.3  团队合作工具    352

17.4  团队疾病    354

17.4.1  巴别塔     354

17.4.2  独裁制     356

17.4.3  民主制     357

17.4.4  卫星站     359

17.4.5  大峡谷     361

17.4.6  流沙  363

17.4.7  旅鼠  365

17.5  良好团队协作之个人技术及特征    366

17.5.1  沟通  366

17.5.2  谦虚  367

17.5.3  处理冲突  367

17.5.4  学习及适应能力     369

17.5.5  了解您的不足之处  369

17.6  团队合作条件    370

17.6.1  集体代码所有制     370

17.6.2  尊重他人的代码     371

17.6.3  编码准则  371

17.6.4  定义成  371

17.6.5  定义责任  372

17.6.6  避免倦怠  372

17.7  团队的生命周期 372

17.7.1  团队的创建     373

17.7.2  团队的成材     375

17.7.3  团队协作  377

17.7.4  团队结束  377

17.8  总结    380

17.9  另请求参见    381

17.10  行为表格   382

17.11  思考   383

17.11.1  深入思考       383

17.11.2  结合自己       383

第18章  安全法:源代码控制及自身控制  385

18.1  我们的权责 386

18.2  源代码控制 387

18.2.1  修订控制  388

18.2.2  访问控制  390

18.2.3  处理代码库     390

18.2.4  在代码树上创建分支     391

18.2.5  源代码控制简史     393

18.3  配置管理    393

18.4  备份    395

18.5  发布源代码 396

18.6  应该拿源代码放在何    397

18.7  总结    398

18.8  另请求参见    399

18.9  思考    400

18.9.1  深入思考  400

18.9.2  结合自己  400

第5篇  开发进程的一部分第一局部

第19回  注意细节:编写软件专业  403

19.1  规范到底是啊 404

19.2  规范之品种 405

19.2.1  需求规范  407

19.2.2  功能规范  409

19.2.3  系统系统布局正式  410

19.2.4  用户界面规范  410

19.2.5  设计规范  411

19.2.6  测试规范  412

19.3  规范应该包含哪些内容    413

19.4  规范编写过程    415

19.5  我们怎么会无修规范 418

19.6  总结    420

19.7  另请求参见    420

19.8  思考    421

19.8.1  深入思考  421

19.8.2  结合自己  421

第20节  代码审查:执行代码审查  423

20.1  什么是代码审查 424

20.2  何时进行审核    425

20.2.1  是否如拓展复核     426

20.2.2  审查哪些代码  427

20.3  执行代码审查    427

20.3.1  代码审查会议  428

20.3.2  集成审查  431

20.4  审查而的神态    432

20.4.1  作者的情态     432

20.4.2  审查人员之态势     433

20.5  完美的代码 434

20.6  代码审查之外    435

20.7  总结    436

20.8  另请求参见    436

20.9  清单    437

20.10  思考   438

20.10.1  深入思考       438

20.10.2  结合自己       438

第21段  时间量:软件时限定估计的魔术      439

21.1  在万马齐喑中查找    440

21.2  为什么估计这么困难 441

21.3  压力之下    443

21.4  实用的估算方法 444

21.5  计划游戏    447

21.6  坚持    451

21.7  总结    454

21.8  另请求参见    454

21.9  思考    455

21.9.1  深入思考  455

21.9.2  结合自己  455

第6篇  从高处俯瞰第一片段

第22章  程序秘方:代码开发的办法和过程  459

22.1  编程风格    460

22.1.1  结构化编程     461

22.1.2  面向对象的次第设计     462

22.1.3  函数式编程     463

22.1.4  逻辑编程  464

22.2  烹饪方式:做啊与哪些做    464

22.3  开发进程    465

22.3.1  混乱  466

22.3.2  瀑布模型  468

22.2.3  SSADM和PRINCE       470

22.3.4  V模型     470

22.3.5  原型设计  471

22.3.6  迭代和增量开发     472

22.3.7  螺旋模型  473

22.3.8  敏捷的点子     474

22.3.9  其他开销过程  475

22.4  已经够用了    476

22.5  选择同一种过程    477

22.6  总结    478

22.7  另请求参见    478

22.8  思考    479

22.8.1  深入思考  479

22.8.2  结合自己  479

第23章  编程领域大观:不同之编程分支      481

23.1  应用程序编程    482

23.1.1  塑装软件  483

23.1.2  定制应用程序  484

23.2  游戏编程    485

23.3  系统编程    486

23.4  嵌入式编程 488

23.5  分布式编程 490

23.6  网络应用程序编程    492

23.7  企业编程    494

23.8  数字编程    495

23.9  那以怎么样    497

23.10  总结   497

23.11  另请求参见   498

23.12  思考   498

23.12.1  深入思考       499

23.12.2  结合自己       499

第24章  下同样步呢:结果好就是所有都好  500

不过产一致步该做什么啊?       501

答案和座谈    504

参考书目       607