关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

不要浪费时间写完美的代码

guanshanw 2023-09-29 21:36 13 浏览 0 评论

系统可以持续运行 5 年、10 年甚至 20 年或者更多年。但是,特定的代码行的生命,即使是经过设计,通常要短得多:当你通过各种方式来迭代寻求解决方案时,它会有几个月、几天甚至几分钟的生命。 -- Jim Bird

本文导航
  • -一些代码比其他代码重要 …… 03%

  • -我们应该尝试编写完美的代码么? …… 11%

  • -务实编码和重构 …… 46%

  • -(不只是)代码无关 …… 68%

编译自: https://dzone.com/articles/dont-waste-time-writing

作者: Jim Bird

译者: geekpi

系统可以持续运行 5 年、10 年甚至 20 年或者更多年。但是,特定的代码行的生命,即使是经过设计,通常要短得多:当你通过各种方式来迭代寻求解决方案时,它会有几个月、几天甚至几分钟的生命。

一些代码比其他代码重要

通过研究代码如何随时间变化[1],Michael Feathers 确定了一个代码库的冥曲线[2]。每个系统都有代码,通常有很多是一次性写成,永远都不会改变。但是有少量的代码,包括最重要和最有用的代码,会一次又一次地改变、会有几次重构或者从头重写。

当你在一个系统、或者问题领域、体系结构方法中有更多经验时,会更容易了解并预测什么代码将一直改变,哪些代码将永远不会改变:什么代码重要,什么代码不重要。

我们应该尝试编写完美的代码么?

我们知道我们应该写干净的代码[3],代码应该一致、清晰也要尽可能简单。

有些人把这变成了极端,他们迫使自己写出美丽[4]、优雅、接近完美[5]的代码,痴迷于重构[6]并且纠结每个细节。

但是,如果代码只写一次而从不改变,或者如果在另一个极端下,它一直在改变的话,就如同尝试去写完美的需求和尝试做完美的前期设计那样,写完美的代码难道不是既浪费又没有必要(也不可能实现)的么?

“你不能写出完美的软件。是不是收到了伤害?并不。把它作为生活的公理接受它、拥抱它、庆祝它。因为完美的软件不存在。在计算机的短暂历史中从没有人写过完美的软件。你不可能成为第一个。除非你接受这个事实,否则你最终会浪费时间和精力追逐不可能的梦想。”

Andrew Hunt,务实的程序员: 从熟练工到大师[7]

一次性写的代码不需要美观优雅。但它必须是正确的、可以理解的 —— 因为绝不会改变的代码在系统的整个生命周期内可能仍然被阅读很多次。它不需要干净并紧凑 —— 只要干净就够了。代码中复制和粘贴[8]和其他小的裁剪是允许的,至少在某种程度上是这样的。这些是永远不需要打磨的代码。即使周围的其他代码正在更改,这些也是不需要重构的代码(除非你需要更改它)。这是不值得花费额外时间的代码。

你一直在改变的代码怎么样了呢?纠结于代码风格以及提出最优雅的解决方案是浪费时间,因为这段代码可能会再次更改,甚至可能会在几天或几周内重写。因此,每当你进行更改时,都会痴迷重构[9]代码,或者没有重构没有改变的代码,因为它可能会更好。代码总是可以更好。但这并不重要。

重要的是:代码是否做了应该做的 —— 是正确的、可用的和高效的吗?它可以处理错误和不良数据[10]而不会崩溃 —— 或者至少可以安全地失败[11]?调试容易吗?改变是否容易且安全?这些不是美的主观方面。这些是成功与失败实际措施之间的差异。

务实编码和重构

精益开发Lean Development的核心思想是:不要浪费时间在不重要的事情上。这应该提醒我们该如何编写代码,以及我们如何重构它、审查它、测试它。

为了让工作完成,只重构你需要的[12] —— Martin Fowler[13] 称之为机会主义重构opportunistic refactoring(理解、清理、童子军规则[14] )和准备重构preparatory refactoring。足够使改变更加容易和安全,而不是更多。如果你不改变那些代码,那么它并不会如看起来的那么重要。

在代码审查中,只聚焦在重要的事上[15]。代码是否正确?有防御机制吗?是否安全?你能理解么?改变是否安全?

忘记代码风格(除非代码风格变成无法理解)。让你的 IDE 处理代码格式化。不要争议代码是否应该是“更多的 OO”。只要它有意义,它是否适当地遵循这种或那种模式并不重要。无论你喜欢还是不喜欢都没关系。你是否有更好的方式做到这一点并不重要 —— 除非你在教新接触这个平台或者语言的人,而且需要在做代码审查时做一部分指导。

写测试很重要。测试涵盖主要流程和重要的意外情况。测试让你用最少的工作获得最多的信息和最大的信心。大面积覆盖测试,或小型针对性测试[16] —— 都没关系,只要一直在做这个工作,在编写代码之前或之后编写测试并不重要。

(不只是)代码无关

建筑和工程方面的隐喻对软件从未有效过。我们不是设计和建造几年或几代将保持基本不变的桥梁或摩天大楼。我们构建的是更加弹性和抽象、更加短暂的东西。代码写来是被修改的 —— 这就是为什么它被称为“软件”。

“经过五年的使用和修改,成功的软件程序的源码通常完全认不出它原来的样子,而一个成功建筑五年后几乎没有变化。”

Kevin Tate,可持续软件开发[17]

我们需要将代码看作是我们工作的一个暂时的手工制品:

有时候面对更重要的事情时,我们会迷信代码。我们经常有一个错觉,让卖出的产品有价值的是代码,然而实际上可能是对该问题领域的了解、设计难题的进展甚至是客户反馈。

Dan Grover,Code and Creative Destruction[18]

迭代开发教会我们来体验和检验我们工作的结果 —— 我们是否解决了这个问题,如果没有,我们学到了什么,我们如何改进?软件构建从没有止境。即使设计和代码是正确的,它们也可能只是一段时间内正确,直到环境要求再次更改或替换为更好的东西。

我们需要编写好的代码:代码可以理解、正确、安全和可靠。我们需要重构和审查它,并写出好的有用的测试,同时知道这其中一些或者所有的代码,可能会很快被抛弃,或者它可能永远不会被再被查看,或者它可能根本不会用到。我们需要认识到,我们的一些工作必然会被浪费,并为此而进行优化。做需要做的,没有别的了。不要浪费时间尝试编写完美的代码。


作者简介:

Jim Bird

我是一名经验丰富的软件开发经理、项目经理和 CTO,专注于软件开发和维护、软件质量和安全性方面的困难问题。在过去 15 年中,我一直在管理建立全球证券交易所和投资银行电子交易平台的团队。我特别感兴趣的是,小团队在构建真正的软件中如何有效率:在可靠性,性能和适应性极限限制下的高质量,安全系统。


via: https://dzone.com/articles/dont-waste-time-writing

作者:Jim Bird[19] 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

点击“了解更多”可访问文内链接

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: