当前位置: 首页 > news >正文

血淋淋的BUG:波音在软件开发上错在哪里?

到了2019年,新飞机还会从天上掉毁,是一件让人不可想象的事情。然而这样的事情,最近接连发生了两起。

去年10月,一架波音 737 Max 8喷气式客机撞向印度尼西亚的爪哇海,造成189名乘客和机组人员死亡。调查人员称该飞机的飞行控制软件出现“故障”。

今年3月10日,也就是上周,埃塞俄比亚航空公司一架波音 737 MAX 8 客机在飞往肯尼亚首都内罗毕途中坠毁。飞机上载有149名乘客和8名机组人员。两次飞机出事的事故症状非常类似,所以有理由怀疑埃航这架飞机发生了同样的“软件故障”。

在经历了两次空难之后,波音公司承诺,最迟在下个月,针对全球所有波音737 Max型飞机进行软件更新。

迟迟修正不了的BUG

在狮航事故记录和波音发布的分析里,失事前几分钟,由于高攻角传感器(AOA)错误数据传给了飞控系统,导致飞机在正常情况下开始不断下压机头。飞行员在 11 分钟内连续手动拉升 20 余次终告失败,坠海罹难。

这个自动控制下压机头的系统,名叫 MCAS,意为自动纠正失速系统,这是波音 737 MAX 的一种操纵辅助系统。它有几个特点:

  1. 发现失速后,程序只相信主传感器,不与备份传感器核实。(同样的情况空客的飞机则会交给飞行员处理。)
  2. 一旦相信,不通知飞行员,直接操纵机翼。
  3. 飞行员手动操作后,仍旧会每五秒自动执行,让飞行员不得不与飞机较劲。
  4. 程序开关非常隐蔽。

狮航事故后,波音表示正在进行软件修复,以降低风险。

Boeing is working on a software fix, according to industry and government officials, that would likely mitigate risks. On Saturday, the company went further than before in spelling out dangers pilots can face if they misinterpret or respond too slowly to counter automated commands.

从技术角度来说,这是个很容易修正的低级错误。全球几百架运行着的波音 737 MAX 8/9等着打这个补丁。然而,这个修复被拖延了好几个月,直到埃航事故发生。

延误的原因,其中之一是联邦官员和波音公司安全专家对于需要进行多大改动,有意见分歧。波音公司认为更新这个BUG很简单,减少下压幅度就行。而联邦官员认为189条人命是大事情,必须大改,确保单个传感器错误信号不会触发MCAS系统。加上波音公司和美国政府的低效,这个性命攸关的BUG,硬生生被拖到四个月后。

但显然因为这次全球停飞事件,波音才很快决定“Make Key Change in 737“,并宣布将在4月份交付。

\"image\"

波音 737 MAX的交付

对于安全要求严格的航空软件,波音要求每个需求都能追溯到相应的代码行。反之亦然。也就是说每行代码发生变化,必须能追溯到软件的设计文档。但是狮航事故后,媒体披露航空公司的管理层和飞行员并不知道飞机上还有这么一套辅助系统。APA航空发言人Dennis Tajer曾表示,MCAS系统的细节“对我们而言是新信息”,“我们的手册中没有提到它”。而且该航空还没有相应模拟器,他说他从旧的737 NG驾驶舱到新的737 MAX,只在iPad上进行一小时训练。

\"image\"

软件外包和成本压缩

波音公司在2010年曾发布了1000份裁员通知,而这些被裁减的人大部分在IT部门。该公司当时拥有158,500名员工,其中包括18,000名工程和技术人员,但他们计划是削减10,000个工作岗位。一位前波音软件工程师在2015年表示,企业将裁掉90%经过了熟练培训的员工,用“外包”来代替他们,从而缩减开支。据《经济时代》报道,2015这一年,波音公司给印度的外包业务翻了一番,达到了5亿美元。

\"image\"

软件外包是一个需要发包方和承包方高度协作的过程。服务周期长、可变因素多,这使得公司在软件外包过程中面临重大风险。787型飞机计划70%使用外包,最终导致了延期三年还交付不了,波音表示:“我们同时在技术、工具和供应链上做了太多改变,超出了我们的管理能力“。

使用Ada语言达到 99%

在Ada文档中的最佳案例上,有一个案例是讲波音777上的软件99%是用Ada完成,其中制动系统完全用Ada来完成。Ada语言最早是针对嵌入式和实时系统设计的,属于80年代的编程语言,也是美国军方的专用计算机语言。但之后并没有被普及,甚至可以说Ada 在“平民层”的推广很糟糕。一个普遍的关于欧洲空间局阿丽亚娜5型运载火箭失败的说法是,因为Ada语言在编译过程的检查失败导致的。那么有一个疑问是外包企业中,如何搜集到合适数量的精通Ada的程序员呢?

\"image\"

从求职网站前雇员对波音公司的评价中,除了抱怨Ada不好用,我们还得到了好几条令人惊讶的信息:

  1. 波音公司没有技术面试。
  2. 采购软件可能需要非常长时间。被多人抱怨技术过时,“使用古老的技术,该公司根本不重视升级或现代化工程,因为这些不能直接帮助他们销售飞机”。
  3. 管理层不懂IT技术,脱节明显,甚至有的视工程技术人员为累赘。

波音公司具有上百年的历史,具有7000多种自主开发软件,有非常多的经验可以供人参考,当然也有很多教训可让人汲取。作为传统企业数字化转型的先驱,它出现的每一个问题都值得我们去思考。那么你认为波音在软件开发中犯的致命错误是什么呢,不妨在文章后留言讨论。

延伸阅读:
波音 737 事故,软件化要不要“背锅”?


当金融、汽车、制造、零售等传统行业的产业互联网进程逐渐加快时,我们也不会无动于衷。把先进的软件技术介绍给更多传统行业,关注和挖掘传统行业优秀的技术实践是我们的使命。如果你对产业互联网的实践经验有兴趣,欢迎扫描以下二维码,进群与我们交流。

\"\"

相关文章:

  • Python安装常见问题(1):zipimport.ZipImportError: can't decompress data
  • 当今软件发展的现状非常适合 Cloud Native 环境
  • Leetcode PHP题解--D8 832. Flipping an Image
  • Aspx 网页跳转方法 摘要一个大佬的自用
  • 四、RabbitMQ3.7在CentOS7下的安装
  • SpringCloud SpringBoot mybatis分布式微服务云架构返回JSON格式
  • node.js学习笔记
  • leetCode笔记--(1)
  • 致学习java同学奔三的90后:蹦最嗨的深夜迪,喝着啤酒配枸杞。
  • Exchange 2010/2016服务器远程重启命令
  • JVM的类加载机制
  • 一分钟带你弄懂闭包
  • 自建Kubernetes的LoadBalancer类型服务方案-MetalLB
  • global.min.css 页面通用样式
  • 腾讯服务大规模宕机:系上海网络运营商光纤故障
  • Android Studio:GIT提交项目到远程仓库
  • github从入门到放弃(1)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript-Array类型
  • LeetCode算法系列_0891_子序列宽度之和
  • markdown编辑器简评
  • session共享问题解决方案
  • 记一次删除Git记录中的大文件的过程
  • 使用权重正则化较少模型过拟合
  • 微服务入门【系列视频课程】
  • 小程序 setData 学问多
  • 数据可视化之下发图实践
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #DBA杂记1
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (一)appium-desktop定位元素原理
  • 、写入Shellcode到注册表上线
  • .NET Project Open Day(2011.11.13)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .sdf和.msp文件读取
  • @angular/cli项目构建--Dynamic.Form
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [Angular 基础] - 指令(directives)
  • [Angular] 笔记 20:NgContent
  • [ASP]青辰网络考试管理系统NES X3.5
  • [Assignment] C++1
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [BZOJ 1040] 骑士
  • [C++]AVL树怎么转
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [FT]chatglm2微调
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [hdu4622 Reincarnation]后缀数组
  • [HJ56 完全数计算]
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!