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