摘 要:分析當(dāng)前軟件工程課程實(shí)踐教學(xué)面臨的主要問題和挑戰(zhàn),以培養(yǎng)“解決復(fù)雜工程問題能力”為目標(biāo),提出基于開源和群智的軟件工程實(shí)踐教學(xué)方法。設(shè)計(jì)了循序漸進(jìn)的課程實(shí)踐框架,其核心思想是:要求學(xué)生開發(fā)上規(guī)模、有創(chuàng)意、高質(zhì)量的軟件系統(tǒng);通過學(xué)習(xí)、重用和改造開源軟件開展軟件工程課程實(shí)踐;借助開源社區(qū)中的群智知識(shí)解決課程實(shí)踐中遇到的具體問題。此外,介紹了支撐軟件工程實(shí)踐教學(xué)的軟件工程及教學(xué)案例資源。5年的教學(xué)實(shí)踐表明,實(shí)踐教學(xué)方法成效顯著,學(xué)生創(chuàng)新實(shí)踐能力,以及綜合運(yùn)用知識(shí)和工具解決復(fù)雜工程問題的能力等得到了極大提升。
關(guān)鍵詞:軟件工程;開源軟件;群智;開源社區(qū)
DOI: 10. 11907/rjdk.192730
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
中圖分類號(hào):TP434
文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1672-7800( 2020)001-0001-06
0 引言
軟件工程課是一門“虛”“實(shí)”相結(jié)合、對(duì)實(shí)踐性要求非常高的課程。其“虛”的一面主要體現(xiàn)在,該課程關(guān)注的對(duì)象是軟件這一邏輯產(chǎn)品,課程知識(shí)點(diǎn)包含許多思想性和方法性的內(nèi)容,要將這些抽象的知識(shí)點(diǎn)講清楚、讓學(xué)生聽明白具有挑戰(zhàn)性。如果照本宣科地講授,學(xué)生會(huì)覺得空洞乏味,很難理解軟件工程的內(nèi)涵并掌握其要領(lǐng),因而軟件工程課程教學(xué)普遍存在“不好教”、“不易學(xué)”的突出問題[1]。其“實(shí)”的一面主要體現(xiàn)在,軟件工程課程講授的是軟件開發(fā)的具體工程化方法,課程知識(shí)點(diǎn)包含許多具有經(jīng)驗(yàn)性、實(shí)用性的軟件開發(fā)技術(shù),需要學(xué)生在具體實(shí)踐中加以領(lǐng)會(huì)并應(yīng)用到軟件開發(fā)中。整體而言,實(shí)踐教學(xué)是軟件工程課程教學(xué)的核心和關(guān)鍵,如何通過實(shí)踐教學(xué)提升教學(xué)成效,讓學(xué)生領(lǐng)會(huì)軟件工程的內(nèi)涵、掌握其知識(shí)點(diǎn)并能運(yùn)用它們解決實(shí)際問題,進(jìn)而積累軟件開發(fā)經(jīng)驗(yàn),是軟件工程教育面臨的一項(xiàng)長(zhǎng)期重大挑戰(zhàn)[2-3]。
提高工科學(xué)生的能力和素質(zhì)是近年來新工科教育需要解決的主要問題[4]。軟件工程課程實(shí)踐教學(xué)并非簡(jiǎn)單地讓學(xué)生完成一項(xiàng)軟件系統(tǒng)開發(fā),而是通過課程實(shí)踐培養(yǎng)學(xué)生多方面的能力,尤其是“解決復(fù)雜工程問題的能力”,進(jìn)一步提升學(xué)生的軟件工程素質(zhì)。實(shí)際上,軟件工程課程非常適合培養(yǎng)學(xué)生“解決復(fù)雜工程問題的能力”,原因有二:一是軟件本身是一類極為復(fù)雜的系統(tǒng);二是軟件開發(fā)需要綜合運(yùn)用多種技術(shù)和工具、需要考慮和權(quán)衡多種因素,充分體現(xiàn)了復(fù)雜問題的解決過程。成功的軟件開發(fā)實(shí)踐需要解決諸多復(fù)雜工程問題,如滿足需求、確保質(zhì)量、保證進(jìn)度等。而要達(dá)到能力培養(yǎng)這一目標(biāo),就需要對(duì)課程實(shí)踐教學(xué)任務(wù)進(jìn)行精心設(shè)計(jì)、對(duì)實(shí)踐成果提出明確要求、對(duì)實(shí)踐過程進(jìn)行精細(xì)把控。顯然,這需要從源頭提高課程實(shí)踐中待開發(fā)軟件系統(tǒng)的規(guī)模和復(fù)雜性,讓學(xué)生在具體實(shí)踐中體驗(yàn)由于規(guī)模和復(fù)雜性增長(zhǎng)帶來的一系列工程問題,并在解決實(shí)際復(fù)雜工程問題的過程中逐步培養(yǎng)其能力和素質(zhì)。
在軟件工程課程實(shí)踐教學(xué)過程中,學(xué)生對(duì)于教師布置的軟件工程實(shí)踐作業(yè)往往無從下手,課堂上似乎聽懂了,但一旦要具體開發(fā)一個(gè)軟件系統(tǒng)常常不知所措,通常面臨兩方面的主要問題。首先,學(xué)生在實(shí)踐過程中常常遇到超越教材和課堂的多樣化開發(fā)問題,許多問題教師也難以回答,使得課程實(shí)踐工作難以開展,影響學(xué)生完成實(shí)踐作業(yè)的信心和勇氣,許多學(xué)生不得不通過避重就輕、減少實(shí)踐內(nèi)容、降低實(shí)踐難度等方式以求順利完成作業(yè),教師對(duì)此狀況也只能“望而興嘆”“睜一只眼閉一只眼”。許多教師缺乏軟件開發(fā)實(shí)際經(jīng)驗(yàn),沒有足夠的時(shí)間和精力指導(dǎo)學(xué)生開展實(shí)踐、解答學(xué)生遇到的問題,也無法為學(xué)生提供實(shí)踐所需的各種資源,常常覺得“心有余而力不足”。其次,軟件工程課程實(shí)踐中會(huì)有一些關(guān)鍵需求和功能模塊,它們需要綜合運(yùn)用多種專門技術(shù)(從網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)設(shè)計(jì)到智能數(shù)據(jù)分析)才能得以實(shí)現(xiàn),因而是阻礙學(xué)生順利完成實(shí)踐的主要瓶頸。通常,軟件系統(tǒng)開發(fā)涉及諸多技術(shù)要素,除通用軟件工程技術(shù)外(如編程、設(shè)計(jì)、測(cè)試等),稍具規(guī)模和復(fù)雜性的軟件系統(tǒng)都會(huì)或多或少地涉及一些專用計(jì)算機(jī)技術(shù)(如圖像處理、模式識(shí)別、網(wǎng)絡(luò)通訊、數(shù)據(jù)分析等)。對(duì)于其中一些技術(shù)要素,學(xué)生可能并未掌握,或者將其應(yīng)用到具體的軟件系統(tǒng)開發(fā)之中會(huì)有困難,進(jìn)而阻礙關(guān)鍵軟件需求和軟件部件開發(fā),影響課程實(shí)踐的順利完成。由于這兩方面問題的存在,軟件工程課程實(shí)踐常常是“虎頭蛇尾”、“草草了事”。學(xué)生提交實(shí)踐作業(yè),教師給定實(shí)踐成績(jī),隨后實(shí)踐教學(xué)就結(jié)束了,至于實(shí)踐做得好不好、對(duì)不對(duì)、效果如何、還存在哪些問題、應(yīng)該如何解決等問題往往不得而知,最終導(dǎo)致軟件工程課程實(shí)踐教學(xué)流于形式、走走過場(chǎng),難以達(dá)到預(yù)期效果。
為了改革軟件工程實(shí)踐教學(xué)方法,人們進(jìn)行了諸多探索,如采用游戲化的手段[5]、借用MOOC教學(xué)[6]、引入?yún)f(xié)同學(xué)習(xí)方法[7]、也嘗試將開源項(xiàng)目引入到軟件工程教育中[8]。本文以培養(yǎng)“解決復(fù)雜工程問題能力”為目標(biāo),設(shè)計(jì)了軟件工程課程實(shí)踐的任務(wù)框架,明確了課程實(shí)踐的具體要求,提出了基于開源和群智的軟件工程實(shí)踐教學(xué)方法。
1 《軟件工程》課程實(shí)踐教學(xué)任務(wù)框架
如何針對(duì)教學(xué)目標(biāo)設(shè)計(jì)一個(gè)科學(xué)、合理、可行的實(shí)踐任務(wù)是開展實(shí)踐教學(xué)的基礎(chǔ)和前提。軟件工程課程實(shí)踐任務(wù)設(shè)計(jì)不僅要服務(wù)于能力和素質(zhì)培養(yǎng)這一目標(biāo),還要綜合考慮實(shí)際條件、前導(dǎo)課程、學(xué)生水平、技術(shù)狀況等因素。本文設(shè)計(jì)了包含兩項(xiàng)實(shí)踐任務(wù)、循序漸進(jìn)的軟件工程課程實(shí)踐任務(wù)框架(見圖1),以達(dá)成課程實(shí)踐教學(xué)能力培養(yǎng)目標(biāo)。
任務(wù)1:閱讀、分析和維護(hù)高質(zhì)量的開源代碼。
該實(shí)踐要求學(xué)生:①閱讀高質(zhì)量的開源代碼,理解代碼的語(yǔ)法語(yǔ)義和編程風(fēng)格;②對(duì)開源代碼進(jìn)行標(biāo)注和注釋;③分析開源代碼質(zhì)量,從多方面理解和領(lǐng)會(huì)高質(zhì)量代碼的基本特征,掌握編寫高質(zhì)量程序的基本技能和要領(lǐng),包括編碼風(fēng)格、軟件設(shè)計(jì)和程序設(shè)計(jì)方法等;④運(yùn)用所學(xué)到的軟件開發(fā)技能和方法維護(hù)開源軟件,以增強(qiáng)和完善其功能,糾正開源代碼中的缺陷和錯(cuò)誤,在此過程中將所學(xué)到的編程技巧、設(shè)計(jì)方法和代碼風(fēng)格等應(yīng)用到代碼維護(hù)中,做到“學(xué)以致用”,以確保維護(hù)質(zhì)量,并在此過程中體會(huì)和感受軟件“質(zhì)量”的重要性,理解“需求變化”和“代碼修改”對(duì)軟件質(zhì)量的影響。
該實(shí)踐旨在通過對(duì)高質(zhì)量開源代碼的學(xué)習(xí),掌握高水平的軟件設(shè)計(jì)和程序設(shè)計(jì)技能,培養(yǎng)質(zhì)量意識(shí)和良好的軟件工程素質(zhì)。對(duì)于剛剛?cè)腴T的學(xué)生而言,程序代碼的閱讀、分析和維護(hù)比軟件分析、設(shè)計(jì)和建模等工作更容易人手。該實(shí)踐任務(wù)既可以讓學(xué)生在程序代碼層次,從質(zhì)量視角理解軟件工程的內(nèi)涵,也可以讓學(xué)生掌握高水平的軟件開發(fā)技能和要領(lǐng),并以此指導(dǎo)后續(xù)實(shí)踐任務(wù)的開展。因此,該實(shí)踐任務(wù)的引入在整個(gè)軟件工程課程實(shí)踐中起承上啟下作用,幫助學(xué)生循序漸進(jìn)地開展實(shí)踐,作好技術(shù)儲(chǔ)備,積累一定軟件開發(fā)經(jīng)驗(yàn)。
為了達(dá)成該實(shí)踐任務(wù)的培養(yǎng)目標(biāo),需要對(duì)閱讀、分析和維護(hù)的開源代碼提出明確要求:①質(zhì)量高,如代碼的軟件設(shè)計(jì)很好體現(xiàn)了軟件工程原則,程序模塊具有良好的獨(dú)立性和封裝性,代碼遵循編碼風(fēng)格,具有良好的可理解性、可維護(hù)性、可擴(kuò)展性等;②規(guī)模適中,規(guī)模太小,難以體驗(yàn)代碼規(guī)模給軟件質(zhì)量及軟件維護(hù)等帶來的影響,無法領(lǐng)會(huì)軟件工程在開發(fā)大規(guī)模軟件系統(tǒng)中的作用;規(guī)模太大,學(xué)生難以從整體上把握軟件系統(tǒng)的全局,沒有足夠的時(shí)間和精力完成閱讀、分析和維護(hù)工作。為此,建議待閱讀、分析和維護(hù)的開源代碼規(guī)模至少應(yīng)具有5 000-10 000行的代碼量;③易于理解,所選擇的開源軟件盡可能來自于大家所熟知的應(yīng)用領(lǐng)域(如辦公、家庭、公共服務(wù)等),其功能應(yīng)具有直觀、易于理解的特點(diǎn),學(xué)生容易建立起功能和代碼之間的關(guān)聯(lián)關(guān)系,并結(jié)合實(shí)際應(yīng)用需求構(gòu)想和增強(qiáng)其軟件功能;④用熟知的編程語(yǔ)言編寫,盡可能選擇那些用學(xué)生所熟知的程序設(shè)計(jì)語(yǔ)言所編寫的開源軟件;⑤開源社區(qū)活躍,盡可能地選擇那些在開源社區(qū)中仍然活躍的開源軟件,以便學(xué)生可以就該開源軟件的有關(guān)新特征、缺陷、版本等在社區(qū)中進(jìn)行交互和協(xié)同,分享社區(qū)中軟件開發(fā)者群體的軟件開發(fā)經(jīng)驗(yàn)和知識(shí)。
任務(wù)2:開發(fā)有創(chuàng)意、上規(guī)模和高質(zhì)量的軟件。
該實(shí)踐任務(wù)要求學(xué)生運(yùn)用軟件工程的思想、方法、技術(shù)和工具開發(fā)一個(gè)有創(chuàng)意、上規(guī)模和高質(zhì)量的軟件系統(tǒng),在此過程中積累軟件工程經(jīng)驗(yàn),逐步培養(yǎng)和提升軟件開發(fā)能力,尤其是解決復(fù)雜工程問題的能力。
為了達(dá)成實(shí)踐教學(xué)目標(biāo),對(duì)軟件系統(tǒng)開發(fā)規(guī)模、質(zhì)量等提出明確要求:①規(guī)模性,待開發(fā)的軟件系統(tǒng)必須具備一定規(guī)模,才能讓學(xué)生領(lǐng)悟軟件工程中的“工程”要素并運(yùn)用工程化的手段解決復(fù)雜問題。一般而言,要求學(xué)生以團(tuán)隊(duì)為單位開發(fā)出具有至少10 000行以上程序代碼的軟件系統(tǒng);②綜合性,軟件系統(tǒng)開發(fā)需要綜合運(yùn)用多方面的技術(shù)、語(yǔ)言和工具等;③集成性,待開發(fā)軟件系統(tǒng)需要與各種遺留系統(tǒng)、機(jī)器人、無人設(shè)備、智能終端、互聯(lián)網(wǎng)云服務(wù)等進(jìn)行交互,從而解決實(shí)際問題;④高質(zhì)量,所開發(fā)的軟件系統(tǒng)必須具有良好的質(zhì)量屬性,如規(guī)范性、正確性、可維護(hù)性等,從而表現(xiàn)出良好的軟件工程素質(zhì);⑤創(chuàng)意性,所開發(fā)的軟件系統(tǒng)需要在待解決問題以及解決問題的方法等方面具有創(chuàng)意,以加強(qiáng)創(chuàng)新意識(shí)和能力培養(yǎng),同時(shí)激發(fā)學(xué)生的實(shí)踐熱情和激情。
2 基于開源與群智的實(shí)踐教學(xué)方法
達(dá)成上述實(shí)踐教學(xué)目標(biāo),無論對(duì)于教師還是學(xué)生而言都是一項(xiàng)極具挑戰(zhàn)性的工作。通過分析可以發(fā)現(xiàn),軟件工程實(shí)踐教學(xué)方法自身存在諸多局限性,難以有效支撐上述培養(yǎng)目標(biāo)的實(shí)現(xiàn)。首先,施教方法落后,具體表現(xiàn)為施教對(duì)象的封閉性、輔助渠道的單一性、提供資源的有限性等,學(xué)生主要依靠教師和教輔解決實(shí)踐中遇到的困難和問題。實(shí)踐的成功高度依賴于教師和教輔的決心、投入、經(jīng)驗(yàn)和水平。今年成功并不意味著明年成功,難以重復(fù)和復(fù)制。其次,實(shí)踐教學(xué)諸多假設(shè)的不合理性,比如要求針對(duì)熟知的問題或給定明確的軟件需求完成軟件開發(fā),認(rèn)為實(shí)踐所需的技術(shù)等不能超出學(xué)生已學(xué)課程的知識(shí)范疇,要求學(xué)生采用全新的方式開發(fā)軟件系統(tǒng)的所有代碼,以及期望學(xué)生一次性地完成軟件開發(fā)實(shí)踐等。這些假設(shè)嚴(yán)重束縛了實(shí)踐的開展和實(shí)施,沒有為學(xué)生提供改進(jìn)的機(jī)會(huì)和空間。
近年來,移動(dòng)互聯(lián)網(wǎng)帶動(dòng)了群體智能的應(yīng)用及發(fā)展,其特點(diǎn)是利用互聯(lián)網(wǎng)上的海量人群及其智慧解決各類問題,成功的案例包括基于眾籌眾智的萬眾創(chuàng)新、基于眾包眾享的共享經(jīng)濟(jì)、基于大眾開發(fā)的開源軟件等。這給開展軟件工程實(shí)踐教學(xué)改革提供了啟發(fā):在軟件工程課程實(shí)踐教學(xué)中,僅靠教師的力量無法從根本上解決實(shí)踐教學(xué)中的基礎(chǔ)性問題,可以嘗試將互聯(lián)網(wǎng)大眾的力量引入到課程實(shí)踐環(huán)節(jié),讓那些高水平的軟件工程師成為指導(dǎo)學(xué)生的“教師”,幫助學(xué)生解決實(shí)踐中遇到的各類問題;并且,開源軟件技術(shù)及實(shí)踐在IT學(xué)術(shù)界和產(chǎn)業(yè)界得到了廣泛應(yīng)用,產(chǎn)生了重要影響,建設(shè)開源生態(tài)、借助開源軟件實(shí)現(xiàn)軟件開發(fā)已成為諸多IT企業(yè)的共識(shí),包括Coogle、IBM、華為甚至微軟等。這給開展軟件工程實(shí)踐教學(xué)改革提供了啟發(fā):靠學(xué)生自己獨(dú)立開發(fā)出軟件系統(tǒng)的所有程序代碼,既無必要也不現(xiàn)實(shí),重用和集成開源軟件完成軟件開發(fā)是一種有效的工程方法和手段,應(yīng)該鼓勵(lì)學(xué)生通過重用開源軟件完成課程實(shí)踐任務(wù)。概括起來,基于開源和群智的軟件工程實(shí)踐教學(xué)方法本質(zhì)就是要借助于互聯(lián)網(wǎng)上的海量群體以及開源軟件幫助學(xué)生開展軟件工程課程實(shí)踐。它不僅可以有效克服現(xiàn)行方法的不足,還可以幫助學(xué)生有效解決實(shí)踐中遇到的問題。該方法基本思想描述如下:
(1)鼓勵(lì)學(xué)生借助開源軟件開發(fā)軟件。在軟件工程課程實(shí)踐過程中,學(xué)生可能會(huì)構(gòu)思一些較為復(fù)雜、有技術(shù)難度的軟件需求,這些需求的實(shí)現(xiàn)需要用到超出課程和教材的專業(yè)知識(shí)(如語(yǔ)音識(shí)別、圖像識(shí)別、機(jī)器人控制、智能手機(jī)通信等),所需軟件開發(fā)技術(shù)(如數(shù)據(jù)庫(kù)設(shè)計(jì))可能還未開始講授,掌握實(shí)現(xiàn)需求的開發(fā)技術(shù)(如將語(yǔ)音轉(zhuǎn)換為文字、將視頻和語(yǔ)音信息從一臺(tái)計(jì)算機(jī)傳輸?shù)接脩羰謾C(jī)上)對(duì)學(xué)生而言有難度。在這種情況下,課程實(shí)踐鼓勵(lì)學(xué)生到開源軟件社區(qū)去尋找開源軟件,以實(shí)現(xiàn)課程實(shí)踐中那些學(xué)生所不能或者難以實(shí)現(xiàn)的軟件需求。學(xué)生可訪問諸如Cithub( https: //github.com/) 、SourceForge( https: //source-forge.net/)、碼云(https://gitee.com/)等開源軟件托管網(wǎng)站,結(jié)合實(shí)際需求找尋相應(yīng)的開源軟件,通過對(duì)開源軟件的理解,對(duì)其進(jìn)行重用,集成到課程實(shí)踐的軟件系統(tǒng)中,從而實(shí)現(xiàn)目標(biāo)軟件系統(tǒng)的關(guān)鍵需求。開源軟件托管平臺(tái)(如Github)匯聚了海量的開源軟件項(xiàng)目(如僅Github就有8000萬個(gè)軟件版本庫(kù)),足以提供相應(yīng)的開源代碼幫助學(xué)生實(shí)現(xiàn)各類軟件需求。無疑,重用開源軟件或其代碼片段可以幫助學(xué)生有效解決課程實(shí)踐中“不知道如何做、不會(huì)做”等問題。例如,假設(shè)學(xué)生所構(gòu)思的軟件系統(tǒng)中有一項(xiàng)關(guān)鍵需求,要求將機(jī)器人所獲取的語(yǔ)音信息傳送到遠(yuǎn)端的用戶手機(jī)上。這一功能需求的實(shí)現(xiàn)對(duì)專有技術(shù)要求很高,開發(fā)起來有難度,為此學(xué)生可以到Cithub中尋找相關(guān)開源項(xiàng)目,利用“Linphone4Android”開源軟件就可以實(shí)現(xiàn)該軟件需求。
(2)要求學(xué)生到開源社區(qū)尋求問題解決。在軟件工程課程實(shí)踐過程中,學(xué)生會(huì)遇到大量、多樣化和個(gè)性化的軟件開發(fā)問題。這些問題覆蓋編程語(yǔ)言、開發(fā)技能、基礎(chǔ)平臺(tái)、代碼調(diào)試、工具使用等方方面面,涉及語(yǔ)言使用、缺陷定位、數(shù)據(jù)庫(kù)設(shè)計(jì)、網(wǎng)絡(luò)編程等諸多環(huán)節(jié)。顯然,讓教師和教輔幫助學(xué)生解決這些問題是不現(xiàn)實(shí)的。在這種情況下,課程實(shí)踐要求學(xué)生到軟件開發(fā)知識(shí)分享社區(qū)中尋找這些問題的答案,以解決問題。學(xué)生可訪問諸如Stack Overflow( https://stackoverflow.com/)、開源中國(guó)(http://www.oschlna.net/)、CSDN( https://www.csdn.net/)等軟件開發(fā)知識(shí)分享社區(qū),針對(duì)其遇到的問題搜尋相關(guān)回答,從而解決這些問題。一些軟件開發(fā)知識(shí)分享社區(qū)(如Stack Overflow)擁有幾千萬軟件開發(fā)者以及近億條知識(shí)問答條目,足以幫助學(xué)生解答實(shí)踐中遇到的各種問題。學(xué)生在實(shí)踐中遇到的95%以上的問題都可以在上述社區(qū)中找到相應(yīng)答案。對(duì)于那些找不到滿意答案的問題,學(xué)生可以在相關(guān)社區(qū)中提問,以尋求社區(qū)用戶的回答。無疑,到開源社區(qū)尋求問題解決方法可以幫助學(xué)生有效解決課程實(shí)踐中遇到的各類問題,從根本上解決“有問題找不到解答、獲得幫助的渠道有限、無法獲得有效指導(dǎo)”等問題。例如,假設(shè)學(xué)生在實(shí)踐中不知道“如何用Java訪問MySQL數(shù)據(jù)庫(kù)”。針對(duì)這一問題,學(xué)生可以訪問Stack Overflow網(wǎng)站,在查詢框中輸入“access MySQL database in Java”,系統(tǒng)將返回大約500個(gè)與此問題相關(guān)的回答。Stack Overflow還進(jìn)一步描述了這些回答的詳細(xì)信息,如提出者是誰、問題提出時(shí)間、提供回答數(shù)目、用戶點(diǎn)贊情況等,學(xué)生可以進(jìn)一步點(diǎn)擊相關(guān)超鏈獲得具體回答信息。
3 實(shí)踐教學(xué)支撐軟件工具及教學(xué)案例資源
基于開源和群智的軟件工程課程實(shí)踐需要借助一系列的支撐軟件工具,以幫助教師和學(xué)生有效和高效地開展課程實(shí)踐,搜尋和利用開源軟件和群智知識(shí),跟蹤實(shí)踐進(jìn)展情況,開展問題解答和知識(shí)分享,具體包括:分布式協(xié)同開發(fā)平臺(tái)Trustie-Forge、開源軟件檢索和分析平臺(tái)Trust-ie-OSSEAN、開源代碼閱讀和標(biāo)注工具Trustie-Codepedia、群體化學(xué)習(xí)工具LearnerHub等。
3.1 實(shí)踐任務(wù)管理與協(xié)同開發(fā)工具Trustie-Forge
Trustie-Forge部署在互聯(lián)網(wǎng)上,URL是http://course.trustie.net。它為軟件工程課程實(shí)踐開展提供了任務(wù)布置、人員組織、團(tuán)隊(duì)組建、項(xiàng)目創(chuàng)建、成果提交、協(xié)同軟件開發(fā)等一系列功能和服務(wù)(見圖2)。
(1)人員組織和管理。支持對(duì)參與課程實(shí)踐的各類人員(包括教師、教輔和學(xué)生等)進(jìn)行組織和管理,包括注冊(cè)、登錄、退出和關(guān)聯(lián)。經(jīng)過注冊(cè)后的用戶可以登錄到系統(tǒng)中,并根據(jù)所扮演的角色(如教師、教輔、學(xué)生等)操作相應(yīng)功能。
(2)實(shí)踐任務(wù)布置和管理。允許教師在課程中發(fā)布實(shí)踐任務(wù),支持學(xué)生采用兩種方式提交實(shí)踐成果:以文件方式提交和以版本庫(kù)的形式提交。Tru stie- Forge能夠搜集實(shí)踐人員的實(shí)踐活動(dòng)信息(如提交代碼、合并代碼等),掌握實(shí)踐開展動(dòng)態(tài)情況,并及時(shí)將這些信息告知給相關(guān)實(shí)踐人員。
(3)實(shí)踐軟件項(xiàng)目托管與協(xié)同開發(fā)。針對(duì)軟件工程課程實(shí)踐特點(diǎn)和要求,提供實(shí)踐軟件項(xiàng)目托管服務(wù),支持實(shí)踐人員之間的分布式協(xié)同開發(fā),具體包括:開發(fā)任務(wù)分配和跟蹤、實(shí)踐成果匯聚和合并、實(shí)踐成果版本管理、實(shí)踐成果質(zhì)量分析等。
(4)實(shí)踐信息采集和分析。搜集實(shí)踐人員參與實(shí)踐、開展軟件開發(fā)工作等方面的信息,包括實(shí)踐投入時(shí)間、發(fā)布的資源和帖子及回復(fù)帖子數(shù)量和質(zhì)量、作業(yè)提交次數(shù)等?;谶@些實(shí)踐數(shù)據(jù),Trustie-Forge可以從實(shí)踐人員個(gè)體和項(xiàng)目團(tuán)隊(duì)兩個(gè)層次,分析他們的實(shí)踐活躍度、開發(fā)貢獻(xiàn)度(如提交的程序代碼行數(shù)量)、實(shí)踐成果提交質(zhì)量(如程序代碼的質(zhì)量等級(jí))等,并依此對(duì)不同的軟件開發(fā)者個(gè)體、項(xiàng)目團(tuán)隊(duì)進(jìn)行排名。
3.2 代碼閱讀與標(biāo)注工具Trustie-Codepedia
Trustie-Codepedia部署在互聯(lián)網(wǎng)上,URL是http:llcodepedia.trustie.net,可為軟件工程課程實(shí)踐提供代碼加載、閱讀、標(biāo)注、質(zhì)量分析等功能和服務(wù)(見圖3)。
(1)代碼閱讀和注釋。Trustie-Codepedia支持將開源軟件代碼加載到工具中,構(gòu)建面向閱讀和標(biāo)注的開源軟件資源庫(kù),并為代碼閱讀和標(biāo)注提供軟件系統(tǒng)的總體結(jié)構(gòu)、類與方法、方法間調(diào)用關(guān)系等方面的視圖信息,以加強(qiáng)對(duì)開源軟件項(xiàng)目的理解和認(rèn)知。在此基礎(chǔ)上,工具提供了代碼獨(dú)立標(biāo)注的功能,實(shí)踐人員可以針對(duì)任何一行代碼或者一個(gè)代碼庫(kù)等進(jìn)行標(biāo)注。工具還集成了代碼分析工具,并基于分析結(jié)果形成相應(yīng)的引導(dǎo)問題,引導(dǎo)和培養(yǎng)學(xué)生編寫高質(zhì)量代碼的意識(shí)。
(2)標(biāo)注質(zhì)量分析和評(píng)估。實(shí)踐人員對(duì)代碼理解是否準(zhǔn)確和正確、標(biāo)注質(zhì)量如何等,僅靠教師評(píng)估非常困難。Trustie-Codepedia工具提供了多種功能和服務(wù)以加強(qiáng)對(duì)標(biāo)注質(zhì)量的分析和評(píng)估。工具支持實(shí)踐人員查看他人給出的代碼注釋,以幫助其更好地理解代碼的語(yǔ)義。工具還提供了贊與踩、匿名評(píng)論、交叉互評(píng)等功能,通過學(xué)生間的相互評(píng)閱,利用機(jī)器學(xué)習(xí)和自然語(yǔ)言處理技術(shù)對(duì)標(biāo)注進(jìn)行分析,從而對(duì)學(xué)生代碼注釋質(zhì)量進(jìn)行科學(xué)分析和準(zhǔn)確評(píng)估。
3.3 軟件開發(fā)知識(shí)與開源軟件檢索工具Trustie-Ossean
Trustie- Ossean部署在互聯(lián)網(wǎng)上,其URL是http://os-sean.trustie.net,可為實(shí)踐人員提供群智資源檢索和獲取服務(wù),包括開源軟件項(xiàng)目、軟件開發(fā)知識(shí)問答、技術(shù)博客等,幫助實(shí)踐人員解決實(shí)踐中遇到的多樣化和個(gè)性化問題,重用開源軟件,促進(jìn)軟件系統(tǒng)開發(fā)。
(1)檢索和獲取開源軟件資源?;ヂ?lián)網(wǎng)上開源軟件托管社區(qū)(如CitHub、Sourceforge、碼云等)匯聚了海量針對(duì)不同應(yīng)用和需求的開源軟件資源。Trustie-Ossean通過爬取這些開源軟件托管社區(qū),建立起面向?qū)嵺`教學(xué)的大規(guī)模開源軟件資源庫(kù)。軟件開發(fā)人員可以通過查詢獲取所需開源軟件,進(jìn)而支持軟件系統(tǒng)開發(fā)。
(2)檢索和獲取軟件開發(fā)知識(shí)?;ヂ?lián)網(wǎng)上開源社區(qū)(如Stack Oveflow、CSDN、開源中國(guó)等)匯聚了有不同軟件開發(fā)人員所提供的多樣化軟件開發(fā)知識(shí)(包括知識(shí)問答、技術(shù)博客等等)。它們既是對(duì)眾多軟件開發(fā)經(jīng)驗(yàn)的總結(jié),也提供了針對(duì)不同軟件開發(fā)問題的常見解決方法。Trust-ie-Ossean通過與開源社區(qū)內(nèi)容同步等技術(shù)手段,建立起面向軟件工程課程實(shí)踐教學(xué)的大規(guī)模軟件開發(fā)知識(shí)庫(kù)。軟件開發(fā)人員通過查詢方式獲取和共享相應(yīng)的軟件開發(fā)知識(shí),從而幫助他們解決實(shí)踐中遇到的困難和問題。
3.4 群體化學(xué)習(xí)工具LearnerHub
LearnerHub(也稱知士薈)部署在互聯(lián)網(wǎng)上,其網(wǎng)址是http://www.learnerhub.net/,它可以幫助實(shí)踐人員圍繞特定的主題(如軟件工程、軟件開發(fā)等)開展學(xué)習(xí)、交流、討論和分享。它采用在線社區(qū)的模式組織學(xué)習(xí)者,使得他們通過互聯(lián)網(wǎng)分享學(xué)習(xí)資源(如學(xué)習(xí)資料、技術(shù)博客、開發(fā)經(jīng)驗(yàn)等)和知識(shí)。
(1)基于項(xiàng)目的群體化學(xué)習(xí)。LearnerHub支持學(xué)習(xí)者圍繞學(xué)習(xí)項(xiàng)目開展群體化學(xué)習(xí),如創(chuàng)建學(xué)習(xí)資源、貢獻(xiàn)學(xué)習(xí)資源、提出問題、回答問題、投票回答等,進(jìn)而支持互聯(lián)網(wǎng)大眾圍繞特定的主題開展自主化學(xué)習(xí)。LearnerHub允許用戶自由地創(chuàng)建學(xué)習(xí)項(xiàng)目(如軟件工程綜合實(shí)踐),接受互聯(lián)網(wǎng)用戶加人到學(xué)習(xí)項(xiàng)目中開展群體化學(xué)習(xí)。
(2)基于群組的學(xué)習(xí)者管理。LearnerHub采用學(xué)習(xí)群組機(jī)制組織和管理學(xué)習(xí)者,它允許用戶創(chuàng)建群組(如軟件工程課程實(shí)踐的學(xué)生群)并通過群組匯聚具有共同學(xué)習(xí)目標(biāo)和興趣的學(xué)習(xí)者。互聯(lián)網(wǎng)用戶可以根據(jù)自己的興趣和意愿自由地加入到相應(yīng)的學(xué)習(xí)群組之中。群組中的用戶可以創(chuàng)建學(xué)習(xí)項(xiàng)目,從而使得群組中的成員可以圍繞學(xué)習(xí)項(xiàng)目開展群體化學(xué)習(xí)。LearnerHub允許一個(gè)群組創(chuàng)建一個(gè)或者多個(gè)學(xué)習(xí)項(xiàng)目,也可以在一個(gè)群組中創(chuàng)建一個(gè)或多個(gè)子群組。群組中的管理者(也稱群主)擁有對(duì)群組及其所關(guān)聯(lián)的學(xué)習(xí)項(xiàng)目的管理權(quán)限。加入群組后,群組中的成員可以跟隨群主的學(xué)習(xí)路徑和計(jì)劃一起開展學(xué)習(xí),也可以結(jié)合各自學(xué)習(xí)需求在相關(guān)學(xué)習(xí)項(xiàng)目中進(jìn)行交流和分享。
3.5 開源社區(qū)
軟件開發(fā)是一個(gè)知識(shí)密集型的活動(dòng),高效的知識(shí)獲取、分享和傳播可有效地促進(jìn)軟件開發(fā)。目前,典型的軟件開發(fā)知識(shí)分享社區(qū)包括編程問答社區(qū)、技術(shù)資訊社區(qū)等。
(1)編程知識(shí)問答社區(qū)及Stack Overflow。編程知識(shí)問答社區(qū)主要圍繞編程過程中遇到的問題進(jìn)行問題發(fā)布、回答、評(píng)論、搜索等活動(dòng)。Stack Overflow是一個(gè)面向編程人員群體的垂直問答網(wǎng)站,也是目前最活躍、最具影響力的軟件開發(fā)知識(shí)問答社區(qū),問題主題非常寬泛,涉及Web開發(fā)、數(shù)據(jù)管理、安全、編程實(shí)踐等方方面面,涵蓋Android、iOS、Eclipse等軟件開發(fā)平臺(tái),包括C++、Java、Python、Ruby等各種編程語(yǔ)言及技術(shù)。
(2)技術(shù)資訊社區(qū)及CSDN。技術(shù)資訊主要圍繞特定的編程開發(fā)技術(shù),供軟件開發(fā)人員發(fā)布其開發(fā)和實(shí)踐經(jīng)驗(yàn)、使用體驗(yàn)等,供相關(guān)人員開展交流和討論。同時(shí),社區(qū)還可以圍繞特定的開源項(xiàng)目或者開源技術(shù),發(fā)布相關(guān)開源產(chǎn)品的最新信息等,典型技術(shù)資訊社區(qū)的代表是CSDN。CSDN是創(chuàng)立于1999年的中國(guó)IT社區(qū)和服務(wù)平臺(tái),為軟件開發(fā)人員和IT從業(yè)者提供知識(shí)傳播、職業(yè)發(fā)展、軟件開發(fā)等服務(wù)。在CSDN中,用戶可以了解最新IT技術(shù)資訊,學(xué)習(xí)和發(fā)布技術(shù)博客。
3.6 實(shí)踐教學(xué)案例及資源
為了支撐基于開源和群智的軟件工程實(shí)踐教學(xué)及改革,本文以“空巢老人智能看護(hù)系統(tǒng)”為案例,提供了豐富的實(shí)踐教學(xué)資源,具體包括:軟件文檔及模板、分析和設(shè)計(jì)的UML模型、高質(zhì)量的程序代碼、實(shí)踐總結(jié)材料(包括軟件產(chǎn)品宣傳材料、演示視頻和匯報(bào)PPT等)。
案例資源可在LearnerHub工具中的學(xué)習(xí)空間“軟件工程課程實(shí)踐教學(xué)及改革(教師)”(見圖5)中獲得。教材[1]結(jié)合軟件工程實(shí)踐內(nèi)容詳細(xì)闡述了案例細(xì)節(jié)。
4 實(shí)踐成效分析
基于上述實(shí)踐教學(xué)方法,課題組在國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院開展了為期5年的軟件工程實(shí)踐教學(xué)改革與探索,成效顯著,具體表現(xiàn)為以下幾個(gè)方面:
(1)創(chuàng)意性。學(xué)生構(gòu)思并開發(fā)了許多有創(chuàng)意和特色的軟件系統(tǒng),如無人值守的圖書館信息系統(tǒng)、空巢老人智能看護(hù)系統(tǒng)、物流寶、多無人機(jī)聯(lián)合搜尋系統(tǒng)等。這些課程實(shí)踐成果先后獲得計(jì)算機(jī)作品賽、科技創(chuàng)新比賽、創(chuàng)新創(chuàng)業(yè)賽、網(wǎng)絡(luò)技術(shù)挑戰(zhàn)賽等的特等獎(jiǎng)、一二等獎(jiǎng)、金銀獎(jiǎng)共計(jì)18項(xiàng)。
(2)規(guī)模性。課程實(shí)踐所開發(fā)的軟件系統(tǒng)代碼行數(shù)量絕大部分超過15 000+LOC。這意味著課程實(shí)踐中的軟件系統(tǒng)具有一定的規(guī)模性和復(fù)雜度,學(xué)生通過該實(shí)踐可以在一定程度上感受復(fù)雜系統(tǒng)開發(fā)的常見問題,體會(huì)和踐行軟件工程的基本原則和思想。
(3)集成性。課程實(shí)踐中的絕大部分軟件項(xiàng)目嘗試將軟件系統(tǒng)與智能手機(jī)、機(jī)器人、無人系統(tǒng)、互聯(lián)網(wǎng)云服務(wù)等系統(tǒng)和設(shè)備集成在一起,以解決實(shí)際問題,并尋求創(chuàng)新。所開發(fā)的軟件系統(tǒng)大多是分布式、異構(gòu)的人機(jī)物融合系統(tǒng)。
(4)綜合性。課程實(shí)踐中幾乎所有的軟件項(xiàng)目都綜合運(yùn)用多種軟件開發(fā)技術(shù)、工具、語(yǔ)言和平臺(tái),一些軟件系統(tǒng)包含有多個(gè)不同的異構(gòu)軟部件,運(yùn)行在不同的計(jì)算平臺(tái)上(如機(jī)器人、智能手機(jī)等計(jì)算設(shè)備、Linux和Android操作系統(tǒng)等),采用多種編程語(yǔ)言實(shí)現(xiàn)(如C++、Java和Python),以滿足軟件系統(tǒng)在不同平臺(tái)上的開發(fā)、部署和運(yùn)行需要。
(5)高質(zhì)量。學(xué)生在課程實(shí)踐中提交了多樣化的軟件制品,包括軟件模型、文檔、程序代碼等。通過對(duì)這些軟件制品的質(zhì)量分析可以發(fā)現(xiàn),學(xué)生提交的軟件系統(tǒng)具有較高的質(zhì)量,具體表現(xiàn)為UML模型表達(dá)準(zhǔn)確,軟件文檔規(guī)范且文字表述較為簡(jiǎn)潔和嚴(yán)謹(jǐn)、可讀性較好,程序代碼遵循編碼風(fēng)格且具有較好的可理解性、可維護(hù)性等。
5 結(jié)語(yǔ)
軟件工程課是一門很難講好、教好和學(xué)好的專業(yè)課程,其實(shí)踐教學(xué)環(huán)節(jié)尤為關(guān)鍵。軟件工程課程實(shí)踐教學(xué)常常面臨著學(xué)生“做不了、做不出、做不好”,教師“缺乏工程經(jīng)驗(yàn)、沒有足夠精力指導(dǎo)學(xué)生和解答問題”等突出問題,使得實(shí)踐教學(xué)流于形式。出現(xiàn)這種狀況的原因是多方面的,既有軟件工程課程實(shí)踐的特殊性,也有現(xiàn)行實(shí)踐教學(xué)方法的局限性。本文提出從培養(yǎng)“解決復(fù)雜工程問題能力”的高度確立軟件工程課程實(shí)踐教學(xué)目標(biāo),為此設(shè)計(jì)了支撐這一目標(biāo)的實(shí)踐任務(wù)框架,對(duì)實(shí)踐任務(wù)的規(guī)模性、創(chuàng)新性、集成性、綜合性和高質(zhì)量等提出明確要求。為了達(dá)成這一實(shí)踐教學(xué)目標(biāo),解決實(shí)踐教學(xué)中的突出問題,應(yīng)對(duì)挑戰(zhàn),本文提出了基于開源和群智的方法,其核心思想是學(xué)習(xí)開源軟件中的成功經(jīng)驗(yàn)、鼓勵(lì)學(xué)生借助開源軟件完成軟件開發(fā)、要求學(xué)生到開源社區(qū)尋求問題的答案。
基于上述方法,課題組進(jìn)行了5年的改革和探索,成效顯著。整體而言,通過軟件工程實(shí)踐,學(xué)生創(chuàng)新實(shí)踐能力以及綜合運(yùn)用知識(shí)和工具解決復(fù)雜工程問題的能力等得到了極大提升。詳細(xì)的實(shí)踐實(shí)施方法可以參見相關(guān)教材[1],支撐平臺(tái)LearnerHub( www.learnerhub.net)匯聚了教學(xué)改革的具體成果,包括:課件、模型、文檔、代碼、數(shù)據(jù)、工具等。
參考文獻(xiàn):
[1] 毛新軍,王濤,余躍.軟件工程實(shí)踐教程:基于開源和群智的方法[M].北京:高等教育出版社,2019.
[2]SHAW M.Software engineering education:a roadmap[Cl. ICSE-Fu-ture of SE Track, 2000: 371-380.
[3]ARDIS M,F(xiàn)ORD G.SEI report on graduate software engineering edu-cation[C].SEI Conference on SoftWare Engineering Education, 1989:208-249.
[4]林健.面向未來的中國(guó)新工科建設(shè)[J].清華大學(xué)教育研究,2017,38(2):26-35.
[5] ALHAMMAD M M,MORENO A M.Gamification in software engineer-ing education:a systematic mapping[Jl. Journal of Systems and Soft-ware.2018, 141: 131-150.
[6] FASSBINDER A G D 0,F(xiàn)ASSBINDER M,BARBOSA E F,et al.Mas-sive open online courses in software engineering education[C].IEEEFrontiers in Education Conference. 2017: 1-10.
[7]NEILL C J,DEFRANCO J F,SANGWAN R S.Improving collabora-tive learning in online software engineering education [J]. EuropeanJournal of Engineering Education, 2016, 41(3):1-12.
[8] PAPADOPOULOS P M,STAMELOS I G,MEISZNER A.Enhancingsoftware engineering education through open source projects: Fouryears of students' perspectives[J].Education and Information Tech-nologies, 2013, 18(2):381-397.
(責(zé)任編輯:孫娟)
基金項(xiàng)目:科技部重點(diǎn)研發(fā)計(jì)劃項(xiàng)目( 2018YFB1004202);國(guó)家自然科學(xué)基金重點(diǎn)項(xiàng)目(61532004)
作者簡(jiǎn)介:毛新軍(1970-),男,博士,國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院教授,研究方向?yàn)檐浖こ谭较虻慕虒W(xué)教改、人才培養(yǎng)。