陳建文
(哈爾濱工業(yè)大學(xué)計算機科學(xué)與技術(shù)學(xué)院,黑龍江哈爾濱150001)
前耶魯大學(xué)校長理查德·萊文在談到大學(xué)教育的本質(zhì)時曾指出:“大學(xué)教育的目的不是傳授知識和技能,卻能夠讓人勝任任何學(xué)科和職業(yè)?!痹谌R文看來,大學(xué)教育的核心在通識。目前,程序設(shè)計課程已經(jīng)成為當(dāng)代大學(xué)生最重要的通識類課程之一。這就提出了一個問題:程序設(shè)計課程的教學(xué)目的是什么?是傳授知識,還是傳授技能?筆者認(rèn)為,這兩者都不是程序設(shè)計課程的目的所在。正如喬布斯所說,學(xué)習(xí)編程教會一個人如何思考,每個人都應(yīng)該學(xué)習(xí)一門編程語言。筆者認(rèn)為,程序設(shè)計課程教學(xué)目的之核心在于教會大學(xué)生如何思考,就像學(xué)習(xí)《幾何原本》一樣,學(xué)習(xí)程序設(shè)計的目的是提升思維能力。
精心設(shè)計好課程的邏輯組織,使學(xué)生在學(xué)習(xí)的過程中真正體會到C語言的邏輯之美,是提升學(xué)生思維能力的必要前提。
《幾何原本》對包括牛頓、愛因斯坦等一大批的科學(xué)家產(chǎn)生了深遠(yuǎn)的影響,主要是源于其邏輯體系的構(gòu)建。目前,學(xué)生在進(jìn)入大學(xué)之前雖然學(xué)習(xí)了幾何學(xué)的內(nèi)容,但很少有學(xué)生能夠領(lǐng)略《幾何原本》中邏輯體系的思想,其主要原因是中學(xué)時期學(xué)生的邏輯思維能力還不夠成熟。大學(xué)一年級恰恰是訓(xùn)練大學(xué)生思維能力的最佳時期。程序設(shè)計課程在提升大學(xué)生的思維能力方面發(fā)揮著重要的作用。
文獻(xiàn)[1]中所確立的授課內(nèi)容的邏輯組織仍然是程序設(shè)計課程中內(nèi)容邏輯組織的最佳范本。筆者在此基礎(chǔ)上稍加修改,使之更適合初學(xué)者,修改后的教學(xué)內(nèi)容如下:
第一部分:初識C語言;
第二部分:數(shù)據(jù)類型、運算符和表達(dá)式;
第三部分:控制流語句;
第四部分:函數(shù)與程序結(jié)構(gòu);
第五部分:數(shù)組;
第六部分:指針;
第七部分:結(jié)構(gòu)體;
第八部分:文件輸入輸出。
《幾何原本》在5條公理的基礎(chǔ)上推導(dǎo)出整個歐式幾何學(xué)所有的定理,這種邏輯體系的思想在C語言中也得到很好的展現(xiàn)。通過課程內(nèi)容的邏輯組織,學(xué)生認(rèn)識到C語言在很少語法規(guī)則的基礎(chǔ)上卻能夠描述豐富的程序邏輯,是提升學(xué)生思維能力的關(guān)鍵所在。學(xué)習(xí)知識并不是程序設(shè)計課程的關(guān)鍵,學(xué)會利用有限的知識解決復(fù)雜的問題才是程序設(shè)計課程的關(guān)鍵所在,也是提升大學(xué)生思維能力的關(guān)鍵所在。例如,關(guān)于函數(shù)的參數(shù)傳遞,不同的教科書中有按值傳遞、數(shù)組作為函數(shù)參數(shù)、按地址傳遞等不同的說法。然而,用C語言原作者的話說,C語言只支持按值傳遞一種參數(shù)傳遞方式。在這個問題上,在課程的內(nèi)容組織上讓學(xué)生理解C語言只支持按值傳遞,只通過按值傳遞一種參數(shù)傳遞方式就能夠?qū)崿F(xiàn)豐富多樣的參數(shù)傳遞功能,才能準(zhǔn)確地把握C語言參數(shù)傳遞的本質(zhì)。在這個過程中,邏輯發(fā)揮著至關(guān)重要的作用。再比如,指針是C程序設(shè)計語言的難點,在指針這一部分,讓學(xué)生首先把握指針變量是用來存放變量地址的變量這個基本概念,然后把握如何訪問一個變量的地址、如何通過指針變量訪問它所指向的變量這些有限的語法規(guī)則,就可以表達(dá)豐富的程序邏輯,并在此基礎(chǔ)上理清指針與數(shù)組、指針與字符串的關(guān)系。理清各個語法規(guī)則的邏輯關(guān)系,是把握指針這一部分的關(guān)鍵所在,也是提升學(xué)生思維能力的關(guān)鍵所在。
C語言的成功與其清晰的邏輯表達(dá)是分不開的。理清程序設(shè)計課程各個部分的邏輯關(guān)系,是利用有限的學(xué)時使學(xué)生把握程序設(shè)計的本質(zhì)、提升思維能力的關(guān)鍵所在。
(4)創(chuàng)客敢于實踐。實踐是檢驗真理的唯一標(biāo)準(zhǔn),只有將自身想法付諸于行動,并用實踐行動來檢驗自身的想法是否正確,這樣的一類人才能成為創(chuàng)客。
選取好的代碼實例,使學(xué)生在閱讀規(guī)范的C語言代碼過程中真正領(lǐng)略到C語言代碼的邏輯之美,可以使學(xué)生的思維能力在理解代碼的過程中得到最有效的訓(xùn)練。
南宋理學(xué)家朱熹曾說:“模擬者,古人用功之法。讀得韓文熟,便做韓文的文法;讀得蘇文熟,便做蘇文的文法?!笨梢姡7率菍W(xué)習(xí)的重要手段。許多學(xué)生大學(xué)學(xué)習(xí)了C語言程序設(shè)計之后,仍然不會寫程序,最主要的原因是缺少模仿規(guī)范的C語言代碼的環(huán)節(jié)。我們在講解具體的語法規(guī)則時,用了一些小的示例代碼。例如,在講解循環(huán)結(jié)構(gòu)時,用了銀行等額本息和等額本金的利息計算示例。我們發(fā)現(xiàn),借助于這些小的示例代碼把握C語言的語法規(guī)則之后,在課堂上與學(xué)生共同閱讀一個完整、規(guī)范的C語言程序,是教會學(xué)生寫程序的最關(guān)鍵的一個環(huán)節(jié)。我們選取了文獻(xiàn)[2]中簡單線性回歸的源代碼與學(xué)生一起在課堂上閱讀。通過閱讀代碼,學(xué)生對于如何利用C語言的語法規(guī)則構(gòu)建一個完整的應(yīng)用程序有了很好的把握。我們還推薦學(xué)生課后自己閱讀文獻(xiàn)[2]中方程求根、函數(shù)求極值、排序等方面的源代碼。在閱讀這些代碼的過程中,學(xué)生對如何將正在學(xué)習(xí)的線性代數(shù)、微積分等課程的理論轉(zhuǎn)變成解決現(xiàn)實問題的程序有了深刻的理解。
模仿規(guī)范的代碼之后,我們指導(dǎo)學(xué)生用C語言實現(xiàn)了穩(wěn)定婚姻匹配問題[3]。在利用C語言實現(xiàn)穩(wěn)定婚姻匹配算法的過程中,用到數(shù)組、指針甚至鏈表等知識點,使學(xué)生在模仿他人代碼的基礎(chǔ)上體會到自己編寫程序解決問題的樂趣,在不知不覺中提升思維能力。此外,我們還講解了PageRank算法[4]的原理,與學(xué)生一起對如何用C語言表達(dá)PageRank算法的邏輯進(jìn)行探討和程序示范,使得學(xué)生對如何利用C語言表達(dá)搜索引擎的程序邏輯有了深刻的理解,也讓學(xué)生理解了Google、百度等搜索引擎的本質(zhì)。
MOOC教學(xué)與SPOC教學(xué)是課堂教學(xué)的有力補充。MOOC指的是MassiveOpenOnline Course,對全社會開放;SPOC指的是Small PrivateOnlineCourse,僅對本校學(xué)生開放。理清課堂教學(xué)和MOOC教學(xué)與SPOC教學(xué)的關(guān)系,充分發(fā)揮各自的優(yōu)勢,是利用好MOOC教學(xué)與SPOC教學(xué)的關(guān)鍵。課堂教學(xué)的優(yōu)勢在于便于與學(xué)生交流互動,MOOC教學(xué)的優(yōu)勢在于學(xué)生可以根據(jù)自身的學(xué)習(xí)情況適時安排和控制學(xué)習(xí),SPOC教學(xué)的優(yōu)勢在于學(xué)生在看視頻短片時可以自主選擇停下來思考,沒看懂的可以倒退反復(fù)觀看;同時,MOOC教學(xué)與SPOC教學(xué)的課程內(nèi)容可以永久存檔,方便隨時復(fù)習(xí)。
MOOC教學(xué)的邏輯組織與課堂教學(xué)的邏輯組織是相對獨立的。課堂教學(xué)自成體系,MOOC教學(xué)也是自成體系,兩者可以分開來學(xué),又可以相互補充。對于課堂上需要擴展的知識點,則是通過視頻短片的形式放在SPOC中供大家課后進(jìn)一步學(xué)習(xí)。
翻轉(zhuǎn)課堂教學(xué)是提高學(xué)生學(xué)習(xí)積極性的重要手段。每名學(xué)生在課程的最后都需要用C語言做一個項目,撰寫實驗報告,并且在課堂上與大家分享自己所做的項目及心得體會。對于所做的項目內(nèi)容沒有任何限制,每名學(xué)生都可以自由選取。事實證明,對項目的內(nèi)容不加限制是正確的,這給了學(xué)生最大的發(fā)揮空間。
有名學(xué)生給筆者發(fā)郵件說:“老師您好,我的實驗大作業(yè)是一個幫助媽媽理賬的小程序,希望能夠有機會參加翻轉(zhuǎn)課堂,和大家分享我的程序?!庇械膶W(xué)生做的是關(guān)于航道規(guī)劃的程序。學(xué)生在利用C語言解決一個實際問題的過程中,會積極與老師和同學(xué)交流以解決所遇到的困難,并精心準(zhǔn)備在同學(xué)面前的展示。每名學(xué)生的思維都在這個從開始著手解決問題到最后在同學(xué)面前展示自己成果的過程中得到了升華。
著名作家、思想家列夫·尼古拉耶維奇·托爾斯泰曾說:“知識,只有當(dāng)它靠積極的思維得來,而不是憑記憶得來的時候,才是真正的知識?!盋語言程序設(shè)計本身的特殊性能夠為學(xué)生思維的訓(xùn)練提供有利的前提和基礎(chǔ)。學(xué)生在利用C語言解決自己感興趣的實際問題的過程中,可以真正理解C語言的全貌,體會C語言的魅力,提高自主探究的思維。翻轉(zhuǎn)課堂可以全面提升課堂上老師與學(xué)生之間、學(xué)生與學(xué)生之間的交流互動。每名學(xué)生都可以站在講臺上分享自己的程序,在從自己會到給其他同學(xué)講明白的過程中,其分析、綜合、論證的邏輯思維和表達(dá)能力得到很大的提高;作為聽眾的其他同學(xué)則通過翻轉(zhuǎn)課堂看到主講人身上的優(yōu)點??鬃釉疲骸叭诵?,必有我?guī)熝?。”傳統(tǒng)教學(xué)中是講臺上的一位老師,而翻轉(zhuǎn)課堂則讓每名學(xué)生都可以貢獻(xiàn)智慧并成為別人的老師。
程序設(shè)計課程的教學(xué)目的不僅僅是讓學(xué)生掌握一門程序設(shè)計語言的語法規(guī)則,而是培養(yǎng)學(xué)生利用程序設(shè)計語言解決問題的能力,教會學(xué)生如何思考。最后,每名學(xué)生能夠利用C語言解決一個實際的問題,并在課堂上與大家分享,又能夠聆聽其他同學(xué)的經(jīng)驗,取長補短。因此,翻轉(zhuǎn)課堂是實現(xiàn)教學(xué)目標(biāo)的核心環(huán)節(jié)。在實現(xiàn)這個環(huán)節(jié)的過程中,也有學(xué)生提出問題。例如,針對每名學(xué)生自己選擇的項目,具體的評分細(xì)則是怎樣的?許多學(xué)生已經(jīng)適應(yīng)了傳統(tǒng)的考核方法——預(yù)先設(shè)計好項目由學(xué)生實現(xiàn),實現(xiàn)項目相應(yīng)的功能就給相應(yīng)的分?jǐn)?shù)。筆者認(rèn)為,由學(xué)生按照自己的興趣選擇項目,能夠更好地發(fā)揮其想象力,選題的過程本身也是一個思考的過程。
翻轉(zhuǎn)課堂的結(jié)果表明,不同的學(xué)生選擇不同的項目,會更大地激發(fā)學(xué)習(xí)熱情。與由老師指定固定的項目相比,學(xué)生可以真正體會到利用C語言簡單的語法規(guī)則解決多種多樣問題的奧妙,這才是程序設(shè)計課程給予的真正的啟示。關(guān)于評分,考試占50%,平時的程序作業(yè)占25%,最后的項目和課堂翻轉(zhuǎn)占25%,其中項目的代碼部分由老師給出評價,占15%,課堂翻轉(zhuǎn)的成績由學(xué)生投票決定,占10%。關(guān)于如何合理設(shè)計最后的項目和課堂翻轉(zhuǎn)部分的分?jǐn)?shù)比例及其評分細(xì)則,仍然是一個值得思考和探討的問題。
《幾何原本》在一系列公理的基礎(chǔ)之上建立了整個歐式幾何的邏輯體系,給予我們每個人嚴(yán)密的邏輯思維;程序設(shè)計課程在一系列基本語法規(guī)則的基礎(chǔ)上表達(dá)豐富的程序邏輯,同樣可以培養(yǎng)當(dāng)代大學(xué)生嚴(yán)密的邏輯思維能力。讓當(dāng)代大學(xué)生通過程序設(shè)計課程的學(xué)習(xí)提升自己的思維能力,是我們每名講授程序設(shè)計課程的教師共同努力的目標(biāo)。
[1] Kernighan B W, Ritchie D M. The C programming language[M]. 北京: 機械工業(yè)出版社, 2006.
[2] GNU. GSL-GNU scientific library[EB/OL]. [2017-08-04]. http://www.gnu.org/software/gsl/.
[3] Gale D, Shapley L S. College admissions and the stability of marriage[J]. The American Mathematical Monthly, 1962, 69(1): 9-15.
[4] Brin S, Page L. The anatomy of a large–scale hypertextual web search engine[C]//Proc. of the 7th International World Wide Web Conference. New York: ACM, 1999: 107-117.