管理Codebase中的技术质量。

10月17日,2020年。提起申请建筑学30工作人员加19.

如果工程师,工程管理人员和技术高管有一件事可能会达成一致,这就是技术质量危机。一个诊断和治疗易于识别:我们的工程师不优先考虑质量,我们需要雇用更好的工程师或培训我们拥有的工程师或培训。当然,如果这种感觉更舒适,您应该随时使用“产品经理”或“高管”更换“工程师”。这是一个引人注目的叙述,一个明显的恶棍,它可以方便地将责任从工程领导转移。尽管如此,与大多数叙述相比,将对众议员的责任推向最少的权力,这两者都无济于事和错误。

当您接受较低的技术质量从事决策结果的前提时,您开始寻找不良判断,公司必须是罪魁祸首。是之前的CTO吗?是员工工程师用紧张的笑容看着你吗?是每个人吗?如果不是那些人,陌生人也不是你的错吗?

在大多数情况下,技术质量低不是危机;这是预期的正常状态。工程师通常在制造它们时进行合理的质量决策,而且成功的公司随着时间的推移,枢纽或向上推向企业用户而提高他们的质量吧。在运行良好和成功的公司,您以前的大部分技术决策都不符合您当前的质量阈值。而不是失败,关闭您当前和目标技术质量之间的差距是有效工程领导的常规部分。

问题

作为工程领导团队,您的目标是保持适当的技术质量水平,同时尽可能多地对核心业务进行能量。您必须在多个时间帧上平衡质量,并且这些时间帧通常具有相互冲突的需求。例如,您会做出非常不同的工作,从而在下周的截止日期与您可以做的截止日期,以建立一个支持的平台,以便在下一季度快速推出的平台。

正如贵公司的技术质量标准会随着时间的推移而改变一样,您管理技术质量的方法也会随之发展:

  1. 修复热点这导致即时问题
  2. 采纳最佳实践已知提高质量
  3. 优先考虑杠杆点根据您的软件更改,保持质量
  4. 排列技术向量您的组织如何更改软件
  5. 衡量技术质量引导更深的投资
  6. 启动一个技术质量团队创建质量体系和工具
  7. 运行质量计划衡量,跟踪和创造问责制

当我们挖掘这个工具包的方法时,请记住挑选最便宜的,最简单的工具可能会工作。技术质量是一个长期游戏。没有赢得胜利,只有学习和赚取的机会继续播放。

上升楼梯

钻研手头的挑战,直到你发现一个值得解决的普遍问题,这是一种特别的乐趣。然而,一个同样重要的本能是迅速解决目前的局势,并着手解决下一个紧迫的问题。

当您考虑为您的团队和组织提供正确的质量改进时,它通常最有效地从最轻的重量解决方案开始,并且仅在较早的努力下逐渐崩溃的巨大解决方案。如果您无法获取团队采用适当的代码,您将尝试推出全面的质量计划。虽然后者在规模中可以更有效,但它们更加努力地执行。

所以,先做快速的东西!

即使它不起作用,你也会学到越来越快地从无法推出易于推出的东西来推出硬质服。那么你会更快地改善第二次迭代。随着时间的推移,您将走向综合方法,但无需急于求成。不要放弃早期组织的缓和,欢乐和无罪,为企业规模协调的危险而无需适当的需求。

呈现这些阶段是一种方便的阶段是一个线性楼梯才能提升,但很少真实组织如何使用它们。您更有可能修复质量热点,推出最佳实践,开始运行架构审查,废除架构审查,并回到热点。早产的过程增加了比价值更多的摩擦力,并且很快就会将自己暴露为无效。如果某些东西不起作用,请尝试一下使其工作,然后庆祝其消亡。

热点

当面对质量问题时,第一本能通常是识别必然需要一个过程解决方案的过程故障。如果部署导致中断,它是因为作者没有正确遵循代码测试过程,所以现在我们需要与每一个提交的测试 - 那将教这些懒惰的开发人员!

有旧的笑话Sarbannes-oxley.:它不会降低风险;当事情出错时,它只是为了责备谁。不幸的是,这个笑话在没有幽默的情况下适用于有多少组织推出流程。问责制具有其作用,但了解手头的问题并尝试直接修复它,而不是创建流程驱动的问责制更重要。

流程卷展览需要人类改变他们的工作方式,你应该不应该轻松进行。通过填充性能工程师的心态开始而不是达到过程改进。衡量手头的问题,确定发生了大部分问题的位置,并恰好地关注该区域。

未测试的部署的前一个示例可能会受益于向部署工程师提供直接反馈,了解更改其测试习惯。或者,也许您最好通过承认您的软件设计易于出错并采用“定义错误”方法来更好地服务软件设计的哲学

如果您有开发速度问题,它可能是优化的测试运行时间,将您的Docker编译步骤移动到RAM磁盘,或使用描述的技术软件设计X射线找到特定文件以改进。

系统思考是我职业生涯中遇到的最具变革的思维技巧。尽管如此,有时它可能是一个警报器向你朝着修复当前系统,你可能会更好地丢弃。当然,您可以推出一个新的培训计划来教导您的团队如何编写更好的测试,但或者,也许您可​​以删除一个测试文件,其中98%的测试失败发生。这是优先考虑热点的不合理效果,为什么它应该是您用于提高技术质量的第一种技术。

在某个时候,你可能会发现你的组织制造质量问题的速度比你修复热点的速度要快,这时是时候采用最佳实践了。

最佳实践

我曾经在一家没有团队规划过程的公司工作过。随着时间的推移,工程负责人越来越沮丧,无法预测目标日期,并要求我们使用克鲁姆。授权后,经理在Wiki上写下Scrum进程。有一个宣布我们正在使用scrum。经理告诉他们的团队使用Scrum。任务完成!

当然,没有人开始使用scrum。每个人都一直在做他们以前所做的事情。承认错误是尴尬的,因此工程负责人宣布采用一个主要的胜利,没有人有不同的说法。

这个悲伤的故事镜子镜像有多少公司试图推出最佳实践,这是最好的做法具有如此糟糕的声誉的原因之一。从理论上讲,组织将在修复质量热点之前采用最佳实践,但我建议在热点后建立实践。采用最佳实践需要一段时间的组织和领导成熟程度,需要一些时间来发展。

当你推出新的做法时,请记住一个良好的过程是进化的而不是强制要求。研究其他公司如何采用类似的做法,记录您的预期方法,试验与少数有关的团队一起进行实践,在粗糙的边缘上沙子,基于挑战改进文档,只有这样进一步滚动。匆忙的过程是一个失败的过程。

同样重要的是限制并发进程卷展栏的想法。如果您试图让团队同时采用多种新的实践,您就可以与自己争取他们的关注。如果您正在考虑恢复或修改其中一个新实践,它还会使其更加困难。这是有点顽童,但我已经相信,你应该在任何一段时间限制自己的最佳实践推出。渠道所有能量朝着制作一个练习成功而不是拆分资源。

一次采用一个新的练习,也迫使你仔细考虑哪个优先考虑。选择您的下一个过程的声音很容易,但它通常不清楚哪种最佳实践是真正的最佳实践,这只是熟悉或着名。必须通过研究支持真正的最佳实践,并对这一主题的最佳研究来源是加速

虽然Accelerate的所有建议都是数据驱动的,而且非常好,但我发现早期最有帮助的建议是版本控制、基于主干的开发、CI/CD和生产可观察性(包括开发人员对他们编写的系统的随叫随到)以及在小的原子更改中工作。我还想提倡很多其他的做法,但他还没有在职业生涯中提倡过更好的内部文件,但我不相信我的直觉,就像我曾经一样。

当你被太多的热点冷却时,从固定热点到采用最佳实践的过渡到了。从最佳实践来利用积分的下一次过渡,当您发现自己想要采用新的最佳实践,在您的进步最佳实践工作之前。而不是提高您获得的最佳实践采用进展限制,继续前进到下一个工具。

杠杆作用点

在热点部分中,我们讨论了使用性能工程师的心态来确定修复的正确问题。优化适用于您已经拥有的问题,但它是故意对未来的态度:性能工程最糟糕的罪行筹集了未经证实的问题。

然而,正如您了解软件如何随时间变化,因此通过防止总质量失败和降低未来质量投资的成本,额外投资会随着时间的推移提供质量的额外投资。

我称之为这些质量杠杆点,三个最有影响程度的点是接口,有状态系统和数据模型。

界面是系统之间的合同。有效接口从封装的实现中脱钩客户端。耐用的接口暴露所有潜在的基本复杂性,并且都不是潜在的意外复杂性。令人愉快的界面是热切地辨别,令人思想地渴望

国家是任何改变系统的最难部分,而且抵抗变革有状态另一个临界杠杆点。州的惯性来自其规模。从其代表可用性,可靠性和合规性能的倾向于复杂性。从具有概率而不是定理描述的类型。(或在分布式状态的情况下,概率和定理。)

数据模型是接口和状态的交叉点,将您的有状态系统的能力降至您的申请认为合法的能力。一个好的数据模型是僵化的:它只公开它真正支持的东西并阻止无效状态的表达式。随着时间的推移,良好的数据模型是容忍进化。有效的数据模型甚至没有略微聪明。

当您确定工作中的这些杠杆点时,请花费额外的时间刻意接近它们。如果它是一个接口,请将半个客户端集成到模型实现。如果是数据模型,则表示六个真实方案。如果它是有状态,锻炼失败模式,请检查一致行为,并建立类似于生产方案的性能基准。

拿走你学到的一切,并将其拉到您在团队中社交的技术规范文件中。从同行收集行业反馈。即使在开始实施之后,聆听现实的声音并保持打开变化。

投资杠杆点的隐藏权之一是您不需要总组织对齐来执行此操作。要编写技术愿景或推出最好的实践,您需要这种购买,这就是为什么我建议以杠杆点开始。但是,如果您从杠杆点耗尽了可访问的影响,可能是时候继续推动更广泛的组织对齐。

技术载体

有效的组织马歇尔朝着共同愿景努力。如果您绘制每个项目,每个技术决定都是如网格上的向量,那些向上指向同一方向的矢量越多,你就越多了。相反,我在创造的向量中使用的一些最令人印象深刻的工程师,而且具有非价位,而是一个错位的方向,最终损害了他们的组织,因为他们试图领导它。

一个肯定的防火解决方案来对准技术方向是将所有相关的决定路由到同一个人建筑师在他们头衔的某个地方。这很好,但很难扩展,而且架构师的决策质量会随着他们在实际过程中对实际代码进行实际工作而降低。在另一个极端,你可以让每个团队做出独立的决定。但是一个允许任何工具的组织就是一个拥有统一的不支持工具的组织。

您对调整技术向量的基本工具是:

  • 提供直接反馈。当人们遇到不一致时,第一个答案通常是过程改变,而不是从简单地给那些你认为不一致的人直接反馈开始。就像他们错过了你的背景一样,你也错过了他们的背景一样,和蔼可亲、清晰的对话往往可以避免多年不必要的过程。
  • 阐明您的愿景和策略在一个明确的,有用的文件中。(这是一个富有的主题,我将单独覆盖。TODO:添加一个链接以写入技术策略部分一旦写成。)
  • 将您的方法封装到您的工作流和工具中。清除愿景的文档有用,但有些人根本不会研究您的文件。刻意的工具创造了培养习惯的工作流程,而不是培训和文件。例如,配置新服务可能需要进入网站,该网站要求您将链接添加到该服务的技术规范。如果服务没有建立在呼叫设置,则可以阻止另一种方法可以阻止到生产,并使用当前打电话的某人,并且该个人也必须启用其推送通知。
  • 在他们的船上训练新的团队成员。改变人们在形成后的习惯是非常具有挑战性的,如果你试图让人们采用新的做法,这是令人沮丧的。但是,如果你加入时指向正确的方向指向的人,那么习惯势头将有利于剩下的对齐。
  • 采用康威的法律Conway的法律认为,组织构建反映其结构的软件。如果您的组织结构不佳,这将导致紧密耦合或纠结的软件。但是,如果您的组织的设计是有效的,它也是一种质量的力量。
  • 策划技术改变使用架构评价投资策略, 和采用新工具的结构化过程。大多数未对准都来自缺少的上下文,这些是组织杠杆要点,可以将背景注入决策。许多组织在这里开始,但这是我建议开放的最后一箱工具。您如何提供没有铰接愿景的一致架构评论?为什么在他们设计的东西而不是在他们的船上过程中讲述了你的策略?

无论您使用的方法如何对齐您的技术向量,这是几个月和多年来往往发生的工作。没有世界,你写Vision文件,ORG立即对齐它的光彩。更有可能在投资建设支持之前收集灰尘。

大多数公司都可以将上述技术(从热点修复到向量对齐)结合到一个成功的技术质量管理方法中,希望您能做到这一点。然而,许多人发现,他们还不够,你转向更沉重的方法。在这种情况下,第一步通常是测量。

衡量技术质量

在软件工程中衡量的愿望通常超越了我们的测量状态。加速识别测量强大的速度用于定位过程和工具问题的速度,但这些度量标准开始之后代码已合并。如何测量Codebase的质量,以便您可以识别差距,提出行动计划,并评估您努力改进的影响?

有一些过程测量与有效变化相关。例如,您可以测量每个拉拉请求中更改的文件数,以了解较小的拉动请求通常更高的质量。您还可以测量每个文件的代码库的代码行,假设非常大的文件通常很难扩展。这些都可以非常有帮助,我甚至建议测量它们,但我认为它们是代码质量的最佳代理测量。

我的经验是可能要使用码间质量,并归结为开发极其精确的质量定义。您可以获得更详细的质量定义,测量码比的越有用,并且希望提高他们正在努力的区域的质量变得更具一种令人效力。这种方法是详细描述的建筑进化架构回收不合理的软件

一些代表组件,可考虑包括您的质量定义:

  • 静态类型的代码占多大比例?
  • 有多少文件有相关的测试?
  • Codebase内的测试覆盖是什么?
  • 跨模块的公共接口有多窄?
  • 什么百分比的文件使用首选的HTTP库?
  • 在冷启动后,端点响应500ms内的请求吗?
  • 有多少函数具有危险的读写行为?或对主数据库实例执行不必要的读取?
  • 有多少端点在一个事务中执行所有状态变异?
  • 有多少函数获取低粒度锁定?
  • 存在多个PLUT请求中有多少个热文件?

欢迎您不同意其中一些属性应该存在你的CodeBase的质量定义:您的定义应具体对代码库和您的需求。重要的是开发精确,可测量的定义。在该定义的发展中会有​​分歧,您必须随着时间的推移改变定义。

开发定义后,这是一个仪器可以真正挑战的区域,仪器是有用度量的要求。仪器复杂性是在实践中采用这些技术的最大摩擦,但如果你可以推动,你解锁一些非常现象的东西:一个真实的,动态的质量分数,你可以随着时间的推移跟踪并用来在你的方法中创造一个清晰的对齐概念对齐不能。

具有质量明确和仪器,您的下一步是在投资之间决定质量团队或者质量计划。专用团队在其带宽中易于协调和可预测,并且通常是开始的更容易的地方。

技术质量团队

一个技术质量团队是一个软件工程团队,致力于在您的代码库中创建质量。您可以将此团队称为开发人员生产力、开发人员工具或产品基础结构。在任何情况下,团队的目标都是创建和保持公司软件的质量。

这不是有时称为质量保证团队。虽然两支球队都会投资测试,但技术质量团队有一个更广泛的工作流程,以建立要测试到界面设计。

当您在引导此类团队时,从固定的团队大小为三到六个人开始。拥有一支小型团队迫使您对其路线图无情地进行影响,并确保您将重点关注可实现的。随着时间的推移,这支球队将积累系统以维持需要缩放投资,Jenkins集群是这个常见的例子,你将想要的团队大小作为更广泛的工程组织的职能。拇指规则在这里是棘手的,但也许为每条五十产品工程师开发开发人员工具的工程师,这是您的基础架构工程投资。

这些团队难以拥有产品经理,一般是一个或多个员工和工程管理员和工程经理合作伙伴来填补该角色。有时他们雇用技术计划经理,但通常在他们交叉运行之后质量计划如下一节所述。

在旋转和操作这些团队之一时,成功的一些基本原则是:

  1. 信任指标过于直觉。您应该有一种方法来衡量每个项目。质量是一个复杂的系统,你的直觉可以轻松欺骗你的地方。同样,正如您在贵公司的更多高级,您的经历将不再反映大多数其他人的经历。如果您找到新的,您已经了解了粗略的边缘并获得优先级帮助,但大多数其他人都没有。指标让你诚实。
  2. 保持你的直觉。代码和过程随着时间的推移而变化,您的直觉每周都会陈旧,您远离建筑产品功能。大多数人都发现,嵌入团队的嵌入和团队旋转是保持本能相关的最佳方式。其他人监控聊天问题,以及与产品开发人员的1:1讨论的健康时间表。最好的人员都做了这两种,并保持了他们的指标仪表板方便了。
  3. 倾听,并从中学习,您的用户。有一个流行的“品味水平”,这意味着一些人只知道什么好看起来。设计有效的质量投资,而不是先天技能,它通常存在巨大的差异,这通常来自深入了解您的用户正在努力实现的目标优先考虑通过实现约束。

    您的工具的采用和可用性比原始力量更重要。一个很难使用的强大工具将获得一些电力用户,但大多数人将通过它。放慢速度以获得这些细节。隐藏所有的意外复杂性。观看工程师尝试使用工具第一次而不帮助他们。改善差距。再做十次!如果您没有对工具进行用户研究,那么您就是注定作为一个优质的投资团队。

  4. 少做点事,但做得更好。当你为整个工程组织构建时,任何你做得好的事情都会加速整个组织。任何你做得不好的事情,包括一些几乎伟大的东西,有太多粗糙的边缘,都会拖累所有人。尽管做一些最重要的事情比做许多平庸的项目贡献更大,这一点几乎总是正确的,但在您试图将工具和工作流推广到整个组织的情况下,这一点更为正确(组织过程进行中的限制仍然适用于这里!)。

  5. 不要影响。集中式质量团队与他们支持的团队之间存在根本紧张。通常情况是,集中团队的全球最佳方法是优选的,它在很大程度上争发在非典型域或工作负载上工作的团队的子集。一个代表性示例是一家在JavaScript中编写其后端服务器的公司,而不是允许他们的机器学习工程师使用Python生态系统,因为它们不希望支持两个生态系统。另一个案例是一家标准化的公司,用于所有API的休息/ http2 / JSON,其中特定团队想要使用GRPC。

    这里没有完美的答案,但重要的是建立一个深思熟虑的方法平衡探索抗议探讨标准化的好处

成功使用上述方法的技术质量团队将毫无疑问比相同数量的工程师直接进行产品工程工作,更高效。实际上,折扣开发商生产力(本文的精神现金流折现)衡量这种团队的影响是理论上正确的方法。理论上只有,因为这种计算大多是对自信的评估。

即使你相当成功,你总是有一个积压的高影响的工作,你想承担,但没有带宽来完成。组织不会做出纯粹理性的团队资源配置决策,您可能会发现您缺乏完成重要项目的带宽,并且同样无法获得批准来雇用其他人员加入您的团队。

这通常是您的团队具有比您所采用更高的高影响力的好兆头,因为它意味着您对自己所做的事情有选择。这意味着如果您有积压,您不应该尝试发展您的技术质量团队。但是,如果您发现存在无法到达的关键质量工作,那么可能是时候探索启动A.质量计划

质量计划

一个质量计划根本不是计算机代码,而是专门团队领导的主动性,以维持在组织上的技术质量。质量计划承担了实现组织目标水平的软件质量的广泛汇款。这些相对罕见,但您可能遇到的类似一些类似的事件计划负责公司的事件回顾和补救措施。

鉴于这是为高级技术领导者的观众编写的,让我们假设您拥有技术视角。您的下一步是找到一个技术计划经理,他们可以共同领导该计划并运行其机制。如果没有技术计划经理,您可以对组织计划的信息方面进行相当大的进展;这是一个陷阱。在大型组织中独奏驾驶程序的协调开销,您将被粉碎。

经营组织计划是关于哪个大题已经写了很多话题但核心方法是:

  1. 确定计划赞助商。如果没有赋权的赞助商,您无法更改组织的行为。组织行为他们所做的方式,因为它是他们当前约束的最佳解决方案,而且在没有强大的人的宣传,你就无法改变这些限制。
  2. 产生可持续的可重复的指标。运行程序的人每周花4个多小时手工维护数据集是很常见的。这不管用。你的数据中会有漏洞,你将无法在以后的步骤中将数据与自动化集成,你将耗尽精力来完成真正的改变;刷新度量仪表板没有内在的价值。
  3. 确定每个受影响的团队的计划目标以及他们完成这些目标的明确路径。你的计划必须为每个受影响的团队确定具体的目标例如,在测试中减少测试片状或更快地结束事件补救。然而,你必须提供通往成功的地图!许多项目对团队提出了需求,却没有提供如何实现这些目标的指导。项目负责人是主题专家,不要把你的策略抛给每个团队去独立改造。
  4. 构建工具和文档以支持其目标的团队。一旦您确定了团队的明确路径,以实现您的计划目标,请弄清楚如何帮助他们进行更改!这可能提供“金色例子”,其中应该看起来像什么,甚至更好,一个示例拉请求重构将代码的具有挑战性部分的挑战性分为新模式。它可能提供一个测试脚本来验证迁移是否正确工作。它可能是自动生成的转换提交来测试,验证和合并,而无需自己写入。尽可能多地尽可能避免每一支球队都要深入了解您试图取得进展的问题空间。
  5. 创建一个目标仪表板并广泛分享。一旦您对每个团队传达了您的程序目标,您必须提供仪表板,帮助他们了解他们当前的国家,他们的目标,并沿途加强其(希望)进步的反馈。最好的仪表板将成为每个团队的工作的记分卡,也为每个团队提供面包屑,在哪里关注下一件努力。

    您的仪表板应该支持三个不同的缩放级别。完全缩小的级别可帮助您评估您的程序的影响。完全放大的级别有助于个人团队了解他们的剩余工作。两者之间的第三级有助于组织领导人持有他们的团队责任(并支持您的方案赞助商制定具体,具体要求持有这些领导者负责任)。

  6. 向背后的人们派遣程序化讽刺。人们很忙。它们不会总是优先考虑您的计划目标。或者,他们可能会做出令人惊叹的工作,使您的所要求的改进,但稍后用弃用的做法回溯。使用讽刺来指导团队的注意力走向下一个工作,他们应该采取措施的目标。请记住,注意力是稀缺的资源!如果你用轻推电子邮件或平面浪费人的时间,他们就不会注意下一个。
  7. 通过赞助商定期审查计划状态。计划正在尝试在组织优先级取得进展,这与团队的目标不自然对齐。许多团队努力突破其当地优先级以实现全球优先事项。这是审查您的赞助商的整体进度至关重要,并指向优先考虑计划工作的团队。有效利用您的赞助商来展示未对准的优先级,这对您的成功至关重要。

在很多方面,程序只是一个无穷无尽的迁移,适用于迁移的技术也适用于程序

如果你得到所有这些步骤,你正在运行一个真正的伟大计划。这可能觉得很多工作,而且哇,它是:很多程序出错了。失败计划的三个主要原因是:

  1. 纯粹从一个过程的角度跑来运行,并从你试图完成的现实中脱离,
  2. 纯粹从技术角度跑来跑去,以为你可以跳过倡导你的目标的基本步骤,并听取你想要激励的人,
  3. 试图涵盖两个观点作为一个人 - 不要独自走吧!

一个糟糕的计划是一种效率低下的效力:目标是正确的,但很少的资金达到预期目标。无论您如何决定衡量技术质量,最重要的是要在运营质量计划时要记住的最重要的事情是该计划不是目标。目标是创造技术质量。组织计划是大规模的,建立如此多的动力,惯性在他们停止工作后漫长的惯性推动它们。保持您的计划足以取消,并保持自我关键足以取消它停止推动质量创造。

开始小并慢慢添加

当您意识到您的实际技术质量落后于您的目标技术质量时,自然的第一反应是恐慌,并开始推出一系列大量技术和解决方案。将所有成分倾倒到锅中,不可避免地,不起作用,更糟糕的是,你甚至不知道要保留哪些部件。

如果您发现自己与技术质量有努力 - 我们都做了,经常 - 然后从一个小的东西开始,并在它工作之前迭代它。然后添加另一种技术,也迭代它。慢慢地建立了真正作品的东西,即使它意味着风化指控不够快。涉及复杂的系统和相互依赖性时,快速移动只是光学,它会缓慢移动,从而完成工作。