蔣運承,詹捷宇,馬文俊
(華南師范大學 計算機學院,廣東 廣州 510631)
離散數學[1]是計算機專業(計算機科學與技術、軟件工程、網絡工程等)本科生必修的基礎課程之一,為多門后續課程(如數據結構、算法設計與分析、編譯原理、數據庫原理、人工智能等)提供數學基礎,可見離散數學對計算機專業本科生來說是一門非常重要、非?;A的課程。然而,作為一門較為理論的課程,離散數學同其他理論性課程一樣,在教學過程中遇到一個非常麻煩的問題:部分學生沒有太大的興趣。筆者基于近年來離散數學相關課程(包括離散數學、數理邏輯、計算理論等)方面的教學經歷(包括本科生和研究生)對上述問題形成的原因進行了一些分析和總結。
從教師的角度來看,部分教師的教學方法和手段以及教學理念可能存在一些問題。關于教學方法和手段,由于授課時間很緊,而課程內容多,課堂上不可能講授所有的內容,因此教師在授課時只能講授一些基本內容,剩下的內容留給學生課后自學或作為作業。關于教學理念,教師往往強調的是離散數學作為一門理論性課程,是為今后學習其他課程打基礎,掌握好教材內容最為關鍵,至于離散數學具體有什么用、如何將離散數學與實際生活結合起來,授課時涉及甚少。
從學生的角度來看,部分學生在腦海中或許存在這樣一個觀念:學習離散數學用處不大,至少對就業沒有直接用處。這種觀念的形成也是基于一些現實的情況,如相比計算機應用方向,理論計算機科學專業的學生(特別是研究生)招收數量較少,理論計算機科學方向的畢業生就業的難度較大。在這種觀念的影響下,學生很難投入熱情學習離散數學,并且離散數學部分內容較為抽象、枯燥,導致學生沒有學習離散數學的激情。
造成這種現象,責任并不全在教師和學生。目前高校的離散數學教材設計、教學計劃、考試安排具有較為固定的模式,作為任課教師,必須按照既定計劃授課,否則無法完成教學任務,靈活性較差。作為學生,考試內容是固定的,他們必須按照計劃掌握教學大綱上的每個知識點,否則很難通過考試。
計算思維[2-3]建立在計算過程的能力和限制之上,由人由機器執行。它是每個人的基本技能,不僅僅屬于計算機科學家,解析能力的培養應當是每個學生不僅掌握閱讀、寫作和算術,還要學會計算思維。計算思維是運用計算機科學的基礎概念求解問題、設計系統和理解人類的行為,涵蓋計算機科學之廣度的一系列思維活動。
計算機科學是計算的學問——什么是可計算的,怎樣去計算[4]。計算思維直面機器智能的不解之謎:什么人類比計算機做得好?什么計算機比人類做得好?最基本的問題是什么是可計算的,因此計算思維具有如下特性[2]:概念化,不是程序化。像計算機科學家那樣思維意味著遠不止進行計算機編程,還能夠進行多個層次上的抽象思維。
是根本的,不是刻板的技能。根本技能是每一個人為了在現代社會中發揮職能所必須具備的,而刻板技能意味著機械的重復。
是人的,不是計算機的思維方式。計算思維是人類求解問題的一條途徑,但決非要使人類像計算機那樣思考。
數學和工程思維的互補與融合。計算機科學在本質上源自數學思維,又從本質上源自工程思維。
是思想,不是人造物。以物理形式到處呈現并時時刻刻觸及人的生活的不只是我們生產的軟件、硬件等人造物,更重要的是被用以接近和求解問題、管理日常生活、與他人交流和互動的計算概念。
面向所有的人,所有地方。當計算思維真正融入人類活動的整體以致不再表現為一種顯式之哲學的時候,它就將成為一種現實。
可以看出,計算思維的重要性在于它關系到對計算機科學的轉型與發展之基本認識[5]。對高校計算機專業教學工作者來說,計算思維可以提供一個全新的教學視角[6]:一個與目前計算機專業課程教學有本質不同的教學模式,以克服當前高校計算機專業教學中面臨的各種難以解決的問題,這也說明培養和提高學生計算思維的能力是時代賦予的不可推卸的責任。
離散數學是一門理論性課程,不能被學生直接應用于軟件開發(或編程),如何說服學生認可學習離散數學,或許是離散數學課程教學工作者不可回避的重要問題,解決這個問題首先要有一個正確的教學理念。
目前學生在學習離散數學時很難發現它的有用之處,主要原因是高校一般在大一下學期或大二上學期開設離散數學課程,而大一下學期或大二上學期的學生對計算機的認識主要停留在操作和簡單編程層面,即對于計算機編程,主要學習初級的編程語言,如C語言、Visual Basic、Python等,即使學習了C++或Java等主流編程語言,也沒有進行大型軟件開發的實踐,這樣學生在離散數學和編程語言(特別是軟件開發實踐)之間確實找不出關聯。學生學習編程語言,可以用它編寫自己感興趣的程序,有立竿見影的效果,非常有成就感,自然學習興趣濃厚,但對于離散數學,特別是數理邏輯、代數結構、集合論等內容,學生學習的是抽象的符號和定理,再加上離散數學的一些內容(如數理邏輯中的可靠性和完備性、代數結構中群和環的性質等)相對抽象、枯燥,部分學生因為難以理解而沒有興趣。因此,要從計算思維的層面培養學生、講授離散數學課程,讓學生認可學習離散數學,并且非學好不可,從而激發學生學習離散數學的興趣和激情。
目前離散數學課程的教材一般包括4部分經典內容:數理邏輯、集合論、代數結構和圖論,有些教材還把數論、組合數學甚至概率論等內容也納入教材。離散數學教材內容的選擇除了必須包含數理邏輯、集合論、代數結構和圖論以外,還可以考慮適當增加部分計算理論的內容,至于數論、組合數學和概率論,因為一般的高校都開設了相應的選修課,所以建議不納入離散數學教材。由于教材內容很多,主要講解一些基本概念和性質,因此還可以引入一些簡單的實例進行輔助說明,但受課堂教學時間限制,教材上不可能大篇幅地闡述應用實例,為了激發學生的學習興趣,有必要編寫一本離散數學課外讀物教材,專門詳細闡述離散數學每個內容的實際應用,如數理邏輯與人工智能、群論與軟件工程、集合論與信息檢索、圖論與社交網絡等,也就是說,離散數學授課需要兩本教材:離散數學教材和離散數學課外讀物教材。
由于同一本教材要面對不同層次的學生,因而對每一部分(數理邏輯、集合論、代數結構、圖論、計算理論、實際應用課外讀物)都要精心組織,除了必講內容外,還要有一些選講內容,由任課教師根據實際情況靈活授課。內容選取上,課外讀物教材的內容相對容易組織,對每個知識點可以選取幾個不同難度的實例,難度大的實例可以作為選講內容,如對于數理邏輯,可以選取定理自動證明、電路設計、智能決策、模型檢測、軟件測試等實際應用;對于圖論,可以選取TSP(旅行商、貨郎擔)問題、最優路徑、社交網絡、圖數據等實際應用。離散數學授課教材主要包括5個部分:數理邏輯、集合論、代數結構、圖論和計算理論,每個部分都要圍繞它的核心內容展開。數理邏輯的核心內容是可靠性和完備性,集合論的核心內容是自然數、基數和序數,代數結構的核心內容是群和環的性質,圖論的核心內容是各種圖的性質,計算理論的核心內容是可計算性(可判定性)。
以數理邏輯和計算理論為例,教材內容要講清楚數理邏輯中的可靠性和完備性,需要引入數理邏輯的一些基本概念和預備知識,一般都是圍繞命題邏輯和謂詞邏輯展開,甚至還包括邏輯程序設計、模態邏輯、時態邏輯等方面的基本知識,由于內容很多,因此很少詳細講解數理邏輯的應用。如果按照現在的教學模式,這樣的教材確實是好教材,因為能為學生提供豐富的數理邏輯方面的基礎知識。從筆者自身體會來說,數理邏輯的學習對筆者開展的項目研究(智能軟件理論與技術、語義計算、數據科學等)具有極大的好處,可以說,沒有好的數理邏輯基礎,現在的研究工作便很難深入進行,但這種體會是從事項目研究后才有的,如何讓大一或大二的學生認識到數理邏輯確實有用是需要考慮的問題。
首先,應讓學生閱讀離散數學課外讀物教材(含多個通俗易懂的數理邏輯方面的實際應用案例);其次,要有適應計算思維的教材。這樣的教材除了包含傳統數理邏輯課程教材的內容外,還應該講解數理邏輯中一些簡單的實際應用。一種比較原始的想法是可以將目前許多人工智能課程中的內容,如知識表示、歸結原理、定理證明、專家系統等,以一種易于理解的方式融入數理邏輯教材;也可以將其他相關內容,如程序驗證、模型檢測、軟件測試等,融入數理邏輯教材。具體的融合方式以人工智能方面的內容為例,在講解每個數理邏輯知識點后,可以把相關的實際應用放在后面介紹,如在講完合取范式和析取范式后可以引入歸結原理的介紹,并給出實際應用(如平面幾何的定理證明)。值得注意的是,所有實際應用應該能串聯成一個整體,也就是說,通過教材上的實例,學生能了解數理邏輯在人工智能領域中是如何具體得到應用的。
計算理論方面,要講清楚計算理論的核心內容可計算性(可判定性),也需要引入計算理論的一些基本概念,包括有限自動機、正則語言、下推自動機、上下文無關語言、圖靈機等,進而講述圖靈可計算(可判定)。這些內容有一定的難度,由于授課內容有限,教材主要闡述基本概念和性質,很難詳細講解這些內容背后的應用。跟組織數理邏輯的內容相似,在講解每個計算理論知識點后,可以把相關的實際應用放在后面介紹,如講解完有限自動機后可以適當介紹自動機在服務計算、行為描述、密碼學與信息安全、模式識別等方面的簡單應用;闡述完下推自動機后可以給出它在程序編譯等方面的實際應用。
這樣的教材最明顯的好處就是讓學生知道離散數學是有用的,同時也大大擴充學生的知識面。計算思維能力的培養,首先需要廣闊的知識面。如果大一學生能了解一些人工智能領域的知識,如知識表示與推理、機器學習、深度學習,他們可能會將遇到的問題進行抽象建模并進行智能化處理(從算法設計到軟件實現),或者研發一些智能化的游戲小程序等。
首先是課堂教學。課堂教學采用多媒體和黑板相結合的手段,離散數學的內容很多,特別是增加實際應用知識后,如何在有限的時間里講授較多知識是授課教師需要面對的問題。
大學生具備了一定的自學和實踐能力,因此可以采用啟發式的教學方法,也就是說,在課堂上簡明扼要地講授離散數學每個知識點的基本概念,重點講授重要結論(定理)的證明思路,并且針對一個知識點要詳細講授結論的證明過程,最后給學生介紹該知識點的應用。值得注意的地方是重要結論的證明思路和證明過程一定要講透徹,因為這部分內容對學生來說很難、很抽象,部分學生自學有相當的難度,并且沒有太大的興趣。至于知識點的應用,應該以啟發為主,大概介紹該實際應用的背景和現狀以及大體的應用思路,因為學生一般對應用感興趣,可以讓學生課后完成。例如,當講述一階邏輯可以用來做知識表示時,首先可以向學生簡單介紹傳統知識表示的方法(如框架、語義網絡、規則、概念圖、劇本等)以及當前新的知識表示方法(如描述邏輯、本體、知識圖譜等),然后以引導的方式為學生介紹一階邏輯如何具體應用于知識表示,并給出一些實際生活中的實例。值得一提的是,可以適當采用一些最新的教學模式組織教學(翻轉課堂式教學),如將有難度的知識點錄制成視頻,形成在線課程(或慕課),學生可以在課前事先自學,課堂上教師適當講解并進行討論。
啟發式教學或翻轉課堂式教學確實可以培養和提高學生計算思維的能力,因為計算思維本身是思想,不是人造物。也就是說,在課堂上給學生重點講授的是學習方法、關鍵結論,而不是所有知識點,特別是當實際應用知識被介紹后(如人工智能、信息安全、信息檢索、模式識別等),學生可以了解計算機是如何“思考”的;有了學習方法(思想)后,學生可以在課后自學感興趣的知識點。
其次是課后教學。由于離散數學是理論性課程,因此目前大部分課后教學一般是通過布置習題作業實現,并且每個學生做的作業是相同的。這樣做至少可以讓學生在課后鞏固課堂上所學的知識點,但現實情況也有不好的一面,存在部分學生抄襲的現象,而主要原因還是這些學生對離散數學興趣不大,不愿意在課程上花時間。
計算思維采用抽象和分解來迎戰龐雜的任務或者設計巨大復雜的系統,是數學和工程思維的互補與融合。很明顯,為了培養學生計算思維的能力,課后除了為學生布置一定的傳統習題(特別是證明題)以外,還應該讓學生組成3~5人的小團隊,以團隊的形式進行一些應用性習題的練習,如在數理邏輯方面,課后可以要求學生利用一階邏輯來形式化表示一些平面幾何定理,并用計算機自動證明一些定理;還可以要求學生掌握一些自動推理工具,結合專家系統應用,了解如何利用一階邏輯構建知識庫,并利用推理工具進行自動推理;對于基礎好的學生,可以讓他們課后開發一個自動推理工具,實現教材上的一些理論(如合取范式、析取方式、子句、置換、合一等),因為實現這些推理工具可以用C語言編程,基礎好的學生是完全有可能做到的。圖論方面可以要求學生編程實現TSP、最優路徑、社交網絡等實際問題。
最后,需要強調的是教師課后仍然還有任務,除了上面提到的錄制講解知識點的小視頻以外,還要在在線課程網站上跟學生互動,一方面幫助學生解決課后遇到的各種問題(包括理論問題和技術問題),另一方面還要主動為學生提供一些跟授課進度相同的實際問題,組織學生網上討論交流。
計算思維是每個大學生需要具備的基本技能,培養學生計算思維的能力是時代賦予高校計算機課程教學工作者不可推卸的責任。要培養學生計算思維的能力,方法之一就是要對目前計算機專業課程的教學內容進行整理,并采用與計算思維相適應的教學模式。我們針對離散數學課程教學中存在的問題,從計算思維的角度提出了一種新的教學模式,包括教學理念、教材編寫和教學過程。由于計算思維是一門新興的研究課題,如何從計算思維的角度進行教學是一個值得深入探討的重大課題。