姜磊,文一憑
(湖南科技大學 計算機科學與工程學院,湖南 湘潭 411201)
為了應對新經濟快速發展、新興產業蓬勃興起的迫切需要,教育部提出了培養新型工科人才的新工科戰略[1]。新工科教育強調學生應該具備團隊協作與溝通能力,同時特別注重培養學生解決復雜工程問題的能力。軟件工程是一門講述如何構建高質量計算機軟件的一系列方法與過程的課程。它是計算機學科實現新工科教育任務的重要切入點。經過本課程的學習,學生能夠掌握軟件工程的基礎知識,具備應用自然科學理論、計算機理論對工程項目進行軟件設計與開發的專業能力。在課堂教學中,以項目驅動的形式對學生進行上述能力的培養是一個行之有效的方法[2-3]。當前以項目驅動方式進行軟件工程教學實踐的研究文獻主要探討了項目如何選題、組織以及過程管理[4-5],很少涉及項目構建具體方式與方法的討論。這些文獻基本沒有闡述如何培養學生解決復雜任務、復雜工程問題,對于怎樣在軟件工程教學中培養符合新工科所要求的學生能力缺乏系統思考。此外,相當部分軟件工程課程教師由于沒有企業經歷而缺乏工程經驗,難以對學生進行規范、有效的實踐能力指導。因此,本文試圖以工程項目為抓手,為該課程的教師提供一套切實可行、規范的軟件構建方法,并在此基礎上提出新工科人才培養標準,培養學生能夠解決復雜工程問題,提高溝通與管理能力[6],從而進一步推進計算機學科的新工科教學改革研究。
通過對湖南科技大學計算機科學與工程學院2017級計算機科學與技術、網絡工程兩個專業302名學生的問卷調查分析以及多年的教學實踐,筆者認為當前計算機類本科生在軟件工程方面存在以下問題。
74.8%的學生認為軟件工程課程內容過于抽象與理論化,難以應用到實際的工程項目設計與開發中。大部分學生在學習軟件工程前都會有一些軟件開發經驗,但他們一般都沒有按照軟件工程規范進行開發,學生很難將課程內容與開發實踐有效聯系起來,于是常常會懷疑課程的實用性——認為自己不學習軟件工程知識照樣可以進行項目開發,從而產生一定抵觸心理。如果教師在教學過程中不將軟件工程設計實踐與課程內容形象地聯系起來,學生就會覺得抽象與枯燥。
課程結束后,學生覺得分析問題的能力進步小,基本上不能進行復雜工程問題的設計與開發。對于一個新的工程問題,73.2%的學生覺得無從下手,不知如何將需求分析與軟件架構中的建模、體系結構設計和原型設計結合起來。對于將工程項目中的具體業務按照軟件工程中設計的步驟進行分解,大部分學生沒有思路,只有少部分學生具備將具體的業務流程轉化成相應的界面邏輯和相應數據結構的能力。學生缺乏溝通技巧與實踐,在項目實踐中,由于溝通太麻煩,往往由一個或兩個高水平的學生完成,其他學生參與度很低。
在掌握軟件工程設計工具方面,85.8%的學生了解UML,而掌握UML并能繪制正確圖件的僅31.7%;數據建模工具PowerDesigner僅有35.1%的學生知道,利用其進行過數據建模和繪制數據流圖的則不到8.3%;原型設計工具Axure的掌握率為72.2%;Apifox或Postman等接口設計工具僅10.9%的學生掌握;Git協同開發工具則有51.7%的學生使用過。
在以前的教學過程中,我們雖然主要以案例與項目兩種方式組織教學,但存在如下問題:對于案例的方式,學生只知道大概流程沒有親自動手,在真正實施時感覺難以下手;對于項目的方式,學生主要追求的是前后端拉通、項目能夠運行,這樣實現的軟件功能簡單,最終產出的是一個demo版本,離上線運行的要求很遠。這兩種方式難以實現新工科要求的培養學生求解復雜工程問題以及團隊協作與溝通能力的目標。
為了幫助學生掌握解決復雜工程問題的軟件設計與開發能力,根據新工科人才培養的要求,結合學生的現狀以及原有項目驅動方式教學的不足,筆者為復雜工程項目的設計與開發制定了詳細且行之有效的規范化流程。
分析上述調查后,筆者在2018級采用了新的工程項目驅動方式引導學生進行軟件工程課程學習。首先將學生分組,每組3~10人。然后要求他們在碼云中創建項目小組,按規范化的流程進行軟件項目的設計與開發。項目的來源分三種:一是學生根據日常遇到的問題進行設計與開發,二是學校各部門根據自身的業務提出需求,三是教師根據自己的項目或朋友的一些需求進行項目題目設計。每一階段的工作由學生制作PPT在課堂上進行匯報與講解。
2.2.1 需求分析與建模
需求分析與建模主要是從項目業主方的角度進行構建,用于幫助業主從軟件開發的角度厘清思路,整理出所要開發項目的功能與業務全貌。
(1)需求采集。一般而言,由業務部門或教師提出的題目都具有一定復雜工程項目的特征,需要對業務部門進行需求采集。采集目標主要是:①搜集項目具體有哪些角色;②每一個角色有哪些業務及其業務流程;③相關的數據。然后根據目標,要求學生制定需求采集計劃。一般來說,業務人員在訪談時通常會講述其工作的重要性與意義,對于具體的流程則描述得非常簡略。因此,需要訓練學生在與相關人員進行訪談時要注意將話題圍繞需求采集的目標展開。
(2)用例設計。在需求采集后,就可以進行用例設計。首先,從需求中知悉該項目使用者的種類,然后將這些使用者設計為若干種角色。其次,根據每個角色期望項目為之完成的任務設計用例。這些工作任務還可以細分為子用例。用例圖繪制完成后就得到了各角色對項目的期望與需要項目完成工作的全貌。最后,每一個用例需要用文字進行詳細說明。
(3)行為設計。大部分的項目都有自己的行業領域,軟件設計與開發人員不一定對其熟悉,因此需要對其業務邏輯進行梳理。同時,一些業務邏輯存在多個運行線路,也需要對其進行描述,以便于后續各工作模塊的銜接與異常的處理。這些業務邏輯需要通過繪制順序圖、泳道圖、協作圖的方式與業務方進行確認,務必將各個業務處理分支描述完整清晰,方便軟件開發人員理解。
2.2.2 構建設計模型
構建設計模型的任務就是將需求建模的輸出轉換成軟件開發人員對項目的認識以及相應的數據模型、原型設計、體系結構與類圖等。
(1)數據建模。首先根據需求采集與建模中的輸出,使用PowerDesigner繪制數據流圖,得到整個系統中需要存儲與轉化的數據表,然后以此為基礎在PowerDesigner中進行項目的數據庫設計。這里需要注意的是,數據流圖中的數據表需要進行拆分,拆分的原則是:動靜分離、存儲空間大的數據需要與空間小的數據分離;部分經常使用但散布在各個數據表中的數據可以設計成視圖;最后,再進行范式分析進一步分解,使每個表滿足3NF或BCNF。
(2)體系結構設計。①部署結構設計:當前的項目一般采用B/S結構。如果訪問量大就要采用高并發設計,此時設計者需要估算應用服務器的個數、數據服務器的個數以及考慮是否需要部署Redis數據庫用來放置高頻訪問數據等。②開發結構設計:一般采用前后端完全分離的形式。前端需要考慮UI框架的選擇,后端則可以從SSH、SSM或微服務等框架選取一種做進一步設計。③系統的功能模塊結構:首先針對需求建模中的用例設計對各角色的用例與子用例進行分析與合并,得到初步的層次結構,然后根據系統是否完整再進行適當補充。對于不好劃分的模塊,則可以在數據流圖中相應區域,根據事物流與變換流的方式進行模塊結構的映射,最終得到完整的系統模塊結構。
(3)原型設計與接口設計。原型設計一般采用Axure工具根據需求建模中的用例設計與行為設計進行前端頁面的UI設計。UI界面主要由數據輸入、表格與圖形組成。但是很多學生由于缺乏經驗,難以將業務邏輯中的行為轉換成相應的頁面元素。每個學校都有教務系統和一些面向學生的財務、圖書管理、學生管理等系統。因此,我們建議學生根據自身使用經驗去體會業務邏輯是怎樣向具體頁面轉換的,然后再進行模仿。接口設計則主要根據原型設計的頁面進行,即把頁面要錄入的數據作為接口函數的輸入,頁面上要顯示的數據作為接口函數的輸出。這樣,設計者就可以在每個頁面上得到一個粗糙的接口函數。所有頁面上的接口函數經過消岐、組合、分解后,前端所需要的接口設計部分就完成了。設計者再根據后端數據處理情況做進一步優化就能得到整個系統的接口設計。
(4)類與工作包設計。首先,設計者根據需求建模文檔得到部分類,然后再從接口設計文檔確定接口類,最后從配合上述類工作以及后端必須要進行的數據處理與轉換等方面做進一步設計得到初步的完整類圖。隨后,設計者根據設計模式對類圖進行調整與優化,使之更加合理。工作包的設計是將類按功能模塊、公用工具、前端接口、數據庫交互、登錄鑒權等方式對類進行組合放入工作包得到包圖。
通過工程項目驅動的方式,軟件工程課程可以進行計算思維能力和新工科軟件人才能力的培養。這兩種能力的培養著眼于學生畢業后的發展,與新工科教育考查學生畢業后五年的發展狀況的理念非常契合。
計算思維以設計和構造為基本特征,它是計算機學科學生在哲學層面必須要培養和具備的素質。但是學生通過長期的數學教育,主要得到的是理論思維培養。他們在面對問題時首先習慣考慮怎樣通過直接運算與推理得到精確的答案。在這種慣性思維下進行項目設計與開發時,學生常常會從問題涉及的直接原理出發進行求解,并因此陷入相關理論的深入思考中,而忽略了要解決的工程問題本身。特別是對于那些直接設計、開發難度大的問題,他們常常陷入相關理論與技術的學習中,而忘記了采用近似的方法將會大大降低求解難度。其次,學生一味采用高精尖的技術而忽略時間與成本的約束。再次,他們還經常忽略項目本身的特點而采用不合理的復雜方案,從而帶來了不必要的難度與時間消耗。例如,在一個派工管理項目中,各任務承擔單位需經甲方認證資質后才能獲準進入,費用結算另有系統。學生開始設計時采用了非常復雜的登錄鑒權方案。但該系統實際是封閉運行,工作任務不涉密,系統攻破后黑客也不能獲利。黑客即使更改任務分派,在實際工作運行時也能及時糾正。因此,教師發現后就更改為普通方案。最后,學生非常容易扎入細節中去,缺乏整體視角。
基于以上問題,我們通過以下方式進行處理,收到了較好的效果。(1)列出當前項目任務,并劃分出優先級,要求學生按優先級進行解決,避免進入細節。(2)列舉出當前項目的約束與允許范圍,培養學生按照約束條件與誤差范圍尋找適當的解決方案的習慣。(3)碰到難題時,要求學生首先考慮簡便的替代方案。
3.2.1 培養學生對項目全過程的整體觀與發掘技術深度的能力
本科生畢業時入職的工作會偏重于一個方面,比如前端、后端、測試或小程序等。但對項目全過程的掌握與理解非常重要,這是決定他們發展高度的一個重要因素,同時也是跟新工科配套的工程認證的一個重要視角——學生畢業五年內的發展情況息息相關。因此,在我們的項目中每一個過程都盡量讓不同的學生負責,讓更多的學生能夠得到鍛煉。同時,教師需要提醒學生注意兩件事情:一是完成本過程的工作并充分認識本部分工作承前啟后的作用或意義;二是每位學生需要注意觀察負責的同學是如何進行工作組織與前后過程銜接的,并對過程中出現的問題進行反思及如何改進。在整個項目完成后,每一位學生都要進行一次項目全過程的復盤思考與心得體會的描述。每一個項目的選擇及其技術選型都是根據當前的技術主流而定,但大部分學生在表述時往往只是基本工作的描述,看不出技術亮點與深度。例如,他們會對一個采用了目前主流技術的項目描述如下:本項目前端完成了XX功能,后端采用Java編寫。所以,教師需要引導學生進行正確的描述、發掘所做工作的技術含量。例如,上述的描述可以更改為本項目根據前后端完全分離的理念,前端采用Vue+ElementUI、后端采用SSM框架,使用Spring Security進行鑒權。
3.2.2 培養學生的復雜問題任務求解能力
新工科非常強調學生解決復雜工程問題的能力。但目前學生日常學習中較少碰到復雜問題,非常缺乏解決復雜問題的經驗。因此,我們在開展項目設計與開發時要注意各角色的功能要求,杜絕學生簡化功能只滿足于拉通前后端技術,而忽略了詳細的業務邏輯分析、異常處理等工作。這些工作是解決復雜項目的基礎性方法,也是保證項目質量的重要手段。對于復雜問題以及難點技術,教師要引導學生進行問題分析和任務分解,找出當前能夠解決以及難以解決的部分。對于難解決部分,教師需要組織優秀學生攻關或者尋求外援。
3.2.3 培養學生的團隊溝通與協調能力
在小型項目中,學生主要以宿舍或關系親近的2~3人作為小組,以一個技術能力強的學生為核心展開,這樣的團隊日常溝通比較方便。但是,學生在畢業初期進入一個較為陌生甚至并不和諧的團隊的可能性較大,如何在這樣的團隊中生存并有所發展,協調與溝通能力尤為重要。因此,我們采取了以下措施:(1)有意識地打破班級界限組建6~10人的大團隊,這樣就有可能是相互之間并不熟悉的學生,甚至有部分關系較為惡劣的同學被分到一組。學生在這樣一種氛圍中,能獲得重要的心態調適經驗,并在有善意的教師監督與協調下收獲關系的磨合經驗與溝通經驗。(2)進行有效溝通的訓練,要求學生記錄進行技術溝通的語句,然后討論這些語句包含的信息是否足夠,應該怎樣改進才能包含充分的信息,降低溝通的次數。(3)在工作任務的更新與改變時記錄協調工作時各方的反應,并探討在哪些情況下協調是成功并恰當的、哪些地方需要改進。
以新工科對學生能力培養的要求為指導,筆者在湖南科技大學計算機科學與工程學院18級網絡工程專業組織了以工程項目設計與開發為特色的軟件工程課程的教學實踐,取得了較好的成績。全專業總共分為10個小組,按企業設計標準衡量,其中5個小組可以達到優秀、4個小組良好、1個小組合格。學生以此開發的結果申請了3個軟件著作權,設計與開發的科技處合同審批系統得到了學校的應用。教學中,我們發現本文介紹的流程與能力培養方法在四個方面取得了成果:(1)學生設計與開發的項目業務邏輯合理、異常處理恰當,能適應項目運行時的各種復雜狀態;(2)通過數據建模與業務邏輯的迭代分析得到的數據庫質量高,能夠適應后期的各種異常與功能的調整,說明數據建模的成果能夠應對復雜工況與復雜流程;(3)類圖根據設計模式的要求進行優化后能提升整體項目的設計與開發質量;(4)學生能夠在團隊中進行有效溝通與完成一些比較復雜的工作。