您是否想更快地构建软件并更频繁地发布软件,而又不想冒着对用户体验产生负面影响的风险?想象一下这样一个世界:在生产中测试和发布不仅不再那么令人恐惧,而且成为常态。这就是功能标志的世界。
功能标志允许您向不同的用户提供不同的功能,而无需维护功能分支和运行不同的二进制工件。功能标志包含您可以打开和关闭的条件语句中代码的某些部分。
功能标志有时也称为功能切换、释放切换、功能开关、功能门或条件功能。在敏捷环境中,您可以在运行时使用切换来根据需要为部分或所有用户启用或禁用指定功能。
何时使用功能特性开关
由于功能特性开关给代码库增加了一层复杂性,因此您应该确保仅在必要时使用它们。功能特性开关可能会通过两种方式使您的代码库变得复杂。首先,存在多种代码变体,增加了维护负担。其次,重叠的功能特性开关使人们更难对生产状态有信心。功能开关就像烹饪中使用糖一样:并不总是需要它,但当需要时,也不要过度。
在软件开发方面,功能开关可以改变您构建和发布代码的方式。通过将面向用户的功能和操作功能细分为可切换开关,您可以进行实验、受控部署以及非开发人员为客户打开和关闭功能的能力。
但是,在使用功能特性开关时,不要无限期地保留每个特性开关。某些功能特性开关在添加后很长时间内仍然有用,而其他功能特性开关在整个用户群获得相应功能后就会失去其实用性。
使用场景
由于功能特性开关非常强大,因此您可以通过多种方式使用它们,具体取决于您的业务目标和开发环境。更广泛地说,当尝试缩短生产时间、缓慢推出新功能以及在功能完成之前发布功能时,功能特性开关在软件交付中非常有用:
- 使用功能特性开关使生产发布很简单。对所有用户(开发人员和质量保证 (QA) 团队除外)关闭功能,以便在用户尝试之前进行改进。
- 通过为某些用户而不是其他用户启用某项功能来执行 A/B 测试。您可以根据您选择的属性以及它们是否对用户体验产生负面影响,从特定用户群体中获取反馈。
- 即使某个功能尚未完成,也可以将其部署在开关后面。由于新功能适用于任何重大重构,因此您不必担心长期存在的分支随着时间的推移而变得难以合并。
其他用例包括代码管理、基于百分比的部署、测试版和回滚。
什么是可观测性?
可观测性作为一个概念,是指能够提出有关系统状态的任何新问题,并根据提供上下文的丰富数据接收信息。可观测系统的问题数量应该是无限的,使工程师能够在调查和首次展示其复杂的分布式系统时进行迭代。可观测性工程是收集有关程序执行、模块内部状态以及所有组件之间通信的数据的能力。为了通过在可观测性发现和理解服务中的问题,软件工程师使用 Honeycomb 等可观察性平台在一个地方分析所有系统遥测数据,例如日志、指标和链路追踪。
与监控不同的是,监控仅向您显示随机中断正在发生(已知),可观测性可以帮助您找出发生的原因(未知)以及它影响的对象。在监控过程中,您可以根据系统知识设置警报,但可能无法告诉您问题出在哪里。在可观察性中,您可以实时检查整个系统和用户体验,以发现异常情况并在某些事情降低用户体验之前回答为什么会发生这种情况。可观测性工程可让您提出数据问题、可视化异常并寻找潜在线索。数据会告诉您去哪里寻找以及询问什么。
监控无法处理“以前从未见过的”情况,因为它设置为仅针对已知问题发出警报。这对于可预测的整体系统来说非常有用,但正如所指出的,这对于现代环境来说并不是现实。同时,可观测的系统可以让您探索事件期间发生的任何事情(甚至只是出于好奇)。监控就像警察发现已知的犯罪行为,而可观察性就像侦探追踪丢失的金钱线索。
使用可观测性的团队可以比仅依赖监控的团队更快地发现和修复事件,从而节省组织的时间、资源和声誉。此外,团队可以致力于开发新功能或提高可靠性等更高价值的项目,而不是仔细研究日志来解决问题(这可能需要几个小时!)。可观测性工程提取所有有助于解决中断问题的相关信息,收集来自不同系统的数据并管理大量要处理的信息。最重要的是,将分布式跟踪作为可观测性工程工作一部分的开发人员可以直观地看到其编码的具体好处,利用丰富的数据进行更高效的应用程序开发。
特性开关与可观察性相结合的好处
功能特性开关和可观察性可以很好地协同工作以实现渐进式交付。前者可让您分段流量,后者可让您可视化主机之间的差异。通过渐进式交付,您可以将部署与发布分离,快速验证代码并进行迭代试验。渐进式交付可让您在广泛发布新更改之前了解它们是否对用户有利。您可以部署到一定比例的用户、环境和主机。一旦您对生产结果感到满意,您就可以广泛扩展该功能。
如何使用功能特性开关
您可以通过多种方式使用功能特性开关,以提高生产力、降低风险、测试错误、A/B 测试更改、向潜在客户展示演示、在测试版程序中提供新功能、向受众定位功能等等。
更高的生产力,更低的风险
功能特性开关可让您提供更多功能,同时降低风险。将不同版本的代码包装在可以打开和关闭的条件语句中,可以让您在更少的压力下更高效地工作。
持续部署与持续交付
您可以使用功能特性开关不断地将新代码交付到生产环境,但仅在用户准备好时才将新功能交付给用户,反之亦然。通过将生产部署与用户基础部署分离,可以最大限度地降低风险。
生产中测试
功能特性开关可让您在生产中测试新功能,同时降低发布不良的风险。对真实的用户进行测试可以更准确地描绘版本的行为。您可以与用户一起验证新功能的功能并收集反馈,而不是尝试在测试环境中模拟生产环境。您还可以深入了解更改如何影响代码的性能。
A/B 测试
当使用 A/B 测试来比较功能的替代版本时,功能标志是理想的选择。如果您想在用户群上试验和尝试不同的版本,功能标志可以让您通过翻转开关来收集和观察使用数据来实现这一点。完全翻转开关,为所有用户启用获胜选项。
基于百分比的推出
功能标志允许您选择少量用户通过基于百分比的部署来测试新功能或新设计。您可以在观察用户在更改下的行为时增加或减少百分比。一旦更改稳定并且用户反馈积极,您就可以扩展到 100%。
测试版发布
功能特性开关可让您在一组用户上测试新功能,以了解其性能并仅从该组中收集反馈。如果您观察到高质量的结果,您可以将其推广给更广泛的受众。如果不符合预期,您就不会向整个用户群推出它,从而限制了风险,并且您可以为较小的受众回滚它。这对于确定新功能是否对用户群产生了预期的影响或捕获任何潜移默化的后期错误非常有用。
回滚
您可以使用功能特性开关作为终止开关。如果您需要禁用新功能,则无需重新部署或推送任何代码。启用或禁用新功能就像编辑配置文件一样简单。如果新功能导致崩溃或者您发现错误,您可以使用其功能标志立即将其回滚,而无需触及源代码。如果您的代码位于不受您完全控制的地方,例如公共云或应用程序商店,您可以发布或回滚新功能,而无需部署代码或获得批准。此外,您还可以拥有“精简”或“保护”功能标志,在高需求期间关闭开关。
灵活的代码管理
即使您不是开发人员,您也可以利用功能特性开关来禁用某项功能。如果生产环境中出现问题,您可以根据情况打开或关闭功能标志,而无需要求开发人员更改代码并完成代码审查过程。团队中任何了解功能标志的人都可以立即解决错误、中断和其他问题。
谁使用功能特性开关?
如上所述,功能特性开关不仅仅适用于工程团队。是的,开发人员设置了功能特性开关,并且是其使用的最大受益者。然而,其他利益相关者也将从中受益,包括产品、销售、客户支持、运营和管理。功能标志确保工程不是帮助客户的团队的瓶颈:
- 产品经理和 QA 团队可以使用功能标志来管理部署并根据需要打开和关闭功能。
- DevOps 团队可以使用功能标志来帮助产品经理更好地控制版本、协调启动时间并创建反馈循环。
- 销售和支持团队可以使用功能特性开关来管理客户未完成的功能或新功能。
- 操作员可以使用功能标志来快速对问题做出反应,例如通过禁用工作不一致或导致崩溃的代码。
- 管理层可以使用功能标志来了解开发中发生的情况,检查用户如何测试新功能,或者创建和实施治理和标准化。
当公司的其他部门使用功能标志时,他们不必浪费开发人员的时间来完成工作。这使得开发人员可以从事更有趣的工作,例如发布新功能。
功能特性开关最佳实践
有多种方法可以实现功能特性开关。遵循这些最佳实践将帮助您避免未来的麻烦:
控制对功能特性开关的访问
设置日志记录,以便您可以跟踪谁进行了哪些更改。这种透明度有助于减少产品和工程团队之间的依赖性。
使用标准化的命名方案
设置命名约定,使标志的类型明确(发布、实验、许可、杀死等),以免创建名称相同或相似的标志。您不希望有人因为名字被误解而切换错误的特性开关。无论您使用功能特性开关管理工具、配置文件还是数据库表,每个使用功能特性的人都应该能够根据给定特性的名称了解其功能。
以不同的方式管理不同的特性
为您的旗帜建立管理系统。旗帜并非生而平等。您应该根据每个标准的用途、重要性以及使用者来维护它们。
使特性设置可见
设置一个系统来检查特定用户具有哪些功能特性设置。将此信息存储在数据库和分析系统的用户配置文件中。这些在稍后解决问题和理解 A/B 测试时会很有用。
避免特性之间的依赖关系
将每个特性设置为具有独立于任何其他特性的用途。您不希望特性相互依赖或与其他特性发生冲突。具有依赖关系的特性不仅会让团队感到困惑,还会导致难以调试的用户问题。
清理你的特性
设置一个系统来定期(例如每月或每季度)删除您不再使用的功能特性。有些特性在产品的整个生命周期内都是有用的。其他的是临时的,您需要删除它们以避免技术债务。通常称为特性债务,当您的代码中充斥着无用的特性时,就会发生这种类型的技术债务。如果您使用标准化命名方案或可以帮助您确定特性是否仍在使用的服务,则特性清理应该很简单。
如何实现功能特性开关
您可以使用定义特性开关的管理服务、计算特性值的运行时查询或 if/else 结构来实现功能特性。
最简单的开始方法是在代码中使用 if/else 语句。要获得更强大的解决方案,请利用适合您首选编程语言的开源项目和库。如果您需要比布尔值更复杂的逻辑语句,请使用功能特性管理工具。
要弄清楚什么对您的团队有效,请考虑您要解决的痛点。您的用例仅适用于开发人员还是适用于整个公司?您愿意构建还是购买功能标记管理系统?
由于功能标志有不同类型,因此没有一种通用的方法来实现标志。也就是说,你应该:
- 将新功能隐藏在功能特性后面,以便您可以持续推送代码。
- 根据用户的设备类型、位置和其他属性(例如他们是否属于 Beta 测试组)对这些功能的用户进行细分。
- 确定哪些用户以及其中的百分比将在给定功能准备就绪后获得该功能。
- 将其展开并观察其性能。
- 如果出现问题,请关闭该特性。
- 如果一切都是阳光和玫瑰,请增加到更大的百分比,直到向 100% 的用户推出该功能。
- 仅当您仍然需要时才保留该特性 - 确保在特性清理时将其移除。
回顾功能标志和可观测性的好处
功能特性和可观测性一起工作,让您更快、更安全地构建代码。实施这两者可以更好地控制发布、回滚以及其间的一切。当出现不可避免的错误时,使用功能标志来采取行动,并使用可观测性来找出发生了什么。