林生佑,曾 昊,徐芝琦,潘瑞芳
(1.浙江廣廈職業(yè)技術大學信息學院,浙江 東陽 322100;2.浙江傳媒學院媒體工程學院)
編程范式就是如何組織程序的基本思想,它反映了開發(fā)設計人員對程序的基本哲學觀。編程范式主要分為兩大范式:命令式編程范式、聲明式編程范式。這兩大范式衍生出最基本的面向過程、面向對象、函數式和邏輯式四個子范式,如圖1所示。
圖1 編程范式結構圖
命令式范式的本質就是編寫了一個命令列表,計算機按照列表中的命令順序執(zhí)行。其優(yōu)點是結構簡單,易于實現,缺點是不能解決復雜問題且效率較低。此外,在命令式范式的基礎上還分出面向過程和面向對象兩個子范式。面向過程范式是一種基于過程調用的編程范式,面向過程程序被分成一組稱為過程或函數的可執(zhí)行代碼塊,其本質是通過多個過程經過順序、選擇和循環(huán)等程序結構組合而成。而面向對象范式世界中的實體都由類表示,對象是類的實例,數據和操作被封裝在對象中,對象由數據成員和方法成員組成,方法對對象進行操作,而對象接收來自方法的消息請求來執(zhí)行計算,實現交互,完成任務。
聲明式范式注重表達計算的邏輯,而忽略計算的具體流程。命令式告訴計算機如何做(How),而聲明式告訴計算機做什么(What)。在聲明式范式基礎上又可細分出函數式和邏輯式兩種子范式。函數式范式是一種基于遞歸函數計算理論的范式,其程序由一系列數學函數所組成,程序執(zhí)行便是計算這些函數,并對表達式求值。而邏輯式范式以數理邏輯為基礎,采用陳述性的方法表達系統內的事實和規(guī)則,并通過這些事實和規(guī)則還原現實世界。邏輯式程序由各種斷言和推導規(guī)則所組成,程序的執(zhí)行則非常像數學中對命題或定理的證明過程。
計算機本科教育多范式編程教學就是指在編程教學過程中融合多種范式思維,教授多種范式語言,使學生了解不同編程范式的基本思想和適用場合,以便學生在遇到問題時可以找到最適合解決問題的編程范式,從而培養(yǎng)學生求解復雜問題的能力。
編程范式是學習編程語言時必須先理解及掌握的重要概念。編程范式教學的本質是給學生教授范式背后的編程哲學,即編程語言的邏輯和思考現實問題的方式。國內高校對于編程范式的教學存在如下三個方面的問題。
大多數高校的編程課程首先向學生教授面向過程范式,即C 程序設計。通常情況下,學生還會使用C語言學習其他后續(xù)課程,比如數據結構,算法分析等。在后續(xù)專業(yè)課程中,學生也會接觸到其他編程范式及語言,但此時學生的思維已經深深地扎根于面向過程范式中了,要想學習新的編程范式是極其困難的。因此,學生應該盡早接觸到多種編程范式,避免知識體系缺失,限制約束了學生對問題的理解及想象。
高校編程教學側重語法教學而忽略培養(yǎng)編程思維,基本只涉及到命令式范式中的面向過程和面向對象。多范式融合的編程是當今互聯網行業(yè)及計算機軟件行業(yè)的新寵,比如一些傳統命令式語言C++,Java都在其最新版本的編譯器中加入函數式范式的特性;一些金融科技軟件也明確了使用函數式范式進行開發(fā)。高校編程教學工作應與行業(yè)需求進行有效結合,增強學生畢業(yè)后的社會就業(yè)競爭力。
通過研究牛津大學計算機科學本科專業(yè)的教學大綱和課程設置發(fā)現,該專業(yè)從一年級開始就教授學生多種范式的編程語言,如圖2所示?!昂瘮凳骄幊獭焙汀懊钍骄幊獭边@兩門課程同時出現在一年級新生的必修課中;三年級的“知識表示和推理”則教授邏輯式范式,借助Prolog語言來學習有關語義方面的知識;“Lambda 演算和類型系統”則對應高級函數式編程,讓學生對函數式范式有更深了解;“編程語言原理”則進一步站在全局的視角系統闡述了編程語言及其范式理論。
圖2 牛津大學計算機科學專業(yè)必修課表
無獨有偶,帝國理工學院計算機本科教育在課程設置中也全面施行了多范式編程教學,圖3 顯示了該校計算機本科專業(yè)一年級的“計算機實踐”的課程列表,其中“Haskell 函數式編程”,“Kotlin 函數式和面向過程編程”,“Kotlin 和Java 面向對象編程”等都是一年級學生的必修課程。教授邏輯式范式的“Prolog導論”也出現在二年級的春季學期必修課程列表中。
圖3 帝國理工學院計算機科學專業(yè)必修課表
由此可見,諸如牛津大學及帝國理工學院這類世界一流大學計算機科學專業(yè)本科教育,基本囊括了所有的編程范式,反映了世界一流大學計算機科學專業(yè)對多范式編程教學及人才培養(yǎng)的重視。國內高校編程教育模式應多借鑒他們的編程教學方法。
在借鑒國外一流高校計算機本科編程教育做法的基礎上,我們提出了多范式編程教學新模式,如圖4所示。它的重點不在于介紹個別課程的教學,而在于通過專業(yè)培養(yǎng)計劃修訂思路來實踐我們的多范式編程教學。其思路主要包含以下三個方面。
圖4 多范式編程范式教學模式
“離散數學”作為計算機科學專業(yè)學生的必修數學課,其中數理邏輯及圖論的部分內容比較抽象且難度較高,不易被學生掌握,Prolog恰好是一種建立在邏輯學理論基礎之上的語言,通過在離散數學教學中引入Prolog可簡化學生對于命題邏輯及一階謂詞邏輯等概念的理解和掌握。還能通過Prolog程序快速的模擬并驗證邏輯推導的全過程。學生在學習數理邏輯的同時也學習了以邏輯式范式思維解決問題的能力,達到了事半功倍的效果。此外,Prolog 語言還廣泛應用在人工智能的研究中,可以用來建造專家系統、自然語言理解、智能知識庫等。在“人工智能基礎”課程引入Prolog語言,可以簡化課程理解難度,更好呈現課程內容。
從大學一年級開始為新生提供多范式編程經驗。選擇“Python程序設計”作為教授多范式編程的第一門編程課程,Python作為一種多范式語言兼有面向過程,面向對象及函數式的特性。在Python 教學過程中,先講授如何使用Python 進行面向過程編程,然后,當更復雜的程序需要進行數據及類型抽象時,自然地引入面向對象思維。接著,由遞歸的概念及實踐引出高階函數,從而教授與數學思維接近的函數式編程風格。最后通過將多個實例分別由這三種范式實現代碼,從思想和代碼層面對三種范式進行對比和比較,生動直觀地向學生展示不同范式解決同一問題的思考方式和哲學思想。我們還在后續(xù)專業(yè)課“圖像與視頻處理”課程中使用Python 語言實現各種算法,將枯燥理論知識與Python 簡單易懂的代碼方式相結合,檢測了學生Python多范式編程的能力。
由于受課時影響,將所有的編程范式語言都囊括在計算機科學專業(yè)本科課程中是不現實的,但可以間接地將四種主要編程范式的思想及內容嵌入到其他專業(yè)核心課程中,具體措施如下:
首先,“C 程序設計”課程是高校計算機專業(yè)的必修入門課程。C 語言是一個典型的面向過程范式語言,為了還原C語言教學目的的本質,在教學中全面結合面向過程范式的思想,著重培養(yǎng)給學生以面向過程思維思考問題的方式,避免C語言教學陷入語法陷阱。
其次,“C++程序設計”和“Java 程序設計”是面向對象編程課程,擔負著將面向對象范式的思想融入編程教學的任務。這兩門課不僅要涵蓋面向對象基本概念,還要涵蓋如單繼承、多繼承、多態(tài)和抽象接口等高級面向對象主題。將對象優(yōu)先思想方法全面在“C++程序設計”和“Java 程序設計”課程中推行,增強學生面向對象思維能力?!霸O計模式”是軟件開發(fā)人員在面向對象軟件開發(fā)過程中面臨的一般問題的解決方案,是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。在“設計模式”課程中通過對二十三種經典設計模式的教授并結合實例,進一步讓學生對面向對象范式有更深入和直觀的理解。
再次,在“數據結構”課程中引入函數式編程范式,嵌入函數式范式的Haskell語言可以更好地呈現課程內容和簡化課程難度,比如結合Haskell中的遞歸和折疊函數等重要的計算思維講授遍歷和排序問題,在簡化了數據結構學習難度的同時教授了函數式范式思想,拓寬了學生的視野。
我校計算機科學大類包括數字媒體技術、軟件工程和網絡工程這三大專業(yè),其中數字媒體技術專業(yè)學生480 人,軟件工程專業(yè)學生320 人,網絡工程專業(yè)學生320 人。多范式編程教學新模式從我校19 級數字媒體技術專業(yè)開始進行試點。通過近二年的探索與實踐,學生的算法設計及綜合開發(fā)能力有了一定的提升,主要表現在:
在每年的編程能力比賽中,教改試點的數技專業(yè)學生在前50 名中占37 人,遠比軟工和網工專業(yè)(10人和3 人)人數多。且數技專業(yè)的學生能較好地選擇并靈活地使用合適的編程范式來解答競賽試題。在教改試點前的2017-2019 年,我院參加浙江省藍橋杯獲獎人數約每年6 人左右,到了2021 年,獲獎人數已增加到22人。
通過對比數技專業(yè)教改前后近兩年的“數據結構”和“離散數學”的學生期末成績數據,在期末試卷難度相近的情況下,經過函數式和邏輯式范式教學的學生的成績普遍優(yōu)于沒有融合編程范式教學的其他專業(yè)學生,各班平均成績大約提高4-10分。
程序設計競賽考察的是學生的算法設計實現能力,而通過作品參加各類學科競賽和專業(yè)大賽則考察的是學生的分工協作、語言表達和項目開發(fā)能力。2020 年全院六個工科專業(yè)參加各類學科競賽和專業(yè)大賽省級以上獲獎104 人次,其中數技專業(yè)學生獲獎23 人次,僅2021 年上半年就已達113 人次,數技專業(yè)學生獲獎達31人次。
在編程課程中引入多范式編程教學新模式是今后編程類課程未來發(fā)展的大勢所趨。計算機科學專業(yè)的本科生應當對主要編程范式有一定了解和掌握,以便更好從事專業(yè)工作。多范式編程教學新模式突破了傳統程編程類課程的理念,提高編程教學的科學性和有效性,同時也拓闊了學生的視野及思維方式,提升了學生的就業(yè)競爭力。