淺談敏捷開(kāi)發(fā)思想中的簡(jiǎn)單最好原則
極限編程堅(jiān)持只為今天的需求設(shè)計(jì)以及編碼,而不用考慮明天。這頗有一些“做一天和尚撞一天鐘”的意味。
這個(gè)原則帶來(lái)一個(gè)問(wèn)題,那就是我們還需要設(shè)計(jì)嗎?
我們強(qiáng)調(diào)設(shè)計(jì),其目的就在于設(shè)計(jì)出合理、優(yōu)雅的結(jié)構(gòu),以提供具有良好復(fù)用性與可擴(kuò)展性的系統(tǒng),這是一種未雨綢繆,為未來(lái)考慮。而現(xiàn)在,我們?nèi)粢裱璌ISS原則,就是不再考慮明天的需求。顯然,這兩者的觀點(diǎn)是相悖的。于是,矛盾出現(xiàn):一方面我們需要保持設(shè)計(jì)簡(jiǎn)單,不做無(wú)謂的功能預(yù)測(cè);另一方面,我們又需要擁抱變化,在盡可能少的改變結(jié)構(gòu)與代碼的情況之下,滿足未來(lái)的需求。
如何解決這個(gè)矛盾。讓我們先看看提出簡(jiǎn)單原則的初衷。在《敏捷開(kāi)發(fā)思想之擁抱變化》一篇中,我提到需求的變化是不可避免的。即使是最優(yōu)秀的需求分析師和架構(gòu)設(shè)計(jì)師都不可能在項(xiàng)目之初窮盡所有客戶要求的功能,作出最完美的分析與設(shè)計(jì),即做到“增之一分則太多,減之一分則太少”。我們需要把握分析和設(shè)計(jì)的“度”。但事實(shí)卻是,我們總喜歡越俎代庖,利用自己的經(jīng)驗(yàn)幫助客戶提出需求,而事后證明這些需求往往是多余的。我們總是在重復(fù)做著“吃力不討好”的事情,與其如此,還不如在事先偷懶取巧。因?yàn)樾枨蟮淖兓偸遣豢煽氐?,根?jù)“利益趨避原則”,自然應(yīng)選擇對(duì)自己更有利的一個(gè)趨向。
但這種簡(jiǎn)單并不是“簡(jiǎn)陋”,即使我們不需要考慮明天的需求,一些好的重用原則與可擴(kuò)展原則仍然需要遵循。例如,我們應(yīng)盡量保證對(duì)象是高內(nèi)聚、低耦合的;我們應(yīng)遵循“面向接口編程”原則。一言以蔽之,我們需要做到:
1、減少依賴;
2、合理抽象;
3、功能最簡(jiǎn)。
簡(jiǎn)單設(shè)計(jì)還需要重構(gòu)來(lái)保證設(shè)計(jì)的質(zhì)量。我們之所以敢于奢談“簡(jiǎn)單”,正是因?yàn)橹貥?gòu)的保障。即使設(shè)計(jì)過(guò)于粗陋,合理利用重構(gòu)也能夠亡羊補(bǔ)牢。在重構(gòu)過(guò)程中,我們?nèi)匀恍枰裱?jiǎn)單原則,僅為當(dāng)前的需求對(duì)系統(tǒng)結(jié)構(gòu)進(jìn)行重構(gòu)。例如,我們?cè)谧畛醯男枨蠓治鲋校挥幸粋€(gè)功能要求發(fā)送電子郵件。那么,我們可以編寫一個(gè)方法來(lái)封裝發(fā)送電子郵件的實(shí)現(xiàn),這個(gè)方法甚至可以放在業(yè)務(wù)對(duì)象的私有方法中。隨著需求的逐步演進(jìn),新增的幾個(gè)功能同樣需要發(fā)送電子郵件,此時(shí)就有必要利用重構(gòu)技術(shù),將原來(lái)發(fā)送電子郵件的方法獨(dú)立到單獨(dú)的類中。但是,基于簡(jiǎn)單原則,我們沒(méi)有必要完善所有功能,例如增加發(fā)送Meet Request的功能。因?yàn)槟壳暗男枨蟛⒉恍枰?/P>
“簡(jiǎn)單”并不只限于設(shè)計(jì)。在敏捷開(kāi)發(fā)過(guò)程中,我們還需要保證項(xiàng)目計(jì)劃的簡(jiǎn)單,以及文檔的簡(jiǎn)單,乃至于過(guò)程的簡(jiǎn)單。項(xiàng)目計(jì)劃的簡(jiǎn)單可以由小步行進(jìn)的迭代周期來(lái)保證,通過(guò)對(duì)項(xiàng)目階段的分解,簡(jiǎn)化項(xiàng)目計(jì)劃。至于文檔的簡(jiǎn)單,我們完全可以拋棄復(fù)雜標(biāo)準(zhǔn)的文檔模板,轉(zhuǎn)而書寫僅僅是自己需要關(guān)注的內(nèi)容。至少,項(xiàng)目?jī)?nèi)部的文檔完全可以言之有物,而不需要注重形式。我們還可以通過(guò)對(duì)項(xiàng)目過(guò)程進(jìn)行裁剪,來(lái)保障過(guò)程的簡(jiǎn)單性。事實(shí)上,在極限編程中,很多原則和實(shí)踐都是為了實(shí)現(xiàn)簡(jiǎn)單而提出的。例如計(jì)劃游戲、小版本、簡(jiǎn)單設(shè)計(jì),包括持續(xù)集成和代碼所有權(quán),都是為了提高開(kāi)發(fā)過(guò)程的效率,這實(shí)際上也是簡(jiǎn)單的一種體現(xiàn)。
敏捷開(kāi)發(fā)思想中“簡(jiǎn)單最好”是一種心態(tài),更是一條原則。
【編輯推薦】