董付國,葛詩煜,陳思佳,李 博,馮澤濤
(山東工商學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,山東 煙臺(tái) 264005)
Python是一門免費(fèi)、開源、跨平臺(tái)的高級(jí)動(dòng)態(tài)編程語言,代碼具有非常強(qiáng)的可移植性,幾乎不需要改動(dòng)即可運(yùn)行于Unix、Linux、Windows、Mac OS、Android等不同平臺(tái)。Python可以和C/C++/C#、Java等主流語言完美地結(jié)合到一起,充分發(fā)揮每種語言的優(yōu)勢(shì)。目前Python已經(jīng)滲透到統(tǒng)計(jì)分析、大數(shù)據(jù)處理、數(shù)據(jù)分析與可視化、移動(dòng)終端開發(fā)、科學(xué)計(jì)算可視化、系統(tǒng)安全、網(wǎng)絡(luò)安全、軟件分析與測試、圖形圖像處理、人工智能、游戲設(shè)計(jì)與策劃、網(wǎng)絡(luò)應(yīng)用開發(fā)、自動(dòng)運(yùn)維、輔助設(shè)計(jì)等幾乎所有行業(yè)和領(lǐng)域[1-4]。截至2018年9月,pypi.python.org網(wǎng)站已經(jīng)維護(hù)了超過107萬個(gè)涉及不同領(lǐng)域的Python擴(kuò)展庫。
多年前Python已經(jīng)成為卡耐基·梅隆大學(xué)、麻省理工學(xué)院等國外很多著名大學(xué)的程序設(shè)計(jì)入門教學(xué)語言,近幾年來北京大學(xué)、復(fù)旦大學(xué)等國內(nèi)幾百所高校也針對(duì)不同專業(yè)開設(shè)了Python程序設(shè)計(jì)相關(guān)的課程,全國計(jì)算機(jī)等級(jí)考試也于2018年9月加入了二級(jí)Python的科目[2]。對(duì)于如何講好Python、如何才能發(fā)揮Python的最大優(yōu)勢(shì),不同學(xué)校有不同的做法,都取得了一定成效。
Python支持命令式編程、函數(shù)式編程,完全支持面向?qū)ο蟪绦蛟O(shè)計(jì),語法簡潔清晰、代碼優(yōu)雅、可讀性強(qiáng),并且擁有大量功能強(qiáng)大的標(biāo)準(zhǔn)庫和擴(kuò)展庫,可以幫助各領(lǐng)域的工程師、科研人員、策劃師和管理人員快速實(shí)現(xiàn)和驗(yàn)證自己的思路與創(chuàng)意。Python編程模式非常符合人類的思維習(xí)慣,程序員只需要把主要精力放在業(yè)務(wù)邏輯的設(shè)計(jì)與實(shí)現(xiàn)上,不需要過多考慮語言本身的細(xì)節(jié),大幅度縮短了開發(fā)周期,在開發(fā)速度和運(yùn)行速度之間達(dá)到了完美的平衡,其精妙之處令人擊節(jié)贊嘆[3-9]。
Python官方網(wǎng)站上在非常醒目的位置有一句話“Python is a programming language that lets you work quickly and integrate systems more effectively”,在The Zen of Python中也反復(fù)提到類似的語句,例如“Explicit is better than implicit”“Simple is better than complex”等,這些看上去很普通的語句恰恰點(diǎn)明了Python語言的本質(zhì)和核心所在。作為Python程序員,應(yīng)盡量從最自然、最簡潔的角度出發(fā)去思考和解決問題,充分利用內(nèi)置函數(shù)和標(biāo)準(zhǔn)庫對(duì)象,適當(dāng)運(yùn)用擴(kuò)展庫,充分利用函數(shù)式編程,這樣才能寫出更加優(yōu)雅、更加Pythonic的代碼。
與命令式編程相比,函數(shù)式編程的代碼更加簡潔和直觀,代碼效率也比較高,在教學(xué)和開發(fā)中應(yīng)該盡量多使用函數(shù)式編程模式。
在講授Python程序設(shè)計(jì)課程時(shí),建議采用邊講邊練、學(xué)生分組合作的方式,精心設(shè)計(jì)一些案例帶領(lǐng)學(xué)生一起完成并做好嚴(yán)格的過程管理,經(jīng)常鼓勵(lì)和引導(dǎo)學(xué)生去思考“還有沒有更簡潔更快速更直接更好的方法?”類似的問題,激發(fā)學(xué)生的潛能,同時(shí)也充分挖掘Python語言的潛能。
在講授、學(xué)習(xí)和應(yīng)用Python時(shí),切記不要把其他語言的編程習(xí)慣和風(fēng)格帶到Python中來。不能使用其他語言尤其是C語言的思路去編寫Python程序,那會(huì)使得代碼變得非常冗長、繁瑣、可讀性差且難以維護(hù),浪費(fèi)大量的寶貴時(shí)間,無法發(fā)揮Python的優(yōu)勢(shì),甚至有可能寫出看似正確實(shí)則錯(cuò)誤的代碼。
近年來編程類課程采用邊講邊練的形式,與傳統(tǒng)的“填鴨式教學(xué)”和“滿堂灌”方式不同,在整個(gè)教學(xué)過程中,以教師講授和輔導(dǎo)為主,學(xué)生練習(xí)為輔。使用多種形式保證和提高教學(xué)質(zhì)量,例如在線點(diǎn)名、在線提問、在線答疑、在線自測、在線交作業(yè)、在線考試,鼓勵(lì)學(xué)生主動(dòng)提問和回答問題,適當(dāng)安排學(xué)生講解部分例題,突擊布置限時(shí)完成的隨堂作業(yè),鼓勵(lì)學(xué)生發(fā)現(xiàn)教材或講課內(nèi)容中的錯(cuò)誤,鼓勵(lì)學(xué)生分析課堂教學(xué)管理系統(tǒng)源代碼并嘗試發(fā)現(xiàn)其中的漏洞。
在教學(xué)過程中,偶爾會(huì)指定一小節(jié)內(nèi)容或者一個(gè)例題,讓學(xué)生自學(xué)5~10分鐘,這段時(shí)間內(nèi)同學(xué)之間可以互相討論或者看書看課件,也可以上網(wǎng)查閱資料,甚至可以場外求助,時(shí)間到了以后隨機(jī)找同學(xué)進(jìn)行講解。這樣不僅可以鍛煉學(xué)生的自學(xué)能力、思考能力,還能鍛煉學(xué)生的口頭表達(dá)能力和語言組織能力。
在教學(xué)過程中,使用自編軟件隨機(jī)提問正在講授的內(nèi)容中涉及的本課程中學(xué)過的知識(shí),或者其他課程中學(xué)過但是在本課程中要用到的知識(shí),然后根據(jù)學(xué)生回答情況進(jìn)行實(shí)時(shí)計(jì)分。每次會(huì)提問誰是毫無規(guī)律的,無法提前預(yù)測,所以每個(gè)學(xué)生都要認(rèn)真準(zhǔn)備,提高了學(xué)生的整體積極性。
在教學(xué)過程中,鼓勵(lì)學(xué)生批判地學(xué)習(xí)老師講授的內(nèi)容,引導(dǎo)學(xué)生思考“這個(gè)問題還有別的解決辦法嗎?”“這個(gè)程序還可以更好嗎?”“這個(gè)算法和程序還有優(yōu)化空間嗎?”“還有沒有考慮周到的地方嗎?”之類的問題。在45分鐘的課堂上,大部分學(xué)生能一直保持思維活躍狀態(tài),學(xué)習(xí)效率非常高。
在教學(xué)過程中,每當(dāng)有學(xué)生發(fā)現(xiàn)老師講授的算法或程序源碼存在瑕疵,會(huì)得到鼓勵(lì)和表揚(yáng),并被計(jì)入平時(shí)成績。這樣一來,同學(xué)們課下也會(huì)積極思考和練習(xí),并嘗試在教材或課件中查找錯(cuò)誤,不僅能夠提高學(xué)生的學(xué)習(xí)積極性,還能夠培養(yǎng)獨(dú)立思考能力和批判性思維,敢于挑戰(zhàn)老師,敢于挑戰(zhàn)權(quán)威。
為提高Python程序設(shè)計(jì)課程教學(xué)質(zhì)量,開發(fā)了一套課堂教學(xué)管理系統(tǒng)。除Python基礎(chǔ)知識(shí)之外,該系統(tǒng)還用到了數(shù)據(jù)庫編程、多線程編程、Of fi ce文檔操作、GUI編程、網(wǎng)絡(luò)編程、圖像處理等多個(gè)領(lǐng)域的知識(shí),既可以用來管理教學(xué)過程中的各個(gè)環(huán)節(jié),又可以根據(jù)學(xué)生專業(yè)從中選擇不同的功能作為教學(xué)案例,還能讓學(xué)生閱讀和分析源碼提高代碼閱讀能力和軟件測試能力。該系統(tǒng)教師端主界面和學(xué)生端界面如圖1和圖2所示。
圖1 教師端主界面
圖2 學(xué)生端主界面
2.2.1 在線點(diǎn)名
雖然大部分同學(xué)的自制力較好,但仍有部分同學(xué)管不住自己,總想逃課。針對(duì)這種情況,在課堂教學(xué)管理系統(tǒng)中提供了在線點(diǎn)名功能,使用Socket編程與多線程編程技術(shù)可以瞬間完成整個(gè)班級(jí)的點(diǎn)名,不僅節(jié)約了寶貴的課堂時(shí)間,還能嚴(yán)格控制點(diǎn)名時(shí)間段,讓學(xué)生無法預(yù)測點(diǎn)名時(shí)間和規(guī)律。并且,系統(tǒng)還記錄了學(xué)生機(jī)器的IP地址、MAC地址和點(diǎn)名時(shí)間,可以在技術(shù)上防止同學(xué)之間的代點(diǎn)名,在很大程度上震懾了個(gè)別不愛上課的同學(xué)。另外,只要啟動(dòng)了學(xué)生端軟件,就不允許退出,軟件隨時(shí)準(zhǔn)備接收教師端軟件發(fā)送的屏幕廣播信息,保證上課時(shí)學(xué)生只能聽老師講課,提高了聽課學(xué)生的比例[4]。2017—2018學(xué)年該系統(tǒng)共生成原始點(diǎn)名記錄5 956條。
2.2.2 隨機(jī)提問
在教學(xué)過程中,提問環(huán)節(jié)完全使用自己編寫的課堂教學(xué)管理系統(tǒng),只需要選擇相應(yīng)的專業(yè)然后單擊按鈕“看看誰最幸運(yùn)”即可隨機(jī)抽取一名同學(xué)進(jìn)行提問,并且根據(jù)該同學(xué)的回答情況記錄成績。這樣可以避免任課老師總是提問固定幾個(gè)人的慣性思維,也不用對(duì)著名單糾結(jié)該提問誰,每個(gè)同學(xué)都會(huì)處于緊張狀態(tài)積極思考,不敢輕易走神,盡最大可能讓更多學(xué)生處于學(xué)習(xí)狀態(tài)[4]。2017—2018學(xué)年該系統(tǒng)共生成提問原始加分與減分記錄121條。
2.2.3 隨堂限時(shí)作業(yè)與課后大作業(yè)
在教學(xué)過程中,適當(dāng)布置限時(shí)完成的隨堂作業(yè),嚴(yán)格控制作業(yè)提交時(shí)間段,不僅可以培養(yǎng)學(xué)生快速解決問題的能力,還可以節(jié)省上課時(shí)檢查作業(yè)的時(shí)間。在配套使用的課堂教學(xué)管理系統(tǒng)中采用了兩種提交作業(yè)的方式:全屏截圖交作業(yè)和上傳文件交作業(yè),對(duì)于較小的代碼片段使用截圖交作業(yè)的方式,較大的完整程序使用上傳文件交作業(yè)的方式,并且自動(dòng)把文件名修改為學(xué)生的“學(xué)號(hào)+姓名+上傳時(shí)間”,以備事后檢查與核對(duì)[4]。
另外,使用全屏截圖交作業(yè)還能隨時(shí)查看學(xué)生屏幕,判斷學(xué)生是否認(rèn)真練習(xí)老師講過的知識(shí),這樣可以防止學(xué)生在練習(xí)時(shí)偷懶。2017—2018學(xué)年兩個(gè)學(xué)期共使用該系統(tǒng)收取作業(yè)文件895個(gè)。
2.2.4 在線自測
不同學(xué)生的學(xué)習(xí)進(jìn)度略有差別,有的很快就可以掌握老師剛剛講過的知識(shí),有的則需要的時(shí)間久一些,幾十人的班級(jí)很難保證步調(diào)一致。為此,在課堂教學(xué)管理系統(tǒng)中增加了在線自測功能,內(nèi)置800道客觀題和參考答案。每次上課時(shí)立刻打開該功能,供學(xué)習(xí)能力較強(qiáng)、學(xué)習(xí)進(jìn)度較快、自制力較好的學(xué)生自我測試和檢驗(yàn),也可以用于所有學(xué)生對(duì)自己的掌握程度進(jìn)行檢驗(yàn)[4]。系統(tǒng)數(shù)據(jù)顯示,2017—2018年度共有154 500人次使用該系統(tǒng)進(jìn)行了在線自測。
2.2.5 聽課認(rèn)真加分
在講課過程中,隨時(shí)注意學(xué)生的聽課狀態(tài),不僅根據(jù)同學(xué)們的狀態(tài)進(jìn)行語速和音量的調(diào)整,還在系統(tǒng)中及時(shí)記錄聽課非常認(rèn)真和非常不認(rèn)真的同學(xué)進(jìn)行適當(dāng)加分和減分,這也是期末成績的一項(xiàng)重要參考。為方便使用,該功能集成到了學(xué)生信息查看界面[4]。
2.2.6 挑錯(cuò)加分
在教學(xué)過程中或者布置作業(yè)時(shí),精心設(shè)計(jì)幾個(gè)小錯(cuò)誤讓同學(xué)們嘗試發(fā)現(xiàn),經(jīng)常鼓勵(lì)同學(xué)們嘗試發(fā)現(xiàn)教材、PPT以及所有講授內(nèi)容中可能存在的錯(cuò)誤,如果有同學(xué)確實(shí)發(fā)現(xiàn)了錯(cuò)誤并給出解決方案就適當(dāng)加分給予鼓勵(lì)。事實(shí)證明,這個(gè)方法非常有效,同學(xué)們看書非常認(rèn)真積極,確實(shí)有同學(xué)發(fā)現(xiàn)過課堂上講過的例題代碼中的bug。
2.2.7 攻擊系統(tǒng)加分
該系統(tǒng)已經(jīng)正式投入使用6個(gè)學(xué)期,雖然主要功能一直運(yùn)行非常穩(wěn)定,但是也確實(shí)存在一些小瑕疵,于是在教學(xué)過程中鼓勵(lì)同學(xué)們隨時(shí)對(duì)這個(gè)系統(tǒng)進(jìn)行分析和攻擊,然后根據(jù)他們的攻擊情況進(jìn)行加分,同時(shí)也不斷對(duì)這個(gè)系統(tǒng)進(jìn)行完善和升級(jí)。事實(shí)證明這是一個(gè)非常好的思路,大多數(shù)同學(xué)覺得這樣的方式很有意思并積極參與系統(tǒng)分析和攻擊,大幅度提高了學(xué)習(xí)積極性和安全編程意識(shí),同時(shí)也為完善這個(gè)系統(tǒng)提供了很多重要參考。例如,系統(tǒng)最初使用IP地址來檢測是否存在學(xué)生代點(diǎn)名的情況,但是有學(xué)生自己編寫Python程序自動(dòng)修改IP地址實(shí)現(xiàn)批量點(diǎn)名,于是系統(tǒng)改用了網(wǎng)卡MAC地址檢測代點(diǎn)名的情況,有效避免了這個(gè)問題;為了避免學(xué)生在考試時(shí)直接復(fù)制題目然后在網(wǎng)上或平時(shí)整理的題庫中搜索答案,在系統(tǒng)中增加了防作弊功能,在考試模式下不僅禁用了學(xué)生端的各種瀏覽器和文本編輯器軟件,還禁用了系統(tǒng)剪貼板。同時(shí),考試模式下的隨機(jī)抽題功能使得每個(gè)學(xué)生不可能同時(shí)作答同一個(gè)題目,最大程度降低了作弊的可能;曾經(jīng)有學(xué)生試圖編寫自助考試的代碼,雖然沒有成功,但其中的思路還是不錯(cuò)的。另外,作為大作業(yè),每學(xué)期都有幾個(gè)學(xué)生成功實(shí)現(xiàn)了系統(tǒng)中題庫的批量導(dǎo)出,這需要根據(jù)學(xué)生端軟件源碼來分析和推測教師端通信協(xié)議和數(shù)據(jù)庫結(jié)構(gòu),有效鍛煉了學(xué)生的代碼閱讀和分析能力。當(dāng)然,也有極個(gè)別同學(xué)通過分析學(xué)生端源代碼發(fā)現(xiàn)了獨(dú)特的作弊手段,例如使用IDLE或其他Python開發(fā)環(huán)境打開提前準(zhǔn)備好的題庫和答案,這些問題都被及時(shí)發(fā)現(xiàn)并且迅速修改系統(tǒng)代碼進(jìn)行了防范[4]。
2.2.8 期末成績計(jì)算
在評(píng)定學(xué)生的期末成績時(shí),不單純使用期末的在線考試成績,還綜合考慮平時(shí)的出勤次數(shù)、提問情況、作業(yè)情況等。其中,出勤次數(shù)占總成績的10%,提問情況占10%,作業(yè)情況占20%,在線考試成績占60%,這些數(shù)據(jù)的原始記錄都可以在系統(tǒng)中查詢和匯總。連續(xù)6個(gè)學(xué)期的實(shí)踐表明,這樣的計(jì)算方法更加客觀,也更能反映學(xué)生的綜合能力。
我校計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院數(shù)字媒體技術(shù)專業(yè)、服務(wù)外包專業(yè)和網(wǎng)絡(luò)工程專業(yè)開設(shè)了“Python程序設(shè)計(jì)”課程,會(huì)計(jì)學(xué)院開設(shè)了“Python程序設(shè)計(jì)基礎(chǔ)”,全校范圍開設(shè)了公共選修課“Python程序設(shè)計(jì)基礎(chǔ)”。到目前為止,已經(jīng)連續(xù)8個(gè)學(xué)期為不同專業(yè)開設(shè)Python程序設(shè)計(jì)有關(guān)課程,并應(yīng)邀在全國巡講和作報(bào)告50余場,在教學(xué)和交流過程中積累了大量教學(xué)經(jīng)驗(yàn)和教學(xué)案例,提出了基于攻擊鼓勵(lì)和過程管理的教學(xué)方式,極大提高了學(xué)生的學(xué)習(xí)積極性,效果非常顯著。為更好地實(shí)踐基于攻擊鼓勵(lì)和過程管理的教學(xué)方式,使用Python開發(fā)了一套課堂教學(xué)管理系統(tǒng)。該系統(tǒng)已經(jīng)投入使用6個(gè)學(xué)期,在提高學(xué)生學(xué)習(xí)積極性和綜合能力的同時(shí)也積累了大量原始數(shù)據(jù),對(duì)于學(xué)生學(xué)習(xí)情況和學(xué)習(xí)狀態(tài)以及學(xué)習(xí)效果的進(jìn)一步分析都有很大幫助,這也正是下一步要做的工作。