李駿揚(yáng)
(東南大學(xué) 自動(dòng)化學(xué)院,江蘇 南京 210096)
計(jì)算思維是一種人類通過計(jì)算機(jī)解決問題的思維模式,計(jì)算思維不是計(jì)算機(jī)的思維,而是人類面向計(jì)算機(jī),選擇合適的方式陳述一個(gè)問題,或?qū)σ粋€(gè)問題的相關(guān)方面建模使其易于處理的思維方法[1]。在大學(xué)一年級的計(jì)算機(jī)基礎(chǔ)教學(xué)課程中,計(jì)算思維的培養(yǎng)已經(jīng)成為一種主流[2]。
理工科學(xué)生在計(jì)算機(jī)語言入門的學(xué)習(xí)中會(huì)遇到很多的困難。學(xué)生在編寫第一個(gè)可以運(yùn)行的程序前,其需要掌握的前置語法知識(shí)包括編譯預(yù)處理、變量定義、運(yùn)算符、表達(dá)式、程序結(jié)構(gòu)等。此外,學(xué)生還必須對計(jì)算機(jī)處理問題的方式有所理解,對算法有所理解。眾多前置知識(shí)的學(xué)習(xí)往往會(huì)導(dǎo)致兩方面的問題:首先,在前置學(xué)習(xí)中方向不明,容易喪失學(xué)習(xí)的興趣;其次,后期的學(xué)習(xí)中,任何前置知識(shí)掌握得不牢固,都會(huì)導(dǎo)致編寫程序中出現(xiàn)各種困難,降低學(xué)習(xí)的效率。
基于計(jì)算思維和可執(zhí)行程序框圖的計(jì)算機(jī)語言入門教學(xué)模式是一種全新的教學(xué)模式,它有助于大學(xué)一年級學(xué)生轉(zhuǎn)變思維方式,暫時(shí)屏蔽繁復(fù)語法的干擾,專心于計(jì)算思維與算法的學(xué)習(xí),并從算法基本邏輯出發(fā),逐步過渡到C/C++等語言的學(xué)習(xí)。
C 和C++語言是目前理工科專業(yè)最為普遍采用的計(jì)算機(jī)入門語言,C 語言面向底層,C++具有面向?qū)ο蟮奶卣?,既兼顧自?dòng)化、信息、電子等專業(yè)對硬件底層編程的要求,又能夠應(yīng)對圖像處理、控制方法設(shè)計(jì)、信息處理等算法實(shí)現(xiàn)[3],C++也可以面向桌面,但在移動(dòng)終端、Web 的上層系統(tǒng)編程中就力不從心了。
然而,在教學(xué)中,C 和C++語言卻具有兩面性。一方面,C 和C++面向底層的特性,對指針和內(nèi)存的操作,極好地揭示了計(jì)算機(jī)處理問題的方式,從另一個(gè)側(cè)面展示了程序設(shè)計(jì)的魅力,學(xué)生在精通C 和C++之后,一般都可以輕松學(xué)習(xí)其他的語言;另一方面,過多的新特性的堆積,過多的需要編程者親歷親為且不可疏漏的操作,給初學(xué)者的學(xué)習(xí)帶來了巨大的困難。
Python 語言目前在計(jì)算機(jī)基礎(chǔ)教學(xué)過程中越來越流行,無論是大學(xué)一年級的計(jì)算機(jī)語言入門,還是在中學(xué)生的計(jì)算機(jī)語言教學(xué)中,Python語言越來越廣泛地在教學(xué)中進(jìn)行使用[4]。
Python 語言的優(yōu)勢在于語法簡單,可集成性強(qiáng),但是Python 語言依然無法擺脫語法的束縛,依然需要較多的前置學(xué)習(xí)。
另外,針對理工科學(xué)生,特別是自動(dòng)化、電子、信息類專業(yè)的理工科學(xué)生來說,Python太多地隱藏了計(jì)算機(jī)底層的處理方式,在學(xué)習(xí)Python 語言之后,面對C 和C++語言依然有諸多困難。
圖形化編程平臺(tái)目前廣泛使用在青少年編程教育和一些行業(yè)應(yīng)用中。早期的圖形化編程平臺(tái)主要以流程圖的方式展現(xiàn),如LabView,還有筆者為微波儀器計(jì)量機(jī)構(gòu)開發(fā)的計(jì)量自動(dòng)測試系統(tǒng)。這類軟件平臺(tái)針對的用戶群是某行業(yè)的專業(yè)人士,用戶特點(diǎn)是對本行業(yè)極為精通,但是缺乏專業(yè)代碼能力,因此采用流程圖等圖像化形式快速組態(tài)其需要完成的工程任務(wù)[5]。這類軟件早期也在青少年的編程學(xué)習(xí)中出現(xiàn),如樂高的RTX系統(tǒng)(基于LabView),但此后都被基于程序框圖的EV3 圖形化編程平臺(tái)所替代。
流程圖的優(yōu)勢在于對順序的直觀展現(xiàn),但是在面對條件和循環(huán)時(shí),卻不如N/S 圖等程序框圖表達(dá)那樣具有結(jié)構(gòu)性。目前,面向青少年的編程平臺(tái)大多采用類似N/S 圖的框圖編程。在機(jī)器人領(lǐng)域,比較典型的編程平臺(tái)有樂高的NXT和EV3 平臺(tái)、VEX 的RQ 機(jī)器人編程平臺(tái)等。在通用編程領(lǐng)域,目前使用最廣泛的是MIT 的Scratch 平臺(tái),國內(nèi)也有大量模仿或嵌套Scratch的編程平臺(tái),如Hopscotch、Mixly、網(wǎng)易卡卡、編程貓等[6]。但是,我們在教學(xué)實(shí)踐中發(fā)現(xiàn),純圖形化編程平臺(tái)雖然可以將編程思維導(dǎo)向程序邏輯的思考,但是依然存在以下問題:
第一,為適合青少年的學(xué)習(xí),大多數(shù)圖形化語言界面有低幼化的傾向,其編程界面不適合面向大學(xué)一年級的學(xué)生使用。
第二,對數(shù)學(xué)表達(dá)式的處理過于復(fù)雜,并盡可能避免出現(xiàn)數(shù)學(xué)表達(dá)。由于這些編程平臺(tái)過于游戲化,因此展現(xiàn)算法的能力有限。學(xué)生在轉(zhuǎn)入高級語言學(xué)習(xí)時(shí)依然會(huì)遇到算法的瓶頸。
第三,主要功能的實(shí)現(xiàn)依靠調(diào)用和拼搭,而不是對算法的深入思考,不適合培養(yǎng)具有獨(dú)立思考能力的科研與工程人才。
第四,缺乏程序調(diào)試的手段,面對程序運(yùn)行的錯(cuò)誤,只能靠“看”,而不是單步跟蹤、內(nèi)存檢查等常有的程序調(diào)試方法。
第五,從教學(xué)的角度,這些工具大多缺乏從圖形化語言到普通計(jì)算機(jī)的銜接,由于圖形化編程平臺(tái)的簡易性,部分學(xué)生在面對普通計(jì)算機(jī)語言時(shí)會(huì)顯得畏懼不敢嘗試。
為了更好地結(jié)合教學(xué),筆者自主設(shè)計(jì)了X-Program 可執(zhí)行的程序框圖系統(tǒng),該系統(tǒng)以教學(xué)為出發(fā)點(diǎn),并具有以下特點(diǎn):
第一,系統(tǒng)采用N/S 框圖的方式展現(xiàn)程序,程序的結(jié)構(gòu)直觀清晰。
第二,系統(tǒng)能夠展現(xiàn)內(nèi)存中的所有數(shù)據(jù),學(xué)生能夠通過十進(jìn)制、十六進(jìn)制和二進(jìn)制等多種方式查詢系統(tǒng)的數(shù)據(jù)。
第三,系統(tǒng)能夠單步跟蹤,能夠設(shè)置斷點(diǎn),能夠?qū)崿F(xiàn)在運(yùn)行中對程序的調(diào)試。
第四,對表達(dá)的處理,既可以采用手動(dòng)書寫的模式,讓學(xué)生逐步理解計(jì)算機(jī)中表達(dá)的書寫形式,亦可以直接展示成數(shù)學(xué)公式的形式,但不采用Scratch 用積木組合的形式。
第五,系統(tǒng)可以將偽碼翻譯為常用的計(jì)算機(jī)語言,包括C、C++、Java、Basic、Python、Pascal 等。
程序設(shè)計(jì)的首要問題是程序的“過程性”,以及每個(gè)步驟的“標(biāo)準(zhǔn)化”。X-Program 面向剛?cè)腴T的學(xué)生,采用了一些最基本的步驟和模塊,來展現(xiàn)程序的過程,這些基本模塊包括:
表達(dá)式:書寫一個(gè)可賦值的表達(dá)式
創(chuàng)建數(shù)組:設(shè)定一個(gè)固定長度的數(shù)組
如果:條件語句
計(jì)數(shù)循環(huán):通過計(jì)數(shù)變量的循環(huán)語句
條件循環(huán):符合條件則循環(huán)
跳出循環(huán):結(jié)束并跳出循環(huán)
輸入:輸入語句
輸出:輸出語句
通過這些模塊,就可以非常方便地編寫出大部分C 和C++語言所可以書寫的入門程序。
由這些基礎(chǔ)模塊構(gòu)成的程序如圖1 所示。
在程序設(shè)計(jì)的過程中,存儲(chǔ)器的訪問與程序的過程同等重要。X-Program 采用了三種方式來展示運(yùn)行中的內(nèi)容,包括十進(jìn)制模式、十六進(jìn)制模式和二進(jìn)制模式。
圖2 展示了十進(jìn)制和十六進(jìn)制的數(shù)據(jù)展現(xiàn)形式,其中在十六進(jìn)制中,自動(dòng)區(qū)分了整數(shù)與浮點(diǎn)的整數(shù)表達(dá)。
圖1 求2~1 000 質(zhì)數(shù)的程序示例
圖2 十進(jìn)制和十六進(jìn)制內(nèi)存展示
在二進(jìn)制模式下,系統(tǒng)將根據(jù)自動(dòng)區(qū)分整數(shù)和浮點(diǎn),并展示出不同數(shù)據(jù)在二進(jìn)制中的表達(dá)。在圖3 中,分別展示了布爾型數(shù)據(jù)、整型和雙精度浮點(diǎn)的二進(jìn)制表達(dá)。
圖3 布爾型、整型和浮點(diǎn)數(shù)據(jù)的二進(jìn)制內(nèi)存展示
X-Program 支持一步一步地來運(yùn)行程序,每一步的運(yùn)行,程序都會(huì)自動(dòng)展示出當(dāng)前內(nèi)存的情況,并顯著地標(biāo)出當(dāng)前運(yùn)行的步驟,如圖4 所示。
于此同時(shí),X-Program 也支持設(shè)定斷點(diǎn),程序運(yùn)行到某個(gè)斷點(diǎn)步驟時(shí)將自動(dòng)暫停。另外,當(dāng)程序運(yùn)行暫停時(shí),X-Program 支持對程序的修改,并即刻生效。
圖4 X-Program 單步跟蹤(包括當(dāng)前程序,正在運(yùn)行(暫停)的步驟,當(dāng)前內(nèi)存,以及當(dāng)前輸出的內(nèi)容)
X-Program 為了方便學(xué)生未來從圖像化程序設(shè)計(jì)轉(zhuǎn)向普通的文本程序設(shè)計(jì),設(shè)計(jì)了將框圖程序翻譯成常用計(jì)算機(jī)語言程序,包括C、C++、C#、Java、Basic、Python、Pascal 等。
圖5 和圖6 中展示了X-Program 翻譯成C++語言和Python 語言的結(jié)果。
圖5 X-Program 翻譯為C++程序,并相互對比
圖6 X-Program 翻譯為Python 程序,并相互對比
以X-Program 為工具的在線開放課程(MOOC)“程序設(shè)計(jì)基礎(chǔ)——發(fā)現(xiàn)計(jì)算之美”,已經(jīng)在中國大學(xué)慕課上線,目前完整實(shí)施了兩輪教學(xué)。該課程的主要學(xué)習(xí)目標(biāo)為:能夠描述并設(shè)計(jì)常用的程序設(shè)計(jì)算法,運(yùn)用多種程序的基本結(jié)構(gòu),靈活調(diào)度存儲(chǔ),構(gòu)建基本的數(shù)據(jù)結(jié)構(gòu),分解復(fù)雜問題,并能夠通過X-Program 編寫中小規(guī)模的代碼,解決學(xué)生在高等數(shù)學(xué)、線性代數(shù)、大學(xué)物理等一年級課程中所涉及的一些問題。
該MOOC 教學(xué)安排見表1。
表1 X-Program 線上慕課教學(xué)安排
在教學(xué)設(shè)計(jì)中,提倡使用案例式的教學(xué),而非傳統(tǒng)的從知識(shí)點(diǎn)出發(fā)逐一講解。案例教學(xué)中,從提出案例或問題出發(fā),對問題進(jìn)行分析,然后引出要使用或?qū)W習(xí)的新知識(shí)點(diǎn),然后運(yùn)用新知識(shí)點(diǎn)來完成程序的設(shè)計(jì),并在課程的最后回到案例中來,對程序解決問題的效果、執(zhí)行的效率進(jìn)行進(jìn)一步分析,或提出改進(jìn)意見,或進(jìn)行應(yīng)用拓展。
X-Program 工具的下載,在該在線開發(fā)課程第一單元第四課時(shí)“附A:X-Program 的下載與安裝”。
該MOOC 在設(shè)計(jì)中,充分考慮線上線下混合式教學(xué)[7]的實(shí)施,不僅安排了學(xué)生的學(xué)習(xí)內(nèi)容,也對教學(xué)的實(shí)施進(jìn)行了設(shè)計(jì)說明與建議。
為了有效銜接學(xué)生未來C/C++等語言的學(xué)習(xí),建議對X-Program 的混合式教學(xué)分3 個(gè)階段組成。
第一階段,計(jì)算思維入門,結(jié)合慕課第一第二單元,從學(xué)生日常生活經(jīng)驗(yàn)出發(fā)凝練程序運(yùn)行的原理與邏輯本質(zhì),與中學(xué)數(shù)學(xué)的學(xué)習(xí)經(jīng)驗(yàn)出發(fā)辨析程序的計(jì)算步驟與數(shù)學(xué)表達(dá)的異同。
第二階段,基礎(chǔ)算法入門,結(jié)合慕課第三至第七單元,以案例分析與課堂研討的方式,辨析計(jì)算機(jī)解決問題的方式與我們?nèi)粘K伎紗栴}方式的差異,鍛煉學(xué)生編寫基礎(chǔ)算法的能力。
第三階段,銜接階段,充分利用X-Program的語言翻譯功能,對已經(jīng)學(xué)過的案例進(jìn)行翻譯對比,逐步從圖像化語言過渡到C/C++等計(jì)算機(jī)語言。
通過兩個(gè)學(xué)期的運(yùn)用,學(xué)生認(rèn)可了X-Program對程序設(shè)計(jì)入門的幫助,在2019—2020 學(xué)年秋季學(xué)期面向三個(gè)教學(xué)班93 名參與課程的學(xué)生的調(diào)查中,共88.3%的學(xué)生肯定了X-Program 的易用性,超過90%的學(xué)生表示X-Program 對程序設(shè)計(jì)的學(xué)習(xí)有幫助,如圖7 所示。
圖7 X-Program 易用性與幫助度調(diào)查
從教學(xué)效果上看,2019—2020 學(xué)年秋季學(xué)期,兩個(gè)班級采用X-Program 與MOOC 混合式教學(xué),并在第七周轉(zhuǎn)入C 語言的學(xué)習(xí)。另兩個(gè)班級從第一周開始就進(jìn)行C 語言學(xué)習(xí)。在第九周,進(jìn)行C 語言基礎(chǔ)語法(不含指針與結(jié)構(gòu)體)和算法的階段性測試,從總體成績分布上看,雖然X-Program+MOOC 教學(xué)方案的班級,學(xué)習(xí)C 語言晚于平行對照班級,但是測試成績分布總體優(yōu)于平行班級,如圖8 所示。
另外,在線開放課程“程序設(shè)計(jì)基礎(chǔ)——發(fā)現(xiàn)計(jì)算之美”目前已經(jīng)獲批江蘇省2018—2019 在線開放課程建設(shè)項(xiàng)目,中國計(jì)算機(jī)教學(xué)慕課聯(lián)盟(CMOOC)線上線下混合式教學(xué)項(xiàng)目,東南大學(xué)課程思政改革項(xiàng)目,以及中國計(jì)算機(jī)教學(xué)慕課聯(lián)盟優(yōu)秀在線開放課程。實(shí)施兩輪以來,獲得了學(xué)生的好評。
圖8 X-Program+MOOC 班級與對照班級教學(xué)效果對比
以學(xué)習(xí)者為中心的教學(xué)理念,幫助學(xué)習(xí)者的學(xué)習(xí)得到更多的收獲,是大學(xué)教師進(jìn)行課程設(shè)計(jì)與改革的基本出發(fā)點(diǎn)。目前,中學(xué)信息教育部分內(nèi)容與大學(xué)計(jì)算機(jī)程序基礎(chǔ)課程與程序設(shè)計(jì)課程有較大的重疊,但是由于地域差異,實(shí)施效果的差異,大學(xué)一年級需要零基礎(chǔ)學(xué)習(xí)計(jì)算機(jī)語言的學(xué)生普遍存在,且該現(xiàn)狀在短期內(nèi)不可能完全改變。然而,隨著時(shí)代的發(fā)展,越來越多的高中學(xué)生在進(jìn)入大學(xué)校園前,已經(jīng)具備一定的計(jì)算機(jī)編程能力,這更需要像X-Program 這樣的入門工具,以及類似“程序設(shè)計(jì)基礎(chǔ)——發(fā)現(xiàn)計(jì)算之美”這樣的在線開放課程,幫助零基礎(chǔ)的學(xué)生快速地在程序設(shè)計(jì)思維上進(jìn)行提升,并跟上整體的教學(xué)進(jìn)度。