張渤
程序設(shè)計教學(xué)(編程教育)已經(jīng)成為信息技術(shù)教學(xué)的核心內(nèi)容之一。在以信息經(jīng)濟(jì)、低碳經(jīng)濟(jì)等經(jīng)濟(jì)形態(tài)為主導(dǎo)的當(dāng)代社會背景下,從人的全面發(fā)展出發(fā),人才的培養(yǎng)核心是核心素養(yǎng)。程序設(shè)計教學(xué)成為信息技術(shù)學(xué)科核心素養(yǎng)——計算思維培養(yǎng)的重要途徑。而在中學(xué)程序設(shè)計教學(xué)中,還存在一些不足甚至錯誤做法,嚴(yán)重影響著信息技術(shù)教學(xué)效果,無法達(dá)到預(yù)期的育人目標(biāo)。無論是從宏觀課程設(shè)計,還是從微觀教學(xué)內(nèi)容來看,借助軟件工程思維有利于擺脫純粹的理論教學(xué),重構(gòu)課堂,培養(yǎng)學(xué)生統(tǒng)籌規(guī)劃、綜合設(shè)計、分析推理等關(guān)鍵能力。
軟件工程學(xué)是一門研究用工程化方法構(gòu)建和維護(hù)有效、實用、高質(zhì)量的軟件的學(xué)科。它涉及程序設(shè)計語言、數(shù)據(jù)庫、軟件開發(fā)工具、系統(tǒng)平臺、標(biāo)準(zhǔn)、設(shè)計模式等方面。軟件工程學(xué)借鑒傳統(tǒng)工程的原則、方法,以提高質(zhì)量、降低成本和改進(jìn)算法。其中,數(shù)學(xué)用于構(gòu)建模型,計算機(jī)科學(xué)用于設(shè)計算法,工程科學(xué)用于制定規(guī)范、設(shè)計范型、評估成本及確定權(quán)衡,管理科學(xué)用于計劃、資源、質(zhì)量、成本等管理。軟件工程學(xué)定義的軟件開發(fā)過程,通常包括需求分析、概要設(shè)計、詳細(xì)設(shè)計、編碼、測試、交付維護(hù)等階段。
下面以一個簡單的程序案例為例,詳細(xì)分析軟件工程思維與傳統(tǒng)程序教學(xué)的差異。案例背景:學(xué)校舉行一個“1分鐘投籃班級對抗賽”,每班參賽選手5人,每人1次投籃機(jī)會且限時1分鐘,共有10個班級參加比賽。比賽成績以班級所有選手投中總數(shù)進(jìn)行計算。請設(shè)計一個小程序,實現(xiàn)成績統(tǒng)計和排序工作。
軟件工程思維更關(guān)注需求分析和概要設(shè)計
傳統(tǒng)的教學(xué)方式,教師往往將上述案例問題簡化為“每組5個數(shù)求和,10項求和結(jié)果排序”,然后就直接進(jìn)入程序語法教學(xué)環(huán)節(jié)了。而對于軟件工程思維來說,需求分析要解決做什么和怎么做的問題。學(xué)生要自己分析這個案例,找出解決方案,得出設(shè)計思路。通過分析,學(xué)生可以發(fā)現(xiàn)需要設(shè)計哪些功能,如輸入、求和、排序等。然后,要明晰這些功能可能涉及的編程語言知識。
第一,通過具體問題的分析,學(xué)生發(fā)現(xiàn)所學(xué)內(nèi)容能夠解決實際問題,是有實際意義的,從而避免了傳統(tǒng)教學(xué)中用編程解決純粹的數(shù)學(xué)問題的情況。需求分析能夠激發(fā)學(xué)生學(xué)習(xí)興趣,使得程序設(shè)計不再是單純的語法練習(xí)。從核心素養(yǎng)角度來看,有利于培養(yǎng)學(xué)生開發(fā)或運(yùn)用技術(shù)來解決問題的能力(技術(shù)素養(yǎng)),引導(dǎo)學(xué)生研究問題,并找到創(chuàng)新、有效的問題解決之道(創(chuàng)造性)。前期的需求分析可以有效解決程序設(shè)計的盲目性和“無從下手”之感,便于學(xué)生對整個程序的理解,其實也能夠為后續(xù)教學(xué)節(jié)約時間。也許,這個案例過于簡單,尚不能體現(xiàn)需求分析的重要性。若將案例擴(kuò)展為運(yùn)動會成績統(tǒng)計程序這樣的大案例,則會超出學(xué)生的設(shè)計能力,反而不利于學(xué)生學(xué)習(xí)。在小案例學(xué)習(xí)過程中,可以引導(dǎo)學(xué)生類比、類推,達(dá)到舉一反三的目的,彰顯小案例的典型性和代表性特點。
第二,概要設(shè)計是一名設(shè)計師根據(jù)用戶交互過程和用戶需求來形成交互框架和視覺框架的過程。簡單來說,就是將軟件模塊、功能、層次關(guān)系用視覺化的方式展示出來。一般情況下,概要設(shè)計不需要使用編程語言,常見如流程圖。對應(yīng)傳統(tǒng)教學(xué),流程圖設(shè)計往往只是算法解析描述的工具,很少用來展示整個程序的功能設(shè)計。如果引導(dǎo)學(xué)生運(yùn)用流程圖進(jìn)行功能的模塊化劃分,有助于培養(yǎng)模塊化程序設(shè)計思維。通過概要設(shè)計可以進(jìn)一步明確程序的模塊構(gòu)成和功能,便于確立各部分的實現(xiàn)方法(算法選擇)。在設(shè)計環(huán)節(jié)還要決定程序設(shè)計使用的變量名稱、類型甚至取值范圍等細(xì)節(jié)問題。為便于后續(xù)閱讀程序,變量命名不僅僅要“見名知意”,還要系統(tǒng)規(guī)劃變量名稱的分類以及大小寫規(guī)范等,這能夠鍛煉學(xué)生良好的規(guī)范表達(dá)意識。這與平時教學(xué)中變量名使用無意義的單字母等對學(xué)生習(xí)慣的影響有很大不同。
軟件工程思維更突出編碼的模塊化設(shè)計和軟件測試
軟件工程對程序教學(xué)的一個很大的意義是形成良好的程序設(shè)計的代碼文化與素養(yǎng),形成日漸深厚的計算思維。其中,程序的模塊化設(shè)計是良好的程序設(shè)計過程技能,而編碼測試則是良好性工程人員的代碼文化素養(yǎng)。
第一,編碼的模塊化設(shè)計,是指在進(jìn)行程序設(shè)計時按照功能將一個復(fù)雜程序劃分為若干程序模塊,每個程序模塊完成一個確定的功能,模塊之間通過必要的聯(lián)系和互相協(xié)作完成整個功能的程序設(shè)計方法。與通常的簡單程序設(shè)計要求不同之處在于,模塊化設(shè)計主要體現(xiàn)在兩個方面,一是程序設(shè)計盡量使用函數(shù)、子過程、子程序,少使用全局變量;另一方面,盡量將代碼按照模塊劃分并做好注釋。
以“1分鐘投籃班級對抗賽”為例,可以將輸入、求和、排序分作三個小部分。與平時相比,代碼書寫不一定減少,但會讓編程作者和閱讀者都能清晰了解整個程序的架構(gòu),有利于錯誤排查和分工協(xié)作。如果遇到諸如“運(yùn)動會成績統(tǒng)計”這樣有一定復(fù)雜度的程序設(shè)計,通過調(diào)用某個功能模塊(如函數(shù)、子程序等),則能較好地解決不同比賽項目的人員分組、成績輸入、排序打印等問題。而沒有模塊化的程序設(shè)計,可能要重復(fù)設(shè)計相應(yīng)功能,存在大量的重復(fù)代碼,會降低運(yùn)行效率,且在遇到問題時不容易檢查。
第二,軟件測試是對編碼程序的正確性、效率、容錯能力等的測試。程序設(shè)計很可能遇到代碼錯誤甚至算法錯誤,在教學(xué)中應(yīng)該注意培養(yǎng)學(xué)生觀察分析程序運(yùn)行結(jié)果、錯誤提示的能力,對不同的數(shù)據(jù)結(jié)構(gòu)、算法選擇進(jìn)行優(yōu)劣評估等。在常規(guī)教學(xué)過程中,我們多數(shù)使用驗證性實驗進(jìn)行教學(xué)。
如前面投籃的案例,程序設(shè)計完成后,一般會要求學(xué)生輸入3到5組的“正?!睌?shù)據(jù)進(jìn)行驗證。驗證僅僅限于證明語法結(jié)構(gòu)可能沒有錯誤。這種知識鞏固式的教學(xué)模式,使得不少學(xué)生養(yǎng)成一看到出現(xiàn)預(yù)計結(jié)果就終止實驗的習(xí)慣,其實是不利于培養(yǎng)學(xué)生的程序測試意識的。參考軟件工程思維中的程序測試,我們在要求學(xué)生進(jìn)行數(shù)據(jù)驗證時,一方面要提高驗證的數(shù)據(jù)量和運(yùn)行次數(shù),另一方面要盡量使用“邊界值”或“異常值”進(jìn)行驗證。仍以投籃案例為例,如果程序設(shè)計時限定了數(shù)組(或列表)上下限值,則在驗證時要在上下限的邊界選擇數(shù)據(jù)進(jìn)行驗證。例如,根據(jù)生活實際經(jīng)驗,我們設(shè)置了1分鐘投籃的上限為100次,那就可以使用三位數(shù)(如127)作為測試數(shù)據(jù)驗證我們的設(shè)定是否有效。除此之外,驗證數(shù)據(jù)還應(yīng)包含負(fù)數(shù)、小數(shù)等,以避免程序運(yùn)行時錯誤輸入帶來的錯誤結(jié)果。從軟件工程視角來看,程序設(shè)計要關(guān)注編程安全問題,如分母為0、超出數(shù)組界限、變量取值超出范圍等情況。而在程序設(shè)計教學(xué)中,這些也恰恰是不易被發(fā)現(xiàn)的“易錯點”??梢姡瑴y試數(shù)據(jù)的作用是非常大的,設(shè)計有效的檢驗數(shù)據(jù),既能檢驗程序設(shè)計的規(guī)范性和算法的合理性,同時能夠讓學(xué)生強(qiáng)化測試意識,避免測試的隨意性,為以后解決復(fù)雜的具體問題奠定基礎(chǔ)。
通過引入符合實際情況的測試數(shù)據(jù),可以有效檢驗程序的健壯性。而要提高健壯性,就要進(jìn)行容錯設(shè)計,從而使得程序設(shè)計從簡單功能向復(fù)雜功能過渡,拓展學(xué)生的思維強(qiáng)度和廣度,激發(fā)學(xué)生的學(xué)習(xí)興趣。在上述案例中,負(fù)數(shù)或小數(shù)作為無效輸入,如何解決因此類輸入所導(dǎo)致的程序結(jié)果錯誤呢?學(xué)生很容易想到,在輸入錯誤時進(jìn)行提示并要求重新輸入。由此,再講解相關(guān)程序語法,學(xué)生就更容易接受。同樣,在大量數(shù)據(jù)輸入時,不僅僅會出現(xiàn)錯誤輸入,還可能會出現(xiàn)漏掉數(shù)據(jù)等情況。這就要求我們不僅僅要檢驗輸入數(shù)據(jù)的合法性,還要跟蹤數(shù)據(jù)的數(shù)量。必要的時候,還可以在程序關(guān)鍵步驟設(shè)置“斷點”,以隨時跟蹤數(shù)據(jù)的變化。遇到錯誤不容易判斷時,可以靈活運(yùn)用數(shù)據(jù)跟蹤,更容易發(fā)現(xiàn)問題根源。根據(jù)現(xiàn)實中可能遇到的問題,學(xué)生思考解決方案的過程中,不知不覺地拓展了程序功能,很多知識的學(xué)習(xí)也變得順理成章。
綜上所述,我們可以看出,在程序設(shè)計教學(xué)中運(yùn)用軟件工程思維,并不是只有復(fù)雜程序才需要,也不是只有專業(yè)人士才可以做到的事情。在任何程序設(shè)計中,都可以滲透軟件工程思維。而這樣的思維方式,不僅僅有利于加深學(xué)生對程序設(shè)計的理解,強(qiáng)化應(yīng)用技術(shù)解決實際問題的能力,也將大大提升我們的程序教學(xué)效率。我們相信,程序設(shè)計對于學(xué)生來講不再是枯燥乏味的學(xué)習(xí)體驗。
蒼山點題
如果我們說一線教師的專業(yè)水平與學(xué)術(shù)水準(zhǔn)在新一輪課標(biāo)下已初見端倪并不準(zhǔn)確,如果說已經(jīng)碩果累累也為時過早。怎樣評價才合適呢?透過本期解碼推薦的這兩篇重磅文章,我們不妨去用心感受這“新星閃爍”般的思維光芒。
第一篇文章,一句泛“計算思維”時代,把我們對計算思維的認(rèn)識的局限一下就打開了。首先是尋根溯源,提出計算思維是什么、要培養(yǎng)什么的問題。內(nèi)容不再復(fù)述,只提那一個視頻折半瀏覽找水杯的例子,就見其精彩絕倫。然后是高屋建瓴,問:計算思維就是算法嗎?就是編程嗎?尤其是,以實例說明在數(shù)據(jù)與計算模塊之外的模塊中也可以深入培養(yǎng)計算思維。例如,信息系統(tǒng)與社會中同樣可以培養(yǎng)計算思維;又如,網(wǎng)絡(luò)基礎(chǔ)選修里面的網(wǎng)絡(luò)安全部分也可以深化培養(yǎng)計算思維。這對我們是一種怎樣的啟示?
第二篇文章,給我們一種暫時離開計算思維去軟件工程學(xué)尋找程序教學(xué)的深邃。在程序設(shè)計教學(xué)中如何應(yīng)用軟件工程學(xué)呢?軟件開發(fā)過程包括需求分析、概要設(shè)計、詳細(xì)設(shè)計、編碼、測試、交付維護(hù)等階段。其中,軟件工程思維更關(guān)注需求分析和概要設(shè)計,軟件工程思維更突出編碼的模塊化設(shè)計和軟件測試,只這兩點就夠我們把程序設(shè)計教學(xué)提高到一個比較專業(yè)、比較深邃的境地,這不是一個巨大的驚喜嗎?
信息技術(shù)教育滄海茫茫,必有新的浪花;信息技術(shù)教育天空遼闊,必有新的星辰。我們一起前行、一起探索,藍(lán)調(diào)解碼期待您的浪花與光芒一起造就新的信息技術(shù)教育風(fēng)景。