今天和兒子去看園藝中心的熱帶魚署海,色彩斑斕枯跑,美不勝收亭枷。
這些游來游去的魚兒讓我想起一件陳年往事旷坦,啟發(fā)了一項(xiàng)軟件工程研究(Yu et al., 2004)掏熬。雖然當(dāng)時(shí)我沒有篇幅在論文里展開陳說,整個(gè)事情追溯起來秒梅,仍歷歷在目旗芬。
那是一個(gè)冬天,多倫多的大街上有些寒冷捆蜀,皇家安大略省博物館卻熱氣騰騰疮丛。原來幔嫂,我們聽說加拿大博物館里發(fā)現(xiàn)的一具木乃伊經(jīng)過考證是埃及的某位法老,因此決定把它(他)隆重歸還祖國(guó)誊薄。在該木乃伊回國(guó)前最后展覽一下履恩,我也有幸參觀了一番。
博物館里的木乃伊包得嚴(yán)嚴(yán)實(shí)實(shí)暇屋,就算是法老也沒有什么大的看頭似袁,反倒是旁邊的一個(gè)小冊(cè)子吸引了我的注意。原來咐刨,一項(xiàng)化石發(fā)現(xiàn)被刊登在了Nature上(Donley et al., 2004)昙衅。文章大致是講不同地質(zhì)年代的魚的流線形狀。照理說定鸟,一條鯊魚而涉,一只恐龍,和一頭鯨分別從屬于魚類联予,爬行類啼县,和哺乳類動(dòng)物,從身體構(gòu)造沸久,血液溫度季眷,到運(yùn)動(dòng)能力都應(yīng)該有著質(zhì)的不同【砜瑁可是子刮,博物學(xué)家發(fā)現(xiàn),從化石復(fù)原的這三個(gè)動(dòng)物具有完全一致的流線型體窑睁,這既在意料之外挺峡,又在情理之中。
水棲捕食動(dòng)物担钮,為了達(dá)到足夠高的游速橱赠,進(jìn)化出來幾乎相同的外觀。這樣結(jié)構(gòu)和外觀上的差異箫津,給了我如下一個(gè)啟發(fā):
軟件工程里面狭姨,我們把軟件產(chǎn)品需求區(qū)分為功能性需求和非功能性需求。
所謂功能性苏遥,是指程序的函數(shù)語義(英文里面函數(shù)和功能是同一個(gè)詞Function),是把一定的輸入轉(zhuǎn)換成為一定的輸出饼拍。用動(dòng)物的類比醉拓,就是吃進(jìn)什么慰丛,排泄什么,一是一蜜自,二是二诫肠,毫不含糊司澎。(老一輩的人看過《決裂》的電影欺缘,對(duì)其中”馬尾巴的功能“一節(jié)一定還有些印象)
所謂非功能性(non-functional),泛指那些不能用簡(jiǎn)單的功能表述挤安,但是又可以感知和度量的質(zhì)量特性谚殊。仍然用動(dòng)物來類比,比如奔跑和游泳的速度快慢蛤铜,體溫的高低嫩絮,體重塊頭的大小等等生理指標(biāo)。在軟件產(chǎn)品領(lǐng)域围肥,我們通常說的軟件質(zhì)量屬性剿干,包括性能,易用性穆刻,安全性等等諸多定性和定量的分類置尔。
問題在于,如何從軟件工程的實(shí)踐中指導(dǎo)程序員去掌握這兩類不同的特性氢伟?一個(gè)直觀的經(jīng)驗(yàn)是榜轿,功能性通過單元測(cè)試可以刻畫得八九不離十,可是非功能特性往往不是體現(xiàn)在某一段代碼上朵锣,而是一個(gè)全局的特性谬盐。
比如“性能”方面,我們常說的80/20規(guī)則诚些,就是說80%的性能問題集中在20%的功能性代碼中飞傀。這個(gè)分布在程序性能分析以前是無法知道的;“安全”方面泣刹,代碼的漏洞也可以分布在程序的任何角落助析,不做徹底的靜態(tài)檢查是沒有把握的犀被。
一個(gè)是局部的現(xiàn)象椅您,一個(gè)是全局的;一個(gè)是結(jié)構(gòu)功能性的寡键,一個(gè)是非結(jié)構(gòu)非功能性的掀泳。看看程序的函數(shù)調(diào)用圖西轩,再看看這三條流線型的“魚”员舵,再看看程序的數(shù)據(jù)結(jié)構(gòu)類圖 ...... 我的眼睛開始花了,心里卻逐漸清晰藕畔。EurekaB砥А:全局性的非功能質(zhì)量特性正交織在(crosscutting)局部的功能特性里面。有的時(shí)候注服,這種非功能特性是可以單獨(dú)抽取出來韭邓,組成一類交織性的模塊(aspect)措近,得以在另一個(gè)產(chǎn)品功能特性上復(fù)用。Aspect-oriented programming(AOP)的思想早在需求的關(guān)系上就可以體現(xiàn)出來女淑!
有了一個(gè)靈感瞭郑,馬上付諸行動(dòng)。之后鸭你,我用了一些軟件工具(Clustering屈张,Clone Detection),也自己開發(fā)了一些工具(PHP Aspect),對(duì)開源的項(xiàng)目樣本細(xì)致地分析和研究袱巨,直接導(dǎo)致了幾個(gè)重要發(fā)現(xiàn)阁谆,比如:結(jié)合軟件重構(gòu)(Refactoring)和單元測(cè)試提取非功能需求(Yu et al 2005a);以此手段從源代碼出發(fā)直接逆向工程獲得需求模型(Yu et al, 2005b)愉老,從而進(jìn)行質(zhì)量驅(qū)動(dòng)的復(fù)用(Leite et al., 2005)等等笛厦。
參考文獻(xiàn)
Jeanine M. Donley, Chugey A. Sepulveda, Peter Konstantinidis, Sven Gemballa & Robert E. Shadwick. "Convergent evolution in mechanical design of lamnid sharks and tunas". Nature 429, 61-65 (6 May 2004)
Yijun Yu, Julio Cesar Sampaio do Prado Leite, John Mylopoulos: From Goals to Aspects: Discovering Aspects from Requirements Goal Models. RE 2004: 38-47
Yijun Yu, John Mylopoulos, Yiqiao Wang, Sotirios Liaskos, Alexei Lapouchnian, Ying Zou, Martin Littou, Julio Cesar Sampaio do Prado Leite: RETR: Reverse Engineering to Requirements. WCRE 2005: 234
Julio Cesar Sampaio do Prado Leite, Yijun Yu, Lin Liu, Eric S. K. Yu, John Mylopoulos: Quality-Based Software Reuse. CAiSE 2005: 535-550
Yijun Yu, Yiqiao Wang, John Mylopoulos, Sotirios Liaskos, Alexei Lapouchnian, Julio Cesar Sampaio do Prado Leite: "Reverse Engineering Goal Models from Legacy Code". RE 2005: 363-372
Yijun Yu, Nan Niu, Bruno González-Baixauli, William Candillon, John Mylopoulos, Steve M. Easterbrook, Julio Cesar Sampaio do Prado Leite, Gilles Vanwormhoudt: Tracing and Validating Goal Aspects. RE 2007: 53-56
Nan Niu, Steve Easterbrook, Yijun Yu: A Taxonomy of Asymmetric Requirements Aspects. EA@AOSD 2007: 1-18。
Nan Niu, Yijun Yu, Bruno González-Baixauli, Neil A. Ernst, Julio Cesar Sampaio do Prado Leite, John Mylopoulos: “Aspects across Software Life Cycle: A Goal-Driven Approach”. Trans. Aspect-Oriented Software Development 6: 83-110 (2009)
Yijun Yu, Jan Jürjens, John Mylopoulos: “Traceability for the maintenance of secure software”. ICSM 2008: 297-306
面向側(cè)面(Aspect-orientation)的本質(zhì)是逆向思維俺夕,把依附于功能(皮)的非功能特性(毛)拔出來裳凸,重新整理一番,倒過來看那些功能性的地方也需要這些非功能特性劝贸,再類似地去改造一番姨谷。從被支配的從屬地位,一躍成為支配的主體地位映九。大家想想是不是這樣梦湘?