波音再陷事故风波:软件测试走捷径导致载人飞船首飞失败

2020 年 3 月 02 日

波音再陷事故风波:软件测试走捷径导致载人飞船首飞失败

2 月 28 日,据外媒报道,此前波音公司为美国宇航局(NASA)研发的载人飞船“星际客机”(CST-100Starliner)发射升空失败的消息终于有了实锤:波音公司承认失败原因在于他们对“星际客机”的软件测试不充分,导致一个明显 Bug 未被检测出来。


这是这家拥有百年历史与强大工程实力的航天巨头,在 737MAX 空难风波后遭受的最新打击。


此前波音公司在软件设计、软件外包、研发管理等方面暴露出的问题不仅再一次被诟病,而且这次在软件测试上的错误又成了新的焦点。


一次被寄予厚望的飞行


北京时间 12 月 20 日 19 时 36 分,波音公司的新一代载人飞船“星际客机”自卡纳维拉尔角发射升空,执行该飞船的第一次飞行测试任务。按照计划,飞船在这次无人试飞中将与国际空间站对接,为宇航员送上圣诞礼物。


火箭的发射本来一切正常,飞船按计划被送入了远地点 192 千米、近地点 77 千米的亚轨道。


但是就在与火箭分离后,“星际客机”飞船上的一个关键设备出现了异常,我们可以简单理解为飞船的一个时钟错误,让飞船误以为自己正处于提升近地点的变轨过程中。


在预设程序里,变轨是需要很高精度的姿态和轨道控制的,因此“星际客机”飞船的 48 台姿轨控推力器开始疯狂工作,在短时间内消耗了大量燃料。


在下面的直播画面截图中,我们能清楚地看到飞船的多台推力器正在工作。



(任务控制中心直播截图)


在发现异常后,任务控制人员第一时间尝试向飞船注入正确指令,手动消除影响,但不凑巧的是,当时飞船正好处于两颗 TDRS 中继卫星的覆盖交接区,因此指令没有注入成功。


由于“星际客机”消耗了过多的燃料,与国际空间站的对接试验不得不取消,原定于 12 月 28 日返回的飞船不得不提前到 22 日返回地球。



(工作人员正在回收“星际客机”飞船)


最终,国际空间站的宇航员们没有等来 2019 年的圣诞礼物,“星际客机”也于北京时间 12 月 22 日 20 时 58 分在著名的白沙导弹靶场着陆。


小小计时器引发大问题


美国宇航局(NASA)局长布里登斯廷在随后的新闻发布会上总结说,原本飞船将通过“入轨点火”改变其行进轨道,与空间站会合,但当时用来控制飞船活动的自动计时器错估了任务阶段,导致飞船提早消耗了过多燃料,地面控制中心曾试图发出指令覆盖计时器的程序,但由于又出现了通信延迟,该指令最终没能追上燃料的消耗速度,与空间站的对接任务因此搁浅。


波音太空发射部门高级副总裁奇尔顿表示,问题出在软件上,而非飞船机体本身,飞船的推进、航行及生命保障系统也都运行如常。


尽管这次任务从隔热板到环境控制到着陆,许多项目都进展顺利,但由于这个小小的计时系统的问题,导致了这次飞行任务的失败。而且在实验室测试软件的过程中,工作人员主要关心的是确保载人飞船和运载火箭两部分能够正确通信。测试小组证明了没有通信问题,但是他们走了捷径,所以从未发现载人飞船读取错误时间的问题。


奇尔顿说,公司将集中精力寻找“失败的根本原因”,但他说,“我们不知道为什么计时器会报错,公司一直在寻找软件编码上的问题,但是我们还没有找到问题出在哪里。”


软件测试不能走捷径


为了解开谜团,波音公司和美国宇航局在去年 12 月底组织了独立调查小组,分析这次失败的原因,并于 2 月中旬发出调研报告。


这份报告显示,飞船和火箭助推器的时间存在偏差,而飞船的Mission Elapsed Timer提前轮询了火箭助推器的时间,从而进行了错误的计时并进入了错误的轨道。在发现这个问题之后,波音继续搜寻了可能存在的未被发现的其他问题。他们很快的发现了第二个 Bug,该问题可能导致在将服务舱与机组成员舱分开时发射错误的推进器。


这些明显的错误完全可以被提前“测试”出来。于是调查小组对测试的流程进行了检查,发现测试人员为了缩短测试时间,走了捷径。他们将整个飞行过程分成了几个小单元分别进行测试,但最后却没有做完整的、端到端的集成测试。也就是说根本没有进行时长为 25 个小时的整体测试。


美国宇航局载人航天业务负责人道格·洛夫罗表示,波音公司的问题是“根本性的”和广泛的“软件过程故障”。波音的这种软件质量控制,还不知道会导致系统中到底存在多少个 Bug,“到底只有这两个还是会有几百个”。


波音公司表示将重新对代码进行审核,这涉及到一百万行代码,波音公司官员说,审查需要多长时间还不确定。


波音曾经的鲜血教训


“星际客机”载人飞船的失败正值波音公司遭遇 100 多年历史上最黑暗的时期。波音一直因空难事故丑闻缠身。2018 年 10 月,一架狮航波音 737 MAX 客机发生坠机事故,造成 189 人丧命。几个月后,一架埃航波音 737 MAX 客机也坠毁,机上 157 人罹难。目前波音 737 MAX 机型仍处于停飞状态。


回顾波音 737 MAX 的两次致命飞行,一个自动控制下压机头的名为 MCAS 的自动纠正失速系统受到最大的诟病。


前波音公司资深软件工程师 Mark Rabin 认为最重要的一个原因就是软件外包,而将软件外包的起因则是波音裁撤资深研发以削减成本。


《彭博社》在一则报告中指出:波音 737 MAX 把软件系统外包给了印度外包公司 HCL 和 Cyient 的软件工程师,比起美国正职软件工程师每小时 35 至 40 美元的工资,印度外包的时薪只需要 9 美元。更进一步,波音的分包商与供应商同样选择将工程外包到印度,降低成本以保证利益最大化。


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


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


同时波音的组织结构也存在较大的问题。在波音公司,高级工程师主要向各型号飞机的业务主管汇报工作,然后才向技术端的总工程师汇报。这种模式造成的问题是:工程师一旦发现问题,因为可能造成飞机的研发进度滞后,通常会首先面临来自高管的压力,因为这些高管的工作就是保证在 Deadline 前完成任务。


从民用到航空 软件测试有多重要?


波音公司发言人戈登·约翰德罗(Gordon Johndroe)在电子邮件中说,“星际客机”载人飞船发生的故障与两起致命的波音 737 MAX 客机坠毁事故之间“无法直接对比”。约翰德罗说,“鉴于任务要求和条件的特殊性”,航天软件开发“采用了不同的方法和人员”。


但航空安全网站 AirSafe.com 航空安全分析师、前波音工程师托德·柯蒂斯(Todd Curtis)说,人们肯定会质疑波音的各个部门是否可能因为共享设计、测试和评估方法,从而导致不同软件出现相同的问题。


柯蒂斯说:“虽然它们是不同部门开发的,但它们属于同一家公司。公司一部分的资产完全可以用在公司完全不同的地方。”他回忆说,当自己在波音的商用飞机部门工作时,有时会被要求帮助解决军用航空部门的问题。


“公司不同部门之间可以共享文档、共享流程、共享员工,或者共享其他资源。”柯蒂斯说,“尽管这是一个太空领域的事件,但 737 MAX 的问题一直存在于人们的记忆中。”


与波音及其部分竞争对手合作的防务分析师洛伦·汤普森(Loren Thompson)认为,波音 737 MAX 客机的问题将不可避免地影响到波音的其他业务。


很显然,波音需要更稳健、更规范的软件测试流程,以及更优质的软件测试团队,来避免引起更严重的飞行事故。


2020 年 3 月 02 日 18:433744

评论

发布
暂无评论
发现更多内容

像写Flutter一样开发Android原生应用

萧文翰

flutter android Compose Android Studio

来自前端童鞋对后端的吐槽@#$%^

Java小咖秀

程序员 程序员人生 程序人生 前端

凡架构必拆分,分则有度

菜根老谭

微服务 康威定律 架构思维 分治思维

计算机网络基础(七)---网络层-ICMP协议

书旅

计算机网络 网络协议 网络层

实操案例:字符串哈希表操作

华为云开发者社区

程序员 编程语言 C语言 哈希表 字符串

写一个 web 性能压测工具

WW

Oracle JDK7 bug 发现、分析与解决实战

vivo互联网技术

架构师训练营——请简述 CAP 原理

WW

Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车

newbe36524

容器 微服务架构 Reactive .net core ASP.NET Core

Flask 的 url 处理器

Leetao

Python flask Web框架

「架构师训练营」第 7周作业 - 性能测试

森林

两个指针缩小范围算法,CQRS 命令查询职责分离模式 John 易筋 ARTS 打卡 Week 09

John(易筋)

ARTS 打卡计划

架构师都该懂的 CAP 定理

闻人

架构 分布式 架构师

k8s极简史:K8s多集群技术发展的历史、现状与未来

华为云开发者社区

Kubernetes 容器 云原生 容器技术 华为云

tomcat 使用apr

zack

tomcat

LeetCode 144. Binary Tree Preorder Traversal

liu_liu

算法 LeetCode

SpringBoot 使用 jasypt 对配置项进行加密

hungxy

Java springboot jasypt

性能测试

满山李子

极客大学架构师训练营

使用HSDB 查看jvm内存

引花眠

什么?不写代码也能做功能开发!- RUOYI教程

HPioneer

Java 技术 后端 开发 框架

企业架构框架之DoDAF

Winfield

企业架构

LeetCode 565. Array Nesting

liu_liu

算法 LeetCode

什么?还没有自己的域名?

北漂码农有话说

MinIO 简介和搭建一个对象存储服务

耳东

Minio store Object store

JVM系列之:详解java object对象在heap中的结构

程序那些事

Java JVM GC JOL

「架构师训练营」第 7 周作业 - 总结

森林

Flink 1.11 Unaligned Checkpoint 解析

Apache Flink

flink

ARTS打卡 第8周

引花眠

ARTS 打卡计划

波士顿动力狗 SPOT 权威购买指北

早睡蟒

Python 人工智能 学习 波士顿动力 机械狗

MySQL库表设计小技巧

Simon

MySQL 数据库设计

有趣的“第二个系统”

flyer0126

提升认知 研发体系

波音再陷事故风波:软件测试走捷径导致载人飞船首飞失败-InfoQ