完美主义对程序员的影响

代码重要性区分

一个系统能够维持 5 年,10 年,甚至 20 年以上,可是代码和设计模式的生命周期很是短,当对一个解决方案使用不一样的方法进行迭代的时候,一般只能维持数月,很多天,甚至几分钟的时间。设计模式

随着对代码是如何改变的研究,致力于代码修改艺术的人发现了一个代码库的规律曲线。每一个系统都有不少从未改变的代码。可是也有小部分很是重要且有用的代码一次又一次的改变,通过了屡次重构和重写。安全

当你对一个系统,问题域,或者架构方法愈来愈熟悉的时候,就更容易发现和预测哪些代码会常常修改,哪些代码不会被修改,即区分重要代码和非重要代码。架构

咱们应该尝试追求完美代码?

众所周知,咱们应该写干净整洁的代码,而干净整洁就应该是尽量一致,易懂,简单。测试

有些人追求极致,强迫本身写的代码要漂亮且优雅,接近于他们所能达到的完美,疯狂的进行重构,并致力于每个细节。优化

与写完代码再也不变更相比,一直修改的代码会让完美的需求和具备前瞻性的设计变得有些多余和不必。编码

你不能写出完美的软件,这样的结果会使你受伤了?不必,把它当作人生格言,信奉并祝贺,由于完美的软件并不存在,在计算机历史中没一我的曾经写出过完美软件,固然,你也不可能成为第一个,只有接受这样一个事实,你才能再也不在浪费时间,将精力放在可能实现的理想中。设计

Andrew Hunt调试

曾经写过的代码不须要优美优雅。它必须是正确的且容易理解的,由于在系统的生命周期中那些从不用修改的代码也会被屡次访问。一样这些代码不须要又整洁又紧凑——只要整洁就足够了。在必定程度上,复制粘贴和其余快捷方法写出的代码是容许的。即便这些代码周围的代码变了,这些代码不须要反复修改,不须要重构(直到你须要修改它)。这样的代码是不值得花费额外的时间的。生命周期

那些常常修改的代码该如何处理呢?苦思冥想代码风格和提出最优雅的解决方案是浪费时间的,由于这些代码可能会在几天或几周以内再次修改,甚至重写。由于但愿代码应该变得更好而痴迷地重构那些须要常常修改代码,或者重构那些基本不会修改的代码。代码一直能够变得更好,但这并不重要。开发

最重要的是:代码是否作到了它应该作的事?代码运行正确且可用又高效吗?可以处理错误和错误数据而不奔溃或者至少是安全地出错吗?容易调试吗?能简单又安全地修改代码吗?这些不是对于完美代码的主观想法,而是用来区分红功和失败的切实可行的措施。

实用的编码和重构

精益开发的核心思想是:不要浪费时间在那些不重要的事情上。这句话已告诉咱们该怎样写代码,怎样重构代码,怎样评审代码,怎样测试代码。

为了把工做作好,只重构你须要的——Martin Fowler 称为机会主义重构(理解、清理不切实际的东西)和预先重构。足够让修改变得更简单更安全便可,其余的没必要考虑。若是你不修改那些代码,那么那些代码长什么样子是无所谓的事。

在代码评审中,只关注那些重要的。代码正确吗?有防范机制吗?安全吗?容易理解吗?可以安全地修改吗?

忘掉编码风格(除非编码风格达到可理解的程度)。让你的 IDE 处理格式化。不要过多争论:代码是否能够是“更多的 OO”。只要它有意义,无论它是否适当地遵循这种或那种模式,这些都不重要。不管你喜欢仍是不喜欢都不要紧。不管你可否以更好的方式作到这一点并不重要——除非你在教一个对平台和语言都不熟悉的新手,并且你须要作一些代码评审做为指导的一部分。

写测试是有必要的。测试那些涵盖主路径和重要例外状况的测试。测试可让你以最少的工做量得到最多的自信心。大规模全范围测试或者小规模局部测试——在编写代码以前测试仍是以后测试,都不要紧,只要作了这个工做就行。

这不(仅)是关于代码

建筑学和工程学的隐喻从未在软件开发中生效。咱们不是设计和建造桥梁或摩天大楼 —— 它们会在几年或几代内保持基本相同。咱们正在建造一些更富有创造力和抽象性、更加短暂的东西。代码编写以后是用来修改的 —— 这就是为何它被称为“软件”的缘由。

“通过五年的使用和修改,成功的软件的源码一般与最第一版本彻底不同,而五年以后的成功的建筑几乎没有什么变化。”

Kevin Tate

咱们须要将代码看做是咱们工做的一个暂存:

…有时在面对更重要的事情时,咱们被引导到盲目崇拜代码。咱们常常会处于这样的幻象中:在移交产品时最有价值的东西是代码,实际上这多是对问题域的理解、设计难题的进展甚至是客户反馈。

Dan Grover

迭代开发教会了咱们经过实验来验证咱们工做的结果 —— 咱们是否已解决了这个问题,若是没有,咱们学到了什么,咱们该如何改进?咱们正在构建的软件永远不会完成。即便设计和代码是正确的,它们可能也只是在一段时间内是正确的,直到环境要求其再次改动或被替换为更好的东西。

咱们须要编写好的代码:可理解、正确、安全和可靠的代码。咱们须要重构和审查它,并写出好的有用的测试用例,直到其中的一些代码(也多是所有),可能会很快被抛弃,或者可能永远不会被再次看到,或根本不会使用了。咱们须要认识到,咱们的一些工做必然会被浪费掉,并要为此进行优化。作那些必须作的,不作无用功。不要浪费时间尝试编写完美的代码。

相关文章
相关标签/搜索