|
問題是這樣的:你可以用菜單上“導(dǎo)入網(wǎng)頁”的命令,從因特網(wǎng)上導(dǎo)入一個(gè)文件。你也可以用鼠標(biāo)拖放的方法,從磁盤上導(dǎo)入一個(gè)文件。但是菜單上沒有“導(dǎo)入磁盤文件”這個(gè)命令,所以有些用戶沒有發(fā)現(xiàn)CityDesk 有這個(gè)功能,或者他們試圖用“導(dǎo)入網(wǎng)頁”這個(gè)命令去導(dǎo)入磁盤上的文件,結(jié)果造成無法成功導(dǎo)入。 我一開始想這個(gè)問題很好解決,大概的方法就是用一個(gè)兩個(gè)頁面的文件導(dǎo)入向?qū)?。第一頁問你?#8220;你要從哪里導(dǎo)入?”。如果你選擇“磁盤”,第二頁就會(huì)提示你選一個(gè)文件;你要是選擇“因特網(wǎng)”,第二頁就會(huì)提示你輸入一個(gè)URL. 我差點(diǎn)就開始動(dòng)手去實(shí)現(xiàn)我這個(gè)想法了,但是有些事情使得我并沒有這樣做。我決定先寫一個(gè)小的規(guī)約再說。寫出來的規(guī)約如下: 第一頁 你要從哪里導(dǎo)入? 磁盤/因特網(wǎng) 第二頁(磁盤) 標(biāo)準(zhǔn)的打開文件對話框 第二頁(因特網(wǎng)) 用小瀏覽器讓你輸入一個(gè)URL 突然間我想到一個(gè)問題。Windows的打開文件的對話框,通常是由操作系統(tǒng)提供的。能不能把這個(gè)對話框放到我的文件導(dǎo)入向?qū)Ю锩婺兀?/SPAN> 嗯… 我查了一下。是可以這樣做的,但這不是一件好玩的事,而且要花好幾個(gè)小時(shí)的時(shí)間。我能不能不使用導(dǎo)入向?qū)У姆绞侥??我重寫了一下我的?guī)約: 兩個(gè)菜單項(xiàng): 1)從網(wǎng)上導(dǎo)入網(wǎng)頁 -> 顯示URL輸入對話框 2)從磁盤上導(dǎo)入網(wǎng)頁–> 顯示打開文件對話框 這就好多了。三分鐘的設(shè)計(jì)時(shí)間,省了我?guī)讉€(gè)小時(shí)的編程序時(shí)間。 如果你這輩子花了二十分鐘以上的時(shí)間去編軟件代碼的話,你就可能發(fā)現(xiàn)了一條規(guī)則:事情沒有看起來那么簡單。 就像拷貝文件這樣簡單的事,都充滿了危險(xiǎn)。如果第一個(gè)參數(shù)是個(gè)目錄會(huì)如何?如果第二個(gè)參數(shù)是個(gè)文件會(huì)如何?如果同名的文件已經(jīng)存在于目的子目錄會(huì)如何?如果你沒有寫的權(quán)限又會(huì)如何? 如果在拷貝文件的過程中失敗了怎么辦?如果目的地是在一個(gè)遠(yuǎn)程計(jì)算機(jī)上,但是需要身份驗(yàn)證怎么辦?如果文件很大但網(wǎng)絡(luò)連接又慢,所以你需要顯示一個(gè)進(jìn)度條怎么辦?如果文件傳輸速度降到幾乎是零了,你什么時(shí)候放棄拷貝而給用戶一個(gè)錯(cuò)誤信息呢? 一個(gè)面試測試員的好辦法,就是給他們一個(gè)簡單的操作過程,然后讓他們列出可能出現(xiàn)的錯(cuò)誤情況。一個(gè)在Microsoft面試時(shí)典型的問題就是:你怎樣去測試打開文件對話框呢?一個(gè)好的測試員,可以輕而易舉地列出幾十個(gè)令人難以想到的情況去測試(比如“一個(gè)文件顯示在對話框里,然后你去打開它,但是在你按打開的按鈕之前,這個(gè)文件被另一個(gè)用戶刪除了”)。 好,我們得到這樣一個(gè)公理:事情沒有看起來那么簡單。 軟件工程里還有一個(gè)指導(dǎo)思想,那就是你要永遠(yuǎn)想方設(shè)法去減低風(fēng)險(xiǎn)性。一個(gè)要特別小心去避免的風(fēng)險(xiǎn),就是項(xiàng)目進(jìn)度延期的風(fēng)險(xiǎn)。項(xiàng)目延期很不好,因?yàn)槔习鍟?huì)訓(xùn)你,鬧得你挺不高興的。除此之外,這也存在經(jīng)濟(jì)方面的原因,那就是當(dāng)初你決定給你的軟件加某個(gè)功能的時(shí)候,你覺得這個(gè)功能只需要一個(gè)星期就能完成。現(xiàn)在你認(rèn)識(shí)到該功能需要二十個(gè)星期才能完成,那么你當(dāng)初的決定當(dāng)然就是錯(cuò)的。如果你當(dāng)初就知道需要花掉二十個(gè)星期的話,你可能就作出不同的決定了。你作出的錯(cuò)誤決定越多,你公司的財(cái)產(chǎn)被一次性沖銷處理的可能性就越大(甚至你們公司的標(biāo)志會(huì)被收入債權(quán)人的倉庫)。到時(shí)候你的前老板抱怨道:“我們公司關(guān)門倒閉了不說,氣人的是連上fuckedcompany的資格都沒有。” 事情沒有看起來那么簡單,再加上減低風(fēng)險(xiǎn)性的指導(dǎo)思想,只能讓你得出如下的結(jié)論: 先設(shè)計(jì)再編程序,先思而后行。 讓你失望了,很抱歉。我知道你讀過Kent Beck的書,所以你以為動(dòng)手之前不做設(shè)計(jì)是可以的。對不起,那是不可以的。你修改程序不可能像修改設(shè)計(jì)文件那樣“容易”。有些人總是發(fā)表這樣的謬論:“我們現(xiàn)在用高級工具了,像Java和XML。 我們在幾分鐘之內(nèi),就可以改動(dòng)程序里的很多東西。為什么不在程序里直接設(shè)計(jì)呢?”哥們兒,你可以在你自行車上加個(gè)發(fā)動(dòng)機(jī),但你不能把它變成汽車。如果你以為把你拷貝文件的程序,由線程式改為搶占式,而且改得比我寫這句話還快,那你就大錯(cuò)特錯(cuò)了。 不管怎么說,我不認(rèn)為Extreme Programming是在鼓吹零設(shè)計(jì)的理念。他們只是說:“不要作任何無必要的設(shè)計(jì)”,這沒有什么錯(cuò)嘛。但人們聽到的并不是這樣。大多數(shù)程序員是在找不用設(shè)計(jì)的借口,所以他們像飛蛾撲火般投向“不用設(shè)計(jì)” 這個(gè)餿主意。這是一種奇怪的,讓你事倍功半的懶惰方式。我懶得先在紙上把這個(gè)功能給設(shè)計(jì)好了,所以我就先寫程序,然后發(fā)現(xiàn)不對,我就去改,結(jié)果反倒花更多的時(shí)間?;蛘?,更經(jīng)常發(fā)生的是,我先寫些程序,發(fā)現(xiàn)它不對,但是沒時(shí)間改了,結(jié)果我的產(chǎn)品質(zhì)量低劣,而且我還是要找出些借口,說明它為什么“一定要那樣“。那只不過是馬虎潦草,缺乏職業(yè)精神。
Linus Torvalds攻擊設(shè)計(jì)的時(shí)候,他是在講那些規(guī)模龐大的系統(tǒng)。大規(guī)模的系統(tǒng)必須慢慢進(jìn)化,要不然它們就變成Multics了。他不是在說你那個(gè)拷貝文件的程序。你再想想,Linus Torvalds腦子里有一個(gè)很清楚的路線圖,知道他要到哪去,所以他覺得設(shè)計(jì)沒什么用,也不足為奇。但不要上當(dāng),基本上說那對你不適用。Linus Torvalds比我們聰明多了,所以他能干的事,不等于我們一般人也能干。漸增式設(shè)計(jì)及實(shí)現(xiàn)是好事。頻繁地發(fā)布版本是可以的(但針對在大眾市場上的軟件來說,頻繁發(fā)布版本會(huì)使用戶不高興,絕不是個(gè)好主意——可以多搞些內(nèi)部的里程碑取而代之)。設(shè)計(jì)上不要拘泥于形式,那只是浪費(fèi)時(shí)間。我從來沒有見過某個(gè)項(xiàng)目得益于不動(dòng)腦筋的流程圖、UML、CRC,或者其他什么時(shí)髦的,花里呼哨的設(shè)計(jì)方法。至于那些Linus Torvalds說的系統(tǒng),那些有一千萬行代碼程序的龐然大物,它們應(yīng)該慢慢進(jìn)化,因?yàn)槿祟愡€不知道怎樣設(shè)計(jì)那種規(guī)模的軟件。
但是當(dāng)你坐下來寫你的拷貝文件的程序,或者計(jì)劃給你的軟件下個(gè)版本增添功能的時(shí)候,你一定要先作設(shè)計(jì)。不要讓報(bào)急的號角使你草草動(dòng)手。 |
|
|