揭秘软件臃肿的真实原因!
作者 |Alex Meyer译者 |弯月出品 | CSDN(ID:CSDNnews)背景介绍企业软件的速度非常慢、耗费内存巨大,而且使用起来很痛苦,人们常常对此感到十分困惑。我也曾就职于一家大型企业软件公司,所以我希望通过本文来探讨一下这个问题。其实,这个问题在软件行业中普遍存在。什么是臃肿的软件?臃肿的软件指的是使用的资源大大超出了完成工作所需,比如CPU、内存、I.........
作者 | 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/
更多推荐
所有评论(0)