英文原文:Tips for Effective Software Reuse
作者:Vijay Narayanan 譯者:王麗娟 發(fā)布于 2009年12月30日
構(gòu)建軟件的每個(gè)人都會(huì)告訴你,實(shí)現(xiàn)軟件重用極具挑戰(zhàn)性。大規(guī)模、系統(tǒng)級(jí)的重用更是如此。開發(fā)人員要在最后期限內(nèi)滿足需求、交付功能,同時(shí)還要優(yōu)先保證重用就非常難了。如果你是團(tuán)隊(duì)領(lǐng)導(dǎo),這個(gè)處境只會(huì)變本加厲——你必須滿足贊助商的需求,在預(yù)算內(nèi)按時(shí)交付功能,還要管理開發(fā)團(tuán)隊(duì)。重用,重用什么?
我參與了幾個(gè)項(xiàng)目,團(tuán)隊(duì)的生產(chǎn)率都非常高,我認(rèn)識(shí)到軟件重用是可行的。這并不是說勉強(qiáng)做到重用很容易、有方法可循。抑制重用的一個(gè)關(guān)鍵因素是,從組織的政治、文化背景來說缺乏領(lǐng)導(dǎo)力和遠(yuǎn)見,而且沒有與業(yè)務(wù)贊助商需要的內(nèi)容相結(jié)合。有些重用的嘗試以失敗而告終,是因?yàn)樗麄兲^雄心勃勃了,為了設(shè)計(jì)完美的內(nèi)容而花費(fèi)大量精力去做大規(guī)模的先行設(shè)計(jì)。還有其它一些失敗的原因,比如缺乏靈活的設(shè)計(jì)、規(guī)劃不充分,或是資金問題。溝通效率和對(duì)現(xiàn)有可重用軟件資產(chǎn)的了解也是一個(gè)關(guān)鍵因素。
本文將根據(jù)我從幾個(gè)項(xiàng)目中總結(jié)的經(jīng)驗(yàn),介紹一些成功進(jìn)行系統(tǒng)級(jí)重用的小提示。這些提示并非盡善盡美,我只是想讓開發(fā)人員和團(tuán)隊(duì)領(lǐng)導(dǎo)能對(duì)各種策略(技術(shù)和非技術(shù)的)有所理解,從而成功地進(jìn)行系統(tǒng)級(jí)重用。
提示1——關(guān)注領(lǐng)域特定的軟件資產(chǎn)
業(yè)務(wù)資產(chǎn)能讓你的應(yīng)用或產(chǎn)品線獨(dú)樹一幟,讓你的組織與眾不同,最終讓你從競(jìng)爭(zhēng)對(duì)手中脫穎而出。開發(fā)、發(fā)布、迭代改進(jìn)領(lǐng)域相關(guān)軟件資產(chǎn)的速度越快,你就越能迅速地滿足不斷變化的業(yè)務(wù)需求、讓客戶滿意。如果你只關(guān)注于構(gòu)建可重用的業(yè)務(wù)資產(chǎn),那這不僅對(duì)業(yè)務(wù)交付有好處,同時(shí)還能在未來的項(xiàng)目中進(jìn)行重用。
開發(fā)人員往往滿懷熱情地編寫技術(shù)方案,專注于可重用組件和服務(wù)的構(gòu)建,而解決的問題卻在公司內(nèi)部或開源社區(qū)有解決方案。既然你非要這么做,那你就必須盡量避免為已有的解決方案編寫新的代碼。這不正是軟件重用嗎?
提示2——正確命名軟件資產(chǎn)
無論你是給方法、類、組件、庫命名,還是給服務(wù)命名,要想取個(gè)好名字,首先得想清楚軟件的目的和功能。合適的名字可以幫助我們找到已有的可重用軟件資產(chǎn)。另外,在重構(gòu)已有軟件資產(chǎn)、使其更容易被重用時(shí),這一點(diǎn)也卓有成效。
當(dāng)你發(fā)現(xiàn)doEverything()
這樣的方法或類似于SendDataToXYZSystemService
的服務(wù)時(shí),花點(diǎn)兒時(shí)間給它們重新命名。評(píng)估應(yīng)用的現(xiàn)有功能時(shí),不好的名字常常會(huì)花費(fèi)你更多的時(shí)間。如果名字太過愚蠢,你可能就識(shí)別不出已有的功能,而去創(chuàng)建一個(gè)重復(fù)的。
除了繼續(xù)遵守一般的準(zhǔn)則外,好名字還應(yīng)該與問題領(lǐng)域聯(lián)系在一起——基于業(yè)務(wù)功能給軟件資產(chǎn)命名是個(gè)不錯(cuò)的主意。如果你要將更新的訂單內(nèi)容發(fā)布到另一個(gè)系統(tǒng)去,那為什么不用PublishOrderUpdates
替代SendDataToABCSystem
這個(gè)名字呢?資產(chǎn)名稱全都簡(jiǎn)單、清晰、準(zhǔn)確時(shí),你會(huì)驚奇地發(fā)現(xiàn)這很有利于你重用這些資產(chǎn)。
提示3——不確定它們是否可重用?那就晚點(diǎn)兒再動(dòng)手
領(lǐng)域中真正有趣的問題是需要經(jīng)過深思熟慮的,需要與項(xiàng)目利益相關(guān)者協(xié)作,還需要多次迭代和最終用戶的反饋。這一要求對(duì)充分進(jìn)行系統(tǒng)級(jí)重用來說是非常寶貴的。如果僅僅因?yàn)榭雌饋砜芍赜茫撬鼘?shí)際上也許并不可重用……至少目前還不是。考慮一下這些問題:
當(dāng)你對(duì)潛在可重用資產(chǎn)的疑問多于答案時(shí),不要急著概括、增加抽象層次或產(chǎn)品差異性。相反,著眼于那些只針對(duì)當(dāng)前迭代或發(fā)布的業(yè)務(wù)需求和實(shí)現(xiàn)。正是因?yàn)槟憧赡懿磺宄粗膬?nèi)容,所以將想法或功能標(biāo)記為可重用備選項(xiàng),但不一定非要使其可重用。
在《軟件架構(gòu)師應(yīng)該知道的97件事》中,Kevlin Henney在其中一條里提到了“通用之前先簡(jiǎn)單,重用之前先可用”('Simplicity Before Generality, Use Before Reuse.')這個(gè)概念。請(qǐng)記住,在項(xiàng)目的整個(gè)生命周期中,結(jié)合真實(shí)用戶的反饋進(jìn)一步理解領(lǐng)域只會(huì)對(duì)你有所幫助,而不會(huì)影響你的目標(biāo)。
提示4——迭代演進(jìn)可重用的資產(chǎn)
當(dāng)你認(rèn)識(shí)到需要可重用的軟件資產(chǎn)時(shí),規(guī)劃實(shí)現(xiàn)戰(zhàn)略就很重要了。如果你用大爆炸的方式處理資產(chǎn)實(shí)現(xiàn),那你創(chuàng)建的軟件資產(chǎn)最終會(huì)脫離項(xiàng)目當(dāng)前的需求;由于要增加設(shè)計(jì)、開發(fā)和測(cè)試的時(shí)間,顯然還會(huì)拖延進(jìn)度。無論哪種方式,你都要花費(fèi)大量寶貴的資源。
相反,可以通過多次迭代來演進(jìn)可重用的資產(chǎn),從而減輕這些風(fēng)險(xiǎn)。舉一個(gè)可重用資產(chǎn)的例子——給用戶發(fā)通知。我們將該資產(chǎn)命名為Business Notifier。我們提出一個(gè)簡(jiǎn)單的計(jì)劃——通過數(shù)次迭代來逐步實(shí)現(xiàn)該資產(chǎn)的一百個(gè)附屬功能,而不是一下子就創(chuàng)建出來。
迭代1:用電子郵件通知用戶預(yù)定的業(yè)務(wù)事件
迭代2:允許用戶選擇,只接收某些業(yè)務(wù)事件的通知
迭代3:讓用戶自定義業(yè)務(wù)規(guī)則,繼而生成業(yè)務(wù)事件
迭代4:通過Web控制臺(tái)或即時(shí)消息應(yīng)用發(fā)送通知
迭代5:能讓用戶邀請(qǐng)朋友一起接收通知
迭代6:將通知和工作流結(jié)合起來,讓支持人員進(jìn)行審查
這顯然只是個(gè)范例,在特定迭代中加入的功能往往要基于業(yè)務(wù)需求、優(yōu)先級(jí)、實(shí)現(xiàn)的難易程度和其它因素。比如不再優(yōu)先處理資產(chǎn)時(shí),你可以減少投資,反之亦然。不論構(gòu)建為可重用資產(chǎn)的內(nèi)容是什么,都要在多個(gè)迭代中規(guī)劃其發(fā)展演進(jìn)。這樣,你就可以減少風(fēng)險(xiǎn),保持對(duì)業(yè)務(wù)需求的靈活性,還能只創(chuàng)建那些你愿意投資的資 產(chǎn)。
提示5——保持一致性要比遵循行業(yè)標(biāo)準(zhǔn)更為重要
跨應(yīng)用創(chuàng)建可重用的軟件組件和服務(wù)時(shí),力爭(zhēng)保持一致性要比符合標(biāo)準(zhǔn)更為重要。如果大量應(yīng)用程序都使用了特定的可重用組件,那你就可以跟往常一樣,將現(xiàn)有接 口作為適配器,讓它在后臺(tái)調(diào)用行業(yè)標(biāo)準(zhǔn)的API。不過要注意,我并不是建議你盲目地為那些已經(jīng)有成熟標(biāo)準(zhǔn)的內(nèi)容創(chuàng)建新代碼。
這與要重用的水平業(yè)務(wù)能力相關(guān)。比如說,你在多個(gè)應(yīng)用程序中都需要處理信用卡付款的功能,而在此時(shí)又沒有行業(yè)標(biāo)準(zhǔn)。創(chuàng)建應(yīng)用可利用的支付API就很重要, 而不是等待標(biāo)準(zhǔn)奇跡般地出現(xiàn)。第二天,如果出現(xiàn)了一個(gè)標(biāo)準(zhǔn),你可以修改現(xiàn)有的實(shí)現(xiàn),這不會(huì)對(duì)你當(dāng)前的應(yīng)用有任何影響。好吧,也許我說得太過輕松了——你可能需要細(xì)微的代碼修改和回歸測(cè)試。但最起碼你的處境會(huì)比較好,不用修改代碼庫中的代碼。
提示6——進(jìn)行代碼審查
代碼審查能最有效地保證可重用資產(chǎn)被正確使用。大多數(shù)時(shí)候,為了趕緊發(fā)布產(chǎn)品,開發(fā)人員提交代碼時(shí)并不了解其它地方已經(jīng)實(shí)現(xiàn)了的功能。由于審查代碼要花費(fèi)時(shí)間、遵循規(guī)則,所以在小規(guī)模內(nèi)這樣做的確是個(gè)好主意。關(guān)鍵之所在與其說是代碼質(zhì)量,還不如說是一致性。你可能期望能有一個(gè)快速的方法指出哪些資產(chǎn)可重用,將其與代碼中的變化相結(jié)合。我在代碼審查時(shí)經(jīng)常會(huì)找出新的可重用資產(chǎn)。隨著時(shí)間的推移,你會(huì)看到多個(gè)代碼片段和應(yīng)用功能中存在的模式和重復(fù)的代碼,這對(duì)起到增效作用很有幫助。
當(dāng)你看到重構(gòu)或創(chuàng)建可重用資產(chǎn)的機(jī)會(huì)時(shí),不要把這些工作跟應(yīng)用代碼的剩余部分摻雜在一起。將它們從源碼和版本控制中分離出來,作為一個(gè)獨(dú)立的實(shí)體。和其它內(nèi)容一樣,這也需要迭代地來完成,也不必在產(chǎn)品的最初版本中就有。隨著資產(chǎn)演進(jìn)、變得可重用,可以重構(gòu)、把它們放到它們自己的倉庫中,以便更好地管理。主要問題是在它們可重用時(shí)把它們移出來。在主干代碼之外對(duì)它們進(jìn)行版本化和演進(jìn),以便更容易地在新項(xiàng)目中集成。
提示7——沒有自動(dòng)化的回歸測(cè)試套件,就不要發(fā)布可重用的軟件資產(chǎn)
如果你要在可重用軟件資產(chǎn)上押寶,把它推廣到全世界,那你必須要有一套回歸測(cè)試套件。為什么呢?沒有回歸測(cè)試,現(xiàn)有和潛在的消費(fèi)者對(duì)資產(chǎn)就沒有足夠的信 心。重用的基礎(chǔ)就是不用再次實(shí)現(xiàn)已有的內(nèi)容,從而獲得更好的質(zhì)量——較少的錯(cuò)誤、Bug、不對(duì)的需求實(shí)現(xiàn)。為了確保能兌現(xiàn)這一承諾,你必須得有完整的自動(dòng)化回歸測(cè)試套件。這不僅有利于當(dāng)前的消費(fèi)者,對(duì)以后的任何消費(fèi)者也是有用的。
你可以創(chuàng)建可重用的腳本,完成編譯、執(zhí)行、單元測(cè)試和回歸測(cè)試的報(bào)告。無論你構(gòu)建的是組件還是服務(wù),甚至是業(yè)務(wù)流程,這都是適用的。下一步合乎邏輯的事情就是把這些腳本集成到持續(xù)集成套件中去。
提示8——理解業(yè)務(wù)需求之后再去說服別人
大家總想說服開發(fā)人員或開發(fā)經(jīng)理能同意重用軟件資產(chǎn)。但如果你還沒理解業(yè)務(wù)需求就一再地去勸說,成功的可能性并不大。不要試圖去說服,而是傾聽、體會(huì)、真正理解需求。弄清楚業(yè)務(wù)需求,然后確定能被利用或開發(fā)的資產(chǎn)。為什么要這么做呢?因?yàn)楫?dāng)你真正去聽的時(shí)候,你可能會(huì)發(fā)現(xiàn)現(xiàn)有的資產(chǎn)能完全滿足需求,或者根本不能滿足需求。也許可重用的服務(wù)還需要滿足某個(gè)性能指標(biāo)。或者利用現(xiàn)有的服務(wù)會(huì)增加進(jìn)度風(fēng)險(xiǎn)。諸如此類。
關(guān)鍵是現(xiàn)有的資產(chǎn)要適用于眼前的問題。傾聽,評(píng)估,如果合適就說服——一定要遵循這個(gè)順序。
提示9——盡可能與開發(fā)團(tuán)隊(duì)一起創(chuàng)建可重用的軟件資產(chǎn)
造成系統(tǒng)級(jí)重用失敗的原因各種各樣,其中包括技術(shù)和組織方面的原因。 開發(fā)團(tuán)隊(duì)是可重用資產(chǎn)的潛在用戶,如果沒有來自開發(fā)團(tuán)隊(duì)的支持,你的計(jì)劃就不可能取得成功。我經(jīng)常聽到開發(fā)人員對(duì)開發(fā)經(jīng)理說,不想重用,也不想開發(fā)可重用的功能,因?yàn)樗麄冇X得實(shí)現(xiàn)可重用資產(chǎn)與他們無關(guān)。如何解決這個(gè)問題呢?不要試圖去說服他們,而是和他們共同創(chuàng)建可重用的資產(chǎn)。
如果有個(gè)需求是通過電子郵件發(fā)送通知,那就和原來的開發(fā)團(tuán)隊(duì)合作,讓他們參與設(shè)計(jì)。更好的辦法是讓他們開發(fā)部分或全部的功能。如果他們和你聯(lián)合創(chuàng)建了該資產(chǎn),他們就不會(huì)覺得這個(gè)資產(chǎn)是強(qiáng)迫他們使用的黑盒子了。他們會(huì)在組織里和他們的合作伙伴分享該資產(chǎn),從而幫助你促進(jìn)重用——你會(huì)對(duì)此感到驚訝的。
提示10——從生產(chǎn)支持人員那里獲取可重用資產(chǎn)的需求
將可重用資產(chǎn)投入生產(chǎn)環(huán)境之前需要做一件事,就是與生產(chǎn)支持人員溝通。讓他們投入進(jìn)來,分享你的設(shè)計(jì),及早并經(jīng)常獲取他們的反饋。這不僅能讓資產(chǎn)可被支持 (想象一個(gè)沒有日志、輔助工具、記錄關(guān)鍵指標(biāo)功能的可重用資產(chǎn)),還能讓你擁有一個(gè)有價(jià)值的的合作伙伴。生產(chǎn)支持人員很快就會(huì)信任你的資產(chǎn)和服務(wù),并要求多個(gè)項(xiàng)目都利用這個(gè)功能。賣出重用資產(chǎn)是一回事,合作伙伴表示支持又是另一回事。
結(jié)論
技術(shù)實(shí)踐、協(xié)作和務(wù)實(shí)相結(jié)合,可以慢慢擴(kuò)充你的可重用資產(chǎn)庫。本文介紹的這些小提示都是我在日常工作中為了提高成功率而反復(fù)使用的。我非常想聽聽你在促進(jìn)有效軟件重用時(shí)總結(jié)出的經(jīng)驗(yàn),無論它們是否有效。
聯(lián)系客服