大约35年前,在刚起步的软件工程生涯中,我从英国被派往加拿大对生产工厂进行故障排除。我的工作是完成一组加工厂的调试,其控制系统几乎全部由单个DEC LSI-11 (PDP-11/03)组成,且配置内存比你现在可以找到的廉价手表内的还要少,并执行着一个被人们遗忘、可多任务作业的操作系统,还部署BASIC语言的修改版本。
当我到达时,最初的调试工作已经完成,且工厂有完整的生产计划可以进行。尽管控制系统出现问题意味着运作速度非常缓慢,但该工厂仍需要为加拿大寒冷的冬季提供动物饲料。解决现场实时系统问题的机会为我带来了巨大压力,因为很少有机会让我实际去做些事情。
客户的耐心等待和支持的工程团队协助为我的英国规格开发机器临时接通了240V电源,我花了几个小时研究脱机解决方案,并等待机会在在线测试它们。一路上走来,总有跌宕起伏,客户对工作表选项的反应特别令人难忘,该工作表唯一的功能是显示“还没写”讯息!
生产调度程序软件已在无数先前的系统上获得使用证明。它旨在为生产工厂做好准备以生产下一个计划的饲料,确保装袋机已准备就绪,并在重新开始循环之前监视生产。
但是在一种特定的配置中,它显示了一个非常难以捉摸的错误,且这错误每几周发生一次。有鉴于它是一种药物饲料,可以用以治疗从鸡到赛马的各种动物,因此导致意外和诉讼的可能性实在太高了。
为了寻找定时问题,许多时间被浪费了。这个错误无法在仿真系统上发生,当它在上产系统上冒出头时,并未留下任何蛛丝马迹,但是必须做些事情解决它。
解决方式虽然让人厌恶但仍是有效的。在开始新的生产运作之前,我添加了最终检查程序以确保调度程序输入、分配的生产批次和包装都匹配。如果不匹配,调度程序将被迫再试一次,直到匹配为止。这样做很务实?当然,客户对他们的工厂现在可被信任感到很高兴;这个方式是最佳的做法?几乎不是,你想要飞行控制软件这样被编写吗?当然不。
如今,我从事功能安全、网络安全和编码标准方面的工作,让我很容易忘记上述那些痛苦。但实际上,这个经历可以帮助我们编写可以正常运作的软件。因此,如果我开始怀疑功能安全和安全标准是否真的必要,只需要回想加拿大一个非常寒冷的冬天就可以找到答案。
(参考原文:Coding confessions from Canada,by Mark Pitchford,EDN Taiwan Anthea Chuang编译)
责编:Yvonne Geng