你的代码可以是优雅的,但是还有更重要的

引用
软件设计有两种方法:一种是尽可能地简单,这种设计明显没有什么缺陷;另一种是尽可能地复杂,这种设计没有明显的缺陷。
——C.A.R. Hoare,1980年图灵奖讲座

在开发过程中,我的口头禅是: Your code may be elegant, by mine works。我为此而常常受到质疑,也有人反驳我“你不会使用最优方法!”“你在逃避测试!” 为了避免一次又一次地重复解释,我决定阐述下我的观点,仁者见仁,智者见智。

首先,我认为“项目可能会延期,但是代码会更好或更容易维护或更简洁”这句话是有问题的。项目延期,就是未完成,不应该用代码质量会更高作为借口。如果客户要在圣诞节进行推广活动,但你在12月29号才完成项目,即使提供了史上最好的产品,也是毫无价值的。

其次,我们来谈谈“最优方法”这个问题,“最优”是否意味着要写出更易于维护的代码需要更长的时间呢?其实除了大家都知道的《101个最优方法》以外,“最优”的标准是各种各样的。无论你对其进行怎样的定义,“最优方法”对所有程序员来说,应该是一种自然的编程标准。举个最简单的例子,经验丰富的程序员会自然地将变量命名为:$a、$b、 $c等,也能正确地缩进代码行。说得再深入一点,有经验的开发者知道在什么时候、如何提高效率以使得项目能如期完成。虽然 “最优方法”的标准有很多,但这些标准不会令你因此而延长项目时间。这引出我将谈到的下一点——Over-engineering(过度设计,指设计出来的系统比恰到好处要复杂臃肿的多,过度的封装、一堆继承、接口和无用的方法,以及超复杂的xml配置文件)。

像任何经验丰富的程序员一样,我了解那种想为每个项目搭建最好、最灵活、最耐用的系统的心态。但我也了解每个项目都有的商业限制:时间和资金。大多数项目都有明确的截止日期和项目预算,开发者要有意识地去控制项目规模以按时达到目标。你没有任何理由花一周时间,来为一个20行的table表上的数据库查询设置“恰当的”缓存层。多了解实用案例,如果只是为了实现一个页面访客计数器的功能而构建支持多种同时响应请求的XHR框架,是不现实的。要有眼界,这是我最强调的一点,最好的程序员不是精通如何构建最棒的系统的人,而是了解系统不需要的是哪些功能的人。

另外,在软件开发领域,上市时间是商业驱动力,在web应用开发领域,由于其动态性,这点更为明显。当时间成为关键,“最优方法”就是最简单的解决方案。

最后,我们来讨论一下技术债务(指为了匆忙实现一个功能,破坏了现有的程序库,在实现的过程中污染了代码库的设计)。如果在开发过程中,你在某个地方偷工减料了,那么就会产生无法解决的长期存在的技术债务,而且在之后的开发中,任何一个决定,都会受该债务的影响。事实上,在接手商业项目时,明白何时、如何对代码进行简化的能力是很关键的,这也是区分老手和菜鸟的标准。解决技术债务的办法有很多,但应尽量做到不产生技术债务。同样地,过度设计也不可避免地会产生技术债务。

通常人们在谈到技术债务的危险时,并没有包含商业影响。但其实技术债务与实际投资回报率是相对的,因为在许多情况下,早日上市更具成本效益。也有种情况是技术债务与收益同时存在,那么你可以慢慢偿还债务,但这会延长你的项目时间,很可能当你解决完技术债务时,你也失去了市场机会。

作为软件开发者,我们常常认为自己的工作就是开发软件,但其实这只是一种手段,我们的目的是令开发商达到他们的商业目标,你的代码也许很优雅很简洁,但如果不能达到目的,就丝毫没有意义。

英文原文:Your Code May Be Elegant

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15--0~n-1中缺失的数字

文章目录1. 问题描述2. 解题代码1. 问题描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,…

如何在README中使用图片

将图片放在仓库里面,在文件里链接它,最后 push 到 github 上。 github 图片链接格式: (http://github.com/yourname/your-repository/raw/master/images-folder/xxx.png) 要自己设定的:yourname, your-repository, your-folder…

Unity中传入任意数,转换成分,秒,并进行倒计时换算..(两种方式)

第一种方式是利用Unity中的协程,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class DemoTest : MonoBehaviour {public Text text;//测试用的数字public int MyTime 60;void Start (){//开启协程…

内核编程小结(引用)

https://www.cnblogs.com/fanling999/p/4509785.html转载于:https://www.cnblogs.com/endenvor/p/9006507.html

JIRA 5.0.1 发布

Atlassian公司发布了JIRA 5.0.1版本,该版本相比JIRA 5.0有更多改进功能。1. 管理界面的改进 将更多页面管理转为对话框形式。例如点击页面右上方的“Add New”就可实现新增issue types、sub-tasks、field configurations 、screens。2. 性能改进 解决了基于Lucene 3…

java开启新线程的三种方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 方式1:继承Thread类 步骤: 1):定义一个类A继承于Java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在ru…

16 --删除排序数组中的重复项

文章目录1.问题描述2.代码实现1.问题描述 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

jquery评分效果Rating精华版

参考:https://blog.csdn.net/bluceyoung/article/details/8573629转载于:https://www.cnblogs.com/yingyigongzi/p/9400489.html

NVIDIA助力SiemensPLMSoftware“工业4.0创新实验室”,携手推进中国制造创新之路

今日,NVIDIA宣布为SiemensPLMSoftware在北京建成的“工业4.0创新实验室”提供了支持。该实验室配备SiemensPLMSoftware全面的产品生命周期管理解决方案,结合第三方硬件,向中国制造企业展示“数字化企业”的全景图。实验室的工作站全部配备NVI…

java中的native方法

一. 什么是Native Method简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制&a…

17--合并两个有序数组

文章目录1.问题描述2.代码实现1.问题描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间…

Maven 添加本地 jar 包、添加依赖 jar 文件到本地 Maven 仓库、引用本地 jar

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 把要用的jar放在固定位置: 2.打开CMD,进入到libs文件夹: 3.运行如下命令: mvn install:install-…

如鹏网 net高级技术 第二章 委托和事件(复习)

委托 委托是一种数据类型,可以声明委托类型变量。 委托是一种可以指向方法的数据类型。 声明委托的方式:delegate返回值类型 委托类型名(参数)   比如  delegate void MyDel(int n) 注意这里的除了前面的delegate,剩下部分和声明一个函数一样&#…

黄文俊:Serverless小程序后端技术分享

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 黄文俊,现任腾讯云SCF无服务器云函数高级产品经理,多年企业级系统开发和架构工作经验,对企业级存储、容器平台、微服务架构、无服务器计算等领域均有涉猎。今天讲的是怎么…

最少编码原则

本文作者是一位资深软件工程师,他根据多年的编程经验,把自己的观点组织整理成本文,希望能给大家一点启发。 “最少编码原则”并不是说写的代码少到令意思表达不清楚。其实在很多情况下,可以只写几行代码就能执行相同的逻辑&#x…

什么是标记接口

标识接口的作用 标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。 标接口在Java语言中有一些很著名的应用,比如java.io.Serializable和java.rmi.Remote等接口便是标识接口。标识…

18--两数之和 II - 输入有序数组

文章目录1.问题描述2.解题代码1.问题描述 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2&a…

阿里巴巴 连接池 druid 的使用、maven依赖

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-…

Oracle数据库(二)—— 基本的SQL SELECT语句

(一)SQL语句分为一下三种类型 DML:Date Manipulation Language 数据操纵语言DDL:Data Definition Language 数据定义语言DCL:Data Control Language 数据控制语言DML:用于查询与修改数据记录 包括如下SQL语句&#xff…

简单 3 步实现高效编程

本文的内容可能部分开发者已经了解,并且已经按照这些方法实施了。但本文还是想强调这些方法,因为这些简单的方法可以让你的工作更加高效。要想实现高效编程,最主要的是集中注意力,但这往往也是比较难以实现的,因为你在…