林生佑,曾 昊,徐芝琦,潘瑞芳
(1.浙江廣廈職業(yè)技術(shù)大學(xué)信息學(xué)院,浙江 東陽(yáng) 322100;2.浙江傳媒學(xué)院媒體工程學(xué)院)
編程范式就是如何組織程序的基本思想,它反映了開發(fā)設(shè)計(jì)人員對(duì)程序的基本哲學(xué)觀。編程范式主要分為兩大范式:命令式編程范式、聲明式編程范式。這兩大范式衍生出最基本的面向過程、面向?qū)ο蟆⒑瘮?shù)式和邏輯式四個(gè)子范式,如圖1所示。

圖1 編程范式結(jié)構(gòu)圖
命令式范式的本質(zhì)就是編寫了一個(gè)命令列表,計(jì)算機(jī)按照列表中的命令順序執(zhí)行。其優(yōu)點(diǎn)是結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn),缺點(diǎn)是不能解決復(fù)雜問題且效率較低。此外,在命令式范式的基礎(chǔ)上還分出面向過程和面向?qū)ο髢蓚€(gè)子范式。面向過程范式是一種基于過程調(diào)用的編程范式,面向過程程序被分成一組稱為過程或函數(shù)的可執(zhí)行代碼塊,其本質(zhì)是通過多個(gè)過程經(jīng)過順序、選擇和循環(huán)等程序結(jié)構(gòu)組合而成。而面向?qū)ο蠓妒绞澜缰械膶?shí)體都由類表示,對(duì)象是類的實(shí)例,數(shù)據(jù)和操作被封裝在對(duì)象中,對(duì)象由數(shù)據(jù)成員和方法成員組成,方法對(duì)對(duì)象進(jìn)行操作,而對(duì)象接收來(lái)自方法的消息請(qǐng)求來(lái)執(zhí)行計(jì)算,實(shí)現(xiàn)交互,完成任務(wù)。
聲明式范式注重表達(dá)計(jì)算的邏輯,而忽略計(jì)算的具體流程。命令式告訴計(jì)算機(jī)如何做(How),而聲明式告訴計(jì)算機(jī)做什么(What)。在聲明式范式基礎(chǔ)上又可細(xì)分出函數(shù)式和邏輯式兩種子范式。函數(shù)式范式是一種基于遞歸函數(shù)計(jì)算理論的范式,其程序由一系列數(shù)學(xué)函數(shù)所組成,程序執(zhí)行便是計(jì)算這些函數(shù),并對(duì)表達(dá)式求值。而邏輯式范式以數(shù)理邏輯為基礎(chǔ),采用陳述性的方法表達(dá)系統(tǒng)內(nèi)的事實(shí)和規(guī)則,并通過這些事實(shí)和規(guī)則還原現(xiàn)實(shí)世界。邏輯式程序由各種斷言和推導(dǎo)規(guī)則所組成,程序的執(zhí)行則非常像數(shù)學(xué)中對(duì)命題或定理的證明過程。
計(jì)算機(jī)本科教育多范式編程教學(xué)就是指在編程教學(xué)過程中融合多種范式思維,教授多種范式語(yǔ)言,使學(xué)生了解不同編程范式的基本思想和適用場(chǎng)合,以便學(xué)生在遇到問題時(shí)可以找到最適合解決問題的編程范式,從而培養(yǎng)學(xué)生求解復(fù)雜問題的能力。
編程范式是學(xué)習(xí)編程語(yǔ)言時(shí)必須先理解及掌握的重要概念。編程范式教學(xué)的本質(zhì)是給學(xué)生教授范式背后的編程哲學(xué),即編程語(yǔ)言的邏輯和思考現(xiàn)實(shí)問題的方式。國(guó)內(nèi)高校對(duì)于編程范式的教學(xué)存在如下三個(gè)方面的問題。
大多數(shù)高校的編程課程首先向?qū)W生教授面向過程范式,即C 程序設(shè)計(jì)。通常情況下,學(xué)生還會(huì)使用C語(yǔ)言學(xué)習(xí)其他后續(xù)課程,比如數(shù)據(jù)結(jié)構(gòu),算法分析等。在后續(xù)專業(yè)課程中,學(xué)生也會(huì)接觸到其他編程范式及語(yǔ)言,但此時(shí)學(xué)生的思維已經(jīng)深深地扎根于面向過程范式中了,要想學(xué)習(xí)新的編程范式是極其困難的。因此,學(xué)生應(yīng)該盡早接觸到多種編程范式,避免知識(shí)體系缺失,限制約束了學(xué)生對(duì)問題的理解及想象。
高校編程教學(xué)側(cè)重語(yǔ)法教學(xué)而忽略培養(yǎng)編程思維,基本只涉及到命令式范式中的面向過程和面向?qū)ο蟆6喾妒饺诤系木幊淌钱?dāng)今互聯(lián)網(wǎng)行業(yè)及計(jì)算機(jī)軟件行業(yè)的新寵,比如一些傳統(tǒng)命令式語(yǔ)言C++,Java都在其最新版本的編譯器中加入函數(shù)式范式的特性;一些金融科技軟件也明確了使用函數(shù)式范式進(jìn)行開發(fā)。高校編程教學(xué)工作應(yīng)與行業(yè)需求進(jìn)行有效結(jié)合,增強(qiáng)學(xué)生畢業(yè)后的社會(huì)就業(yè)競(jìng)爭(zhēng)力。
通過研究牛津大學(xué)計(jì)算機(jī)科學(xué)本科專業(yè)的教學(xué)大綱和課程設(shè)置發(fā)現(xiàn),該專業(yè)從一年級(jí)開始就教授學(xué)生多種范式的編程語(yǔ)言,如圖2所示。“函數(shù)式編程”和“命令式編程”這兩門課程同時(shí)出現(xiàn)在一年級(jí)新生的必修課中;三年級(jí)的“知識(shí)表示和推理”則教授邏輯式范式,借助Prolog語(yǔ)言來(lái)學(xué)習(xí)有關(guān)語(yǔ)義方面的知識(shí);“Lambda 演算和類型系統(tǒng)”則對(duì)應(yīng)高級(jí)函數(shù)式編程,讓學(xué)生對(duì)函數(shù)式范式有更深了解;“編程語(yǔ)言原理”則進(jìn)一步站在全局的視角系統(tǒng)闡述了編程語(yǔ)言及其范式理論。

圖2 牛津大學(xué)計(jì)算機(jī)科學(xué)專業(yè)必修課表
無(wú)獨(dú)有偶,帝國(guó)理工學(xué)院計(jì)算機(jī)本科教育在課程設(shè)置中也全面施行了多范式編程教學(xué),圖3 顯示了該校計(jì)算機(jī)本科專業(yè)一年級(jí)的“計(jì)算機(jī)實(shí)踐”的課程列表,其中“Haskell 函數(shù)式編程”,“Kotlin 函數(shù)式和面向過程編程”,“Kotlin 和Java 面向?qū)ο缶幊獭钡榷际且荒昙?jí)學(xué)生的必修課程。教授邏輯式范式的“Prolog導(dǎo)論”也出現(xiàn)在二年級(jí)的春季學(xué)期必修課程列表中。

圖3 帝國(guó)理工學(xué)院計(jì)算機(jī)科學(xué)專業(yè)必修課表
由此可見,諸如牛津大學(xué)及帝國(guó)理工學(xué)院這類世界一流大學(xué)計(jì)算機(jī)科學(xué)專業(yè)本科教育,基本囊括了所有的編程范式,反映了世界一流大學(xué)計(jì)算機(jī)科學(xué)專業(yè)對(duì)多范式編程教學(xué)及人才培養(yǎng)的重視。國(guó)內(nèi)高校編程教育模式應(yīng)多借鑒他們的編程教學(xué)方法。
在借鑒國(guó)外一流高校計(jì)算機(jī)本科編程教育做法的基礎(chǔ)上,我們提出了多范式編程教學(xué)新模式,如圖4所示。它的重點(diǎn)不在于介紹個(gè)別課程的教學(xué),而在于通過專業(yè)培養(yǎng)計(jì)劃修訂思路來(lái)實(shí)踐我們的多范式編程教學(xué)。其思路主要包含以下三個(gè)方面。

圖4 多范式編程范式教學(xué)模式
“離散數(shù)學(xué)”作為計(jì)算機(jī)科學(xué)專業(yè)學(xué)生的必修數(shù)學(xué)課,其中數(shù)理邏輯及圖論的部分內(nèi)容比較抽象且難度較高,不易被學(xué)生掌握,Prolog恰好是一種建立在邏輯學(xué)理論基礎(chǔ)之上的語(yǔ)言,通過在離散數(shù)學(xué)教學(xué)中引入Prolog可簡(jiǎn)化學(xué)生對(duì)于命題邏輯及一階謂詞邏輯等概念的理解和掌握。還能通過Prolog程序快速的模擬并驗(yàn)證邏輯推導(dǎo)的全過程。學(xué)生在學(xué)習(xí)數(shù)理邏輯的同時(shí)也學(xué)習(xí)了以邏輯式范式思維解決問題的能力,達(dá)到了事半功倍的效果。此外,Prolog 語(yǔ)言還廣泛應(yīng)用在人工智能的研究中,可以用來(lái)建造專家系統(tǒng)、自然語(yǔ)言理解、智能知識(shí)庫(kù)等。在“人工智能基礎(chǔ)”課程引入Prolog語(yǔ)言,可以簡(jiǎn)化課程理解難度,更好呈現(xiàn)課程內(nèi)容。
從大學(xué)一年級(jí)開始為新生提供多范式編程經(jīng)驗(yàn)。選擇“Python程序設(shè)計(jì)”作為教授多范式編程的第一門編程課程,Python作為一種多范式語(yǔ)言兼有面向過程,面向?qū)ο蠹昂瘮?shù)式的特性。在Python 教學(xué)過程中,先講授如何使用Python 進(jìn)行面向過程編程,然后,當(dāng)更復(fù)雜的程序需要進(jìn)行數(shù)據(jù)及類型抽象時(shí),自然地引入面向?qū)ο笏季S。接著,由遞歸的概念及實(shí)踐引出高階函數(shù),從而教授與數(shù)學(xué)思維接近的函數(shù)式編程風(fēng)格。最后通過將多個(gè)實(shí)例分別由這三種范式實(shí)現(xiàn)代碼,從思想和代碼層面對(duì)三種范式進(jìn)行對(duì)比和比較,生動(dòng)直觀地向?qū)W生展示不同范式解決同一問題的思考方式和哲學(xué)思想。我們還在后續(xù)專業(yè)課“圖像與視頻處理”課程中使用Python 語(yǔ)言實(shí)現(xiàn)各種算法,將枯燥理論知識(shí)與Python 簡(jiǎn)單易懂的代碼方式相結(jié)合,檢測(cè)了學(xué)生Python多范式編程的能力。
由于受課時(shí)影響,將所有的編程范式語(yǔ)言都囊括在計(jì)算機(jī)科學(xué)專業(yè)本科課程中是不現(xiàn)實(shí)的,但可以間接地將四種主要編程范式的思想及內(nèi)容嵌入到其他專業(yè)核心課程中,具體措施如下:
首先,“C 程序設(shè)計(jì)”課程是高校計(jì)算機(jī)專業(yè)的必修入門課程。C 語(yǔ)言是一個(gè)典型的面向過程范式語(yǔ)言,為了還原C語(yǔ)言教學(xué)目的的本質(zhì),在教學(xué)中全面結(jié)合面向過程范式的思想,著重培養(yǎng)給學(xué)生以面向過程思維思考問題的方式,避免C語(yǔ)言教學(xué)陷入語(yǔ)法陷阱。
其次,“C++程序設(shè)計(jì)”和“Java 程序設(shè)計(jì)”是面向?qū)ο缶幊陶n程,擔(dān)負(fù)著將面向?qū)ο蠓妒降乃枷肴谌刖幊探虒W(xué)的任務(wù)。這兩門課不僅要涵蓋面向?qū)ο蠡靖拍睿€要涵蓋如單繼承、多繼承、多態(tài)和抽象接口等高級(jí)面向?qū)ο笾黝}。將對(duì)象優(yōu)先思想方法全面在“C++程序設(shè)計(jì)”和“Java 程序設(shè)計(jì)”課程中推行,增強(qiáng)學(xué)生面向?qū)ο笏季S能力。“設(shè)計(jì)模式”是軟件開發(fā)人員在面向?qū)ο筌浖_發(fā)過程中面臨的一般問題的解決方案,是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。在“設(shè)計(jì)模式”課程中通過對(duì)二十三種經(jīng)典設(shè)計(jì)模式的教授并結(jié)合實(shí)例,進(jìn)一步讓學(xué)生對(duì)面向?qū)ο蠓妒接懈钊牒椭庇^的理解。
再次,在“數(shù)據(jù)結(jié)構(gòu)”課程中引入函數(shù)式編程范式,嵌入函數(shù)式范式的Haskell語(yǔ)言可以更好地呈現(xiàn)課程內(nèi)容和簡(jiǎn)化課程難度,比如結(jié)合Haskell中的遞歸和折疊函數(shù)等重要的計(jì)算思維講授遍歷和排序問題,在簡(jiǎn)化了數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)難度的同時(shí)教授了函數(shù)式范式思想,拓寬了學(xué)生的視野。
我校計(jì)算機(jī)科學(xué)大類包括數(shù)字媒體技術(shù)、軟件工程和網(wǎng)絡(luò)工程這三大專業(yè),其中數(shù)字媒體技術(shù)專業(yè)學(xué)生480 人,軟件工程專業(yè)學(xué)生320 人,網(wǎng)絡(luò)工程專業(yè)學(xué)生320 人。多范式編程教學(xué)新模式從我校19 級(jí)數(shù)字媒體技術(shù)專業(yè)開始進(jìn)行試點(diǎn)。通過近二年的探索與實(shí)踐,學(xué)生的算法設(shè)計(jì)及綜合開發(fā)能力有了一定的提升,主要表現(xiàn)在:
在每年的編程能力比賽中,教改試點(diǎn)的數(shù)技專業(yè)學(xué)生在前50 名中占37 人,遠(yuǎn)比軟工和網(wǎng)工專業(yè)(10人和3 人)人數(shù)多。且數(shù)技專業(yè)的學(xué)生能較好地選擇并靈活地使用合適的編程范式來(lái)解答競(jìng)賽試題。在教改試點(diǎn)前的2017-2019 年,我院參加浙江省藍(lán)橋杯獲獎(jiǎng)人數(shù)約每年6 人左右,到了2021 年,獲獎(jiǎng)人數(shù)已增加到22人。
通過對(duì)比數(shù)技專業(yè)教改前后近兩年的“數(shù)據(jù)結(jié)構(gòu)”和“離散數(shù)學(xué)”的學(xué)生期末成績(jī)數(shù)據(jù),在期末試卷難度相近的情況下,經(jīng)過函數(shù)式和邏輯式范式教學(xué)的學(xué)生的成績(jī)普遍優(yōu)于沒有融合編程范式教學(xué)的其他專業(yè)學(xué)生,各班平均成績(jī)大約提高4-10分。
程序設(shè)計(jì)競(jìng)賽考察的是學(xué)生的算法設(shè)計(jì)實(shí)現(xiàn)能力,而通過作品參加各類學(xué)科競(jìng)賽和專業(yè)大賽則考察的是學(xué)生的分工協(xié)作、語(yǔ)言表達(dá)和項(xiàng)目開發(fā)能力。2020 年全院六個(gè)工科專業(yè)參加各類學(xué)科競(jìng)賽和專業(yè)大賽省級(jí)以上獲獎(jiǎng)104 人次,其中數(shù)技專業(yè)學(xué)生獲獎(jiǎng)23 人次,僅2021 年上半年就已達(dá)113 人次,數(shù)技專業(yè)學(xué)生獲獎(jiǎng)達(dá)31人次。
在編程課程中引入多范式編程教學(xué)新模式是今后編程類課程未來(lái)發(fā)展的大勢(shì)所趨。計(jì)算機(jī)科學(xué)專業(yè)的本科生應(yīng)當(dāng)對(duì)主要編程范式有一定了解和掌握,以便更好從事專業(yè)工作。多范式編程教學(xué)新模式突破了傳統(tǒng)程編程類課程的理念,提高編程教學(xué)的科學(xué)性和有效性,同時(shí)也拓闊了學(xué)生的視野及思維方式,提升了學(xué)生的就業(yè)競(jìng)爭(zhēng)力。