领先技术

软件灾难: 恢复和预防战略

Dino Esposito

 

Dino Esposito
表现得很像明显,这听起来可能,我们的生活取决于软件。作为我们自己的各种服务的用户,我们知道很好地按预期方式工作的软件可能会真正保存我们的一天。但软件获取越来越复杂,因为它以模拟现实世界中的过程的复杂性。IT 经理、 架构师和开发人员必须对付的。

在本文中,我将回顾做法,帮助修复 deteriorated 的系统,并向您展示可能防止系统变得不受控制的方式的模式。术语"大球的 mud"(BBM) 来引用到的系统的很大程度上非结构化和填充的防静电与隐藏之间的依赖关系具有较大的数据和代码的重复数据消除和图层和顾虑的不清楚标识的零件,创建几年前 — spaghetti 代码时蛙鸣。若要阅读更多关于 BBM,我建议出色工作部分由 Brian Foote 和从大学的伊利诺斯Urbana-Champaign,在其中您可以从下载的约瑟夫山 Yoder http://bit.ly/nfPe2Y。在本白皮书中,作者不要 condemn BBM 曾经最严重问题; 他们只是建议设计师和开发人员可以准备面临 BBM 风险并了解如何使其保持在控制之下。

软件系统的动态特性

一些 30 年前,在开始软件时代,应用程序的编写于今天要容易得多。我们不需要的图形用户界面。我们也不必担心大部分美学,分发需要,可伸缩性问题或部署问题。而且,最后,但当然,我们必须要少得多的业务逻辑来实现。

此时,软件开发严肃和涉及精英。非常令人惊异,年代早期我们已有的大多数软件开发和体系结构原则和布局的模式。证明,很少被"发明了"以来。如问题和依赖项反转的分离的原则,如面向对象的编程 (OOP) 和长宽方向的范例做法,如设计为可测试性未开发和在最近几年。其中许多都被重新发现和应用的今天的设计师和开发人员,但它们存在数十年。

但是,为什么有这些原则和做法已位于中一种 limbo 年呢?可能有许多原因,但是是常见的开发人员注意,"它的工作,那么,为什么应该我改进它 (和支付的成本浪费的额外的时间)?"

Java 和 Microsoft 世界上不同的动态特性

九十年代中期-,对象方向和语言 (如 Java (超过 c + +) 的出现系统提示您重新构建他们的软件,将超出数据库和大型机的业务逻辑的越来越大块移动的许多公司。Java 开发人员,特别是在企业领域,必须处理比通常与 Visual Basic 编程关联应用程序快速开发 (RAD) 中找到更大的复杂性。它不惊人的该方面的方向,相关性注入框架 (如弹簧) 和对象关系 (如休眠) 的 mappers — 更不必说的编程工具 (如 NUnit、 Ant、 Javadoc、 Maven 等等) 的长列表 — 来源于 Java 世界。它们是复杂性的由开发人员,以便开发人员能够平滑的影响的工具。

在同一时间,在 Visual Basic 世界中,RAD 时所有 rage。Visual Basic 帮助时不使用大型机代码生成存储过程的顶部 nice 前端的公司。Web 服务的出现创建额外的表面并提供大型机代码更好些名称"旧式服务"。

与过去的 RAD 辩论 OOP 15 年是合理的争用。当 Microsoft 推出了 Visual Basic 中的面向对象的新功能时,它是确实很难解释的开发人员为何地球上那些有点儿古怪的功能是如此重要。然后,他们实际上不,授予那些精简的应用程序的复杂性的相对较低级别。

。NET 革命

Microsoft 发布。NET 框架在关键的时候发生了变化。它发生时前面选择的 RAD 方法的大公司的一些有看到足够多的互联网和有时间还不够长关切表现形式新的 Internet 相关的业务流程重建的后端系统。同时,这些公司中找到的 Microsoft 平台可靠且可扩展的功能强大的框架。当然,花费只有几年。NET 开发人员淹没相同巨大数量的 Java 同事遇到在十年前的复杂性。大多数。NET 开发人员,不过,增至 RAD 原则和 RAD 的做法与开发。

在 RAD 的世界里,往往更喜欢使用的代码只需通过添加了通常处于独立块生成应用程序。(和时它们不真正独立,做出这种方式通过 abusing 代码和重复数据)。

问题并非与 RAD 作为编程范例。最有可能会导致恶劣的 BBM 真正的问题应用 RAD (或任何其他范例) 不可以保持增长的应用程序,并后续的复杂性,乘法的更正的情况下控制之下。

清除 BBM 的症状

它似乎是一项自然法律的编程的任意大小的软件的每个单元 (是它一个类、 一个图层或整个系统) 会降低。在其前面提到的白皮书中,Foote 和 Yoder 称之为"结构腐蚀"的软件。就个人而言,我喜欢调用它的软件 biodegradability。维护或更改软件设备时,它们变得难以进一步维护或更改。不管该名称,如今它只是一部分的交易 ; 您不能忽略它,并试图执行此操作将只会造成损失。

软件 biodegradability 紧密相连逐段增长的项目。合并到现有系统的新需求 — — 这在设计时还不该特定的要求的情况下 — — 是始终有问题。它并不意味着它不能,或不应该,完成 — — 它只是意味着通过添加了新的需求,您要更改上下文。单个更改通常没有显著地影响体系结构之上,但在系统的上下文时经常发生个别更改,随着时间推移而变化和 morphs 转化成可能需要不同的体系结构。此过程也称为要求改动。

同样,逐段增长属于交易,且未准备好应对的是现代软件体系结构的 deadly sins 之一。通过添加一次新的要求一不 reconsidering 系统作为一个整体在每个步骤的情况下,您可以创建 BBM 的理想条件。

何种常见症状正在明显地告诉您您将有得有点太多的 mud,您的系统的齿轮?BBM 不会获得一夜之间形成,并且不是在开始就大。解决这些症状,我将介绍,有助于防止它变得太大。

第一个警报电铃光环时在类中进行更改,并结束中断在另一台,显然不相关的类中的代码。这是严格的软件,特点是某种级别的更改,这最终确定回归阻力棘手的效果。

第二个报警电铃环中重用段显然可重用代码尝试失败时。如果相同的代码不起作用,一旦移到另一个项目,最可能的原因是硬查找依赖项或紧耦合的类。这些也是软件刚性的主要原因。

紧密耦合是有益的因为它可以帮助您更快地编写代码,该代码将可能运行得更快。它但是,不是,使代码易于维护。在逐段增长 (类似于绝大多数的今天的项目) 的项目中,可维护性是目前要考虑的主要软件属性。

最后,第三个警报铃声响起时您需要将一个修补程序应用于一个函数,但是没有把握中应用理想的修补程序 (或无法做到这一点),因此,另一个解决方法来重新排序。

这些症状出现一次 (或甚至是几个),高兴地能够经受住任何系统。尽管很 perverse,是其基础结构。如果您忽略这些症状之一,可能会使系统更错综复杂的风险。

例如,让我们来看第二个故障现象 (有时称为 immobility)。您必须添加一项新功能,您会非常确信可以略有调整和重新使用现有函数。您尝试,因为您希望的那样的类都是可重复使用,它就不能正常工作时,事实上,紧密连接到其他人。您有另一种导入多个模块中的函数更大集。这种情况下,常用 (但天真) 的解决方案不以往任何时候都尝试清洗器在重用类的情况下复制某些代码。重复的代码暂时,修复该问题,但会变得 BBM。

BBM 的可能原因

它是为单个开发人员创建 BBM 极少。BBM 有多种原因,而通常必须研究开发的当前级别之外的主要原因。要求苛刻的经理,以及客户并不真正知道他们希望传达给开发人员不清楚和明确的信息。除非团队具有足够的一般情况下遇到软件开发并在特定的域中,这样就可以自动获得任意选择相继固定通过威胁和解决方法。实际效果是削弱其作为基础的总体体系结构。

软件项目中的每个人都可以做很多以避免 BBM 并平滑其巨大的影响力。看一下您发现自己于 BBM 时要采取的基本步骤。

灾难恢复战略

当您面临着 BBM 时,idealistic 是只需重写基于已审阅的要求和新的体系结构选择的应用程序。但完全重写永远不会是一个选项,允许您考虑。如何在经受 mud 合并?

Foote 和 Yoder 引入仅合理的选项,必须在这些情况下使用 evocative 图像: 扫描在地毯下的 rubbish,并继续与您自己的生活。但我认为我可以总结为以下三个步骤软件灾难恢复战略。第一步停止任何新的开发。第二步隔离 sore 点到图层 (当没有分层) 和排列工具来测量那些点上的任何回归。最后,您拿起这些独立的问题图层的每个,万分谨慎,尝试重构它们更清晰和更松散耦合的体系结构。

Muddy 的项目,停止开发后,第二个您开始思考的一组相关的测试。于 BBM,您认为的最后一件事情是经典的单元测试。在此上下文中的相关测试是跨越多个图层和有时层的集成测试的排序。这些测试速度很慢的初衷,运行但 — 更重要的是 — — 他们可能写入较慢。您需要隔离的行为 (可能大) 块并可以通过测试已命令表面背后隐藏它们。编写表面可能不是很容易,但却通常至少可能发生。它是主要的时间和工作。这些测试是接下来的大有帮助,因为它们为您提供自动化的工具来测量回归,如在继续进行的最后一步。最后一步包含 painstaking 重构其中寻址的第一个问题是紧密耦合的工作。

规划一种战略来防止 BBM

预防总是比治疗更可取。有可能会使以后,我将介绍 BBM stalemate 小组的三个基数优点。考虑到大多数项目这些天的高级别要求改动拖累,逐段增长将是这一事实,而不仅仅是可能性。若要防止 BBM,必须具有一个有效的战略来对付逐段增长的功能。

维护软件的要诀索赔完美的现代软件为今天的需要提供服务,以及具有足够的灵活性,以适应未来的需求。正如前面提到个,第一个数据库是三的领域经验。当真正域专家不能对您的团队时,至少需要具有域深入了解的人 — — 这可能使您新的域专家。领域经验将您带到有关功能的最有可能将所需并请求明智的判断正确。因此,您可以轻松地提前制定计划时牢记 YAGNI (您 Ain't Gonna 需要它) 原则清楚。

协作责任类 (CRC) 卡方法帮助我更好地理解我遇到的第一次的域的结构。我看到 CRC 卡作为一种方式教自己的域,比拿出正确的设计一种方法更多。另一方面,设计,是由实际的客户验证的情况下,才正当的。使用案例 — 或者,更好的是,原型 — 更加智能化的选项。

原型可能会有问题,因为客户可能会喜欢,以免它们强制您以将其扩展而不是采用新的设计从头开始。与有意编写成快速和,在这种情况下,大都的原则和模式的 throwaway 代码通常由原型。只是不想 throwaway 代码的开头。

第二个数据库通过学习思维的软件开发和常见的最佳做法原则变得更好的开发人员/架构师。这里的挑战是都在学习如何在默认情况下正确执行简单的事情。不要害怕的基于接口的编程和依赖项注入。验证每个类针对常见 OOP 缺陷。确保通过代码和静态分析的正确性。如果您不确定有关功能的工作方式,使其可测试并编写测试。精益,这与大多数方法不再比几行保持您的代码 (带有截止例外,课程的)。如果这些做法将成为您工具胸部的一部分,BBM 会有点较远的位置停留远离您的项目。

第三个数据库,要了解项目的生命周期。不是每个项目都有建立持续数十年的系统。短期项目不需要相同的设计治疗。可以更快地进入它们并放入使它们处理后才能使它们正确的护理。在软件中,复杂性必须控制在它确实存在,不创建其中不存在,不应该。危险,但是,是通过令人惊讶的成功和需求,并创建一个市场失效初始提交项目有较短的时间跨越的观念。如果后续版本发生得太慢,则运行 snatching 市场竞争对手的风险 — — 或者您运行创建 BBM 由于要真正紧密 (和迫切) 的业务要求的风险。

软件项目灾难恢复

BBM 是常见的反模式,但是,在某种程度上,它是可应用于几乎每个软件项目的属性。它源自使用错误的工具来理顺复杂性。在本文中,我使用表达式 — 灾难恢复 — — 这就是在中常见 IT。要诀的灾难恢复专家,但是,可以应用于软件项目太: 预防中花费的美元数是值得多个恢复所花费的美元。您的经理办公室今天急!

Dino Esposito 是作者的"编程 Microsoft ASP。NET MVC"(微软出版社,2010年) 和 coauthor 的"Microsoft。NET: 构建企业应用程序"(微软出版社,2008年)。Esposito 定居于意大利,经常在世界各地的业内活动中发表演讲。有关他的情况,请访问 Twitter twitter.com/despos

这要归功于以下的技术专家审阅这篇文章: Mircea Trofin