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

news2024/11/28 8:32:59

  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领域摸爬滚打多年的工程师,我深有体会地认识到过早优化是软件开发中的一大陷阱。在软件开发的初期,我们可能会过于关注代码的性能问题,而忽略了代码的可读性、可维护性和可扩展性。这种做法可能会导致代码的复杂性增加,降低代码的可读性和可维护性,甚至可能会浪费大量的开发时间和资源。

  在软件开发过程中,我们应该避免过早优化,而是优先考虑代码的可读性、可维护性和可扩展性。当需要进行性能优化时,应该在代码的基础上进行优化,通过分析性能瓶颈、优化算法和数据结构等方法来提高代码的性能和效率。同时,我们也应该意识到,性能优化并不是软件开发的唯一目标,我们还应该注重代码的可读性、可维护性和可扩展性,以便保证代码的质量和可靠性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开启数字新时代,5G-Advanced加速带入现实!

在过去的这些年里,我们亲眼见证了5G的崛起。据GSMA&GSA统计,截至2022年12月,全球共部署了超过240张5G商用网络,5G用户超过10亿。在韩国、瑞士、芬兰等地,5G用户渗透率已超过30%。中国的5G网络建设更是独领风骚。截…

形式语言与自动机总结---上下文无关文法(CFG)

第5章上下文无关文法: 设计文法: 做题的时候发现了一个正则表达式到文法的算法 R规则 根据正则式推导右线性文法_右线性文法表达ab*_Pluto 的博客-CSDN博客 举例 设计文法的关键在于理解递归性,文法是一个迭代器 1.The set {| i ≠ j or j ≠ k}, that is, the set of st…

AIGC时代,分享11款超实用AI生成内容检测工具

前往未来百科查看全部AI内容检测工具箱 一、AI 内容检测器 在数字内容创作的世界中,高质量的内容对至关重要。但随着创建的内容量不断增加,确保内容是原创的、高质量的非常具有挑战性。 AI 内容检测器指的是一种利用人工智能技术来自动化审核和识别不当…

进程优先级

目录: 1.进程优先级的概念 2.查看进程优先级的方案 3.linux当中进程的优先级共有40个级别 4.对于进程的其它概念 ---------------------------------------------------------------------------------------------------------------------- 1.进程优先级的概念 为…

Talk预告 | ICLR‘23 斯坦福大学计算机系博士后吴泰霖:学习可控的自适应多分辨率物理仿真

本期为TechBeat人工智能社区第478期线上Talk! 北京时间3月8日(周三)20:00,斯坦福大学计算机系博士后——吴泰霖的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “学习可控的自适应多分辨率物理仿真”,届时将分…

灌区泵站及闸门控制自动化系统

根据灌区泵站及闸门控制现状,利用智能终端与互联网相结合方法,实施取水、输水、供水、灌溉、排水、防洪和水资源管理等自动控制系统,实现骨干渠道灌排闸门现场及远程自动控制和远程监测监视,达到计划配水、精准灌溉,高…

AJAX起步入门——介绍和使用

Ajax起步入门——介绍和使用基本用例场景复现核心干货AJAX简介ajax是什么?ajax工作原理ajax是基于现有的Internet标准AJAX实例实例演示实例代码ajax实例解析场景复现 最近学习与前端相关的小程序时,接触了异步请求api的封装和实现,涉及到了很…

多线程并发编程笔记07(小滴课堂)容器

同步容器 我们写这样一段代码。 我们想对vector容器在遍历时,去根据条件删除: 会出现异常。 那正确的方式应该如何去写呢,这里就涉及到了迭代器: 单线程中我们是这么做的。 那么多线程中呢? 有的时候它会报这个错误…

ChatGPT最强对手Claude使用教程

Cladue最近很火,作为ChatGPT4的平替版,它无需付费,使用方便,很多网友通过效果对比,发现它的性能要好于ChatGPT3.5,可以媲美ChatGPT4。最主要是使用很方便,十分钟就可以轻松部署,下面…

MongoDB初认识

MongoDB初认识 文章目录MongoDB初认识0. 写在前面1. MongoDB是什么2. MongoDB的优缺点3. 基础概念解析4. 安装4.1 下载地址4.2 安装MongoDB4.3 pgrep使用4.4 进入 shell 交互页面0. 写在前面 Linux版本:CentOS7.5 MongoDB版本:MongoDB-5.0.2&#xff08…

asp.net博客管理系统统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net博客管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 。 二、功能介绍 普通的用户是 123 密…

国产化ChatGPT来袭,景联文科技提供专业数据采集标注服务,人手一个专属ChatGPT或成为可能

ChatGPT作为一个颠覆性的创新,现已成为火爆全球的智能应用。 自ChatGPT爆火以来,国内科技圈开始频频发力,多家科技和互联网公司纷纷表示将开发出中国本土化的ChatGPT。 以百度为例,3月16日,百度推出新一代知识增强大语…

Doris数据模型

Doris支持三种数据模型,分别是: Aggregate Model(聚合模型) Unique Model(唯一模型) Duplicate Model(冗余模型) Aggregate Model(聚合模型) key相同的数…

影子账户——权限维持

文章目录定义创建定义 拥有管理员权限,但除了注册表外均查不到的账户。 创建 1、以管理员身份打开命令提示符 2、创建隐藏用户 3、将隐藏用户添加到管理员组 查看一下,没有显示匿名用户 4、查看《本地用户和组》,我是家庭版Windows&#x…

MySQL的学习

文章目录一、MySQL 插入数据二、MySQL 查询数据三、MySQL WHERE 子句四、MySQL UPDATE 更新五、MySQL DELETE 语句总结一、MySQL 插入数据 MySQL 表中使用 INSERT INTO SQL语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚…

Linux学习笔记——网络基础一

文章目录计算机网络发展过程独立模式网络互联局域网LAN广域网WAN计算机网络协议的概念网络协议协议分层OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程数据包封装和分用各层间通信IP地址MAC地址计算机网络发展过程 独立模式 计算机之间相互独立; 网络互联 多台计算机连…

rc.local脚本延时启动

rc.local脚本延时启动1、问题描述2、解决方法3、rc.local脚本依赖关系的处理3.1、对脚本进行分类,分别设置延时启动策略4、测试重启rc-local.service5、rc.local脚本执行特点5.1、rc.local脚本在操作系统启动时只执行一次。5.2、在rc.local脚本中执行程序时是没有环…

人工智能专题-知识表示

文章目录人工智能专题-知识表示大纲2.1 知识表示的概念2.1.1 知识表示观点2.1.2 知识表示的要求2.2 一阶谓词逻辑表示法2.2.1 一阶谓词概念2.2.2 谓词逻辑表示方法2.3 产生式表示法2.4 语义网络表示法2.5 框架表示法人工智能专题-知识表示 大纲 大纲:掌握知识表示方…

jenkins——环境变量、节点配置以及节点环境变量的使用

这里写目录标题一、Jenkins 环境变量1、环境变量分类a、系统内置环境变量b、用户自定义环境变量2、环境变量的使用3、控制台输出二、Jenkins 节点配置1、Jenkins的常用节点2、准备工作3、SSH类节点配置4、Java web节点配置5、Java web节点配置详细步骤三、Jenkins 节点环境变量…

“三箭齐发”,诸葛智能三大产品全新升级,助力企业迈向数字化经营 | 爱分析调研

调研:文鸿伟 撰写:文鸿伟 诸葛智能,是容联云旗下敏捷开放的场景化数据智能服务商,累积服务全国1000企业,覆盖泛互联网、泛电商、金融、汽车、产业科技、企服等数十个垂直领域。 自2015年成立至今,诸葛智…