很久以前,在我剛開始編寫程序,新手程序員通過編寫維護程序,以提高技能和累積經驗。只有老手們才寫新代碼。新手們從事調試和修正仍被公司所用的老代碼。我一直參與新項目的開發,但是現在的我會專門地編寫維護程序。我參與過許多曾失敗的從零開始的“綠色”項目,我更傾向于軟件產品的調試、修正和增強工作。我喜歡和真正的用戶一起工作,而不是假設用戶樣例。我認為,建立自信心,使用戶滿意我的工作,好過于去與人爭論軟件特性、規則說明書、預算和進度表等問題。針對已有代碼,定義良好的任務優先列表,好過于去想一些天馬行空的軟件規則說明書。我喜歡按小時收費,而不是按照項目來收費,這樣用戶不會回避我的效率問題。
我現在主要從事Web應用領域,專門針對帶背后數據庫的網站。我很少去著手全新的項目開發,但別人常常讓我去“搶救”被整壞的項目。客戶和開發人員的決裂,常常使得產品代碼被棄絕了。開發人員對新產品投入了精力,對程序的bug和老客戶的擴展要求置之不理。我是按小時付費的,我拿到工作,因為我沒有告訴客戶們他們需要拋棄所有的東西,從頭開始 — 而這點正是其他的顧問所建議的。
通常,軟件使用的時間比我們當初寫代碼時所想的時間要長。直到最近,我為一個律師事務所的賬單系統做維護工作,該系統采用OMNIS 3,寫于1986年,不能在新于SE/30的Mac上運行。依賴這些遺留系統客戶們會支付很多開銷,保持這些系統的運行,因為他們不能冒著風險采用新軟件產品,也無法支付新產品開發、數據遷移和人員培訓等任務帶來的費用。相對少許的維護費用對于客戶們是可以接受的,但很多程序員們卻對維護工作嗤之以鼻,不管客戶是否適用,他們更喜歡開發全新的項目。
以下列舉了維護編程的一些好處:
學會調試
比起調試自己代碼,調試他人代碼要更認真努力。必須一步一步追溯問題;不能假定自己知道哪里錯了,跳著去修改錯誤。閱讀和調試他人代碼,會自己思考,代碼如何可行,如果不可行,而不是你知道代碼應該可行。
學會編更好的程序
調試和擴展好代碼比壞代碼更容易,這樣你會學會區分好代碼和壞代碼。學會解釋代碼,推理原作者的意圖。有經驗的程序員可以意識到好代碼為之好,壞代碼為之壞的原因。通過調試很多代碼后,方能這樣的分辨經驗。自己便會得出竅門,找到不熟悉代碼的根基,搜查到壞代碼的味道。
學會優化
原程序員作者已經做了早期優化,因此你必須找到并處理真正影響效率和性能的瓶頸。全新開發項目的團隊常常花費很多時間和精力,擔心不切實際的性能問題。已經在運行的系統具有真實存在的性能問題。找到這些問題,并解決他們,這個過程是十分有趣的,也是一項偉大的技能。客戶常常注意到,而且也感激,程序員對應用效率的提高。
學會新技能和新工具
你可能不會處理現行使用的語言,但你將會學習,原本并不會去學習的,語言、函數庫、工具、以及產品環境等。也會更多參與到常用主流商業工具的工作中。全新考分項目常常因為選擇語言和使用工具的決定而停滯不前。你不必要做這些決定,銷售給客戶,或因其受責備。你需要花時間學習晦澀的專業工具或語言,但這些也是值得的。大公司自有的IT部分會做自身的維護工作,但常常也會租用具有專門知識和技能的承包商。
學習估值數據和數據庫
應用系統仍采用,古老的數據處理教科書中,輸入->處理過程->輸出模型。在讀懂代碼之前,你必須理解數據,知道數據通過系統的流程。幾乎所有的應用都采用某種數據庫,常常是關系數據庫管理系統(如MySQL, PostgreSQL, Oracle, SQL Server等)。有經驗的程序員知道關系的概念,并知道操縱產品數據庫。不明白數據庫的殘廢程序員常常寫出很多壞代碼,去做MBMS本來該做的事情。我經重構很多頁緩慢且很多錯誤的代碼,只需要用SQL來替換它們。
客戶會肯定你所做的
你修復的每個bug,以及對人們常用應用的提高,真正的使用者會注意到這些變化,并給與即時的反饋。當對全新的軟件開發時,每個細則的改變,延遲,額外的花費都會引起和客戶的沖突。當你交付所存在的實際問題,每件事會讓你的客戶高興。
具有更好的說明書細則和清晰的限制
比起從頭開發,代碼修復和增強是更細致,且定義更好的任務。現有的代碼和環境限制了你的選擇。你必須記住解決實際問題。你和客戶一直認同所處理的任務,導致誤解的機會比較少。面對新客戶,我常常要求他們列出他們軟件的前五大痛處,然后我去修復這些問題,并應許他們如果我沒有解決,就不需要付錢。
更容易擺脫壞客戶
我們也需要面對我們不想合作的客戶。你和這樣的客戶有大開發項目的合同,很難從這個關系中出來,因為時間和金錢的投入,客戶對新系統有很大的期待。而維護項目更短期,任務更細致,你可以有很多機會終止這樣的關系,不需要破壞合同,或者損失金錢。
天生快捷
修復bug和增強代碼讓你能快捷的工作,不需要銷售給客戶你的方法學。他們只想很快修復問題,你能給出增量開發的版本,與新用戶協作得出即時反饋,處理具體細節任務。
學會業務
產品軟件反映了一些真實的業務需求。學習什么時候軟件可以服務于業業,什么時候不能。和熟悉軟件的真正的股東一起工作,這迫使你學習業務。比起編寫新的程序語言,知道業務應用將有助于提高你的職業生涯。
學習人際技巧
全新項目開發的程序員們主要是彼此協作。新系統不存在真正的用戶,你得到是用戶案例和股東管理。維護型程序員和真正的用戶大交道。這些人直接與軟件的應用、體驗、bug打交道,知道軟件那些方面不滿足實際使用需要。學會傾聽和交談,這些人沒有跟你一樣的假設和編程文化,但可以擴展你的視角,使你走出程序員的外殼。
會得到隨后的業務和推薦
你認為誰會得到更多業務和推薦:偉大的汽車銷售人員,偉大的技工?比起開發系統,人們更需要修復和增強自己的軟件。對你滿意的客戶會推薦你,因為他們的朋友或同事手里也有“破”軟件系統。
你的工作不會被外包
但可能最終你會維護你客戶的外包實驗的結果。