梁見斌
藍調(diào)解碼
編程教育在中小學(xué)信息技術(shù)課程中,尤其是在高中新課程中應(yīng)既展現(xiàn)其語言語法知識的特點又彰顯其算法、技能、思維的價值,這是良好編程文化形成的基礎(chǔ)。本期解碼,讓我們走進新課程中的編程語言價值分析與編程教育中的人文內(nèi)涵契合分析,繼續(xù)共同探討如何建設(shè)良好的編程文化。
新教材作為新課程的重要內(nèi)容載體,對編程教學(xué)使用何種語言來說往往具有決定性的作用。新教材都把Python列為高中必修的計算機編程語言,對此很多教師表示不解:為什么是Python?論簡單它比不過Basic或Pascal,論速度它不如C和C++。特別是長期耕耘在信息奧賽一線的教練們,經(jīng)常吐槽忍受不了Python程序運行時的“龜速”。這樣一門飽受詬病的計算機語言,為什么偏要登上中小學(xué)編程教育的大雅之堂?實際上,與其問新教材為什么選擇了Python,不如問新教材到底需要什么樣的編程語言。高中信息技術(shù)學(xué)科核心素養(yǎng)由信息意識、計算思維、數(shù)字化學(xué)習(xí)與創(chuàng)新、信息社會責(zé)任四個核心要素組成。編程教學(xué)是培養(yǎng)學(xué)生計算思維的重要形式,我們要充分考慮中小學(xué)生的年齡特點、知識結(jié)構(gòu)和個性特征,選擇合適的計算機編程語言,引導(dǎo)孩子順利踏上編程之旅,學(xué)會利用計算機解決實際問題,培養(yǎng)數(shù)字化時代合格公民。那么,適合高中信息技術(shù)課程的編程語言應(yīng)該具備哪些特點呢?作為一名自學(xué)編程近20年的業(yè)余愛好者和高中信息技術(shù)教師,筆者想從編程實踐和課堂教學(xué)的角度談?wù)勛约旱目捶ā?/p>
● 新教材需要便于初學(xué)者入門的編程語言
我們經(jīng)常聽到人們評論某種編程語言好學(xué)或者難學(xué),他們是根據(jù)什么標準來判斷的呢?是語法規(guī)則的簡繁性,還是代碼實現(xiàn)的難易度呢?例如,很多人認為C語言比較難學(xué),其中一個原因是它的指針概念過于抽象,使用方法又太靈活,容易出錯;相比之下,Pascal語言就比較好掌握,容易學(xué)。
這些都是表象,初學(xué)者不需要開始就掌握所有的語言特性,隨著學(xué)習(xí)的深入,自然會熟悉各種語法規(guī)則。真正的難點不是掌握語法規(guī)則,而是理解代碼的意義。編程是抽象的藝術(shù),初學(xué)者很難理解抽象代碼的運行過程,通常只能看到一個快速閃現(xiàn)的結(jié)果,只有長期訓(xùn)練才能學(xué)會跟蹤代碼,明白各種算法結(jié)構(gòu)的含義。
Python是一門面向初學(xué)者的語言,它的語法簡潔,貼近自然語言。例如,其中的turtle模塊(海龜繪圖)源于1966年誕生的Logo語言,是入門Python的有趣工具。turtle模塊通過繪圖來呈現(xiàn)程序運行過程,實現(xiàn)了代碼運行過程的可視化,可以將抽象的代碼和形象的動畫聯(lián)系起來,幫助初學(xué)者快速理解每一條語句的作用,“親眼看到”程序運行的過程,大大降低了學(xué)習(xí)的門檻,成為眾多編程入門者的首選。
筆者曾經(jīng)開設(shè)了一門選修課程——《海龜繪圖案例分析》,只需要6~8個簡單的繪圖案例,就能幫助學(xué)生掌握數(shù)字、字符串、列表、元組和字典等基本數(shù)據(jù)類型,熟悉順序、選擇和循環(huán)結(jié)構(gòu),并理解自定義函數(shù)和模塊化編程的特點。整個教學(xué)過程由淺入深、層層遞進,完全根據(jù)項目需求引入相關(guān)知識點,而非強行“入戲”。
例如,學(xué)生學(xué)習(xí)了順序結(jié)構(gòu)以后,能夠繪制三角形、四邊形等簡單圖形,此時提出繪制正多邊形的任務(wù),學(xué)生雖然能夠通過復(fù)制粘貼代碼的方式實現(xiàn),但同時感受到了重復(fù)勞動的枯燥和煩瑣,希望能夠有更好的方法來替代。此時提出循環(huán)的概念(甚至不需要教師提出,部分學(xué)習(xí)能力強的學(xué)生會主動尋找新方法),學(xué)生會很容易接受,并主動學(xué)習(xí)循環(huán)結(jié)構(gòu)的不同表示方法。
又如,在完成“滿天繁星”項目時,需要繪制不同顏色和尺寸的五角星,雖然學(xué)生可以通過復(fù)制粘貼代碼并做簡單修改的方式實現(xiàn),但肯定對冗長和重復(fù)的代碼不滿意。此時,教師可以引導(dǎo)學(xué)生分析經(jīng)典的circle()和dot()方法,模仿設(shè)計自定義函數(shù),體會模塊化編程的優(yōu)越性。
為了降低編程的學(xué)習(xí)門檻,為初學(xué)者提供更友好的編程環(huán)境,很多教師建議使用圖形化編程語言入門,等學(xué)生對編程感興趣以后再逐步轉(zhuǎn)向代碼式編程。筆者對此有不同看法,認為不能簡單地把初學(xué)者劃為一個群體,應(yīng)該根據(jù)其年齡和心智特點做進一步細分。以寫作教學(xué)為例——編程和寫作有很大的相似之處,其學(xué)習(xí)方法也是相通的。教師在教幼兒園或小學(xué)低段的學(xué)生寫作時,并不要求孩子都用文字來表示,可以部分或者全部都用畫畫來代替;但隨著孩子心智的成熟,要表達的想法越來越抽象和復(fù)雜,此時圖案就不如文字方便和準確了。編程教學(xué)也一樣,由于低幼兒童不識字,也缺乏必要的抽象思維能力,使用圖形化編程語言可以降低入門門檻,讓孩子們體驗編程的樂趣,是一種有效的引導(dǎo)手段;但高年級學(xué)生或者成年人還是直接從代碼式編程入門較好,從實用角度出發(fā),編寫具有實用功能的程序,才能真正激發(fā)學(xué)習(xí)的動力和創(chuàng)造力。
Python可以作為面向初學(xué)者的語言,還有另一種原因,那就是Python對初學(xué)者很友好,但對已有其他編程語言經(jīng)驗的“老手”則不盡然。不少老教師表示很不習(xí)慣Python的語法,覺得它太靈活,容易出錯,其實這些錯誤往往是因為教師混用了其他語言的語法,等他們熟悉了Python語法,這些錯誤自然就會消失。
語法錯誤容易糾正,思維僵化才是最大的阻礙。Python是一種解釋型動態(tài)語言,它和C++等編譯型靜態(tài)語言有很大的不同,看上去不夠嚴謹和規(guī)范,但這正是它更接近自然語言的地方。我們只有摒棄慣性,開放思維、排除干擾、輕裝上陣,才能更好地領(lǐng)會Python優(yōu)雅高效的特點,編寫出Pythonic代碼。
● 新教材需要便于詮釋算法思想的編程語言
算法是程序的靈魂,只有掌握了算法,才能輕松地駕馭程序開發(fā)。提升學(xué)生計算思維的一個重要途徑就是進行算法教學(xué),培養(yǎng)學(xué)生分析問題、抽象建模和設(shè)計算法的能力。
每種編程語言都有自己的特性。例如,C語言貼近底層,程序執(zhí)行效率高,代碼簡潔緊湊、靈活多變,但是C語言的語法限制不太嚴格,影響程序的安全性,對程序員的要求也很高,需要考慮較多的底層細節(jié),一不小心就會出錯;從執(zhí)行速度來看,Python程序確實不如C語言編寫的程序快,這是因為C/C++是編譯型語言,直接將代碼編譯成機器指令,而Python是解釋型語言,先逐行將代碼轉(zhuǎn)換為字節(jié)碼,再轉(zhuǎn)換為機器碼來執(zhí)行。
從詮釋算法思想的角度來看,Python具有更大的優(yōu)越性。這是因為,首先Python語法更接近自然語言,表述更直接和簡明,其次Python豐富的標準庫提供了很多基礎(chǔ)功能,程序員可以很方便地實現(xiàn)算法模型,從而把注意力放在整體目標而不是底層細節(jié)上。
例如,為了提高查找的效率,我們經(jīng)常使用哈希表結(jié)構(gòu)。如果使用C語言編程的話,需要自己構(gòu)造哈希表和設(shè)計哈希函數(shù),這需要考慮很多內(nèi)部細節(jié)和編寫較長的代碼。但使用Python就簡單多了,只需設(shè)置一個字典類型的變量即可,因為字典本身就是一個哈希表,我們只需了解字典的特征和使用方法,而無需考慮其內(nèi)部細節(jié),大大提高了編程效率。
現(xiàn)在“力扣”和“阿里云TIANCHI天池”等在線編程網(wǎng)站,都提供了Python程序的評測功能,越來越多的優(yōu)秀Python題解出來了。通過比較,大家發(fā)現(xiàn)用Python語言詮釋算法思想確實更簡潔和自然;再加上Python動態(tài)語言的特性,使用列表或者字典可以很方便地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),有利于快速建模和編寫更簡明的代碼。
目前,Noip等信息競賽規(guī)定使用的編程語言是C和C++,這里有程序執(zhí)行效率方面的原因,但不是主要原因。信息學(xué)競賽確實追求程序的速度,希望選手通過優(yōu)化算法來提高程序效率,但算法的優(yōu)化與編程語言是無關(guān)的,不同的編程語言使用不同編譯環(huán)境,簡單地比較其運行時間和所占內(nèi)存大小是沒有意義的;比賽時也會對不同語言編寫的程序進行分組,分別比較。相信隨著評測技術(shù)的進步,會允許更多的語言出現(xiàn)在信息競賽中,Python也會憑借自己的獨特優(yōu)勢占據(jù)重要一席。
● 新教材需要便于解決實際問題的編程語言
學(xué)生學(xué)習(xí)編程語言,不僅是為了考試,更是因為它有用(部分學(xué)生甚至認為它有趣)。目前,Pascal和C語言教學(xué)似乎更多的是為了考試和比賽,而非解決生活中的實際問題,很難提起學(xué)生的興趣。Python則不然,它是一門面向?qū)嶋H應(yīng)用的語言,學(xué)生只需要掌握基本的語法,就可以調(diào)用豐富的庫函數(shù)實現(xiàn)復(fù)雜的程序功能,解決生產(chǎn)生活中的實際問題。
例如,在學(xué)習(xí)了爬蟲技術(shù)以后,學(xué)生可以在網(wǎng)上爬取大量的古詩詞資料,加以整理后,就能編寫飛花令和詩詞接龍等文字游戲,提高了語文學(xué)習(xí)的興趣與效率;又如,在學(xué)習(xí)了數(shù)據(jù)分析和可視化以后,學(xué)生可以編寫成績處理軟件,幫助教師對全校甚至全市的成績進行分析和可視化處理,了解各學(xué)科之間的聯(lián)系和影響學(xué)生成績的深層次原因。
隨著信息技術(shù)的快速發(fā)展,人類社會的數(shù)字化程度越來越高,數(shù)字化時代對人們的信息素養(yǎng)要求也會越來越高,今后編程將會像閱讀和寫作一樣成為一種基本技能,我們的學(xué)生應(yīng)該從小就學(xué)會使用數(shù)字化工具來解決實際問題。而Python語言正提供了這樣一種可能,它通過引入第三方庫,只需要簡單的幾行代碼就能實現(xiàn)復(fù)雜的程序功能,可以方便地幫助孩子實現(xiàn)爬蟲、數(shù)據(jù)分析和可視化、人工智能或游戲編程等多個領(lǐng)域的項目實踐,讓編程融入孩子們的生活。
當然,Python語言也還存在各種各樣的不足,但相信隨著技術(shù)的進步和版本的更迭,這些問題都將被克服。更重要是,語言只是工具,學(xué)習(xí)編程并不是學(xué)習(xí)語言本身,而是掌握使用計算機編程解決實際問題的方法。隨著編程技術(shù)的提高,我們自然會發(fā)現(xiàn)更好的語言工具。綜合使用多種工具來解決復(fù)雜問題,這才是新課程倡導(dǎo)的學(xué)習(xí)目標。