趙 明,廖志芳,楊 柳,易 茜
(中南大學(xué) 計(jì)算機(jī)學(xué)院,湖南 長(zhǎng)沙 410075)
軟件工程是一門(mén)實(shí)踐性極強(qiáng)的學(xué)科,因此在軟件工程本科及研究生教學(xué)中,如何將教學(xué)與實(shí)踐相結(jié)合增強(qiáng)學(xué)生的動(dòng)手實(shí)踐能力是軟件工程教學(xué)一直強(qiáng)調(diào)的重點(diǎn)。案例教學(xué)作為將實(shí)踐與理論相結(jié)合的啟發(fā)式教學(xué)方法,其基本思想是教師根據(jù)教學(xué)目標(biāo)、教學(xué)內(nèi)容以及教學(xué)要求,通過(guò)列舉一些當(dāng)前企業(yè)或者科研工作中的具體案例,引導(dǎo)學(xué)生參與問(wèn)題的思考、分析、討論和表達(dá)等活動(dòng),這是一種培養(yǎng)學(xué)生認(rèn)識(shí)問(wèn)題、分析問(wèn)題和解決問(wèn)題等綜合能力的行之有效的教學(xué)方法[1]。目前,案例教學(xué)法已經(jīng)成為教學(xué)方法改革的重要內(nèi)容之一,與之相對(duì)應(yīng)的案例庫(kù)建設(shè)也作為案例教學(xué)法的一個(gè)核心內(nèi)容納入了課程建設(shè)的范疇。國(guó)外各大學(xué)對(duì)案例庫(kù)早有研究,哈佛大學(xué)所有的課程都采用案例教學(xué),其商學(xué)院的學(xué)生兩年中要學(xué)習(xí)400~600個(gè)案例[2]。國(guó)內(nèi)高校在不同的課程教學(xué)上有一些案例教學(xué),但不論是本科教學(xué)還是研究生教學(xué),都尚未建立一套完整而規(guī)范的軟件工程課程教學(xué)案例庫(kù)。為了培養(yǎng)高質(zhì)量的軟件工程人才,急需建設(shè)一套完整的、綜合的案例庫(kù),以推進(jìn)軟件工程的課程理論與實(shí)際相結(jié)合。
根據(jù)軟件工程專碩研究生培養(yǎng)方案,從必修課(軟件工程、分布式計(jì)算、軟件設(shè)計(jì)模式、服務(wù)計(jì)算、云計(jì)算與大數(shù)據(jù))和選修課程(軟件度量與測(cè)試、數(shù)據(jù)挖掘、高級(jí)程序語(yǔ)言設(shè)計(jì)等)中選擇3~5門(mén)核心課程進(jìn)行案例庫(kù)的建設(shè),其中包括對(duì)高級(jí)程序語(yǔ)言、軟件工程、軟件度量與測(cè)試、軟件設(shè)計(jì)模式以及數(shù)據(jù)挖掘等課程進(jìn)行第一期案例庫(kù)的建設(shè)。
根據(jù)教育部軟件工程教指委要求,CCF將案例劃分為項(xiàng)目類教學(xué)案例、知識(shí)點(diǎn)教學(xué)案例和評(píng)測(cè)型教學(xué)案例3種類型[3]:項(xiàng)目類教學(xué)案例一般用于綜合實(shí)踐課程教學(xué),案例內(nèi)容覆蓋某個(gè)實(shí)踐項(xiàng)目的全部流程或者部分主要階段,系統(tǒng)地分析和探討如何開(kāi)展和實(shí)施軟件工程的實(shí)踐活動(dòng),內(nèi)容可以是一個(gè)來(lái)源于企業(yè)或者開(kāi)源社區(qū)的較為完整的項(xiàng)目,其具體內(nèi)容可以是需求分析案例、測(cè)試案例、設(shè)計(jì)案例等;知識(shí)點(diǎn)教學(xué)案例是指輔助理論課程的某個(gè)或者某些知識(shí)點(diǎn)的教學(xué),如Linux文件系統(tǒng)的講解等,以實(shí)際需求、現(xiàn)實(shí)問(wèn)題切入,形象地講解和分析軟件工程相關(guān)理論知識(shí)和技術(shù),引導(dǎo)學(xué)生思考,啟發(fā)學(xué)生思維;評(píng)測(cè)型教學(xué)案例一般用于測(cè)試或者驗(yàn)證學(xué)生對(duì)理論知識(shí)和實(shí)踐能力的掌握情況,如實(shí)驗(yàn)題、案例型測(cè)試題等,可作為實(shí)踐性課程題目或服務(wù)于課程測(cè)驗(yàn)、考試或者競(jìng)賽。
教學(xué)案例應(yīng)該遵循以下原則。
1)典型性原則。
案例在工程領(lǐng)域中具有一定代表性,能夠反映工程領(lǐng)域的理論知識(shí)和關(guān)鍵問(wèn)題。
2)規(guī)范性原則。
項(xiàng)目案例庫(kù)中的項(xiàng)目擁有軟件開(kāi)發(fā)過(guò)程的規(guī)范化設(shè)計(jì)文檔模板,對(duì)學(xué)生進(jìn)行規(guī)范化軟件開(kāi)發(fā)過(guò)程訓(xùn)練具有示范作用,能夠提高學(xué)生的軟件工程專業(yè)素質(zhì)。
3)關(guān)聯(lián)性原則。
案例內(nèi)容應(yīng)該緊密結(jié)合軟件工程領(lǐng)域中的相關(guān)理論和方法,針對(duì)教學(xué)內(nèi)容中的重點(diǎn)、難點(diǎn)以及教學(xué)要求,讓學(xué)生在案例學(xué)習(xí)中有效理解知識(shí)點(diǎn)以及知識(shí)點(diǎn)之間的關(guān)聯(lián)性,使學(xué)生建立一套完整且全面的邏輯思維方法。
4)實(shí)用性原則。
該項(xiàng)目案例庫(kù)不僅可以讓學(xué)生得到實(shí)際開(kāi)發(fā)項(xiàng)目的真實(shí)體驗(yàn),還可以使學(xué)生進(jìn)一步熟悉軟件項(xiàng)目的開(kāi)發(fā)流程,掌握開(kāi)發(fā)方法和文檔管理技能。
5)啟發(fā)性原則。
案例的選擇和內(nèi)容應(yīng)該具有一定的創(chuàng)新性,能夠代表工程領(lǐng)域的理論和實(shí)踐前沿,能夠給學(xué)生提供思考的空間,鍛煉學(xué)生解決問(wèn)題的能力。
教學(xué)案例的設(shè)計(jì)主要從案例名稱與概述、案例教學(xué)目標(biāo)、案例準(zhǔn)備、案例教學(xué)要點(diǎn)、案例教學(xué)組織方式以及開(kāi)放性問(wèn)題幾個(gè)方面進(jìn)行考慮。
知識(shí)點(diǎn)案例以“軟件度量與測(cè)試”課程中“McCabe圈復(fù)雜度的案例”進(jìn)行說(shuō)明。McCabe圈 復(fù) 雜 度(Cyclomatic complexity)是1976年Thomas J.McCabe[4]提出的用控制流圖的圈數(shù)來(lái)測(cè)量程序復(fù)雜性的方法??刂屏鲌D是McCabe復(fù)雜度計(jì)算的基礎(chǔ),它是將軟件的程序流程圖轉(zhuǎn)化為有向圖,然后以圖論的知識(shí)與方法來(lái)衡量程序控制結(jié)構(gòu)的復(fù)雜性。下面詳細(xì)說(shuō)明案例設(shè)計(jì)內(nèi)容。
1)案例概述。
本案例將McCabe圈復(fù)雜度應(yīng)用于對(duì)軟件的詳細(xì)設(shè)計(jì)度量與程序代碼度量中,利用案例指導(dǎo)學(xué)生基于控制流圖計(jì)算圈復(fù)雜度和基于程序代碼計(jì)算圈復(fù)雜度,同時(shí)幫助學(xué)生理解圈復(fù)雜度在軟件開(kāi)發(fā)周期中的重要意義。
通過(guò)該教學(xué)案例,一方面引導(dǎo)學(xué)生在進(jìn)行程序設(shè)計(jì)與編碼時(shí),一定要特別注意條件語(yǔ)句與循環(huán)語(yǔ)句;另一方面,讓學(xué)生理解圈復(fù)雜度的計(jì)算與控制對(duì)提高軟件的整體質(zhì)量、減少程序錯(cuò)誤,對(duì)提高程序的可理解性、可維護(hù)性以及減少程序的測(cè)試與維護(hù)工作量具有重要的意義。
2)案例教學(xué)要點(diǎn)。
主要包含3點(diǎn):①圈復(fù)雜度的作用;②圈復(fù)雜度的度量方法的優(yōu)缺點(diǎn);③圈復(fù)雜度度量結(jié)果的指導(dǎo)意義。
3)案例說(shuō)明。
(1)McCabe圈復(fù)雜度計(jì)算方法有3種。
第一種是直接通過(guò)控制流圖的區(qū)域數(shù)進(jìn)行計(jì)算,其公式為
其中,R代表平面被控制流圖劃分成的區(qū)域數(shù)(圈數(shù))。
圈復(fù)雜度等于強(qiáng)連通圖中連成圈的最大個(gè)數(shù)。因?yàn)榇沓绦蛑小伴_(kāi)始”與“結(jié)束”的“開(kāi)始”節(jié)點(diǎn)與“結(jié)束”節(jié)點(diǎn)是不連通的,也就是控制流圖一般不是強(qiáng)連通圖,因此我們需要從“結(jié)束”節(jié)點(diǎn)連一根線到“開(kāi)始”節(jié)點(diǎn),這樣形成一個(gè)強(qiáng)連通圖后再來(lái)數(shù)圖中的圈數(shù)。
第二種是通過(guò)控制流圖中的節(jié)點(diǎn)與邊數(shù)量進(jìn)行計(jì)算,其公式為
其中,e為圖中邊數(shù);n為圖中節(jié)點(diǎn)數(shù);p為圖中不連通的部分,通常為1。
在圖1控制流圖中,e=6,n=9,p=1,V(G)=9-6+2×1=5。
圖1 控制圖示例
第三種是通過(guò)控制流圖中判定節(jié)點(diǎn)的數(shù)量來(lái)計(jì)算,其公式為
這里,判定節(jié)點(diǎn)也就是代表程序流程圖中菱形框,在程序語(yǔ)句中用判定語(yǔ)句來(lái)描述。
所以,這種方法我們還可以延伸到計(jì)算程序流程圖中的菱形框數(shù)量,程序圈復(fù)雜度就等于程序流程圖中菱形框數(shù)量加1,也可以延伸到計(jì)算程序語(yǔ)句中的判定語(yǔ)句數(shù)量,程序圈復(fù)雜度就等于程序中判定語(yǔ)句數(shù)量加1。
(2)實(shí)驗(yàn)案例說(shuō)明。McCabe圈復(fù)雜度案例相關(guān)的實(shí)驗(yàn),分為2個(gè)實(shí)驗(yàn)內(nèi)容。第1個(gè)實(shí)驗(yàn)內(nèi)容是基于控制流圖的圈復(fù)雜度計(jì)算,主要針對(duì)圈復(fù)雜度度量方法中的第1種方法和第2種方法;第2個(gè)實(shí)驗(yàn)內(nèi)容是基于程序代碼的圈復(fù)雜度計(jì)算,主要針對(duì)圈復(fù)雜度度量方法中的第3種方法。
基于控制流圖的圈復(fù)雜度計(jì)算。要求學(xué)生設(shè)計(jì)基于控制流圖的圈復(fù)雜度的計(jì)算算法,利用軟件開(kāi)發(fā)周期詳細(xì)設(shè)計(jì)階段的程序流程圖或者控制流圖來(lái)計(jì)算圈復(fù)雜度,將程序流程圖或者控制流圖作為輸入。學(xué)生可以先將圖轉(zhuǎn)化為XML,再設(shè)計(jì)算法來(lái)實(shí)現(xiàn),也可以利用Java的AST(Abstract Syntax Tree)相關(guān)方法來(lái)實(shí)現(xiàn)。
基于程序代碼的圈復(fù)雜度計(jì)算。要求學(xué)生設(shè)計(jì)基于程序代碼的圈復(fù)雜度的計(jì)算算法,利用Complexity Evaluator工具對(duì)開(kāi)源平臺(tái)典型的開(kāi)源項(xiàng)目進(jìn)行圈復(fù)雜度計(jì)算,一方面橫向進(jìn)行圈復(fù)雜度的評(píng)估,可選擇2個(gè)規(guī)模與功能相近的開(kāi)源項(xiàng)目進(jìn)行比較;另一方面縱向進(jìn)行圈復(fù)雜度評(píng)估,選擇1個(gè)開(kāi)源項(xiàng)目的不同版本進(jìn)行比較。通過(guò)圈復(fù)雜度的計(jì)算,學(xué)生可以進(jìn)一步理解圈復(fù)雜度的意義。
項(xiàng)目案例以“數(shù)據(jù)挖掘”課程中“眾包平臺(tái)中工人質(zhì)量分析”進(jìn)行說(shuō)明。眾包( Crowdsourcing),是一種公開(kāi)面向互聯(lián)網(wǎng)大眾的分布式的問(wèn)題解決機(jī)制,在2006年由Jeff Howe首次提出,通過(guò)整合互聯(lián)網(wǎng)或社交網(wǎng)絡(luò)中未知的大眾來(lái)完成計(jì)算機(jī)單獨(dú)難以完成的任務(wù)[4]。眾包的主要參與者包括任務(wù)請(qǐng)求人(requester)和任務(wù)完成人(worker),任務(wù)請(qǐng)求人進(jìn)行任務(wù)發(fā)布,任務(wù)完成人進(jìn)行任務(wù)的完成。為完成該案例,需要完成數(shù)據(jù)采集(以topcoder平臺(tái)進(jìn)行數(shù)據(jù)采集)、數(shù)據(jù)預(yù)處理(去除噪聲數(shù)據(jù)以及無(wú)用數(shù)據(jù))、數(shù)據(jù)分析以及結(jié)果展示等幾部分內(nèi)容,形成一個(gè)完整的眾包分析項(xiàng)目。下面詳細(xì)說(shuō)明案例設(shè)計(jì)內(nèi)容。
1)案例概述。
本案例將眾包應(yīng)用于對(duì)社交網(wǎng)絡(luò)中用戶屬性與用戶行為的分析中,通過(guò)使用社交網(wǎng)絡(luò)中用戶的脫敏數(shù)據(jù),并采用不同的算法對(duì)用戶的回答、評(píng)價(jià)進(jìn)行匯聚分析,得出了用戶群體對(duì)于社交網(wǎng)絡(luò)中某一行為的情感趨勢(shì)。隨后,根據(jù)匯聚結(jié)果,采用劃分聚類和K-Means聚類對(duì)用戶進(jìn)行群體劃分,分析眾包系統(tǒng)中人員的質(zhì)量屬性及社區(qū)行為特征,對(duì)社交網(wǎng)絡(luò)中的行為分析、社區(qū)發(fā)現(xiàn)具有重要的指導(dǎo)意義。
通過(guò)案例教學(xué),希望讓學(xué)生對(duì)社交網(wǎng)絡(luò)中標(biāo)簽聚合和用戶質(zhì)量分析、社區(qū)行為產(chǎn)生感性認(rèn)識(shí),真正意識(shí)到社交網(wǎng)絡(luò)中眾包分析能帶來(lái)什么好處。
2)案例教學(xué)要點(diǎn)。
教學(xué)要點(diǎn)主要涉及社交網(wǎng)絡(luò)中眾包分析的作用,眾包中結(jié)果匯聚的分析方法,以及眾包環(huán)境中用戶質(zhì)量分析和社區(qū)發(fā)現(xiàn)的現(xiàn)實(shí)意義。
3)案例詳細(xì)說(shuō)明。
(1)工人(任務(wù)完成人)的概況分析。眾包任務(wù)質(zhì)量受到工人的能力和質(zhì)量影響。工人的質(zhì)量可以由工人的聲譽(yù)和專業(yè)知識(shí)描述[5]。工人的聲譽(yù)分?jǐn)?shù)主要由社區(qū)成員對(duì)工人在系統(tǒng)中做出貢獻(xiàn)建立。工人的專業(yè)知識(shí)表明了他完成特定任務(wù)的能力。專業(yè)知識(shí)主要有兩個(gè)指標(biāo):憑證和經(jīng)驗(yàn)。憑證是用來(lái)評(píng)估工人完成特定眾包任務(wù)的能力的文件或證據(jù),如學(xué)位證書(shū)或技能證書(shū)。經(jīng)驗(yàn)是指工人在平臺(tái)上完成任務(wù)所獲得的知識(shí)和技能。聲譽(yù)和專業(yè)知識(shí)是相互關(guān)聯(lián)的:一個(gè)專業(yè)知識(shí)高的工人也會(huì)有很高的聲譽(yù)。將它們區(qū)分是因?yàn)槁曌u(yù)在本質(zhì)上更普遍。除了工人的專業(yè)知識(shí)反映了他們貢獻(xiàn)的質(zhì)量,還可以根據(jù)其他幾個(gè)參數(shù)計(jì)算聲譽(yù),比如工人的及時(shí)性或者評(píng)估人員(evaluators)的質(zhì)量。另外,聲譽(yù)是一個(gè)公共的和社區(qū)范圍的度量指標(biāo),但是專業(yè)知識(shí)是依賴于任務(wù)(task-dependent)的。例如,一個(gè)有著高聲譽(yù)分?jǐn)?shù)的Java專家可能不適合承擔(dān)SQL相關(guān)的任務(wù)。
(2)工人的質(zhì)量評(píng)估方法:①使用黃金標(biāo)準(zhǔn)數(shù)據(jù)(Golden standard data)評(píng)估工作者完成的質(zhì)量,黃金標(biāo)準(zhǔn)數(shù)據(jù)是指擁有標(biāo)準(zhǔn)答案的一類數(shù)據(jù),通過(guò)將工人提交的結(jié)果與標(biāo)準(zhǔn)答案的比較可以檢測(cè)出那些欺騙類型的工人;②多數(shù)決策(Majority Decision,MD)方法[6],將任務(wù)分配給多個(gè)工人,大多數(shù)工人支持的任務(wù)結(jié)果被認(rèn)為是正確結(jié)果;③控制組(Control Group,GC)方法[7],成立一個(gè)控制組,對(duì)已完成的工人進(jìn)行重復(fù)檢查,監(jiān)督工人的任務(wù)完成情況;④聲譽(yù)評(píng)估方法,在眾包平臺(tái)中通過(guò)工人的正確率對(duì)工人的等級(jí)進(jìn)行劃分,如果是惡意工人可以直接拉入黑名單。
(3)實(shí)驗(yàn)案例:①要求學(xué)生設(shè)計(jì)爬蟲(chóng)軟件進(jìn)行topcoder中工人數(shù)據(jù)的采集,通過(guò)數(shù)據(jù)預(yù)處理得出案例實(shí)驗(yàn)所必需的數(shù)據(jù);②利用聚類分析方法對(duì)工人數(shù)據(jù)進(jìn)行類別分析,對(duì)工人偏好特征進(jìn)行分析;③設(shè)計(jì)算法對(duì)工人完成任務(wù)質(zhì)量進(jìn)行分析。案例流程如圖2所示。
圖2 工人質(zhì)量分析流程
案例教學(xué)的實(shí)施主要集中在軟件學(xué)院2017—2018級(jí)研究生相關(guān)課程的教學(xué)中。以“數(shù)據(jù)挖掘”課程為例,整個(gè)教學(xué)過(guò)程涉及4個(gè)案例,包括關(guān)聯(lián)規(guī)則知識(shí)點(diǎn)案例、聚類分析知識(shí)點(diǎn)案例、決策樹(shù)算法知識(shí)點(diǎn)案例以及眾包工人質(zhì)量項(xiàng)目案例,案例內(nèi)容由淺到深,最后一個(gè)案例涵蓋數(shù)據(jù)處理、關(guān)聯(lián)性分析、聚類分析以及分類分析等多個(gè)知識(shí)點(diǎn)。通過(guò)將傳統(tǒng)的課程授課方式轉(zhuǎn)換為案例教學(xué)方式,在教學(xué)中構(gòu)建具體問(wèn)題場(chǎng)景并提出具體解決方法,加深學(xué)生對(duì)課程內(nèi)容的理解,提高學(xué)生綜合運(yùn)用課程內(nèi)容的能力。
通過(guò)調(diào)查和統(tǒng)計(jì)分析,軟件學(xué)院軟件工程2017—2018級(jí)研究生有80%以上的學(xué)生認(rèn)為自己的學(xué)習(xí)效率得到了提升(見(jiàn)表1)。同時(shí),我們對(duì)2017—2018級(jí)研究生學(xué)生調(diào)研了在實(shí)行案例教學(xué)方式后,學(xué)生的綜合運(yùn)用課程內(nèi)容的能力是否得到提升(見(jiàn)表2),2017級(jí)206位學(xué)生中有183人認(rèn)為自己的能力得到了提升,2018級(jí)68位學(xué)生中也有61人認(rèn)為案例教學(xué)對(duì)自己的能力提升是有作用的,所以大部分的同學(xué)認(rèn)為通過(guò)案例教學(xué)自己的能力得到了提升。因此本案例教學(xué)的實(shí)施的確證明了自身的可行性并在教學(xué)中取得了極好的效果,對(duì)學(xué)生加深課程理解和提高綜合運(yùn)用課程內(nèi)容的能力有極大的促進(jìn)作用。
表1 學(xué)生學(xué)習(xí)效率影響結(jié)果統(tǒng)計(jì)表
表2 綜合能力提升調(diào)研表
針對(duì)目前國(guó)內(nèi)軟件工程課程教學(xué)中存在實(shí)踐與理論部分脫節(jié)的問(wèn)題,筆者提出軟件工程核心課程案例庫(kù)的建設(shè)方法以及案例教學(xué)的實(shí)踐,通過(guò)選擇典型課程、分析案例類型以及確定案例原則,以新工科教育思想為指導(dǎo),根據(jù)軟件工程發(fā)展的特點(diǎn),結(jié)合國(guó)內(nèi)外科研和教學(xué)成果,不斷更新和完善教學(xué)內(nèi)容,加強(qiáng)軟件工程核心課程教學(xué)案例建設(shè),并開(kāi)展案例教學(xué)方法的研究與實(shí)踐,提高學(xué)生應(yīng)用軟件工程相關(guān)知識(shí)解決實(shí)際問(wèn)題的綜合能力。實(shí)踐結(jié)果表明,案例教學(xué)的方式對(duì)促進(jìn)教學(xué)工作、提高教學(xué)質(zhì)量、培養(yǎng)國(guó)際創(chuàng)新型人才具有重要意義。