章宗長,王藝深
(蘇州大學 計算機科學與技術學院,江蘇 蘇州 215006)
人類社會正在邁入智能時代,企業對軟件人才的要求越來越高。一些著名的互聯網公司,如騰訊、網易、阿里等,要求業務項目不僅能滿足各類人群的使用需求,還能在不同設備上穩定運行。這樣的業務屬性需要軟件人才不僅擁有出色的編程能力,還要精通可行性研究、需求分析、軟件項目管理等軟件工程理論。如何培養出企業滿意的軟件人才是當前軟件工程課程改革亟待解決的重要課題。
目前,已有不少關于軟件工程課程改革的方案:文獻[1]提出基于“自主學習任務單”的軟件工程課程改革;文獻[2]提出以設計型項目為驅動的軟件工程課程改革;文獻[3]提出以企業項目驅動的軟件工程課程改革;文獻[4]提出基于開放模式的軟件工程課程改革。這些改革方案都取得了一定的效果,但是仍然存在一定的問題:沒有討論開源項目對計算機技術發展的促進作用。事實上,使用開源工具進行團隊協作已成為軟件開發的主流。
以開源項目為驅動的軟件工程課程,不僅考慮了學生現有的知識水平,還著眼于企業對軟件人才的要求,特點是從開源項目入手,以現代企業的軟件開發流程為標準,通過團隊合作的方式,在云服務平臺上搭建開發環境,培養學生的編程、溝通和自學能力。
軟件工程一直是計算機及其他相關學科的核心,在培養高素質軟件人才方面發揮重要的作用。但是,目前軟件工程的課程設置存在一些不容忽視的問題。
許多學生把軟件工程視為一門死記硬背的學科,并不理解軟件工程理論在項目開發中發揮的重要作用。筆者發現,許多學生即使學習了相關的軟件工程規范,但并未在項目實踐中去遵循。此外,課程設置同質化嚴重,難以激發學生的學習興趣,導致普遍存在抄襲的現象。
現代的企業項目規模大、結構復雜,往往需要十幾人乃至上百人共同開發。基于云平臺、使用版本控制軟件的團隊協作已成為當今企業生產開發的主流模式。然而,筆者在教學中發現,目前的課程內容依然是圍繞單人獨立完成的項目展開,忽視了多人協作在項目開發中的重要地位。
互聯網企業無不投入大量的人力物力發展人工智能、區塊鏈、物聯網等新業務,而當前課程設置的實踐項目往往是基于Windows平臺開發,以數據管理系統設計、個人網站的搭建為主,這與目前基于Web、多平臺部署的應用開發相悖,脫離了當前企業的實際需求。
課程實踐項目的設置必須考慮學生的已有知識水平、當前科技熱點以及學生興趣愛好。課程實踐項目如果設置的過于簡單,則會導致學生的工作量太少,學生難以真正理解書本的知識;如果設置的過于復雜,則會嚴重打擊學生的學習積極性,難以達到讓學生在實踐中運用已學知識的目的。因此,課程實踐項目的設置必須遵循難度適中、循序漸進的原則。
開源項目數目龐大、類型繁多,學生可以根據自己的興趣愛好選擇適合自己的開源項目,并和志同道合的同學一起開發。這可以激發學生的學習興趣,調動其學習積極性,促使學生主動學習當下熱門的技術,提高自主學習能力。此外,開源項目一般有著良好的社區支持。如果學生在開發過程中遇到自己無法解決的編程問題,可以在社區找到解決方案,大大降低課程實踐項目的難度。
筆者以中英文翻譯系統為例,闡述如何實施基于開源項目的課程改革,培養出企業滿意的高素質軟件人才。
由于學生此時對軟件工程還不了解,因此教師在該階段應以書本內容為主。與此同時,教師應該鼓勵學生自己制訂學習方案,培養學生的自主學習能力。以中英文翻譯系統為例,教師除了向學生介紹如何進行可行性研究、如何撰寫需求分析、如何完善詳細設計等軟件工程方法外,還可以要求學生充分利用開放網絡課堂、個人博客、問答社區等優質網絡資源,自主學習當前流行的開發技術。教師可以要求學生每周撰寫1篇學習筆記并發送其郵箱,以方便掌握學生的學習進度。教師還可以向學有余力的學生推薦軟件工程經典書籍作為擴展閱讀,從而提高學生的知識水平。通過這種教學方式,筆者發現多數學生都能對軟件工程這門課程有較為深入的了解,并能掌握Linux、Python、Git等開源軟件的基本用法。
在學生掌握基本開發工具的用法和了解軟件工程理論后,教師就可以選擇幾個開源項目讓學生按照自己的興趣愛好去選擇。教師可以把選擇同一個項目的學生劃分為1個小組。一般1個小組會有5~6個人,教師可以指派1名溝通能力較強的學生擔任組長,并讓組長安排組員的分工。劃分完小組并選出組長后,教師就可以帶領學生按照軟件工程理論對項目進行分析,包括撰寫可行性報告、進行總體設計、完善詳細設計等。以中英文翻譯系統的開發為例,教師可以要求每個小組定期報告項目進展,并通過PPT等方式匯報當前工作。在該階段,筆者發現雖然大部分學生已經學習過軟件工程理論,但是仍然難以寫出符合要求的可行性報告和設計文檔。只有經過教師的多次指導和修改后,學生才真正明白這些軟件工程理論在實際項目中是如何應用的。
由于從無到有構建一個中英文翻譯引擎耗費巨大,所以本項目推薦基于公開的翻譯引擎做二次開發。為了保證翻譯的質量,項目將選擇多個翻譯引擎同時對同一文本進行翻譯,并利用人工智能對翻譯結果進行篩選,將評價最好的翻譯結果呈現給用戶。在此階段中,教師可以指導學生確立該翻譯系統的基本要求:①基于云平臺進行開發測試;②基于分布式系統和多線程技術從多個翻譯引擎采集翻譯結果;③使用強化學習理論對翻譯結果進行篩選,選擇最優翻譯結果呈現給用戶;④基于Web技術編寫跨平臺的翻譯系統客戶端;⑤對整個中英文翻譯系統進行測試與維護。
在完成項目設計階段后,教師就可以指導學生根據項目需求和項目設計來實現項目。在此階段,教師應注重培養學生的編程、團隊協作和自主學習能力。整個項目實施階段又可以分為幾個階段。以中英文翻譯系統為例,整個過程分為5個部分:云服務器開發測試環境的搭建、翻譯結果的采集、翻譯結果的智能篩選、翻譯系統的客戶端開發以及翻譯系統的測試與維護。
2.4.1 云服務器開發測試環境的搭建
現在絕大多數企業都選擇云服務器作為生產測試環境,因為云服務器具有安全可靠、配置靈活、彈性擴容等優勢。筆者選擇云服務器而不是本地服務器作為項目的生產測試環境,順應了時代的發展,有利于培養出符合企業需求的高素質軟件人才。
在本階段,教師應讓學生實際運行Linux命令并查看運行結果,使學生掌握Vim編輯器的使用方法,并了解線程、進程、協程等基本的操作系統概念,最終完成在云服務器上搭建生產測試環境的目標。在此過程中,學生可以掌握相關知識:①通過SSH遠程登錄云服務器;②安裝Python、Git等生產測試軟件;③設置不同的用戶,并按照其職責賦予不同的權限;④配置Linux網絡參數,開啟防火墻,保護云服務器的安全。
通過在云服務器上搭建生產測試環境,學生可以掌握Linux系統的使用方法,理解操作系統中的重要概念,了解服務器安全的基本知識,為后續的學習和工作打下堅實的基礎。
2.4.2 翻譯結果的采集
隨著科學技術的進步,計算機硬件技術飛速發展,但由于用戶量的不斷增長,單臺服務器越來越難以滿足需求,因此分布式計算應運而生。為了順應時代的發展,教師可以要求學生在開發中英文翻譯系統時,基于Hadoop架構來建立分布式翻譯結果采集系統。Hadoop是開源的、優秀的分布式系統架構,已在雅虎、百度、騰訊等知名互聯網企業廣泛應用。學生通過參加這樣的實踐項目,可以學習最先進的技術,養成規范的編程習慣。
在此階段中,教師可以對學生有如下要求:①使用面向對象的編程思想,將各翻譯引擎建模為不同的對象,編寫出易于理解、便于維護的代碼;②學習OSI七層模型和TCP/IP分層模型,掌握傳輸控制協議和用戶數據報協議,了解傳輸控制協議的建立過程和關閉過程;③學習超文本標記語言和層疊樣式表,能夠從內容繁雜的網頁中快速找到翻譯結果;④學習多線程編程技術,對一個待翻譯文本同時向多個翻譯引擎查詢,減少查詢的等待時間;⑤掌握基本的數據庫查詢技術,了解分布式系統下的數據同步;⑥基于Map/Reduce思想,通過對Hadoop軟件的二次開發,使用分布式算法完成翻譯結果的采集。
通過本階段的學習,學生可以體驗企業項目的開發流程,學得當前的尖端技術,快速提高編程、溝通和協作能力。
2.4.3 翻譯結果的智能篩選
由于各翻譯引擎采用的技術不同,所以無法找到一個對任意文本的翻譯其結果都是最優的翻譯引擎。為了提升用戶體驗,筆者認為有必要對所有翻譯結果進行比較,將最優的翻譯結果呈現給用戶。為了實現這一目的,筆者指導學生基于強化學習理論,使用Tensor flow完成對翻譯結果的篩選。強化學習是人工智能領域最熱門的課題之一,被譽為“通往通用人工智能的鑰匙”。與監督學習相比,強化學習不需要對樣本進行標注,這可以大大減少工作量。此外,Tensor flow是迄今為止最流行的人工智能開源框架之一,使用Tensor flow可以大大降低編程難度,快速完成項目的開發。
在此項目中,筆者把待翻譯的文本建模為狀態,將呈現給用戶的翻譯結果視為對動作的選擇,把用戶評分(0~5分,0分最差,5分最優)作為獎勵。強化學習把不同翻譯引擎對同一文本的翻譯結果抽象為關于用戶評分的值函數。用戶的評分越高,其對應的值函數也就越大;值函數越大,翻譯引擎的翻譯結果可能就越好。因此,筆者總是把值函數最大的翻譯引擎翻譯結果提交給用戶,這在強化學習中被稱為利用。當然,最優的翻譯引擎可能有一小部分翻譯結果不令人滿意。為避免這種情況的出現,筆者隨機選擇次優翻譯引擎的翻譯結果呈現給用戶,這在強化學習中被稱為探索。這樣,筆者就選擇出最符合用戶需求的翻譯結果。
在這一過程中,學生學到的知識有:①人工智能的發展歷史;②目前主流的人工智能技術有什么優勢及缺陷;③強化學習的基本概念;④在強化學習的探索和使用上進行權衡;⑤值函數的更新方式;⑥Tensor flow的基本使用。
通過學習前沿的理論知識,學生可以有更開闊的視野、更濃厚的學習興趣和更強的自學能力。
2.4.4 翻譯系統的客戶端開發
為了將翻譯結果呈現給用戶,一個簡潔、美觀的客戶端是必不可少的。目前Android、IOS、Windows在操作系統市場占據著統治地位,而這三大系統之間的應用又不能通用。為了降低項目難度、減少工作量,教師可以建議學生使用Web技術開發翻譯系統的客戶端,這樣做:①可以實現客戶端跨平臺使用;②編寫測試方便,各平臺對Web應用的支持基本一致,不需要對使用平臺做適配調整;③學生在前面已學習過相關知識,對Web技術有了一定的了解,學習成本低;④多數Web技術都是開源項目,社區活躍。
在本階段,學生需要掌握的知識有:①超文本標記語言和層疊樣式表的基本使用;②瀏覽器與服務器進行通信的方法;③數據庫的基本使用方法;④掌握使用動態網頁刷新來減少網絡流量的方法;⑤掌握使用JavaScript語言實現客戶端與用戶互動的方法。
通過這個階段,教師可以快速提高學生的編程能力,促使學生養成良好的編程習慣。
2.4.5 翻譯系統的測試與維護
軟件的測試與維護是項目開發的重要環節。通過對軟件進行測試,可以找到代碼中隱含的錯誤,從而避免意外情況的發生。軟件維護可以延長軟件的生命周期,提升用戶的使用體驗。在此階段,學生需要掌握的知識有:①黑盒測試和白盒測試的區別;②評估軟件可靠性的方法;③軟件調試的過程;④軟件維護的流程。
通過本階段的學習,學生可以基本掌握軟件測試與維護的基本方法,在實踐中認識到軟件工程理論在項目測試和維護中的重要作用。
隨著時代的發展,用戶的需求越來越多,項目也越來越復雜,僅靠個人的力量已無法完成軟件開發。大部分企業都是采用團隊分工的方式完成項目,這樣做可以大大降低項目的復雜度,縮短項目的開發周期。但是筆者在實際教學中發現,團隊協作需要成員間良好的溝通,否則容易出現代碼錯誤無法修復、程序實際運行結果與需求不符等問題。
因此,教師可以要求組長合理分配任務給組內成員,充分發揮Git、SVN等開源開發工具的作用,嘗試將代碼提交到碼云等在線代碼托管平臺來完成軟件的開發,使用石墨文檔等在線協作文檔完成相關文檔的撰寫。此外,教師還應要求學生遵循相關的編碼規范,以方便代碼調試與維護。經實踐檢驗,上述方法能有效消除團隊協作過程中出現的問題,確保項目順利地按時完成。
以開源軟件為驅動的軟件工程課程改革,遵循了循序漸進的教學原則,將軟件工程理論與項目實踐有效結合,讓學生在項目開發中意識到軟件工程理論的重要作用。在中英文翻譯系統的開發過程中,學生學習了云生產平臺的搭建、翻譯結果的智能篩選、跨平臺客戶端的開發等一系列前沿技術,提高了團隊協作、編程和自學能力。實踐表明,以開源軟件為驅動的軟件工程課程教學能夠培養出順應時代發展的高素質軟件人才。