李琥 趙厚寶 曾井泉
[摘 要]在C++課程傳統(tǒng)教學(xué)中,初次接觸編程語言的學(xué)生普遍反映難于理解面向?qū)ο蟮幕靖拍?,文章以“把程序語言用于解決現(xiàn)實問題”的教學(xué)理念為主線,把面向?qū)ο蟮母拍盥鋵嵉骄唧w的應(yīng)用開發(fā)中。授課時,教師有意識地引導(dǎo)學(xué)生從計算機(jī)的視角分解、抽象和表示現(xiàn)實問題,著重訓(xùn)練學(xué)生在用計算機(jī)解決現(xiàn)實問題時如何以計算思維的方式來思考。學(xué)生的反饋表明,此教學(xué)方法能有效地把面向?qū)ο蟮母拍钆c現(xiàn)實問題結(jié)合起來,把空洞的概念轉(zhuǎn)化成具體的現(xiàn),幫助學(xué)生把課堂所學(xué)轉(zhuǎn)化為解決現(xiàn)實問題的能力。
[關(guān)鍵詞]面向?qū)ο?計算思維;程序語言;程序設(shè)計;在線評測系統(tǒng)
[中圖分類號] G642 [文獻(xiàn)標(biāo)識碼] A [文章編號] 2095-3437(2021)02-0111-04
引言
人工智能技術(shù)快速推進(jìn),以5G為代表的信息技術(shù)快速發(fā)展,與計算機(jī)有關(guān)的軟件工程技術(shù)在整個經(jīng)濟(jì)社會生活中承擔(dān)著極其重要的作用。C++課程是計算機(jī)相關(guān)專業(yè)的一門重要基礎(chǔ)課,初次接觸面向?qū)ο蟪绦蛟O(shè)計語言的學(xué)生普遍覺得這門課程難學(xué),需要花大量的時間學(xué)習(xí)晦澀難懂的語法語義。因此,有必要找到一種有效方法,來引導(dǎo)學(xué)生把課程空洞的概念轉(zhuǎn)化成具體的現(xiàn)實,進(jìn)而把所學(xué)應(yīng)用于解決實際問題。這是當(dāng)今很多高校計算機(jī)專業(yè)課程“以工程教育為導(dǎo)向”的改革和探索方向[1]。筆者在教學(xué)實踐中把計算思維[2]的方式融入教學(xué),目的正是引導(dǎo)學(xué)生轉(zhuǎn)變傳統(tǒng)思維方式,逐步養(yǎng)成以計算機(jī)的思維方式來思考分析問題。計算思維是從計算機(jī)的算法視角來思考問題,計算思維方式的訓(xùn)練是激發(fā)學(xué)生編程熱情并幫助其形成“問題即算法”的思維模式的一種有效方法。
2006年,周以真教授首次提出了計算思維的概念:計算思維是運用計算機(jī)科學(xué)的基礎(chǔ)概念去求解問題、設(shè)計系統(tǒng)和理解人類的行為,其本質(zhì)是抽象和自動化[3]。她認(rèn)為,計算思維核心的元素包含分解、模式識別、抽象和算法四個部分,人們具備了這四個能力就能為問題找到解決方案。
從本質(zhì)上說,計算思維是從計算機(jī)算法的視角來求解問題的思維方式,以求解問題的途徑為主要訴求[4],解決問題的方案(或算法)以程序的形式表現(xiàn)出來并能在計算機(jī)上執(zhí)行。具體在教學(xué)實踐中,培養(yǎng)學(xué)生的計算思維必須有一個依托工具或抓手,在C++課程中融入計算思維的教學(xué)方法不失為一種好途徑。本文論述的正是在程序設(shè)計課程教學(xué)中如何引導(dǎo)學(xué)生在解決現(xiàn)實問題時像計算機(jī)科學(xué)家那樣去思考分析問題,并逐步養(yǎng)成計算思維的思考習(xí)慣。
文章提出了程序設(shè)計課程必須融入計算思維教學(xué),并把在線評測系統(tǒng)(OJ系統(tǒng))引入實踐教學(xué)環(huán)節(jié)的方法。OJ系統(tǒng)驗證程序源代碼的正確性,使編程人員能有效地發(fā)現(xiàn)程序設(shè)計的問題與不足,促進(jìn)代碼優(yōu)化。另外,在質(zhì)量高的OJ系統(tǒng),容易找到高質(zhì)量題解或便于與同人交流,可以在增加趣味性的同時有效提高學(xué)生的編程水平。
一、當(dāng)前存在的問題
C++程序設(shè)計課程的教學(xué)目前主要存在以下幾方面的問題:其一,C++是面向?qū)ο笤O(shè)計語言,語法語義繁多,教學(xué)時教師容易陷入煩瑣的語法語義教學(xué)當(dāng)中,花大量時間給學(xué)生灌輸語法語義知識,而學(xué)生也容易陷入瑣碎的語法語義學(xué)習(xí)當(dāng)中,最終導(dǎo)致教師為教學(xué)生學(xué)語法語義而教語法語義,而忽略了引導(dǎo)學(xué)生學(xué)習(xí)程序設(shè)計的思維方式。其二,按照傳統(tǒng)的教學(xué)方法,教師一般是先介紹語法的形式和語義,之后通過示例程序鞏固語法知識。學(xué)習(xí)之后學(xué)生們并不理解示例程序為什么要這樣編寫,而且在面對實際問題時,大部分學(xué)生不知道如何將問題分解、抽象,并最終找到解決問題的算法。其三,在實訓(xùn)環(huán)節(jié),學(xué)生上機(jī)編寫能運行的程序,但對測試數(shù)據(jù)考慮不全面,容易導(dǎo)致程序?qū)懲曛箅y于有效發(fā)現(xiàn)隱藏的bug。其四,學(xué)生難于從計算機(jī)角度對實際問題進(jìn)行抽象,得出算法。其五,課堂應(yīng)該增加程序的演示和運行環(huán)節(jié),以通過編程思維訓(xùn)練、獲得成就感來提高學(xué)生對程序設(shè)計學(xué)習(xí)的興趣。
把計算機(jī)當(dāng)成狹義的工具[5],只教學(xué)生如何使用計算機(jī),已經(jīng)成為大學(xué)計算機(jī)課程教學(xué)的普遍現(xiàn)象。顯然,大學(xué)教育如果只關(guān)注計算機(jī)操作層面的教學(xué),就難以滿足各學(xué)科學(xué)生在未來的知識創(chuàng)新和發(fā)展中的需求,也難以跨越通用計算手段的學(xué)習(xí)與專業(yè)計算手段的學(xué)習(xí)之間的鴻溝。培養(yǎng)學(xué)生計算思維的能力是克服把計算機(jī)當(dāng)成狹義工具的弊端的有效途徑,可以幫助學(xué)生在學(xué)習(xí)計算機(jī)課程時轉(zhuǎn)變固有的思維模式[6]。計算思維具有普適性,能夠自然地融入除了計算機(jī)相關(guān)工作之外的其他創(chuàng)新工作中。
二、改進(jìn)和完善教學(xué)方法
為了解決當(dāng)前存在的問題,我們需要對程序設(shè)計課程的傳統(tǒng)教學(xué)方法進(jìn)行改進(jìn)和完善。
(一)上好第一堂課
對大部分學(xué)生而言,學(xué)習(xí)編程課程的主要目的是學(xué)習(xí)計算機(jī)的計算思維方式,即學(xué)習(xí)用計算機(jī)分析和解決問題的基本方法和思路。因此,在課程開篇教學(xué)上,教師首先必須想辦法讓學(xué)生理解透徹“如何分解問題,將問題對象化”這個問題。問題被分解之后,接下來就是問題如何表示。面向?qū)ο蟪绦蛟O(shè)計采用的是其三大特征之一——高度抽象的方法,這就是計算思維的本質(zhì)之一。程序設(shè)計課程是從算法的角度給出問題的計算機(jī)實現(xiàn)方法,即程序?qū)崿F(xiàn)方法,它是計算思維能力培養(yǎng)的重要內(nèi)容。C++是使用最廣泛的編程語言之一,它是設(shè)計工具,也是實現(xiàn)工具,具有層次分明的抽象編程能力,是培養(yǎng)學(xué)生計算思維能力的好載體。
傳統(tǒng)教學(xué)中,程序設(shè)計課程一般將語法入門作為課程開篇。然而,對程序設(shè)計領(lǐng)域完全陌生的學(xué)生難于理解和接受程序為什么要這樣寫。學(xué)生如果不能消除內(nèi)心的這個糾結(jié),就會給其后續(xù)學(xué)習(xí)設(shè)置障礙。因此,教師在實際教學(xué)中應(yīng)該選擇學(xué)生最為困惑的基本概念的解讀作為課程開篇,這些概念包括計算、計算思維、問題分解、抽象和類。
(二)計算和計算機(jī)科學(xué)
針對一個問題設(shè)計出解決問題的指令序列(程序),并由計算機(jī)來執(zhí)行這個指令序列,這就是計算。通過計算,計算機(jī)可以快速完成從簡單到復(fù)雜的任務(wù)。
計算機(jī)科學(xué)家為了更好地利用計算機(jī)解決各種問題,深入研究了關(guān)于計算的理論、方法和技術(shù),形成了專門研究計算的學(xué)問,即計算機(jī)科學(xué)。
計算是利用計算機(jī)解決問題的過程,計算機(jī)科學(xué)是關(guān)于計算的學(xué)問。計算機(jī)科學(xué)家長期用計算機(jī)解決問題過程中形成的思維模式和思考方法,即計算思維。
(三)計算的不同階段
綜前所述,計算是利用計算機(jī)流程化執(zhí)行指令來解決問題的過程。從問題的計算機(jī)表示、算法設(shè)計到編程實現(xiàn),計算思維貫穿于計算的全過程。學(xué)習(xí)計算思維,就是學(xué)會像計算機(jī)科學(xué)家一樣思考和解決問題。
1.問題表示
用計算機(jī)解決問題,首先要建立問題的計算機(jī)表示。抽象是用于問題表示的重要思維工具。一般意義上的抽象就是對研究對象的具體的或無關(guān)的特征進(jìn)行一種忽略或拋棄,抽取其一般的或相關(guān)的特性。抽象是計算機(jī)科學(xué)中廣泛使用的思維方式,是程序員解決問題時必須具備的技能之一。抽象實例如圖1所示。
教師在課程開篇除了要著重講解計算、抽象的概念,還要講解另外一個重要的概念即類,引導(dǎo)學(xué)生學(xué)習(xí)按照類的方式認(rèn)識世界。教學(xué)中要著重引導(dǎo)學(xué)生學(xué)習(xí)將具體問題抽象化,描述客觀存在的實體,樹立萬事萬物皆對象(類)的概念,刻意弱化C++的語法細(xì)節(jié),以簡單的話題如描述自己的喝水杯子作為課程開篇內(nèi)容,即對抽象概念進(jìn)行實踐性的理解。教師根據(jù)學(xué)生對簡單事物的描述,逐步展開C++中類的屬性和行為概念的解釋。通過這種常識性話題的討論,引導(dǎo)學(xué)生主動從思考事物的表示方法逐步過渡到抽象的概念即類的本質(zhì)。這種鋪墊式的教學(xué)方法可以使學(xué)生對新概念從一開始就有個良好的接受度,形成良性的心理優(yōu)勢。
具體到教學(xué)內(nèi)容,教師可以先利用生活素材豐富教學(xué)內(nèi)容。在一般的傳統(tǒng)教材中,大部分示例程序都是為講述概念而設(shè)計的,因此著重強(qiáng)調(diào)概念的程序表示方法,對解決現(xiàn)實問題起不到好的借鑒作用。大部分學(xué)生雖然能按部就班地理解程序編碼,但依然無法著手解決遇到的現(xiàn)實問題。例如,在實際編碼教學(xué)環(huán)節(jié),傳統(tǒng)教材都有把數(shù)值進(jìn)行排序或找出最大值的例子,學(xué)生參照例子也能寫出類似的小程序,但如果問題換成“找出10只羊中最大的那只羊”,很多學(xué)生就不知道如何處理,這時教師可以結(jié)合此實際案例講解抽象的概念,將空洞抽象的“大小”轉(zhuǎn)變?yōu)榫唧w的“數(shù)值”,問題被抽象之后學(xué)生們通常可以寫出對應(yīng)的程序。教學(xué)時教師可以借助教室中的各種實體,讓學(xué)生主動對問題進(jìn)行分解和抽象并以類的形式表示出來,讓計算思維模式真正成為學(xué)生解決實際問題的一種思考習(xí)慣。
2.算法設(shè)計
計算思維的思考模式是一種從計算機(jī)算法視角分析解決現(xiàn)實問題的一種最有效思考方式,即從計算機(jī)的視角來分析和解決問題,課程教學(xué)的全過程都應(yīng)該以此為主線。
問題得到表示之后,接下來是找到問題的解法即算法。算法設(shè)計是計算思維大顯身手的領(lǐng)域,我們解決現(xiàn)實問題就是要從計算機(jī)的角度找到最優(yōu)化的算法。在算法設(shè)計階段,教師要引導(dǎo)學(xué)生如何把自然語言描述的問題解決方法轉(zhuǎn)換成計算機(jī)能識別的語言,即程序語言。教師逐步引導(dǎo)學(xué)生將問題進(jìn)行分解,抽象,并用類的形式表示出來,在算法設(shè)計中將面向?qū)ο蟪绦蛟O(shè)計理論映射到實踐中。這種著手解決實際問題的啟發(fā)式教學(xué),可以促使學(xué)生主動思考,讓學(xué)生在輕松的氣氛中,以項目驅(qū)動的方式掌握知識的要點。
3.代碼實現(xiàn)
找到了解決問題的算法,接下來就要用編程語言來實現(xiàn)算法。編程實踐教學(xué)環(huán)節(jié)是計算思維最終落實到代碼實現(xiàn)的環(huán)節(jié),是對學(xué)生基礎(chǔ)理論、專業(yè)知識與實踐經(jīng)驗的全面總結(jié)。完成代碼后,代碼能跑起來并不代表你的代碼是很好的C++代碼。好代碼的衡量標(biāo)準(zhǔn)至少應(yīng)該考慮以下幾個方面:其一,可運行,能夠完成既定的任務(wù)。這是最基本的要求。如果編寫的程序不能工作,寫得再多也沒用。其二,代碼穩(wěn)定,沒有“內(nèi)存泄漏”“誤差累積”等隱患。其三,具有可讀性。一份好代碼一定是邏輯清晰、結(jié)構(gòu)分明、注釋合理,便于他人維護(hù)的。其四,具有不錯的執(zhí)行效率。程序員可以通過優(yōu)化數(shù)據(jù)結(jié)構(gòu)、算法和代碼來提高程序的性能即執(zhí)行效率。其五,便于移植。即軟件具有能運行于不同軟硬環(huán)境的能力。
三、利用在線評測系統(tǒng)
在線評測系統(tǒng)(Online Judge,簡稱OJ)是用來在線檢測程序源代碼的正確性,通過OJ系統(tǒng)對程序源代碼進(jìn)行編譯和執(zhí)行。使用時,用戶通過瀏覽器登錄系統(tǒng),在線提交自己的源代碼。代碼提交成功后,后臺系統(tǒng)自動對源代碼進(jìn)行編譯和執(zhí)行,然后把輸入和預(yù)期的輸出進(jìn)行比對并以此來判斷程序的正確性,其原理是軟件黑盒測試法。
現(xiàn)在國內(nèi)外有很多可以免費使用的優(yōu)秀OJ系統(tǒng),用戶只需在平臺上完成注冊即可自由使用。學(xué)習(xí)程序設(shè)計的學(xué)生,既可以在平臺上提交代碼測試程序,也可以與其他編程能力強(qiáng)的用戶進(jìn)行線上交流。與編程高手互動是提高編程能力的有效途徑之一。
以下是幾個比較優(yōu)秀的OJ平臺:
·杭州電子科技大學(xué)OJ平臺:http://acm.hdu.edu.cn/
·北京大學(xué)POJ:http://poj.org/
·UVA:https://uva.onlinejudge.org/
四、課程考核
在傳統(tǒng)教學(xué)中,衡量學(xué)生對一門課程的掌握情況的主要方式依然是考試,但對于程序設(shè)計類的課程,只通過考試去評價學(xué)生的程序設(shè)計能力是片面的。程序設(shè)計類課程的考核方式應(yīng)該將學(xué)生的日常學(xué)習(xí)表現(xiàn)情況和項目完成情況納入考核體系,還可以將比如參加創(chuàng)新創(chuàng)業(yè)大賽、挑戰(zhàn)杯等課外的實踐納入考核范圍,使整個考核多元化。對于學(xué)有余力的學(xué)生,教師也可以采用小規(guī)模限制性在線課程(Small Private Online Course,簡稱SPOC)的教學(xué)模式[7],分階段晉級性地提高這部分學(xué)生的項目工程實踐能力,并計入考核成績。
獲得平時成績有很多方式,比如教師可以提出一個需要簡單的計算機(jī)算法才能解決的現(xiàn)實問題,學(xué)生分小組給出問題的解決算法。小組算法正式提交之前,小組之間可以互動,指出對方方案的優(yōu)點和不足,促使學(xué)生主動思考找出問題的最優(yōu)算法。整個任務(wù)以考核學(xué)生的計算思維能力為目標(biāo),任務(wù)最后由教師做出點評,選出最優(yōu)算法的小組。
把程序設(shè)計類課程的日常成績計入考核,可以有效調(diào)動學(xué)生參加平時訓(xùn)練的積極性。整個課程的教學(xué)以解決實際問題為導(dǎo)向,有效解決了理論難于聯(lián)系實際的問題,使教學(xué)效果事半功倍。
五、結(jié)語
從計算機(jī)算法的視角來分析和解決問題就是計算思維,它的提出獲得了全球教育界的認(rèn)可。本文以C++程序設(shè)計課程為抓手,在整個教學(xué)過程中,以解決現(xiàn)實問題為主線,有意識地引導(dǎo)學(xué)生逐步養(yǎng)成計算思維的思考習(xí)慣,避免了程序設(shè)計課程傳統(tǒng)教學(xué)方法容易陷入純粹語法語義教學(xué)的窘境;在課程實踐環(huán)節(jié),指導(dǎo)學(xué)生充分利用第三方國內(nèi)外優(yōu)秀的在線檢測系統(tǒng),以提高其實際編程能力。從學(xué)生端的反映來看,本方法取得了良好的教學(xué)效果,相對于傳統(tǒng)的教學(xué)方式,學(xué)生對課程的學(xué)習(xí)熱情有了明顯提高,知道了如何才能最有效地學(xué)好計算機(jī)課程。
根據(jù)我們多年的C++程序設(shè)計課程教學(xué)經(jīng)驗以及對計算思維的理解,本文總結(jié)出以下教學(xué)經(jīng)驗:其一,以解決實際問題為教學(xué)主線,融入計算思維來分析和解決問題,跳出語法語義細(xì)節(jié),從計算機(jī)的角度思考問題。其二,從程序設(shè)計的角度引入面向?qū)ο蟮暮诵母拍?,并著重講述引入此概念的目的和解決什么問題。其三,鼓勵以探索為本的學(xué)習(xí),課堂上鼓勵學(xué)生開闊思路,各抒己見。其四,強(qiáng)化實踐環(huán)節(jié),引入高質(zhì)量的OJ平臺,鼓勵學(xué)生在與平臺編程高手交流中獲得進(jìn)步。
總之,本文探討根據(jù)面向?qū)ο蟪绦蛟O(shè)計課程的特點,以現(xiàn)實問題為驅(qū)動來開展教學(xué),著重培養(yǎng)學(xué)生從算法角度去分解問題和解決問題的能力。同時我們也應(yīng)該看到,培養(yǎng)學(xué)生的計算思維不可能一蹴而就,也不可能靠一兩門課程就能完成,它涉及解決實際問題時思維方式的轉(zhuǎn)變,是一個系統(tǒng)工程,我們只有不斷努力實踐才能掌握其精髓。
[ 參 考 文 獻(xiàn) ]
[1] 孫勝濤,張世輝. 面向工程教育的計算機(jī)專業(yè)課程體系改革和探索[J]. 大學(xué)教育, 2018(10):14-16.
[2] 周以真.計算思維[J].中國計算機(jī)學(xué)會通訊,2007(11):83-85.
[3] 陸朝俊.計算思維導(dǎo)論:程序設(shè)計思想和方法[M].北京:高等教育出版社,2013.
[4] 黃麗達(dá),陳湘濤.將計算思維融入程序設(shè)計課程教學(xué)方法的研究[J]. 計算機(jī)教育, 2014(3):70-74.
[5] 白霞,高飛,趙娟. 基于計算思維的C++面向?qū)ο蟪绦蛟O(shè)計教學(xué)改革[J]. 計算機(jī)教育, 2014(11):7-9.
[6] 許四平.基于計算思維的面向?qū)ο蟪绦蛟O(shè)計教學(xué)策略探析[J]. 無線互聯(lián)科技, 2015(21):100-101.
[7] 方向.新工科背景下的大學(xué)計算機(jī)教學(xué)改革研究和實踐:以山東工商學(xué)院為例[J]. 大學(xué)教育,2019(6):88-90.
[責(zé)任編輯:龐丹丹]