美国码农故事:写代码获得陆军嘉奖奖章
2005年,作为“伊拉克自由行动”的一部分,我所在的国民警卫队被派往伊拉克。我的MOS(军事专业)是 92A,这基本上是一个后勤供应工作。我负责订购和收拾机械的零部件,并退还旧器件,管理危险品紧急处理小组,分派/回收任务车辆,并办理许可证。其实还 做一些其他的事情,只是现在不记得了。总之,当时这个系统的核心是一个叫ULLS-G(部队级物流系统 – 地面)的工具。我说“当时”,是因为我们回来不久后 SAMS-E(标准陆军维护系统 – 增强型)替换了ULLS-G,它使用了Oracle作为后端数据库。比起 SAMS-E,ULLS-G简直就是恐龙。被派遣前,我在军队足足使用四年之久,从头到尾都是噩梦。 ULLS-G是一个DOS应用程序(是的,MS-DOS),我在军工厂使用的大多数计算机只能运行DOS系统(这时是21世纪初,所以DOS系统很常 见)。到我被派遣时,多数计算机都运行WinXP/2K或类似的系统,所以可以使用”MS-DOS兼容模式”运行ULLS-G。
正如我前面提到的,使用ULLS-G是很痛苦的。作为DOS下的应用,你不能使用鼠标,只能通过键盘进行交互。记得在任务快结束时,我已经记住了按 键,甚至不用看键盘,只需输入它们就可完成工作。没有任何形式的批处理功能,是该系统令人感到可怕的地方。比如说你得打印士兵的许可证,就不得不一个一个 去检查并打印。你得在一个屏幕前,输入他们的许可证号,加载出许可证,然后打印。我们部队大约有150名士兵,为了打印所有人的许可证,我不得不逐个查找 每个士兵。如果你要为士兵添加一个车辆认证,同样得逐一去做。其实这还不是最让人恼火的,因为每次只需处理部分内容。但我们是专门为某一任务成立起来的 (我们的士兵分别来自第180炮兵团第1营的四个连,组成了第180炮兵团第1营第1旅部与旅部连),这意味着这个ULLS-G系统里没有士兵的认证。所 以一开始,我不得不手动输入每个士兵的认证,然后打印出他们的许可证,基本上要花费大半个小时。在正规部队,情况会更糟糕。离开之前,我们在华盛顿州刘易 斯堡有预动员训练。士兵要进行多项车辆训练(M-1114, 5-ton, deuce-and-half,等等)。这些都是交错进行的,所以每次训练任务结束后,我都不得不添加认证并重新打印许可证。
(编注:小伯头次在翻译中遭遇美军编制,乍一看真是头大了。“1/180 HHB FA”,你看懂了么?)
不用说,我很恼火。我甚至得到消息,到伊拉克后,将会有更多的车辆认证,这意味着我将不得不全部重新添加认证并打印许可证。现在作为一名程序员,我 不断地想发设法简化工作。我不想坐在那一个一个地添加认证、打印许可证了。一是我懒得弄,二是这件事情效率太低了,所以我决定使这个过程自动化。我做的第 一件事就是尝试找出ULLS-G数据文件的格式。不幸的是,我一点都没弄出来,主要因为时间不够 (所有的军事训练都在进行)。不过令人意外地是,我偶然发现了一个页面,上面有ULLS-G的ODBC驱动程序。这意味着我可以运行SQL查询ULLS- G数据文件。有了这些,我开始编写Perl脚本查询数据。我们达到了伊拉克的时候,我有一个可以生成所有士兵文本文件形式许可证的脚本。脚本运行只花了一 两秒,最长的部分就是打印出许可证。但我还没有完成,所以令人恼火的是不得不手动添加驾照。所以我又写了一个脚本,以使驾照可以全部一起添加给驾驶员。脚 本还有一个配置文件,允许把指定的某种认证添加到某人。
到了部队以后,我又不得不打印每个人的证件,我仍记得二十分钟后当我拿着一堆刚刚从打印机打印出来还温热着的许可证时,电机中士那疑惑的表情。他问 道:“这个需要很长时间吗?”,于是我开始和他谈论脚本,可是当我刚说出几句关于Perl、SQL和 ODBC 连接时,他就不再听了,点着头把许可证放到 TOC,或许他没有问我太多问题是好事,因为我做的事是不太被批准的,只有取得执照的技术人员(另一种MOS岗位) 才能安装,至少在部队眼中,我是不合格的。
在伊拉克时,我发现我们必须每天向TOC发送报告(最终发送到军营)。这些报告包括车辆的情况(报废还是完好)和一些其他信息。几乎所有的部队都是 手动向Excel表中输入信息,然后打印出来并送到TOC。手动输入总是出错,每天早上我都得花20-30分钟修正报告,确保它是最新的,最后打印出来, 送到TOC。我记得有一两次因为信息出错被批评了,从那以后变得倍加小心。我又生气了,这些事情需要有一个更好的方式来做,而且确实是有的。Excel可 以使用在Windows中注册的ODBC连接,而且我已经用ULLS-G的Perl脚本注册了一个。
所以,我使用Excel宏简单地复用了同一个连接,这个宏指令可以帮我高效地计算表格中的所有项。棒极了,它能够自动更新报废汽车单,同时也包括了 其他部队没有上报的信息,像所有车辆的服务状态及其行驶里程。以前的话,当它被从调度返回时,我们不得不手动查找每个车辆的维修状态,所以说服务状态位在 日常工作中是非常有用的。现在,我只需要查找Excel表格就能了解到需要维护的车辆。
从编程的角度来看,我做的并不是很出色。我只是找到了从ULLS-G数据库获取信息的方法。但却令我的领导印象深刻,尤其是我的班长和电机中士。大 概两三个月后,来了一个新的大队电机员(如果没记错的话是CW2 Lee)。他对我做的事情非常感兴趣。有次我演示给他看后,他看着我说“你难道不知道不能这么做吗?”。一开始我担心我会有大麻烦,但他脸上却浮现出了笑 容。他告诉我,他不会追究,因为我似乎知道自己在做什么,而且因为我提供了准确的报告,部队的效率也提高了。
接下来的几个月很快就过去了,还有一两个月后就要离开伊拉克了。除了遇到一些小问题,我的脚本和宏一直运行得不错。快结束时,部队有一个颁奖典礼。 指挥官和军士长来到调配场发奖项。接到电话时我有点惊讶,我没期望我会得奖(我的工作地点主要在营地,虽然我觉得我工作得不错,但没认为它值得表彰)。授 予我陆军嘉奖奖章(Army Commendation Medal) 后,他们和我握了手并祝贺我。在我看到文书前,我认为这仅仅是一个一般性质的“优秀工作”奖。当我阅读文书,看到因为使用Perl脚本和Excel宏完成 工作,班长SSG Lopez将我选为获奖者时,我很惊讶也很高兴。虽然我不是为了得到奖励而工作,但是自己的工作被赞赏,仍旧是一件很美妙的事情。
这就是我通过写代码获得部队奖章的故事。
小伯补充:
陆军嘉奖奖章
根据1945年12月18日第377号陆军部通报设立,并经1960年第10号陆军部一般命令修正。这种奖章用来授予自1941年12月6日以后在 美国武装部队中以任何身份于陆军服役期间表现异常勇敢,功绩显著或服役出色的个人,此奖章也可以授予盟国武装力量中为了美国和盟国共同利益而表现勇敢,功 绩卓著或服役出色的个人。
原文链接: Vivin Paliath 翻译: 伯乐在线 - Qianyang
译文链接: http://blog.jobbole.com/72454/