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