作者 | Alex Meyer

译者 | 弯月

出品 | CSDN(ID:CSDNnews)

背景介绍

企业软件的速度非常慢、耗费内存巨大,而且使用起来很痛苦,人们常常对此感到十分困惑。我也曾就职于一家大型企业软件公司,所以我希望通过本文来探讨一下这个问题。其实,这个问题在软件行业中普遍存在。

什么是臃肿的软件?

臃肿的软件指的是使用的资源大大超出了完成工作所需,比如CPU、内存、I/O以及磁盘空间等。此外,拥有过多功能的软件也可以称为臃肿,因为这些软件的使用和学习难度都很高,耗费的资源也很多。

为什么软件臃肿是一个问题?

臃肿的软件会严重影响计算机的使用体验,不仅会导致你的日常工作速度下降,而且还会耗尽笔记本电脑的电池,甚至迫使你不得不购买更强大的计算机。超高的CPU使用率会直接导致能耗增加,因为通常计算机的处理器可以在空闲时进入睡眠状态,从而节省能耗。如果某个算法非常低效,运行所需的时间加倍,那么相应的能耗也会加倍。计算机中的其他硬件也是如此。此外,一旦计算机的硬件无法满足软件的资源需求,就会变成电子垃圾。

造成软件臃肿的原因

1. 组织原因

  • 自行构建比分享更容易

企业软件的开发通常需要不同职能团队之间的合作。虽然一个团队的开发人员通常都会在同一个地点办公,或者至少在同一个市区内,但不同的团队可能位于不同的大陆。因此,团队之间的沟通比团队内部更难。开发软件的组织形式大多为自上而下,每个团队都有一个经理来控制团队的工作。所有这些特征都阻碍了软件重用以及代码共享。在许多情况下,团队内部开发仅供自己使用的功能会更加容易。如果将这类工作委托给另一个团队,那么就会带来大量的沟通/计划开销,并导致你的开发计划依赖于该团队。所以,通常人们都宁愿自己动手。但是这样一来,代码库的增长就会超出必要的范围,在大多数情况下,资源需求也是如此(因为编写的代码更多,由此引发的错误也更多)。

2. 业务发展的原因

  • 迎合市场需求

对于大多数产品而言,只有快速发布才能获取市场份额或被视为创新者。通常市场的需求重于其他任何因素,甚至是功能或质量。但这可能导致软件效率低下,因为开发人员和架构师会各种捷径,例如将现有系统粘合在一起、使用简单的算法、在内存中表示数据时采用蹩脚的形式,以及放弃优化瓶颈等。

举一个例子,如今的许多应用程序都是多平台的:它们必须在 macOS 和 Windows 等桌面操作系统上运行,还需要构建iOS/iPadOS 和 Android 上的应用,以及在网络上运行。只有大公司才有能力为每个平台配备一个专门的团队。因此,流行的替代方案是选用可支持同一个代码库在多个平台上运行的框架,例如Electron(VS Code采用了该框架)或 Progressive Web Apps(Pinterest 和推特采用了该框架)。这些框架是重量级的,需要完整的浏览器和 JavaScript 引擎才能运行,框架本身就会占用大量资源。

  • 收购

随着企业被收购,软件也需要被集成和融合。通常,集成不会重构代码或修改内部数据与算法,因此从资源消耗的角度来看,“新”产品就是各个部分之和。除了重构的成本和上市时间的压力之外,个别软件的用户也可能会受到重构的负面影响。但是对于一个粘合在一起的系统,由于数据格式转换、数据的复制或重新处理以及更高的延迟等原因,每个人都会面临资源消耗过高等问题的困扰。

  • 维护合同

通常,总会有一些客户依赖于本该删除的功能。这种依赖通常会通过合同表达出来,因此大多数公司都禁止对这样的功能进行修改。

  • 多元化的客户群

有些产品需要服务大量客户,或者是因为每个功能都有一小部分用户,这就导致软件在其生命周期内积累许多功能。这不仅会导致软件对磁盘空间需求的增加,而且还会导致软件的开发和使用成本上升。随着代码库的规模变得越来越大,错误会到处蔓延,并导致修复的难度加大。逐渐地,开发人员越来越不愿意进行重构,因为成本与收益不成比例,或者成本太高以至于管理层不会分配这些时间。此外,各个功能也需要更通用的数据结构和抽象,从而导致资源消耗进一步增加。

  • 合作伙伴集成

两个公司之间的软件相互集成是一件好事,双方不仅可以获得更多功能,而且还可以获得更多用户。不幸的是,这种集成也会导致更多的代码、更多的抽象、数据转换等,并最终导致软件进一步膨胀。从技术角度来看,这与上面提到的收购几乎是一样的。

软件开发的原因

高级语言

各个项目在选择编程语言和框架时,主要的考虑因素如下:

  • 掌握编程语言和框架的工程师数量;

  • 编程语言和框架的发展速度;

  • 与其他系统集成的难度;

  • 编写扩展的难度。

对于许多类型的软件来说,制定决策时很少会考虑代码的运行时效率。根据上述标准,得分较高的语言包括:

  • JavaScript/Web技术栈:作为唯一的客户端代码具备可移植性的编程语言,JavaScript的人气非常高,甚至还在服务器开发中占有一席之地。尽管JavaScript是一种解释型语言,但对于JIT的研究成果和广泛深入的优化使其速度完全可以满足需求。只不过,JavaScript对内存的要求依然很高。

  • Python:这是一种优秀的编程语言,可以快速帮助你完成工作,但它的速度很慢,而且内存需求相对也很大。

相比之下,Rust或C++等语言通常可以生成非常高效的软件,但开发速度明显较慢,而且能够编写出高质量软件的工程师也较少。

当然语言只是一个因素,任何语言都可能会编写出臃肿的软件。

复杂性和抽象

Donald Knuth有一句名言:“过早的优化是万恶之源。”

我更喜欢将复杂性视为万恶之源,过早的优化会引入更多的复杂性。此外,复杂性还涉及其他问题:

  • 软件必须遵守的所有技术标准(网络浏览器就是一个很好的例子);

  • 可用功能的数量;

  • 过度设计的软件具备很高的灵活性,能够支持将来的增强功能。

复杂性往往会导致软件膨胀,但有时也未必。例如,为了将特殊情况下的运行速度提高一个数量级,我们常常会添加第二种算法,这固然会增加复杂性和磁盘占用量,但可以降低CPU消耗和内存的使用,而且还可能会减少软件的膨胀。

没有时间编写更好的代码

在许多公司中,功能开发的优先级高于优化、重构或删除遗留代码。在许多情况下,从业务的角度来看,这种决策很合理,因为客户只关心功能,并不会关心硬件。然而,随着许多工作负载转移到云端,这种情况发生了变化,因为提供数据库解决方案的云提供商承担了运营成本,他们比较有兴趣降低软件的臃肿程度。

日志记录

企业软件尤其重视支持的难度。很多企业软件在客户专有的服务器上运行,你只能通过日志文件分析错误。因此,此类软件往往拥有大量记录日志的代码,激活这些代码就可以深入了解系统。有些软件的膨胀只会影响二进制文件的大小,不会影响内存消耗和运行时性能。

错误处理

企业软件必须更加健壮。想象一个持续运行数月且不能崩溃或泄漏内存的数据库服务器:它必须能够正确处理各种内存不足的情况或故障。由于需要处理所有极端的情况,因此这类软件具备很高的弹性,但代码量很大,必然会非常臃肿。与日志记录类似,良好的代码可以减少对运行时和内存消耗的影响。

可访问性与法律要求

企业软件必须满足各种法律要求,其中最重要的就是可访问性。企业软件必须具备这个功能,但这需要很多代码支持,并且通常会消耗更多的资源。开源项目通常不会处理这些需求。

解决方法

不喜欢使用臃肿的软件?幸运的是,我们总能找到其他的替代软件。

不喜欢开发臃肿的软件?软件行业的许多领域也有此类困扰:

  • 云服务后端:云服务商的利润与服务占用的资源量直接挂钩,因此云服务商非常希望降低资源消耗。由于世界各地的许多人都在使用某些服务,因此即使是很小的优化也可以大大增加利润。此外,对于云环境来说,工作负载的分析相对很容易,因此我们可以直接选择最有价值的优化。

  • 移动设备:对于这些设备来说,电池的寿命至关重要,因此我们应该尽量减少CPU的使用。

  • 嵌入式系统:这些系统很小,硬件都不够强大;或者这些系统的制造规模非常大,因此构建优化的软件,并降低硬件消耗,才能增加利润。

总结

说到底,软件膨胀的原因还是由业务需求引发的。如果软件开发免费且不需要任何时间,那么每个人都会发布最佳软件。然而,现实情况远非如此,因此各个公司必须做出取舍。实际上,做出正确的权衡非常困难,短期内看似正确的权衡从长远来看可能是有害的。例如,虽然快速发布臃肿的软件可以帮助公司抢占市场份额,但随着客户开始使用该产品,就会引发许多质量问题。但是,延迟发布产品又不利于推广。因此,大多数公司会优先考虑提前发布软件,或者发布新功能,而不是修复臃肿的问题。开源项目不受此类约束,常常可以提供很好的替代方案。

*本文由CSDN翻译,未经授权,禁止转载。

原文链接:https://www.mailbox.my/blog/posts/why-enterprise-software-is-bloated/

揭秘软件臃肿的真实原因!相关推荐

  1. 揭秘软件开发的达摩克利斯之剑

    ↑ ???? 万字长文不想看,那就听一听叭 ↑ 为什么你的程序总是出现 bug? 凭什么让改 bug 占据了你大部分的时间? 看完本文,保证你能设计出更稳定的程序,摆脱 bug 的缠绕,做项目更安心! ...

  2. 带你了解Java这么火爆的真实原因!

    这几年,中国的互联网行业进入了高速发展的阶段,同时IT行业,也成为了热门,备受追捧和关注的行业.在全球云计算和移动互联网的产业环境下,Java工程师异常火爆,受到众多人的追捧.Java工程师为何会如此 ...

  3. 原来它一直在“装嫩”|“心电图”揭秘富锂巨星真实年龄

    说到锂元素,现代人并不陌生,无论是智能手机.平板电脑,还是无人机.电动汽车,都在使用锂电池供电. >>>> 但这个现代感十足的元素其实几乎和宇宙一样古老. 锂元素是宇宙中最早产 ...

  4. 我赢资讯10分钟程序化交易决策系统,把握涨跌背后的真实原因,选择最具价值的投资方向...

    我赢资讯10分钟程序化交易决策系统,把握涨跌背后的真实原因,选择最具价值的投资方向 开创专业投资战略思维,实现创造财富梦想.运用我赢资讯软件提高投资者专业素养和掌握机构操盘技能,建立程序化交易系统框架 ...

  5. 移动信号e经常无服务器,手机信号差,从4G突然变成“E”?真实原因是这样的!...

    手机网络经常突然变成"E",网络信号很差,很多人在生活中总是会突然发现自己的网速变得突然不好了,从4G突然就变成了2G这种带"E"标志的网络,或者是自己的手机用 ...

  6. 李开复离开微软的真实原因

    2005年7月19日,正在带薪休假的44岁的微软全球副总裁李开复,闪电跳槽,火线加盟,仅用一天时间,就完成了从老牌软件巨头微软高管到互联网新霸主Google领军人物的跨越. 李开复为什么要离开微软? ...

  7. 解表化饮什么意思_为什么有人动不动就一身汗,有人再热也不出汗?中医告诉真实原因...

    为什么有人动不动就一身汗,有人再热也不出汗?中医告诉真实原因 转眼已立夏,在这个"迎夏之首,末春之垂"的时节,人们开始有了夏天的感觉. 夏天总与汗水联系在一起.在太阳下,有人身上大 ...

  8. [原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因

    [原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因 小雨 发表于 2008-3-28 13:17:00 /************* 作者:小雨(QQ群群号17639373) 声明: ...

  9. 移动信号突然变成无服务器,为什么移动4G信号突然变成H、E、G就无法上网, 背后的真实原因?...

    原标题:为什么移动4G信号突然变成H.E.G就无法上网, 背后的真实原因? 日常生活中经常会遇到这样的事,坐在车上手机信号栏刚刚还显示4G,突然变成字母H.E.G,或者4G后面多一个+,变成4G+.相 ...

最新文章

  1. 所有你要知道的 BERT 模型压缩方法,都在这里!
  2. JAX-RS客户端WebClient的使用教程
  3. DCMTK:从DICOM封装的PDF存储对象中提取PDF文件
  4. asiHttpRequst 学习地址
  5. 日志文件在VS中输出为乱码问题
  6. 6.3.4 新的_Bool类型
  7. 依赖于boodtrap3的插件推荐以及bootrap发展前景
  8. 复杂,软件的大敌![转]
  9. php curl 下载文件
  10. “海纳百川”下载器的使用方法
  11. 关于鸿蒙的网名,华为徐直军:“鸿蒙”这个名字是媒体取的
  12. Ectiture impossible,doublon dans une cle de la错误
  13. 云计算day04-Docker容器
  14. JavaWeb--RequestResponse
  15. 利达主机联网接线端子_利达主机怎么编辑中文 利达主机接线端子说明
  16. glove词向量解读
  17. 数据表的字段约束:主键、外键、唯一
  18. dedecms仿站过程,index_arcticle,article_arcticle,listarticle区别
  19. hadoop如何使用linux命令,hadoop命令_Linux使用hadoop dfs命令的方法
  20. python ocr 文字识别_python:使用 cnocr 进行文字识别

热门文章

  1. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore
  2. 厉害了!推荐一个 Web 端自动化神器 - Automa
  3. 安卓城市列表选择-CityPicker-无法编译-support
  4. Can be divided by 3?
  5. 计算机软件录音注意事项,录音笔怎么用(录音笔的使用方法及注意事项)
  6. 使用Selenium爬取豆瓣电影前100的爱情片相关信息
  7. 富士康:等夏普状况好转后,会交给日本人来管理
  8. jsp+ssm计算机毕业设计智慧农产品朔源系统【附源码】
  9. trim函数实现php,php trim函数的详细解析
  10. P1_M1_L3 Driving Decisions and Actions(驾驶决策和行为)