姚紅巖 馬云吉
摘 要:以“卓越軟件工程師教育培養(yǎng)計劃”為背景,分析軟件工程在專業(yè)中的位置和意義。對軟件工程教學(xué)中存在的問題進行了深入探討,提出了一種軟件工程教學(xué)策略,指出提升教學(xué)效果和教學(xué)質(zhì)量的實踐改革思路。
關(guān)鍵詞:軟件工程;工程能力;案例教學(xué)
中圖分類號:G642 文獻標(biāo)識碼:A
Abstract:Taking the educational program for outstanding software engineering as a background,we briefly analyze the course of software engineering with respect to its position in the whole curricula system, and then explore an issue taking place in the teaching practice.A strategy for improving the teaching effect is proposed after the analysis.Our practice indicates the strategy is helpful to the students for highlighting the understanding of software design.
Keywords:software engineering;engineering ability;case study
1 引言(Introduction)
“卓越工程師教育培養(yǎng)計劃”是教育部于2010年6月啟動的為期10年(2010—2020年)的重大改革項目。該項目旨在全面提高我國工程人才培養(yǎng)質(zhì)量,對于計算機專業(yè)則是要求其以新的教學(xué)改革嘗試,培養(yǎng)具有高工程素質(zhì)的卓越軟件工程師。筆者以這一計劃為大背景,圍繞軟件工程專業(yè)課教學(xué),深入探討該門課程的性質(zhì)及課堂教學(xué)策略,以期能夠引導(dǎo)學(xué)生通過學(xué)好軟件工程,成為一名卓越的軟件工程師。
2 軟件工程教學(xué)中存在的問題及分析(The analysis for issues taking place in teaching software engineering)
軟件工程是核心專業(yè)課[1,2]。該門課程能將先前學(xué)習(xí)的程序語言,面向?qū)ο笏枷?,算法設(shè)計與分析,網(wǎng)絡(luò)原理,數(shù)據(jù)庫建模,開發(fā)工具等綜合地融合到一起,在設(shè)計層面使之成為一個整體的工程方案,解決需求分析中的領(lǐng)域問題。作為軟件工程專業(yè)的學(xué)生,應(yīng)當(dāng)通過學(xué)習(xí)軟件工程這門課程,綜合地領(lǐng)會各種基礎(chǔ)課程在軟件建模中的具體應(yīng)用,并通過分析和設(shè)計案例,體會現(xiàn)實需求與抽象設(shè)計的轉(zhuǎn)換之美,為將來成為一名軟件工程師打好基礎(chǔ)。然而受教學(xué)資源、課時以及學(xué)生自身條件等諸多因素限制,在實際教學(xué)過程中,學(xué)生更傾向于較快地進入編程階段,而對早期的分析設(shè)計階段認識不足。由于軟件工程專業(yè)的學(xué)生,在長遠規(guī)劃上,應(yīng)被培養(yǎng)成為軟件設(shè)計人員或軟件工程師,而不應(yīng)是專職編碼人員,因此對于教學(xué)期間出現(xiàn)的這種現(xiàn)象:易傾向編程而非重點優(yōu)化設(shè)計,應(yīng)當(dāng)給予重視并在授課策略上作調(diào)整。筆者認為出現(xiàn)這種現(xiàn)象的原因可歸結(jié)為:
(1)預(yù)修的課程較多強調(diào)編程,較少關(guān)注設(shè)計,導(dǎo)致一種慣性思維——跳過設(shè)計直接編程。如C++語言,授課時更多的是講解如何編寫一個類型、構(gòu)造函數(shù)的編寫規(guī)則,以及繼承、重載、多態(tài)等編寫規(guī)則和運行原理,而較少用標(biāo)準(zhǔn)制圖的方式描述類型的設(shè)計以及類型間的邏輯關(guān)聯(lián)。
(2)不是所有的預(yù)修課程學(xué)生都能透徹領(lǐng)會,依據(jù)“短板原理”,未領(lǐng)會的理論將使學(xué)生在設(shè)計階段卡殼,想不出哪些理論方法可使設(shè)計進行下去,導(dǎo)致學(xué)生設(shè)計熱情銳減。例如學(xué)生對網(wǎng)絡(luò)原理理解不深,將影響數(shù)據(jù)傳輸協(xié)議的選用。
(3)從需求分析中抽象必要的設(shè)計詞匯,并將這些詞匯通過繪圖、編檔以展現(xiàn)業(yè)務(wù)邏輯,是一種必要的設(shè)計能力。然而,這種能力對于工科學(xué)生而言較為薄弱。部分學(xué)生詞匯貧乏,導(dǎo)致設(shè)計時的邏輯、時序關(guān)系不清晰,給接下來的設(shè)計帶來不便,從而失去設(shè)計的樂趣。如從需求中抽取動賓短語繪制業(yè)務(wù)流程圖,部分學(xué)生對詞性把握不當(dāng)或選詞不妥,使得詞匯在語義上有重疊,直接導(dǎo)致制圖過程不順暢,而這會為后續(xù)設(shè)計,如從動賓短語映射功能類型帶來麻煩。
(4)案例規(guī)模較小,學(xué)生在頭腦中簡要構(gòu)思即可編程實現(xiàn)。案例規(guī)模小,學(xué)生不能通過案例感受設(shè)計的重要性,往往是先編程后補文檔。這直接導(dǎo)致一個后果,一旦需求變動,整個程序和文檔幾乎要重做:這不是軟件工程的初衷。反之,一個規(guī)模較大、層次分明且兼具擴展性的設(shè)計對于開發(fā)軟件的成敗是決定性的,通過觀摩此類軟件設(shè)計,能使學(xué)生感受到設(shè)計給編程帶來的便利。
(5)缺乏使用開發(fā)工具的經(jīng)驗,不能很好地在設(shè)計概念和編程概念之間進行映射。比如選用在.Net框架下開發(fā)軟件,由于學(xué)生不具有一定的使用經(jīng)驗,想不出設(shè)計在轉(zhuǎn)為具體編碼時可能面臨的問題,甚至對于設(shè)計能否編程為可用的軟件都缺乏信心。盡管有觀點認為做設(shè)計時不要陷入技術(shù)細節(jié),筆者也同意這一說法,但對一個技術(shù)經(jīng)驗不足的學(xué)生片面強調(diào)設(shè)計只會使學(xué)生認為軟件工程課程虛飄,落不到實處。相反的,一旦學(xué)生有開發(fā)工具的使用經(jīng)驗,那么設(shè)計和編程會在學(xué)生頭腦里往復(fù)映射,使學(xué)生心理上有掌控感,因此即便設(shè)計上出現(xiàn)問題,學(xué)生也極有可能自行尋找辦法修正。
3 軟件工程教學(xué)策略探討(The discussion for software engineering teaching)
基于前一部分的討論,筆者認為軟件工程在教學(xué)策略上要強調(diào)三個方面:
(1)設(shè)計與代碼的轉(zhuǎn)換方式。即在為軟件建模時,挑選典型的圖例為學(xué)生展示相應(yīng)的代碼轉(zhuǎn)換,體現(xiàn)編程與設(shè)計是相輔相成的。
(2)選取規(guī)模適中的案例并結(jié)合軟件工程的設(shè)計元素,強調(diào)建模時準(zhǔn)確抽取詞匯的重要性。軟件工程涉及的編檔和制圖在本質(zhì)上都是詞匯,準(zhǔn)確的抽取詞匯能使得文檔和圖紙在整體上層次分明,歸屬明確,在各自的具體表達上也能邏輯合理,時序清晰。endprint
(3)使用工具為軟件模型映射實現(xiàn)框架。通過映射框架并作講解,能使學(xué)生掌握軟件的基本建制方法,還能刺激學(xué)生學(xué)習(xí)使用建?;蚓幊坦ぞ叩臒崆椋沟眠M一步編碼以完善軟件成為可能。
為了在講授軟件工程時強調(diào)這三方面,筆者在實際教學(xué)期間形成以下策略:
(1)結(jié)合真實企業(yè)案例,主體講解抽取詞匯,制圖和編檔。重點講解詞匯的層次性,以及詞匯與制圖、文檔的關(guān)聯(lián)。
(2)選取代表性制圖,實際演示如何轉(zhuǎn)化為必要的函數(shù)并進行初步的類型封裝。重點體現(xiàn)于函數(shù)名稱和類型名稱上,只要能體現(xiàn)制圖邏輯即可,不需給出函數(shù)或類型的具體實現(xiàn)。
(3)參照較為完整的軟件模型,演示如何配置主干對象以形成可運行框架。重點講解相關(guān)設(shè)計元素與可運行框架的對應(yīng)關(guān)系。
4 軟件工程教學(xué)策略的實踐效果(The practices of our software engineering teaching strategy)
為了實施前文提出的軟件工程教學(xué)策略,筆者所在單位深入企業(yè)調(diào)研,與企業(yè)合作,主要目的有三個:其一,獲取企業(yè)在用人方面的實際需求,如希望畢業(yè)生能重點學(xué)習(xí)哪些語言、平臺;其二,邀請企業(yè)提供建議,定制專業(yè)課程,如與Oracle合作共建專業(yè)體系;其三,由企業(yè)提供真實案例供教學(xué)使用。這些目標(biāo)都與2013年ICSE(International Conference for Software Engineering)大會中給出的調(diào)研結(jié)果不謀而合[3,4]:一定程度上說明,軟件工程的教學(xué)是離不開企業(yè)案例的。應(yīng)用本文教學(xué)策略的結(jié)果是令人鼓舞的,主要表現(xiàn)為:
(1)學(xué)生通過觀摩整個案例的設(shè)計文檔,并參照關(guān)于編檔和制圖的講解,能夠理解案例的設(shè)計邏輯,對于制圖時用到的標(biāo)準(zhǔn)圖形元素能夠自然的接受并記憶。再加上課堂上對個別典型制圖如活動圖、時序圖做編碼上的映射,學(xué)生能更好地體會圖紙與編碼之間的轉(zhuǎn)換方式,增強了學(xué)生編制軟件的信心。
(2)以練習(xí)題的形式要求學(xué)生重新手繪當(dāng)堂指定的圖紙,以加深記憶有關(guān)制圖。只是觀摩、參看,不足以掌握和消化必要的制圖方法,往往是“提筆忘字”,知識點認識模糊。只有要求學(xué)生再現(xiàn)圖紙,真正落實到紙面上,才能有助于細節(jié)的把握,也能促使學(xué)生重新審視整個圖紙的邏輯關(guān)系,以此鞏固加深記憶。實際教學(xué)效果良好,學(xué)生能自主地討論并基本再現(xiàn)指定制圖,同時,能夠認識到良好、標(biāo)準(zhǔn)的制圖對軟件建模的作用,不再認為軟件工程是空洞無物的理論。
(3)通過參考制圖及演示圖紙如何轉(zhuǎn)變?yōu)榭蛇\行框架,不僅提高了學(xué)習(xí)軟件工程的興趣,同時也帶動了學(xué)好工具軟件的積極性。在學(xué)生基本理解和記憶了必要制圖之后,我們實際演示并建立了軟件的可運行框架,如以.NET為平臺,使用Visual Studio工具建立配置文件并初始化必要的主干對象,使整個程序框架能夠運行[5]。通過這種方式,學(xué)生能夠感受到軟件的基本制作步驟,并對學(xué)習(xí)必要的工具和完善其余的軟件代碼產(chǎn)生了極大的興趣。
(4)學(xué)生自組討論軟件設(shè)計文檔并能提出編碼時可能碰到的問題。基于可運行框架的演示,學(xué)生能主動地參照設(shè)計文檔在頭腦中構(gòu)建軟件模塊,對于構(gòu)建時可能有問題的地方,能主動地先行自組討論,再與教師提問確認。有時盡管限于認識不足,教師的解答學(xué)生不能完全理解,但學(xué)生仍能清楚地知道問題出在哪里,以及需要補充哪些知識點。
5 結(jié)語(Conclusion)
本文對軟件工程教學(xué)當(dāng)中存在的問題以及成因進行了探討,繼而給出了一種軟件工程教學(xué)策略。該策略強調(diào)軟件工程的課程重點是理解和掌握有關(guān)的建模理論,而不是要求學(xué)生掌握建立軟件的所有方面。在軟件工程的課堂上重點仍應(yīng)是設(shè)計,而不是編程。筆者不否認編程經(jīng)驗對良好設(shè)計的支撐作用,但能理解標(biāo)準(zhǔn)的軟件工程理論并能掌握運行框架的建立方式,對于軟件工程的課程教學(xué)而言已足夠。至于具體的完善工程的實踐經(jīng)驗,則有待于在卓越工程師的職業(yè)生涯中繼續(xù)實踐、完善。
參考文獻(References)
[1] 蒲保興.軟件工程課程教學(xué)改革與實踐探索[J].軟件,2011(5):114-115.
[2] 荀啟峰.應(yīng)用型卓越軟件工程師培養(yǎng)模式探討[J].軟件工程師,2014(2):42-43.
[3] Chris J. Pilgrim.Industry Involvement in ICT Curriculum:A Comparative Survey[C].2013 ICSE,Advanced Software Engineering Education,1148-1153.
[4] Andrew Meneely.Samuel Lucidi: Vulnerability of the day:concrete demonstrations for software engineering undergraduates[C].2013 ICSE,Advanced Software Engineering Education,1154-1157.
[5] Donis Marshall.我們在微軟怎樣開發(fā)軟件(第1版)[M].北京:人民郵電出版社,2009.
作者簡介:
姚紅巖(1979-),男,博士,講師.研究領(lǐng)域:軟件工程.
馬云吉(1978-),男,博士,副教授.研究領(lǐng)域:軟件工程.endprint