做人肉代碼翻譯器是什麽感受?
程序員編碼的常規流程是通過大腦把將要實現的功能切分成一個個邏輯單元,使用編程語言將這些邏輯單元實現並組織在一起,積少成多, 形成電腦軟件
缺乏經驗的程序員可能並不是以這總方式實現功能,對於一個功能,在邏輯實現的邏輯組織上, 他們也許不會提前組織和規劃。 想到哪寫到哪,想寫什麽寫什麽。其實這樣做也沒什麽大問題, 只是效率低了點、代碼質量差了點、 BUG多了點、維護難了點,我以前就是這麽幹的
但是不管用什麽方式編碼,總會得到正面的反饋,大腦中的想法通過雙手敲擊鍵盤編寫代碼的方式展現了出來,多麽了不起的一件事情, 這正是程序員、技術狂們不斷在自己的領域學習、耕耘的動力所在。
我也一直如此
但這兩天我卻以另一種方式編寫著代碼,一種沒有絲毫創造性,猶如走在漆黑懸崖邊上,每移動一厘米都需要小心翼翼,而且枯燥乏味到令人崩潰的方式
我發誓, 在我寫代碼的生涯當中,這絕對是體驗最差的一次。中途, 我差點堅持不下去,所幸, 最終我挺了過來。
事情是這樣的
我們這邊有一個WebService項目, 舊系統應付不了業務的變化,一些重要的功能遷移到了新的架構上。然而, 其中某一個重要的功能卻無法遷移,因為這部分代碼混亂到沒人看的懂。
好吧, 遷不了就在老地方呆著, 別鬧事就成了。
還好,這個功能一直以來比較安分, 穩穩當當的運行著, 做自己該做的事情。
可是,不知道是不是因為這幾天天氣太熱的緣故, 這個功能最近老是出現罷工現象, 經常不出數據或吐一些錯誤的數據。接著就是用戶罵娘,老板發火,程序員焦頭爛額。
媽蛋, 看來隨著數據量的變大、請求數的增多,加上偶爾抽風的網絡環境, 這部分功能已經支撐不了現有業務的運行了,一只腳已經踏進棺材了。
於是我決定賦予他新的生命, 把它遷移至新的架構之中。
人啊, 都是被逼出來的,這件事情其實半年前就應該做了,但那時候還沒有陷入絕境,所以面對困難的問題,能拖就拖著。 現在老虎追到屁股後面,退無可退了,就只能硬著頭皮上了。
然而, 這真他媽不是人幹的事。
我要做的事情就是把上千行只知道很重要,不知道幹什麽的,沒有文檔,沒有可讀性, 有幾百萬人在用的,輸出的內容連一個字符都不能有誤的php代碼改成golang代碼
這不僅艱難, 而且乏味
我先要使這些代碼在開發環境中運行起來,但這還真不是一件容易的事情。 申請運行代碼的服務器的權限、構造程序運行需要的數據、收集調用程序的參數、測試看看程序能不能跑,還沒進入正題,光搞這些前戲就花了大半天時間。
接著便是改寫代碼。既然不知道舊代碼幹了些什麽, 那只能把自己當作人肉編譯器了,通過自己對php和golang掌握, 人肉將php代碼轉換成golang代碼,程序的邏輯絲毫不變,變的只是語法元素。 這是一個很痛苦的過程, 期間有一個念頭在我的腦海裏想起許多次:要是有一個工具能把php代碼轉換成golang代碼, 我一定不惜一切去獲得。
php中數組、map是同一個東西,golang中要分別使用slice、map實現
php中string、int、double可以放在同一個變量裏, golang不行
php中"1"+"2"可以等於3,golang中只能1+2=3
等等其它各種問題就不一一舉例了,反正實現的過程中才深刻的體會到,不同的語言做同一件事情, 做的過程和方法真的差了十萬八千裏
別以為把這些代碼改寫完成就萬事OK了,這可是有大量用戶在使用的線上代碼,不可以出絲毫差錯的,不然鐵定吃不了兜著走。
所以吧, 我哼哧哼哧寫完上面這些代碼, 還要寫測試代碼, 對比新舊兩個功能返回的數據是否一致,需要精確到連一個字符都不能有差別。
完成測試腳本後踩住馬達一運行, 新舊兩個實現返回的結果完全不一樣, 數據項上的差別起碼有上千項。
於是我又是檢查測試腳本, 又是琢磨舊代碼, 又是修改新代碼的, 使不一致的數據項減少到了五百項
還是不行
於是我又是檢查測試腳本, 又是琢磨舊代碼, 又是修改新代碼的, 使不一致的數據項減少到了三百項
還是不行
於是我又是檢查測試腳本, 又是琢磨舊代碼, 又是修改新代碼的, 使不一致的數據項減少到了一百項
還是不行
反正一直不停的循環
最後, 不一致的數據項目終於為零了, 我整個人癱倒在椅子上面, 連下班的力氣都沒有了。 我再再再再再…一次體會到,屎一樣的代碼害死人、豬隊友害死人(已離職)
放幾張舊代碼截圖大家感受下
這只是冰山一角
做人肉代碼翻譯器是什麽感受?