不要将时间浪费到编写完美代码上(转)

add by zhj:文章主要说的是代码会经常变化,追求完美只会浪费更多时间。

(英文:DZone,译者:raygodlee

不要将时间浪费到编写完美代码上,原因就在于一个系统的迭代开发可能持续运行5年至10年甚至是20年,而某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天。所以说有没有必要将大量时间花在写代码上?

一个系统的迭代开发可能持续运行5年至10年甚至是20年。相比之下,某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天,甚至当你为了解决一个问题迭代测试不同方案时它们的生命周期只有几分钟。

一些代码的确比其他代码更重要

通过研究代码随时间发生的变化,Michael Feathers发现了代码生命线。通常,每个系统都有许多一次写成不再修改的代码。但是,有一小部分代码,包括最重要最有用的代码,却被经常被修改,重构或者重写数次。

随着对一个系统或者一类问题或者一个架构方案的深入了解,你应该能够更加轻易的知道或者预测到哪些代码会不停的变化哪些代码不会,换句话说,就是哪些代码比较重要哪些代码不重要。

是否应该努力去写完美代码?

大家都知道,我们应该写干净的代码,保持代码的一致性、易读性,并且尽可能地简单。

但是一些人走了极端,尽自己的最大努力,去写尽可能优雅的、接近完美的代码,痴迷于重构斟酌代码的每一个细节。

但是,如果这些代码不是一次写成不再修改,反而是一直不断的变化,那么,努力去写完美代码或者努力进行完美的设计岂不是浪费时间?

“你 不可能写出完美的代码。你难道为此倍受打击么?显然不该。应该将它作为一个生活中的公理,去拥抱它,庆祝它,因为完美的代码是不存在的。在计算机短暂的历 史中,没有任何人曾经写出过哪怕一段完美无缺的代码。显然,你也不太可能成为第一个写出完美代码的人。除非你接受这个事实,否则你会一直浪费时间和精力去 追逐一个不能实现的梦想!”——Andrew Hunt《程序员修炼之道:从初级到高级》

只写一次的代码首要不是美观和 优雅,而是正确运行,而且易读易懂,因为在系统的整个生命周期中,这些代码虽然不再修改,但是可能需要阅读很多次。不一定非要紧凑,干净即可。在这些代码 中,一定程度上的拷贝和粘贴等操作是可以接受的。这些代码不需要反复斟酌,除非你需要修改它,否则即使周围代码都在变,也不需要对这些代码重构。对于这些 代码,没必要花费过多额外的时间。

对于那些一直需要修改的代码呢?苦苦思索代码的风格和最优雅的方案是在浪费时间,因为,这些代码可能在随 后的几天或者几周就会被修改甚至重写。同样地,每次修改都痴迷于代码的重构,或者重构那些不需要修改的代码试图使其变得更好也是没有必要的。代码永远都可 以变得更好,但是这不应该是最重要的方面。

真正重要的是代码是否实现了想要的功能?代码是否正确运行?是否有用?是否高效?能否处理错误和损坏的数据而不会崩溃,至少也要安全的失效?调试是否方便?修改起来是否简单且安全?这些不是美观的组成部分,而是实际中衡量代码是否正确的标准。

务实地进行编码和重构

精益开发的核心思想是:不要把时间浪费到不重要的事情上。应该用这个原则指导我们如何编写代码,如何重构代码,如何进行代码审查以及如何进行代码测试。

为了完成工作,只进行必要的代码重构,Martin Fowler称之为机会主义重构(或理解为清理,童子军规则)和有预备的重构。这足以使代码修改起来更加简单和安全。如果你不是在修改代码,代码看起来是什么样子,真的无关紧要。

在代码审查中只关注真正重要的部分,这些代码是否正确?是否是防御性的代码?是否安全?你能否理解它的思路?修改起来是否安全?

不 要纠结于代码的风格(除非代码风格误导了你对代码的理解),把格式化代码的工作交给IDE。没有必要去争论这些代码能否“更加面向对象”。只要它有道理, 至于是使用这用模式还是别的模式,并不重要。同样,至于你是否喜欢,也不重要,尽管你可以用更好的方式完成它,除非你是在教对平台或者语言不熟悉的新手, 需要在代码审查中完成监督工作。

测试用例的编写很重要,需要覆盖到主要的执行路径和重要的异常情况。测试用例能够用最少的工作量给你尽可能多的信息和信心,具体是采用大而全的测试还是小而精的测试则无关紧要。至于是在写代码之前写测试用例还是在写代码之后写测试用例也不重要,只要测试用例有效即可。

不仅仅是关于代码

在软件领域里,建筑师和工程师的概念从来都不适用,我们不是设计建造屹立数年或者数百年大桥或者摩天大楼,我们构建的是更加具有可塑性的、更加抽象的,同时生命周期也更加短暂的东西。软件之所以称为“软件”,就是因为编写代码就是为了修改。

“经过五年的使用和修改,很多情况下,一个成功的软件源码和最初的样子已经面目全非了,但是一个成功的建筑经过五年,基本没有任何变化。”——《可持续软件开发》

我们应该将代码视为工作的一个临时假象:

有时在重要的事情面前,我们陷入了对代码的迷恋。我们经常遭受这样的误解,在产出的产品中代码是最有价值的东西,尽管它实际上是对一个问题的理解,或者是对设计的一种实现甚至是顾客的反馈。——Dan Grover《编码与创造性破坏》

迭代开发教会我们不断的尝试和检查尝试的结果——是否解决了问题,如果没有解决问题,如何去改进?我们正在构建的软件是永远做不完的。尽管设计和编码是正确的,那也可能只是一时正确,一旦需求发生变化,就会被更加适合的设计和编码替代。

我 们需要写好的代码:易懂,能够正确运行,有安全保障的代码。我们需要对它进行重构和代码审查,并且编写有效的测试用例。但是要记住,其中的一些代码或者全 部代码可能很快就被丢掉,或者再也不会被读到甚至从来就不会被用到。我们需要意识到,我们的一部分工作可能要被浪费掉并且对此进行优化。只做哪些需要被完 成的事情,不要浪费时间试图去编写完美代码。

时间: 2024-07-28 15:01:06

不要将时间浪费到编写完美代码上(转)的相关文章

编写可读性代码的艺术

在做IT的公司里,尤其是软件开发部门,一般不会要求工程师衣着正式.在我工作过的一些环境相对宽松的公司里,很多程序员的衣着连得体都算不上(搞笑的T恤.短裤.拖鞋或者干脆不穿鞋).我想,我本人也在这个行列里面.虽然我现在改行做软件开发方面的咨询工作,但还是改不了这副德性.衣着体面的其中一个积极方面是它体现了对周围人的尊重,以及对所从事工作的尊重.比如,那些研究市场的人要表现出对客户的尊重.而大多数程序员基本上每天主要的工作就是和其他程序员打交道.那么这说明程序员之间就不用互相尊重吗?而且也不用尊重自

不要把时间浪费在写出完美的代码

一个系统可能会持续工作5年,10年,20年甚至更长的时间.但是具体到这个系统中的某一行代码,即使是关于设计的部分,这一行代码存在的时间却会很短:几个月或者几天,甚至是几分钟. 一些代码比其他代码更重要 通过研究代码是怎么随时间改变的,Michael Feathers定义了一条代码变动曲线.每个系统都有很多写完之后就不再改变的代码.与此同时,也存在少量这样的代码,这些代码是整个系统最重要也是最有用的代码,它们会随时间一次又一次地改变.重构,或者被删除,重新来过,如是反复几次. 随着你对一个系统越来

对编写html代码的几点儿小建议

1.DOCTYPE说明:告诉浏览器要使用哪种规范来解释该文档内容: <!DOCTYPE html PUBLIC "-W3//DTD//XHTML 1.0  Transitional//EN"  "http://www.w3.org/1999/xhmlt"> 解释:-W3:w3标准:DTD:文档类型定义: XHTML 1.0:XHTML 1.0版本:Transitional:过渡模式(Strict:严格模式):EN:语言为英语: "http://

最新的JavaScript核心语言标准&mdash;&mdash;ES6,彻底改变你编写JS代码的方式!【转载+整理】

原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructuring 箭头函数 Arrow Functions Symbols 集合 学习Babel和Broccoli,马上就用ES6 代理 Proxies ES6 说自己的宗旨是"凡是新加入的特性,势必已在其它语言中得到强有力的实用性证明."--TRUE!如果你大概浏览下 ES6 的新特性,事实上它

[转]新兵训练营系列课程——编写优雅代码

原文:http://weibo.com/p/1001643877361430185536 课程大纲 什么是好代码 如何编写优雅的代码 如何做出优雅的设计 如何规划合理的架构 如何处理遗留代码 什么是好代码 对于代码质量的定义需要于从两个维度分析:主观的,被人类理解的部分:还有客观的,在计算机里运行的状况. 我把代码质量分为五个层次,依次为: 完成功能的代码 高性能的代码 易读的代码 可测试的代码 可扩展的代码 如何编写可读的代码 在很多跟代码质量有关的书里都强调了一个观点:程序首先是给人看的,其

以优美方式编写JavaScript代码

英文原文:CoffeeScript: The beautiful way to write JavaScript 我用 JavaScript 编程很多年了,写了大量的 JavaScript 代码,即便是我这样的经历,但我仍然还在努力地去写出更优美的 JavaScript 代码,在这篇文章中,我将探索为什么写出漂亮的 JavaScript 代码是如此困难,如何使用CoffeScript(一种简约且能编译成 JavaScript 的语言)改善它. 什么是优美的代码? 我想从个人观点来声明如何定义优美

Guava 教程1-使用 Google Collections,Guava,static imports 编写漂亮代码

文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMPORTS 编写漂亮代码 1.Google Collections一览 2.操作lists和maps 3.静态导入和Eclipse模板 4.Guava走马观花 2-深入探索 GOOGLE GUAVA 库 1.The Guava CharMatcher 2.Joiner and Splitter 3.W

多些时间能少写些代码

我在我的微博上说过这样一段话,我想在这里把我的这个观点阐述地更完整一些. 聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30% – 50%的时间是在忙碌着编码,调试和测试.聪明的老板也会让团队这样做.而傻逼的老板,苦逼的程序员会拿出来100%-150%的时间来忙着赶进度,返工,重构,fix 大量的bug… 所以, 越差的团队一般会越忙,而且还忙不完. 在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质量的完成的,这

多谢时间能少写些代码

在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质量的完成的,这令那些管理者们很兴奋,就像巴甫洛夫的条件反射实验中的狗看到了肉就会流口水那样兴奋.他们使用TDD,快速迭代,不断重构,持续集成直至持续部署的方法在进行软件开发. 软件开发真是这样的吗?难道不需要花时间去思考吗?对此,有些观点在Todd的<"品质在于构建过程"吗?>以及<Bob大叔和Jim Coplien对TDD的论战>中谈到过了.我只想想表达下面的