需求變化與IoC
需求又變了,怎么辦?
最近微博上流行一個(gè)段子:
程序員XX遭遇車禍成植物人,醫(yī)生說活下來的希望只有萬分之一,喚醒更為渺茫??伤腖ead和親人沒有放棄,他們根據(jù)XX工作如命的作風(fēng),每天都在他身邊念:“XX,需求又改了,該干活了,你快來呀!”,奇跡終于發(fā)生了,XX醒來了,第一句話:“需求又改了?”。
這個(gè)段子用幽默的方式反映了需求變化是每一個(gè)程序員、架構(gòu)師或項(xiàng)目經(jīng)理都會(huì)經(jīng)常遇到的問題。面對這個(gè)問題,不同的人有不同的應(yīng)對之道,最近微博上有一段關(guān)于需求變化的討論:
@假裝刺猬的豬:我們在軟件開發(fā)過程中,會(huì)持續(xù)碰到客戶需求變更的情況。如果沒有領(lǐng)域建模,我們單純將問題使用直覺將問題解決,那么等到客戶需求變更或者有新的需求時(shí),就會(huì)面臨一個(gè)僵硬的前設(shè)計(jì)!無法在以前的設(shè)計(jì)上持續(xù)深入的優(yōu)化模型,導(dǎo)致需求變更無法及時(shí)深化。設(shè)計(jì)實(shí)現(xiàn)均滯后與變更!
@高煥堂: <碰到客戶需求變更的情況>是合理的;但<領(lǐng)域建模>不是美好的手段!!!
@weidagang: 要不被客戶牽著鼻子走,需要自己有很強(qiáng)的設(shè)計(jì)能力,反過來讓客戶跟著你的設(shè)計(jì)來滿足你的要求。能做到這點(diǎn)的公司很少,但這是軟件行業(yè)唯一有希望的出路。
@高煥堂: <這是軟件行業(yè)唯一有希望的出路>。 Great!!
如何應(yīng)對需求變化? @假裝刺猬的豬 的答案是領(lǐng)域建模,并持續(xù)優(yōu)化模型,適應(yīng)需求的變化。@高煥堂 則認(rèn)為領(lǐng)域建模不是美好的手段。我進(jìn)一步補(bǔ)充,應(yīng)該“反過來”讓自己在需求變化中處于主導(dǎo)地位,而不是被動(dòng)地適應(yīng)。
控制反轉(zhuǎn) (IoC)
什么樣就算是“反過來”了呢?舉個(gè)例子:
用戶想購買一臺(tái)普通PC,他只想電腦能流暢運(yùn)行魔獸世界,他根本不想知道什么叫主板,什么叫內(nèi)存,什么叫CPU;但他不得不接受必須購買主板、CPU、內(nèi)存的事實(shí),因?yàn)镻C架構(gòu)是產(chǎn)業(yè)標(biāo)準(zhǔn),而不是由用戶定的??蛻粲羞x擇的權(quán)利,但沒有設(shè)計(jì)的權(quán)利,客戶的需求必須在設(shè)計(jì)框架下得到滿足。
這里我們要問PC架構(gòu)是保護(hù)了誰的利益?顯然,直接的受益者是廠商。如果沒有PC架構(gòu)的保護(hù),廠商就會(huì)直接面對客戶,客戶說我需要功能A,我馬上分析設(shè)計(jì)實(shí)現(xiàn)功能A;客戶說我要功能B,我馬上分析設(shè)計(jì)實(shí)現(xiàn)功能B … 有了PC架構(gòu)的保護(hù),廠商就變得更加強(qiáng)勢,用戶的一切需求都必須在PC架構(gòu)下來談。廠商可以傾聽用戶的聲音,不斷改進(jìn)產(chǎn)品,但設(shè)計(jì)主導(dǎo)權(quán)永遠(yuǎn)在自己手中。我們IT行業(yè)常常用“做產(chǎn)品”和“做項(xiàng)目”的視角來區(qū)分不同的公司,但很少有人用“做設(shè)計(jì)”的視角來看。實(shí)際上,關(guān)鍵的問題在于設(shè)計(jì)主導(dǎo)權(quán)是廠商還是在客戶。如果設(shè)計(jì)主導(dǎo)權(quán)在客戶,不管是做產(chǎn)品、做服務(wù)還是做項(xiàng)目,其命運(yùn)必然是疲于奔命應(yīng)付客戶,最后獲得微薄的利潤;如果設(shè)計(jì)主導(dǎo)權(quán)在廠商,不管做產(chǎn)品、做服務(wù)還是做項(xiàng)目都能有更多的話語權(quán)和更高的利潤。
當(dāng)然,光有設(shè)計(jì)還不夠,必須客戶接受才能起到通過設(shè)計(jì)掌握主導(dǎo)權(quán)的作用。這一方面需要自己具有很強(qiáng)的設(shè)計(jì)能力,如蘋果就是以設(shè)計(jì)能力著稱的公司;另一方面,和其他廠商結(jié)盟壯大陣營也是一種方法,如最著名的Wintel聯(lián)盟(Windows+Intel),以及現(xiàn)在的日益壯大的Android陣營都屬于此類。假如有廠商不遵守PC產(chǎn)業(yè)標(biāo)準(zhǔn),說我的PC就沒有主板,沒有顯卡,因?yàn)橛脩舾徊恍枰@些東西;那么,它要么像蘋果一樣獨(dú)樹一幟成為一種新的標(biāo)準(zhǔn),要么無人問津。
我所談到的“反過來”本質(zhì)上就是軟件設(shè)計(jì)中的控制反轉(zhuǎn) (Inversion of Control, IoC)思想。IoC是每一個(gè)初級程序員向高級進(jìn)階所需要了解的最重要的設(shè)計(jì)思想。由于Spring等開發(fā)框架的流行,知道IoC概念的程序員不在少數(shù),但不少人對于IoC的理解僅僅停留在通過依賴注入 (Dependency Injection)實(shí)現(xiàn)解耦這個(gè)層面。實(shí)際上,IoC的應(yīng)用不僅包括解耦,它還是框架的基本原理,在非計(jì)算機(jī)領(lǐng)域,IoC也是無處不在,如果你能從上面的例子中體會(huì)到IoC,這才算是融會(huì)貫通了。
軟件開發(fā)中一種最常見的模式是“以用戶為出發(fā)點(diǎn),以需求分析為核心”。該模式提倡從用戶需求中分析推導(dǎo)出設(shè)計(jì)和實(shí)現(xiàn),比如,TDD式的設(shè)計(jì)正是這類典型。而IoC式的軟件設(shè)計(jì)與此截然相反,IoC的設(shè)計(jì)是一種“以愿景(自身利益是愿景的重要方面)為出發(fā)點(diǎn),以架構(gòu)為核心”的模式。如果用戶的需求是一臺(tái)電腦,我們?nèi)绾文芡ㄟ^第一種模式分析需求推導(dǎo)出“主板-CPU-內(nèi)存-外設(shè)”的PC架構(gòu)呢?恐怕很難。IoC式的設(shè)計(jì)是以用戶看不見摸不著的架構(gòu)為核心,自己主導(dǎo)設(shè)計(jì),用戶需求是設(shè)計(jì)的約束條件和驗(yàn)證手段,而不是出發(fā)點(diǎn)和目標(biāo)。我們想要掌握主動(dòng),不被需求變化搞得疲于奔命,就必須以愿景為導(dǎo)向,以設(shè)計(jì)為中心。
我們的人生都被環(huán)境和各種客觀條件所束縛,多數(shù)人只能隨波逐流,聽從命運(yùn)的安排。你有沒有想過要擁有人生的主導(dǎo)權(quán)呢?既然你是程序員,你懂IoC,你能否設(shè)計(jì)自己的人生框架呢?Yes,you can!
文章來源:@weidagang
- 目前還沒評論,等你發(fā)揮!