刚接触航空业时,觉得自己像刚踏上美洲的弗朗西斯科.皮萨罗,或是刚遇见毛利人的库克船长,仿佛走进了信息技术的蛮荒之地,随便播下一颗“现代技术”种子,就能长出一片跨时代的技术森林。
与国内行业解决方案提供商交流之后,这种自信似乎得到了印证。一个拥有几十家航司客户的产品,代表着行业最高水平,却不支持插件化定制,没使用gitflow管理产品线和业务线,每个客户的代码都是单独维护的;航班运行全生命周期管控系统不允许宕机,却不具备基本的负载均衡、故障转移、服务降级,数据库没有主从热备,只有日备份,系统稳定性完全靠祈祷;系统升级没有回退机制,不支持新老并行,每次升级都是一场勇气与决心的冒险。正当我撸起袖子,手握互联网技术的利剑,准备披荆斩棘,收割航空业信息化的硕果,开心地回答这道天赐送分题时,行业却问了我另一个问题:这系统安全吗?航空业对安全的追求深入骨髓,答不好就是送命题。安全是每个中国民航人做每件工作的必答题,值得国人骄傲的是,中国民航局对安全运行的要求和管控远高于世界平均水平,所以互联网典型思维,诸如快速试错、容灾,名字都不合法。
没有银弹
航空安全问题的边界在哪里,可以试着从航天安全切入,关于航天,埃隆.马斯克当有发言权,毕竟他的公司Space X,领先于NASA,实现了火箭回收重复利用的商业化。Space X的创举打破了航天技术高深莫测的神话,凡人也可以做出火箭,那么航空业的安全应该也可以通过我们熟知的技术来解决。
NASA,地球上少数几个可以和Google争夺人才的机构,是软件工程的鼻祖,世界上最初的巨型软件项目就是NASA的项目,这些项目的底线是不能出错。为了管理庞大软件项目的复杂性,NASA在实践中提出了软件工程概念,用系统化的工程方法解决业务复杂性问题。顺便提一句,软件工程师这个称谓也是由NASA的“临时编码工”玛格丽特提出来的,在她刚加入这个行业时,软件还只是硬件的一个部件。既然安全问题说到底是个技术问题,既有的技术实践依然有效,那么航空业的信息化又回到了技术的轨道上。
没有上线,就没有伤害
第一个接受安全问题拷问的是运行控制系统,这个系统负责从制定航班计划,到飞行员资源调配,再到飞机起飞降落管控,乃至航班异常处理(备降/返航/调机),是航司生产运行的中枢系统。如此关键的系统,在设计之初,就考虑了平滑上线方案,保持老系统功能可用的条件下,业务分航线逐步切到新系统运行,一旦出现系统故障,可以立刻切回老系统继续管控航班。这套方案最大的挑战在于电报系统,电报系统是航司和空管沟通航班调度的关键通道,每个航司只有一条专线与空管相连,无法做双线热备,是整套系统唯一的SPF(Single Point of Failure)。电报系统通过电报机通信,发送摩斯电码,模拟信号,据说建国前就在使用了,谍战片里那种,这样的古董系统,偶尔出现乱码也情有可原吧,但请谨记,航空业不允许出错,所以这就相当于要求一个Java程序员用C写代码,还不许有bug。
解决问题的关键在于回归问题本原,监控系统可用性的最基本策略是心跳检测,通过定时发送测试电报给自己,覆盖了发送和接收双向通道的可用性检测,并结合正常业务电报的收发以及航班疏密,适当减少检测频度以节约成本。如何让新老系统共用一条线路?“Any problem in computer science can be solved with another level of indirection”,封装电报系统,内部分航线调度,隔离新老系统。同时冷备一条网络线路,预防运营商抽风。做足了准备工作,系统终于要上线了,在发布准备会上,业务部门突然提出,分航线迁移业务不可行,因为虽然航班管控是按航线组织的,但飞行员是个共享稀缺资源池,如果按航线拆分,将出现飞行员短缺,而且局方不认可系统新老并行方案,局方要求新系统不允许出现故障。
局方,局方
中国民航局作为世界上最严厉的监管机构之一,事无巨细地监管着每一家航空公司的生产运行,高度管控可能局部高效,但整体必然低效,因为整体效率完全取决于管理层,这要求管理层都是超人。这与日新月异的大环境显然冲突,业内人都在呼唤变革,自上而下的严密监管体系制约了个体的创造力,变革只能自下而上通过奇点突破形成裂变辐射的形式发生。
我们希望在航空业的探索能够找到那个奇点,但在此之前,首先要解决业务部门尖锐的问题:局方不认可。备用系统为什么不被认可?不出故障只能是结果,怎么能是要求?再次回到问题本原,业务部门反对新老系统并行的真正原因是,不愿意在新老系统中录入两遍基础数据,这会增加工作负担。找到根源,问题就解决了一半,通过自动同步新老系统数据,业务部门只需要录入系统差异部分数据,不仅规避了大量的重复人工,也保证了数据完整性和准确性。这件事不仅让我意识到要善于捕捉和发掘业务部门潜台词,更让我明白局方是个重要的第三方,可以是问题的核心,也可以是解决问题的支点。
新系统尽量实现自动化,但并非所有数据都能自动采集,有些即便可以自动获取但仍需人工确认,这些不自动的部分就像人类进化的尾巴,反成了难以忍受的累赘,比如上客时间和加油量等数据的录入,完全是线下行为,只能人工事后录入系统。这些遗留的人工,在自动化背景下成了额外的工作,没有人愿意接手。
体制是把双刃剑,可以借助监管的力量,反推信息化,统一技术目标与业务目标,形成部门合力,局方对航司各项工作可追溯的要求就帮了忙。所有工作必须可以通过各种工作日志、工单、审批单、会议纪要等完全还原,尤其当回溯事故/故障的原由,只要还原结果表明不存在人为过失,就可以免责,所以有句行业戏言,“工作做的好,不如记录记得好”。由此,为了保证信息流闭环,这些数据理所应当分到了合适的席位人工录入。当然,在后续迭代中,所有现场人员都会配备信息终端,这类信息录入会简化成按钮点击,甚至只需摇一摇,即可完成;而系统本身也将演化成Event Sourcing架构,系统架构适配信息结构;这些事件、状态、工序、流程最终沉淀为数据,成为更深层变革的土壤。
数据说话
数据积累是航空业天然优势,飞机运行数据,从发动机性能参数,到飞行轨迹,到飞行员的每一次操作,从首飞开始完整记录。每一次故障,即便是空调扇叶螺丝松动,都要记录在案,而每一次修理,更是从使用什么工具,到每个具体的修理动作,比如登上脚手架,都详细记录。这座数据金矿的价值不言而喻,但挖掘起来难度不小,主要原因是专业门槛太高,业务专家普遍缺乏系统意识,技术人员和技术专家就像修建通天塔的工匠。 即便如此,对数据客观性的认可是共通的,每当双方各执一词,无论是立场还是观念的冲突,只要一方能够拿出扎实的数据佐证,通常就可以把问题范围缩小到数据有效性层面。
航司生产运行变动成本中,燃油占了大头,节油于航司不只是环保问题,更是真金白银的利润问题,飞机加多少油不只是个技术问题,更是理念之争。争论的两端,一方是公司要省钱,另一方则是航空公司最举足轻重的群体——飞行员。
飞行员在航空公司是特权阶层,享有巨大的发言权,就像互联网公司里的程序员,不可小觑。从飞机发动机启动开始,机长是负责航班的第一责任人,如果航班出现了特殊状况,比如备降或者返航,甚至被迫盘旋等待,油箱里有油,心里就不慌。可是飞机的载重是有限的,装了太多油,机票就只能少卖几张了,而且油自重也耗油,有时为了降落不超重,还要刻意消耗一些油减重,实在可惜。理论上,航班耗油取决于飞机载重和航线距离,同时受天气情况(气温、湿度、风力)影响,备用油主要看备降场的选择,传统计算模型是物理公式,技术上本没有讨论空间,但理论与实践的差距很微妙,飞行员作为直接实践者,站在安全的制高点,质疑理论值只需要一个例外。
技术手腕如何对抗安全大棒?唯有动用数据的力量。如果预估油量计算模型吸收飞行员实际飞行的数据作为参数,飞行员操作习惯、飞机特性等公式中没包括的因素,都能涵盖了。具体方案分为两个阶段:数据积累和模型训练。积累阶段,制作航班计划计算预估油耗时,选取条件最近似的历史数据作为锚点,记录每个航班的实际飞行数据,包括航距、载重、天气和耗油,进而按照不同飞行阶段细分数据,得到更精确的油耗,这个锚点油量也会作为参照值记录到这次航班的飞行数据中积累一段时间的数据后,比对锚点油量、计划油量和实际耗油,如果锚点油量比计划油量更接近实际耗油,那么这个历史数据就可以用来修正计划油量计算模型,累计飞行数据不断训练,模型稳定后,就可以直接计算更准确的锚点油量。