彭小娟
(廣州大學華軟軟件學院 廣東·廣州 510180)
CDIO工程教育模式是近年來由美國麻省理工大學、瑞典皇家工學院等4所世界知名大學經過長期的探索而研發的改革成果,主要包含“構思(Conceive)—設計(Design)—實施(Implement)—運行(Operate)”四個階段。其倡導的“做中學”和以“項目案例”組織教學活動的教學方法,讓學生通過主動的、實踐的、課程之間具有有機聯系的方式學習和提高工程能力,將理論與實踐相結合,為《軟件工程》的教學改革提供了一些有益的探索。
《軟件工程》是各大高校計算機軟件教學體系中的一門核心課程,主要講授軟件開發、維護與管理,在軟件工程學科人才培養體系中占有重要地位。軟件工程涉及的面比較廣,包括整個軟件開發的分析、設計、實現、測試、維護等過程。過程中涉及的方法、原理和技術比較廣泛而復雜,教師在授課過程中也感覺有困難,學生在學習過程中感覺內容比較偏理論化,理解上比較困難,易產生學不會、不想學的思想。通過多年從事《軟件工程》課程教學經驗的分析與總結,針對該課程存在的實際問題,我們需要從以下幾個方面進行教學改革。
軟件開發方法與技術更新迭代非常快,但是現有的教材內容大部分略顯陳舊,已不能適應社會需求。比如很多教材將大量篇幅用于講解結構化分析與設計方法,該方法是一種面向數據流的傳統軟件開發方法,它以數據流為中心構建軟件的分析模型和設計模型。主要適用于早期的信息系統的開發。現在大部分都是基于互聯網、大數據和人工智能的應用程序,教材內容也迫切需要與時俱進進行更新。
一般而言,軟件系統都是短期性的項目(短則幾周,長則數年),而項目會存在各種風險,所以軟件開發需要進行項目管理。在課程設計過程中通常會出現以下幾種情況:之前系統可以運行,現在系統運行不了了,但是之前的版本也找不到了。由于前期缺乏對技術風險的估算,后期才發現技術達不到,導致最終項目擱淺了。團隊在開發過程中沒有進行進度計劃和控制,最終項目不能如期交付。這些情況主要是由于學生項目管理意識薄弱造成的。
由于前期學生學習了一些技術課程,這些課程主要是檢驗學生掌握技術的熟練程度,所以一般是給定要求讓學生實現,所以學生形成了拿來就開始編碼的習慣。但是軟件開發的項目中,需要學生從需求開始進行分析,學會分析問題。另外,在進行課程學習的過程中,大部分學生很難有軟件工程實踐的機會,即便是有也可能是一些虛擬的實驗項目或者小型的軟件項目。這些項目存在缺乏需求背景、覆蓋的專業知識面小的局限性。因此學生在進行軟件項目實踐時,通常是在缺少前期軟件需求分析的基礎上直接編碼。通過這種模式培養的學生,缺乏實際動手能力,無法在實踐過程中體會到軟件工程的精髓,無法滿足企業的實際需求。
軟件開發技術更新迭代非常快,需要教師與時俱進地學習。很多任課教師由于長期在高校工作,缺乏對企業實際需求的了解,導致課堂教學內容因教學過程規范性的限制無法適應企業和技術的發展要求。
本課程總共68學時,理論課與實驗課各34學時,每周各2學時。提供5~10個項目供學生選擇;也可以自擬,但是需要獲得指導老師的同意。提倡自擬,因為自擬課題要從平時的學習生活中發現需求,這將調動學生的主動性和思辨性。項目要求難度適中,工作量能夠在課程中完成。學生可以自由選擇3~6人一組,每組共同完成一個項目。在課程設計的過程中,所有團隊要嚴格按照軟件工程的思想和過程進行管理,保證每個階段能夠達到CDIO相應的培養目標。指導老師可以采用諸如教師引導講解、小組討論、學生講解、生講師評等方式進行。
從軟件工程的角度出發,項目開始需要先初步收集開發需求,確定項目目標及范圍等要求,定義系統功能,計劃開發進度,從技術、經濟、法律等方面進行可行性論證。
構思階段首先是分組選題,確定各小組的項目經理及其他角色,明確角色職責。項目經理是團隊主要角色,一般由組織能力、溝通協調能力較強,技術能力不錯的同學擔當。團隊確定后集體討論進行選題。接著,由項目經理組織團隊成員確定團隊的slogan及團隊規章制度,培養大家的團隊意識;再進行團隊分析,明確團隊人員技術的優劣勢,盡量降低技術風險;還要對系統需求進行分析與討論,分析系統的用戶類型、特點及權限,劃分系統功能模塊,明確難重點,評估系統功能能否在規定的時間內完成。之后,項目經理還需要通過Project分解WBS結構,估算工期,分析任務間的依賴關系,制定項目進度計劃,明確里程碑,為團隊成員分配任務。需求分析可以采取調查問卷、訪談、實地工作、聯合小組、競品分析等形式開展,分析整理后的需求條目還要進行重要性和優先級排序,工作量估算等。之后可用案例分析與建模的方式表示,比較簡潔明了。每個階段都要形成相應的文檔并提交給指導老師,并由團隊與指導老師一起進行評審。
設計(Design)階段是根據構思階段定義的系統功能進行系統建模。設計內容一般包括以下幾方面:
(1)軟件架構設計。軟件架構指軟件系統的頂層結構。架構是經過系統性地思考,權衡利弊之后在現有資源約束下的最合理決策,最終明確的系統骨架:包括子系統、模塊、組件,以及他們之間協作關系,約束規范,指導原則,并由它來指導團隊中的每個人思想層面上的一致。架構可細分為業務架構、應用架構、技術架構,代碼架構及部署架構。業務架構是戰略,應用架構是戰術,技術架構是裝備。其中應用架構承上啟下,一方面承接業務架構的落地,另一方面影響技術選型。業務架構的設計原則以解決業務問題為最終目標。應用架構和業務架構是相輔相成的關系。應用作為獨立可部署的單元,為系統劃分了明確的邊界,深刻影響系統功能組織、代碼開發、部署和運維等各方面。學生可以以解決業務問題為最終目標,對系統業務進行拆分,對領域模型進行設計,劃分子系統或者模塊。
(2)界面設計。界面設計是指對軟件的人機交互、操作邏輯、界面美觀的整體設計。好的界面設計不僅要有個性,體現軟件的特點,還要讓軟件的操作變得舒適簡單。由于界面是面向最終用戶的,用戶對系統的認知主要源于界面,所以學生可以根據需求,采用Axure或其他工具進行原型設計,這樣可以以最小的時間和成本快速進行需求分析,避免在沒有明確需求的情況下匆忙開始編碼,導致后期返工的窘況。
(3)類和接口的設計。本課程主要采用面向對象的設計思想分析類和接口、設計類和接口、確定類的屬性和方法、職責之間的協作。另外,還需要根據面向對象設計原則去優化類圖模型,以便提高系統的可擴展性和可復用性。
(4)數據庫設計。大部分的選題都需要后臺數據庫的支持,所以需要進行數據庫設計。通過E-R圖進行數據庫建模,確定需要設計的表、表的字段、表與表的關系及其他約束等。
實現(Implement)階段是實現設計階段的模型。首先,團隊成員要統一使用統一的代碼規范和數據庫。這是軟件工程遵循CDIO理念的一個基礎,也更能體現工程性思維。阿里巴巴B2B事業群CTO李純說過:“好的軟件產品離不開工程師高質量的代碼及相互間順暢的溝通與合作。簡單,適用的代碼規約背后所傳遞的是技術上的追求卓越、協同合作的精神,是每個技術團隊不可缺失的重要利器。”第二,團隊可以按照模塊進行實現,比如選擇具體的編程語言和框架,編寫各個模塊對應的前后端頁面、業務邏輯和功能代碼等,選擇某個數據庫管理系統進行數據庫和表的實現。第三,要求各團隊要采用Git或其他版本控制軟件對源代碼進行版本管理,以免版本丟失的情況發生。Git作為一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理,方便團隊協作,并且會記錄實現過程中所有文件的增刪改等記錄,離線工作,速度快、靈活,任意兩個開發者之間可以很容易的解決沖突。版本控制系統也是業界常用的工具,學生在課程設計中了解使用,以后去企業就業就可以更快上手。
運行階段通常采用答辯的方式,每個團隊需演示系統,對項目進行構思、設計、實現、運行四個階段的工作匯報,接受教師和同學的提問,總結本次課程設計的收獲和經驗教訓。考核成績包括系統演示1/3,講解匯報與回答問題1/3,文檔1/3。最終團隊需要提交一份課程設計的完整文檔(包括各階段),系統實現的源碼和配置文件、數據文件等。
課程教學改革后,主要有3個方面的變化:增強了學生對于項目管理和工程思想的意識。團隊協作的方式,既讓學校保持了良好的實踐作風,又增強了學生的團隊協作意識和精神。通過項目驅動和工程的貫穿,將課程知識點形成有機整體。
總之,CDIO工程教育符合我國教育行業信息化發展的大趨勢,為教育行業信息化革新注入了新活力。為了培養適應軟件產業發展的人才,我們要不斷的踐行以CDIO理念為核心的教育教學改革。