我見過的最糟糕的程式程式碼

發表於2016-02-18

大多數的客戶專案在任務完成之後都會很快的從記憶裡消退,但有些,你一輩子都不會忘記。我要說的這個屬於後者。

這事發生在很多年前,在一個相當大的公司裡,公司名我就不說了。那個軟體有一大堆程式,是一個商業系統的核心模組,由一個、單獨的一個的小夥維護著,這個傢伙不久前被炒了。

像這樣的事情其實都很正常,一些公司通常會發現他們的一些關鍵性技術自始至終都儲存在一個人的頭腦裡,當有事情發生時,就像現在這個人,你通常會經歷一陣痛苦階段去閱讀他留下的東西,之後生活慢慢趨於正常。

這次有點不一樣。

這個程式出了點問題,公司派了一個去修復這個問題,等他回來後發現精神有點反常,不是哭就是笑,嘴裡嘟囔著什麼“匹薩呼叫漢堡並且傳入了包子”。

程式設計師的程式碼裡通常體現著自己對幽默的理解以及對‘工作保密’這個詞的認識。我們都聽說過一些難以置信的故事,比如說公司辭退了某個搞技術的傢伙後,結果被告知如不在48小時內向某個海外賬戶打入多少錢,會計軟體將會自動刪除所有客戶記錄。像這種的小伎倆相對而言還好處理 —— 假設這些傳說的故事大多數都是真的,我還是很難相信,我從來沒有在現實生活中遇到過這種事情。

這個傢伙留下來的軟體裡沒有任何的邏輯炸彈或下流的陰謀,編譯很正常,除了有一個bug外,一切都工作的很好。但是,你需要想像一下:程式中的所有函式、變數名都是以食物命名的。匹薩,蕃茄,泡菜,各種味道的乳酪,水果,蔬菜,酒,等等,一篇一篇,全是這樣。裡面唯一能讓你馬上知道意義的地方只有‘main’函式名和C標準類庫的呼叫。

就這樣,我接手了這個費力不討好的爛攤子,努力的把程式恢復到一個可維護的狀態。

說實話,這是一個極好的加密形式,只有拿到金鑰你才能讓這些“程式碼沙拉“變得有意義。一點一點的,我把這些函式名和變數名改成具有意義的命名,開始很麻煩,之後慢慢的變得容易些。

把已知的函式和原始碼進行恢復要比對未知的程式碼進行反向解析容易的多,因為首先你要分清程式碼裡哪些是程式,哪些是資料,而放在我前面的這些程式顯然都是明文,所有這活兒並不是不可能完成,或者說是格外的困難,只是這活兒太乏味太無趣了。一旦你發現了某個變數可能應該給個什麼樣有意義的名字,餘下的就是查詢和替換。

另外一個問題是,程式碼寫的太爛,事實上,這義大利麵條式的程式碼比這些毫無意義的符號更讓人困惑,等我把函式名和變數名都改回有意義的名稱後,我開始把一大堆的程式碼重寫,讓它們易於理解、效率更高。

我始終沒有弄明白他是否還有一套沒有加密混淆過的程式碼,他可以使用一些‘混淆’指令碼通過替換的方法把原始變數名混淆成這樣。我很難相信一個人會在最初時就把程式碼寫成這樣,因為這對他自己也是一個巨大的挑戰,這裡肯定有一些高超的技術。

當然,如果你的腦子裡還在想:你不能因為我的變數名沒有什麼意義就把我開除了(或應該招我回來改程式),那你是在妄想,不管這個傢伙的用意是什麼,他的做法十分的錯誤(我很難想象他的前任老闆還會推薦他),不管怎樣,這事兒讓我樂了好幾周。

相關文章