代码真的有必要写到完美吗?

过去几个月,我总是在问自己类似的问题:为什么我们总在苛求完美的代码?因为内部项目需要,重新捡起编码任务之后,我发觉我们组内(也可能是大多数软件开发世界中的大多数人)花费了大量时间在规整编码规范、模式和测试代码,但这真的有必要么?

作为软件开发机构,我们需要持续地进行预算、时间和特性的平衡。这种平衡的结果是,许多特性需要修改,或者干脆不做了,可能原因是耗时过长或者成本太高。从另一个方面来说,工程师通常感到项目特别赶,出来的代码通常都不完美。我相信对于任何软件研发机构来说,这个现状都是很明显的。

上个月,我跟我们的一位客户(CEO)谈话,他们的 CTO
和主程要求我们帮助他们重构一部分代码。在不作出重大修改的前提下添加新功能几乎不可能,而且没有人对整体代码实现很了解。尽管目前运行一切良好,这部分项目初始代码从技术角度来看就是一团乱。这位客户(CEO)问我为什么需要重构,从他的角度来看,代码目前没有任何问题,只是需要发布新功能可以再快一点。

我想这种情况下,双方都很有道理。开发者们希望用最新的技术写出完美的代码,写完善的文档,每个人都可以了解到具体实现,从而可以方便测试和后续的维护升级。而另一方面,其它人却只是希望快速经济地完成功能,从而他们可以推出新功能或者推销给更多客户。

那我们该怎么平衡这两种诉求呢?

忘掉未来,为现在而编码

大多数产品公司经历了几个阶段。每个阶段都需要对“完美”的意思有不同的看法。我们可以长时间地讨论哪些阶段是存在的,但为了本文,我将仅仅(just)区分为:概念验证代码、 MVP 代码和长期维护代码。并分别举例说明。

在为产品制定新的想法时,花费任何时间编写可扩展的、全面测试的并符合最新编码标准的代码是没有意义的。目标是提供一个概念原型,例如连接几个 API 或尝试一个新的接口想法。当实现目标之后,任何人都不太可能再次深入这个代码。

大多数人在构建最小可行的产品时,都高估了对优质代码的需求。每个创业公司的最重要的事情是发布在一个漂亮的、功能完善的产品。该产品的后台工作原理并不重要。直到你的
MVP
真正得到关注,你可以着手处理劣质代码,甚至手工做些事情来证明你拥有一个适合的产品/市场。只有在你确定使用它,并且客户开始流入时,你应该开始关心代码,如果没到这一步,你其实仅仅(just)写了一次性的代码而已。

一旦这些辛苦积攒的客户开始流入,你有可能产生一些收入或吸引外部的融资。
现在是开始思考整洁、长期维护的代码的正确时机。这是在介绍中的示例上我们的客户所处的场景。鉴于你受众有可能增长,你需要开始考虑性能、稳定性和可用性。
你的工程团队也将扩大规模。这将迫使你实施编码标准、文档标准和一系列其他流程和实践。你开始需要完美的代码了。

可以看到,在每个阶段示例中我们的代码目标都有所不同,对于“完美”的定义,自然也有所不同。

并不存在完美的代码

我们都知道,开发软件涉及到多个不同的阶段。所以其实很难断定,到底有什么所谓完美的代码,完全适用于所有的开发阶段。

客户的需求,五花八门。可写代码时用的库其实却更甚。有些库是我们自己写的,也有一些是第三方的。有时候看一个项目的代码,还确实可能会发现它混杂了不同人的代码;比如说,自己的团队先写点代码给项目开个头,之后交给客户的团队写一会。最后呢,却又由我们自己来收尾。

由此可见,每个项目的代码风格,以及用到的技术、实现方法等都可以很不一样。你的项目,或许在发布时堪称完美。但是,经过上面所说的这种把项目丢来丢去的过程之后,我猜最后肯定经常会有人嫌其他团队写的代码有问题,那这种项目显然就不完美了啊。

现实就是如此,想达成某件事,不可能会有什么完美的方法。至于编程,虽然我这么说可能会感觉有点奇怪,但它压根就不是一门严谨的学科。你想编程实现某个需求,往往会有很多方法。到最后你或许会发现,这些方法,其实都行得通。

处理不完美的代码

不完美并不等于劣质。去网上搜一下 Pareto principle 和 Sufficient Design 就知道为啥了。

让一个人去写项目,如果这人发现项目里用了一堆过时了的代码,或者是用了 MVP
架构,又或者是项目写了很久很久,那这人肯定很想把整个项目给重写了,这样才感觉整个项目尽在掌握,如鱼得水,而不是看着就头疼。不过呢,重写大项目一直都不是啥好事,整天流于形式写框架,却白白浪费了写业务逻辑的时间,这很没必要的。有些事情可以不用管它,别太纠结。但是呢,如果你重写的代码符合我下面说的这些标准,那你重写也不是啥坏事的说:(节录自
这篇文章 )

  1. 重写的代码真能实现需求么?
  2. 代码真的正确无误,而且效率还不错么?
  3. 在 遇到并处理错误 时可以做到不崩溃,或者 安全地结束执行 么?
  4. 试起来容易不?
  5. 如果要改动代码,能尽量又简单又安全不?

这最后一条标准大概是最难做到的,毕竟要做到模块分离和抽象化,还要写测试代码来确保符合预期效果;而且代码若还有改动,只要修改相应的一部分测试代码就行,这样才可以更加轻松地调试和改动代码。

从零开始写项目时,一定要花点心思。无论是写新项目,还是重写旧项目,都要规范地写代码。比如说,代码风格要清爽、要有可读性、要遵从一定的代码规范。但是但是,一定要小心,不要
过早优化
你写的代码。写的时候只管想下一个要实现的需求是什么,而不是边写边纠结怎么缓存资源、怎么弄个复杂的数据结构来储存数据之类的事情,还有别动不动就担心执行效率。你代码越简单,其他那些要接手你代码的人就越感谢你。刚开始写项目时,这些很重要;以后给客户写项目时也一样重要,毕竟说不定哪天客户就要你把项目交给他们来继续写呢。

把这些带入实践中

每个星期我都会和有好想法的人交谈,但他们希望用很小的预算来实现他们的想法。当他们问我实现他们的想法需要花费多少时,我的回答是在 10k
至几十亿之间,所以基本上是把这个问题抛回给对方,问他们希望花费多少。根据他们的回答,我会试图清楚地向他们解释他们可以期待什么:概念证明、MVP(Minimum
Viable Product – 最简化可实行产品)或拥有长期可用代码的产品。

作为程序员,我们应该尝试不那么完美主义,并且牢记保持这一目标。提供价值比我们的代码整洁更重要。只有当你为了长期目标,去追求完美才有意义。

作为首席执行官(CEO),你应该问自己,预算是否适合你的产品所在阶段,并且要牢记预算所提供的限制和机会。有时需要重构。

我相信,只要我们在内部或为客户开始一个新项目时,我们都需要询问代码的完美程度。所以我们可以根据短期和长期的期望来交付产品。

人们取笑我对 just 这个词的使用。因为我经常会说这句话 “just do it like this”
(照这样做就可以了)。然后人们会向我解释说,这没有那么简单,因为我没有考虑到诸多的边缘情况。也许我是有意这样做,只想着 happy path
(愉快路径) ,而忽略了任何可能出错的东西。在本文的上下文中,我决定强调 just
这个词,因为它与文章中讨论的问题高度相关。有时你只需要为愉快路径进行编码。

作者:佚名

来源:51CTO

时间: 2024-10-27 20:35:57

代码真的有必要写到完美吗?的相关文章

让你提前认识软件开发(40):既要写好代码,又要写好文档

第3部分 软件研发工作总结 既要写好代码,又要写好文档           对于软件相关行业,在学校或单位上,大家也许都已经注意到了,除了要编写的程序.绘制设计图之外,还有一个重要的工作便是写文档.为什么要写文档呢?因为我们要把自己做的东西展示出来,不光展示给同行看,可能还要展示给其他岗位上的工作人员看,甚至展示给用户看.如果我们只是会写程序,不会在文档中描述自己的想法,那么就真正的成为"码农"了.         工作也有一段时间了,我发现周围的同事,会写高质量文档的确实很少.李开复

拷贝-求代码 用C++控制台 写判断两个文档是否一样,不一样,进行覆盖。

问题描述 求代码 用C++控制台 写判断两个文档是否一样,不一样,进行覆盖. 求代码 用C++控制台 写判断两个文档是否一样,不一样,进行覆盖. 要求打开文件后,在内存中比较 ,谢谢大神 解决方案 提供个思路,随便搜一搜就能解决的,计算文档的md5,如果完全一致,那就一样,不一致,直接覆盖好了 解决方案二: #include <stdio.h> #include <stdlib.h> void main() { FILE *fp1,*fp2; char fn1[]="t1

单链表-求大神们给一下这段代码的case怎么写?

问题描述 求大神们给一下这段代码的case怎么写? bool ListDelete_L(LinkList &Lint iElemType &e){ //在带头结点的单链表L中,删除第i个元素,并由e返回其值 LinkList pq; int j; p=L;j=0; while(p->next&&jnext;++j;} //寻找第i-1个结束 if(!(p->next)||j>i-1)return 0; //i大于表长+1或者小于1 q=p->next

ecshop里有点类似联动菜单那样,但是代码我不会写,望大神们帮忙

问题描述 ecshop里有点类似联动菜单那样,但是代码我不会写,望大神们帮忙 下图是我写的代码我想要的效果是,根据选择一个主体后,名称那项就会出现一些对应的下拉数据,有点类似联动菜单那样,但是代码我不会写,望大神们帮忙 解决方案 http://bbs.ecshop.com/thread-90141-1-1.html 解决方案二: http://bbs.csdn.net/topics/340105236

EF MVC 关联实体 更新操作 代码为什么要这么写?

问题描述 EF MVC 关联实体 更新操作 代码为什么要这么写? 这是从 EF自动生成的edit上修改的.关于文字类型的操作 ArticleCategory: public partial class ArticleCategory : Entity { public ArticleCategory() { this.Article = new HashSet<Article>(); } [Display(Name = "分类名称")] [StringLength(225,

当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的

英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说"这段代码不言自明"?你的同事的这句话的实际意思是这段代码不需要写注释. 你也许注意到了,很多时候,程序员所说的话的字面意思和其真实的意思是完全不同的.不用惊异,下面你将很快知道这些暧昧的短语和其深层次的意思都是什么. 最近 Imgur 上出现了一张图片,里面列举的程序员的一些专业术语和其含义,它能很好的帮助你理解这些话的真实意思.这里是对其中的精华进行的总结. 典型的程序员之间

写代码瞌睡,每次写代码都瞌睡

问题描述 写代码瞌睡,每次写代码都瞌睡 我一写代码的就瞌睡,晚上睡不着,只要想想代码肯定能睡着,这怎么破 解决方案 瞌睡了趴那睡一会,醒来了就精神了,效率高,晚上可以去跑步,累得快,回来热水泡泡脚,有助于睡眠. 解决方案二: 喝点咖啡或者红牛提提神.晚上早点睡,不要胡思乱想.有比较严重的失眠去看医生. 解决方案三: ...囧了,这个我只能说不明觉厉啊,思考还能睡着么..我一般都是睡觉前不写代码,不然会睡不着. 解决方案四: 或者说,有点烦躁了?那么你就先暂时不要写程序,需要休息一阵子,然后早点休

怎么写出完美的错误消息

本文讲的是怎么写出完美的错误消息, 原文地址:How to Write a Perfect Error Message 原文作者:Vitaly Dulenko 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者: Cherry 校对者:lampui shawnchenxmu 怎么写出完美的错误消息 每一个系统都会出现错误.这可能是用户的错误也可能是系统的错误.在这两种情况下,正确处理错误非常重要,因为它们对于良好的用户体验至关重要. 一个好的错误消息应该包

求cloudsim自带的样例以外的测试代码(如自己写的资源调度策略)

问题描述 求cloudsim自带的样例以外的测试代码(如自己写的资源调度策略)求cloudsim自带的样例以外的测试代码(如自己写的资源调度策略)求cloudsim自带的样例以外的测试代码(如自己写的资源调度策略)