不要将时间浪费到编写完美代码上

简介:

【腾讯云】云上实验室:开发者零门槛,免费使用真机在线实验!>>>

一个系统的迭代开发可能持续运行5年至10年甚至是20年。相比之下,某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天,甚至当你为了解决一个问题迭代测试不同方案时它们的生命周期只有几分钟。

一些代码的确比其他代码更重要

通过研究代码随时间发生的变化,Michael Feathers发现了代码生命线。通常,每个系统都有许多一次写成不再修改的代码。但是,有一小部分代码,包括最重要最有用的代码,却被经常被修改,重构或者重写数次。

随着对一个系统或者一类问题或者一个架构方案的深入了解,你应该能够更加轻易的知道或者预测到哪些代码会不停的变化哪些代码不会,换句话说,就是哪些代码比较重要哪些代码不重要。

是否应该努力去写完美代码?

大家都知道,我们应该写干净的代码,保持代码的一致性、易读性,并且尽可能地简单。

但是一些人走了极端,尽自己的最大努力,去写尽可能优雅的、接近完美的代码,痴迷于重构斟酌代码的每一个细节。

但是,如果这些代码不是一次写成不再修改,反而是一直不断的变化,那么,努力去写完美代码或者努力进行完美的设计岂不是浪费时间?

“你不可能写出完美的代码。你难道为此倍受打击么?显然不该。应该将它作为一个生活中的公理,去拥抱它,庆祝它,因为完美的代码是不存在的。在计算机短暂的历史中,没有任何人曾经写出过哪怕一段完美无缺的代码。显然,你也不太可能成为第一个写出完美代码的人。除非你接受这个事实,否则你会一直浪费时间和精力去追逐一个不能实现的梦想!”——Andrew Hunt《程序员修炼之道:从初级到高级》

只写一次的代码首要不是美观和优雅,而是正确运行,而且易读易懂,因为在系统的整个生命周期中,这些代码虽然不再修改,但是可能需要阅读很多次。不一定非要紧凑,干净即可。在这些代码中,一定程度上的拷贝和粘贴等操作是可以接受的。这些代码不需要反复斟酌,除非你需要修改它,否则即使周围代码都在变,也不需要对这些代码重构。对于这些代码,没必要花费过多额外的时间。

对于那些一直需要修改的代码呢?苦苦思索代码的风格和最优雅的方案是在浪费时间,因为,这些代码可能在随后的几天或者几周就会被修改甚至重写。同样地,每次修改都痴迷于代码的重构,或者重构那些不需要修改的代码试图使其变得更好也是没有必要的。代码永远都可以变得更好,但是这不应该是最重要的方面。

真正重要的是代码是否实现了想要的功能?代码是否正确运行?是否有用?是否高效?能否处理错误和损坏的数据而不会崩溃,至少也要安全的失效?调试是否方便?修改起来是否简单且安全?这些不是美观的组成部分,而是实际中衡量代码是否正确的标准。

务实地进行编码和重构

精益开发的核心思想是:不要把时间浪费到不重要的事情上。应该用这个原则指导我们如何编写代码,如何重构代码,如何进行代码审查以及如何进行代码测试。

为了完成工作,只进行必要的代码重构,Martin Fowler称之为机会主义重构(或理解为清理,童子军规则)和有预备的重构。这足以使代码修改起来更加简单和安全。如果你不是在修改代码,代码看起来是什么样子,真的无关紧要。

在代码审查中只关注真正重要的部分,这些代码是否正确?是否是防御性的代码?是否安全?你能否理解它的思路?修改起来是否安全?

不要纠结于代码的风格(除非代码风格误导了你对代码的理解),把格式化代码的工作交给IDE。没有必要去争论这些代码能否“更加面向对象”。只要它有道理,至于是使用这用模式还是别的模式,并不重要。同样,至于你是否喜欢,也不重要,尽管你可以用更好的方式完成它,除非你是在教对平台或者语言不熟悉的新手,需要在代码审查中完成监督工作。

测试用例的编写很重要,需要覆盖到主要的执行路径和重要的异常情况。测试用例能够用最少的工作量给你尽可能多的信息和信心,具体是采用大而全的测试还是小而精的测试则无关紧要。至于是在写代码之前写测试用例还是在写代码之后写测试用例也不重要,只要测试用例有效即可。

不仅仅是关于代码

在软件领域里,建筑师和工程师的概念从来都不适用,我们不是设计建造屹立数年或者数百年大桥或者摩天大楼,我们构建的是更加具有可塑性的、更加抽象的,同时生命周期也更加短暂的东西。软件之所以称为“软件”,就是因为编写代码就是为了修改。

“经过五年的使用和修改,很多情况下,一个成功的软件源码和最初的样子已经面目全非了,但是一个成功的建筑经过五年,基本没有任何变化。”——《可持续软件开发》

我们应该将代码视为工作的一个临时假象:

有时在重要的事情面前,我们陷入了对代码的迷恋。我们经常遭受这样的误解,在产出的产品中代码是最有价值的东西,尽管它实际上是对一个问题的理解,或者是对设计的一种实现甚至是顾客的反馈。——Dan Grover《编码与创造性破坏》

迭代开发教会我们不断的尝试和检查尝试的结果——是否解决了问题,如果没有解决问题,如何去改进?我们正在构建的软件是永远做不完的。尽管设计和编码是正确的,那也可能只是一时正确,一旦需求发生变化,就会被更加适合的设计和编码替代。

我们需要写好的代码:易懂,能够正确运行,有安全保障的代码。我们需要对它进行重构和代码审查,并且编写有效的测试用例。但是要记住,其中的一些代码或者全部代码可能很快就被丢掉,或者再也不会被读到甚至从来就不会被用到。我们需要意识到,我们的一部分工作可能要被浪费掉并且对此进行优化。只做哪些需要被完成的事情,不要浪费时间试图去编写完美代码。
【腾讯云】云上实验室:开发者零门槛,免费使用真机在线实验!>>>

一个系统的迭代开发可能持续运行5年至10年甚至是20年。相比之下,某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天,甚至当你为了解决一个问题迭代测试不同方案时它们的生命周期只有几分钟。

一些代码的确比其他代码更重要

通过研究代码随时间发生的变化,Michael Feathers发现了代码生命线。通常,每个系统都有许多一次写成不再修改的代码。但是,有一小部分代码,包括最重要最有用的代码,却被经常被修改,重构或者重写数次。

随着对一个系统或者一类问题或者一个架构方案的深入了解,你应该能够更加轻易的知道或者预测到哪些代码会不停的变化哪些代码不会,换句话说,就是哪些代码比较重要哪些代码不重要。

是否应该努力去写完美代码?

大家都知道,我们应该写干净的代码,保持代码的一致性、易读性,并且尽可能地简单。

但是一些人走了极端,尽自己的最大努力,去写尽可能优雅的、接近完美的代码,痴迷于重构斟酌代码的每一个细节。

但是,如果这些代码不是一次写成不再修改,反而是一直不断的变化,那么,努力去写完美代码或者努力进行完美的设计岂不是浪费时间?

“你不可能写出完美的代码。你难道为此倍受打击么?显然不该。应该将它作为一个生活中的公理,去拥抱它,庆祝它,因为完美的代码是不存在的。在计算机短暂的历史中,没有任何人曾经写出过哪怕一段完美无缺的代码。显然,你也不太可能成为第一个写出完美代码的人。除非你接受这个事实,否则你会一直浪费时间和精力去追逐一个不能实现的梦想!”——Andrew Hunt《程序员修炼之道:从初级到高级》

只写一次的代码首要不是美观和优雅,而是正确运行,而且易读易懂,因为在系统的整个生命周期中,这些代码虽然不再修改,但是可能需要阅读很多次。不一定非要紧凑,干净即可。在这些代码中,一定程度上的拷贝和粘贴等操作是可以接受的。这些代码不需要反复斟酌,除非你需要修改它,否则即使周围代码都在变,也不需要对这些代码重构。对于这些代码,没必要花费过多额外的时间。

对于那些一直需要修改的代码呢?苦苦思索代码的风格和最优雅的方案是在浪费时间,因为,这些代码可能在随后的几天或者几周就会被修改甚至重写。同样地,每次修改都痴迷于代码的重构,或者重构那些不需要修改的代码试图使其变得更好也是没有必要的。代码永远都可以变得更好,但是这不应该是最重要的方面。

真正重要的是代码是否实现了想要的功能?代码是否正确运行?是否有用?是否高效?能否处理错误和损坏的数据而不会崩溃,至少也要安全的失效?调试是否方便?修改起来是否简单且安全?这些不是美观的组成部分,而是实际中衡量代码是否正确的标准。

务实地进行编码和重构

精益开发的核心思想是:不要把时间浪费到不重要的事情上。应该用这个原则指导我们如何编写代码,如何重构代码,如何进行代码审查以及如何进行代码测试。

为了完成工作,只进行必要的代码重构,Martin Fowler称之为机会主义重构(或理解为清理,童子军规则)和有预备的重构。这足以使代码修改起来更加简单和安全。如果你不是在修改代码,代码看起来是什么样子,真的无关紧要。

在代码审查中只关注真正重要的部分,这些代码是否正确?是否是防御性的代码?是否安全?你能否理解它的思路?修改起来是否安全?

不要纠结于代码的风格(除非代码风格误导了你对代码的理解),把格式化代码的工作交给IDE。没有必要去争论这些代码能否“更加面向对象”。只要它有道理,至于是使用这用模式还是别的模式,并不重要。同样,至于你是否喜欢,也不重要,尽管你可以用更好的方式完成它,除非你是在教对平台或者语言不熟悉的新手,需要在代码审查中完成监督工作。

测试用例的编写很重要,需要覆盖到主要的执行路径和重要的异常情况。测试用例能够用最少的工作量给你尽可能多的信息和信心,具体是采用大而全的测试还是小而精的测试则无关紧要。至于是在写代码之前写测试用例还是在写代码之后写测试用例也不重要,只要测试用例有效即可。

不仅仅是关于代码

在软件领域里,建筑师和工程师的概念从来都不适用,我们不是设计建造屹立数年或者数百年大桥或者摩天大楼,我们构建的是更加具有可塑性的、更加抽象的,同时生命周期也更加短暂的东西。软件之所以称为“软件”,就是因为编写代码就是为了修改。

“经过五年的使用和修改,很多情况下,一个成功的软件源码和最初的样子已经面目全非了,但是一个成功的建筑经过五年,基本没有任何变化。”——《可持续软件开发》

我们应该将代码视为工作的一个临时假象:

有时在重要的事情面前,我们陷入了对代码的迷恋。我们经常遭受这样的误解,在产出的产品中代码是最有价值的东西,尽管它实际上是对一个问题的理解,或者是对设计的一种实现甚至是顾客的反馈。——Dan Grover《编码与创造性破坏》

迭代开发教会我们不断的尝试和检查尝试的结果——是否解决了问题,如果没有解决问题,如何去改进?我们正在构建的软件是永远做不完的。尽管设计和编码是正确的,那也可能只是一时正确,一旦需求发生变化,就会被更加适合的设计和编码替代。

我们需要写好的代码:易懂,能够正确运行,有安全保障的代码。我们需要对它进行重构和代码审查,并且编写有效的测试用例。但是要记住,其中的一些代码或者全部代码可能很快就被丢掉,或者再也不会被读到甚至从来就不会被用到。我们需要意识到,我们的一部分工作可能要被浪费掉并且对此进行优化。只做哪些需要被完成的事情,不要浪费时间试图去编写完美代码。

文章转载自 开源中国社区[http://www.oschina.net]

相关文章
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
探索人工智能在现代医疗中的革新应用
本文深入探讨了人工智能(AI)技术在医疗领域的最新进展,重点分析了AI如何通过提高诊断准确性、个性化治疗方案的制定以及优化患者管理流程来革新现代医疗。文章还讨论了AI技术面临的挑战和未来发展趋势,为读者提供了一个全面了解AI在医疗领域应用的视角。
253 11
|
边缘计算 人工智能 测试技术
什么是虚拟机技术?
拟机技术作为现代计算环境中的重要组成部分,极大地丰富了我们对资源管理和系统部署的理解与实践。本文将深入探讨虚拟机的定义、工作原理、应用场景、优势、主要技术以及未来发展趋势,帮助读者全方位地理解虚拟机这一强大技术。
652 7
|
关系型数据库 分布式数据库 数据库
PostgreSQL+Citus分布式数据库
PostgreSQL+Citus分布式数据库
377 15
|
人工智能 Cloud Native 架构师
CNCF 宣布 Dapr 毕业
Dapr 是一个可移植的分布式应用运行时,提供集成 API,帮助开发者构建可靠和安全的分布式应用,提升生产力 20-40%。Dapr 于 2019 年由微软发布,并于 2021 年 11 月正式加入 CNCF。截至 2024 年 11 月 13 日,Dapr 已正式从 CNCF 毕业。它支持多种云原生技术,广泛应用于 Grafana、FICO、HDFC 银行等企业。
319 2
|
12月前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
475 0
|
C# 开发者 前端开发
揭秘混合开发新趋势:Uno Platform携手Blazor,教你一步到位实现跨平台应用,代码复用不再是梦!
【8月更文挑战第31天】随着前端技术的发展,混合开发日益受到开发者青睐。本文详述了如何结合.NET生态下的两大框架——Uno Platform与Blazor,进行高效混合开发。Uno Platform基于WebAssembly和WebGL技术,支持跨平台应用构建;Blazor则让C#成为可能的前端开发语言,实现了客户端与服务器端逻辑共享。二者结合不仅提升了代码复用率与跨平台能力,还简化了项目维护并增强了Web应用性能。文中提供了从环境搭建到示例代码的具体步骤,并展示了如何创建一个简单的计数器应用,帮助读者快速上手混合开发。
417 0
|
设计模式 开发框架 .NET
分享一个 .NET Core Console 项目使用依赖注入的详细例子
分享一个 .NET Core Console 项目使用依赖注入的详细例子
262 0
|
监控 Devops 持续交付
构建高效可靠的云基础设施:DevOps和SRE的最佳实践
【5月更文挑战第30天】在数字化转型的浪潮中,企业对云基础设施的依赖日益增加。本文探讨了如何通过结合DevOps和Site Reliability Engineering(SRE)的最佳实践来构建一个高效、可靠且灵活的云环境。文章首先概述了DevOps和SRE的核心原则,接着提出了一系列策略来优化云资源的管理、自动化流程、以及提高系统的弹性。最后,文中将分享一些成功的案例分析,以帮助读者理解这些原则在实际场景中的应用。
|
设计模式 前端开发 C#
Helix Toolkit:为.NET开发者带来的3D视觉盛宴
Helix Toolkit:为.NET开发者带来的3D视觉盛宴
972 0
|
Cloud Native 关系型数据库 分布式数据库
数据库性能诊断工具DBdoctor通过阿里云PolarDB产品生态集成认证
DBdoctor(V3.1.0)成功通过阿里云PolarDB分布式版(V2.3)集成认证,展现优秀兼容性和稳定性。此工具是聚好看科技的内核级数据库性能诊断产品,运用eBPF技术诊断SQL执行,提供智能巡检、根因分析和优化建议。最新版V3.1.1增加了对PolarDB-X和OceanBase的支持,以及基于cost的索引诊断功能。PolarDB-X是阿里巴巴的高性能云原生分布式数据库,兼容MySQL生态。用户可通过提供的下载地址、在线试用链接和部署指南体验DBdoctor。
689 0