軟件架構(gòu)強調(diào)的是整體,而整體性的設(shè)計決策必須基于對需求的全面認識;
軟件架構(gòu)應(yīng)該是穩(wěn)定的,而遺漏了重要需求的架構(gòu)設(shè)計面臨的是返工的命運。
一言以蔽之,全面認識需求,是生產(chǎn)出高質(zhì)量軟件所必須的“第一項修煉”。
作為一個軟件架構(gòu)師,也不應(yīng)對所有需求“胡子眉毛一把抓”,而是應(yīng)全面認識需求——分門別類地將需求梳理清楚。
要全面認識需求,意味著我們必須從不同級別來考察需求:組織級、用戶級、開發(fā)級,還要對每個級別考慮不同類型的需求:功能需求、質(zhì)量屬性、約束。
一方面,需求是分層次的。一個成功的軟件系統(tǒng),對客戶高層而言能夠幫助他們達到業(yè)務(wù)目標(biāo),這些目標(biāo)就是客戶高層眼中的需求;對實際使用系統(tǒng)的最終用戶而言,系統(tǒng)提供的能力能夠輔助他們完成日常工作,這些能力就是最終用戶眼中的需求;對開發(fā)者而言,有著更多用戶沒有覺察到的“需求”要實現(xiàn)……
關(guān)注需求層次的實踐意義在于,在需求之間建立起“可跟蹤性”,避免因遺漏需求而造成軟件“達不到要求”,也避免開發(fā)人員一廂情愿地為用戶“制造”沒有實際意義的無用功能。理解了需求分層的道理,軟件人員在聽到客戶方的老板說“需求就是我希望這套軟件能幫我賺更多的錢”時,就不會覺得好笑了,因為他知道這可能就是創(chuàng)建這套軟件系統(tǒng)的商業(yè)目標(biāo),并會對其他需求和設(shè)計產(chǎn)生影響。
另一方面,需求應(yīng)該被分為不同的類型。例如,一個網(wǎng)上書店系統(tǒng)的功能需求可能包括“瀏覽書目”、“下訂單”、“跟蹤訂單狀態(tài)”、“為書籍打分”等,質(zhì)量屬性需求包括“互操作性”和“安全性”等,而“必須運行于Linux平臺之上”屬于約束性需求之列。實踐一再表明,忽視質(zhì)量屬性和約束性需求,常常導(dǎo)致架構(gòu)設(shè)計最終失敗。
總之,通過需求分類,將有助于全面認識需求、分門別類地把握需求、設(shè)計出高質(zhì)量的軟件架構(gòu)。
全面認識需求還有一層含義,那就是應(yīng)當(dāng)在深思熟慮之后做出合適的需求權(quán)衡和取舍。一方面,眾多質(zhì)量屬性需求之間往往會有沖突,我們必須權(quán)衡。另一方面,如果通過復(fù)雜設(shè)計所支持的變化根本不會發(fā)生,那么這種過度設(shè)計(Overengineering)就造成了資源的浪費并增加了開發(fā)難度。有人主張不要預(yù)測未來,本書并不同意,本書認為應(yīng)當(dāng)有依據(jù)地支持未來變化,對變化的判斷應(yīng)該來自對需求及需求背景的深刻把握。
項目經(jīng)理勝任力免費測評PMQ上線啦!快來測測你排多少名吧~
http://m.opto-elec.com.cn/pmqhd/index.html