楊志斌,周 勇,王立松
(南京航空航天大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇南京 210016)
2017 年2 月以來,教育部基于國家近期的戰(zhàn)略發(fā)展要求,積極推進(jìn)“新工科”建設(shè),尤其針對工業(yè)軟件、系統(tǒng)軟件、人工智能等方面核心技術(shù)人才需求日益迫切的問題,提出培養(yǎng)多元化、創(chuàng)新型的卓越工程人才[1]。作為行業(yè)特色鮮明的部屬高校和工科優(yōu)勢高校,聚焦國家發(fā)展戰(zhàn)略,努力探索航空航天特色新工科人才培養(yǎng)體系建設(shè),培養(yǎng)滿足行業(yè)當(dāng)前與未來發(fā)展需要的高素質(zhì)工程人才,是南京航空航天大學(xué)應(yīng)有的職責(zé)[2]。未來航空電子、航天器等安全關(guān)鍵系統(tǒng)呈現(xiàn)軟件定義化、智能化、網(wǎng)絡(luò)化等發(fā)展趨勢,復(fù)雜的應(yīng)用環(huán)境、多變的任務(wù)需求,給這類系統(tǒng)中的軟件研發(fā)帶來新的挑戰(zhàn)。通用軟件工程人才不能完全勝任相關(guān)工作,因此目前急需培養(yǎng)面向高安全系統(tǒng)領(lǐng)域的軟件工程專門人才[3]。
編譯原理是軟件工程專業(yè)課程體系中的關(guān)鍵課程。其理論課程內(nèi)容比較抽象,學(xué)生在學(xué)習(xí)過程中需要不斷地建立計(jì)算機(jī)系統(tǒng)觀,課程設(shè)計(jì)又需要學(xué)生具備較強(qiáng)的架構(gòu)設(shè)計(jì)、編程實(shí)現(xiàn)、測試、文檔撰寫等軟件工程能力,因此學(xué)生學(xué)習(xí)這門課程會有一定難度。同時,編譯原理課程內(nèi)容十分重要,編譯程序的原理、方法和技術(shù)已廣泛應(yīng)用于一些非編譯系統(tǒng)中。近年來,模型驅(qū)動開發(fā)方法逐漸成為航空航天領(lǐng)域軟件設(shè)計(jì)與開發(fā)的重要手段,其中模型轉(zhuǎn)換、代碼自動生成等技術(shù)都是編譯原理知識的具體應(yīng)用。為此,很多學(xué)者對編譯原理課程教學(xué)進(jìn)行了研究。例如,崔光宇[4]總結(jié)了編譯原理教學(xué)現(xiàn)狀,包括學(xué)生對課程的認(rèn)識模糊、編譯原理理論抽象、算法較為復(fù)雜、程序設(shè)計(jì)要求較高等;孫守卿[5]研究基于工程教育專業(yè)認(rèn)證的編譯原理課程改革,針對課程標(biāo)準(zhǔn)、教學(xué)內(nèi)容、教學(xué)模式、考核形式等給出了相應(yīng)措施;劉兵等[6]根據(jù)工程教育專業(yè)認(rèn)證對復(fù)雜工程問題解決能力的要求,以Clang+LLVM 作為編譯器實(shí)例化案例,以C++語言作為教學(xué)語言,提出一種適合編譯原理課程的實(shí)例化驅(qū)動混合教學(xué)模式;諶志群等[7]設(shè)計(jì)新工科背景下的編譯原理課程工程案例,提出以工程案例作為課堂教學(xué)與產(chǎn)業(yè)需求之間的結(jié)合點(diǎn),將課程知識點(diǎn)融入到工程案例中。
相比已有工作,本文主要針對航空航天特色新工科背景下的軟件工程創(chuàng)新型人才培養(yǎng)進(jìn)行思考與探索,以編譯原理課程為例,研究面向航空航天領(lǐng)域軟件工程的科研教學(xué)相互促進(jìn)機(jī)制,提出“將科研引入課堂、將學(xué)生帶出課堂”的教學(xué)改革思路,讓學(xué)生帶著“學(xué)有所用”的心態(tài)去上課,從而提升學(xué)習(xí)興趣;給出面向復(fù)雜工程能力培養(yǎng)的編譯原理課程改革方案,凝練與重構(gòu)理論教學(xué)主線,提出兩級課程設(shè)計(jì)實(shí)驗(yàn)體系,以培養(yǎng)學(xué)生的計(jì)算機(jī)系統(tǒng)能力與軟件工程能力,同時提升其解決復(fù)雜工程問題的能力。根據(jù)學(xué)生的學(xué)習(xí)成效和反饋,表明課程改革有效提高了教學(xué)質(zhì)量。
以解決安全關(guān)鍵領(lǐng)域的軟件高可靠性、高安全性問題為目標(biāo),通過高安全系統(tǒng)軟件工程學(xué)科人才培養(yǎng),讓學(xué)生從學(xué)會寫小規(guī)模軟件(Student Software)到學(xué)會寫高質(zhì)量大規(guī)模工業(yè)軟件(Industrial Software),并深刻理解只有在軟件工程理論與技術(shù)方面打下良好基礎(chǔ),才能有效保障軟件的可靠性和安全性。
作為南京航空航天大學(xué)軟件工程專業(yè)的學(xué)生,需要培養(yǎng)兩個通用能力,即計(jì)算機(jī)系統(tǒng)能力和軟件工程能力,如圖1 所示。
首先,目前各課程大多獨(dú)立進(jìn)行設(shè)計(jì)與實(shí)施,知識體系規(guī)劃缺乏系統(tǒng)性,使學(xué)生不能很好地建立完整的計(jì)算機(jī)系統(tǒng)觀念[8]。按照教育部計(jì)算機(jī)類指導(dǎo)委員會給出的定義,計(jì)算機(jī)系統(tǒng)能力是指理解計(jì)算機(jī)系統(tǒng)的整體性、關(guān)聯(lián)性、層次性、動態(tài)性和開放性,并綜合運(yùn)用多種知識與技術(shù)完成系統(tǒng)開發(fā)的能力。對于本科生而言,主要體現(xiàn)在能夠自主設(shè)計(jì)一個CPU、操作系統(tǒng)(內(nèi)核)或編譯器。其次,當(dāng)學(xué)生編寫小型軟件時,其往往更關(guān)注于數(shù)據(jù)結(jié)構(gòu)與算法層面。按照工程教育認(rèn)證、新工科的要求,學(xué)會解決復(fù)雜工程問題成為本科人才培養(yǎng)的一個重要趨勢[9]。華為公司2019 年1 號文曾經(jīng)提出,需全面提升軟件人才的軟件工程實(shí)踐能力,打造可信的高質(zhì)量產(chǎn)品。航空航天特色新工科培養(yǎng)的人才將來要面對的是面向不同領(lǐng)域的大規(guī)模軟件,可能包括百萬行甚至千萬行代碼,尤其針對航空航天領(lǐng)域的大規(guī)模高可靠軟件,此時軟件工程能力成為一種重要而又通用的能力。
Fig.1 Computer system ability and software engineering ability training for emerging engineering圖1 面向新工科的計(jì)算機(jī)系統(tǒng)能力與軟件工程能力培養(yǎng)
編譯原理是軟件工程專業(yè)的重要課程,在學(xué)習(xí)過程中,學(xué)生需要具備計(jì)算機(jī)系統(tǒng)觀及較強(qiáng)的軟件工程能力,才能解決復(fù)雜的工程問題[10]。筆者在安全關(guān)鍵軟件系統(tǒng)開發(fā)與驗(yàn)證技術(shù)研究中大量使用了編譯原理相關(guān)技術(shù),因此在具體教學(xué)過程中使課題組的科學(xué)研究與教學(xué)相互促進(jìn),讓學(xué)生帶著“學(xué)有所用”的心態(tài)去上課,令其學(xué)習(xí)興趣更加濃厚。同時,通過把書本知識與科研實(shí)踐進(jìn)行對比,可提升學(xué)生的學(xué)習(xí)效果。另外,凝練與重構(gòu)理論教學(xué)主線,提出兩級課程設(shè)計(jì)實(shí)驗(yàn)體系,以鍛煉學(xué)生的計(jì)算機(jī)系統(tǒng)能力與軟件工程能力。
一流的科學(xué)研究與一流的教學(xué)教育是“雙一流”建設(shè)的重要基石,依賴于高水平的科研及教學(xué)創(chuàng)新能力。在教學(xué)實(shí)踐過程中,本文圍繞教學(xué)改革目標(biāo),實(shí)施“將科研引入課堂、將學(xué)生帶出課堂”的對策,讓學(xué)生感受到“枯燥”“難度大”的編譯原理知識在航空航天領(lǐng)域軟件工程研究或系統(tǒng)開發(fā)中的重要應(yīng)用,以提升學(xué)生的學(xué)習(xí)興趣與學(xué)習(xí)效果。
(1)引入機(jī)制方面。課題組研究涉及模型驅(qū)動開發(fā)、形式化設(shè)計(jì)與驗(yàn)證、代碼自動生成、逆向工程、安全關(guān)鍵智能軟件建模與驗(yàn)證等,編譯原理課程中的形式語言、自動機(jī)、編譯過程、編譯優(yōu)化等知識是課題組研究的重要基礎(chǔ)。筆者將自己的研究方法及研究思維方式引入教學(xué)中,訓(xùn)練學(xué)生的科研思維能力。例如,在講解運(yùn)行時存儲空間組織與優(yōu)化技術(shù)時,讓學(xué)生了解時間可預(yù)測多核處理器以及多線程程序分析等方面的研究。每一章都會進(jìn)行總結(jié),包括基本知識及外延知識。
在實(shí)際教學(xué)過程中,適度調(diào)整理論課程教學(xué)內(nèi)容,減少已有課程中的冗余內(nèi)容,在課程中增加模型驅(qū)動、高安全軟件設(shè)計(jì)等新研究進(jìn)展,并邀請國內(nèi)航空航天研究所的工程師及法國教授到學(xué)校進(jìn)行授課。尤其是在學(xué)期末通過沙龍形式總結(jié)編譯原理課程中實(shí)行的科研與教學(xué)相促機(jī)制的探索,介紹課題組研制的安全關(guān)鍵軟件形式化設(shè)計(jì)與驗(yàn)證系統(tǒng)(10 萬行代碼規(guī)模)及其在航天領(lǐng)域的應(yīng)用,簡要分析系統(tǒng)中使用的編譯技術(shù),讓學(xué)生體會到編譯原理知識在工程研究或系統(tǒng)開發(fā)中的重要應(yīng)用。
(2)帶出機(jī)制方面。首先,構(gòu)建本科生新型導(dǎo)師制,切實(shí)構(gòu)建本科生進(jìn)入科研實(shí)驗(yàn)室及參與導(dǎo)師科研項(xiàng)目的學(xué)習(xí)團(tuán)隊(duì)組建機(jī)制、學(xué)術(shù)指導(dǎo)機(jī)制、激勵評價機(jī)制,激發(fā)學(xué)生創(chuàng)新意識,培養(yǎng)學(xué)生的科學(xué)探究能力和工程實(shí)踐能力。同時依托“高安全系統(tǒng)的軟件開發(fā)與驗(yàn)證技術(shù)”工信部重點(diǎn)實(shí)驗(yàn)室成立了安全軟件小組。近5 年來,已有30 余名優(yōu)秀本科生在學(xué)習(xí)編譯原理課程的同時參與到課題組科研中,共參加了國家自然科學(xué)基金、國防基礎(chǔ)科研重點(diǎn)項(xiàng)目、裝發(fā)重大項(xiàng)目子課題、江蘇省自然科學(xué)基金等課題的研究,并基于項(xiàng)目研究組隊(duì)參加校級科創(chuàng)競賽,起到了切實(shí)的教學(xué)與科研相互促進(jìn)的效果。
其次,由于課題組項(xiàng)目大多是與航空航天研究所聯(lián)合申請并共同完成的,因此學(xué)校進(jìn)一步探索企業(yè)導(dǎo)師的教學(xué)方式。到課題組參與科研的本科生中,有15 位學(xué)生在企業(yè)導(dǎo)師的指導(dǎo)下,到航天804 所、航天706 所、航空631 所等單位進(jìn)行現(xiàn)場學(xué)習(xí)與交流。
學(xué)生們都感受到從編譯原理課程理論學(xué)習(xí)到進(jìn)入課題組參與實(shí)際科研項(xiàng)目,知識銜接比較順暢,學(xué)有所用,同時又在課題中擴(kuò)展了視野。
為了在編譯原理課程教學(xué)中實(shí)踐“科研教學(xué)相互促進(jìn)”的教學(xué)理念,本文在編譯原理理論教學(xué)與課程設(shè)計(jì)等方面進(jìn)行了改革。
在理論教學(xué)過程中,主要從4 個方面進(jìn)行教學(xué)優(yōu)化:
(1)凝練與重構(gòu)教學(xué)主線。在理論層面,分為語言定義(正規(guī)文法、上下文無關(guān)文法、中間語言、目標(biāo)語言)和機(jī)器識別(有限自動機(jī)識別詞法、下推自動機(jī)識別語法、虛擬機(jī)執(zhí)行中間語言、CPU 執(zhí)行目標(biāo)語言)兩個層次;在編譯程序?qū)崿F(xiàn)層面,與理論知識對應(yīng),通過程序?qū)崿F(xiàn)的方式逐步實(shí)現(xiàn)文法定義、詞法分析、語法分析、語義分析、中間程序生成、目標(biāo)程序生成等編譯步驟,并在最終的課程設(shè)計(jì)中構(gòu)造一個完整的編譯器,使學(xué)生清晰了解編譯理論與實(shí)現(xiàn)技術(shù)之間的對應(yīng)關(guān)系。
(2)開闊學(xué)生視野。在授課過程中介紹編譯原理知識與主流編譯器的對照,如VC、GCC、LLVM、Clang 等,提高學(xué)生的學(xué)習(xí)興趣。
(3)強(qiáng)化計(jì)算機(jī)系統(tǒng)思維。梳理編譯原理與程序設(shè)計(jì)、匯編語言、計(jì)算機(jī)硬件(尤其是存儲、多核處理器)、操作系統(tǒng)等課程之間的有機(jī)聯(lián)系。
(4)突出編譯原理在軟件工程,尤其是航空航天領(lǐng)域軟件工程中的應(yīng)用。編譯原理與技術(shù)是模型驅(qū)動開發(fā)方法、模型轉(zhuǎn)換的重要基礎(chǔ),并擴(kuò)展介紹程序語言的形式語義、編譯器驗(yàn)證等知識。
編譯原理課程設(shè)計(jì)主要培養(yǎng)學(xué)生的工程實(shí)踐能力,遵循建構(gòu)主義學(xué)習(xí)論。編譯原理課程采用兩級實(shí)驗(yàn)體系,如表1 所示。
Table 1 Experiments framework of the compiler principles course表1 編譯原理實(shí)驗(yàn)體系
(1)在理論知識學(xué)習(xí)過程中,根據(jù)課程進(jìn)度逐步實(shí)現(xiàn)文法定義、詞法分析、語法分析、語義分析、中間程序生成、目標(biāo)程序生成等編譯步驟,并在課程設(shè)計(jì)中構(gòu)造一個完整的編譯器。其中,詞法分析中的正規(guī)文法與非確定有限自動機(jī)的等價轉(zhuǎn)換、非確定有限自動機(jī)的確定化與最小化,以及語法分析中的自上而下分析LL(1)和自下而上分析LR(0)、SLR(1)必須實(shí)現(xiàn),其它算法學(xué)生可根據(jù)自己興趣進(jìn)行選擇。平時的編譯模塊實(shí)現(xiàn)過程主要是幫助學(xué)生進(jìn)行理論學(xué)習(xí),加深對理論知識的理解。
(2)在最后的課程設(shè)計(jì)中,使學(xué)生對編譯過程有比較完整的認(rèn)識,能夠快速地對整個編譯程序進(jìn)行重構(gòu)、改進(jìn)、優(yōu)化與測試,進(jìn)一步鍛煉學(xué)生的團(tuán)隊(duì)協(xié)作、答辯表達(dá)、文檔撰寫等能力。
兩級實(shí)驗(yàn)體系體現(xiàn)了理論課程與課程設(shè)計(jì)之間的緊密聯(lián)系。第一級實(shí)驗(yàn)主要是在理論課授課過程中,學(xué)生逐步動手實(shí)現(xiàn)編譯過程中的關(guān)鍵算法,第二級實(shí)驗(yàn)是在前者的基礎(chǔ)上,完成編譯器的架構(gòu)設(shè)計(jì)、功能實(shí)現(xiàn)、優(yōu)化與測試。
針對復(fù)雜工程能力培養(yǎng)問題,一方面,編譯器設(shè)計(jì)與實(shí)現(xiàn)本身就是一個復(fù)雜的工程問題,通過課程設(shè)計(jì),學(xué)生逐漸體會使用軟件工程化思想進(jìn)行編譯器實(shí)現(xiàn);另一方面,在編譯器代碼優(yōu)化與測試階段,給學(xué)生講解軟件安全性、可靠性在航空航天領(lǐng)域的重要性,代碼優(yōu)化、嚴(yán)格測試及編譯器驗(yàn)證等工作都是提高航空航天軟件質(zhì)量的有效手段。
通過連續(xù)5 年在南京航空航天大學(xué)計(jì)算機(jī)學(xué)院軟件工程專業(yè)的編譯原理課程中實(shí)施教學(xué)改革,根據(jù)學(xué)生學(xué)習(xí)成效與學(xué)習(xí)反饋,表明教學(xué)改革很好地提高了教學(xué)質(zhì)量。以2020 年度為例,如表2、表3 所示,編譯原理理論考試80 分以上的人數(shù)占比為67.2%,且“工程知識”和“問題分析”的畢業(yè)要求達(dá)成度分別為0.755 269 和0.830 24。
Table 2 Statistical data of the scores of compiler principles(2020)表2 2020 年軟件工程專業(yè)編譯原理課程成績統(tǒng)計(jì)
Table 3 Achieved degree of the compiler principles course(2020)表3 2020 年軟件工程專業(yè)編譯原理課程達(dá)成度分析
每一學(xué)年都會收集學(xué)生的學(xué)習(xí)反饋,用于持續(xù)改進(jìn)教學(xué)。學(xué)生的主要反饋內(nèi)容包括:在循序漸進(jìn)的學(xué)習(xí)過程中將編譯原理知識一點(diǎn)點(diǎn)融會貫通,由零化整,逐步了解編譯具體過程并具備了構(gòu)造一個簡單編譯器的能力;通過每一章的作業(yè)對課堂上學(xué)到的知識進(jìn)行復(fù)習(xí)鞏固,更加深入地理解了編譯原理;通過平時的實(shí)驗(yàn)與課程設(shè)計(jì),將在其它課程上學(xué)到的知識(如數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)組成原理等)聯(lián)系起來,親自動手編程,鍛煉了自己的系統(tǒng)開發(fā)能力;通過編譯原理課程的學(xué)習(xí),感受到了編譯的重要性和培養(yǎng)計(jì)算機(jī)系統(tǒng)能力對一個軟件工程專業(yè)學(xué)生的必要性;學(xué)術(shù)沙龍以及到課題組參與科研的形式,有助于了解編譯理論知識在科研中的實(shí)際應(yīng)用,學(xué)以致用才能學(xué)得更好。
本文以航空航天特色新工科背景下軟件工程創(chuàng)新型人才培養(yǎng)為目標(biāo),以編譯原理課程為例,研究面向航空航天領(lǐng)域軟件工程的科研教學(xué)相促機(jī)制,實(shí)施“將科研引入課堂、將學(xué)生帶出課堂”的教學(xué)改革思路,讓學(xué)生帶著“學(xué)有所用”的心態(tài)去上課,令其學(xué)習(xí)興趣更加濃厚;開展面向復(fù)雜工程能力培養(yǎng)的編譯原理課程改革,凝練與重構(gòu)理論教學(xué)主線,提出兩級課程設(shè)計(jì)實(shí)驗(yàn)體系,培養(yǎng)學(xué)生的計(jì)算機(jī)系統(tǒng)能力與軟件工程能力,從而提升其解決復(fù)雜工程問題的能力。根據(jù)學(xué)生成績與學(xué)習(xí)反饋,表明課程改革有效提高了教學(xué)質(zhì)量。本文提出的教學(xué)實(shí)踐經(jīng)驗(yàn)雖然以軟件工程學(xué)科的編譯原理課程為例,但在一定程度上也適合于其它課程及其它學(xué)科。