计算机系统的历史也是错误的历史,包括史诗性的,灾难性的错误 ,这些错误已导致数百万美元的损失, 毁灭甚至死亡 ,以及许多其他不那么引人注目但昂贵的系统和项目故障。 其中一些似乎是小而愚蠢的错误,例如臭名昭​​著的Ariane 5火箭坠毁 ,是由于单行编程错误引起的。 但是,单行编程错误或任何其他孤立的错误或故障,不会在没有架构和设计上的基本故障以及管理上的故障的情况下对大型系统造成严重损害。


波音787梦幻客机无处可去

经济学家,2013年2月26日

这些问题就是Barry Boehm所称的“ 体系结构破坏者 ”:当您首先面对基本的弱点或对使用这种方法可能发生的事情进行严格限制时,系统的设计在现实世界中就不会成立。您选择的技术平台。

架构破坏者发生在设计的边缘(或超出边缘),偏离正常,正常, 愉快的道路 。 该系统正常工作,除了“百万分之一”的特殊错误,除非每隔几天就发生“百万分之一”的问题,否则没人会认真对待。 否则,系统会在需求激增的情况下崩溃,除非您无法找到一种方法来快速扩展系统以保持正常运行,否则需求将不会消失–如果无法解决,您将没有解决方案。不再有需求问题,因为这些客户不会再回来了。 或者看似很小的操作问题原来是系统中基本可靠性或安全性问题的第一个迹象。


有关安全性的问题使Dreamliner陷入困境

纽约时报,2013年1月10日

寻找架构破坏者

它以讨厌的错误或孤立的操作问题或安全事件开始。 随着研究的深入,您会发现更多的情况,设计上的漏洞,对系统功能的严格限制或无法解释且无法阻止的故障。 随着每个问题引发另一个问题,设计开始瓦解。 正确地解决它会花费时间和金钱,甚至可能要花些时间重新审视基础架构决策和技术选择。 看起来像是随机故障或丑陋的错误变成了丑陋得多的东西,而且价格昂贵得多。


波音787危机加深

纽约时报,2013年1月17日

使这些问题特别糟糕的是,通常在系统已经投入生产并且您有很多真正的客户使用它来完成实际工作时,发现它们的时间很晚,超过设计甚至是验收测试。 这是您最无法承受遇到严重问题的时间。 当某件事确实出现问题时,可能很难立即意识到它的严重性。 您可能需要经历两三个或三个以上的失败,然后才能意识到并接受真正的糟糕情况,并且您没有足够的模式来了解问题可能出在哪里。


波音电池在事故发生前十次失效

彭博社,2013年1月30日

到那时,您可能会失去客户并损失资金,并且承受着巨大的压力来提出解决方案,而没人想听到您必须停下来回去重写系统的一部分,或者重新架构它然后重新开始–或者您需要更多时间思考和测试并了解问题所在以及所采取的措施,然后您甚至可以告诉他们可能需要花费多长时间以及花费多少钱才能解决问题。


波音787飞机在全球各地的监管机构

纽约时报,2013年1月18日

有什么可以破坏您的体系结构?

大多数体系结构破坏者是系统重要非功能性方面的基本问题:

  • 稳定性和数据完整性:系统运行了数小时,数天或数周后,系统的某些部分将无法承受负载或间歇性故障,或者丢失了重要的客户数据,或者无法足够快地恢复和恢复服务操作失败后。
  • 可扩展性和吞吐量:平台(语言,容器,通信结构或数据库,或所有这些)使用起来很漂亮,但即使有更多的硬件投入,也无法跟上更多客户的需求。 向Twitter查询有关尝试扩展Ruby或Facebook的有关PHP扩展或任何曾经尝试扩展Oracle RAC的人员的信息。
  • 延迟-实时响应时间/截止日期满意度的要求不断提高,或者您陷入不可接受的抖动和可变性中(选择Java作为运行时平台,GC启动后会发生什么?)。
  • 安全性:您刚刚被黑客入侵,并且发现攻击者利用的一个错误只是需要发现和修复的数百个或数千个错误中的第一个,因为您的设计或所选择的语言和框架(或您的使用方式)就像瑞士奶酪一样充满安全漏洞。

这些问题可能来自对底层平台技术或框架实际上可以做什么的误解—该架构或技术的设计公差是多少。 或者是由于完全丢失,忽略,忽略或误解了设计的重要方面。

这些并不是您可以编写出自己的方法的问题,至少不容易。 有时,问题不是您的代码以任何方式出现的:它是第三方平台技术无法跟上或不会跟上。 语言本身,或堆栈的重要组成部分(如容器,数据库或通信结构),或者群集和故障转移或执行其他操作所依赖的语言。 在现实世界中,几乎任何其他人编写的软件都可能并且将无法满足您的实际需求或供应商的承诺。


波音公司787电池供应商的修复可能性不高

华尔街日报,2013年2月27日

您将不得不花费时间与供应商(或有时与多个供应商)合作,帮助他们理解您的问题,并使他们同意这确实是他们的问题,他们必须解决它,如果可以的话不能解决它,或者不能足够快地解决它,您需要快速提出计划B,并希望您的新选择不会遇到其他可能同样或什至更糟的问题。

如何避免架构破坏者

破坏体系结构是由您做出的决策过早而出错–或您做得不够早或根本没有做出决定的。 勃姆(Boehm) 谈到架构破坏者是反对简单设计的论点的一部分–许多团队, 尤其是敏捷团队 ,花太多的时间专注于幸福的道路 ,建立新的功能以使客户满意,而没有足够的时间进行前期的架构和思考关于可能出问题的地方。 但是Architecture Breakers比敏捷和简单的设计要长得多:在制作软件 (第10章架构设计:多少和什么时候)中,Boehm可以追溯到1980年代,当时他第一次意识到这些问题,当时是结构化编程,后来是Waterfall。是做事的“正确方法”。

Boehm的解决方案是通过Spiral软件开发获得越来越多的体系结构定义和技术风险管理:一个具有体系结构的生命周期,可以预先识别风险区域,然后通过迭代,风险驱动的设计,原型开发和多个阶段进行探索。 螺旋开发就像今天的基于类固醇的迭代增量开发方法一样 ,使用基于风险的体系结构峰值 ,但是迭代开发和技术原型开发周期更长,更加正式的风险管理,更多的计划,更多的书面工作以及更高的成本。

通过在架构和技术风险管理上花更多的时间,不能解决所有这些问题,无论是通过螺旋开发还是加强, 纪律严明的敏捷开发方法。 如果您对可伸缩性,响应性,可靠性或安全性做出过幼稚的假设,那么花在前端的更多时间将无济于事。 或者如果您对这些问题的理解不够深刻,无法确定风险。 不会在设计评论中找到“体系结构破坏者”-因为您将不会寻找自己不知道会出现问题的东西-除非您正在运行诸如FMEA(故障模式和效果分析)之类的结构化故障建模练习或FMECA(故障模式,影响和严重性分析) ,这迫使您提出一些棘手的问题,但是,受监管行业之外很少有人听说过。

而且,即使即使以这种方式发现的所有错误都被认真对待(因为这些),架构破坏者也无法全神贯注于测试 ,甚至无法进行 长寿/浸泡测试 ,广泛的模糊 测试和模拟故障以及故障注入,破坏性测试和压力测试。各种极端测试通常被认为是不现实的)。

您必须准备好应对Architecture Breakers。 预见问题并使用类似分区的架构稳定性模式在迈克尔·尼加德的优秀图书版本吧! 至少可以防止严重的运行时错误扩散并破坏整个系统(这些策略也将有助于扩展并遏制安全攻击)。 而且,如果在检查,测试或生产中确实看到“一次百万分之一”的错误,请了解它的严重性并立即采取行动-在Dreamliner变成噩梦之前。

参考: 破坏体系的Bug –当Dreamliner成为我们JCG合作伙伴 Jim Bird在Building Real Software博客上的噩梦时 。

翻译自: https://www.javacodegeeks.com/2013/04/architecture-breaking-bugs-when-a-dreamliner-becomes-a-nightmare.html

突破体系结构的错误–当Dreamliner成为噩梦时相关推荐

  1. win10_x64更新错误解决: 安装一些更新时出现问题,但我们稍后会重试。如果持续出现这些问题,并且你想要搜索Web或联系支持人员以获取相关信息,以下信息可能会对你有帮助:

    win10_x64更新错误解决: 安装一些更新时出现问题,但我们稍后会重试.如果持续出现这些问题,并且你想要搜索Web或联系支持人员以获取相关信息,以下信息可能会对你有帮助: 参考文章: (1)win ...

  2. .Net Framework 4.5.1 ASP.NET MVC 5 下新建视图报“错误 运行所选代码生成器时出错 无法检索元数据 没有为该对象定义无参数构造函数”...

    当在控制器中新建视图的时候,选择的视图界面如下: 执行添加后报如下错误: 错误的内容为: 错误 运行所选代码生成器时出错 无法检索"XXX"的元数据 没有为该对象定义无参数构造函数 ...

  3. java中常见的编译错误的是_编译时JAVA最常见的错误有哪些

    如果你正学习Java语言,你在编译和执行代码的时候遇到问题,一般来说问题将分为2类:无论你遇到的是编译时错误,这说明你的程序编译失败,还是你遇到运行时错误,这是指错误发生在你成功地编译了程序但不能运行 ...

  4. 错误1919配置ODBC数据源时发生错误Visio database samples,ODBC错误6:部件在注册

    错误1919配置ODBC数据源时发生错误Visio database samples,ODBC错误6:部件在注册...后面一长串..修复好了,也忘记具体后面写的什么了.直接说解决办法: 参考https ...

  5. Google Chrome 更新失败(错误:3)检查更新时出错

    现在 Google Chrome 的稳定版都已经发布 39.0 版本了,我机上还是 31, 本想在线更新一下,结果点击菜单项中的"关于 Google Chrome"后,进入的界面提 ...

  6. linux安装源文件出现错误,编译安装源码时出现错误的解决方法

    由于软件更新速度比较快,所以我们经常需要自己动手去编译安装一个软件,但是编译安装时难免不出现错误,像LAMP,LNMP在好多平台我都是手动编译的,也出现过不少错误,以下总结编译安装出现错误时的解决方法 ...

  7. 错误记录一:线程通信时抛出Exception in thread “Thread-0” java.lang.IllegalMonitorStateException异常

    错误记录一:线程通信时抛出Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 完整异常: ...

  8. 错误: 加载主类 时出现 LinkageError 解决办法

    错误: 加载主类 时出现 LinkageError 解决办法 在导入本地项目,运行的时候,发生了错误: 加载主类 时出现 LinkageError 的错误,搜索了很多种方法,都没有办法解决,后来,自己 ...

  9. oracle 39083错误,Oracle数据库导入导出时,ORA-39083;ORA-00439错误解决思路

    ORA-39083: Object type TABLE:"TEST"."TEST_SS_NAME" failed to create with error: ...

  10. 3704对象关闭时_错误号:3704 错误描述:对象关闭时,不允许操作

    本文关键详细介绍了错误号:3704 错误描述:对象关掉时,不允许实际操作,必须的盆友能够参照下 "错误号:3704 错误描述:对象关掉时,不允许实际操作.sql=select top 10 ...

最新文章

  1. 深度理解目标检测(MMdetection)-HOOK机制
  2. redis常用数据结构解析
  3. Nodejs扩展,实现消息弹窗
  4. 11个顶级 JavaScript 日历插件
  5. C++中const关键字的使用总结
  6. 基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档
  7. 记一次git amend事故处理方案
  8. 30年前的中专相当于现在什么学历?比现在一本厉害吗?
  9. 关于音频PCM数据2字节(16位)byte与64位double之间的转换
  10. 九大厂商联合推出「快应用」,围攻微信?
  11. Vue:带参数函数在传递参数的同时传递事件对象
  12. PowerDesigner下载、安装配置
  13. 黑苹果开启文件保险箱之完全教程
  14. 从教女儿下棋谈启蒙教育
  15. 2021年阳江市高考成绩查询,阳江市召开2020年高考总结暨2021年新高考备考动员会...
  16. 2020年计算机考研408操作系统真题(客观题)
  17. 小福利,python内置map函数和lambda函数运用
  18. JSTL引发的内存泄露
  19. 2020 CSP-J2题目
  20. 极限编程-拥抱变化阅读感想(二)

热门文章

  1. html京东 重置代码,拟写京东登录界面(HTML - CSS)
  2. [TensorFlow深度学习深入]实战一·使用embedding_lookup模块对Word2Vec训练保存与简单使用
  3. 高级软件程序员养成记
  4. 解决ERROR: text file '***' contains disallowed UTF-8 whitespace character(s)
  5. GIS(地理信息系统)
  6. 温度报警器c语言课程设计,综合电子设计课程设计实验报告-可调温度报警器.doc...
  7. ES2015 ES2016 ES2017 Javascript的关系是什么?
  8. 不玩手机的步步高玩大数据:一条短信让你多买一只澳洲大龙虾
  9. Nvidia xavier NX通过flash.sh烧录linux系统
  10. 2549. 删除他们! 解题报告