曹恒來+陳宏斌+鈕洪斌+仇大成
【摘 要】計算思維起源于計算科學,程序設計是理解計算思維的最佳途徑。基于計算思維的小學程序設計教學,從學科思維層面重新建構了以Scratch和Logo為基礎,以機器人和Free BASIC為拓展的小學程序設計課程體系,歸納和優選了關注點分離、計算參與、案例教學、模式建構等系列化的程序設計教學策略與方法,希望學生能夠像計算機科學家一樣去思考和解決問題,提高發現和解決問題的能力。
【關鍵詞】計算思維;程序設計;教學研究;教學實踐
【中圖分類號】G434 【文獻標識碼】B
【論文編號】1671-7384(2016)12-0039-04
研究緣起
長期以來,我國的中小學程序設計教學更多定位于程序設計語言的學習,學生無法形成計算科學特有的理解問題和分析問題的思維方式,存在問題如下。
1. 乏味的形式化教材體系,泯滅了學習的興趣
計算機誕生于西方,因此程序設計語言都明顯帶有西方文化的演繹思維特征,如使用巴科斯范式或語法圖等形式化的方式描述語法規則,并影響到了教材的編寫。這種抽象的向學生灌輸程序設計語言語法知識的教材編寫方式,脫離了具體的生活情境,忽視了學生自身的學習特點,容易使他們喪失學習的興趣。[1]
2. 單一的演繹式教學策略,消磨了學習的能力
受教材的影響,無論是BASIC,還是Logo,中小學程序設計教學都是采用講授式的教學方式,教師“灌”,學生“聽”,學生只能處于被動接受的狀態,幾乎沒有動手實踐的機會,課堂上大多數時間都掌控在教師的手中。這種演繹式教學策略,讓學生能夠在較短的時間內掌握所學的知識,卻不能使學生掌握獲取知識的方法,以及進一步學習的能力。
3. 文本的專業化編程環境,阻礙了學習的進程
程序設計離不開編程環境的支持,然而,各種專業的編程環境,包括面向兒童的編程語言Logo,都是基于文本和符號的編程方式,學生必須自己輸入指令,各種各樣的語法錯誤往往導致學生寸步難行,大大延長了程序設計學習的時間,影響了程序設計能力的提高。
思想的源泉
近年來,從學科思維層面構建課程結構和內容逐漸成為人們的共識[2]。這里所說的思維,是指科學思維,主要分為邏輯思維、實證思維和計算思維三類[3]。計算思維起源于計算科學,2006年,卡內基·梅隆大學周以真教授在計算機科學協會(ACM)年會報告中,首次明確提出計算思維的概念:“計算思維是運用計算機科學的基礎概念去求解問題、設計系統和理解人類的行為。它包括了涵蓋計算機科學之廣度的一系列思維活動。”她認為:“計算思維就是通過約簡、嵌入、轉化和仿真等方法,把一個看起來困難的問題重新闡釋成一個我們知道怎樣解決的問題。”[4]
計算思維不是今天才有的,只是計算機出現后,計算思維才逐漸被認識和強化。當前,計算思維已經超越了傳統的計算機環境,適用于信息技術滲透的每一個角落,但是程序設計仍然是理解計算思維的最佳途徑。在設計問題求解方法時,會用到遞推法、迭代法、遞歸法等;用計算機語言描述求解過程時,會涉及順序、分支和循環三種基本結構;考慮如何響應和處理各種意外情況時,就要用到冗余、容錯、糾錯的方法;在維護和修正程序的過程中,要用到測試和調試的技術。這些技術都是計算思維中的核心概念[5]。
實踐的歷程
1. 建設程序設計教學課程資源
現有的程序設計書籍都是基于演繹思維編寫的,更多適用于成人學習。從2008年起,我們著手編寫適合青少年需要的《程序設計應用》校本教材,努力使其成為小學生愛看、好讀、易懂的程序設計書籍。主要從以下幾個方面進行了嘗試。
一是從教學出發選擇工具,突破復雜編程環境的壁壘。從計算思維的角度看,程序設計語言是描述問題的工具,在設計程序之前,首先要選好工具。通過多年的探索與實踐,我們認為BASIC語言仍然是適合小學生學習的程序設計語言。FreeBASIC(簡稱FB)既保持了BASIC語言簡單易學的傳統,也提供了程序設計開發工具所應具備的輸入、編輯和調試功能,菜單簡潔、清晰,可以較好地突破復雜編程環境造成的學習壁壘。
二是將演繹與歸納相結合,促進知識的主動建構。人類的思維方式一般有兩種:歸納與演繹。歸納是指從各種特殊事例中抽象概括出一般規律;而演繹則是從一般原理出發,通過推導得出個別結論。演繹法是西方文化的內涵,而歸納法反映了東方文化的內涵。受西方演繹思維框架的影響,目前的程序設計教材都是直接從語句的基本格式出發,展開到各個局部細節知識。這對一直接受東方文化熏陶的中國學生來說,理解上有一定的困難。為此,我們從兩個方面采取措施,融合兩種文化差異所帶來的問題:一是用自然語言的體系結構類比程序設計語言的體系結構,首先讓學生從整體上把握程序設計語言的結構,并由此過渡到具體內容的學習[6];二是對于基本語句,先通過一個學生學習和生活中典型問題的程序,歸納出它的基本格式或解決問題的基本規律,再將這些規則或規律應用于相似問題的解決,而不把所有的知識不分巨細都“嚼碎”了“喂”給學生。顯然,這是一種基于計算思維的構造性思維方式,更符合中國學生的認知規律。
圖1 自然語言的基本體系結構 圖2 程序設計語言的基本體系結構
三是強化算法的分析,經歷問題解決的全過程。用程序設計解決問題,關鍵是要找到解決問題的方法——算法。對于初學者來說,往往在看到問題后,粗粗一想就開始動手,很簡單的問題卻寫出一大堆代碼,自己也說不清解決問題的方法和過程。所以,對于每一個編程問題,我們都會從問題的分析和分解開始,首先找出解決問題的算法,再用FB語言編寫程序、實現算法。[7]
程序設計具有很強的實踐性,學習者只有通過大量的編程實踐,才能比較牢固地掌握基本的編程知識和技能,進而編寫出具有“實用”價值的程序。因此,我們為每章都配置了習題,并專門編寫了配套的習題解析,對教材中的習題進行詳細的分析和解答。同時,進一步補充了改錯題、讀程序題、程序填空題等。多數習題創設了貼近學生學習和生活的應用情境,以激發學習者在真實的情境中尋找解決問題的方法。為了檢測學生編程解決問題的能力,我們還使用HUSTOJ系統架設了在線程序評測系統。學生提交的程序在服務器端運行,會有正確、答案錯誤、編譯錯誤、格式錯誤等反饋信息,可以很好地指導學生調試程序。教師亦可很好地檢查學生作業完成情況,并就存在的問題進行解答。
2. 創新程序設計教學策略與方法
融入計算思維,不僅是內容和工具的改變,更應是教學方法、教學方式的改變。近年來,我們總結和歸納了系列的程序設計教學策略與方法。
一是采用案例教學,自主建構程序設計指令集。程序設計的學習主要圍繞環境、語言和應用三個方面的知識和內容展開,語言的學習,其核心主要在于語言規則本身。傳統的程序設計教學主要使用規例法介紹語言規則,即從語句的基本格式出發,詳細講解語句的各個要素,最后舉例說明。我們則在程序設計教學中運用案例教學法,首先對典型程序進行模仿,歸納出語句基本格式或解決問題的基本規律,再將這些規則或規律應用于類似問題的解決。
案例1:定義過程
1.提出問題,呈現任務。分析“俄羅斯方塊”游戲,發現共有七種基本方塊,本節課的任務是學習用Logo語言繪制七種基本方塊。
2.運行程序,分析過程。用定義好的“ZFX”過程示范繪制一個基本方塊,對“過程”作初步講解。
3.范例研習,提取指令。出示“ZFX”過程,為學生揭開教師演示的秘密。再出示“SJX”“WJX”兩個過程,歸納出過程的一般格式。
4.定義過程,嘗試使用。學生嘗試定義繪制正方形的過程,調用過程繪制一種自己喜歡的基本俄羅斯方塊。
5.創意設計,再用過程。從“多層柜”“幸運草”和“好運星”中選擇自己喜歡的圖形進行分析,并完成圖形的繪制。也可以自己定義一個或者多個繪制基本圖形的過程,設計出新的圖形。
在程序設計學習伊始,為學生提供一個需要解決的生活中的具體任務,分析解決這個問題的“程序”,引導學生提取其中的指令,得到一組“指令集”,再將這組“指令集”應用于類似問題的解決,逐漸提高個人“指令集”的復雜程度,最終得到功能強大的指令集。顯然,這種例規法教學更符合中國學生的認知規律。
二是面向計算參與,在創意和計算中學習編程。Scratch是一個可視化編程工具,學生只需要拖動圖形就可以輕松創作出蘊涵著故事情節的游戲和故事等編程制品。然而,許多教師仍然采用傳統的“編寫代碼”的教學思路,并沒有充分發揮Scratch在創意計算上的優勢。2012年,美國賓夕法尼亞大學教育研究生院的YasminB.Kafai教授提出了以“社會化轉向”為特征的培養計算思維的新范式——計算參與,并從三個維度進行了描述:(1)從編寫代碼到創建應用;(2)從設計工具到促進社區;(3)從“白手起家”到再創作他人成果。傳統的程序設計學習總是通過解決一些看似趣味、其實枯燥的數學題(如農夫過河等)來學習編程。基于“創建應用”的編程教學方式,學生不再只是編寫代碼,設計功能完整的應用程序成為學習編程的重要任務[8]。“我的Scratch畫圖程序”這節課就采用了“創建應用”程序設計教學方式。
案例2:我的Scratch畫圖程序
教師出示學生Scratch作品范例——“畫一畫”程序。(1)體驗操作,并思考程序中有哪些角色,它們在程序中分別有什么功能。(2)觀察“畫筆工具”角色的主要動作,分析角色的腳本,完成“連一連”,將動作和對應腳本模塊用直線相連。(3)兩人一組,一人負責現有范例程序不變,另一人逐條刪除“畫筆”工具中的相應指令,比較、分析每一個指令的作用。
學生在創作我的“畫圖”程序的過程中,需要“仔細思考用戶與應用程序互動的方式,以及根據意圖實現功能的方式”,知識與技能的學習有機地融入到了設計有意義的“畫圖”程序中來。學生不再只是技術“消費者”,更多的是技術的“生產者”。此外,在他人的基礎上學習編程,一個人也可以編寫相對“復雜”的程序。使用——修改——創作是這種教學策略的基本思路,范例研習引領學生發現別人解決問題的方法,通過修改參數進行模仿設計,進一步理解技術的關鍵要點。在此基礎上,嘗試為游戲添加更多的功能,從而將學到的知識與技能應用到解決實際問題的過程中,使學習變得更加有趣。
三是運用關注點分離,降低問題解決的復雜度。在教學中采用關注點分離方法,就是將復雜問題進行合理的分解,控制問題的復雜性,提高可理解性,再分別仔細研究問題的不同側面(關注點),最后綜合各方面的結果,合成整體的解決方案[9]。“畫組合圖形”就采用了關注點分離的方法。
案例3:畫組合圖形
你會畫組合圖形嗎?這個圖形由哪幾個圖形組成?你準備先畫哪個圖形?小海龜出發時的角度是多少?繪制這個圖形的命令是什么?畫好該圖形后,小海龜的位置在哪個點?你準備把第二個圖形的起始位置確定在哪個點?小海龜出發時的角度是多少?繪制這個圖形的命令是什么?
通過把復雜的組合圖形拆分成兩個簡單圖形——等邊三角形和正方形,實現關注點的分離,也降低了繪制組合圖形的難度,更易于學生理解。
四是基于模式建構,培養正確的程序設計思維方法。現代大型軟件系統的開發中,工程化的開發控制是軟件系統成功的保證。在我們程序設計教學中,“個性化”方法比較嚴重,同一個算法在不同問題中的描述往往是不同的,學生即使編寫了“大量”的程序,也無法遷移到相似問題的解決過程之中。所謂模式,是指一種經驗和規律,是對相似問題的一種通用解決方案,它是經過充分考驗并證明是行之有效的,能夠遷移并推廣到更廣泛的問題解決與應用中去[10]。以下就是基于模式建構的循環語句教學案例。
案例4:循環語句
循環是程序設計最困難的部分之一,學生往往在這里開始出現分化。主要是由于在使用DO-LOOP語句時,必須自己實現循環的四個部分,這時經常會遺漏修正部分或修正不正確,或者檢查條件設置不正確,造成死循環。應用模式進行循環語句的教學,則可以幫助學生建立起循環結構解決問題的基本模式:初始條件、檢查條件、循環體、檢查條件,學生在解決其他相似問題時,只需要根據具體問題,修改這個基本模式的相應部分即可。應用是無限的,但方法、原理、思想卻是相對固定的,基于模式建構的程序設計學習,有助于學生建立良好的程序設計思維和方法。
3. 探索基于機器人平臺的程序設計教學
雖然Scratch采用了圖形化的編程界面,但是編程的結果也只能呈現在屏幕上,基于機器人平臺,學生則可以把程序下載到機器人里,即時看到編程的“物化”效果,再根據這些反饋修改程序,使程序設計的學習更具有知識性、實踐性、趣味性和直觀性。
例如,在機器人沿線(如黑線)行走的運動中,機器人是根據灰度傳感器測得的黑白色灰度值來判斷是否在線上。理論上來說,在機器人行走的過程中,灰度傳感器測得的灰度值等于黑色灰度值,說明機器人在軌跡線上,測得的灰度值等于白色的灰度值,說明機器人在線下。然而,黑色軌跡線的顏色并不是絕對均勻的,可能也有小塊的白色區域沒涂上白色。因此,為了使機器人能夠比較穩定地行走,應該允許識別黑白色的臨界值有一定的差值。這樣,學生在經歷“思考—實踐—再思考—再實踐”的反復人機交互過程中,體驗了在解決工程問題過程中,為滿足系統的可實施性,而對系統設計中的技術、方案做出合理取舍的一種折衷思維[11]。
實踐成果
至此,我們逐步建立了小學程序設計教學的課程體系。該體系主要由四個模塊組成:把Scratch作為小學生首門程序設計課,學生在制作富有個性的互動媒體作品的過程中,形成信息化情境下解決問題的方法與策略;在用Logo指令控制計算機完成動作的過程中,理解人是如何通過程序指揮計算機解決問題的;通過機器人模塊的學習,理解基于“工程-設計-管理”框架下的模塊化、結構化、逐步求精、測試與調試等軟件工程設計方法。通過FB程序設計課程的學習,學會從問題出發設計算法并編程實現,理解算法和程序設計在解決問題過程中的地位和作用。
作為最重要的計算思維原則之一,關注點分離法是處理復雜問題的一種普適系統方法和原則,在不同模塊教學中都要運用這種思想方法。在基于計算參與的程序設計教學中,學生從使用、“擺弄”他人的編程制品開始學習編程,理解程序設計的基本思想。案例教學指向的思維品質正是計算思維的本質——抽象,用這種方法學習到的“程序設計”,不是陷在陌生的人工語言環境之中,依賴記指令、背結構的程序設計,而是面向貼近生活經驗的、解決現實問題的程序設計。應用模式進行問題的分析與設計,有助于我們運用別人的經驗,特別是專家的經驗來分析、設計和描述問題,并最終解決問題。在實際的教學情境中,這幾種教學方法之間是一種相互支持、互為補充的關系,我們應充分利用它們的優勢,以促進學生的發展為原則來尋求一種最佳的搭配。
參考文獻
[7]曹恒來,沈軍.《程序設計與應用》校本課程開發的實踐與思考[J].教育研究與評論,2015(3).
李藝,鐘柏昌.談“核心素養”[J].教育研究,2015(9).
[5]李廉.計算思維——概念與挑戰[J].中國大學教學,2012(1).
Jeannette M. Wing. Computational Thinking[J]. Communications of the ACM, 2006(3).
[10]沈軍.大學程序設計基礎——系統化方法解析&Java描述[M].南京:東南大學出版社,2015.
王旭卿.從計算思維到計算參與:美國中小學程序設計教學的社會化轉向與啟示[J].中國電化教育,2014(3).
何明昕.關注點分離在計算思維和軟件工程中的方法論意義[J].計算機科學,2009(4).
鐘柏昌,李藝.計算思維的科學涵義與社會價值解析[J].江漢學術,2016(2).
(作者單位:江蘇鹽城市教育科學研究院 江蘇鹽城市第一小學教育集團 江蘇大豐區幸福路小學 江蘇濱海縣教師發展中心)