长久以来我一直主张:好代码是廉价的代码。

当我跟做开发的同事说出这话时,他们的第一反应是一种惊愕,然后是将近一个星期的嘲笑,把它当作一个笑话来讲。当他们走近看我的表情、知道我是认真的时,才收敛一点。

当最初的惊愕消退后,他们会用一些这样的话来反驳:“好代码不廉价,好代码是采用经过数十年计算机科学研究和积累得出的最佳实践设计模式和方法论建立起来的精心制作的程序代码。”

我只好继续解释为什么他们给出的好代码的定义有问题的原因是(这是很多开发人员都忽视了的一个原因):知晓各种设计模式,框架,技术技巧只是事情的 一方面,而知道何时该、何时不该应用他们才是更重要的问题。在不知道一种技巧方式如何能对系统的开发有帮助的情况下,这种模式方法极有可能成为一种开发的 阻碍,而不是一种有益的帮助。

我还要解释说,我所说的“廉价的代码”是指这些代码只需要很少的人/天数就能开发出来,并不是说是由没有经验的开发人员、在很少的工资报酬下、用6个月封闭式、只有烤白薯和豆腐汤可吃的环境中开发出来的东西。

但是 … 设计模式毕竟是个好东西 … 不是吗?

当然,但它们好在哪里?它们能提供什么好处?

容易维护

产品更健壮

容易理解

易于日后的改进提高

更好的可跟踪性

你会发现所有的这些最终都落到一点上:从长期的角度看,它们能让你更快的做事情。这事情有可能是系统迁移,或是增加一个新功能,不论是什么,通过运用这些方法模式,你会在时间效率上获得实实在在的好处。

这么说,我们观点一致吗?

怎么说呢,让我给你们说个例子,我们看看实现它的几种方式。

系统

用PHP创建一个发邮件的表单,表单里有几个表单项,用邮件把这些数据发送给某个人。除此之外,表单里的内容还要存入MySQL数据库里。

现在,用什么方式实现它们最好?按照传统的说法,采用最好的实践设计模式,你可能会想到这些:

MVC

N-层设计,包括数据库抽象层

对象关系映射(ORM)

可能用到的框架

XML配置和相关模型

等等.

我可以说,这简直是疯了,客户的这些需求完全可以用10几行代码、一个小时里(包括测试时间)完成,而且所有的那些方法模式所希望达到的效果(诸如 可读性,可移植性,稳定性)都有了。如果使用上面列出的那些,反而真正的会达不到这个目标,使代码复杂化,难于理解和维护修改。

那现在,假设客户又来了,要求做一些改动,比如要增加一个管理员的界面。这样的话,你就胜利了,你已经实现了很多很有用处的东西;然而这是因为你在 第一次开发这个系统时付出了很大的代价。我要向你声明的是,即使我现在把这些简单的代码进行重构,增加一些简单的业务层,也仍然比按你要求的那种过度技术 化的初始实现方案要简单的多。

再说了,如果客户要求的只是在表单里增加一个属性,那你的N-层设计方案会让你痛苦不堪,因为你需要改动各个层,包括那些CRUD代码。

SCRUM

我发现Scrum能吸引我的最大一个原因是它能迫使你敏捷开发;它能迫使你在每个Sprint结束的时候把东西都实现、发布。它不会让你做出目前用不到的多余的东西;它不会允许你在实现东西上有任何所谓“正确方式”的奢侈行为。

相反,在你需要的时候你才去重构。当然,这会有一定的风险,因为在实现某些功能上你会花去比当初已经做了一些基础工作的情况下要更长的时间。然而, 产品开发就像是一个沙漠中四处漂移的沙丘,你永远不可能准确的知道一个产品在将来会做如何的改动。所有的你花在实现这些很有吸引力的各种模式上的时间很可 能会成为一种完全的浪费。

复用性

有些人会指出,我所说的方式产生的代码不具有太多的复用性,不能在新开发的一些其它系统中使用。我对这个问题的回复就是,在根本不知道某些东西是否 /如何/在哪将会被复用的情况下去设计一个可复用的东西,这就跟去实现一些你根本用不到的功能或你的应用里跟本用不到的功能一样愚蠢而糟糕。如果你有一个 清楚的远见,知道什么地方会复用这些东西,这就不同了,因为你确实有一个内部的业务需求在指导你正确的开发方向。

我的最后的思考 …

了解你的设计模式,知道它们各自的好处(我一直认为,好的程序员和伟大的程序员之间的区别就在于伟大的程序员理解他们的模式);

让你的代码廉价:

当模式能够给你带来好处,而且为你省时时才去使用它们;

如果不是这样就不要使用它们(例如:想想你最近的一次为什么要把系统迁移到一个不同的数据库上?);

当框架能够帮你提高开发速度时才使用它们;

在必要的时候重构,不要做一些超前性的开发;

我想,如果你能按照这些指导原则做事,你会发现开发周期变短、实现的代码更简洁,易于调试,易于维护修改。

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

优秀的程序反而是廉价相关推荐

  1. 寻找优秀的程序员之实战指南-2

    寻找优秀的程序员之实战指南 --选自<软件随想录:程序员部落酋长Joel谈软件> [好消息]本书今天(12.10)互动有货,感兴趣的朋友可以 逛逛去 [续]http://blog.csdn ...

  2. 如何成为优秀的程序员

    1.各种软件技术之间是怎样的关系? 我把软件技术分为三个层次:  问题域:计算机图形学.音视频编码.信息安全.模式识别.信息检索.自然语言分析.人工智能.科学计算等.  系统集成:C++和Java等面 ...

  3. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

    怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 ...

  4. 为何优秀的程序员不断离开?| 畅言

    所谓"死海效应",就是指有些互联网公司过于注重挽留人才,以至于他们无意中挽留了很多平庸的人才,反而迫使优秀的人才离职. 作者 | Erik Dietrich 译者 | 弯月 责编 ...

  5. 为何优秀的程序员不断离开?

    所谓"死海效应",就是指有些互联网公司过于注重挽留人才,以至于他们无意中挽留了很多平庸的人才,反而迫使优秀的人才离职. 以下为译文: 鉴于我刚刚换了份新工作,所以最近有很多人问我为 ...

  6. 小程序反编译 g is not defined_身边程序用的IDA Pro for Mac(静态反编译软件)

    ida pro mac版专为Mac用户设计,目前最优秀的静态反编译软件之一,这款mac安全工具它不仅可以应用在反编译和动态调试等强大的逆向工程领域,还支持对多种处理器不同类型的可执行模块进行反汇编处理 ...

  7. 优秀游戏程序员学习资料推荐

    这两天给单位的技术做的一次学习材料推荐培训,直接ppt上拷过来的.          优秀游戏程序员学习资料推荐 主讲人:臧旭 前言 今天提到的纯粹是我个人心得和理解,可能片面,也可能以偏概全. 目的 ...

  8. 如何成为一个优秀的程序员

    本文给出了十五个评定软件开发人员的标准,可以帮助程序员朋友从一个好的程序员成为一个优秀的程序员,和大家共飨! 怎样评定一名软件开发人员?这是一个颇为奇怪的问题.现在已经有了很多的理论和形式来做这件事, ...

  9. 优秀的程序员都在哪里 如何寻找优秀的程序员?

    优秀的程序员都在哪里 这是你第一次公开招募雇员.如同大多数人一样,你会发布广告,可能也会浏览一些大型的网上论坛,然后你就收到了一吨的简历. 一份份看下去,你会想:"嗯嗯嗯,这人应该可以.&q ...

最新文章

  1. core Animation之CAKeyframeAnimation(关键帧动画)
  2. NGUI创建Camera参数为Simple 2D的UI UI对象的结构UI Root(2D)
  3. 【企业管理】2020年的经营关键词
  4. netty websocket 简单消息推送demo
  5. python网站访问日志分析_python分析apache网站日志web日志的代码
  6. nginx+php简单配置环境
  7. flask不运行主函数解决方法
  8. Java酒店管理系统项目
  9. 桌面壁纸被计算机管理员禁用,Win7更改桌面壁纸时出现“此功能已被禁用”如何解决...
  10. 使用transmission下载BT
  11. Docker服务以及容器如何设置自动启动
  12. 中国地产商寻找下一个春天 1
  13. 倾斜摄影发展历程简介
  14. Qt MDI Window开发
  15. Python技术练习------自动化处理费用表
  16. 谁说大专生不能够学好Java呢?照着这个路线走,高中生都可以!
  17. PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)...
  18. 货郎问题的实例 c语言编程,货郎担问题的C语言解法
  19. 浅析FPC软性线路板补强
  20. mysql的存储模型_一种BIM模型数据的数据库存储格式的制作方法

热门文章

  1. log4j打印mybatis sql语句
  2. 利用查找替换批处理(附完整源码),进行高效重构
  3. Java高级-线程同步机制实现
  4. Windows程序设计零基础自学_7_进程操作
  5. 转:中国学生为什么学不好计算机 谭浩强
  6. 洛谷P2178 品酒大会
  7. 在.net中使用强类型来读取配置信息
  8. awk 系列:awk 怎么读取标准输入(STDIN)
  9. 数学问题的解题方法(模板)
  10. java中常用的字符串的截取方法