前言
前面两篇文章分别介绍了可靠性和可扩展性,本篇文章将介绍了第三个特性:可维护性。
软件设计三原则
软件开发的大部分成本并不在最初的开发阶段,而是在于整个生命周期内持续的投入。良好的软件设计方式可以最大限度的减少维护过程中的痛点。
软件系统的三个设计原则是:
可运维性:方便运营团队来保持系统平稳运行。
简单性:简化系统复杂化,使后续的工程师能够轻松理解系统。
可演化性:后续工程师能够轻松地对系统进行更改,并随着需求的变化而将其适配到非典型的场景。也被称为可延伸性、易修改性或可塑性。
可运维性:运维更轻松
“良好的操作性经常可以化解软件的局限性,而不规范的操作则可以轻松击垮软件。”
操作系统对于保持软件系统顺利运行至关重要。如果系统使日常任务变得容易,则可以使运营团队将精力集中在高价值活动上,从而具有良好的可操作性。数据系统可以执行以下操作以使日常任务变得容易,例如:
- 提供良好的系统监控和系统运行时行为和可观测性
- 支持自动化,与标准工具集成
- 避免绑定特定的机器,这样在系统不间断运行的同时,允许机器停机维护
- 提供良好的文档和易于理解的操作模式(“如果我做了 X,会发生 Y”)
- 尝试自我修复,在必要的让管理员手动控制系统状态
- 提供良好的默认配置,且允许管理员在需要时方便地修改默认值
- 行为可预测,减少意外发生
简单性:简化复杂度
复杂性有如下各种各样的表现方式:
- 状态空间的膨胀
- 模块紧耦合
- 令人纠结的相互依赖关系
- 不一致的命名和术语
- 为了性能而采取的特殊处理
- 为解决某特定问题而引入的特殊框架等
降低复杂性可提高软件可维护性,这就是为什么简单性应该成为我们构建的系统的关键目标的原因。这不一定是指降低系统功能,这也可能意味着降低意外复杂性。如果软件解决的问题(如用户所见),但仅源于实现,复杂性是偶然的。
抽象是消除意外复杂性最好手段之一。 一个好的设计抽象可以隐藏大量的实现细节,并对外提供干净、 易懂的接口。 一个好的设计抽象可用千各种不同的应用程序。 这样, 复用远比多次重复实现更有效率;
另一方面, 也带来更高质量的软件, 而质量过硬的抽象组件所带来的好处, 可以使运行其上的所有应用轻松获益。
可演化性:易于改变
系统需求不断变化,我们必须确保我们能够处理这些更改。敏捷社区还发布了很多技术工具和模式,以帮助在频繁变化的环境中开发软件,例如测试驱动开发(TDD)和重构。
简单易懂的系统往往比复杂的系统更容易修改。
总结
一个应用程序必须满足预期的多种需求,主要包括功能和非功能性要求。
- 功能: 应该做什么,例如允许以各种方式存储,检索,搜索和处理数据。
- 无功能:常规特性,例如安全性,可靠性,合规性,可伸缩性,兼容性和可维护性。
本笔记重点介绍了可靠性、可扩展性和可维护性。
- 可靠性意味着即使发生故障,系统也能正常工作。
- 可扩展性意味着当负载增加时,有效保持系统的性能良好。
- 可维护性意味着许多方面,但究其本质上是为了让工程和运营团队更为轻松。良好的抽象可以帮助降低复杂性,并使系统更易于修改和适配新场景。良好的可操作性意味着对系统健康状况有良好的可观测性和有效的管理方法。