特性切换

特性切换或称功能切换,英语:feature toggle[1]feature switchfeature flagfeature flipperconditional feature等。它是软件开发中的一种技术,是替代维护多个源代码分支(也称特性分支)的一种方案,这使特性在完成并正式发布前也可以得到测试。特性切换是在运行期间隐藏、启用或禁用特定功能。例如在开发过程中,开发人员可以启用功能以进行测试,而其他用户不会被启用该功能和受到它的影响。[2]

持续发布和持续交付为开发人员提供了有关其代码的快速反馈,而这要求尽早地集成其代码更改。特性分支为此过程引入了一个旁路。[3]特性切换是实现持续交付的一项重要技术。

这种技术使开发人员得以发布包含未完成功能的产品版本。这些未完成的功能被隐藏或被禁用,因此不会出现在用户界面中。这使软件可以发布很多次小的增量版本,而无需承担不断分支与合并的成本。特性切换使软件集成的周期得以更短。[4]项目团队可以使用特性切换来加速开发过程,因为产品中可以包含默认不启用的未完成代码。

实现

特征切换在本质上是条件语句中使用的变量。因此,这些条件语句中的块可以根据特征切换的值切换为开或关。切换为关的代码块类似于被注释的代码。这是开发人员可以绕过它们软件中的某些流程,例如尚未准备好部署的功能。

功能切换的主要用途是避免在发布前的最后一刻因软件合并而产生的冲突。尽管这可能导致切换负债。切换负债是指一个功能已被永久关闭后,软件中仍存留着死亡的代码,并可能带来一些开销。这种代码必须被仔细甄别才能删除,以免干扰到其他代码。

功能切换主要有两种类型。一种是开发人员在产品发布之前决定保留或删除的发布切换(取决于其效果)。另一种是业务切换,它相较于旧的代码是满足不同的用法。

特性切换可用于以下情况:

  1. 将一个新功能添加到应用程序。
  2. 增强应用程序中的现有功能。
  3. 隐藏或禁用某项功能。
  4. 扩展一个接口。

特性切换可以存储在:

  1. 数据库中。
  2. 配置文件中。

功能组

功能组由一组可切换的互相配合的功能组成。这使开发人员可以轻松管理一系列相关的切换开关。[5]

灰度发布

特性标志的另一个好处是灰度(Canary)发布。灰度发布(或Canary启动或Canary部署)允许开发人员逐步为一小群用户测试某项功能。如果功能的性能不令人满意,则可以回滚它,没有任何不利影响。[6]

虽然在大多数编程语言(例如Java[7][8]、Angular JS[9]、PHP[10]、JavaScript[11]等)中可以轻松实现这种模式,也存在一些函式库[12]来进一步简化这种用法。

马丁·福勒指出,功能切换应该是你将功能投入生产时的最后一种选择。取而代之,最好将功能分解成更小的部分,将每个部分安全地实现来引入到产品发布,从而避免导致问题。

许多大型网站都使用特性切换技术,包括Flickr[13]、Disqus[14]、Etsy[15]、reddit[16]、Gmail[17]和Netflix。[18]

有许多适用于各种编程语言和平台的开源的特性切换和特性标记解决方案。

参见

参考资料

  1. ^ Martin Fowler 29 October 2010. FeatureToggle. Martinfowler.com. 2010-10-29 [2013-09-27]. (原始内容存档于2021-03-23). 
  2. ^ ALM Rangers - Software Development with Feature Toggles. msdn.microsoft.com. [2017-05-23]. (原始内容存档于2017-09-01). 
  3. ^ Feature Flags for Mobile Apps - Apptimize. apptimize.com. [9 January 2017]. (原始内容存档于2016-09-18). 
  4. ^ Programming JavaScript Applications. [2016-09-15]. (原始内容存档于2016-09-15). 
  5. ^ Elliot, Eric. Programming JavaScript Applications. O'Reilly Media. 2014. 
  6. ^ Canary launches – how and why to canary release. launchdarkly.com. 7 April 2015 [9 January 2017]. (原始内容存档于2016-09-17). 
  7. ^ Home - Feature Flipping 4 JAVA. [2016-09-15]. (原始内容存档于2020-12-04). 
  8. ^ Togglz - Features flag for Java. [2016-09-15]. (原始内容存档于2021-01-20). 
  9. ^ mjt01/angular-feature-flags. [2016-09-15]. 
  10. ^ A new feature toggling library for PHP | labs @ Qandidate.com. [2016-09-15]. (原始内容存档于2020-11-12). 
  11. ^ Programming JavaScript Applications. [2016-09-15]. (原始内容存档于2016-09-15). 
  12. ^ One of many feature toggle framework list: http://www.beautifulbuilds.com/feature-toggle-frameworks-list/页面存档备份,存于互联网档案馆
  13. ^ Harmes, Ross. Flipping Out - code.flickr.com. flickr.net. [9 January 2017]. (原始内容存档于2016-12-03). 
  14. ^ 存档副本. [2013-10-10]. (原始内容存档于2013-11-05). 
  15. ^ How does Etsy manage development and operations?. codeascraft.com. 4 February 2011 [9 January 2017]. (原始内容存档于2021-01-22). 
  16. ^ reddit/reddit. github.com. [9 January 2017]. 
  17. ^ Developing Gmail’s new look. googleblog.com. [9 January 2017]. (原始内容存档于2020-11-11). 
  18. ^ Preparing the Netflix API for Deployment. netflix.com. [9 January 2017]. (原始内容存档于2017-04-28).