俞昊然, 楊博洋
(北京矩道優達網絡科技有限公司 計算教育與技術研究院, 北京 100080)
近年來,中國高等教育階段的人才培養圍繞工程教育不斷發展,規模已高居世界首位[1]。隨著互聯網、大數據與人工智能等信息技術領域的快速發展,相關領域的人才培養質量亟待提升。信息技術領域的學生,在畢業后往往無法直接進入生產崗位為企業帶去價值;繼續深造的學生,表現也不盡如人意,學生的學術寫作能力弱、創新意識差,專業能力只局限在有限的專業技術領域[2]。
軟件工程作為軟件工程專業的基礎核心課程,對于提升學生的綜合能力起到了至關重要的作用[3]。在高校以往的軟件工程專業教學中,“理論多、實踐少”的問題一直存在。軟件工程專業中的理論都是軟件工程實踐中總結出的正確經驗,在面向無軟件工程實踐經驗的學生時,理論內容難以理解,使得學生在學習過程中喪失了學習軟件工程專業的積極性[4]。相比之下,在“校企合作、工學結合,產教融合、知行合一”模式指導下,把企業中軟件研發工程師和提出需求的實際客戶“請進來”,按照企業中的軟件工程方法與流程在高校軟件工程專業中展開實踐,更有助于培養高水平軟件工程人才。
Judith[5]在他的研究中討論了將企業引入軟件工程專業的課堂后,對于客戶管理、團隊管理、項目評估和課程開展過程的設計。Judith特別指出,明確地定義客戶有利于對項目進行評估。Bernd, Stephan, Lukas提出了一種提升學生技能的同時產出讓真實客戶滿意結果的課程設計。他們的教學效果展示出,針對真實的客戶需求進行教學設計不但有助于學生提升技術技能和非技術技能,同時還可以為學生今后進入企業工作打下堅實的基礎。
針對現有軟件工程專業教學的現狀,基于前人在軟件工程專業教學領域的研究,和清華大學軟件工程課程的教學實踐經驗,本文提出了一套完整的軟件工程實踐訓練教學方案,并在南開大學軟件學院進行了實踐。在本文介紹的軟件工程實踐訓練方案的實踐過程中,參與課程的學生均為南開大學軟件學院2015級本科生,已經學習過“高級語言程序設計”“數據結構”“數據庫系統”等軟件工程專業的基礎課程。學生在參與軟件工程實踐訓練課程之前沒有與企業中真實的客戶接觸過,不了解現代軟件行業的規范與流程。因此,在本文介紹的軟件工程實踐訓練方案中定下了5個主要目標:
(1) 訓練學生快速學習并使用新技術的能力。
(2) 讓學生體會需求獲取與過程管理,學習使用思維導圖、用戶故事工具。
(3)了解開源技術,體驗技術調研、技術選型過程。
(4) 深入參與軟件過程,學會使用版本管理工具、開發協作工具、文檔管理工具。
(5) 培養良好的軟件開發習慣,感受以團隊為單位進行開發的討論、協調、展示的過程。
在課程設計中,通過選用學生熟悉場景下的真實項目或與計算機領域教學有一定相關性的仿真項目,有助于避免學生難以理解課程設計中提出的需求[6-7]。由于互聯網場景對學生而言更為熟悉,在本文介紹的課程設計中,均選用了與網絡技術相關的項目,并引入了規范化的軟件開發過程管理。為了提升學生快速學習并使用新技術的能力,挖掘學生的潛力,在本文介紹的軟件工程實踐訓練方案中,采用了集中授課、敏捷迭代、高頻展示、持續修正、全過程監控的方式進行授課。
問卷調查結果表明,經過工程實踐訓練后,超過半數的學生在新技術學習、文檔閱讀、工程代碼調試等方面的能力獲得了顯著提升,并掌握了需求梳理工具的使用方法,了解了技術調研和選型方法,學會了簡單的架構設計,在項目迭代過程中熟悉了軟件過程。除此之外,大多數學生也在團隊協同、文檔撰寫、項目展示等方面得到能力提升。
由于學生在參與課程學習之前沒有接觸過Web開發,在軟件工程實踐訓練課程的第一周里,為學生設計了由企業工程師講授的每天4~5 h密集的Web開發技術課程。在每天的課后時間,學生還需要在17 h內完成1~2個與當天課程介紹的開發技術相關的單人實踐作業,見表1。
大強度的實踐訓練旨在訓練學生短時間內快速學習新知識、使用新技術的能力。在軟件工程實踐訓練過程中,為學生提供了課后至晚22 h的教師答疑,確保學生在解決問題時遇到困惑可以及時提出,將問題在有限的時間內解決。

表1 Web開發技術課程信息
遵照軟件工程實踐訓練的主要目標,在進行選題設計時充分考慮了項目真實性、需求對學生而言的理解難度、項目與專業課程的結合性這3方面因素。我國的多位學者在軟件工程專業課程項目選題時都提出,選題應來自于或接近于真實企業的真實項目[8]。Bernd、 Stephan、 Lukas在他們的研究中指出,學生更容易接受發生在他們熟悉場景的項目,或是有主動探索意愿的項目,如計算機游戲開發、編程工具等。Vincent曾發現,參與開發計算機科學教育相關項目,能對學生的軟件工程能力有顯著提升。
結合軟件工程實踐訓練的主要目標和前人的教學經驗,在軟件工程實踐訓練的項目設計中,引入了3個項目供學生選擇(見表2)。

表2 軟件工程實踐項目列表
這3個項目的類型各不相同,基本覆蓋了就業市場中的企業運營業務的主要類別——面向終端消費者、面向開發者、面向機構消費者。
“編程教育游戲項目”將學生熟悉的程序語言教學過程與學生感興趣的游戲開發相結合,涵蓋了“在線支付”“地圖編輯器”等面向終端消費者的項目所獨有的需求;“在線客服系統”在當下在線服務越來越發達的背景下,已成為學生熟悉的場景,在與這一項目客戶溝通的過程中,客戶提出了“多種接入方式”“API文檔”等面向開發者的項目所獨有的需求;“計算機專業課直播”項目將學生熟悉的計算機類專業課的課堂搬到了線上,除了視頻直播和在線聊天,還要求學生實現“互動白板”“PPT同步播放”“互動代碼編輯”等對計算機類專業課教學有直接幫助的需求,是面向機構消費者的項目所獨有的需求。
在“編程教育游戲”項目中,將客戶提出的“將用戶代碼執行并播放對應動畫”需求引入了編譯原理課程的知識點;在“在線客服系統”項目中,將客戶提出的“自動問答機器人”需求引入了自然語言處理和信息檢索的知識點;“計算機專業課直播”項目中,將客戶提出的“視頻與白板錄制”需求引入了多媒體編碼和流式傳輸的知識點。這些項目旨在讓學生在軟件工程實踐訓練過程中,對于今后要學習的專業課的存在意義建立一個基礎的認知,強化學習專業課的動機。
為了提高學生在完成實踐項目時的主觀意愿,在軟件工程實踐訓練過程中,遵循了自由組隊的基本原則。在此基礎上,結合Bernd、Stephan、Lukas提出的“性別平衡性、背景多樣性”設計,部分學生經過溝通進行了分組調整,確保了每小組均同時包含男性成員和女性成員、每小組均有在“先修內容實踐”階段前端作業完成度高的成員和后端作業完成度高的成員。
在完成實踐項目階段,每天分為2個時段。其中,白天10—19點為集中開發時間,學生會被集中在軟件工程實踐教室里進行軟件開發;其他時間段為非集中開發時間,學生可以自由選擇場地進行軟件開發。通過本設計給出的分組策略,可以在非集中開發時間促進學生提高遠程協作能力,增進了軟件工程實踐訓練與真實企業工作模式的相似性。
小組形成后,學生通過討論進行自由選題,選題的結果進一步驗證了Lukas的研究中的觀點。將發生在與自身熟悉場景的計算機專業課直播項目作為第一選擇的學生是最多的,而有一定趣味性且與專業有一定關聯性的編程教育游戲則是2/3學生的第二選擇,2/3的學生將在線客服系統作為了自己最不傾向的選擇(見圖1)。本著每個項目都有等量小組參與、盡可能滿足學生選擇的原則,確定了參與每個項目的3個小組。

圖1 小組項目選題意愿統計
為了讓學生體會需求獲取與管理過程,軟件工程實踐訓練第2周設計了為期半天的以“需求、思維導圖、用戶故事”為主題的講座,為學生介紹了需求獲取過程和思維導圖、用戶故事這2個工具[9-11]。講座幫助學生在完全沒有需求分析基礎的情況下理解需求,并引導學生借助工具完成簡單的需求分析。
在軟件工程實踐訓練的第2周,學生與模擬客戶進行了訪談。模擬客戶由有經驗的項目經理扮演。在開展軟件工程實踐訓練前,扮演客戶的項目經理已與類似項目的真實客戶進行了多次密集溝通,在獲取需求的同時對真實客戶的常見模糊表達、矛盾表達進行了記錄。在學生與模擬客戶進行訪談的過程中,模擬客戶會在確保需求被傳遞的過程中盡可能還原真實客戶的表達方式。
與此同時,現場另一位觀察員教師會及時引導學生發現模擬客戶的模糊表達、矛盾表達,并引導學生通過增加有針對性定量訪談問題的方式明確需求細節。
在學生小組完成客戶訪談后,會組織各個小組進行討論,將訪談獲得的信息轉變為一系列的用戶故事,并利用思維導圖工具對客戶的需求進行梳理,初步明確軟件設計的“應用—頁面—模塊—功能”層次。
為了幫助學生理解軟件行業工業化、規模化后的生產模式,軟件工程實踐訓練的設計中引入了以“調研和選型”為主題的講座,其中涵蓋以下內容:
(1) 工業生產中從作坊生產到制造業分工。
(2) 開源技術發展趨勢下,軟件行業的工業化情況和分工類別。
(3) 如何理解開源協議。
(4) 如何選用開源技術(方式包括直接引入、繼承上游并二次開發、拋棄上游并二次開發)。
在需求明確并完成梳理后,要求學生對項目相關技術進行調研,決定哪些功能通過自己開發的方式完成、哪些功能通過選用第三方開源技術的方式完成,并調研所需第三方開源技術的使用方法。在學生確定選型后,需要完成選型報告,并在完成技術選型的基礎上進行初步的架構設計。
圖2與表3展示了一個小組的架構設計和選型結果。

圖2 架構設計

選型用途開源協議Vue.jsweb前端核心MIT LicenseDjangoweb后端核心Django Software FoundationWebpack前端打包工具MIT LicenseGoogleBlockly用于模塊式程序設計部分Apache License v2.0CodeMirror用于代碼編輯器MIT LicenseTwilio +smtplib用于短信發送第三方服務
自軟件工程實踐訓練第3周起,學生需要使用Git進行軟件開發的版本控制和代碼管理,使用GitLab工具進行項目管理與協作,并在每周的周初進行一次開發例會。Git是一個分布式版本控制軟件,最初由Linus Torvalds創作,于2005年以GPL發布。Git的協作模式如圖3所示,每一個倉庫有一個主分支,學生也可以根據需要創建功能分支;主分支應該是受保護的,學生無法直接將代碼提交到主分支上,而只能將代碼提交到功能分支上;功能分支應該與工單一一對應,可以將代碼合并到主分支。GitLab 是基于Ruby on Rails的一個開源版本管理系統,基于 Git進行代碼管理,可以通過Web頁面訪問公開或私人項目。GitLab包含代碼倉庫管理、工單管理、分支合并評審[12]、用戶權限管理等功能[13]。
在第3周的開發例會上,學生被要求對第3周、第4周、第5周的開發過程進行規劃,根據產品需求明確第3周、第4周、第5周結束時應該達成的里程碑,確保在第5周結束時完成產品的實現。
自第3—5周的開發例會上,學生按照此前完成的用戶故事拆分待開發的功能點對當前這一周的里程碑進行進一步的細分,并將其定立為一系列處于看板上“積壓中”狀態的工單。每一個定立的工單中具體描述了需求背景、具體的實現方案以及是否與其他的工單存在依賴關系。工單建立后,各小組成員對工單進行認領,并明確截止日期和預估完成這個工單所需用時。
在每周的開發例會結束后,各組學生開始進行開發。開發開始后,學生被要求在完成每一個工單工作的過程中,先將工單移動到看板上的“開發中”狀態,使用一個Git功能分支,學生每完成這一工單描述的部分信息,就會提交修改并傳送修改至GitLab中的代碼倉庫,并將這次提交關聯到工單,并在工單中記錄完成這部分工作所花費的時間。學生完成一個工單的開發工作后,則被要求在GitLab上發起一次將功能分支合并到主分支的請求,并將工單移動到看板上的“待評審”狀態。圖3對這一協作流程進行了形象描述。

圖3 基于Git和GitLab的協作流程
在上述過程中,本次軟件工程實踐訓練提出了幾個關鍵的協作習慣考核點:
(1) 每一個分支是否只做了與工單相關的內容,不包含其他與工單無關的修改。
(2) 每一個提交的信息是否是清晰明確的完整句,而不是無意義的單詞或無法理解的表達。
(3) 每一個提交的信息是否通過類似“#100”的形式關聯到與提交相關的工單中。
(4) 每一次提交后是否及時在工單上通過類似“spend 10h”的命令記錄了與體積相關的時間開銷。
(5) 每一個合并請求的信息是否通過類似“closes #100”的形式說明了合并后應自動關閉的工單。
(6) 每一個合并請求是否指定的要參與評審的人員。
(7) 每一個工單是否在截止日期前被關閉。
(8) 每一個工單的狀態發生變化時,是否在看板上完成了對應的移動。
自第4周開始,實踐項目訓練增加了單元測試和代碼質量控制的要求。學生對開發完成的功能點添加了單元測試,對完成的代碼添加了代碼風格檢查。學生被要求使用 Git 的鉤子功能,在每一次代碼提交前執行代碼風格檢查,在每一次向 GitLab 傳送前執行單元測試;對于部分開發經驗豐富或學習能力強的小組,學生可以選擇使用“GitLab 流水線”的功能,搭建一個runner,在學生發起合并到主分支的請求后,在runner上執行該分支的代碼風格檢查、單元測試,并與主分支進行集成測試。在上述過程中,本次軟件工程實踐訓練提出了2個關鍵的協作習慣考核點:
(1) 代碼風格檢查是否完備,是否出現代碼風格問題。
(2) 單元測試意識是否形成,是否有合并進主分支的功能分支出現單元測試不完備的情況。
隨著項目迭代過程的推進,在第5周,實踐項目訓練增加了文檔和自動化(或半自動化)部署要求。學生被要求引入自動化文檔工具,并按照自動化文檔工具要求在各方法前添加注釋,用于生成技術文檔。學生被要求根據技術選型和架構完成部署腳本并根據需要撰寫部署文檔。
(1) 技術文檔是否覆蓋了公有方法。
(2) 依照部署文檔是否可以正常完成部署過程。
在實踐項目訓練的第6周,各小組項目已經基本處于交付狀態。在這一周中,每一個小組根據用戶故事撰寫了功能測試文檔,并將自己在GitLab上的代碼倉庫開放給另外2個項目需求一致的小組。各小組在這一周中被要求交叉進行功能測試:
(1) 按照其他小組的部署文檔在本地部署其他小組的項目。
(2) 參考其他小組的功能測試文檔,結合自身小組對于項目需求的理解,對其他小組的項目進行模擬驗收測試。
(3) 發現其他小組項目的功能缺陷時,向其他小組提出工單。
(4) 被其他小組提出工單時,需要及時解決與這一工單關聯的問題。
這一交叉功能測試的做法意在幫助學生感受項目在部署后接受反饋并進行進一步迭代、修正的過程。這一過程中引入了一些游戲化的設計,當學生為其他小組提出有效工單的情況下,會得到一定的加分,如果被提出工單的小組未能及時迭代、修正則會被扣除一定的分數。
在實踐項目訓練的第3—6周,每周會有一次項目展示,讓學生對自己過去一周的工作進行20 min的展示(見表4)。這一展示過程意在提高學生的展示、表達能力,同時加強對于項目的成就感和對于開發小組的歸屬感。每一周小組的展示成員均為不同的學生,且展示重點有所差異。

表4 每周項目展示重點
項目相同的小組會在同一時間段依次進行展示,一個小組在展示的過程中,其他同時間段的小組可以在展示過程中提出問題,促進小組間的思考和學習,也為學生營造一個可以感知到同伴競爭的氛圍。
這一部分對實踐項目訓練的效果進行了客觀及主觀數據的分析和展示。
經過4周的實踐項目訓練,多數小組按時完成工單的比例均有不同幅度的上升(見圖4)。

圖4 分組工單按時完成率
圖5展示了第3—6周工單被學生進行了時間預估的比例。讓學生養成進行工單完成時間預估的習慣是一個困難的過程,特別是在出現非計劃內的新增需求時,保持良好時間預估的習慣更為困難。

圖5 預估時間工單比例
而在預估了工單完成時間的情況下,隨著開發時間的增加,預估時間和實際發生時間的偏差有了明顯改進(見圖6)。可見,讓學生在實踐過程中進行時間預估是必要的,它可以有效地提高學生對自身能力的認知水平和對于工單規模評估的準確率。

圖6 工單預估與實際偏差
在使用Git工具進行版本管理和協作開發的環節上,隨著訓練周數的增加,問題出現的數量明顯減少。其中,分支使用的問題的集中爆發主要出現在第1周,第2周后明顯得到了改善。隨著訓練周數的增加,未正確將提交關聯到與提交相關的工單的問題的數量也明顯減少(見圖7)。可見,版本管理和協作開發的訓練是必要且有效的。

圖7 提交信息不符合要求比例
對于所有發起的合并請求,大部分組在時間訓練第1周內的代碼評審意識不足,項目普遍缺乏有效的評審過程。進入第2次開發迭代后,大部分組的評審過程有了明顯的改善。在隨后的幾周中,總體評審質量有所回落(見圖8)。這一現象的主要原因是部分小組在出現需求未按期完成的情況下降低了對于評審過程的重視程度。因此,在教學中強調代碼評審過程是有必要的,而且需要持續強化對代碼評審過程的要求。

圖8 經有效評審后再進行合并的比例
在實踐項目訓練結束后一周,參與軟件工程實踐訓練的全體43名學生填寫了調查問卷,其中38名學生在各個問題上均給出了正面反饋,認為軟件工程實踐訓練對提升學生軟件開發技能與過程管理上產生了明顯的幫助。如圖9所示,多數學生認為這次軟件工程實踐訓練對于他們在前后端開發技術和開發環境配置上的幫助明顯。由于學生在此前進行過與數據庫技術相關的專項訓練,又由于課程內沒有對服務器技術做詳細介紹,因此學生在這2項上的收獲相對較少。

圖9 經過實踐訓練,在開發技術方面的收獲
對于學生學習過程的感受,問卷收集到的反饋情況見表5。

表5 問卷題目及平均分數
在工程實踐訓練最后,邀請學生對工程實踐訓練過程進行了總結,并根據學生總結中的詞頻進行統計。從表6中可以看到,學生對于教師和自己的參與感受都很強烈。“收獲”“學到”“感謝”等詞的頻繁出現也表現出學生較為正面的情緒反饋,而“熬夜”“辛苦”“團隊”等詞的頻繁出現則反映出學生參與工程實踐訓練的積極性。

表6 工程實踐訓練總結高頻詞匯總
隨著軟件行業的飛速發展,軟件人才的培養質量亟待提升。本文設計了一套完整的軟件工程實踐訓練方案,并通過在南開大學軟件學院的實踐論證了方案的可行性和有效性,通過過程數據評估和學生反饋,說明本文提出的方案對提升學生軟件工程各方面能力均有顯著的效果,解決了以往軟件工程專業教學中“理論多、實踐少”的問題,有助于軟件工程相關專業培養高水平的軟件工程人才。
致謝:本文實踐項目訓練的設計部分參考了清華大學白曉穎老師、劉強老師、張力老師在“軟件工程”“Web前端技術實訓”“程序設計實踐”課程中的教學設計,感謝各位老師給予的支持與幫助。感謝南開大學軟件學院師生對于本項教學研究的大力支持。
[1] 朱泓,李志義,劉志軍.高等工程教育改革與卓越工程師培養的探索與實踐[J].高等工程教育研究,2013(6):68-71.
[2] 伍春香,劉斌,李小紅.基于能力培養的軟件工程教學實踐[J].計算機教育, 2017(8):38-42.
[3] 劉強,陳越,駱斌,等.“軟件工程”課程教學實施方案[J].中國大學教學, 2011(2):41-44.
[4] 胡勁松,張亮,黃海軍.項目驅動的啟發式教學在軟件工程課程中的應用[J].計算機工程與科學,2016,38(增刊1):228-231.
[5] Judith W C,Bair B,Lethbridge T C,et al.Client sponsored projects in software engineering courses[C]// Sigcse Technical Symposium on Computer Science Education. ACM, 2003:401-402.
[6] Bruegge B,Krusche S,Alperowitz L.Software Engineering Project Courses with Industrial Clients[J].Acm Transactions on Computing Education, 2015,15(4):1-31.
[7] Cicirello V A.Student developed computer science educational tools as software engineering course projects[J].Consortium for Computing Sciences in Colleges, 2017,32(3):55-61.
[8] 孫明,田蜜,康文杰.設計型項目驅動的軟件工程實踐教學改革[J].計算機教育, 2016(3):156-159.
[9] Matthies C,Kowark T,Uflacker M, et al.Agile metrics for a university software engineering course[C]// Frontiers in Education Conference. IEEE, 2016:1-5.
[10] 劉燕,劉慧琳.思維導圖在軟件需求描述中的應用[J].教育界,2010(22):114.
[11] Cohn M. User Stories Applied: For Agile Software Development[M]. Addison Wesley Longman Publishing Co Inc,2004.
[12] Sripada S,Reddy Y R,Sureka A.In Support of Peer Code Review and Inspection in an Undergraduate Software Engineering Course[C]// IEEE, Conference on Software Engineering Education and Training. IEEE Computer Society,2015:3-6.
[13] Haaranen L,Lehtinen T.Teaching Git on the Side: Version Control System as a Course Platform[C]// ACM Conference on Innovation and Technology in Computer Science Education. ACM,2015:87-92.