长久以来我一直主张:好代码是廉价的代码。
当我跟做开发的同事说出这话时,他们的第一反应是一种惊愕,然后是将近一个星期的嘲笑,把它当作一个笑话来讲。 当他们走近看我的表情、知道我是认真的时,才收敛一点。
当最初的惊愕消退后,他们会用一些这样的话来反驳: “好代码不廉价,好代码是采用经过数十年计算机科学研究和积累得出的最佳实践设计模式和方法论建立起来的精心制作的程序代码。”
我只好继续解释为什么他们给出的好代码的定义有问题的原因是(这是很多开发人员都忽视了的一个原因): 知晓各种设计模式,框架,技术技巧只是事情的一方面,而知道何时该、何时不该应用他们才是更重要的问题。 在不知道一种技巧方式如何能对系统的开发有帮助的情况下,这种模式方法极有可能成为一种开发的阻碍,而不是一种有益的帮助。
我还要解释说,我所说的“廉价的代码”是指这些代码只需要很少的人/天数就能开发出来, 并不是说是由没有经验的开发人员、在很少的工资报酬下、用6个月封闭式、只有烤白薯和豆腐汤可吃的环境中开发出来的东西。
但是 … 设计模式毕竟是个好东西 … 不是吗?当然,但它们好在哪里?它们能提供什么好处?
- 容易维护
- 产品更健壮
- 容易理解
- 易于日后的改进提高
- 更好的可跟踪性
你会发现所有的这些最终都落到一点上:从长期的角度看,它们能让你更快的做事情。 这事情有可能是系统迁移,或是增加一个新功能,不论是什么,通过运用这些方法模式,你会在时间效率上获得实实在在的好处。
这么说,我们观点一致吗?
怎么说呢,让我给你们说个例子,我们看看实现它的几种方式。
系统用PHP创建一个发邮件的表单,表单里有几个表单项,用邮件把这些数据发送给某个人。 除此之外,表单里的内容还要存入MySQL数据库里。
现在,用什么方式实现它们最好?按照传统的说法,采用最好的实践设计模式,你可能会想到这些:
- MVC
- N-层设计,包括数据库抽象层
- 对象关系映射(ORM)
- 可能用到的框架
- XML配置和相关模型
- 等等.
我可以说,这简直是疯了,客户的这些需求完全可以用10几行代码、一个小时里(包括测试时间)完成, 而且所有的那些方法模式所希望达到的效果(诸如可读性,可移植性,稳定性)都有了。 如果使用上面列出的那些,反而真正的会达不到这个目标,使代码复杂化,难于理解和维护修改。
那现在,假设客户又来了,要求做一些改动,比如要增加一个管理员的界面。这样的话,你就胜利了,你已经实现了很多很有用处的东西; 然而这是因为你在第一次开发这个系统时付出了很大的代价。 我要向你声明的是,即使我现在把这些简单的代码进行重构,增加一些简单的业务层,也仍然比按你要求的那种过度技术化的初始实现方案要简单的多。
再说了,如果客户要求的只是在表单里增加一个属性,那你的N-层设计方案会让你痛苦不堪,因为你需要改动各个层,包括那些CRUD代码。
SCRUM我发现Scrum能吸引我的最大一个原因是它能迫使你敏捷开发;它能迫使你在每个Sprint结束的时候把东西都实现、发布。 它不会让你做出目前用不到的多余的东西;它不会允许你在实现东西上有任何所谓“正确方式”的奢侈行为。
相反,在你需要的时候你才去重构。 当然,这会有一定的风险,因为在实现某些功能上你会花去比当初已经做了一些基础工作的情况下要更长的时间。 然而,产品开发就像是一个沙漠中四处漂移的沙丘,你永远不可能准确的知道一个产品在将来会做如何的改动。 所有的你花在实现这些很有吸引力的各种模式上的时间很可能会成为一种完全的浪费。
复用性有些人会指出,我所说的方式产生的代码不具有太多的复用性,不能在新开发的一些其它系统中使用。 我对这个问题的回复就是,在根本不知道某些东西是否/如何/在哪将会被复用的情况下去设计一个可复用的东西, 这就跟去实现一些你根本用不到的功能或你的应用里跟本用不到的功能一样愚蠢而糟糕。 如果你有一个清楚的远见,知道什么地方会复用这些东西,这就不同了,因为你确实有一个内部的业务需求在指导你正确的开发方向。
我的最后的思考 …
- 了解你的设计模式,知道它们各自的好处(我一直认为,好的程序员和伟大的程序员之间的区别就在于伟大的程序员理解他们的模式);
- 让你的代码廉价:
- 当模式能够给你带来好处,而且为你省时时才去使用它们;
- 如果不是这样就不要使用它们(例如:想想你最近的一次为什么要把系统迁移到一个不同的数据库上?);
- 当框架能够帮你提高开发速度时才使用它们;
- 在必要的时候重构,不要做一些超前性的开发;
我想,如果你能按照这些指导原则做事,你会发现开发周期变短、实现的代码更简洁,易于调试,易于维护修改。
本文英文原文链接:Good code is cheap code
分享到:
相关推荐
它通过分布式文件系统(HDFS)和MapReduce计算模型,实现了在廉价硬件集群上运行大规模数据分析的能力。 2. **HDFS(Hadoop Distributed File System)**: HDFS是Hadoop的核心组成部分,它将大文件分割成块并分散...
程序员不再是廉价的打字员. <br>代码生成器的作用: <br>将数据库表按照模板生成目标代码. <br>特点: <br>1,通用性强.目标代码可以是C#/JAVA/HTML/SQL等等任何您需要的文件. <br>2,高度可定制.您可以...
它的设计目标是在廉价硬件上实现高吞吐量和低延迟的数据访问。HBase提供了强大的实时读写能力,支持大规模数据的在线存储,并且能够处理PB级别的数据。 HBase的核心概念包括表、行、列族、列、时间戳和版本。表是由...
Hadoop是Apache基金会开发的一个开源分布式计算框架,它允许在廉价硬件上处理和存储海量数据,是大数据处理领域的核心工具之一。这本书不仅理论讲解深入,还通过源代码分析,帮助读者更直观地理解和应用Hadoop。 1....
它将大型数据集分布在大量的廉价硬件上,通过冗余备份实现高可用性和容错性。HDFS的核心设计理念包括数据的分布式存储、数据复制和故障恢复机制。 2. MapReduce:分布式计算框架 MapReduce是Hadoop用于大规模数据...
ESP8266是一款廉价且功能强大的Wi-Fi模块,常用于物联网(IoT)项目,因为它能够使硬件设备接入互联网。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,非常适合资源有限的设备,如...
优雅的代码意味着更高的可读性、可维护性和扩展性,这对于个人开发者而言意味着更好的自我提升机会,而对于团队开发来说,则意味着更高的效率和更低的沟通成本。本文将围绕“如何编写优雅的代码”这一主题展开,探讨...
Hadoop是一个开源的分布式计算框架,它允许在大量廉价硬件上处理和存储海量数据,是大数据处理领域的重要工具。 首先,我们来看看《Hadoop实战.Hadoop.in.Action.Chuck.Lam.文字版.pdf》这本书。这本书是由Chuck ...
1. **Hadoop分布式文件系统(HDFS)**:HDFS是Hadoop的基础,它是一个高度容错性的分布式文件系统,设计用于存储大量数据,并能在廉价硬件上运行。HDFS通过数据块的概念,确保数据的冗余和快速访问。示例代码可能包括...
本文将深入Hadoop的源代码,探讨其设计原理和实现机制,帮助开发者更好地理解和优化Hadoop系统。 Hadoop的源代码分析可以从以下几个关键点开始: 1. **HDFS架构**:HDFS是一个分布式文件系统,设计用于在廉价硬件...
很抱歉,但根据您提供的信息,标题和描述中提到的是"hadoop源代码归档",而压缩包内的文件名称列表却包含了一系列法律学习资料,如刑法和民诉的思维导图、精讲卷以及口诀等,并没有提及任何与Hadoop源代码相关的内容...
* 彩灯控制器采用单片机控制,具有节能、廉价、优质的特点 * 彩灯控制器可以实现彩灯的点亮、移动和变化,具有广泛的应用前景 应用前景 * 彩灯控制器可以应用于城市景观、风景名胜、道路桥梁、建筑轮廓、娱乐场所...
部分原因在于廉价数据和廉价计算资源,这些资源符合深度学习的自然优势。 然而,在不同的压力下发展的人类智能的许多定义特征仍然是当前方法无法实现的。 特别是,超越一个人的经验 - 从婴儿期开始人类智能的标志 -...
"TDG2example"是该书中的一个示例代码集,旨在帮助读者更好地理解和实践Hadoop的核心概念。在这个压缩包中,包含的文件名为"hadoopTDG2",这很可能是书中第二版("TDG2"可能代表"第二版")的示例代码。 Hadoop是...
通过研究这些源代码,开发者可以更好地理解Hadoop的工作原理,掌握分布式计算的关键技术和最佳实践。虽然文档是英文的,但对于熟悉编程语言的读者来说,理解代码逻辑并不构成太大障碍。此外,配合中文翻译的书籍或...
这种设计与实现的紧密结合,让程序员能够在编码过程中更好地理解和实施设计,从而提升了软件的整体质量。 #### 四、软件构建的“免费”属性 将源代码视为设计的核心,还引出了一个重要的结论:软件构建的成本实际...
快走丝通常采用廉价的钼丝作为电极丝,工作速度快但精度相对较低,适用于批量生产;而慢走丝则采用铜丝或金丝,切割精度高,表面粗糙度好,适合精密零件的制造。 描述中提到的“一款快速线割编程软件”,意味着这款...
1. **HDFS**:分布式文件系统HDFS是Hadoop的核心之一,它将大型数据集分布在大量的廉价硬件上,提供高容错性和高可用性。HDFS的设计目标是处理PB级别的数据,通过副本策略确保数据的安全性。HDFS的数据块大小通常为...
HDFS是一种分布式文件系统,以高容错性和高可扩展性为设计目标,允许在廉价硬件上存储和处理海量数据。 3. **MapReduce编程模型**:MapReduce是Hadoop处理大规模数据的核心计算模型,由“Map”和“Reduce”两个阶段...
【Hadoop实战】源代码.zip是一个包含多个源代码文件的压缩包,主要涉及Hadoop框架的应用和实践。...通过分析和实验这些源代码,开发者可以加深对Hadoop架构和编程模型的理解,从而更好地适应不断发展的大数据处理领域。