Donald Knuth(高德纳)是一位计算机科学界的闻名学者和计算机程序规划的前驱之一。他被誉为计算机科学的“圣经”《计算机程序规划艺术》的作者,提出了闻名的“大O符号”来描绘算法的时刻杂乱度和空间杂乱度,开发了TeX系统用于排版科技文献,获得过图灵奖、冯诺伊曼奖、美国国家科学奖章等多项荣誉。今日要说的就是他所提出的一条软件规划重要原则 Premature optimization is the root of all evil 过早优化是万恶之源

为什么说过早优化是万恶之源?

为什么说“过早优化是万恶之源”? 我认为过早优化代码会让人陷入到过错的方针中去,然后忽视掉了最重要的方针。举个很简略的例子,你需求快速构建一个产品来抢占用户,你当下最重要的方针是让这个产品快速上线,而不是把这个产品打造的好用(在我国互联网下,这样的事数不胜数),假如你只重视到后者体会、功能问题而忽视了速度,在当下高度竞赛的市场之下,你根本毫无时机。

  当然上面这个例子是从理性的层面说的,对许多程序猿来说也或许触及不到产品层面的内容。咱们从软件规划的层面,理性的来说,过早优化或许会导致以下的一些问题:

  1. 添加代码的杂乱性:过度优化或许会导致代码的杂乱性添加,然后下降代码的可读性和可维护性。假如代码过于杂乱,或许会导致开发人员难以了解和维护代码,然后添加开发本钱和时刻。

  2. 消耗开发时刻和资源:过度优化或许会导致开发人员花费很多时刻和资源在代码的功能优化上,而忽略了其他重要的开发任务。这或许会导致项目进展延误和开发本钱添加。

  3. 下降代码的可移植性:过度优化或许会导致代码的可移植性下降。假如代码过于依赖于特定的硬件或操作系统,或许会导致代码无法在其他环境中运行。

  4. 下降代码的可扩展性:过度优化或许会下降代码的可扩展性。假如代码过于依赖于特定的算法或数据结构,或许会导致代码无法习惯未来的需求改变。

过早优化的典型案例

  在软件工程史上因为过度重视软件功能导致项目终究失利的案例举目皆是,比如我下面要说的一些项目,在软件工程史上都是十分闻名的项目(当然或许有些新生代程序员已经不知道了)。

  1. IBM OS/360操作系统:在20世纪60年代,IBM公司开发了OS/360操作系统,这是其时最大的软件工程项目之一。在开发过程中,IBM公司过于重视代码的功能问题,导致代码的杂乱性添加,开发时刻延误,终究导致项目的失利。我知晓这个项目还是在我最近在阅览的一本软件工程经典书籍《人月神话》中,也引荐咱们阅览下,这个项目尽管终究失利了,但也给整个软件工程领域留下了宝贵的经历。

  2. Netscape Navigator浏览器:在20世纪90年代,Netscape公司开发了Navigator浏览器,这是其时最盛行的浏览器之一。在开发过程中,Netscape公司过于重视代码的功能问题,导致代码的杂乱性添加,开发时刻延误,终究导致浏览器市场份额严重下降。

  3. Windows Vista操作系统:在21世纪初,微软公司开发了Windows Vista操作系统,这是其时最大的软件工程项目之一。在开发过程中,微软公司过于重视代码的功能问题,导致代码的杂乱性添加,开发时刻延误,终究导致操作系统的用户体会欠安,市场反应欠安。话说这个操作系统我还用过呢,用户界面还是很漂亮的,许多UI规划也被沿袭到了Window7中。

如何辨认过早优化

  在软件开发过程中,如何判别是否过早优化呢?这里有一些概括性的判别规范,能够简略参考下:

  1. 是否存在功能问题:假如代码还没有功能问题,那么过早优化就是不必要的。因此,在进行优化之前,应该先测验代码的功能,确认是否存在功能问题。

  2. 是否优化了未来或许发生的问题:假如优化的是未来或许发生的问题,而不是当时存在的问题,那么就或许是过早优化。在进行优化之前,应该优先考虑当时存在的问题,而不是未来或许发生的问题。

  3. 是否牺牲了代码的可读性和可维护性:假如优化代码会导致代码的杂乱性添加,下降代码的可读性和可维护性,那么就或许是过早优化。在进行优化之前,应该优先考虑代码的可读性、可维护性和可扩展性。

  4. 是否糟蹋了很多的开发时刻和资源:假如优化代码会糟蹋很多的开发时刻和资源,而不是进步代码的功能和效率,那么就或许是过早优化。在进行优化之前,应该评价优化的本钱和收益,确认是否值得进行优化。

  判别是否过早优化需求根据具体情况进行评价。在进行优化之前,应该先测验代码的功能,确认是否存在功能问题。同时,也应该优先考虑代码的可读性、可维护性和可扩展性,防止过度优化。

总结

  作为一名在IT领域摸爬滚打多年的工程师,我深有体会地认识到过早优化是软件开发中的一大陷阱。在软件开发的初期,咱们或许会过于重视代码的功能问题,而忽略了代码的可读性、可维护性和可扩展性。这种做法或许会导致代码的杂乱性添加,下降代码的可读性和可维护性,乃至或许会糟蹋很多的开发时刻和资源。

  在软件开发过程中,咱们应该防止过早优化,而是优先考虑代码的可读性、可维护性和可扩展性。当需求进行功能优化时,应该在代码的基础上进行优化,经过剖析功能瓶颈、优化算法和数据结构等方法来进步代码的功能和效率。同时,咱们也应该意识到,功能优化并不是软件开发的仅有方针,咱们还应该重视代码的可读性、可维护性和可扩展性,以便保证代码的质量和可靠性