軟件項(xiàng)目經(jīng)理經(jīng)常面臨及早交付產(chǎn)品的巨大壓力。時(shí)間是關(guān)鍵。你如何才能快速完成任務(wù)呢?假設(shè)你的團(tuán)隊(duì)有兩名程序員,伯尼和羅布。兩人都很能干,知識(shí)面相同, 編程語(yǔ)言技巧也相當(dāng)。你發(fā)現(xiàn)在開(kāi)發(fā)過(guò)程中伯尼實(shí)現(xiàn)軟件功能的速度遠(yuǎn)遠(yuǎn)超過(guò)羅布。
當(dāng)伯尼著力于快速完成編程時(shí),羅布正花時(shí)間寫代碼并對(duì)其進(jìn)行重構(gòu)。重構(gòu)就是改動(dòng)代碼,完善其內(nèi)部組成結(jié)構(gòu)而不改變其外部功能。它改進(jìn)軟件產(chǎn)品設(shè)計(jì)。重構(gòu)代碼 是回過(guò)頭去完善以前倉(cāng)促創(chuàng)建并測(cè)試的某項(xiàng)可用的功能?,F(xiàn)在需要進(jìn)一步對(duì)該功能進(jìn)行內(nèi)部改進(jìn), 以便長(zhǎng)期使用,也使日后增加功能更為方便。羅布對(duì)變量和方法的命名更擅長(zhǎng)。一旦寫的程序能夠運(yùn)行起來(lái),他就把這個(gè)程序分 成幾小塊?,F(xiàn)在他要寫測(cè)試來(lái)確保該程序的每一塊都能按照他的意圖運(yùn)行。當(dāng)他覺(jué)得結(jié)果比較滿意時(shí)才宣稱實(shí)現(xiàn)了功能。
但是假設(shè)你并不知道上述這些細(xì)節(jié)。如果你只看他們誰(shuí)先宣稱實(shí)現(xiàn)了功能,那么很明顯伯尼表現(xiàn)得更好,對(duì)嗎?
幾個(gè)星期之后,你向客戶演示這些功能。像往常一樣,顧客喜歡你已經(jīng)完 成的功能,但現(xiàn)在需要你做一些改動(dòng)和完善。你讓軟件開(kāi)發(fā)人員修改這些代碼。當(dāng)你把新改進(jìn)的功能帶回給客戶時(shí),他們?cè)囉昧肆_布實(shí)現(xiàn)的功能,對(duì)他做出的 改動(dòng)十分滿意。
遺憾的是他們發(fā)現(xiàn)伯尼實(shí)現(xiàn)的功能有些奇怪。當(dāng)伯尼編寫好新的功能后,一些以前能使用的功能現(xiàn)在卻不能用了。客戶把這些作為缺陷標(biāo)記出來(lái),然后你讓 伯尼來(lái)修改??蛻粲忠淮螠y(cè)試這些功能,結(jié)果后來(lái)新增的功能也不能用了。這到底是咋回事呢?
如果你有孩子,就會(huì)知道發(fā)生了什么。伯尼創(chuàng)建的是一個(gè)打地鼠式的應(yīng)用程 序。打地鼠是一種游戲,孩子們拿著一個(gè)木棒敲打幾個(gè)孔中隨意彈出的地鼠,他們會(huì)很驚奇接下來(lái)是哪個(gè)地鼠彈出來(lái),而且還樂(lè)此不疲。然而,在修改應(yīng)用程序 的時(shí)候如果總有壞代碼不知從何處隨意彈出,那可不是好玩的事情。那會(huì)令人沮喪,結(jié)果也難以預(yù)料,并且它會(huì)減慢產(chǎn)品開(kāi)發(fā)速度。伯尼一開(kāi)始就全速?zèng)_刺,只是南轅北轍了。
盡管羅布從一開(kāi)始就表現(xiàn)得較慢,但實(shí)際上他編寫的代碼更勝一籌。事實(shí)證 明,他的節(jié)奏是可持續(xù)發(fā)展的。由于最初編寫的代碼就有較好的質(zhì)量,所以,他才能更快地做出可行的改動(dòng)。而且他早期編寫的測(cè)試能隨時(shí)帶給他反饋信息,讓 他了解自己新寫的代碼是否與原有應(yīng)用程序的其他部分兼容。
當(dāng)估計(jì)某一功能的實(shí)現(xiàn)時(shí)間時(shí),不要只考慮最初寫代碼所花費(fèi)的時(shí)間,還要 加上提升、調(diào)整和改進(jìn)這些代碼所需的時(shí)間。寫高質(zhì)量的代碼和測(cè)試都需要花時(shí)間。從短期來(lái)看,這似乎是一種損失,然而它帶來(lái)的卻是長(zhǎng)期收獲。