軟件開(kāi)發(fā)前期設(shè)計(jì)時(shí)的注意事項(xiàng)
說(shuō)起軟件設(shè)計(jì),我們可能每個(gè)人都做過(guò),但是什么樣的方案才是好的設(shè)計(jì)方案?如何才能設(shè)計(jì)出一個(gè)好的設(shè)計(jì)方案?在設(shè)計(jì)過(guò)程中需要注意哪些呢?不要總是說(shuō):低耦合、可維護(hù)性、可擴(kuò)展性、簡(jiǎn)易性、可重用性等,本文試圖另一個(gè)角度出發(fā),帶著前面的這些問(wèn)題,使大家能明白那些問(wèn)題的答案,并與大家一起探討。
什么樣的方案才是好的設(shè)計(jì)方案?
當(dāng)我們完成了一個(gè)良好的設(shè)計(jì)方案后,我們回頭再仔細(xì)分析是什么因素影響了我們的思路,使我們最終完成(確切的說(shuō)是選擇了)了這個(gè)設(shè)計(jì)方案(而不是另一個(gè)),我們會(huì)發(fā)現(xiàn)這些因素是:用戶功能性的需求、技術(shù)性能上的要求和研發(fā)成本(或能力)的制約,當(dāng)然其實(shí)還有一些其它因素如:客戶主觀上的要求、審美或商務(wù)因素、向前兼容性要求等,不過(guò)這些因素多半是一些非技術(shù)性因素,我們?cè)诖瞬蛔鲞^(guò)多討論;能否很好的滿足這些因素就決定了一個(gè)設(shè)計(jì)方案是否是一個(gè)好的設(shè)計(jì)方案,所以我們?cè)谠O(shè)計(jì)之初就必須對(duì)這些因素加以充分的考慮。
如何才能設(shè)計(jì)出一個(gè)好的設(shè)計(jì)方案?
但事實(shí)上,基本上沒(méi)有一個(gè)方案是可以每個(gè)因素都能***滿足的,一個(gè)好的設(shè)計(jì)方案,往往是一個(gè)平衡的結(jié)果,這也是為什么我們?cè)谟懻撛O(shè)計(jì)方案是總是可能爭(zhēng)論不休的原因,因?yàn)椴煌娜藦牟煌慕嵌瘸霭l(fā)都可以得到他認(rèn)為好的一個(gè)方案,人們總是會(huì)有各自的理由,而且那些理由都是有道理的,但請(qǐng)大家記?。阂粋€(gè)好的設(shè)計(jì)方案,往往是一個(gè)平衡的結(jié)果。從某種意義上說(shuō)能否做好平衡是決定一個(gè)方案是否是好的方案的關(guān)鍵,尤其是對(duì)那些復(fù)雜的大的設(shè)計(jì)方案。
平衡的藝術(shù)
但怎樣才能做好平衡呢? 答案顯然不是:“ 一碗水要端平 ” 。有一個(gè)著名的原理叫 28 原理,它同樣也適合我們軟件開(kāi)發(fā)的規(guī)律,我們的百分之 80 的精力設(shè)計(jì)和開(kāi)發(fā)的部分只給我們帶來(lái)了百分之 20 的回報(bào),或者說(shuō),我們百分之 80 的回報(bào)只是我們的百分之 20 的努力得來(lái)的,這個(gè)原理告訴我們,我們?cè)谄胶鈺r(shí)要抓住重點(diǎn),那些非重點(diǎn)的部分,如果必要可以舍棄,舍棄它們可能會(huì)帶來(lái)更大的價(jià)值。下面我們先分析一下前面提到的幾個(gè)關(guān)鍵因素來(lái)仔細(xì)討論下平衡的藝術(shù)。
用戶功能性的需求
毫無(wú)疑問(wèn),我們的軟件最終的目的就是為了要滿足用戶的需求,由于我們要設(shè)計(jì)的是一個(gè)產(chǎn)品型的軟件,這就決定了我們的需求不是很好明確,面可能比較廣,甚至有些需求可能還是我們自己想象出來(lái)的,但正因?yàn)槿绱宋覀儾庞衅胶獾谋匾囅肴绻覀冏龅氖且粋€(gè)項(xiàng)目,那只需要按照甲方的要求完成即可,合同上甚至很明確要求了,此時(shí)也沒(méi)有多少需要平衡的了。一個(gè)產(chǎn)品型的軟件,要把百分之80 以上用戶都用的功能進(jìn)行良好的設(shè)計(jì)做到易用好用性能出眾并投入大量人力研發(fā),而那些 50% 用戶會(huì)用到的需求就可以少投入些人力與時(shí)間,那些百分之 5 用戶才可能會(huì)用的功能且需要耗費(fèi)大量人力時(shí)間的甚至可以舍棄不做。
但平衡也不僅僅是在與選擇做與不做某個(gè)功能,更在于怎么做某個(gè)功能,一般對(duì)于用戶的需求我們會(huì)有下面幾個(gè)實(shí)現(xiàn)方式:
1 實(shí)現(xiàn)一個(gè)簡(jiǎn)單易用、設(shè)計(jì)良好、100% 滿足用戶需求的界面或功能
2 通過(guò)一些界面上的選項(xiàng)設(shè)置來(lái)實(shí)現(xiàn)用戶的需求
3 通過(guò)手工修改一些配置文件來(lái)實(shí)現(xiàn)用戶的需求(這種實(shí)現(xiàn)方式可能需要的研發(fā)資源只占***種實(shí)現(xiàn)方式的1% )
4 通過(guò)腳本來(lái)實(shí)現(xiàn)用戶的需求
5 通過(guò)插件或定制開(kāi)發(fā)來(lái)實(shí)現(xiàn)用戶的需求(后2 種方式其實(shí)就是說(shuō)現(xiàn)在不考慮這個(gè)需求,以后就算有了我們能支持即可)
不同的實(shí)現(xiàn)方式需要投入不同的量級(jí)的研發(fā)資源,從上至下占用研發(fā)資源越來(lái)越少,這就是我們需要做平衡的地方。
技術(shù)性能上的要求
用戶總希望在軟件界面上執(zhí)行任何操作都能立即得到結(jié)果、希望系統(tǒng)能支持越來(lái)越多的在線并發(fā)、希望系統(tǒng)能全年不停機(jī)運(yùn)行不出任何錯(cuò)誤,希望系統(tǒng)能兼容各種平臺(tái)…… ,所以對(duì)我們的系統(tǒng)有很多性能上的要求,要求我們必須支持集群、各種高速緩存、多語(yǔ)言、支持事務(wù)操作等,有些性能要求是必須在設(shè)計(jì)之初加以認(rèn)真考慮的,因?yàn)閺囊酝慕?jīng)驗(yàn)來(lái)看,如果出于研發(fā)成本的考慮,系統(tǒng)一開(kāi)始沒(méi)有考慮集群、多語(yǔ)言、事務(wù),而在以后系統(tǒng)成型后再予以考慮,那會(huì)往往付出更大的代價(jià),這種代價(jià)有時(shí)是傷筋動(dòng)骨的。
同樣是滿足用戶功能上的需要,一個(gè)實(shí)現(xiàn)需要投入大量研發(fā)資源,但程序效率很高,而另一個(gè)只需要少量的研發(fā)資源,但程序效率稍差,此時(shí)該如何平衡呢?相信大多數(shù)人都能做出正確的選擇,要綜合考慮:目前可用的人力資源數(shù)量、需要投入的研發(fā)資源的差異,模塊的使用頻度的因素;我經(jīng)常說(shuō),對(duì)于客戶端應(yīng)用來(lái)說(shuō)在用戶的一次界面操作中只執(zhí)行一次的函數(shù)就可以少花點(diǎn)時(shí)間實(shí)現(xiàn),因?yàn)?ms 完成一個(gè)操作的執(zhí)行和 300ms 完成一個(gè)菜單的執(zhí)行其實(shí)對(duì)用戶來(lái)講是差別不大的,但這個(gè)并不適用與服務(wù)器端應(yīng)用,服務(wù)器端應(yīng)用還需要考慮到在線人數(shù),如果能 3ms 完成就能支持更多的在線用戶。
研發(fā)成本(或能力)的制約
這個(gè)因素往往是我們最應(yīng)該多考慮,但是經(jīng)常缺忽視的一個(gè)因素。
以一個(gè)工程師一年開(kāi)發(fā)3 個(gè)模塊和一年讓他開(kāi)發(fā) 10 個(gè)模塊來(lái)做個(gè)比較,只開(kāi)發(fā) 3 個(gè)模塊時(shí),他基本上可以做到讓每個(gè)模塊完成到 90 分以上,包括代碼質(zhì)量、測(cè)試單元、文檔等,還能有些時(shí)間學(xué)習(xí)和研究些新技術(shù),并能保持一個(gè)愉快的心情高效率的工作下去;但是如果一年讓他開(kāi)發(fā) 10 個(gè)模塊,他可能只能勉強(qiáng)做到讓每個(gè)模塊完成 60 分以上,代碼可能有考慮不周全留下隱患、測(cè)試覆蓋率不高、文檔欠缺,終日忙于趕進(jìn)度沒(méi)時(shí)間充電,工作疲憊效率低下。
多半的研發(fā)工程師是樂(lè)觀的,在開(kāi)始的時(shí)候自信滿滿,過(guò)低的估計(jì)了研發(fā)需要的時(shí)間,我經(jīng)常說(shuō),要把一個(gè)模塊完成到60 分可能 1 個(gè)人月,要完成到 80 分可能就要 3 個(gè)人月,要完成到 90 分以上可能需要 8 個(gè)人月,這個(gè)增長(zhǎng)的比例并不是直線性的而是拋物線形的,所以研發(fā)周期往往難以估計(jì),我們必須為將來(lái)準(zhǔn)備足夠的緩沖時(shí)間,某種意義說(shuō),越多越好。
所以這也正是在上面的一些平衡過(guò)程中,有一些因素要讓位于研發(fā)資源的投入的重要原因,一個(gè)為將來(lái)的研發(fā)困難做好了充分準(zhǔn)備的設(shè)計(jì)方案才能算是一個(gè)好的方案。
在設(shè)計(jì)過(guò)程中需要注意哪些呢?
從需求出發(fā)
從用戶角度理解的需求出發(fā)考慮總是沒(méi)錯(cuò)的,最忌設(shè)計(jì)時(shí)只考慮技術(shù)方面的問(wèn)題,當(dāng)然技術(shù)方面的問(wèn)題也必須予以考慮,但前提是必須對(duì)需求***充分的了解和分析,從需求出發(fā)并不是說(shuō)需求***,需求有時(shí)也必須讓位于其他的一些因素,要做好平衡。
從一開(kāi)始就考慮那些影響面很廣的技術(shù)要求
這些因素很可能嚴(yán)重的影響設(shè)計(jì),必須提前予以研究,這種研究可以是脫離需求的零散的,有時(shí)甚至可以寫(xiě)一些測(cè)試代碼,但最終必須還是從需求出發(fā),在充分的了解了各種技術(shù)點(diǎn)之后,再?zèng)Q定自己的最終設(shè)計(jì)
充分考慮研發(fā)資源成本
再好的設(shè)計(jì)沒(méi)有付諸實(shí)施的資本也不行,所以還是那句話,要做好平衡。
【編輯推薦】