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日以後在美國武裝部隊中以任何身份於陸軍服役期間表現異常勇敢,功績顯著或服役出色的個人,此獎章也可以授予盟國武裝力量中為了美國和盟國共同利益而表現勇敢,功績卓著或服役出色的個人。