驯服烂代码:在编程操练中悟道

所需积分/C币:9 2014-10-28 16:47:45 4.98MB PDF
收藏 收藏 4
举报

资深软件技术专家、匠艺程序员20余年编程、测试和管理经验和智慧结晶,著名软件技术专家、ThoughtWorks领队咨询师张逸作序推荐 最具实践指导意义的驯服烂代码的著作,通过编程操练的方式完整展示了驯服烂代码的过程、思想和方法
/choice 序 极限编程的创始人 Kent beck对编程给出了如下定义 1)编程是一种态度。 2)编程是一种技艺 3)编程是一种习惯。 这三句话的语序并非随意排列,而是代表了一个渐进的过程。首先需要树立正确的编程 态度,进而追求编程技艺的提升,最终形成良好的编程习惯。 正所谓“态度决定一切”,编程态度的重要性不言而喻,殊不知,作为程序员的我们却 常常忽略了它。不是轻视,而是自以为已经理解。写出好代码,不是自然而然的吗?哪里用 得着再三强调?—只是 只是他们会说:“倘若时间允许,我当然是要竭尽所能写出好代码啊!” 言外之意,若是时间不允许,我们就有了粗制滥造的权利了! 倘若不是编码,而是修建一栋大厦,难道建筑工人可以说:“倘若时间允许,我当然要 建造出牢固抗震的大厦啊!” 言外之意,若是时间不允许,我们就可以放宽大厦的质量了! 时间,何其无辜! 真正的编码态度,就是要在任何时刻都要保持精益求精,务求代码的正确无误,务求代 码的清晰可读。一旦嗅到代码的“坏味道”,我们就应该及时重构。对于烂代码,我们就应 该尽力去驯服!窃认为,这或许才是伍斌写作本书的初衷:贯以正确的编程态度,进而提升 编码技艺。 软件架构的重要性不言自明,开发团队也舍得花大量的成本在架构上追求最好。对于如 何编写出好的代码,虽有诸如 Martin fowler、 Robert o. Martin、 Michael c. Feathers等大师 珠玉在前,为我们编写出好代码提供了良好的模板,但是现状却是大量的烂代码俯拾皆是, 而且层岀不穷,并随着项目的演进而蔓延,以至于酿成不可挽回之势。究其原因,还是在一 开始就没有对烂代码给予足够的重视,为了赶进度,我们只追求功能的实现,满足一时之需 求。我们忘记了地面的坎坷,忘记了沼泽的泥泞,刻意编织了一个美好的幻梦,致使我们忘 记当下,只顾着远望前方,以至于越陷越深而不自觉。当我们泥足深陷而不可自拔时,才发 现这些烂代码已经不是我们目前的能力所能够应对的了。悔之晚矣! 态度是第一位的。如果我们从一开始就学会小步前行,并保证步伐的稳健,即使路况堪 忧,也未必会泥足深陷。若是必须在泥沼之上行走,我们也可以找来木板竹排,减轻身陷其 中的压力。对于程序员来说,驯服烂代码,其实就是我们谋生的技能,就是行走泥沼必备的 木板竹排。因此,操练编码能力,提升自己的谋生技能,不过是题中应有之义。既然庖丁可 以将解牛作成一门艺术,我们自然也不能为写出勉强可用的代码而自满自足。 伍斌的这本大作得自他自己年复一年对代码的操练,真正体会了“练习中的平凡与伟 大”,从而将测试驱动开发、重构与设计模式应用娴熟,达到得心应手的程度。本书就是伍 斌日常的训练宝典,实战笔录。作为编程操练社区bjdp.org°的创始人,伍斌几乎将全部身 心都投入到I社区公益中,为程序员提升编码技能布道传法,孜孜不倦,这令我钦佩不已。 如今大作得以付梓岀版,也算是IT社区的幸事。毕竞编程操练社区囿于场地与人力的限制, 无法普及到更多的程序员。因而,阅读本书的读者,完全可以照着书中的例子,来一次虚拟 的编程道场,操练技艺,驯服烂代码,不亦乐乎。 陆放翁诗云“纸上得来终觉浅,绝知此事要躬行”,这正是阅读本书的正确做法。虚拟 编程道场,等你来闯! ——张逸 Lead Consultant, Thought Works ⊙ bjp.org北京设计模式学习组( Beijing Design Patterns Study Group)是笔者在2013年4月6日创办的公益 编程操练社区,参见网站htt:/www.bjdp.org。 crece 程序员好比运动员,要想在竞技场上获胜,需要在训练场里长期刻苦地练习技艺。 程序员好比士兵,要想在短兵相接的白刃战中取胜,需要在练兵场上长期刻苦地练习 格斗。 程序员好比调酒师,要想用炫目的技艺为客人花式调酒°,需要在业余时间长期练习 抛瓶。 运动员与和平年代的士兵有大量的时间用于训练。但绝大多数程序员所在的软件公司 在一个接着一个的项目进度的压力下,无法提供大量的时间来供程序员练习,而很多程序员 又不愿意在下班后再碰代码。如此一来,程序员们就成了一直在竞技场上比赛的运动员 直在敌人面前搏斗的士兵,和一直在客人面前抛瓶的调酒师,他们没有时间练习。 这样不做练习的程序员,只能把在练习过程中所犯的错误都留在了公司的代码库里,成 为了烂代码。已有的烂代码延长了给软件添加新功能和修复bug的时间,带来更大的进度压 力,这就导致利用工作时间练习的机会更少了,进而在代码库里留下更多的练习时所犯的错 误,形成了更多的烂代码。如此往复,万劫不复。 如此说来,程序员应该像调酒师那样,上班时间努力工作,下班时间操练手艺。 编程是一门手艺。手艺是自己的,如果在公司领导的支持下能在上班时练习固然很好 但若条件不具备,那么就在下班时自己练。其实这也不吃亏,艺多不压身 本书就是为程序员练习编程这门手艺而撰写的 ③调酒一般分为英式和花式(美式)两种风格。前者是很正统的调酒方式,没有任何花哨的成分在里面。而 后者类似于杂技一样,以炫目的动作去吸引人的眼光。参见http://zhidao.baidu.com/link?url=wodhmvyjas K8tOjILrQfNuj4lX37R68EVdUWFGdmwRW14ZXMbLAN4wxckNOCq cqlkrpUrvOsowgSrynDjbQ8Va 这是一本什么样的书? 这是一本讨论如何用TDD(测试驱动开发)方法驯服烂代码的书。无论程序员水平是高 是低,都可能写出烂代码。所以驯服烂代码是每一位程序员都会面临的工作。而如何驯服则 需要亲手重构代码并加以体会才能得心应手。本书就是笔者在最近这一年半的时间里,在自 已所创办的公益编程操练社区bjip.og进行编程操练获得的体会的结晶。 这是一本描写编程过程的书。“授人以鱼,不如授之以渔。”这里,“鱼”是结果,而 渔”是过程。如此说来,过程要比结果重要。同样,获得一段重构好的整洁的代码固然很 好,但是不如掌握从最初的烂代码转变到最终的整洁代码的整个过程的重构方法。 这是一本以结对编程的对话形式来展示编程过程的书。自古以来,作为一心学艺的弟 子,无不渴望师父能一对一地向自已传授绝技。就好比《西游记》中的猴王,拜到菩提祖师 门下为徒,直到7年之后,才有缘深夜得到师父一对一的传授,最终获得真传。而与此类 似,结对编程就是两人之间一对一进行知识传递的过程,机会难得,每时每刻都弥足珍贵。 这本书能带来什么价值? 本书最大的价值,就是能让人在动手驯服烂代码的过程中真正体会到为什么TDD方法 能让开发速度加快。具体来说理由有如下3个。 1)专注。即在开发中只专注于编写恰好能让描述产品特性的测试代码运行通过的生产 代码,而不再多写除此之外的其他代码。用TDD的测试先行进行开发,就和男人逛超市 样,他们会按照纸片上的购买清单(好比照着测试代码)拿货、掏钱、走人,精益适用,不 做无用功。而用不用TDD的测试后行进行开发,就好比女人逛超市,看到有什么打折的、新 款的、促销的好东西都想买(好比程序员编写了很多当下用不到的生产代码),从而造成浪费。 2)复用。在TDD开发中编写的自动化测试代码,将来可以复用,能节省以后 debug和 看log的时间;不写测试而依赖手工 debug或看log的做法,将来无法复用,每次都会做很 多诸如设置断点、单步运行、检査变量、打开并阅读日志文件等重复性工作,从而浪费大量 时间 3)反馈早。如果程序员能够频繁运行TDD中的测试,那么就能使软件的绝大多数bug 在流入下游测试工程师之前被快速发现和修复。这种反馈会远远早于那种软件只由测试工程 师来测试的情况,从而能节省下面这些人员可观的工作时间:测试工程师发现、描述、报告 和跟踪bug;项目经理在各种会议中检査、梳理和分派这些bug;程序员放下手中工作来阅 读测试工程师报告的bug并加以重现和修复。这些人员就能利用所节省的时间来干更有价值 的事情,以加快项目进度。 我适合读这本书吗? 本书适合愿意动手尝试用测试先行的TDD开发方法进行编程操练以提高编程技艺的任 何人,包括专业的程序员、自动化测试工程师、架构师、开发经理及任何TDD开发方法的 学习者,只要您具备下面的一些经验 口能够编写、编译并运行一段简单的Java程序; 口了解或能查询到面向对象的三个基本特征的概念—一封装、继承和多态; 口了解或能查询到有关设计模式和重构的信息、。 这本书讲了什么内容? 本书可分为四大部分。 第一部分(第1~10章)阐释了烂代码的概念。其中第1~4章用测试后行的开发方法 完成了一个编程题目,第5~8章用测试先行的开发方法完成了上面同样的编程题目。在第 9章对比了测试后行与测试先行的开发方法后,引出了第10章有关何谓烂代码的讨论,从而 令人能够看出上面两种开发方法中究竞哪一种更不容易写出烂代码。 第二部分(第11~15章)详述了驯服一段烂代码的过程。其中第11章阅读了一段烂 代码,并把阅读中所闻到的代码腐臭味用TODO记录下来。第12章编写了3个“用户意图 测试”来固化代码现有的行为,并将这些测试运行通过,为下一步重构做好准备。第13章 和第14章分别用釜底抽薪和抛砖引玉的手法来将一个大类分解为若干个小类,即进行重构。 第15章继续重构来清除分解大类工作完成后所遗留下来的代码腐臭。 第三部分(第16~18章)详述了编写真正的单元测试的过程。其中第16章用提取接口 的办法编写Stub来进行单元测试;第17章用子类化并覆写方法的办法编写Mock来进行单 元测试;第18章将被测类与文件系统之间的这种不适合用于单元测试的耦合,转化为被测类 与字符串之间这种适合用于单元测试的耦合,从而通过编程操练体会什么是真正的单元测试 第四部分(第19~20章)总结了驯服烂代码的步骤及方法。其中第19章提出了本书 有关TDD开发方法的一种实现— lePpEr方法,该方法提出了全面重构的概念,对传统的 重构概念进行了扩展。第20章讨论了如何才能使前面所讨论的良好的编程方法形成习惯并 固化下来。最后附录A介绍了有关编程操练的内容,附录B至附录D分别说明了如何在 Windows、OSⅹ和 Linux上搭建编程操练环境。 致谢 neevledecmcir 本书是多人智慧与努力的结晶。下面如有遗漏,在此表示真心的歉意,并表达我衷心的 感谢。 感谢加入公益编程操练社区“bjdp。org北京设计模式学习组”的QQ群(235913915)和 微信公众号( bjp org)及最近一年半以来参加编程道场活动的每一位匠友,你们的大力支持 是本书诞生的动力。 感谢 Kent beck,我从这位大师的著作《Test- Driven Development by Example》一书中 获得了极大的启发,从而确立了本书编程操练的表达方式。感谢 Martin fowler,这位大师 的著作《 Refactoring》是我参考最多的有关重构的书籍之一。感谢 Michael c. Feathers,这 位大师的著作《 Working Effectively with Legacy Code》为我指出了驯服烂代码时必备的解 耦合技术。感谢 Robert c. Martin,这位大师的《 Agile Principles Patterns and Practices in C#》 和《 Clean code》两部著作让我在理解面向对象的设计原则和整洁代码方面受益良多。感 谢 Joshua Kerievsky,正是这位大师的著作《 Refactoring to Patterns》让我萌生了创办公益编 程操练社区“bjdp.org北京设计模式学习组”的念头,并在最近的一年半时间里我所主持的 18次编程道场的活动中,逐渐孕育了本书。感谢 Gerard meszaros,这位大师的著作《ⅹUnit Test Patterns定义了所有主要的测试相关的词汇,另外我在2014年“TiD- Agile China”大 会上在作为大师的中文支持时,从大师那里学到了很多有关编写测试的经验。 感谢 Thought Works公司的领队咨询师张逸能够拨冗为本书作序,这位在敏捷转型、过 程改进、企业系统架构、领域驱动设计、大数据、代码质量提升和测试驱动开发方面均有造 诣的高手,一直是我学习的楷模。 感谢 mily bache和 Luca minudel。我从这两位编程操练高手的书籍和 Github代码库里 获得了本书所用的几个编程操练题目和参考解决方案。操练这些题目真的让我获益匪浅。 感谢下面的朋友为本书撰写提供的宝贵反馈意见:许晓斌,王立杰,陈臣,王洪亮, IX 仝键,罗万华,申健, Steven mak,栾大成,徐宪武,韩杰,李志博,杨武兵, wuqiang, zhangzhe,董英,谢钊,林进峰。 感谢下面为bjdp.org公益编程道场免费提供场地的公司与个人:图灵公司——谢工、袁 野,华夏煤安——祁智军,爱帮网——郝俊, UnitedStack——程辉,龙泉寺信息中心 朱雪花、李子豪,CSDN——蒋麒霖,博彦科技——廖君仪,首信公司—一范云飞,直真科 技——饶林,优纳科技——刘明星,天正华光——廉雨,互动出版网——李开伟,联想北京 研究院——喻泽高,京东商城北京总部—一蔡德辉、宋宁。 感谢od-e公司的姚若舟与张博超邀请我观摩他们主持的精彩的TDD软件开发公开 课,这个课程及姚若舟所给予我有关驯服烂代码的反馈,促使我修订了本书对烂代码的 定义。 感谢编辑杨福川和孙海亮,没有他们的反馈意见与鞭策督促,本书不会这样快问世。 感谢我的夫人薛静,她为我辞职撰写本书提供了最主要的经济支持。感谢我8岁的儿子 乐乐,他很懂事地自己在一旁玩,从而让我腾岀时间能尽快把书写完。感谢岳母、妹妹、妹 夫、堂妹和堂妹夫帮我分担各种家务事,这为我尽早完成本书赢得了宝贵的时间。最后感谢 我的父母,每当我带着乐乐去探望他们时,他们总是默默地为我承担一切家务。当我每次吃 完他们为我备好的饭菜后,他们总是说:“快去写书吧,碗筷我们洗。 H/ BOOKS 目录 序 前言 致谢 第1章刻舟求剑的文档 第2章按图索骥地编写代码 7 第3章写main0方法测试一下 17 第4章调试一下 24 第5章用TDD重做编程操练题目 第6章消除假数据所带来的重复代码 第7章让下一个测试足够有意思 46 第8章嗅出代码“腐臭”和新的测试点 55 第9章测试后行ⅴs测试先行 第10章何谓“烂代码”

...展开详情
试读 34P 驯服烂代码:在编程操练中悟道
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    happyzeng79 不错的书,值得学习参考。
    2017-08-01
    回复
    keep00moving 看了一些,写的蛮好的
    2016-09-26
    回复
    gxf1105 不全,可惜了
    2016-07-15
    回复
    ggaofeng 只有前面几十页,又借了一本实体书。读完本书,相当于参加了2次代码道场,很有收获。看高手是如何改善代码的,有借鉴意见,至少会验证一下你目前的做法、想法是对的。 软件开发不能只看外在质量,代码的内在质量也很重要。
    2016-05-19
    回复
    veryok 看了一些,写的蛮好的
    2016-04-25
    回复
    血祭五脏庙 34页的版本...
    2016-04-11
    回复
    neverloser01 首先要警告后来者,lz提供的下载不是全版,见其他书友的友情提示。其次书是不错,学习了一些测试思维,因为本人在其他社区购买了一个电子版。
    2015-09-01
    回复
    zhangxin0804 要是全的就更好了,先看看。
    2015-04-21
    回复
    zhaoforever1 放全版放全版
    2015-04-14
    回复
    hujinglisson 放个样张,不全啊
    2015-03-29
    回复
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    驯服烂代码:在编程操练中悟道 9积分/C币 立即下载
    1/34
    驯服烂代码:在编程操练中悟道第1页
    驯服烂代码:在编程操练中悟道第2页
    驯服烂代码:在编程操练中悟道第3页
    驯服烂代码:在编程操练中悟道第4页
    驯服烂代码:在编程操练中悟道第5页
    驯服烂代码:在编程操练中悟道第6页
    驯服烂代码:在编程操练中悟道第7页
    驯服烂代码:在编程操练中悟道第8页
    驯服烂代码:在编程操练中悟道第9页
    驯服烂代码:在编程操练中悟道第10页
    驯服烂代码:在编程操练中悟道第11页

    试读已结束,剩余23页未读...

    9积分/C币 立即下载 >