互联网数据分析的重要术语

这篇文章非常全面地对在快速迭代中的互联网产品开发及试验测试中的一些术语做了梳理和解释, 对于任何DevOps或连续交付团队来说这些知识都很重要。

互联网数据分析的重要术语

一、冒烟测试(Smoke Testing)

冒烟测试是回归测试中的一种测试方法,它能确保您最重要、最关键的功能流能够工作。这些测试不应该包含整个测试套,而应该是覆盖最高优先级用户流的测试子集。这些测试通常是指在阻塞的build pipeline中执行的端到端测试。这意味着如果其中任何一个测试在pullrequest中失败,它将阻止pull request的合并。冒烟测试的这个阻塞非常重要,因为如果你想push的代码打破了一个关键流程,那么在需求变更后需要重新测试,或修复代码以保证功能可以正常使用。

为什么要进行冒烟测试?

冒烟测试在进行时应该保证你写的新代码不会破坏已有的功能,并且在理想情况下,它们应在生产开发的过程中运行。在软件测试中,你肯定不希望它是响应式的(reactive)——不想等到功能中断后,收到一个用户报告然后再进行修复。而是希望你的用户遇到错误之前先知道是否有错。作为开发人员,烟雾测试让你自信地让你知道:你需要知道自己是否正在不破坏已有功能的情况下发布新功能。

烟雾测试与单元测试

冒烟测试和单元测试都应在你的build pipeline中实施。冒烟测试应涵盖高级的端到端功能,而单元测试应涵盖单个组件的测试。两者都应存在,不能互相替代。

二、混沌工程(Chao Engineering)

在任何复杂的软件系统中,故障都是不可避免的。在这种情况下,混沌工程(也称为混沌测试)提供了一种故意在系统中引入故障和中断的方法和工具集。

这种方法率先被Netflix采用,他们在2010年首次创建了混沌工程流程,并于2014年详细发布了该流程。

混沌工程和四面军

混沌工程是一组自动化过程(统称为“四面军”),用于引入各种类型的系统故障。这些工具各种各样的命名让人联想到混乱的测试,就像是一群猴子在数据中心中造成了意想不到的严重破坏,而工程师必须为此做好万全的准备。

确切地知道一个复杂系统将如何应对失败实际上是不可能的。唯一的方法就是去预测故障结果(尤其是灾难性或级联故障),然后等待故障发生。因此,你可以用可控的方式以及自定义时间,在混沌工程中自己创造这些故障,这也成为了一种有用的练习内容。

如果你对可靠性有很高的期望,或者会在较不可靠的环境中运行(例如在云基础架构上),那么了解系统的故障模式非常重要。但是,注入混乱需要有一定程度上的准备,你可以先在预生产环境中尝试一下。

三、辛普森悖论(Simpson’s Paradox)

辛普森悖论,又称尤尔-辛普森效应,是一种反向悖论,意思是当几组数据合并时,每组数据中发现的相关性会消失或逆转。它与许多非实验研究相关,包括A/B测试。

辛普森悖论的例子

关于辛普森悖论的一个经典例子是1975年加州大学伯克利分校的一项关于研究生招生中性别偏见的研究。从整体数字来看,男性和女性申请者的录取比例存在显著差异:8442名男性申请者中录取44%,4321名女性申请者中录取35%。然而,当考虑到个别部门时,数据显示在统计上明显偏向女性:85个部门中有6个对男性有明显偏见,而只有4个对女性有明显偏见。

怎么会这样呢? 这看起来是违反直觉的,但这个结果又是合理的:每个组的个体相关性是正的,但整体相关性是负的。如果我们把每个组的中心作为一个数据点,这些数据点的趋势是负的。这就产生了一个令人困惑的变量存在:在招生研究中,女性倾向于申请竞争更激烈的部门(如社会科学),而男性倾向于申请竞争不那么激烈的部门(如自然科学)。

让我们来看另一个现实生活中的例子。

肾结石手术

在一项医学研究中比较了两种肾结石治疗方法:方法A(包括所有开放式手术)和方法B(一种特殊的、微创的小穿刺手术)。结果表明,方法A对小结石(93%成功率 vs 87%成功率)和大结石(73%成功率 vs 69%成功率)更有效,但同时考虑两组时,方法B更有效(83%成功率 vs 78%成功率)。

在这种情况下,令人困惑的变量是病例的严重程度:对于不太严重的病例,医生更有可能开出总体效果较差但侵入性较小的治疗B;而对非常严重的病例,通常使用方法A,这就不成比例地降低了用治疗方法A的感知效力。

A/B测试

假设一个开发团队正在为他们的web应用运行一个功能的两个变量。他们关注的指标是转化率,并且在两种不同的浏览器(Firefox和Chrome)上运行测试。给80%的Firefox用户显示变量A,其余的20%显示变量B;为20%的Chrome用户分配变量B,其余的80%给变量A。单独来看,变量B的转化率在每个浏览器的结果中都比变量A的更高:在Firefox中,变量B是100%,而变量A是87.5%;在Chrome中,变量B是62.5%,而变量A只有50%)。然而,当同时分析两个浏览器时,变量A是赢家:总共占了80%。

原因在哪里呢?这里容易混淆的变量是每个浏览器的用户样本大小。分配给每种变量的用户数量有显著的不同(变量A组有80个用户给,而B组只有有20个用户)。因此,变量A的总体转化率主要被转化率较高的Firefox占据,而变量B的转化率主要由转化率较低的Chrome占据。如果用户样本相等,我们会发现变量B是总体的赢家。

辛普森悖论的思考

当考虑辛普森悖论的任何实例时,寻找一个不受控制的第三变量(如上述例子中的部门竞争力、案例严重性或样本大小)是至关重要的,它可以用来解释这个悖论。此外,由于整体和个体之间的差异被允许了,所以辛普森悖论中的“悖论”源于非实验研究中因果推理的不当使用:它把相关性错当成了因果关系。

在考虑一个招生项目是否存在偏见时,我们并不只关心学生的性别和他们的录取情况之间的相关性,我们关心的是大学的招生部门中是否会对某种性别的学生有偏见。确定这两种关系:是部门还是整个大学的关系中的哪一种是虚假的,不是取决于统计数据,而是取决于与问题有关的其他信息。在辛普森悖论的例子中,我们无法得出雷速哪一种关系是相关的这类通用结论。

在A/B检验中,样本容量是最常见的易混淆变量。这使它更容易发现辛普森的悖论,并在实验中纠正它。只要用户样本在分配的变量、浏览器和其他类别中间均匀分布,辛普森悖论就不太可能混淆你的结果。

四、如何用功能标志进行抽象分支?

抽象分支是一种用于进行增量式大规模软件改造的同时发布系统的技术。这是基于集群开发的一个重要部分,这对创建持续集成和持续交付管道(CI/CD)而言至关重要。

在非CI/CD情况下,进行更改的标准方法是在版本控制中使用特性分支,但是这与持续集成不兼容(因为分支上的代码没有集成)。但是,在构建大型的新特性或重构大量代码时,如何才能保持集成代码呢?我们如何才能满足以下条件:a)确保开发团队的其他成员能够继续处理其他依赖于被更改代码的代码;b)确保整个代码库在任何时候都可以发布?

抽象分支的开发过程

举例来说,假设我们在应用程序的后端重构了一部分代码,大量面向客户的代码依赖于现有的之前的代码,我们正试图重新设计它。

为了使其在CI环境中工作,下面是涉及到的抽象分支的开发过程:

在使用旧实现的所有组件周围添加一个抽象层。更改引用,使组件引用抽象分支而不是旧的实现代码。

对所有客户端用步骤1,以便现在对旧实现的所有引用都经过抽象层。

在构建新实现时,首先实现一段客户端代码所需要的特性,然后将这段代码单独切换为引用(仍然在抽象层之后)。在新实现的一个给定部分完成之前,将其隐藏在一个功能标志(又叫功能切换)后,然后关掉它。当每个部分完成时,打开这个标志。

重复步骤3,让所有的客户端代码使用新的实现方式。

删除旧实现,标志特性,可能还有抽象层。

在此过程中有许多变量:例如,可能会不能分别交换新实现的每个部分,而需要一次性全部交换。在任何情况下,抽象层都允许在一个实现和另一个实现之间进行简单的转换,因为抽象层允许两者在同一个系统中共存。

抽象分支的优缺点

抽象分支的主要优点除了能在持续集成(CI)中轻松迁移大型特性之外,它还有一些其他的优点。首先,暂停和恢复迁移非常简单,因为新的实现是被系统保护的。在标准的功能分支上,可以暂停迁移;但是恢复要困难得多。另一方面,取消一个已经存在的项目,虽然不像取消一个长时间运行的功能分支那样便宜,但是只会稍微贵一点。

然而,抽象分支并不总是最好的选择。例如,在客户可以自己选择何时升级他们的软件版本的情况下,抽象分支就不会工作,因为整个系统必须同时升级。

五、第一型错误(Type I Error)

第一型错误(或型一错误),是一种伪阳性错误。是指在统计学中,拒绝了实际上成立的、正确的假设。第一型错误属于假设检验的四个可能结果之一。

什么是假设检验?

假设检验是通过推翻假设的对立面,以确定其是否成立的过程。如果我们想检验两个变量是否相关,可以使用对立假设证明它们之间存在显着关系;然后使用零假设得到相反的结论,即他们没有关系。

P.S 请注意,我们不会一次进行两个假设。如果我们对立假设的结论是两个变量之间存在正相关,则原假设应该检验它们之间没有正相关关系(存在负相关/无显著相关)。要注意原假设始终是对立假设的互斥逆向。

在任何的假设检验中,都有两个可能的结果:我们接受原假设(例如,如果变量之间没有显着差异),或者我们拒绝原假设并接受对立假设(例如,如果存在统计显著性的相关性)。

理想的统计检验始终接受真实的原假设,并拒绝错误的原假设,但是每个检验都有一定的误差范围(直接对应于你的置信区间/p值)。因此,实际上有四个可能的结果:我们接受正确的原假设,接受错误的原假设,我们反对正确的原假设,反对错误的原假设。

第一型错误是指拒绝错误的原假设;第二型错误是接受错误的原假设。

当第一型错误是可接受的

完全消除第一型和第二型错误在统计学上是不可能的,但是检验的设计会影响它们各自的数量。根据您的情况,第一型错误可能是个可以接受的权衡。

例如在医学检查中,对许多人进行了简单廉价的检查,但没有人出现任何症状。这些设计旨在引起医生的注意,只要其病情有任何重大变化,这意味着必须将伪阳性率(第二型错误)降到最低。结果是,大量的第一型错误产生了。随后,通常通过更复杂,更昂贵的测试来筛选出医疗检查中的误报。

美国的机场安全是通过产生大量第一型和第二型错误最小化的另一种情况。在很多情况下因为某种无关紧要的原因:手表,由奇特织物制成的衬衫,金属午餐盒,皮带扣等,检测器都会关闭。但是,因为机场安全将伪阴性最小化了,因此会产生很多伪阳性的结果。

当第一型错误是不可接受的

当第二型错误必须最小化的情况下,通常都会产生大量第一型错误;相反的,如果第一型错误是不可接受的,则通常会取代第二型错误。

例如,在电子邮件垃圾邮件检测系统中,第一型错误(将非垃圾邮件扔到了垃圾邮件文件夹中)比类型II错误(错误地将垃圾邮件放在了收件箱中)的接受程度低得多。前者给用户带来极大的烦恼,因为他们重要的电子邮件没了。后者会带来一些不便,因为他们得手动删除垃圾邮件。一个优化过的垃圾邮件过滤器可以过滤掉尽可能多的垃圾邮件,同时确保没有非垃圾邮件被标记为垃圾邮件。

在一般情况下,你测试的设置决定了那种错误对你来说是更容易接受的。在某种程度上,可以一次将这两个错误减至最小,但不可能完全消除其中一个;并且将一个错误减至最小往往会增加另一个错误的发生率。建立一个系统来处理您的测试所引发的错误类型会改善整体的用户体验(例如,对在医学检查中呈阳性的人进行其他测试,在机场安全中进行常规检查和行李搜索,或设置“将其标记为垃圾邮件”的按钮)。

六、第二型错误(Type II Error)

第二型错误(2型错误)是假设检验可能导致的两种统计错误中的一种(另一种是第一型错误)。从技术上讲,第二型错误通常发生在接受一个错误的虚假假设,也被称为伪阴性。

在任何假设检验的情况下,原假设都表明测试对象在实验组和对照组之间没有显着差异,因此观察到的任何差异都是某些错误的结果。相比之下,另一种假设则表明存在显着差异。

这种设置的结果是,任何假设检验都有四个可能的结果:

  • 我们拒绝错误的原假设
  • 我们拒绝正确的原假设
  • 我们接受正确的原假设
  • 我们接受错误的原假设

1和3是正确的推论,2是第一型错误(伪阳性),4是第二型错误(伪阴性)。

当第二型错误是可接受的

由于在统计学上不可能同时消除第一型和第二型错误,因此进行实验的人员必须确定哪种错误更容易接受,并做实验来尽可能地消除不太能接受的错误。

当第二型错误比第一型错误可能更容易被接受时,我们可以看一下垃圾邮件的检查例子。当对立假设是:邮件是垃圾邮件,因此原假设是:邮件不是垃圾邮件。提交第一型错误意味着将合法的电子邮件标记为垃圾邮件,从而阻止其正常发送。犯第二类错误意味着垃圾邮件被标记为合法并发送到用户的收件箱。

大量的第二型错误表示垃圾邮件过滤器无效,但是大量的第一型错误表示垃圾邮件过滤器通过阻止用户进行合法的通信,总体上是弊大于利的。因此,电子邮件垃圾邮件过滤系统的目标应该是减少第二型错误的数量,同时保持第一型错误的数量接近零。

相比之下,在生物特征安全系统中,例如手机上的指纹扫描仪或个人计算机上的面部识别软件,则对立假设是“面部扫描仪无法识别授权的列表用户的人脸”,因此原假设是“面部扫描仪确实识别了授权的列表用户的人脸”。

在这种情况下,大多数的第二型错误将意味着设备不安全;而大量第一型错误的出现意味着用户需要以其他方式证明其授权,这样非常不便(例如使用密码或pin码)。因此,系统应设计为减少第一型错误的数量,同时将第二型错误的数量尽可能降低至接近0。

如何将第二型错误降至最小?

由于它们来自测试的设计,因此,若想最大程度地减少某些错误,就需要去修改测试方法。为了最大程度地减少第一型错误的数量,减小p值(增大置信区间)是一种简便的方法。为了最大程度地减少第二型错误的数量,就要去增加样本量(或在某些情况下进行较长时间的实验),或增加p值。

七、CI/CD是什么?

CI/CD是持续集成(CI)和持续交付(CD)相结合的软件开发方法的首字母缩写。它还可以对其进行扩展来进行持续部署,但是为了避免在这里引起混淆,我们将使用CD来表示持续交付。对于DevOps团队而言,这是一个非常有用的敏捷过程:有效的CI/CD管道可以使bug的修复更加轻松,消除合并的麻烦,并加快开发过程。使用feature flag,甚至可以提高部署的安全性并改善用户体验。今天,我们将解释CI/CD的每个组成部分,以及如何实现它们。

连续集成

对于大多数团队来说,持续集成的标准是,开发团队的每个成员至少每24小时都要对trunk(端口汇聚)进行一次更改。这一过程使查找和修复bug变得更加容易,因为在查找,修复少量代码上比大量代码容易得多。此外,它还消除了因为长期存在的功能分支引起的合并问题:当每次提交是一天及以内的工作量时,一个程序员修改另一个程序员代码所依赖的代码的可能性会大大减小。

持续集成需要专门的工具来集成开发人员工作的来自无数不同平台的代码变更。它还需要一套方法来验证变更:

最常见的方法是基于集群的开发,它涉及到将每一个新的代码变更都提交到trunk。这使得满足CI的需求变得容易,并且创建了一个快节奏的开发环境。然而这并不是CI的唯一流程:你也可以使用像Gitflow这样的流程,只要pull request流程比较快。

持续交付

连续交付是将应用程序自动交付到任何基础架构环境的过程。(如果恰好是生产环境,则被称为“连续部署”。)通常情况下,连续交付过程会将代码推送到开发,模拟或测试环境。

并非每个CD工具都以相同的方式工作,但是通常它们会自动创建新功能所需的基础架构,将代码从版本控制系统移至目标环境,定义相关环境变量以及设置目标环境,执行自动化测试,并在测试失败时重新运行。

许多软件都可以用于自动化CI/CD管道。最常见的是Jenkins,CircleCI,Travis CI和Bamboo。

在CI/CD中使用功能标志

功能标志是一段条件代码,可让您打开或关闭功能时而无需重新部署。在CI/CD工作流中,可以将未完成的功能保留在功能标志的后面,只有在功能完成后才打开这些标志。如果该功能已打开并且仍然存在bug,则重新运行就能像拨动开关一样容易。这样,使用功能标志可以提高功能发布的速度和安全性。

有多种方法可以实现特征标记,但是对于实施CI/CD的团队来说,全面的特征标记管理系统通常是最佳选择。当使用标志来关闭不完整的功能,并将其留在代码中时,可以避免技术负债的累积,因为管理系统会让你知道该标志已经有一段时间没有被打开或关闭了。

八、什么是基于主干的开发?

基于主干的开发(Trunk-Based Development,简称为TBD)是软件开发的分支模型,开发人员可以在其中把每个新功能,修复的bug或代码变更集中到版本控制系统中的一个中央分支。该分支称为trunk(主干),mainline(主线),或者在Git中称为master branch(主分支)。

基于主干的开发通过创建一个环境,使每个程序员每天自然地多次提交主干,从而实现了持续集成,并且扩展了持续交付。这样可以轻松满足“开发团队中的每个人至少每24小时提交一次主干”的持续集成要求,并为可随时发布的代码库奠定了基础,这对于持续交付和持续部署是必需的。

TBD的样式

根据开发团队的规模,有两种不同的基于主干的开发样式:小型团队倾向于将每个新变更简单地合并到主干,而大型团队可能偏向于使用由一两个人/小团队管理的暂时分支。这些分支将在被切断后的几天内会被合并回主干。(任何需要花费几天时间进行的变更,都应该通过抽象方法在分支中使用功能标记,以防止长期存在的功能分支“合并错误”。)

发布分支

在基于主干的开发中,唯一长期存在的分支是由发布工程师管理的发布分支。尽管发布工程师可能有时会接收特定开发人员的提交并将其合并到发布分支中,但开发人员不会直接向发布分支进行提交。

发布分支永远不会合并回主干。它们是从主版本的一开始就创建的,并从主版本合并到迭代版本。但是当需要开始进行另一个主版本时,现有的发布分支都将被删除,并从主干创建一个新的分支。

TBD中的合并请求

许多人会想到pull request(合并请求)和GitFlow,它们几乎与基于主干的开发相反(慢且容错性强,与快节奏且受开发人员信任的TBD相反)。但是在特定情况下,pull request确实在TBD中占有一席之地。使用功能分支,开发人员仍会在任何给定的时间生成一些还没合并到主干的代码。pull request可以在这些新代码启动代码审查(尤其是用CI工具进行自动审查)。

何时使用TBD?

在决定是否要实施时,要考虑TBD的两个关键特征:

TBD具有快速移动的能力。

开发人员都非常信任:无论他们做什么,都相信他们不会破坏构建。这些通常被认为是基于主干的开发的收益-确实如此-但没有一种系统能完美地适合所有人。

例如,一家创业公司需要尽快搭建其产品的0.0.1版,并拥有一支由经验丰富的工程师组成的团队可以用TBD进行协作:每个提交到trunk的人员都是值得信任的,对他们而言,速度是至关重要的。

但是,一群需要去维护已建立好的开源项目的开发人员却不会考虑用TBD:因为速度对他们来说并不那么重要,并且他们可能无法信任每个打开Github请求的随机人员。这样的团队最好使用容错能力更高的流程(例如GitFlow)。

九、功能标志的管理

功能标记管理当然是指管理功能标记的过程。尽管功能标志对于许多目标而言很有用,但它们需要有组织的流程来进行管理。下面我们会简短讨论一下其具体的方法。

特征标志管理系统主要有两种类型:内部进行构建,和购买预先构建好的特征标记管理系统。两者都有其优点和缺点,你选择哪种解决方案在很大程度上取决于团队的需求。

任何管理系统都应执行以下四件事:

  1. 为整个组织提供一个通用框架
  2. 快速可靠地提供标志
  3. 管理测试过程
  4. 避免出现技术负债

开发一个通用的标记框架

功能管理系统最关键的事应该是允许所有团队成员查看和控制每个功能的状态,最好是通过一个直观的GUI。这意味着开发人员,产品经理,销售团队,市场营销团队和其他利益相关者都能够切换功能。
作为这个GUI中的的一个重要功能,它应该可以方便地为功能标志分配特定的人员或团队责任。这对于实现渐进式交付很有用,随着时间的推移,对功能的责任可能会自动从开发人员过渡到项目经理,再到客户成功团队。

快速可靠地提供功能标志

一个构建良好的特性管理系统将确保功能标志的使用不会降低最终用户的应用程序运行速度。为了做到这一点,它可能会实现客户端缓存以具有更大的弹性。它还可能会使用内容分发网络(CDN)来确保特征标志信息能尽快到达用户那里。

管理测试过程

当你的开发团队对功能进行测试时,可以使用功能标志在生产中测试这些功能。你只需添加您的内部团队成员即可接收新的处理信息,与这些用户一起进行生产测试,然后在功能就绪后为所有人打开功能标志。这个过程能确保您的功能在用户访问之前可以在生产环境中正常工作。

避免技术负债

功能标志管理对于避免技术负债也至关重要。当功能标志不受欢迎时,就会造成技术负债:出于各种原因,原本短期的标记会停留更长的时间;当有人实现了一个标志但忘记了它的存在,有人打开了一个永久的标志但又忘记了将其从代码库中删除等。

我们很难解决积压的技术负债,甚至难以确定其解决的优先顺序。所以避免技术负债的最佳方法是在它启动之前就把它停止,并开始使用功能标志。使用一个功能标志管理系统,它提供功能来跟踪一个特性切换被翻转了多长时间。如果功能标志不在使用中但仍在阻塞代码,你可以立即将其删除。

总结

对于任何DevOps或连续交付团队来说,功能标志都是一个非常有用的工具,但是如果没有进行适当的管理,那么可能会让工作更大,增加技术负担或使测试复杂化。因此,创建一个功能管理系统可以帮助你的团队解决这些问题。

十、软件发布生命周期中的功能标志

通常,当我们听到“软件开发生命周期”一词时就会想到敏捷框架。为了保持敏捷性,我们可以对软件发布生命周期或将产品从编码转移到开发的过程应用类似的过程。

通过将相同的原理应用于软件生产过程,我们也可以在这个阶段使用敏捷原理,并且它也与DevOps哲学很好地集成在一起。在准备发布软件时,软件发布周期是指软件成熟度模型中的所有阶段的统称。
软件发布版本周期的各个阶段包括pre-alpha,alpha,beta,RC版本(release candidate)和正式发布的版本。每次发布将循环其中的每个阶段。

发布阶段

在发布早期,应允许有限人员访问这个软件,因为它可能出现频繁的错误。在Alpha阶段之前,通常只有开发团队才能访问,这包括从计划到执行的最初阶段。到了Alpha阶段,会在团队内部对整个产品进行测试。

到发布到了Beta阶段时,它已经部署在客户站点上,并且针对目标用户进行了测试,来识别软件中是否有任何bug或需要变更的地方。在这里,您可以在功能标志中定位内部团队,以便能在运行中进行测试。一旦产品通过了Beta测试,它就被定义为RC版本(releasecandidate),随着最终的式发布的版本一起也发布给用户使用了。这时测试可能会继续,但是产品本身已经被认为是稳定的了。

功能标志是如何工作的

功能标志(有时被称为“功能切换”)是让一些应用程序的功能,可以在给定的时间打开或关闭。它们对于持续交付模型非常有用,该模型会在应用程序完成之前的各个阶段发布项目。使用功能标志,某些项目可以根据它们的开发阶段进行开关,而不会降低应用程序其他部分发布的速度。

功能标志的优点之一是,你可以直接在编写代码的过程中测试应用程序的一部分,但是这个部分只能被特定的组访问(例如通过使用“dev cookie”)。它提供了可以进行端到端测试的平台,以及可查看项目在实际最终环境中的运行状况。

功能标记管理系统可以控制每个组的用户看到不同的新代码,这样可以轻松映射到你的软件开发生命周期。您可以将代码发布给开发团队,然后再扩展到其他工程,质量保证和产品团队。最后,您可以开始把用户按比例,或者按地理位置等属性对用户进行细分,向他们针对性地推出产品。

通过使用功能标志,你还可以通过减少功能分支和基于主干的开发来改善部署。通过这种以发布为核心的的方法,可为用户提供更好的用户体验。

功能标志的用例

假设你有一个开发团队的成员,正在开发一些新功能,这些功能可能需要几个月才能完成。但是,您的发布时间安排设置的是每两周一次。那么你可以在应用程序中使用极少量的功能标志,让这些代码与已有代码进行很好的集成。这些开关可以在需要时方便地打开和关闭。

下面是一个功能标志的测试用例:

代码还没准备好

然后,我们可以将toggle(切换开关)设置为打开/关闭:当功能存在却不需要被启用时,使用关闭状态;需要被使用则设置为打开。

该代码或许在应用程序中,但是终端用户将无法查看正在发生的事情。这个标志在功能准备好后就可以被打开了。toggle(切换开关)会放在if-else语句中,决定你是否能看到新功能,这些都取决于根据你的最终目标。

功能标志的用例

功能标志的优点之一是,它可以提高伸缩性,可以轻松调高或调低服务器负载来应对性能的变化。万一你需要你想扩容而性能突然下降了,可以暂时关闭各种功能标志来保持应用程序运行,而无需让整个系统脱机。

通过使用功能标志,你可以让应用程序在软件开发的发布周期中更快地推进。您可以在整个应用程序完成之前发布Beta版本,并且为扩大或缩小做好了充分的准备,从而使你能在不牺牲应用程序的整体功能的情况下持续地提供内容。

本文由 新媒体之家 作者: DTalks 发表,其版权均为原作者所有,文章内容系作者个人观点,不代表 新媒体之家 对观点赞同或支持,未经许可,请勿转载,题图来自Unsplash,基于CC0协议。
0

发表评论