如何在软件开发中实现速度和质量的平衡

乙醇 创建于 9 months 之前

最后更新: 9 months 之前

阅读数: 619

软件开发的节奏和期望在最近的时期急剧升级

软件开发的节奏和期望在最近的时期急剧升级。以前,团队会提前几个月规划大多数软件产品的交付周期。瀑布式开发方法是开发软件的主流方法,并且许多组织在不同行业广泛采用了这种方法。例如,Microsoft Windows操作系统的开发在上市之前需要数年时间。即使是以服务包形式的增量更新也需要数年才能发布。

在当今快节奏的环境中,任何花费数月或数年时间向客户交付新功能的组织都将被抛在后头。构建和部署软件的方法发生了巨大变化,大多数公司采用了快速开发周期以保持竞争力。回到上面提到的例子,Microsoft近期的Windows版本转向滚动更新,而不是等待多年才发布新功能。这一举措使得公司能够定期和频繁地推出变化,而不是让消费者等待数年。

这种尽快构建和频繁交付的加速周期对于消费者来说非常有利,他们可以在应用程序的主要版本之间没有长时间等待的情况下获得最新和最好的软件。然而,产品开发团队面临的压力可能导致他们采取捷径和省略步骤。在许多情况下,由于高要求导致的质量和稳定性的牺牲会导致产品存在错误,从而使客户不愿使用。

初创公司和小公司最容易受到快速交付的负担和困扰。在这种环境下,这是一种必要的恶。当你在一个小团队中努力工作,希望将新的创新产品推向世界时,你需要频繁迭代你的产品,将其塑造成能够使你的业务生存下去的东西。通常,这意味着更加强调快速发布周期,为初创公司留下更少的时间和资源进行测试。较大的公司通常有更多的时间和资金用于质量,但以延长的开发和部署周期为代价。

大多数组织认为他们可以通过速度或质量来应对,但这种策略只能在短期内起作用。对于初创公司来说,快速交付周期可以帮助他们更快地迭代和修复错误,但随着时间的推移,所有这些捷径将累积成巨大的技术债务,使开发变得更加缓慢和困难。较大的组织将建立稳定软件交付的流程,但缓慢的交付速度将使竞争对手超越他们。软件团队需要同时具备速度和质量,才能应对现代软件时代客户的高要求。

软件开发中速度的重要性

正如本文已经指出的,速度对于保持软件开发的长期业务计划至关重要。在争夺消费者有限的注意力方面,竞争异常激烈,对许多组织来说,以较慢的速度工作以确保准确性已经不再可接受。未能迅速工作和适应将不可避免地面临挑战。应用程序中过时的功能可能导致客户转投其他地方,这导致消费者和市场份额的损失,最终不可避免地以失败告终。

多年来,我们见证了无数组织因无法跟上技术进步或对其不感兴趣而失败。例如,在90年代和2000年代初,诺基亚是手机的代名词。但是当苹果推出iPhone并且谷歌随后推出Android时,诺基亚选择坚持其现有软件平台,而不是加入消费者想要的更现代和先进的移动生态系统。该公司在接下来的几年中迅速失去了超过90%的市值,再也没有恢复其在该市场细分中的地位。

然而,快速前进也带来一些风险。过快发展的其中一个更危险的风险是花费数月或数年时间来构建人们不需要的东西。大多数初创公司无法生存,因为他们的创始人无法找到产品与市场的契合点,使他们的软件可持续发展。大型组织在新产品方面也面临这个问题,比如谷歌。该公司在2013年推出了Google Glass,虽然许多人对该设备着迷,但谷歌未能弄清楚为什么大多数人愿意为该产品支付1500美元。该公司也没有花时间考虑隐私和安全问题,试图快速进入市场。结果,该产品成为谷歌最引人注目的失败之一。

急于上市的最明显风险是可能导致产品发布时尚未完全完成。我们经常在软件和硬件产品中看到这种情况。例如,苹果在2012年发布了苹果地图,试图替代其设备上的谷歌地图服务。然而,该产品显然还没有准备好,存在大量错误、不准确的导航和缺失的数据。另一个例子是微软因其发布的Windows Vista而受到严厉批评,该系统运行缓慢且不稳定,许多项目开发人员将这些问题归咎于匆忙的发布计划。

为了解决这些问题,组织通常需要暂停一下,审视他们如何处理产品质量的问题。

软件开发中质量的重要性

软件质量是软件开发生命周期中非常重要但常常被忽视的部分。每个人都希望产品具有最高的质量,但很少有人在追求速度时给予足够的重视。许多开发团队对测试和质量保证流程口头上多有讲究,但没有采取实际行动。在某些团队中,尤其是在“快速打破事物”的时代,有时会将质量视为快速开发的直接相反,但这与事实相去甚远。

本文前面提到的一些例子讨论了为什么质量至关重要。当您加快应用程序的开发并忽略质量问题以便更快地推出产品时,随之而来的问题将不可避免地导致系统故障、安全漏洞和对您品牌的信任不足。我们经常看到新闻中的许多组织由于质量差而遇到困难和危机,从初创公司到科技巨头都有。

专注于质量并不是解决这些问题的万能解决方案。事实上,过于专注于某一方面可能对开发过程产生不利影响。除了导致发布计划放慢并且远远超过截止日期之外,过于严格的质量保证政策还可能导致团队士气下降。我曾在一家初创公司工作过,他们将质量保证团队设为我们是否能够发布网页应用程序更新的门槛。他们的标准相对较高,即使是小问题也完全阻止了部署。开发和质量保证之间的来回反复随着每次进度滑坡而变得紧张。开发人员和测试人员都没有在公司呆很长时间,员工流动是该初创公司不存在的原因之一。

在某些行业中,质量是绝对必要的。您不希望使用实验室没有经过彻底测试的心脏起搏器,也不希望使用没有经过安全专家审计的互联网银行。但在软件行业中,现实情况是,大多数开发人员正在构建的是没有任何巨大影响的网络或移动应用程序,即使产品不像预期那样始终正常工作。您可能会因为偶尔的小错误或可用性问题而冒失去客户的风险,但我们很少遇到在软件中会产生不利现实影响的问题。大多数时候,它们只是小小的烦恼,不会导致客户大批离开。

作为软件开发人员和测试人员,我们不希望放慢速度或发布有错误的软件。我们需要学会如何正确平衡速度和质量。

在软件开发中平衡速度和质量

过快进行开发和测试会导致质量问题,但过于关注质量可能会拖慢整个过程。关键是根据项目当前的状态找到合适的速度和质量平衡点。当然,安全地进行快速迭代测试和部署应用程序并不容易,但通过投入时间和精力是可以实现的。

以下是您可以在组织中实施的五种策略,有助于在所有应用程序中实现速度和质量的正确平衡。

1)自动化测试 大多数软件团队都有测试流程,但通常他们将这些流程视为次要任务,与构建功能和修复错误相比,它们的重要性不大。即使在2023年,我与许多团队合作时,他们仍然主要进行手动测试,仅在部署前进行测试,这是一个缓慢、繁琐且容易出错的过程,导致问题被忽视。自动化这些重复性任务可以显著提高效率,通过消除它们并更快地捕捉到回归问题。自动化测试并不能取代手动测试,但它确实有助于提高应用程序的速度和质量。

尽管自动化测试可以帮助开发人员和测试人员更快地完成任务,但如果团队在整个产品生命周期中没有密切关注它,它可能成为一个障碍。我曾见过一些团队夸耀他们有成千上万个自动化测试用例,但仔细检查后发现自动化并没有像他们想象的那样帮助他们。团队可能在覆盖范围上存在巨大的空白,或者他们没有测试应用程序的高商业价值部分。测试套件运行时间也很长,并且由于不稳定性而经常失败,导致他们花费更多时间修复测试套件,从而占用了宝贵的时间。关键是确保自动化测试能够很好地平衡速度和质量,以帮助团队快速交付并尽快解决问题,以防止平衡倾斜到一侧。

2)持续集成/持续部署 应用程序的自动化测试很好,但如果您或您的团队不经常运行这些测试,那么构建它们就是浪费时间。我在职业生涯中与数百名开发人员和测试人员合作的经验表明,很少有人在本地运行其应用程序的自动化测试套件。持续集成环境对于任何希望在快速交付产品时感到自信的组织来说都至关重要。一个良好构建的持续集成系统将尽早尽可能频繁地运行自动化测试,以便在问题变得更容易修复和更便宜时捕捉到潜在问题。

在设置持续集成环境以自动化测试之后,下一步是研究持续部署以自动化软件发布。"持续部署"通常指的是当代码库中有任何新更改时自动部署应用程序。这种策略并不适用于所有人,因为它需要大量的时间、精力和信任来安全地实现。但采用这种方法的团队在其流程中构建了所需的高质量,从而在竞争中获得巨大的优势。如果一个团队出于任何原因不愿意自动化其部署,他们至少应该有改进部署流程的流程,因为这将迫使速度和质量保持良好的平衡。

3)功能开关 功能开关是一种软件开发策略,允许团队在不更改底层代码的情况下设置可以打开或关闭的行为。通常,开发人员使用这种技术来构建和发布他们不希望在各个环境中广泛提供的功能,直到他们可以进一步开发和测试。这样,团队可以逐步以小规模发布功能,并在生产环境中进行测试,而不会造成系统中断。

功能开关是在应用程序中平衡速度和质量的一种绝佳方式,因为它们允许团队在发布给大众之前在内部或与部分客户测试和实施新功能。测试人员可以拥有一个界面,可以在没有开发人员介入的情况下安全地切换代码库的不同部分。缺点是太多的开关可能会导致代码库混乱,并对开关背后的功能产生潜在的混淆。然而,合理使用这种方法可以使团队收集反馈,降低风险,并快速解决问题,同时增加部署高质量解决方案的信心。

4) 金丝雀部署 许多组织通常会同时向所有用户发布新功能和功能。虽然这样可以使团队更快地部署,但可能会牺牲质量,特别是对于没有许多自动化测试或将持续集成纳入其工作流程的团队。即使有这些系统存在,由于开发、测试和部署阶段之间的差异,仍然存在出现问题的风险。开发人员可能会发现他们的应用程序在他们的计算机上运行得非常好,或者测试人员在测试环境中找不到问题,但由于微小的差异,应用程序在生产环境中出现问题。

金丝雀部署通过逐步将应用程序的部署提供给一部分用户,然后再向所有人提供,有助于减少这种风险。这个过程允许团队监控新功能的真实使用情况,并收集数据来确定变更的安全性。这些部署与特性标志略有相似之处,但工作在应用程序级别,因为流量在应用程序的旧版本和新版本之间进行划分。一切看起来都很好之后,团队可以将所有人重定向到最新版本的应用程序,并删除以前的版本。金丝雀部署需要一些前期工作,包括监控和可观察性系统,以跟踪部署后的系统行为。这些部署可能会使团队的速度变慢,因为他们必须等待完全部署任何变更。然而,确保质量所需的努力和时间最终会在未来提高速度。

5) 团队之间的合作 在开发过程中,要在质量和速度之间取得平衡,并不是所有事情都需要技术解决方案。对于希望快速而安全地发布产品的任何组织来说,跨所有参与软件开发生命周期的团队(开发人员、质量保证和运维)建立协作文化至关重要。这些团队之间的相互联系将通过消除障碍和潜在的沟通问题,从头到尾创建一个流畅高效的工作流程,从而提高速度和质量。自动化测试、持续集成/持续交付、特性标志或金丝雀部署在产品的所有团队没有达成一致的情况下并不重要。 当团队紧密合作时,他们可以确保每个人都在做正确的事情,并提出比独立工作更好的解决方案。例如,测试人员通过识别开发人员在开发过程中没有考虑到的潜在弱点和边界情况来帮助开发人员,运维团队可以更轻松地为测试人员设置测试环境。这种合作努力必然会带来改进的产品,因为它们将不同的观点和专业知识融入到讨论中。当每个人共同努力时,他们可以完成比每个人单独所能做的更多的事情。

结论

团队可以尝试本文中讨论的一些或全部想法,努力实现速度和质量的良好平衡。您的组织可以从改进自动化测试和实施持续集成开始采取小步骤。一旦您开始注意到开发和质量保证的工作速度更快且问题更少,团队可以引入功能开关和金丝鸟部署,以帮助更顺畅、更高效地发布。即使您不实施这些策略中的大部分,紧密的跨团队合作将成为整个过程中最重要的组成部分。如果没有坚实的合作,您将无法取得很大进展。

在追求工作速度和确保产品高质量之间找到适当的平衡并不容易。这需要组织内各个部门之间的大量努力和协调,包括开发、测试等等。当您努力实现这种平衡时,不要期望变化会立即发生。团队必须明白这是一个缓慢的过程,如果需要时间才能看到结果也是可以接受的。知道进展不会一夜之间发生是改善事物的第一步。通过努力采用本文提到的策略,您将更接近找到速度和质量的完美平衡点。

0