直播中
“這個(gè)網(wǎng)站相當(dāng)簡單,所有你需要做的就是完成X,Y,Z。你看起來應(yīng)該是技術(shù)很好,所以,我相信,你不需要花費(fèi)太多時(shí)間就能把它搭建起來。”
我時(shí)不時(shí)的就會(huì)收到這樣的Email。寫這些郵件的人幾乎都是跟技術(shù)不沾邊的人,或正在研究他們的第一個(gè)產(chǎn)品。起初,當(dāng)聽到人們這樣的話,我總是十分的惱怒。他們?cè)诟l辯論軟件開發(fā)所需要的時(shí)間?但后來我意識(shí)到,即使我自己對(duì)自己的項(xiàng)目預(yù)測要花去多少開發(fā)時(shí)間,我也是一籌莫展。如果連我自己都做不好,我何必對(duì)那些人惱怒呢?
真正讓我郁悶的不是他們預(yù)估的錯(cuò)誤。問題在于他們竟然認(rèn)為自己可以做出正確的估計(jì)。作為開發(fā)人員,我們經(jīng)常會(huì)發(fā)現(xiàn),在軟件開發(fā)的問題上,一個(gè)外行人會(huì)很自然的把復(fù)雜的事情估計(jì)的很簡單。
這并不是為我們的憤怒找借口。但這引起了另外一個(gè)有趣的問題:為什么我們天生的預(yù)測復(fù)雜性的能力在遇到編程問題時(shí)會(huì)失靈?
為了回答這個(gè)問題,讓我們來認(rèn)識(shí)一下我們的大腦如何估計(jì)事情的。有些事情對(duì)于一些沒有經(jīng)驗(yàn)的人也很容易預(yù)估正確,但有些事情則不然。
我們來想想觀看一個(gè)人彈吉他。即使你從來沒有彈過吉他,在觀看了一場彈奏《瑪麗有只小羊羔(Mary had a Little Lamb)》的吉他表演后,你也能大概推測出這很簡單,一個(gè)人不需要太高的技術(shù)就能演奏出來。同樣,當(dāng)觀看了有人演奏D大調(diào)的《卡農(nóng)(Pachabel’s Canon)》后,你也很容易推測出,這很復(fù)雜,需要很長時(shí)間的練習(xí)才能演奏的出來。
為什么我們能夠很迅速準(zhǔn)確的預(yù)估這兩首曲子的復(fù)雜性呢?這是跟我們用來判斷一個(gè)事情簡單和還是復(fù)雜的方法有關(guān)的。我們的大腦有一些現(xiàn)成的模式來完成這些事情,首先一個(gè)就是根據(jù)速度。這種情況下,大腦會(huì)辨別每秒鐘演奏的東西。根據(jù)每秒鐘演奏了多少東西,我們很容易有一個(gè)直觀的判斷曲子的復(fù)雜度。因?yàn)橛眉葑嘁皇赘枋且环N物理過程,一種感官上的活動(dòng),我們的大腦很容易依此來推測速度,繼而轉(zhuǎn)換成復(fù)雜度。
我們還有另外一個(gè)天生的推測依據(jù):體積。想想把一個(gè)帳篷和一棟公寓放在一起對(duì)比。即使一個(gè)人從來沒有學(xué)過建筑學(xué),他也能告訴你通常設(shè)計(jì)和建造一個(gè)帳篷會(huì)比設(shè)計(jì)和建造一棟公寓要簡單。為什么?因?yàn)槲覀兲焐臅?huì)使用物理體積作為事物復(fù)雜性的一個(gè)指標(biāo)。
當(dāng)然。上面說的這兩種邏輯分析并不是總是100%的有效。但大多數(shù)情況下,人們就是這樣干,而且很成功。大多數(shù)情況中,我們?cè)趯?duì)物理過程評(píng)估時(shí),我們的大腦會(huì)對(duì)物理事物進(jìn)行有效的關(guān)聯(lián),不需要依賴之前的經(jīng)驗(yàn)。
現(xiàn)在讓我們來談?wù)勡浖?。?dāng)一個(gè)不懂技術(shù)的人試圖對(duì)軟件開發(fā)時(shí)間進(jìn)行評(píng)估時(shí),有兩個(gè)很基本的直觀指標(biāo)在輔助他們:以體積為指標(biāo)的復(fù)雜度和以速度為指標(biāo)的復(fù)雜度。但他們沒有意識(shí)到,軟件跟他們想象的不一樣。軟件本質(zhì)上不是有形物質(zhì)。沒有體積和速度。它的極小的組成部分可能會(huì)時(shí)不時(shí)的在電腦屏幕上閃現(xiàn)。正因?yàn)槿绱?,?dāng)面對(duì)開發(fā)一個(gè)web應(yīng)用時(shí)(或任何類型的軟件),我們的基本直觀感覺失效了。
這第一點(diǎn),速度,很顯然根本不可能被外行人拿來對(duì)軟件進(jìn)行評(píng)估。于是很自然的,他們傾向于使用體積指標(biāo)進(jìn)行評(píng)估。要么是根據(jù)描述文檔的頁數(shù),要么是根據(jù)軟件的功能用例數(shù)或特征數(shù)。
有時(shí)候,這種評(píng)估手段確實(shí)有效!當(dāng)面對(duì)一個(gè)靜態(tài)網(wǎng)站,沒有特別的設(shè)計(jì)要求,外行人很容易用這種方法估計(jì)出開發(fā)時(shí)間。但是,通常情況下,對(duì)于軟件開發(fā),體積并不能真實(shí)有效的反映復(fù)雜度。
不幸的是,對(duì)于軟件的復(fù)雜度,唯一有效的推測方法是依據(jù)經(jīng)驗(yàn)。而且還不是時(shí)時(shí)都好用。作為一個(gè)程序員,我知道,根據(jù)我之前開發(fā)過的相似的功能特征,我可以估計(jì)出現(xiàn)在的這些功能特征各自要多少開發(fā)時(shí)間。然后,我把總時(shí)間加起來,這就得到了完成整個(gè)項(xiàng)目需要的大致時(shí)間。然而,事實(shí)情況中,每個(gè)項(xiàng)目在開發(fā)過程中都遇到二、三個(gè)瓶頸。這些瓶頸會(huì)肆意的消耗程序員的大量時(shí)間,你在遇到它們之前根本不會(huì)有所預(yù)見。它們會(huì)拖住整個(gè)項(xiàng)目,致使工期延后數(shù)周甚至數(shù)月。
這些是沒有經(jīng)驗(yàn)的人在評(píng)估復(fù)雜度時(shí)不會(huì)理解的。他們不明白在其他事情上都很靈的方法,為什么放到軟件開發(fā)上就不靈了。所以,下一次當(dāng)你聽到有人說“我想你幾天時(shí)間就能把它開發(fā)出來”時(shí),不管是誰說的,都不要懊惱。深呼吸一下,告訴他這篇文章的地址,自己該干什么還干什么。