吳際 孫青
摘 要:復雜軟件能力培養是計算機科學與技術專業和軟件工程專業的一項核心任務,特別是在工程教育認證背景下,更加凸顯了其重要性。軟件能力內涵豐富,涉及需求、設計、實現、測試和維護等多維度能力。依托作者團隊所負責的本科生“面向對象設計與構造”課程,對復雜軟件能力的內涵進行了梳理,并提出了一種大小周期相結合的實踐教學方法,其中大周期強調實踐作業間的迭代,小周期強調一次作業中的過程控制。最后,通過實際教學所收集的數據,對該教學方法的應用效果進行了初步分析。本文所研究的方法適用于軟件開發類課程,同樣也對工程實踐類課程具有參考價值。
關鍵詞:軟件能力;能力培養;實踐教學方法;能力度量;軟件開發
一、復雜軟件能力內涵
隨著計算技術在人類社會中應用深度和廣度的持續擴大,軟件的重要性日益凸顯,圍繞軟件開發方法與技術的教育也逐漸成為大學計算機相關院系的重點關注內容。軟件開發類課程是計算機科學與技術專業以及軟件工程等相關專業本科生教學體系中的重要組成部分。計算機相關學科本質上具有很強的工程性要求,以解決實際工程中的問題作為重要目標[1]。近年來,隨著工程教育及其認證的推廣[2],傳統面向知識點的軟件開發類課程教學設計已經不能滿足要求,必須面向能力培養目標開展實踐式教學,從而適應軟件產業快速發展對新人才的需求。
軟件能力是關于如何在規定時間內、按照一定的規范開發出滿足相關要求的軟件的能力。相關要求主要包括軟件需求、設計與實現的要求、運行平臺要求、開發語言和質量要求等。本文所討論的則是一種更高形態的軟件能力,稱之為復雜軟件能力,即使用工程化方法,開發具有一定復雜度的高質量軟件系統的能力。為什么要強調工程化方法、復雜度和高質量?其主要原因來自于軟件已經越來越多地應用于國計民生關鍵領域,一旦出現質量問題,將引起嚴重甚至災難性后果。工程化方法強調培養學生綜合分析軟件功能和性能相關約束的能力,從而能夠綜合考慮相應約束給出設計方案和實現代碼,并能使用測試和推理分析等手段進行綜合驗證和優化。工程問題的復雜度在一定程度上決定了工程化方法實施的難度和必要性。越是復雜的工程問題,就越需要使用規范的工程化方法。從教學角度來看,工程問題復雜度強調軟件開發的要求來自于有一定規模的真實系統背景,而且有明確的質量和進度要求。質量決定了一個軟件的生命力和價值。如果一個軟件的質量不能滿足,輕則導致無法滿足用戶的要求,重則導致計算機系統甚至更大范圍的系統運行失效,進而可能導致安全問題。因此,如何在開發過程中通過技術手段來表明或論證所開發軟件滿足相應的質量要求也是一種重要的能力,對于培養學生的質量意識和質量控制能力具有重要意義。
本文以復雜軟件能力培養為目標,基于其內涵分析,提出通過大小周期的實踐來實現復雜軟件能力的培養,并通過實踐教學過程中的數據收集和跟蹤分析,來度量學生的能力形成狀況。
二、問題定義
復雜軟件能力的核心是應用工程化方法來解決帶有實際工程背景的問題。軟件開發類課程的核心目標是培養針對給定要求開發相應軟件的能力,其主要手段是通過具有一定工程背景的實踐訓練。開發要求一般包括軟件需求、設計要求、質量要求、時間要求等,而開發涉及開發模式的選擇、開發過程的控制等。本文所關注的軟件開發類課程的課程實踐與目標能力之間的關系如圖1所示。
課程須達成的目標能力可由目標能力的達成度進行度量,以課程知識點與課程實踐訓練為實現途徑。由于學生不可避免地存在個體差異,在課程實踐訓練的設計中還需要考慮學生基礎能力掌握情況以及課程所在學期的相關課程設置情況。
我們強調如何面向復雜軟件能力這個目標來設計實踐教學方法,包括實踐訓練內容及實踐過程控制。實踐訓練內容通過覆蓋課程知識點來達成訓練目標,實踐過程是完成實踐訓練內容的具體活動流程。將軟件開發類課程實踐過程f定義如下。
輸入:Input={能力目標、課程大綱};
輸出:Output={與課程大綱同步的作業訓練設計、作業控制活動流程};
約束條件:Constraints={滿足課程大綱與能力目標的支撐關系}。
工程教育專業認證強調能力的形成性培
養[3],即要求通過過程(即系列化的任務訓練)來逐步讓學生掌握所教授的方法和技術,從而形成相應的能力。從課程大綱以及課程大綱中總結提煉課程知識點,形成知識點集合K={k1,…,ki,…,kn}(1≤i≤n)。對于每個知識點,可由過程定義得到相應的課程實踐活動序列f={f1,…,fi,…,fn}(1≤i≤n)。依據前文中對于軟件能力的內涵分析,課程實踐活動fi中設定的任務必須滿足工程教育對于能力培養的要求[4]。首先,實踐訓練需要有明確的功能要求。其次,從能力培養角度看,要給學生樹立工程質量觀,不滿足質量要求的軟件不能作為交付物移交給工程客戶[5]。因而在課程實踐中要求提交的代碼滿足軟件的質量特性,如響應時間、魯棒性等,并且在實踐完成過程中強調設計原則、設計方法應用。另外,規定時限是所有工程項目的基本要求,即必須在規定時間內完成工程項目。培養學生在規定時間內的工程設計與實施能力是工程類專業的一個核心目標。因而在課程實踐過程中需要提出時限性要求。
本文研究依托的“面向對象設計與構造”課程是北京航空航天大學計算機學院的本科生學位核心課程,包括32理論學時和16實驗學時,每年上課學生人數不少于250人,安排在二年級春季學期,課程在北京航空航天大學計算機學院面向復雜軟件能力的體系化課程中扮演著承上啟下的作用(如圖2所示)。
根據課程的特點,從2014年課程開始在實踐環節引入作業的大小周期二維設計,對課程整個實踐訓練過程進行控制。心理學的研究結果表明,由于知識具有結構性特點,人的學習活動一般以知識點為單位來組織[6]。課程作業的大周期設計按照課程知識點模塊來實施,以周為單位布置作業任務。圍繞每周課程講授的知識點和之前學習的知識點,進行增量迭代式訓練。這種大周期的設計方式符合人的認知和學習規律。針對每一次作業任務則實施小周期微觀控制,以細粒度的作業活動為單位進行過程控制,使得作業訓練以受控方式來獲得預期的能力達成度。
三、作業大周期設計與控制
課程實踐的作業大周期設計與控制強調通過增量迭代來強化學生的能力形成效果。基本方法是將課程實踐分為4個周期(如圖3所示),包括進階周期、深化周期、精煉周期和貫徹周期。每個周期包括4個教學周,其中前三周為理論課加相應的3次開發測試類訓練,最后一周為階段總結課和相應的總結分析作業。
進階周期的作業設計目標是針對面向對象核心概念和基本設計要求開展訓練,在案例設計上突出對象與類特征,并進一步突出類的職責分配與協同,引入層次化抽象,使用繼承或接口來優化設計。
在深化周期作業設計中,目標是圍繞對象運行機制、線程對象交互機制、線程安全等知識點,通過運動量均衡的多電梯調度案例的多次迭代,訓練學生的設計思維從單線程程序向多線程程序轉變,從而掌握線程安全的設計方法。
在精煉周期作業設計中,目標是圍繞規格化設計方法,從方法規格設計、類規格設計以及設計原則及檢查方面進行訓練。本周期的訓練以模擬出租車叫車系統為案例進行迭代開發,培養大規模并發多線程的設計方法和測試方法。
貫徹周期作業設計的目標是面向高質量要求的綜合驗證方法及技術訓練,要求學生針對前期開發的程序基礎上使用Junit框架開展基于規格的自動化測試,并能夠基于類和方法來邏輯推理程序的正確性,并使用UML表示設計并分析驗證。
每個周期的最后一次作業都要求學生撰寫總結分析博客,梳理自己在該周期的作業訓練中的完成情況和心得體會。大周期的作業設計采用體育比賽中的賽季積分制來考核學生實踐訓練成績,針對在作業大周期中的得分(包括加分和扣分)累加結果進行排序,最終按照排序相對位置來確定最終的課程成績。
此外,在每個大周期內,課程設計了與開發測試作業同步的實驗訓練(4學時/周期)。作業任務強調針對給定需求的設計、實現和測試,實驗則針對開發測試中所需的關鍵技術能力進行訓練,分別設計了面向對象程序的調試實驗(4學時)、針對多線程的觀察與調試(4學時)、規格設計和代碼實現的交叉補全(4學時)、自動化測試與模型化設計(4學時)。
四、作業小周期設計與控制
軟件能力強調學生能夠使用技術性手段來說明所開發的軟件滿足質量要求,包括軟件測試、評審、模型檢查和形式化驗證等。按照本文的軟件能力定義,學生不僅需要在規定時間內提交實現了相應要求的軟件代碼,還要能夠主動通過軟件測試等手段來分析說明其所提交的軟件代碼滿足質量要求。本文所介紹的面向對象課程采用競爭性學習方法[7-10],圍繞軟件能力來設計和配置競爭性任務,針對每一次競爭性任務實施小周期控制。作業小周期設計的理念是對作業過程進行微觀控制,包括deadline控制、抄襲控制、有效性控制、測試控制等,從而在細節層次上訓練學生的軟件能力。從課程運行的實際效果來看,緊張有序的小周期控制是確保能力形成效果的有效保障。
如圖4所示,每一個教學周理論課授課完畢后,教師發布作業,并根據任務的難度和工作量設定作業完成時限要求。學生在規定時間內提交作業,過期將不能再提交。在作業提交之后,課程作業平臺系統自動代碼進行相似度檢測,根據輸入的抄襲控制參數(即能夠容忍的相似度最大參數)來發現作業抄襲。針對軟件能力中的開發能力和測試能力要求,在小周期設計中特別注重訓練測試能力,要求每個同學都參與測試中,為此會給每個提交了有效作業的同學分配測試任務。測試任務智能分配的重點是平衡性控制,即確保測試雙方同學具有相近的能力。軟件開發類課程可以采用兩種類型的測試——雙盲互測和透明公測,前者采用競爭性方法,讓同學們在所分配的代碼中去發現盡可能多的缺陷;后者則使用事先設計好的公共測試用例集來檢查作業代碼對要求的整體滿足情況。所謂雙盲,即任何一個同學都不知道自己測試的是哪位同學提交的程序,同樣也不知道自己的程序在被誰測試。每個同學都要在規定時間內完成測試并提交測試所發現的缺陷,這樣每個同學會收到兩個記錄,自己程序被發現的bug(扣分依據)和自己發現了別人程序的bug(加分依據)。誤報bug是軟件開發與測試中的正?,F象,需要開發者與測試者進行溝通協調。每個同學收到被發現的bug記錄后,需檢查確認bug報告的有效性,如果有誤則可以發起申訴。要求測試者和開發者在系統中圍繞bug報告的有效性進行交互協商,并根據協商結果來調整測試的計分。
在測試任務智能分配環節,強調測試者和開發者具有相近的軟件能力。為了達到這種平衡性控制效果,需要收集一個學生的學習行為數據,并度量學生的開發能力和測試能力。主要依據包括通過的公共測試用例情況、互測中被報告的bug情況、互測中發現別人程序bug的情況、所提交程序的設計質量等。在此基礎上,可以使用諸如K-means等聚類算法對開發能力及測試能力進行聚類分析[11-12],從而獲得較為科學的分組。
五、教學實踐效果分析
面向對象設計與構造課程作為典型的軟件開發類課程,運行4年來取得了良好的教學效果。學生們在課程開始之前大部分對面向對象概念和方法都不太了解,通過一個學期的訓練,超過85%的同學能夠在一周內完成規模在2 000行以內的高質量程序設計實現,且能夠基于規格來論證程序實現滿足相應的規格設計。
以2017學年度為例,圖5給出的是作業完成效果的整體情況。圖5(a)顯示,整體的提交和有效情況都維持在較高的水平,第5次作業(即深化周期的第一次作業,開始引入多線程)的難度有較大的提高,導致有不少同學未能完成,但之后逐漸得到改善。經過了嚴格的相似性檢查,抄襲人數得到了有效控制。圖5(b)顯示,隨著作業難度增加和功能增多,完成作業的程序規模持續增大,到第11次作業接近3 000行,但是公共測試通過率一直保持在比較穩定的水準?;y一直在高強度水準下推進,這對于確保代碼的質量發揮著不可替代的作用。
圖6給出的是學生在公共測試階段的整體用例通過情況。圖6(a)顯示,整體的公共測試通過率在前四次呈現下降趨勢,從第六次作業開始隨著作業訓練次數的增加,逐漸增加。其主要原因是前幾次難度逐步提升,但是相當一部分同學在編程語言、開發測試以及對課程規則都尚在學習和熟悉過程中。經過一個多月的訓練,能力得到了穩定提升,公共測試的通過率也穩定提升。由圖6(b)可知,公共測試用例通過率超過95%的人數占該次作業有效提交總人數的比重,最高是64.7%,最低是28.7%,平均達到49.8%,這表明一般同學都取得了非常優秀的作業完成效果。不過同時也要看到,每次作業都有一部分完成效果很不好(0—50%)的同學,雖然人數很少。從第五次作業開始,通過率超過95%的人數占比逐步提升,說明訓練設計達到了預期的目標。
為了更好地刻畫學生能力的變化,分析作業的大小周期設計以及以面向能力的訓練方法帶來的實際效果,本文在實際收集的學習行為數據基礎上對開發能力做了統計分析。根據每次作業的成績對學生進行分檔,規則見下表。
由互評階段扣分情況分布圖(圖7)可以看出,隨著作業推進,低分段學生(第三檔和第四檔)的數量呈下降趨勢,而高分段的同學在進行第二個作業大周期之后,即第一次多線程作業后,數量也逐漸升高。由此看來,經過第一個作業大周期的作業訓練,學生們的開發能力不斷提升和進步。基于雙盲互測數據和公共測試數據得到了一致的結論。
六、總結與展望
實踐訓練是軟件開發類課程中的核心教學環節,如何有效圍繞能力培養目標設計其實踐教學一直是一個關鍵問題和難題。在設計實踐內容和控制措施時,必須要考慮多種因素,如能力內涵,能力與授課知識點的關聯,訓練過程的微觀控制等。本文提出了一種圍繞能力培養目標的實踐設計方法,其核心是大小周期相結合的實踐設計和實踐過程控制。本文結合作者所承擔的面向對象設計與構造課程介紹了方法實踐和效果分析,系統性地梳理和介紹了復雜軟件能力的內涵和支撐的課程群,進一步介紹如何從實踐內容、實踐控制和評價等多個維度來開展課程設計,以及應用大小周期相結合的實踐教學方法所獲得的訓練體系。通過實際教學所收集的數據,對該教學方法的應用效果進行了初步分析。結果表明作者所提出的大小周期相結合的實踐教學方法取得了顯著的教學效果,而且能夠在能力培養目標上開展細粒度分析。這些分析研究對于其他學校的軟件開發類課程的設計和優化具有參考價值。
未來,我們擬在其他相關課程中實踐和應用大小周期相結合的實踐訓練方法,同時正在細粒度的學習效果分析,特別是能力形成效果分析方面開展進一步研究。
參考文獻:
[1] 蔣宗禮. 工程專業認證引導高校工程教育改革之路[J]. 工業和信息化教育,2014(1): 1-5.
[2] 工程教育專業認證標準(試行)[Z]. 2011.
[3] 王昕紅. 美國工程教育專業認證研究[M]. 西安:西安交通大學出版社,2011.
[4] 袁慧,于兆勤,秦哲. 新形勢下培養提高工科學生工程實踐能力的認識與實踐[J]. 高教探索,2007(2): 61-63.
[5] 許學磊. 軟件工程管理的現狀和創新策略[J]. 微計算機信息,2012(5): 50.
[6] 隋光遠. 知識點認知規律的實驗研究[J]. 心理科學,2003,26(2): 308-311.
[7] Mendiburo M, Williams L, Segedy J, et al. An Investigation of the Effect of Competition on the Way Students Engage in Game-Based Deliberate Practice[C]. 2013.
[8] Hwang G J, Chang S C. Effects of a peer competition‐based mobile learning approach on students' affective domain exhibition in social studies courses[J]. British Journal of Educational Technology. 2016, 47(6): 1217-1231.
[9] Cantador I, Conde J M. EFFECTS OF COMPETITION IN EDUCATION: A CASE STUDY IN AN E-LEARNING ENVIRONMENT[J]. 2010.
[10] Dimenichi B C, Tricomi E. The power of competition: Effects of social motivation on attention, sustained physical effort, and learning[J]. Frontiers in Psychology, 2015, 6: 1282.
[11] Ratnapala I P, Ragel R G, Deegalla S. Students behavioural analysis in an online learning environment using data mining[J]. 2014.
[12] Patel K M A, Thakral P. The best clustering algorithms in data mining[C]. 2016.
[責任編輯:余大品]