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