长久以来我一直主张:好代码是廉价的代码。
当我跟做开发的同事说出这话时,他们的第一反应是一种惊愕,然后是将近一个星期的嘲笑,把它当作一个笑话来讲。当他们走近看我的表情、知道我是认真的时,才收敛一点。
当最初的惊愕消退后,他们会用一些这样的话来反驳:“好代码不廉价,好代码是采用经过数十年计算机科学研究和积累得出的最佳实践设计模式和方法论建立起来的精心制作的程序代码。”
我只好继续解释为什么他们给出的好代码的定义有问题的原因是(这是很多开发人员都忽视了的一个原因):知晓各种设计模式,框架,技术技巧只是事情的一方面,而知道何时该、何时不该应用他们才是更重要的问题。在不知道一种技巧方式如何能对系统的开发有帮助的情况下,这种模式方法极有可能成为一种开发的阻碍,而不是一种有益的帮助。
我还要解释说,我所说的“廉价的代码”是指这些代码只需要很少的人/天数就能开发出来,并不是说是由没有经验的开发人员、在很少的工资报酬下、用6个月封闭式、只有烤白薯和豆腐汤可吃的环境中开发出来的东西。
但是 … 设计模式毕竟是个好东西 … 不是吗?
当然,但它们好在哪里?它们能提供什么好处?
- 容易维护
- 产品更健壮
- 容易理解
- 易于日后的改进提高
- 更好的可跟踪性
你会发现所有的这些最终都落到一点上:从长期的角度看,它们能让你更快的做事情。这事情有可能是系统迁移,或是增加一个新功能,不论是什么,通过运用这些方法模式,你会在时间效率上获得实实在在的好处。
这么说,我们观点一致吗?
怎么说呢,让我给你们说个例子,我们看看实现它的几种方式。
系统
用PHP创建一个发邮件的表单,表单里有几个表单项,用邮件把这些数据发送给某个人。除此之外,表单里的内容还要存入MySQL数据库里。
现在,用什么方式实现它们最好?按照传统的说法,采用最好的实践设计模式,你可能会想到这些:
- MVC
- N-层设计,包括数据库抽象层
- 对象关系映射(ORM)
- 可能用到的框架
- XML配置和相关模型
- 等等.
我可以说,这简直是疯了,客户的这些需求完全可以用10几行代码、一个小时里(包括测试时间)完成,而且所有的那些方法模式所希望达到的效果(诸如可读性,可移植性,稳定性)都有了。如果使用上面列出的那些,反而真正的会达不到这个目标,使代码复杂化,难于理解和维护修改。
那现在,假设客户又来了,要求做一些改动,比如要增加一个管理员的界面。这样的话,你就胜利了,你已经实现了很多很有用处的东西;然而这是因为你在第一次开发这个系统时付出了很大的代价。我要向你声明的是,即使我现在把这些简单的代码进行重构,增加一些简单的业务层,也仍然比按你要求的那种过度技术化的初始实现方案要简单的多。
再说了,如果客户要求的只是在表单里增加一个属性,那你的N-层设计方案会让你痛苦不堪,因为你需要改动各个层,包括那些CRUD代码。
SCRUM
我发现Scrum能吸引我的最大一个原因是它能迫使你敏捷开发;它能迫使你在每个Sprint结束的时候把东西都实现、发布。它不会让你做出目前用不到的多余的东西;它不会允许你在实现东西上有任何所谓“正确方式”的奢侈行为。
相反,在你需要的时候你才去重构。当然,这会有一定的风险,因为在实现某些功能上你会花去比当初已经做了一些基础工作的情况下要更长的时间。然而,产品开发就像是一个沙漠中四处漂移的沙丘,你永远不可能准确的知道一个产品在将来会做如何的改动。所有的你花在实现这些很有吸引力的各种模式上的时间很可能会成为一种完全的浪费。
复用性
有些人会指出,我所说的方式产生的代码不具有太多的复用性,不能在新开发的一些其它系统中使用。我对这个问题的回复就是,在根本不知道某些东西是否/如何/在哪将会被复用的情况下去设计一个可复用的东西,这就跟去实现一些你根本用不到的功能或你的应用里跟本用不到的功能一样愚蠢而糟糕。如果你有一个清楚的远见,知道什么地方会复用这些东西,这就不同了,因为你确实有一个内部的业务需求在指导你正确的开发方向。
我的最后的思考 …
- 了解你的设计模式,知道它们各自的好处(我一直认为,好的程序员和伟大的程序员之间的区别就在于伟大的程序员理解他们的模式);
- 让你的代码廉价:
- 当模式能够给你带来好处,而且为你省时时才去使用它们;
- 如果不是这样就不要使用它们(例如:想想你最近的一次为什么要把系统迁移到一个不同的数据库上?);
- 当框架能够帮你提高开发速度时才使用它们;
- 在必要的时候重构,不要做一些超前性的开发;
我想,如果你能按照这些指导原则做事,你会发现开发周期变短、实现的代码更简洁,易于调试,易于维护修改。
分享到:
相关推荐
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
软件让各行各业都实现了自动...代码工厂使用了开放式架构思想,基于插件模式,完全可根据需要来扩展. <br>4,呵呵,我这东东没啥值钱的,免费. 详情: http://blog.csdn.net/h1jie/archive/2008/02/03/2079880.aspx
公园5世纪,我国古代数学...“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”意思是共计每只5元,母鸡每只3元,小鸡每3只1元。用100元买100只鸡,求公鸡、母鸡、小鸡的只数。
中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一, 百钱买百鸡,问翁、母、雏各几何? *题目分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别...
7-1 估值一亿的AI核心代码 (25分) 描述 以上图片来自新浪微博。 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来; 消除原文中多余空格:把...
【标题】中的“值钱的企业源码”指的是用于构建企业级网站的源代码,这种源码通常具有商业价值,因为它可以为企业提供一个高效且定制化的网站解决方案。在IT行业中,企业源码通常包括完整的前端界面设计和后端逻辑...
因为ASP的代码也是脚本,给了客户也不可能不被人看到其中的内容,经多包容在DLL中一部分业务逻辑,但是还是觉得ASP代码是最不值钱的代码,没有人回去购买,可以随时从别人的网站中查看源码的形式得到别人辛辛苦苦...
飞凌OK6410串口驱动程序 包含详细的中文注释 代码不值钱 注释能然你一下看懂哦……
某宝卖280元的PHP精美柠檬视频网站源码 支持FFMPEG 带APP源代码, 花钱买的, 源码这东西本来就不值钱, 重要的是你要会安装, 有php和相关知识可以进行二次开发
在编程领域,尤其是在算法设计和问题解决中,经常会遇到经典的数学问题,比如“百钱买百鸡”问题。这个问题源自古代中国,是一个典型的组合...对于初学者来说,这是一个很好的实战练习,可以锻炼逻辑思维和编程能力。
这就是我想说的,行政区划几乎每年都有撤销的、新增的、变更的,但人的身份证是一生不变的,如何保证几年前、十几年前的身份证能够匹配得上,这就是我这张表的值钱之处。因为有时候为了追溯一个区号,要翻找10年、20...
我知道这不值钱,但我穷的没点下载东西了。希望需要的兄弟赞助下。 c/c++用递归实现深度搜索和广度搜索解迷宫的源码。 广度搜索可找出迷宫的最优路径。
见笑了~不值钱的C++代码。练手用的,新手作业可以参考
对想开发类似盲盒小程序的开发者来说,这个源代码非常值钱。它是原生微信小程序,所以可以直接在上面二次开发。而且,这个源码还提供了详细的文档和注释,帮助开发者更好地理解它的工作原理和实现方法。 对普通用户...
一个非常好又简单的好东东,可以利用它完成这种复杂的统计图,3D,2D效果都有, PS: 里面是一个包含了很多例子, 要在自已的机子上运行起来, 自我学习能力不怎么行的人不要下, 免得下下来不会用给我乱评, 我之前也是不懂,...
"没什么好说的不值钱"可能是指这个技术或实现方式在开发者眼中并不独特或者没有足够的商业价值,也可能是由于技术已经被公开或开源,失去了原有的竞争优势。 "之前已经开源过了"表明这个DX透视技术的源代码曾经被...
7. **编程与调试**:MATLAB支持循环、条件语句、函数调用等基本编程结构,并有内置的调试工具,便于代码的调试和优化。 8. **文件输入输出**:MATLAB可以读取和写入各种文件格式,如文本文件、Excel表格、图像文件...
唯⼀对免费软件感到害怕的⼈,是⾃⼰的产品还要不值钱的⼈。这句话强调了免费软件的价值,它可以使软件更加普及和易于获取。 知识点8: 计算机的影响 他们拥有计算机,他们也还可能拥有其他的⼤规模杀伤性武器。这句...
Java 中的无限层级递归树前后端操作解决方案 ...技术不值钱,值钱的是思考问题的方式。任何技术天天学都不难,要是天天换技术学习就非常非常难。只有学会分析问题,给出解决方案,其他的交给时间。
【标题】"中英文机电设备企业网站源码(很有值钱的程序~)"涉及到的主要知识点包括: 1. **双语网站系统**:这个源码是设计用于构建一个支持中文和英文的机电设备企业网站,这意味着它具备多语言功能,能够帮助企业...