傅騫 唐文靜 王雯 鄭婭峰


摘要:編程模式是指在代碼中重復出現且具有結構意義的代碼片段,準確識別高中程序設計所需的編程模式有助于教師把握編程教學的重點和途徑,提升編程課程的教學效果。當前的編程教學研究鮮有關注編程模式對編程教學的意義,也未有研究明確高中編程教學中的編程模式內容和數量。為此,研究依據編程模式的結構特點,采用序列模式挖掘方法自動識別了高中階段編程教學涉及的編程模式,并進行了有效性驗證。結果表明,從現行高中信息技術課程必修“程序設計”模塊識別的共計18種編程模式涉及多種基礎知識點的復合應用,能夠有效擴展編程教材中的教學知識范疇。研究還進一步闡述了編程模式的實踐教學價值,并從教學內容、教學方法、教學資源三個方面給出了利用編程模式實施編程能力培養的具體方法。
關鍵詞:編程模式;編程教學;高中程序設計;序列模式挖掘;計算思維
中圖分類號:G434 文獻標識碼:A?文章編號:1006-9860(2021)02-0061-07
一、引言
自陳國良院士倡議將計算思維引人計算機基礎教學。以后,計算思維得到了國內計算機基礎教育界的廣泛關注和重視。計算思維是運用計算機科學的基礎概念進行問題求解、系統設計,以及人類行為理解等涉及計算機科學的一系列思維活動。研究表明,21世紀技能中的創造力、批判性思維、問題解決能力等諸多技能均與計算思維高度相關3。因此,計算思維能力培養得到了各國教學界的普遍重視。2017年,我國發布《普通高中信息技術課程標準》,明確將計算思維能力作為信息技術學科的核心素養。
程序設計是學習和培養計算思維的重要載體。計算思維培養的目的是讓學生用計算機的思維方式去解決問題,提高問題解決的邏輯思維能力,而編程學習恰恰提供了最直接的思維能力培養的手段和方法。青少年通過編程學習算法邏輯、分解復雜問題、設計解決流程等,這一過程充分體現了算法理解、抽象與分解等計算思維核心概念的習得過程。當前,在中小學階段廣泛開展編程教育已得到社會各界的共識,并成為中小學實施計算思維、問題解決能力、創新思考和分工合作等綜合技能培養的重要途徑[8]。
然而,我國的編程教育整體還處于初級階段,以計算思維培養為導向的編程教學模式仍處在探索階段。教學內容的重難點把控、計算思維的階梯式培養路線以及教學資源的多維度立體化建設等方面都存在較大的空白。當前,在中小學階段的編程教學中,往往注重基礎語法知識的講授,而忽視學生對問題的整體分析、對知識點的綜合運用,使得學生真正解決復雜問題時無從下手。同時,計算思維能力的培養路徑多憑教師個人經驗,采用何種方式強化思維培養存在較大的“專家盲點”"。在教學資源的建設方面,如何避免單一的語法知識訓練,采用以計算思維訓練為主線的多維度資源組織形式還沒有明確的方法路徑。
在編程教學中引入編程模式,能夠將計算思維培養以可操作的形式落實到具體的課程內容和教學過程中,從而較好地解決上述難題。編程模式是指在代碼中重復出現且具有結構意義的代碼片段,它可以認為是從編程經驗中經過抽象和升華提煉出來的知識體系。它并不在教材知識的掌握目標中明確出現,卻是解決某一類問題的方法論,具有更高的知識深度和更廣泛的應用基礎。例如,編程模式通常能夠幫助程序員分解復雜問題,分模塊形成解決方案,快速完成編碼實現。在編程學習中,掌握了編程模式的學生能夠較為容易的完成從簡單語法知識應用到綜合知識應用的能力過渡。因此,在培養計算思維的教學過程中引人編程模式,有利于從基本算法思維到抽象與分解等計算思維核心能力的階梯式培養。同時,由于編程模式反映了高階計算思維能力,考察編程模式的掌握程度,可以作為評估計算思維發展程度的有力工具。
當前,在大學計算機相關專業的教學中,常常有設計模式、編程框架、算法設計、數據結構這樣的與編程模式相關的課程,但在當前的高中編程教學中,算法設計中只針對基礎的順序結構、分支結構和循環結構或整體的枚舉和遞歸的算法思想進行講解,具有更為復雜語法結構的編程模式雖在教材示例代碼中出現,但在教材的知識講解中卻沒有明確指明,編程模式的重要性被忽略。例如,在人教&國圖版教材講解循環結構時,只涉及了for循環、while循環、循環嵌套以及break和continue語句4個知識點講解。而實際上,在利用break和continue語句跳出循環時,須有一個if條件語句進行判斷,這意味著學生在完成跳出循環體的任務時,必須掌握循環語句與if條件語句的嵌套,這在教材中并未提及。這也造成在實踐教學中,教師鮮少關注到從掌握程序設計基礎知識到培養計算思維之間的過程是什么,即思維范式顯性化的編程模式教學內容常常被忽視。基于此,本研究基于編程模式的語法結構特征,從新編信息技術教材程序設計模塊配套源程序中,自動挖掘高中基礎程序設計中常用的編程模式,明確常用的編程模式數量和范圍,并更進一步闡述運用編程模式培養計算思維能力的重要教學意義和具體操作方法。
二、基于序列模式的編程模式抽取方法
編程模式(或稱代碼習語)指在代碼中重復出現的且具有結構意義的代碼片段,具有單一的語義目的。因此,采用序列模式挖掘算法可以快速識別這些高頻的具有固定序列組合的片段,從而達成編程模式自動挖掘的目的。高中基礎編程教學課程中涉及的源程序數據集較小,程序結構相對較為簡單,不涉及復雜算法和數據結構。因此本文采取序列模式挖掘中的PrefixSpan算法實施編程模式的抽取,其在執行效率、時間復雜度和空間復雜度方面優于經典的Apriori和GSP算法。
在編程模式抽取中,首先通過對源程序進行語法解析,將源程序識別為抽象語法樹;然后基于抽象語法樹,結合結構性的知識點語法特征,將樹中具有結構意義的節點名字和結構信息命名形成項,多個項形成具有結構信息的源程序序列;最終基于PrefixSpan算法挖掘源程序序列中的頻繁序列,通過語法分析和規則判斷對頻繁序列進行還原得到編程模式,具體過程如下:
(一)數據選擇
高中信息技術課程標準發布至今,全國各地共出版五個版本的信息技術教材,教材中均包含Python基礎程序設計內容。本研究的源程序來源于最新五個版本的信息技術必修一《數據與計算》中的基礎程序設計模塊課程示例和配套答案,五本教材分別為:滬科教版、浙教版、粵教版、教科版和人教/國圖版,挖掘所用的配套源程序數量共有141個。
(二)編程模式挖掘
本研究挖掘編程模式的算法為PrefixSpan算法,在PrefixSpan算法中涉及以下幾個基本定義:
在PrefixSpan算法中將一個源程序序列定義為S:
令:S=(g1,g2,g3……ga)
其中n為一個源程序中出現的body屬性的語法點的個數,如圖1所示,出現了“Module”和“For”所以n=2。gi(1
支持度Support(S):在數據集中含有S的序列個數。
頻繁序列:在知識點序列數據集中,如果序列S出現的頻率不低于閾值min_supports,則將S視為頻繁序列。
min_supports:自定義的支持度的最小值,用以判斷是否為頻繁序列。
根據PrefixSpan算法的基本定義,需要將配套源程序轉化為源程序序列數據集。在此過程中,若簡單地將源程序視為字符串進行處理,容易丟失源程序的語法結構,因此本文基于源程序的語法解析結果生成源程序序列。
首先,在語法解析過程中,生成源程序的抽象語法樹。抽象語法樹的根節點一般為“Module”,其余每個節點是抽象語法樹的一個節點模塊,每個節點會有節點名稱和多個節點屬性。由于本研究挖掘的目的是發現有意義的代碼組合,所以將針對選擇結構、循環結構、函數定義等具有較為復雜結構的節點進行挖掘。這些節點都具有body屬性,body屬性以列表的形式存儲執行結構中的語句。
接下來,利用語法解析生成抽象語法樹形成源程序序列數據集。現以上頁圖1為例為說明數據處理結果。上頁圖1中右上角是源程序,對應生成圖中的抽象語法樹,其中具有body屬性的結構性語法節點有“Module”“For”和“If”節點,body列表中的節點在圖中用帶陰影方框圈出,即待挖掘的子序列,實線箭頭表示屬性,虛線箭頭表示省略部分。在抽象語法樹中,屬于同一深度且在“body”屬性列表中的語法節點組成一個子序列,并用小括號進行封裝,如子序列1和子序列2所示。子序列中的每一項表示一個語法節點,項的名稱表示方式為“父節點名稱_該節點名稱”如子序列1中第一個元素可以表示為“Module_For”,以此類推,最終生成中圖中右下方所示序列。
由于教材中有26個源程序較為簡單,全部由無body屬性的知識點組成,所以141個源程序經過預處理后,最終得到115個源程序序列。對這些源程序序列進行編程模式挖掘:首先,設置最小支持度min_supports為18,基于PrefixSpan算法對這115個源程序序列進行挖掘,得到頻繁序列;然后,對挖掘所得的頻繁序列進行語法分析,還原成抽象語法樹,其類型分為嵌套關系和間接并列關系;最后,對得到的抽象語法樹去重,將抽象語法樹轉化為編程模式,得到最終的編程模式。基于該方法的編程模式。
三、編程模式挖掘研究結果
(一)頻繁序列及編程模式挖掘結果
研究共得到18個編程模式及其對應的頻繁序列,18個編程模式均體現了知識點的嵌套關系,而其中有5個編程模式體現了間接并列關系,具體如表1所示,代碼示例展示了編程模式在源程序的具體體現形式,每個編程模式的支持度用Support表示。
(二)結果驗證
通過PrefixSpan算法挖掘得到編程模式后,研究向具有Python教學經驗的高中教師發放問卷,以驗證所得編程模式的準確性和有效性。問卷采用量化的方式,將選項按照認同程度分為“非常同意、同意、一般、不同意、非常不同意”五個等級,并依次賦予5、4、3、2、1分,從而將教師的直觀感受量化。問卷設計了20個問題,包括18道題詢問所得編程模式是否在教學中常用,以及2道陷阱類題目用以檢測收回的問卷是否有效。在本研究中,調查問卷共發放49份,收回有效問卷41份,問卷信度系數值為0.885,大于0.8,數據信度質量很高,問卷所得數據可做進一步分析。
對問卷進行預處理后,計算教師評價各個編程模式的平均分,用來衡量各個編程模式在教師心中的認可度,用Approval表示。整體上,編程模式的認可度差異不大,均值均高于3分,標準差約為0.28,最大值比最小值相差1.05分,說明挖掘所得的編程模式受到教師的認可。將算法挖掘所得編程模式的支持度和教師評分的平均分做斯皮爾曼雙變量相關,相關性顯著(ρ=0.018)且呈正相關關系。因此說明了PrefixSpan算法挖掘編程模式的有效性,以及挖掘所得的編程模式在實際教學實踐中具有一定的教學意義。
(三)結果分析
從挖掘結果來看,編程模式的組成部分主要來源于if條件語句,while循環、for循環、函數、變量這5種最常用的基礎程序設計教學知識點,這些單個的教學知識點在教材中都以知識要點的形式明確進行了解釋。但是,從抽取的編程模式也可以看出,知識點的多種搭配應用范式在教學和教材中往往被忽略。此次抽取的支持度較高的18種編程模式,涉及了for循環和if語句、雙重if語句與變量賦值、while條件語句和變量賦值等未在教材知識講解中明確講解的編程知識。這些編程模式雖然不是基礎知識點,但對于學生靈活運用知識點解決編程問題尤為重要,因而在教材的實踐活動項目及練習提升作業題等部分多次出現。如第5種模式“for循環+if條件語句”的組合應用,在5種教材中都未有這一知識點的明確講解,但是在人教&國圖版教材的break語句程序示例,練習提升中猜數游戲和課程例題票據中模糊數字推斷問題等環節中多處出現。又如,第17種“while語句嵌套if條件語句后進行變量賦值”的編程模式對于解決人教版教材實踐活動中較為簡潔地解決“尋找1000以內的素數問題”必不可缺。由此看出,編程模式基于基礎知識點,但深度高于基礎知識,是基礎知識的在實踐中的靈活應用。
另外,編程模式是結構性語法節點組合的復雜結構,其本質體現了解決特定問題的泛化編程思路。如,在實際編程過程中,在while循環中常運用if條件語句作為循環終止的結構,用以解決眾多涉及循環跳出的編程問題。所挖掘的第13條編程模式“while循環嵌套if語句”就明確了這一模式在應用中的使用,因而教師在課程中教授該模式顯得非常有必要。又如,在對列表中符合某一條件的數據進行針對性處理時,第5種模式“for循環中嵌套if條件語句”是簡潔而直接編程的思路。從這些具體的已挖掘的編程模式也可以明確,編程模式作為高階思維的顯性化表達形式,為解決編程所需的具體結構框架提供參考,是知識點與問題解決方式的橋梁,需要在教學活動中得到重視。
四、運用編程模式優化編程教學的實施建議不管是編程模式的自動挖掘還是編程教師的日常實踐,都表明了編程模式在程序學習中的客觀存在。但由于缺乏明確的編程模式引導,盡管意識到編程模式的教學價值,教師仍無法直接將其用于編程教學。基于本研究的挖掘結果,可以充分運用這些編程模式通過以下三個方面來促進編程教學。
(一)重構與優化編程教學知識體系
認知理論表明,編程教學知識點之間應該有所關聯,教學應該以簡單的知識點為起點,逐步引入比較難的知識點。但是,當前的編程教學知識體系重點仍在低階語法知識的掌握與運用,在展開復雜度較高的編程任務時,簡單知識體系無法保證學生從基礎知識順利過渡到知識的綜合使用。高階知識內容仍然是目前編程教學整體大知識體系中最為匱乏的內容,也是教學內容設計中的難點。根據新課標,程序教學的知識重點是幫助學生掌握輸入輸出、變量、選擇結構和循環結構等知識點,而綜合運用知識點明確問題,識別問題空間,則是能力培養的重點。從挖掘結果也可以看出,這些編程模式大多是循環結構和選擇結構與變量、print函數和模塊調用函數復合形成的,是綜合知識能力運用的具體表現。因此,以編程模式為重點的教學內容強化了循環和選擇結構、變量、print函數和模塊調用函數的學習,十分切合新課標教學目標中對重難點知識技能的要求。
基于此,教師可以將編程模式的掌握列人到教學目標中來,將編程模式作為編程學習知識結構的重要組成部分,確保學生知識體系的完整性。編程模式是知識點的組合,在解決復雜問題進行編程實踐時,教師可以將編程模式作為重難點知識進行講解和運用,利用編程模式將知識點進行關聯,幫助學生建立一個系統性強、層次分明的認知結構。從表1可以看出,編程模式的結構越簡單,支持度越高。因此,在整個教學內容體系的設置上,需要按照支持度從高到低的次序把編程模式逐步加入到編程教學內容中。而在課時教學內容的設計上應該注重讓學生逐步理解、運用編程模式,首先,在教學目標的設定上需要加人編程模式,讓學生理解編程模式的重要性;然后,在示例代碼的講解中需要歸納該代碼所含的編程模式,讓學生理解編程模式的特點;最后,在課后作業中需要布置和本課編程模式相匹配的編程習題,讓學生掌握編程模式的應用。
(二)構建高階認知發展的教學路線
編程模式是高階編程學習的一個重要知識,能夠為學生提供解構復雜問題場景的有效路徑,即指引問題解決的思路和架構整體解決框架。作為中介橋梁,編程模式的有效掌握將大大縮減學生從低級認知到高階認知學習的鴻溝。因而,靈活運用編程模式構建面向高階認知發展的教學路線,將極大地深化編程教學領域現有的教學內容和教學設計方法。借由編程模式在認知上形成的基礎知識點和編程應用的關鍵連接,有利于幫助學生在知識點與實際編程之間建立過渡關系,符合高階學習的認知規律。因此,可以利用編程模式分解知識內化步驟、增加知識內化次數、降低學習難度、優化編程教學路線,促使學生高階認知能力的發展。
基于此,教師可以運用本研究挖掘得出的編程模式來改進編程教學方法,在代碼講解環節中引導學生通過歸納編程模式來提升代碼編寫能力,按照自頂向下逐步細化的思想,利用編程模式明確給出編程的一般性步驟,從而讓學習者對算法有一個總體把握,而非糾結于細節語法錯誤。在操作上,建議采用SCS創客教學法"進行編程教學,并在知識要點講解環節按照“新語法講解一程序框架講解一編程模式講解”的順序進行,具體過程建議如下:情境故事引人環節,通過設置情境激發學生對待解決問題的興趣;單任務模仿環節,引導學生在教師安排下按照教材完成代碼編寫并運行成功;知識要點講解環節,先講解本代碼中新出現的語法知識,再講解程序的總體框架,把代碼組合和程序功能對應起來,最后按照從簡單到復雜的順序和學生一起歸納其中的編程模式;在擴展任務模仿環節,教師根據編程模式匹配的要求,在不增加語法知識和新的編程模式的基礎上,帶領學生完成一個復雜度更高的任務,幫助學生加深對編程語法及編程模式的理解;創新激發引導環節,引導學生在擴展任務的基礎上根據現實需求加人新功能;協同任務完成環節,學生通過相互協助,確認需要完成代碼的最終功能,然后獨立完成代碼;成功作品分享,提供機會,讓學生分享自己的作品,從代碼功能、程序框架和編程模式三部分進行分享。
(三)構建結構化編程教學資源
當前高中編程教學資源庫的建設還比較單一,多以基礎知識的訓練為主,以問題解決為特征的探究式、項目式教學案例資源設計尤為缺乏。這是因為在具體的教學案例資源建設中,對以現實情境為問題出發點的任務如何進行有效的條件約束,使其在保持問題復雜度的同時能夠將知識范疇界定在可掌握的范圍,對于一線教師具有巨大的挑戰。以編程模式為支架構建面向復雜問題解決的高質量教學資源,將有助于幫助教師理清設計主線,確定知識邊界范圍,推進以計算思維能力為主的教學核心目標的達成。
基于此,教師可以在創建編程教學資源時以多樣的編程模式為抓手,設計符合學生認知發展及具有思維挑戰性的校本教材、教學案例、編程題庫和微視頻等教學資源。具體來說,可以從知識理解和思維提升兩個維度來使用編程模式。知識理解維度強調編程模式的功能與作用,通過設計資源讓學生反復練習來加深其對編程模式的掌握思維訓練維度則強調編程模式與實際問題的關聯,通過將編程模式內隱在實際場景中,讓學生提升在現實問題中快速應用編程模式的能力。不同類型的資源需要不同的編程應用模式:在校本教材中,可以按照編程語法和編程模式相互結合的方式實施,尤其是課程后期教學進行到綜合運用階段,需要按照編程模式的復雜度來設計課程教學資源;在教學案例中,建議多引導學生思考現實問題和編程模式之間的聯系;在編程題庫中,建議和教材資源開發一樣,通過編程語法和編程模式的相互結合來實現編程任務的循序漸進,在微視頻中,可以考慮把特定編程模式的講解和應用做成獨立微課。
綜上所述,以編程模式為主線的教學內容優化、教學方法改進以及教學資源擴展,使得當前的計算思維能力培養在教學實踐層面上能夠形成一個清晰的表達體系,而不僅僅停留在教學理論層面。在教學內容上,將編程模式納人教學重難點,促進了以“構造”為特征的問題求解方法的培養,進一步強化了以計算思維培養為核心的教學目標;在教學方法上,利用編程模式增強基礎知識講授到復雜問題解決應用之間的過渡環節,使得教學方法遵循程序設計學習認知規律,使得計算思維培養方法更具科學性;在教學資源上,以編程模式為主線的資源建設不僅能夠涵蓋知識的思維性、關聯性、豐富性和完整性,更重要的是,在典型教學案例、練習題的設計中以編程模式為內在靶點可以幫助設計者較容易地在任務的現實性和問題的復雜性之間找到平衡,設計出能夠根據編程模式知識體系清晰轉化為計算機求解問題的案例,以及促進學生在認識、內化編程模式的過程中形成相對穩定的程序設計學科思維方法。
五、結語
在編程教育政策的驅動下,高中編程教學從選修逐步過渡到必修僅有短短幾年的時間,且課時安排較少,教師教學經驗也較為匱乏。當前的教學內容、方法及資源建設多沿用了高等計算機教育的模式,造成知識體系龐大、教學內容冗雜等問題。編程模式可以為準確定位高中編程教學課程的教學重點,優化教學內容與方法,以及找到計算思維培養的有效途徑提供具體支持。本研究在對新版高中信息技術教材進行分析的基礎上,通過PrefixSpan算法挖掘得出了高中編程教學常用的18個編程模式,并通過高中編程教師的問卷反饋得出這些編程模式在高中編程教學的實際應用情況;然后從教學內容、教學方法、教學資源三方面闡述了編程模式具有的重要教學意義,并給出了具體的操作建議。在未來的研究中,應關注運用編程模式開展教學相關的實證研究,挖掘編程模式在編程教學中的實踐價值。
參考文獻:
[1]陳國良,董榮勝.計算思維與大學計算機基礎教育[J].中國大學教學,2011,(1):7-11+32.
[2] Wing J M.Computational thinking [J].Communications of the ACM,2006.,493):33-35.
[3] Binkley M,Erstad O,et al.Defining twenty-first century skills [M]. Dordrecht:Springer Netherlands,2012.
[4]中華人民共和國教育部.普通高中信息技術課程標準[M].北京:人民教育出版社,2018.
[5]于紀明,李冠瓊等.基于編程解決問題的青少年計算思維培養框架[J].計算機教育,2020,(7):98-101.
[6]孫立會,王曉倩.計算思維培養階段劃分與教授策略探討——基于皮亞杰認知發展階段論[J].中國電化教育,2020,(3):32-41.
[7] Bers M U.Coding as a playground:Programming and computational thinking in the early childhood classroom [M].New York:Routledge & CRCPress,2018.
[8]孫丹,李艷.我國青少年編程教育課程標準探討[J].開放教育研究,2019,25(5):99-109.
[9]李陽.計算思維導向的跨學科兒童編程教育模式研究——基于芬蘭兒童編程教育的經驗與啟示[J].現代教育技術,2020,30(6):19-25.
[10]郭銀章,王麗芳.基于項目任務驅動的C語言程序設計課程教學改革與實踐[J].計算機教育,2017,(2):41-44.
[11]亞達夫,錢逸舟.如何有效開展編程與計算思維教育:教師教育的視角[J].中國信息技術教育,2020,(8):4-8.
[12] lyer S.Cheung et alLleaming Programmaic Idioms for Secalable Semantic Parsing [Cl-Hong Kong:Association for Computational Linguistics,2019.
[13] Allamanis M,Sutton C.Mining idioms from source code [C].Hong Kong: Association for Computing Machinery,2014.
[14]姬浩博.基于PrefixSpan算法的Web模式挖掘方法研究[D].太原:山西大學,2016.
[15]張婷燕,周春紅等.優化學生認知結構提高《C語言程序設計》教學質量[J].商場現代化,2011,(9):151-152.
[16]傅騫.基于“中國創造”的創客教育支持生態研究[J].中國電化教育,2015,(11):6-12.
作者簡介:
傅騫:副教授,博士,碩士生導師,研究方向為信息技術及教育應用、創客教育。
唐文靜:在讀碩士,研究方向為教育大數據、創客教育。王雯:研究方向為教育大數據、創客教育。
鄭婭峰:副教授,博士,研究方向為研究方向為教育大數據、學習過程自動分析。
收稿日期2020年8月2日
責任編輯:邢西深