覃 征 邢劍寬
摘要:本文結(jié)合作者多年在軟件體系結(jié)構(gòu)的科研和教學(xué)經(jīng)驗,從抽象理論教學(xué),專題研究和案例教學(xué)三方面探討了教學(xué)方法和教學(xué)內(nèi)容的改革。目的是軟件體系結(jié)構(gòu)抽象的理論知識和現(xiàn)實軟件開發(fā)項目中的應(yīng)用技能結(jié)合起來,努力培養(yǎng)具有大局觀念的軟件架構(gòu)人才和管理人才。
關(guān)鍵詞:軟件體系結(jié)構(gòu);抽象與實踐相結(jié)合;案例教學(xué)
軟件體系結(jié)構(gòu)是一門源自于軟件工程實踐的學(xué)科。經(jīng)過20多年的發(fā)展,它已經(jīng)成為大量復(fù)雜軟件系統(tǒng)研發(fā)的核心。軟件體系結(jié)構(gòu)的主題是針對復(fù)雜軟件系統(tǒng)的高層結(jié)構(gòu),組織單元之間的相互關(guān)系的描述,以及圍繞這種描述開展的各項活動(如設(shè)計、評估、實現(xiàn)、管理、測試等)。其涵蓋面極為廣泛,抽象程度高,因此對于剛剛接觸軟件工程的學(xué)生來說難以理解和認(rèn)同。鑒于其教學(xué)上的難度,在國外,此課程主要由卡耐基梅隆大學(xué)軟件工程學(xué)院等在軟件工程方面卓有造詣的少數(shù)幾所高校主導(dǎo);在國內(nèi),也只有包括清華大學(xué)在內(nèi)的寥寥幾所高校開設(shè)了此課程。
本文以在清華大學(xué)開設(shè)的“軟件體系結(jié)構(gòu)”課程為例,對如何針對軟件體系結(jié)構(gòu)的基本概念、原則和方法進(jìn)行有效地教學(xué)作些探討。課程著重培養(yǎng)學(xué)生對軟件宏觀層面的認(rèn)識,理解現(xiàn)代軟件的研發(fā)過程并不是簡單的編碼的堆砌,而是針對軟件系統(tǒng)各個核心質(zhì)量屬性的考察和對軟件組成單元相互協(xié)作方式的基于形式化的描述和推斷。在對本課程多年的教學(xué)實踐中,我們一直與世界上最新的軟件工業(yè)的發(fā)展和軟件體系結(jié)構(gòu)研究成果保持同步,并不斷嘗試改進(jìn)和完善教學(xué)方法,努力培養(yǎng)具有大局觀的軟件架構(gòu)人才和管理人才。
一、以動機(jī)剖析為講授核心
在軟件體系結(jié)構(gòu)課程的教授過程中遇到的首要問題是讓學(xué)生理解軟件體系結(jié)構(gòu)是有什么用的。這個問題是由兩方面原因造成的。
首先是生源的專業(yè)情況。2008年本課程學(xué)生的專業(yè)統(tǒng)計顯示,計算機(jī)科學(xué)與技術(shù)專業(yè)占28%,軟件工程專業(yè)占16%,其他學(xué)生來自自動化、信息管理、化學(xué)、建筑、汽車、通信、物理等專業(yè)。總體而言,大部分學(xué)生缺乏本課程需要的專業(yè)基礎(chǔ)。并且沒有參加過任何具有實用性的軟件系統(tǒng)的研發(fā)工作。有的只是編寫過一些課程作業(yè)的小程序或者樣例網(wǎng)站的經(jīng)驗。多數(shù)學(xué)生很少有機(jī)會能接觸到一個由數(shù)十人組成的團(tuán)隊在大型復(fù)雜軟件系統(tǒng)研發(fā)過程中遇到種種挑戰(zhàn)和困難,如操作系統(tǒng)、分布式文件系統(tǒng)、搜索引擎等。同時,本課程選課人數(shù)很多(2006年到2008年分別為134人、130人、158人),由有限的幾名教學(xué)組成員根據(jù)每個學(xué)生的實際情況進(jìn)行專門指導(dǎo)完全不可行。
另一方面的原因在于軟件體系結(jié)構(gòu)十分抽象,難以理解。軟件體系結(jié)構(gòu)的基本概念、原則和方法是對諸多不同領(lǐng)域軟件系統(tǒng)共性特征的提取和升華,并不針對某一特定領(lǐng)域或特定系統(tǒng)。這些背景知識對于大部分從未參加過實際工作的學(xué)生來講并不現(xiàn)實。
這兩點原因結(jié)合在一起致使很多學(xué)生認(rèn)為課程講授的內(nèi)容朦朧、高深而不切實際。例如在講授軟件體系結(jié)構(gòu)風(fēng)格與模式的時候,大部分學(xué)生根本沒有見過這些風(fēng)格和模式在諸多軟件系統(tǒng)中的應(yīng)用實例,從而很難接受風(fēng)格和模式存在的必要意義。對部分學(xué)生來講,代碼更加接近現(xiàn)實;而對軟件內(nèi)部結(jié)構(gòu)的分解、復(fù)用、組織單元的協(xié)作是否會留下隱患沒有最起碼的意識。
因此,本課程從緒論開始就努力讓學(xué)生明白為什么軟件體系結(jié)構(gòu)是必要的,即“軟件體系結(jié)構(gòu)的動機(jī)”。我們從軟件系統(tǒng)的質(zhì)量要求講起,明確軟件系統(tǒng)的質(zhì)量屬性是可以描述的;軟件體系結(jié)構(gòu)描述的意義在于使得復(fù)雜軟件系統(tǒng)在宏觀層面上可以得到嚴(yán)謹(jǐn),無歧義的描述。而圍繞軟件體系結(jié)構(gòu)描述的各項活動(如評估,校驗等)正是為了保證軟件系統(tǒng)最終可以滿足質(zhì)量屬性的要求,如圖1所示。
在講授中,我們將各種軟件體系結(jié)構(gòu)的概念,原則和方法均歸結(jié)為對某種特定質(zhì)量屬性的滿足的需要。盡管軟件體系結(jié)構(gòu)還有許多其他的作用,但是以此質(zhì)量要求作為初步的動機(jī)進(jìn)行講授,可以讓學(xué)生和教師找到一個良好的、可進(jìn)行有效教學(xué)和討論的基礎(chǔ)。當(dāng)學(xué)生可以理解一個抽象的概念或方法的本源之后,便不需要對概念本身進(jìn)行死記硬背,而是在想到問題的時候便能認(rèn)為某種應(yīng)對方案是理所應(yīng)當(dāng),自然而然的事情。這就達(dá)到了本課程的講授目的。當(dāng)然,這種教學(xué)方式也對學(xué)生提出了挑戰(zhàn),需要學(xué)生用研究性的方式進(jìn)行主動學(xué)習(xí)。
二、以專題研究為講授線索
不論抽象理論應(yīng)用于實際,不做到實際化,具體化,還是不能避免學(xué)生們對軟件體系結(jié)構(gòu)虛無縹緲的感覺。對比編程開發(fā)課程可以讓學(xué)生們直接編寫程序;軟件度量課程可以給出一組數(shù)據(jù)讓學(xué)生們按照學(xué)到的度量方法計算,軟件體系結(jié)構(gòu)的實踐要困難得多和復(fù)雜得多。因為軟件體系結(jié)構(gòu)涉及的范圍很廣,將每一方面都在課堂上講授也不可能。即便如此,也會如流水賬一般達(dá)不到課程講授的目的。
考慮到我們的學(xué)生的自學(xué)能力和分析能力都很強(qiáng),只要給出充分的引導(dǎo)就能進(jìn)行有效地學(xué)習(xí),我們利用文獻(xiàn)管理軟件EndNote Web和協(xié)作辦公軟件MicrosoftOneNote建立了軟件體系結(jié)構(gòu)學(xué)習(xí)資源庫。在這個庫中涵蓋了自軟件體系結(jié)構(gòu)領(lǐng)域開創(chuàng)以來的大部分經(jīng)典論文,書籍和評論等(目前包含的文章已經(jīng)超過400篇)。其中還包含了近幾年來本研究所的一些系統(tǒng)平臺和研究成果。教學(xué)組對資源庫劃分了類別,每個類別針對軟件體系結(jié)構(gòu)的一類具體問題。例如,如何進(jìn)行軟件體系結(jié)構(gòu)描述;如何對系統(tǒng)設(shè)計進(jìn)行校驗:如何評估:如何在特定領(lǐng)域建立軟件體系結(jié)構(gòu)框架;如何對軟件體系結(jié)構(gòu)進(jìn)行復(fù)用等問題。圍繞這些資源,我們給出了學(xué)習(xí)指導(dǎo)材料,指導(dǎo)學(xué)生根據(jù)自己感興趣的問題自行到學(xué)習(xí)資源庫中對相應(yīng)類別的文獻(xiàn)進(jìn)行研讀和分析,找到解決問題的方案。這也正是本課程期末考查的方式。
通過這樣的學(xué)習(xí)方式,在課堂上的講授可以將軟件體系結(jié)構(gòu)的各個子領(lǐng)域的動機(jī)和主要內(nèi)容,以及各個領(lǐng)域之間的相互關(guān)系講授清楚,再由學(xué)生以團(tuán)隊為單位根據(jù)自己的興趣在學(xué)習(xí)資源庫中找到具體的案例或者問題。同時,我們利用額外加分等手段鼓勵部分有工作經(jīng)驗的學(xué)生以自己面臨的實際問題為出發(fā)點,在學(xué)習(xí)過程中不斷升華和完善問題的解決方案。
三、以案例講解為講授支撐
我們教學(xué)的主要目的之一是將軟件體系結(jié)構(gòu)基本概念、原則和方法如何在實際案例中應(yīng)用的方法講授給學(xué)生。在實踐過程當(dāng)中,實際情況千差萬別,不可能照搬書本上的理論直接應(yīng)用。因此教學(xué)組專門安排了案例教學(xué)部分,幫助學(xué)生理解軟件體系結(jié)構(gòu)在實際軟件工程當(dāng)中的應(yīng)用。
在本課程的案例教學(xué)當(dāng)中,我們將本課程案例分為兩類。第一類是研究所內(nèi)部項目的實際項目。這是教學(xué)組成員親身經(jīng)歷的軟件項目,對案例的細(xì)節(jié)、討論過程和解決方案都有很深刻的體會。于是,在課堂的講解當(dāng)中就可以對問題的動機(jī),處理過程,設(shè)計方案等做詳細(xì)的討論。這些案例來源于多個國家級、省部級項目中。
另一類屬于處于世界前沿的工業(yè)級項目。課程組成員花費大量的時間來搜集和學(xué)習(xí)這些項目的資料,并很好地與軟件體系結(jié)構(gòu)理論結(jié)合起來。同時,我們每年還對案例進(jìn)行更新。例如,2006年通過介紹OSGi框架以及使用OSGi框架的開發(fā)系統(tǒng)Eclipse的插件體系結(jié)構(gòu)來講解動態(tài)軟件體系結(jié)構(gòu)原理;2007年介紹Android設(shè)計來講解移動嵌入式設(shè)備應(yīng)用開發(fā)的特有需求和體系結(jié)構(gòu)設(shè)計方法:2008年介紹以Google為代表的云計算底層系統(tǒng)MapReduce、GFS和BigTable來講解大型復(fù)雜分布式系統(tǒng)的軟件體系結(jié)構(gòu)設(shè)計。通過這些案例,可以使學(xué)生將學(xué)到的知識盡快地和可以接觸到的,并且是比較新的領(lǐng)域結(jié)合到一起,同時也認(rèn)識到不管多復(fù)雜的系統(tǒng),經(jīng)過軟件體系結(jié)構(gòu)方法的分層和提煉,總是可以拆分成若干種簡單的單元和視圖,以便于開發(fā)者討論、設(shè)計、決策和實現(xiàn)。
軟件體系結(jié)構(gòu)在現(xiàn)代軟件行業(yè)中處于重要地位,然而其抽象性和復(fù)雜性使得傳統(tǒng)的教學(xué)方法無法達(dá)到教學(xué)目的。為此,我們在教學(xué)過程中對教學(xué)方法進(jìn)行了一定程度的革新和改進(jìn),以“動機(jī)一專題一案例”作為我們教學(xué)的主導(dǎo)思想,將抽象的理論和實際應(yīng)用緊密地結(jié)合到一起,用以改進(jìn)和提高我們的教學(xué)質(zhì)量,期望真正培養(yǎng)出能夠推動我國軟件工程進(jìn)步,引領(lǐng)大型復(fù)雜系統(tǒng)項目前進(jìn)的高層次軟件人才。