好的代码至少要修改两遍

近些年来,越来越多的人开始转向敏捷开发,而且这些敏捷开发的技术已不再新鲜,大多都是在 80 和 90 年代设计形成的。但是,最近几年,程序员,特别是一些商业顾问,架构师和客户开始喜欢上了敏捷开发。

不断进化的需求

现如今,有一个普遍的认识就是在你开始项目编程之前,你不可能写下所有的需求,这些需求的确定需要一个不断进化的过程。在较短的开发周期中,我们不 断的完善程序,多次迭代从而满足客户提出的最新需求。这些都是基于进化的原则,就像我们的生活,你是一步一步的向前从而做得更好。

不断进化的代码

这就可以了吗?现在的大多数程序员都已经认识到了需求是不断进化和完善的。但还不够,他们依旧认为项目使用的框架和架构应该在项目开始的时候就确定了,而且代码一旦完成,就一切都 OK 了。

错。根据我的经验,所有优秀的代码都至少要写两遍。第一遍写代码时,你通常会很匆忙,不能很好的理解并实现需求。当然,如果你看过一些设计模式,知道一些方法,你最终的代码可能会写得不错,但它绝不是最优秀的。少写一些无谓的代码,多一些思考。

在我们现在的项目中,几乎所有重要的功能都要从零开始写,并且重复修改很多次。这虽然很慢,但确定的是写出的代码越来越好了。当你修改某一部分的代 码已经三到四次,或又修补了这里的一个 bug,你就开始有点想躲避这部分代码,如果不再处理它你就会很高兴。当有了这样的想法后,你肯定会删了这些代码。那就又要一切从头开始了吗?

再一次错。确实,IDE 里空了,代码没了,或许只有一些测试程序还在。但是,你已经对你写的这些代码有了深刻的认识,你知道它是什么样的,你也知道它的问题出在哪。在此基础上, 你现在可以写出更好,甚至是优秀的代码。当然了,我们也可以保留之前的代码,进行一些重构等等,但都不如从头开始,更好的做出它。

这和生活中的道理依然是一样的,要想把一件事做到极致,就要多次的重复和进化。你的需求是这样,你的代码和架构也要这样。

写两遍代码会花费两倍的时间?

当我告诉人们所有的程序都要至少写两遍时,他们担心这样会使完成整个项目的时间加倍。但事实不是这样的,我来告诉你原因:

  1. 第二次写代码,只会花费你第一次写代码时的部分时间;
  2. 重写之后的代码在质量上会有显著提高,而且维护性和可扩展性都会更好,你的编程速度也会越来越快。

所以,坚持重写你的代码,不断优化它吧!

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-10-11 13:50:29

好的代码至少要修改两遍的相关文章

优秀的代码是反复修改后创造出来的

近些年来,越来越多的人开始转向敏捷开发,而且这些敏捷开发的技术已不再新鲜,大多都是在80和90年代设计形成的.但是,最近几年,程序员,特别是一些商业顾问,架构师和客户开始喜欢上了敏捷开发. 不断进化的需求 现如今,有一个普遍的认识就是在你开始项目编程之前,你不可能写下所有的需求,这些需求的确定需要一个不断进化的过程.在较短的开发周期中,我们不断的完 善程序,多次迭代从而满足客户提出的最新需求.这些都是基于进化的原则,就像我们的生活,你是一步一步的向前从而做得更好. 不断进化的代码 这就可以了吗?

about Log4j:日志信息居然打印两遍

问题描述 配置文件={log4j.rootLogger=info,Alog4j.logger.DBLog=debug,A解决方案二: 解决方案三: 解决方案四: 解决方案五: 解决方案六:Log for A 解决方案七: 解决方案八: 解决方案九: 解决方案十: 解决方案十一:log4j.appender.A=org.apache.log4j.ConsoleAppenderlog4j.appender.A.Target=System.outlog4j.appender.A.layout=org.

about Logger4j:日志信息居然打印两遍,蛋疼

问题描述 配置文件={log4j.rootLogger=info,Alog4j.logger.DBLog=debug,A解决方案二: 解决方案三: 解决方案四: 解决方案五: 解决方案六: Log for A   解决方案七: 解决方案八: 解决方案九: 解决方案十: 解决方案十一: log4j.appender.A=org.apache.log4j.ConsoleAppenderlog4j.appender.A.Target=System.outlog4j.appender.A.layout=

delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍?

问题描述 delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍? 20C 如题.这是我反复测试后得出的结论.我实在不理解为什么. 具体测试过程是这样子的:我用ado连接数据库.然后我写了一个简单的存储过程,就是往表里插入数据.然后我用ado调用这个存储过程.然后我就发现,虽然程序里我只调用了一次,但实际上表里的数据却被插入了完全一模一样的两条. 这算是bug还是怎么回事?是不是有什么我不曾注意到的细节没处理好? 存储过程代码如下: create procedure p

C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类

问题描述 C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; t

钻牛角尖————“init()事件发生在所有的控件被初始化,所有的皮肤设置被应用以后。它用来读取或者初始化控件属性”————这句话矛盾不?怎么初始化两遍啊?

问题描述 Init():这个事件发生在所有的控件被初始化,所有的皮肤设置被应用以后.它用来读取或者初始化控件属性.这句话我不理解,感觉矛盾.到了init()这步,所有的控件不是都被初始化完了嘛,为什么还说"读取或初始化控件属性"?这不是初始化两遍嘛?微软上也是这么说的:Init():在所有控件都已初始化且已应用所有外观设置后引发.使用该事件来读取或初始化控件属性.难道"控件初始化"与"初始化控件属性"是两个不同的概念嘛? 解决方案 解决方案二:首

ssh开发-通过连接调用action,执行了两遍

问题描述 通过连接调用action,执行了两遍 SSH框架,JSP页面通过链接调用action,删除一条记录,老是在页面报错,debug发现,action执行完第一遍,接着执行第二遍,并没有return success 解决方案 是不是你页面调用了2次action,如在from表单提交时,同时还写了js提交 解决方案二: 是不是你action的后台代码返回的还是此action的代码,而不是其他页面=.= 解决方案三: 几种可能 1.java文件编译有问题,检查下class文件是否正常编译了 2.

填两遍银行卡有必要吗

  银行卡号 有必要填两遍吗?设计师觉得这个行为很傻很天真 那么 设计师能代表用户吗? 用户是怎么认为的呢? 有没有更好的办法来解决这个问题 开篇,先讲讲我自己的趣事.早上出门后,我总会电梯里拼命回想,做完早饭我是不是关了煤气,没关的话会不会一把大火把家烧了.有时甚至,我会返回再次确认. 也许有些男性朋友不太理解这种行为. 那么,想想你们的爱车,关车门时是不是也会要反复确认? 为了减少意外的发生,我们总会对重要事务反复确认,这应该是一种天性. 好吧 言归正传! 说说我为什么讲这个题目 背景 最近

求解-分析俩段代码else的最后两句是干什么?求大神指点

问题描述 分析俩段代码else的最后两句是干什么?求大神指点 下边俩段代码,else里的最后两句为什么他俩不一样啊?第一段代码else的最后两句是干什么? 第二段代码else的最后两句是干什么? public String getList() throws Exception { quZhengGuiZeList = dao.getList(TrainingOrCompetitionID); if(quZhengGuiZeList.size()>0){ quZhengGuiZe=quZhengG