
回收不合理的软件。
建筑(30)泥浆在二十多年前出版,同样真实的戒指:成功的增长阶段公司的最突出的架构是非建筑。快速修复的混沌卷须缓慢地覆盖清晰的模式,以及生产率爬向零。
经过零几年,许多公司转向盛大迁移模式并重写他们的软件。这些重写是非常具有挑战性的并且经常落下。
另一种路径,我写的你不能理解泥浆,是停止推理您的软件,而是转向实证实验以指导软件更改。实验比重写更加一致的结果,但受到相当慢的结果。
在这里我将尝试绘出第三条路径:回收通过验证的行为和断言属性不合理的软件。这种方法是实验和重写的替代方案,以及用于维护合理软件的一般框架。
优秀的杰西卡克尔写道让理由行为关于这些想法也是如此。
黄金时代&ococalypse
一些软件从未成功地解决了它冒险解决的域名,并且良好的新闻至少有你从不需要维护这种软件,因为维护是为了宝贵的东西。
如果您的软件确实成功地解决了问题域,那么它就会成为黄金时代软件。黄金时代软件在最好的情况下是最好的软件。维持它的团队是设计它,密切熟悉其所有怪癖的团队。它解决的问题主要是它旨在解决的问题,在它旨在满足的限制内。
在某些时候,您将找到对软件非常优雅的扩展,允许您解决一个不属于原始设计的重要新问题。这个解决方案将是验证软件的灵活性的验证,但回想起来,你会意识到这是黄金时代的开始:优雅的解决该来说,预说无法对软件的推理不断增长。
时间促进复杂性和衰变软件。团队衰减也是如此,人们向其他项目和公司推开。在某些时候,你会抬头并意识到你在维护后世界软件其演变已成为“丧失技术”,令人振奋的操作或延伸。您有一本旨在允许它继续转向的咒语,但没有人舒服地做出有意义的变化。
重写或回收
只知道的抽象神商业价值不关心您的软件是否易于推理,但它确保您释放新功能的能力并操作您的软件足以保留用户。在某些时候,速度减慢将成为这您在规划和战略会议上进行了讨论,一个响亮的克制:现状不起作用。
此时,许多甚至大多数公司都选择改写他们的软件。将其标记为丢失的原因,设计更换,并进行体贴迁移计划尽量减少风险。(有时将新风险拉到投资组合风险中,例如从单块到A的移动服务型建筑。)
但是,我越来越有信心重写是不可避免的,而且你可以故意回收通过在行为和属性中不断发展的情况,已经进入其后期阶段的软件。
信仰和财产
后期软件软件很难修改,因为它不会以可预测的方式行事,而是只有信仰关于它的工作原理。您可能对您的软件可能有些信念:
- 由HTTP请求引起的所有状态更改都是原始的。
- 进程始终尝试在从MySQL读取之前从Redis读取状态。
- 写入后读取只有在主服务器上执行时才安全,并且在当前时间大于写入时的时间加上当前的复制滞后之后,否则是不安全的。
- 进程没有状态,因此无论哪个过程处理它们,都会正确处理请求。
这很难根据信仰编写软件,因为他们经常是错的,所以你最终必须经验验证你的解决方案,一步一步。或者只是失败了一堆,我会说是一种非常缓慢,无向的经验验证形式。
我们通过转动每次进行不合理的软件信仰进入任何一个行为或者财产。行为是否可以针对环境验证的软件的各个方面。特性是可以静态或通过当地锻炼可以验证的软件的各个方面。
这里的区别有点细微,您可能会发现您的行为是另一家公司的属性,反之亦然。通过示例探索区别:
- “每个文件至少有一个测试”是A.财产您可以在构建服务器上执行。
- “99.99%的请求在两秒钟内完成”是A.行为您可以在生产环境中监控。
- “每个执行分支都是通过测试行使的”是A.财产因为可以通过在主机上运行覆盖测试或构建主机来验证它。它不需要锻炼环境。
- “写入后的所有读取都针对主数据库执行”大多数公司将通过(a)记录和验证日志中的行为或(b)的行为是一种实时断言,这两者都会使其变得错误的实时断言行为。
- “每个请求的状态突变在单个事务中处理”是您可以通过将所有突变迫使到具有适当原子学的受限界面静态验证的东西,这使得它成为一个财产。然后,一些公司可能不愿意在这种程度上限制行为,而是可能会监控每个请求的交易数量,这将成为它行为。
让我们进一步进一步发展这种分类学。有三个有趣的渐变行为:
- 观察到的行为是您可以在日志,指标或仪表板中注意到的那些。
- 跟踪行为是那些你在改变时会得到通知的那些,但只有在环境中运行更新的软件后,例如警报通知您增加生产延迟。
- 验证的行为是您可以依赖的行为持续真实,因为有一个及时的机制,可以在部署完成之前确保它们。确保行为的三种最常见的机制是:(a)端到端集成测试,(b)故障注入,常规触发相关的故障模式,(c)在完成部署之前验证软件的负载或性能测试。
虽然确认是有点烦人的验证的行为因为他们需要尝试的部署,所以围绕它们设计很容易,因为你可以自信他们保持真实。追踪行为很有意思,因为他们应该易于设计(毕竟是追踪的!),但随着时间的推移,往往会降低专用组织计划确保团队修复回归。大多数公司都没有为所有相关行为提供这样的程序,因此在实践中,他们仍然很难设计,并且在可以在进行预期的更改之前,在跟踪行为中的修复回归时,每个架构更改都是预先进行的。
类似的渐变适用于特性:
- 预期属性是那些你要求人们在他们的软件中维护的人,通常通过设计评价,培训,最佳实践文件等传播。
- 跟踪属性是那些报告但没有执法机制。代码覆盖范围落入许多公司的此类别,他们报告更改但不要阻止部署。
- 断言性质在部署之前强制执行,通常通过静态分析,代码列或单元测试。
What I find particularly interesting about properties is that at their worst they are misleading and harmful – who hasn’t been in a conversation where someone bemoans a team not properly observing an undocumented but intended property – and at their best they are the easiest to design around and provide by far the best development experience.
在比较动态和静态类型的编程语言之间的大型码级生产率时,对行为(即使在其验证最佳状态下)的效率优势是最明显的。静态类型的语言提供了几个类别的异常错误的直接反馈循环,否则会要求完整部署周期。
绝大多数公司出现了零验证的行为和近距离断言的属性,但这并不是因为这尤其具有挑战性,这只是他们从未考虑过它有多强大,他们可以理解他们的软件。
相反,能够维持执行速度的最长寿命的公司具有大量验证的行为或断言性能,并且通常都是两者。每家公司都被允许重写一次,但之后您必须学习如何回收软件。
软件填写
返回您的后期软件软件:如何重新获得更改的信心?列出您需要的所有信念,以便在修改软件方面有信心,然后为每种信念传达信仰和财产阶梯的方法。
You get the best results by evolving beliefs into asserted properties, followed by verified behaviors, but there is a surprising amount of value to moving them into tracked behaviors or properties as well, as it helps you understand the level of effort that’ll be required before you can begin reasoning about your software again.
如果记分卡足够低,那么你知道重新重新重写软件比重写更容易。如果它足够高,那么也许重写真的会更容易。
这里的方法不仅适用于回收软件,它是首先对推理回归的判断软件的有用方式。预防仍然是最好的修复。