在1990年代,我在一家電信公司做嵌入式軟體工程師。他們決定向一個新的方向發展,並將新設備的設計和程式設計外包出去。該設備對每個客戶都有幾個獨特的配置選項。

IT部門設計了一個資料庫程式來配置和維護資訊。每一個單元都被封裝在一個裝著一個小的斷流器的盒子裡,電源和串列連接可接到該單元上,這樣它就可以在裝運前進行配置。

製造商提供了一個Windows動態連結程式庫(DLL),這樣資料庫程式就可以與設備通訊,檢索單元的序號,並下載配置資料。

隨著生產的開始,運輸部門遇到了一個問題。他們用來配置這些單元的個人電腦在1~3種配置後隨機碰撞,需要重啟電腦。在這兩周後,運輸部經理一直急得掉頭發髮,因為IT部門沒能解決這個問題,所以他來找我的老闆,而老闆選我去幫忙。

首先,我來到航運部門,觀察他們的流程,看看他們是否做錯了什麼。它們與設備連接沒有問題,而第一個配置總是沒問題的。只有在一個配置完成後,PC才會崩潰需要重新開機。

然後我去了IT部門,經理張開雙臂迎接我(實際上並不是!),在終於說服他讓我看一看也不會有什麼問題後,我被護送去見程式師。

程式師對我的幫忙表示歡迎,他給了我DLL原始程式碼和他的程式的副本,告訴我他的程式是如何工作的。他使用的是一種高級的資料庫程式設計語言,該語言可以自動處理許多較低層次的細節。

我以前從來沒有在PC上做過任何設備級程式設計,但是我擅長C語言(DLL語言),以前也做過一些有限的資料庫程式設計。於是我從DLL代碼開始,特別認真的檢查了它的資料庫程式介面。大約半個小時後,我想我知道問題出在哪裡。

DLL需要一個指向記憶體位置的指標,從而能儲存單元序號。然後,它將接收配置資料並將其傳遞給設備以進行儲存。高階資料庫程式將指標傳遞給DLL,但是因為它不知道序號變數的長度,所以它沒有預留任何空間。當DLL返回序號時,它被寫入堆疊上的一個位置,這些資料有時候會會被恢復,其他時間會崩潰。

我把我的懷疑回饋給程式師,他先為序號預留了空間,然後把指針傳遞給DLL。問題解決了!我們發了成千上萬個這樣的單位,運輸部經理一直對我讚不絕口,甚至傳到公司總裁耳中。

有時候,解決問題還真得仰賴門外漢。親愛的EDN讀者們,你們有沒有過類似解決問題的經歷?歡迎分享。

(參考原文: Sometimes it takes an outsider,by Craig Hackerd,EDN China胡安編譯)