李勁華, 陳 宇
(青島大學信息工程學院,山東 青島 266071)
?
軟件構造課程設計及其課程群
李勁華, 陳 宇
(青島大學信息工程學院,山東 青島 266071)

計算機課程設置中缺乏將分散在各個課程中的軟件開發理論、技術與工具綜合應用的實踐課程,是造成難以培養具有開發一定規模軟件能力的因素。對此,設置了一門獨立的軟件開發綜合實驗課——軟件構造課程設計,強化軟件技術集成及開發能力。通過整合相關課程的內容,設計了一個面向軟件開發技術、培養工程技術人才的軟件構造課程群。該課程群涵蓋了計算機課程體系中的編程基礎、系統軟件、軟件過程的課程,以及新增的軟件構造課程設計。給出了軟件構造課程設計的教學設計、軟件構造課程群的構成,以及針對不同人才類型的課程群的教學實施方案。比較并分析了相關的教學研究。
課程群; 軟件構造; 綜合課程設計; 實踐教學; 工程技術型人才
隨著計算機與網絡通信日益廣泛的應用,出現了各種形態的應用軟件,如傳統的桌面軟件、基于瀏覽器-服務器的Web應用、以及移動應用等。單一的計算機程序設計語言、軟件技術和工具已經不能滿足日常應用軟件的研制。開發一個實用的應用程序必須要掌握程序設計基礎、軟件開發技術(如面向對象、框架與API應用、設計模式、軟件設計)、數據庫系統、網絡與Web知識以及開發流程等。僅就計算機語言方面,編寫一個應用程序除了通用編程語言(如C、C++、C#、Java),通常還要使用數據庫編程語言SQL,或者Web語言(HTML、JavaScript等)。而且,一個應用軟件的開發不單單是設計算法、逐句地編寫代碼,還包括問題理解與分析、接口設計、框架選擇、API查詢與使用、代碼管理、軟件測試等活動。
另一方面,國家的經濟建設和社會發展,國際化、全球化和多元化的趨勢,對我國的高等教育、特別是工科教育提出了新的、更高的要求。高等工科教育必須回歸教育本質,著力培養面向世界、面向工程、面向應用的具有創新意識和創新能力的工程技術人員。計算機及其軟件作為一個基礎性的工具,與各個學科、各個應用領域的結合與滲透更加密切、更加深入,社會需要越來越多的應用軟件開發、維護和管理工程師。要求他們掌握現代軟件開發的各種技術、方法和工具,能綜合運用計算機原理、軟件技術以及應用領域的知識,開發解決實際問題、滿足社會需要的各種類型的應用軟件。
在高等教育體系中,軟件開發人才主要由計算機科學與技術及其相關專業培養,軟件開發也是機電、自動化、通信等大多工科學生應該掌握的基本能力。傳統的計算機本科教育在課程體系、課程內容、教學方法和手段方面的更新速度比不上專業技術的發展。其教學重原理輕技術,重理論輕實踐,重知識輕系統,已經呈現出各種弊端。特別是計算機軟件教育無法滿足對作為軟件工程師的需求,成為我國經濟發展的一個瓶頸。
為解決我國目前的高等教育問題以及社會亟需的工程技術人才,國家提出了多項教改舉措,包括成立國家示范性軟件學院、設置軟件工程一級學科、啟動卓越工程師培育計劃、啟動高等教育質量工程、鼓勵開展校企合作等。
本文針對培養軟件工程師的目標,總結了我們在課程體系方面的教學改革工作。以典型的計算機科學的專業課程為例,分析其在培養軟件開發工程師方面的不足。指出目前課程體系的主要問題,是缺乏培養學生綜合運用學習的計算機專業知識和軟件開發技術、構造實際運行的計算機軟件的集成能力。提出以軟件相關的專業課程為基礎的課程群,以及一門綜合實踐課程——軟件構造課程設計,實現培養工程技術人員產品開發能力的教學目的,為進一步通過軟件工程的實習實訓等實踐課程,培養學生的團隊合作、組織計劃、項目管理、規范過程等職業,成為軟件工程師奠定扎實的技術基礎。
現代軟件開發方法,包括極限編程等敏捷軟件開發,突出的特點是每個程序員都具有高超的軟件開發能力。他們熟練掌握多種類型的編程語言、框架與中間件、設計模式,熟練掌握軟件設計與測試技術,熟悉軟件開發的調試、測試、代碼管理等方法和工具,特別是擁有把實際問題轉換成可實際運行軟件的分析、設計和構造的綜合技術能力,同時還要善于和同行、和用戶進行溝通。
傳統計算機學科的教學體系包含了計算機系統及軟件開發知識的課程,如高級語言程序設計、數據結構與算法、數據庫、計算機網絡、操作系統、編譯原理等。這些課程包含了與軟件開發相關的許多重要的基本原理和技術方法,但是設置和講授他們的主要目的,甚至有些課程的唯一目的是為了理解計算機系統、研制計算機及其系統軟件。作為基礎課程的“高級語言程序設計”不是以培養學生系統地開發軟件為主要教學目的。學習編程的一個重要目的是為了更好地理解計算機系統、理解操作系統、編譯器或者數據庫的原理,研發操作系統、編譯系統或者數據庫管理系統DBMS。而且,這些課程基本上都是以講授原理為主。學習完成這些偏重理論的課程,并不能提升學生用編程解決問題的能力。
有些專業在這些課程之后學習“軟件工程”,課程內容包括軟件過程、產品工程、工程管理、組織計劃、標準規范等廣泛的內容。編程程序不是本課程的重點。
除了理論教學,計算機學科的教學體系中還配置了實踐教學,包括課程實驗、課程設計、專業實習和畢業設計。
課程實驗的目的是加深理解理論課中講解的抽象概念、原理和方法。課程實驗的類型主要是觀察、驗證、操作以及少量的設計和應用。由于課時限制,無法在實驗課上實施涵蓋問題分析、系統設計直至實現產品開發過程或技術應用。例如,數據結構的實驗大多是確定了數據結構和算法的問題,讓學生編程實現一種數據結構及其操作;或者使用確定的數據結構解決一個小問題。
獨立的課程設計可以彌補課程實驗的不足。它利用較為充足的時間實施具有綜合性、設計性的實踐課程,解決較為復雜的問題。在計算機學科的課程體系中[1-4],通常包括“操作系統課程設計”、“數據庫課程設計”、“計算機網絡課程設計”等。這些課程的目的主要是為某一門課程服務,培養學生綜合運用一門課程的主要知識。即使是“軟件工程課程設計”,其重點是用戶需求分析、軟件設計、團隊合作、組織計劃等產品工程,如要再培養學生綜合運用軟件開發的技術和工具,或者簡單地分析應用領域的知識和業務流程,已經超出了該課程的范圍。
實習實訓與畢業設計從更廣闊的場景,綜合運用所學的多種知識、各種技能和多種能力,完整地體現團隊合作完成一個軟件系統的全部開發過程——包括開發技術、產品工程以及團隊合作、項目計劃與控制等一些非技術性因素。由于學生還未掌握如何綜合運用各種專業技術開發產品,在這些綜合實踐過程,經常會因為個人開發技術的能力不足而導致整個項目難以完成。從而達不到教學目的。
在培養解決實際問題、具有團隊合作精神的軟件工程師方面,目前與課程體系存在缺陷。學生在完成編程基礎以及數據庫、操作系統、編譯原理等系統軟件課程后,缺乏綜合運用散落在這些課程中的軟件知識完成產品開發的能力,達不到到高級程序員(技術人員)的水平。另一方面,“軟件工程”課程試圖解決大中型軟件開發中的團隊合作、開發流程、項目組織與管理等方面的問題,很少包含軟件構造的內容。該課程的實驗也是為了理解和掌握相關的知識。實驗通常包含系統分析、設計或者項目管理活動,很少包含編碼實測試等現的工作。
綜上分析,我們在計算機專業核心課程后增加一門獨立的綜合實踐課——“軟件構造課程設計”。通過它整合軟件開發的編程語言、軟件設計、開發技術、軟件測試與代碼管理等技能、方法和工具,首先培養學生成為能獨立地集成技術、產品開發的高級程序員,再通過后續課程(包含軟件工程綜合課程設計和實習)成為優秀的軟件工程師。
2.1 “軟件構造技術”課程群
計算機學科除了計算機科學與技術,還有網絡工程、軟件工程、信息安全、物聯網等專業方向。它們都設置了與軟件開發技術相關的學科基礎核心課程:高級語言程序設計、面向對象程序設計、數據庫、操作系統、計算機網絡、編譯原理、軟件工程,以及一些選修課如Web應用開發、軟件測試、設計模式、算法設計與分析。這些課程包含了開發軟件的基本原理、方法、技術和流程,對培養學生——無論是計算機專業的、還是應用計算的——通過程序設計解決問題的能力,都有明顯的直接作用。但是,每門課程相對完整獨立,不是針對軟件開發技術而專門設置的。除了程序設計的兩門課程,其它課程的內容偏重概念和原理。目前的課程體系中還沒有“軟件開發”或類似的課程。
可以運用課程群的教學方式,更好地實現培養獨立地運用程序設計解決問題的能力的目標。圍繞上述的計算機核心課程,增設一門綜合實踐課“軟件構造課程設計”,形成“軟件構造技術”課程群。如圖1所示。

圖1 基于專業核心課程的軟件構造課程群
新增“軟件構造課程設計”的目的是整合分散在核心課程的軟件開發原理、流程、技術和工具,通過集中的實踐教學,培養學生的技術集成能力、提升獨立地開發軟件能力。課程群建設及新增課程的基本原則是:
(1) 相關性。針對培養目標,基于軟件開發技術的多門課程設計實踐課程。
(2) 穩定性。只增加一門綜合實踐課,不改變其它課程設置。
(3) 靈活性。針對不同的人才類型可調整課程的授課內容、組織和授課方式。
(4) 集成性。提升產品開發、工具應用的技術集成能力,采用簡約的軟件開發流程——平滑編程與測試(實現),整合分析、設計與實現(開發)的活動。
(5) 及時性。盡早培養學生的技術集成與應用能力,盡早多練、熟能生巧,逐步走向專業化。
(6) 技術性。盡量減少組織計劃、團隊管理及成員間的協商、交流、制約等非技術因素。
2.2 “軟件構造課程設計”的設計
軟件開發者要具備綜合運用多種程序開發理論、軟件技術和工具,課程群中的課程涵蓋了不同方面、不同層次的開發知識和技能:
(1) 高級語言程序設計。計算思維、用編程解決問題,代碼調試。
(2) 面向對象程序設計。代碼復用,面向對象編程范式,軟件測試,IDE。
(3) 數據結構。數據結構與算法基礎,IDE等基礎。
(4) 數據庫系統。數據庫基礎,SQL語句編程。
(5) 計算機網絡。網絡編程、Web應用的開發。
(6) 軟件工程。軟件產品工程,軟件開發的基本原則、軟件設計、測試、代碼管理。
然而,開發一個軟件產品需要系統地集成相關的知識、技能和工具,整合貫穿各個階段的多個活動。針對培養目標和當前課程體系的不足,增設“軟件構造課程設計”目的就是整合、增補、加強散落在上述課程中與軟件開發技術相關的知識,主要包含:
(1) 軟件構造的一般原則。模塊、信息隱藏、代碼重用、抽象,增量、迭代開發。
(2) 軟件構造的常用技巧。契約式設計、防御式編程、異常處理、配置式編程、表驅動構造技術、分布式程序設計。
(3) 軟件設計。軟件設計語言如UML、E-R圖、程序結構圖,軟件架構(如B/S)、框架(如MVC)與接口APIs的應用,類的設計,用戶交互設計,數據庫設計。
(4) 軟件構造工作要素。編碼及其規范、工具使用(如IDE、SVN)、單元測試技巧(如JUnit)、性能優化。
(5) 軟件構造活動。部分簡單的設計,編碼和調試,單元測試。
“操作系統原理”的主要內容不屬于開發應用軟件的必要知識而不是“軟件構造課程群”的核心課程。傳統“軟件工程”課程的內容龐大、復雜,包含軟件工程的基本理論、開發方法、過程模型以及工程管理、標準規范、職業道德等,不同的專業方向可以選學不同的內容,有些專業甚至可以不設。有關軟件的設計、測試和代碼配置等知識可以在新增的“軟件構造課程設計”簡單講解,通過開發實踐掌握。
課程群中每門課程含實驗,還可以設置相應的課程設計。在計算機學科的課程體系中,新增課程屬于技術開發系列,是學科的必修課。而后續的“軟件工程課程設計”屬于工程系列,作為學科的選修課。
2.3 課程群的教學實施
借鑒不同的人才教育分類法以及我校定位,把軟件人才劃分成學術型和工程技術型。針對不同類型、不同專業方向的學生,對課程群制定了不同的教學方案。
2.3.1 課程群核心專業課程的教學實施
實施軟件構造課程群的基本原則是,對工程技術類學生,簡化每門課程中的基礎理論、形式化方法、證明等方面的內容;學習專業課程的目的是為了理解計算機系統的原理、掌握相關技術;加強技術實現和應用方法的內容。
受篇幅所限,下面以計算機學科經典的數據結構和算法課程為例,說明針對不同類型人才的教學。

表1 專業核心課程與培養類型的關系

表2 數據結構和算法課程與培養類型的關系
傳統的高等教育的目標是培養學術型人才,這兩門課的教學主要是通過研究經典數據結構、算法策略及偽代碼實現,理解如何設計數據結構和算法,通過復雜度分析選擇數據結構和算法,鍛煉其邏輯思維能力和想象力,進而設計新的算法。
對工程技術類型的學生,在產品開發中如何使用這些數據結構/算法比研究它們的結構、性質,甚至用偽代碼或C語言去實現更重要。有關算法的基本內容,如復雜性分析、基礎算法可以通過數據結構來傳授。更多復雜的算法、理論知識可以作為選修課。而且,現代編程語言如C#、Java、Python等都提供了實現基本數據結構及其算法的類庫,學生可以通過閱讀類庫代碼學習如何用具體的開發語言實現數據結構和算法,同時擴大編程語言知識、提高編程水平。
在工程技術類教學中,可以對不同專業方向將這兩個課程合并。例如,在“軟件工程-服務外包”專業中,我們在Java方向的技術體系中選用了“Java數據結構”教材。在“生物技術(基因組學與生物信息學)”專業跨組學的創新實驗班中,針對“軟件開發與信息分析”方向開設了“數據結構與算法基礎”的課程,用python實現數據結構及基本算法。
2.3.2 軟件構造課程設計的教學實施
新增的“軟件構造課程設計”安排在學完專業核心課程之后的5學期開設。課程采用適合計算機軟件開發的案例教學——項目驅動方式,要求每個學生獨立地完成一個可運行軟件的開發工作,編寫代碼2 000行左右,工作量4人/周(其中課堂集中教學2人/周)。提供了下列三個教學安排:
方式一:正常教學,共18周,每周4學時。
方式二:實訓方式,共2周,每周40學時。
方式三:小學期制,共4周,每周20學時。
為使學生在教學時間內完成任務、突出軟件構造的綜合訓練,任課教師要提供軟件開發案例包,包含較為詳細的系統功能描述,或者有系統設計、主要代碼結構,最好提供一個完整的系統實現,以便每個學生能動手操作、完成實現一個可以運行的軟件。
提供的課程開發案例要滿足下面的基本要求:
不涉及太多的應用領域的知識,使用簡單常見的應用架構,簡化、集成的開發過程(要求規范的過程和管理,突出增量、迭代的基本原理,重點在部件級軟件設計、編碼-集成和測試),不要求復雜的軟件實現、但要集成2種技術(如GUI開發、用戶交互、數據庫開發、Web應用開發、多線程/并發程序設計等),結果是可運行的、具有一定功能的軟件(不追求完整性、穩定性、性能等質量屬性)。
案例例子:游戲類——連連看,俄羅斯方塊等,撲克類游戲;簡化的典型應用(模擬)系統——如圖書管理、課堂管理、畢業設計管理、家庭安保、家庭保健、電梯控制系統、智能家居服務、ATM終端。
學生實踐的重點:軟件設計技術,軟件構造技術,軟件測試(特別是編碼測試與框架xunit),版本控制,代碼復用——APIs、庫、框架等,工具的熟練使用與環境搭建,開發活動的集成(增量、迭代,設計與實現的平滑,編程與測試的平滑融合),功能驗證(測試、設計審查、代碼分析、代碼走查)等。
今后,我們將依據“計劃-執行-檢查-行動”的質量管理框架,不斷改進“軟件構造課程群”的設計與實施。主要工作包括:
(1) 改進課程群。調整群中的課程設置、每門課的教學內容和教學方法。對單個核心課程實行分類教學,側重原理及其應用。重構“軟件工程”課程的內容,以適應不同專業方向。增補其它相關技術課程,如Web應用開發基礎。
(2) 完善“軟件構造課程設計”及其案例。完善課程群及其綜合課程設計的案例要求和規范,針對不同專業方向,在信息安全、電子商務、移動計算、數據挖掘、嵌入式軟件、網絡工程等領域開發合適的案例庫。特別是,開發能在不同課程中共享的綜合案例。
(3) 建設技術開發系列課。分別以C/C++,C#和Java為基礎,在數據結構、計算機網絡、Web開發、軟件構造等課程中,采用相同的編程語言,形成軟件構造課程群的技術系列課程。如在“數據結構”課程中,講授的設計、算法部分與編程語言無關,而在應用、實現的實驗課可分別采用不同的編程語言。
[1] 王志英,蔣宗禮,楊 波,等. 計算機科學與技術專業實踐教學體系與規范研究[J].中國大學教育,2009(2):42-44.
[2] Curriculum of computer science and technology disciplines of China universities[M]. Beijing: Tsinghua University Press, 2009.
[3] Yanmin Chen, Xizhong Lou, Jingwen Zhan, “Research on teaching reform of computer basic course in colleges and universities,”[C]//Proc 3rd International Conference on Teaching and Computational Science(WTCS '09), Shenzhen, China, Dec 2009:231-236.
[4] Duanyang Zhao, Qingxiang Xu and Wuheng Zuo, “Research and Practice in the Curriculum System for Majors in Software Engineering,”[C]//Proc 2010 2nd International Workshop on Education Technology and Computer Science, Wuhan, China, Mar 2010:417-420.
[5] 夏建國. 基于人才分類理論審視技術本科教育人才培養目標[J].中國高教研究,2007(5):5-7.
[6] 李慧仙. 論高校課程群建設[J].江蘇高教, 2006(6):73-75.
[7] 王 寧,王 珊. 數據管理課程群的構建和實施方案研究[J].中國大學教學, 2010(6): 62-65.
[8] 萬 臣,謝 芳, 胡 泉. 計算機專業程序設計課程群的建設與研究[J].合肥工業大學學報(社會科學版),2009(2):23(1),33-36.
[9] Zhixiao Wang and Fanrong Meng. Core basic course group construction in computer major,[C]//Proc 6th International Conference on Computer Science and Education(ICCSE '11), SuperStar Virgo, Singapore, Aug, 2011: 577-579.
[10] Christopher Connolly, Gabriele Meiselwitz, “Integrating software engineering in computer programming education,[C]//Proc. 10th ACM conference on SIG-information technology education(SIGITE '09), Fairfax, USA, Oct, 2009: 50-54.
[11] 劉 超. 關于“軟件工程”課程體系的基本架構及課程系列設置的探討[J].計算機教育,2009(21):22-26.
[12] 駱 斌,臧斌宇,丁二玉. 軟件工程專業教育知識體系的分析、重構與求精[J]. 計算機教育,2010(23):2-8.
[13] 駱 斌. 軟件工程與計算(《卷一:軟件開發的編程基礎》,《卷二:軟件開發的技術基礎》,《卷三:團隊與軟件開發實踐》)[M].北京:機械工業出版社,2012.
[14] Bourque P, Fairley R E,etal. Guide to the Software Engineering Body of Knowledge[ED]. Version 3.0,Chapter 3,Computer Society, 2014; www.swebok.org
[15] Charlie McDowell, Linda Werner, Heather E. Bullock,etal. Pair programming improves student retention, confidence, and program quality[J]. Communications of the ACM, 2006,49(8):90-95.
Course Design of Software Construct and Its Related Course Group
LIJin-hua,CHENYu
(College of Information Engineering, Qingdao University, Qingdao 266071, China)
It lacks a comprehensive practice course that integrates the software development theories, techniques and tools, which are scattered across different courses in computer science curriculum. That is one of the reasons that we failed to educate students with the competence of developing large-scale software applications. A separate software comprehensive experimental course named software constructs course design is setup, for the purpose of strengthening the competence of software integration and development. The practice course is designed for support a course group covering courses of programming foundation, data structures and algorithms, and software process. The paper describes constitution of the course group, curriculum design of the practice course, and different teaching implementation plans aiming at different types of students. Related teaching researches are comparatively analyzed.
course group; software construction; comprehensive course design; practice teaching; engineering talents
2015-01-05
李勁華(1963-),男,湖南長沙人,博士,教授,系主任,從事計算機科學、軟件工程、項目管理、軟件工程學科教學。
Tel.:13969678995,0532-85952324;E-mail:lijh@qdu.edu.cn
TP 311
A
1006-7167(2015)10-0084-05