可维护性软件的大部分成本不是在最初的开发阶段,而是在整个生命周期的持续投入中,包括维护和错误修复,监控系统以维持正常运行,故障排除,适配新平台,匹配新场景,改进技术缺陷,增加新功能。不幸的是,许多程序员不喜欢维护这些所谓的遗留系统,例如修复其他人埋下的错误或使用过时的开发平台或被迫做他们不喜欢的工作。每个遗留系统都有过时的原因,因此很难就如何处理它们给出一般性建议。但从另一个角度来说,从软件设计的时候就可以考虑,尽可能减少维护期的麻烦,甚至可以避免创建一个容易过期的系统。为此,需要特别注意软件系统的三个设计原则:可操作性,方便运维团队保持系统平稳运行。简单性简化了系统的复杂性,使新工程师更容易理解系统。请注意,这与API的简单性不同。进化能力。后续开发可以根据不断变化的需求轻松改进系统,使其适应非典型场景。它也称为可扩展性、易于修改或可塑性。相似的可靠性、可扩展性Scalability,没有简单的解决方案来实现这些目标。但是我们仍然需要首先建立对这三个特征的理解。1、可操作性:更易运维“良好的可操作性往往能化解软件的局限性,不规范的操作容易打败软件。”虽然某些操作可以而且应该自动化,但最终还是需要人工来执行配置并确保其正常工作。运营团队对于保持软件系统平稳运行至关重要。一个好的团队通常至少负责:监控系统的健康状况,并在服务处于异常状态时快速恢复服务跟踪问题的原因,例如系统故障或性能下降使软件和平台保持最新-日期,如安全补丁执行破坏性操作以预测未来可能出现的问题并在它们发生之前解决它们(例如,大促销前的整机扩展)建立用于部署、配置管理等的良好实践规范和工具包执行复杂的维护任务,例如将应用程序从一个平台迁移到另一个平台为部署、配置管理等建立良好实践规范,并在工具包配置更改时保持系统稳定性开发流程以标准化操作行为并保持生产环境稳定和相关知识继承(例如了解系统),及时审查和存档。如果团队成员离开或新员工加入,良好的可操作性意味着日常工作变得简单,使运维团队可以专注于更高附加值的工作。数据系统设计可以在这方面做出很多贡献,包括:提供系统运行时行为和内部的可观察性,促进监控支持自动化,与标准工具集成以避免绑定特定机器,以便在整个系统持续运行的同时,允许机器停机用于维护提供良好的文档和易于理解的操作模式,例如“如果我做X,Y就会发生”提供良好的默认配置并允许管理员在需要时轻松修改默认值尝试自我修复,在需要时让管理员手动控制系统状态行为是可预测的,以减少事故2.简单:化繁为简小的软件项目通常可以写出简单而漂亮的代码,但是随着项目变大,它变得越来越复杂和难以理解。这种复杂性拖慢了后续的开发效率,增加了维护成本。过于复杂的软件项目被称为BigMire。复杂性以各种方式出现:状态空间膨胀模块紧密耦合纠结的相互依赖性不一致的命名法和术语对性能的特殊处理为解决特定问题而引入的特殊框架使维护变得越来越困难它变得越来越困难,最终导致预算超支和开发进度滞后。对于复杂的软件系统,由于变更而引入潜在错误的风险将显着增加,开发人员将更加难以准确理解、评估或忽略相关系统行为,包括底层假设、潜在后果和外部模块交互设计。等待。降低复杂性可以大大提高软件的可维护性,因此简单性应该是构建系统的关键目标之一。简化系统设计并不意味着减少系统功能,而是意味着消除偶然的复杂性。一些大佬将复杂性定义为一种“意外”,即它不是软件固有的,用户看到或感知到的,而是实现本身出现的问题。消除意外复杂性的最佳方法之一是抽象。好的设计抽象:可以隐藏很多实现细节,为各种应用提供清晰易懂的API。这样一来,重用远比重复实现效率更高,并带来更高质量的软件,而高质量抽象组件的好处很容易让运行在其上的所有应用程序受益。例如,高级编程语言作为一种抽象,隐藏了汇编、CPU寄存器、系统调用等细节和复杂性。SQL作为一种抽象,隐藏了内部复杂的磁盘和内存数据结构、多个客户端的并发请求以及系统崩溃后的不一致性。当然,使用高级编程语言最终也没有脱离汇编代码,只是没有直接使用而已。和汇编代码打交道的东西,已经被编程语言抽象成了高效的接口来代替我们。但是设计好的抽象是具有挑战性的。在分布式系统领域,虽然有很多好的算法可供参考,但往往不清楚如何使用它们,将它们封装成抽象接口,最终帮助将系统的复杂度降低到可靠的控制水平。在日常开发中,我们可以广泛地审视如何设计好的抽象,让一个大系统至少可以抽象出一部分定义明确、可复用的组件,从而提高我们的年终业绩!可演化性:易于改变没有静态的系统需求,想法和目标不断变化:适应新的外部环境、新用例、业务优先级变化、用户要求新功能、新平台取代旧平台、法律或法规要求变化,业务增长驱动架构演进等。在组织和流程方面,敏捷开发模型为适应变化提供了很好的借鉴。敏捷社区还发布了许多技术工具和模式,以帮助在频繁变化的环境中开发软件,例如TDD和重构。大多数这些敏捷开发技术仅适用于小规模、本地模式(例如同一应用程序中的几个源代码文件)环境。我们需要在更大的数据系统层面探索提高敏捷性。系统是由多个具有不同特性的应用程序或服务协作形成的。我们的目标是轻松修改数据系统以适应不断变化的需求。这与简单性与抽象密切相关:简单易懂的系统往往比复杂的系统更容易修改。我们将使用不同的术语来表示数据系统级的敏捷性:可演化性。本文转载自微信公众号「JavaEdge」,可通过以下二维码关注。转载本文请联系JavaEdge公众号。
