編者按:近年來,在信息技術課程變革和國家一系列政策的助推下,中小學編程教學受到了各方的普遍關注,成為了新的教育熱點。不久前,教育部在答復政協提案《關于穩步推動編程教育納入我國基礎教學體系,著力培養數字化人才的提案》時,明確表示將編程教育納入中小學相關課程。
本期對話,首都師范大學樊磊教授與北京市東城區教育研修學院研修員魏寧,將圍繞中小學編程教學以及Python編程語言展開深入探討,以期為從事編程教學的一線教師提供參考。
魏 ?寧
北京市東城區教育研修學院研修員,教育碩士,高級教師。北京市教育學會教育評價專業委員會理事。主持北京市教育學會“十三五”教育科研課題1項。特約撰稿人/專欄作者,發表文章300余篇。
樊 ?磊
首都師范大學教授。中國教育學會中小學信息技術教育分委會理事,教育部高中、義教信息技術課程標準專家組成員。人民教育出版社-中國地圖出版社高中信息技術教材聯合總主編。
編程教學篇
魏寧:首先,非常感謝樊磊教授參與此次對話,樊教授是教育部高中及義務教育課程標準信息技術學科核心專家組成員,多個版本的信息技術、人工智能教材主編,也是教育部剛公布的技術(信息技術、通用技術)教學指導專委會委員,多年來一直倡導編程教學并做了大量工作,今天的話題我們就從編程教學開始吧。
關于編程教學,我想,如果從計算機科學的角度看,算法以及基于算法的問題求解,既是計算機科學中最重要的組成部分,也可以說是編程教學中最基本、最核心的內容。我們看到,在高校的計算機以及相關專業中,算法已經形成了一個完備的知識體系,成為計算機科學里非常重要的一個分支學科,但在中小學的編程教學里,算法教學顯然還沒有形成一個體系。
既然中小學編程教學里的算法教學如此重要,我們該如何借鑒高校的成熟經驗呢?中小學編程教學里的算法教學又該遵循怎樣的指導原則呢?
樊磊:我認為,首先,不應把中小學編程教學里的算法教學簡單地看作高校相關課程的預備或簡化版本,中小學階段的算法教學是為編程教學服務的,所以必須服從于編程教學的總目標。而且,限于中小學生的認知水平和知識深度,算法教學在內容、案例選擇上無論廣度還是深度都是有限的,當然,這種選擇對算法教學也是十分關鍵的。
至于中小學編程教學里的算法教學應遵循的指導原則,我認為有以下幾點:
第一,算法應該源自學生熟悉的應用情境,教師要為學生搭建起從最簡單的情境到算法的一般性描述之間的抽象臺階,也就是我們通常說的教學的支架、腳手架。
第二,在算法的選擇上,要把握好高階算法和低階算法之間的平衡。所謂高階算法就是能直接解決某類問題的算法,低階算法是指能高效完成特定任務的底層算法。例如,我們可以考慮在小學、初中階段以高階算法的案例為主,到了高中階段,適當加入少量的低階算法。
第三,算法的目標、直觀思想以及逐步導致形式化描述的演化過程是高中(包括小學、初中)算法教學的重要部分,教學中應避免直接提出一般化、形式化的算法描述。
第四,算法中所涉及的核心思想、形式化或半形式化表示、算法推導的數學及背景知識應在學生的知識范圍內,或略微超過學生的知識范圍。
魏寧:對于算法而言,算法策略是一種更高站位上的視角。因為算法策略是在算法設計中所使用的問題求解的策略,也是計算思維最直接、最具體的體現形式。相對具體的案例,教師該如何在自己的教學中選擇算法策略呢?
樊磊:在中小學編程教育中的算法教學里,常見的算法策略和它們用于處理的任務主要有:迭代(也稱為循環)——用于處理重復性的任務;遞歸——用于完成迭代的一種高效方法;蠻力法——在沒有更好的辦法,而且計算資源(時間和空間)允許的前提下,可以嘗試采用的求解問題的方法;回溯——用于測試不可行的選擇,目的在于盡可能排除這類選擇。
此外,啟發式方法使用所有可用的背景信息,以期合理地縮短求解時間;分治法是求解困難問題時“化難為簡、化大為小”的基本策略;動態規劃策略用于嘗試識別并記憶求解過程中的重復性步驟,從而避免無用的重復計算或浪費資源;定界的目的則是盡量確定解的邊界,以縮小求解范圍。
魏寧:剛才我們談到了計算思維,自從2007年美國卡內基梅隆大學計算機系主任周以真教授提出計算思維的概念以來,計算思維受到了各國教育界的普遍重視,在我國新修訂的《普通高中信息技術課程標準》中,計算思維也被列為學科核心素養之一。
在計算思維的培養中,編程普遍被認為是一種有效的途徑。但目前計算思維的研究仍處在起步階段,特別是對中小學編程教學如何促進學生計算思維的形成,我們似乎還缺乏有說服力的指導理論。
樊磊:是的,我們可以這樣理解編程教學與算法思維的關系,就是把計算思維理解為求解信息處理問題時的一種思維方式,把編程語言理解為描述信息處理過程的形式語言,而編程則是基于信息的推理活動(計算也是一種推理)。編程語言/編程在表示/求解信息處理問題中的作用類似于抽象/邏輯在求解數學問題時的表示和推理。
著名數學家G.Polya在他的專著《怎樣解題》中提出過一個數學問題求解的模型,就是著名的Polya模型。它把解題的過程分為四個步驟:理解問題、設計求解方案、實施求解方案和核查評估。在Polya模型的基礎上,我們可以設計一個基于計算思維的問題求解模型。具體地說,在基于計算思維的問題求解模型中,理解問題包括了要能正確地提出問題、表示問題,設計求解方案的重點在于要能設計出可以編程實現的算法,在實施求解方案中包括了用語言工具實施算法以及調試驗證算法,核查評估環節重在評估求解方案的效率、代價和精度等。
這些重要的特點,顯然有著方法論的特征,既體現了與一般的問題求解過程的不同,也說明了計算思維的培養是一個逐漸積累和不斷優化的迭代過程。只有將問題理解(敘述、表示)和求解(算法設計、實現、評估、優化)看成一個整體,才能體現出計算思維的真正價值,較好地解決編程教學中的碎片化問題。
魏寧:對于中小學編程教學中的程序語言選擇,我們看到,從20世紀90年代開始,至今已經歷了Pascal、Fortran、C、VB、Java等語言的變遷。目前,仍有Pascal、VB、Scratch等多種編程語言在中小學編程教學中使用,以至于不少教師戲言,在信息技術課程中,“工具是最新的,語言是最老的”。但這是不是一種編程語言發展的常態呢?
樊磊:編程語言的迭代是技術發展的正常趨勢,在教育領域,同樣也要遵從這種趨勢,我理解這是一種正常的現象。
相對于編程語言多樣化的現實,更需要我們思考的是,編程語言的選擇應從哪些原則出發考慮。我想,我們既要站在國家層面上看計算機發展和人才培養的需要,又要站在教師角度充分考慮一線教師的實際狀況,同時也要符合學生的長遠發展。在編程教學語言的選擇上,要廣泛征求各方面的意見和建議,采取科學合理的方案,多級聯動。面對洶涌而來的科技大潮和技術快速迭代的現實,我們更需要理性審視,不盲從、不武斷,這才是自信和定力的體現。
魏寧:我們再談一個學校教育之外的話題,隨著國家一系列政策的出臺,近年來,編程培訓產業鏈條快速發展,少兒“編程熱”也迅速升溫。據測算,2020年國內少兒編程市場將接近260億元的規模,少兒編程繼英語、奧數之后,成為新的培訓熱門,甚至有人說:“不懂編程等于半個文盲。”對于編程這種社會現象,我注意到您一直持理性態度。前一段時間您在一次接受記者采訪時針對社會“編程熱”就說,“并非每個小孩都需要學編程,在學有余力且感興趣的情況下可以學”,您還提醒記者要冷靜看待編程學習,這被認為是給編程熱潑了一盆冷水。您是怎么看的?
樊磊:是的,我認為,從國家和社會層面看,需要對計算機技術、信息技術感興趣且有潛力的學生,也希望發現這樣一批苗子。但我們的校內的編程教學還不能完全滿足家長的需求,這就造成了一個明顯的缺口,編程培訓市場就迎合了這樣一個需求。如果我們過于拔高編程對學生的作用,甚至從未來升學的功利性去考慮,那么,我確實建議“并非每個小孩都需要學編程,在學有余力且感興趣的情況下可以學”。
對大多數學生來說,從個人發展來看,編程就像語言一樣,是一個主要用來溝通、表達創意和思想、解決問題的工具。不同的是,編程主要是和計算機或互聯網的“溝通”。所以,學習編程語言,就是讓我們可以解決新問題、使用新技術,更好地表達自己。
從長遠看,市場化的編程培訓還是應該納入信息素養教育的大框架下,讓其成為信息素養教育落地的一個載體,這樣才會更有持續性。
總之,在“編程熱”這個問題上,學校、家長不要“走偏”,要牢記編程是一個工具,是要為學生學習、發展和思維培養服務的。
Python篇
魏寧:在中小學信息技術課程中,對于編程教學,目前的新教材普遍采用了Python作為核心編程語言。我知道,前一段時間,您也專門編寫了《面向中小學教師的Python編程入門》一書。作為國內Python編程語言方面的專家,您是怎樣看待Python語言的呢?對于中小學的編程教學,Python語言的優勢體現在哪里呢?
樊磊:Python是現代編程思想的產物,它具有語法簡單、開源、跨平臺、擴展性強等諸多特點,且擁有眾多功能強大的應用擴展庫,是眾多領域的主流應用(如可視化、生物信息學、大數據分析等)開發的首選語言。
對于基礎教育而言,它的優勢主要體現在以下幾個方面:
第一,從計算機科學的觀點看,Python是一種比較中性的語言,既吸納了近二十年來編程語言領域中的重要研究成果和新概念(如Lambda機制),同時在語言的最基本內核層面上又極少采用不成熟的或未經考驗的新編程機制。
第二,從運行機制方面看,Python同時具備解釋型、編譯型和腳本型語言的共同特點。
第三,從開發環境看,Python的開發環境支持包括Windows、OS X、Linux在內的所有主流操作系統和平臺。
第四,從擴展硬件方面看,Python的開源硬件接口庫種類繁多、功能完善,基本覆蓋了當前基礎教育領域中用到的擴展硬件。
第五,從語言支持服務方面看,Python是典型的開源平臺,與C/C++、JavaScript等重要編程語言有很好的應用庫共享機制。
第六,從應用層面看,Python有大量各種各樣的庫/框架,使得開發者僅需要編寫相對較少的代碼就可以完成令人印象深刻的準專業級應用。
第七,從教學實施情況看,Python特別適合做數據處理(數據管理、數據可視化、大數據分析等)相關的應用,與新課標的理念非常吻合。
魏寧:對于Python,我也聽到了一些不同的聲音,如有些一線教師反對Python進入中學課堂。他們的理由是C語言或Java語言相對于Python更加成熟、穩定,并且在大學教育中都有很好的教學基礎,這也就意味著學生在中學階段學習C或者Java后,在后續的大學階段會有比較好的銜接。事實真是這樣的嗎?
樊磊:我認為對編程基礎幾乎為零的中學生而言,首先應該讓他們在編程的學習中體會到編程的樂趣,盡快獲得成就感,并愛上編程,而不是把編程看作高深莫測、枯燥乏味的事情,甚至對學習編程“自帶恐懼”。從當下的中學編程教學來看,不喜歡編程教學的學生不在少數,這是應該引起我們反思的現象。從這個角度考慮,選擇Python作為編程語言還是有優勢的,因為它的語法簡潔易懂,對語法格式的要求非常低,可以說是最接近自然語言的程序語言,非常適合沒有編程基礎的學生。對教師而言,Python代碼在設計上強制要求縮進,方便了學習和維護,教師不需要花費大量的時間去處理代碼的格式錯誤。
至于說和大學的銜接,我首先要嚴肅地說明,Python絕不是一種“玩具(Toy)語言”,而是貨真價實的“工作(Working)語言”,是主流編程語言,更是數據分析領域的首選語言。假如學生能在中學階段接觸并且系統地學習Python語言,完全能夠打下良好的基礎,并在進入大學后直接深入研究,更快地參與到實際項目的開發中,乃至為今后的就業增加有分量的籌碼。
而且,說C或Java比Python在大學有更好的教學基礎并不準確。從國外的趨勢看,Python正在被更多的大學所青睞。有數據顯示,美國綜合排名前100名的大學超過70%都開設了Python編程語言類課程,卡內基梅隆大學從2010年開始就用Python取代了Java,作為計算機專業的第一門編程語言。斯坦福大學在2015年的時候,就已經開發了22門與Python相關的課程,并且逐漸將部分的C和Java語言淘汰。
國內的高校雖然步子比國外的高校慢一些,但也開始越來越重視Python了。北京理工大學是國內較早引入Python語言的高校,他們的公選課得到了學生們的高度認可,哈爾濱工業大學等也陸續開設了Python課程,《上海市高等學校計算機等級考試大綱(2016年修訂)》中也新增了Python程序設計模塊。我們有理由相信,在不久的將來,Python語言教學將會在國內迎來井噴期。
因此,通過中學階段對Python的學習,無論對今后的大學專業學習,還是自主創業,都是有益處的。
魏寧:剛才我們說到了Python語言的很多優點,但對中小學編程教學而言,Python語言畢竟是個新事物。而且,在現階段,它在編程教學中似乎也存在著一些問題。
樊磊:是的,不可否認,現階段,無論是小學、初中,還是高中,Python在編程和算法教學中都存在著很多問題。其中比較突出的有:第一,由于課時和年齡的限制,現有教材中涉及的算法內容無論在深度上還是廣度上普遍呈現“高不成、低不就”的窘態;第二,由于Python語言封裝了很多基礎算法的實現,而且涉及交錯復雜的概念(如數據類型、抽象數據類型等),再加上算法與數學、數據結構、編程語言特性都是密切關聯的,單純講算法本身也很難實施,所以,究竟是講算法的底層方法還是講高階應用,目前難以取舍;第三,算法教學對課程的核心——運用計算思維解決問題無論是在求解流程還是在問題深度上,都具有很強的示范性,如果實施不當,很容易將計算思維培養帶入誤區,這也是實踐中較易出現問題的地方。
魏寧:前面您曾提到了算法教學應遵循的幾個基本原則,那么,對具體的Python語言,它的算法教學是不是也應該遵循這些原則?
樊磊:關于Python語言算法教學的指導原則,我想應該有以下三點:第一,在算法的編程實現上,原則上不涉及較復雜或有較高技巧的編程,較復雜的編程實現只作為Python-like偽代碼實現,但算法作為教學案例,必須首先講清楚其背后的關鍵思想;第二,高階算法所解決的問題應具有典型性、時代性、選擇性、普適性和適用性,并且對學生的后續學習或其他學科的學習有啟示作用;第三,在時間和條件都允許的情況下,應針對解決同一類問題的、基于不同策略所實現的算法之間做性能對比,并挑選出較優算法。
魏寧:您能否用一個具體的案例來說明,在編程教學中,如何貫徹這些原則?
樊磊:好,我就用一個具體的案例來說明Python編程及算法教學中的一些特點,這個案例的場景來自高中新課標教材,就是著名的斐波那契數列的求解。
首先,斐波那契數列是最簡單的遞歸定義的函數,也就是函數體的內部包含了對函數自身的調用,而Python是支持函數的遞歸定義的,這也是函數式編程語言的特征之一。我們要注意到計算最后一個值的時候是需要一點時間的,因為在遞歸調用中,很多中間值要重復計算。而為了優化斐波那契數列的遞歸實現,一個最簡單的方法就是在每次計算中,將前面已經計算過的值“記”下來,不再重復計算。這種在計算過程中使用記憶的機制可以有效避免重復及浪費資源,是所謂“動態規劃”方法的一個最簡單的例子,也就是資源的動態再分配。
在此,我們就可以使用Python的迭代器、裝飾器等功能,從而讓斐波那契數列的函數更加簡化。教師們不妨嘗試一下斐波那契數列的Python編程。
魏寧:其實,對大多數教師,包括相當一部分信息技術教師而言,Python語言都是一種比較“奇怪”的語言,當他們在教學中面對Python語言的時候,多少都會有一種“心里沒底”的感覺。對于現階段在中小學采用Python作為編程語言的教師來說,在教學中,他們應該注意什么呢?您會給他們提出哪些建議呢?
樊磊:對采用Python作為編程語言的教師,在教學中,我有以下幾條具體建議:第一,要始終貫徹“需求導向,在做中學”的定位,千萬不要陷入“程序員模式”的編程教學中;第二,牢記在Python中,學會使用函數比掌握編程技巧更重要;第三,要掌握輸入/輸出函數,能夠靈活運用非數值數據類型,包括字符串、列表和字典;第四,要了解Python語言異常靈活的循環及控制結構;第五,鼓勵教師將Python當作現實版的“偽代碼”來使用,即使確實需要用偽代碼,也建議使用Python-like風格;第六,如果要使用Python的高級特性,編程案例應盡量依托Python語言特點,并以算法實現的需求適當漸次地引入,但建議教師們,除非絕對必要,盡量不使用Python的高級特性。
魏寧:我們知道,由于Python具有語法簡單、開源、跨平臺、擴展性強等鮮明特點,所以被認為是典型的“膠水語言”。因此,在支持創客教育、STEAM教育方面Python語言有著天然的優勢。
樊磊:是這樣的,眼下,創客教育、STEAM教育可以說開展得如火如荼。創客的本質是“造物”,因此,有很多與硬件編程相關,如Arduino、樹莓派等。但是,如果每使用一種硬件產品就要學習該產品的編程語言,這會讓創客的學習增加大量的成本,在一定程度上是阻礙創客教育發展的。這時,Python語言作為膠水語言的優勢就顯現出來了,正因為Python具有很強的擴展性,有很多與硬件相配套的庫,如Python能方便地與Arduino、Minecraft、樹莓派建立關聯,更是樹莓派的官方編程語言,所以,使用Python語言,教師可以在課堂教學中列舉更多的案例,從而拓展教學范疇,學生也可以直接把它運用到創客造物中去,這既為教師、學生省去了額外的學習成本,也為創客教育的發展提供了良好的教與學環境。
魏寧:非常感謝樊磊教授和我們一起分享有關編程教學的理念和實踐策略,以及關于Python編程語言的方方面面,我想這對一線教師從事編程教學或者具體的Python語言教學都會很有幫助。
樊磊:也謝謝你們提供這樣一個交流的窗口,祝編程教學和Python語言教學在教師們的共同努力下,取得更輝煌的成績。
本期對話在成文過程中,參考了樊磊教授的兩篇文章《高中信息技術課程中編程語言的地位、選擇及實施方法》《在高中信息技術課中培養學生計算思維的有效方法探討》,特此向兩篇文章的合作作者倪俊杰、林偉致謝!