《程序設計教學法--以Java程序設計為例》


《程序設計教學法--以Java程序設計為例》

當老師上的第一門課就是《Java程序設計》,工作以來,斷斷續續上了近十次課了吧。十幾年來,教材、課程內容、教學方法、教學手段不斷改變、不斷嘗試,最近自己才感覺形成了較好的一套方法。教書是人類事業中很少能從自己的過去獲益的一類,總結一下過去,也許對自己、對別人都有好處。

教師角色

如何成為卓越的大學老師 》一書中說優秀的老師相信知識是構建出來的,優秀的老師可以構建一個自然的、批判性的學習環境,促進學生成為深度學習者,並對學生的思想、行為和感情產生了持久、真實和積極的影響。實踐證明成為滿足這樣要求的卓越老師真的很難,但我們可以慢慢改進。

現在,教學都要求“以學生為主體、老師為主導”,到底怎么操作才好?我是直到讀了鄒欣老師的這篇博客,才找到最好的方法,鄒老師把師生關系分成了幾類:

  • Retailer/customer (餐館/食客)
  • Boss/employee (老板/雇員)
  • Baby-sitter/babies (保姆/幼兒)
  • Buddies/Buddies (哥們/哥們)
  • Stranger/Stranger (路人甲/路人乙)
  • Prison Guard/Prisoner (獄警/犯人)
  • Trainer/Trainee (健身教練/學員)

並指出理想的師生關系應該是“健身教練/健身學員” 的關系。

trainer-trainee

周筠老師(知乎,微博,豆瓣)給我推薦了展示教練技術的電影卡特教練(去這看),卡特教練除了球技,還教會了球員怎么做人,讓他們遠離毒品和暴力。看了之后可以深刻體會教練如何影響學生的思維,促進學員成為深度學習者。

我認為“健身教練/健身學員”的關系定位可以真正做到“以學生為主體、以老師為主導”,結合微課、翻轉課堂、SPOC、MOOC等技術進行混合式教學簡直就是完美的解決方案,既能發揮教師引導、啟發、監控教學過程的主導作用,又要充分體現學生作為學習過程主體的主動性、積極性與創造性。

教練和學員的關系如果確定了,“因才施教”就不是問題了:每一個來學習的學生,都是想學知識的,各人的先天條件不同, 目標也不同,作為實踐經驗豐富的老師可以根據學生情況制定一套訓練計划和練習方法,並且通過交互了解學生學習情況,可以隨時指出其進步和不足。Trainer/Trainee (健身教練/學員)推廣到工程類教育中可以用大潘(微博)的“醫學院-醫院”模式來概括。

教學理念

做中學(learning by doing)

張志(秋葉)老師(微博,豆瓣)把知識分為三類

  • 元知識:基礎知識
  • 硬知識:死記硬背的知識
  • 軟知識:實踐類知識

三類知識

考前划划范圍,學生背一背就能過基本上把元知識和軟知識都變成了硬知識,學生可能有一個很好的分數,過一段時間背的東西一忘,就真的是什么也沒學到。可惜不少課程是這么上的,學生學習的重點是元知識和軟知識,結果一錘子買賣的考試徹底把它們變成了硬知識。所以每到教師節總有學生開玩笑“老師,我把跟您學的知識都還給您了,您什么時候把學費還給我啊?”

我也是學計算機的,知道實踐的重要性。第一次上《Java程序設計》,最后的考試就是把五個課程實驗重做一遍。自己感覺很簡單的,做過的實驗再做一遍就是考試,結果同學們都哭了。怎么能考實踐呢?考試不應該出張卷子划划范圍嗎?上了一次課,對學生的總體水平有了了解,但對個體還是了解不是很好,因材施教遠遠沒有達到。

這兒出現一個問題:要求如果都降低了,毀了一批優秀的學生,對他們不公平;要求高點,很多人達不到要求,這也不對。原因是上課過程中我們並不完全了解學生的基礎和學習狀態。

對於程序設計類課程,貫徹“做中學”,“項目驅動”的理念我是堅定不移的,但怎么做好,而自己沒有很好的辦法。直到看到《程序員的思維訓練》中介紹的德雷福期(Dreyfus)模型。
在Dreyfus模型中,學習過程分為五個不同的階段:

  • 新手(Novice)
  • 高級初學者(Advaned Beginnner)
  • 勝任(Competent)
  • 精通(Proficient)
  • 專家(Expert)

dreyfus

這個模型給我最大的啟發是“不同階段的學習者,教學方法是不一樣的”,對於初學者就是詳細指導。很多時候我們對學生的要求很高,但是沒有深入的實際的接觸,不知道學生的基礎和水平是什么樣子的,這個脫節導致教學效果奇差,反而是類似范飛龍博士(博客微博)寫的這些簡易教程有良好的教學效果。當然不能四年的學習都是step by step的,否則也只能教出來個初學者,我們就有不少大三、大四的實驗,學生按步驟做完,還是什么都不大明白。

這篇文章以Java學習為例子說明了如何從新手到專家,供大家參考。

這個模型給我第二個啟發是“五級技能的人數統計不是正態分布的,大多數人的技能是不合格的”,

dreyfus distr

如果你不刻意訓練的話,你的某項技能(包括教學與學習)可能一輩子都是低於高級初學者的水平。這個我做過很多次調查,比如搜索引擎大家都用過,有些人用了十年google后的搜索技能都不如花半小時學學這篇文章圖解Google搜索秘籍或花兩個小時看看並練練文獻管理與信息分析第二講“搜索引擎與網絡”的內容。

搭建個Android開發環境做出個"Hello World"能多困難?大家可以看看這里博客的有關Android開發環境演變的內容,計划一兩個小時完成的事情最終可能要花十幾個小時。

Java學習時,在Window下約有一半的同學不能獨立完成JDK開發環境的搭建,之后的學習效果可想而知了。提供配好的學習環境並提供step by step 的學習步驟是非常重要的。

游戲化(gamification)

玩游戲可以上癮,學習能不能上癮?當然可以,我在每天一萬步,一周減十斤這篇文章中舉了個背單詞的例子,過年都沒有間斷。

前幾年,隨着智能手機和平板電腦的普及,我迷上了電子書。電子書做筆記方便、查單詞詞語方便、容易分享、便攜。而Amazon上的購買電子書是最方便的。問題來了,看英文原版書需要詞匯量過關,當時我自以為自己10000詞匯量不少了,但對於讀英文原版書來說跟文盲差不多了。后來下定決心使用扇貝背單詞背了兩年單詞,終於讓自己看英文書沒什么語言障礙了,當然還有其他不少良好的副作用,比如看英文新聞可以促進思考、培養批判性思維。

之后我研究了一下扇貝背單詞,發現他們使用了游戲化的做法。游戲化就是將游戲設計的手段應用於非游戲的場景。更簡單一點說,就是用游戲的框架,來解決工作生活中一切非游戲的問題。游戲化本質上是一種方法,一種思維方式,它可以應用到任何領域。

游戲化學習將轉變“以教師為中心”的傳統思路,讓學習者在教學活動中主動地建構自己的知識體系,並且能形成學習成癮系統。游戲化的成癮作用,孫志崗(博客,微博)老師這篇“即時獎勵”的力量有論述:

當某個動作能獲得獎勵,就會刺激人的大腦分泌“多巴胺”,而“多巴胺會促使人們期待得到獎勵”,於是不斷去做能獲得獎勵的事情。動作越簡單,刺激越強;獎勵越大,刺激越強;隨機的獎勵,也會產生很大的刺激。假如多巴胺有味道,我相信拉斯維加斯的賭場里一定到處彌漫這種味道。那些不停手機“搖一搖”的人,也一定是多巴胺的俘虜。
如果工作和學習的時候我們也能分泌多巴胺,就會快樂地不停工作和學習了,多美好。

Gamification在教育上的應用也層出不窮,MOOC旗下的在線教育平台Coursera、Udacity、edX等普遍采用了Gamification的理論。在國內教育網站學堂在線、網易公開課、網易雲課堂、扇貝背單詞等也都采用了Gamification的理論。

結合翻轉課堂可以更好的應用游戲化理論:

gamification

實踐證明,僅僅是應用排行榜就可以促進學生投入更多的學習時間,大家可以參考,還有

當然,配合排行榜還可以有其他玩法,這學期(2015-2016-1)周筠老師(知乎,微博,豆瓣)和人民郵電出版社贊助我們十件設計優美、制作精良的“Learning By Doing”教學理念T恤,每周從排行榜上找出一名同學進行獎勵,極大的激發的同學們的學習積極性。

閆佳歆同學送出第一件T恤:

t1

劉蔚然同學送出第二件T恤:

t2

對於Java學習來說,據說可以通過玩游戲來學習的,參考一下Robocode,CodeSpells.

模塊化(Modularization)

程序設計中,模塊設計有“高內聚、低耦合”的設計原則,教學內容的設計也應該符合這個原則,這樣學生才能夠循序漸進的學習。王爽(網站)老師提出的知識屏蔽概念非常好的應用了這個原則,他將課程內容拆解到學習線索聽各個教學節點(知識點、檢測題、問題和分析、實驗)中,讓學習過程中接觸到的每個知識點都是當前唯一需要理解的東西。

王爽(網站)老師設計的兩條原則:

  1. 沒有通過檢測點不要往下學習
  2. 沒有完成當前的實驗不要往下學習

這完全符合“做中學”的理念,並且是教練對學員最根本的要求,保證學習的“循序漸進”,想想學變游泳,淺水區還沒下過就去深水區會怎么樣?

我讀過的圖書中,《匯編語言》和《計算機系統要素》在知識屏蔽上做的非常好的。

教學內容

《Java程序設計》是為有C語言程序設計基礎的信息安全專業和信息與計算科學專業開設的專業基礎限選課程。

課程的目的是讓學生理解應用Java進行系統開發的基本方法、熟練使用Java開發的相關工具、掌握優秀程序設計實踐、理解面向對象設計思想,並為專業課的學習培養學生良好的實踐能力。同過本課程的學習讓學生掌握Java基礎知識、掌握面向對象思想方法,培養舉一反三學習其他面向對象語言的自學能力。

本課程實踐性很強,以“做中學(learning by doing)”和“項目驅動(“project driven”)”為基本方法,不但講述面向對象的基本概念,基本方法,還介紹已被業界實踐證明了的優秀實踐、技術和軟件過程:版本控制、單元測試、自動化、代碼重構、結對編程、設計模式、軟件體系結構模式、程序設計框架、UML建模、XP、RUP、PSP等,課程注重理論聯系實踐,培養學生的創新能力、自學能力、動手能力。

Java語言是動態發展的,課程注意更新教學內容,緊跟Java語言的新進展。

課程具有密碼特色,主要表現在授課示例的設計上,課程示例結合密碼學算法的實現和密碼技術的應用來講授,注重培養信息安全中“逆向”思維方式。

教學方法

我們的學生不但要編程能力,還要(公文)寫作能力,寫作同樣也是要訓練的。學生的創新能力也是培養要求的標配,而組合創新是我認為最容易達到的。

針對各種問題,使用的教學方法與對策:

動手能力差

學生雖然學過C語言,但普遍動手能力還是比較差的,寫過的代碼還是太少。

解決這個問題要基於“做中學”要求學生多加練習。

但一開始就讓學生編寫代碼太難為他們了,我采取的策略是讓學生輸入調試教材上的代碼,把教材“抄明白”,還給出了具體的抄代碼的方法

學生一個月后就可以能找到寫代碼的感覺,這時可以設計一些結對的項目,讓同學之間互相學習,完成構建之法(電子版)中的個人項目和結對項目,團隊項目留在《安全軟件工程》課程中。

結對項目和團隊項目中遇到的打醬油現象,鄒欣老師(博客,微博,豆瓣)強制團隊中同學的分數不相同的方法基本完美解決問題。

實踐環境和實踐項目

不少情況下,學生連開發環境都搭建不好,有了實驗樓,這個問題基本就解決了。

實驗樓是國內首家IT在線實訓平台,擁有最豐富的計算機在線實驗課,而且全部免費。創業團隊對師生的服務非常貼心細致。

《Java程序設計》設計了五個實驗,實驗一到實驗四,都是根據指導初學者的最佳方式設計的,就是step by step的教程,實驗五是個綜合性實驗,給出Socket代碼、對稱加密、非對稱加密、摘要代碼,讓學生進行代碼組合完成一個保密通信系統。

實驗一 Java開發環境的熟悉:基本的開發過程和程序調試方法,學完后就可以自己練習教材上的代碼了。

實驗二 Java面向對象程序設計:面向對象的三要素,SOLID原則的練習。

實驗三 敏捷開發與XP實踐:敏捷開發的工具使用和實踐。

實驗四 GUI程序設計:GUI編程的熟悉,要求掌握組件、容器、布局、事件處理的方法,最新的引入Android開發。

實驗五 Java網絡編程及安全:培養學生組合創新的能力。

基礎內容

一錘子買賣的考試導致一個結果是大部分同學平時不聽課、不學習,期末找老師划范圍,突擊背一周就可以考個不錯的分數,考完后把背的東西一忘,什么都沒有了。

老師上課不知道學生的基礎如果,憑自己的感覺滿堂灌,學生可能聽不懂,然后就不聽課,也就不學了,靠期末背一下就混過去了。期末監考總可以撿到一些像新書一樣的教材。

課前不預習,課后不復習,導致老師上課聽不懂。老師看學生不懂,導致一些基礎知識一遍一遍的講,然后學生抱怨知識點重復。

基於微課的翻轉課堂可以完美解決這個問題。翻轉課堂翻轉了什么?與傳統課堂學習知識在課堂,內化知識在課外不同,翻轉課堂學習知識在課外,內化知識在課堂。

翻轉課堂

翻轉課堂的理論基礎是人性化學習理論。與傳統課堂固定45分鍾或90分鍾時間,固定在某個教師,翻轉課堂讓學生按照自己的情況進行個性化學習。教師給予學生個性化指導,可以做到因材施教。學生是主體,老師是主導,共同努力提高學生學習績效。

翻轉課堂2

學生不是不預習嗎?我上課就考要你預習的東西,把期末一次考試分散到每節課,每次都花一二十分鍾考一下,學生就預習了,然后課堂內容就可以深化了。

分散考試可以讓老師盡快了解學生的學習狀況,根據學生學習情況調整教學進度,基本上可以因材施教了。一般一個月后就可以前5名和后5名結對學習了。

翻轉課堂如果結合一門MOOC就更好了,比如,我上過的《Linux及安全》就使用了孟寧老師的《Linux內核分析》翻轉,我給孟老師當助教,效果良好

對翻轉課堂感興趣的老師,建議學習一下這幾門MOOC,比參加什么培訓的效果要好多了:

代碼閱讀與逆向

有三千行代碼經驗后,閱讀代碼就是程序設計能力快速提升的方法。

開始學編程時,侯捷(網站)老師的深入淺出MFCSTL源碼剖析讓我閱讀代碼入了門,侯捷(網站)老師還寫了篇指導代碼閱讀的文章上窮碧落下黃泉 源碼追蹤經驗談

學習Java程序設計時,閱讀JUnit的源代碼讓我對面向對象思想和設計模式的認識有了質的飛躍,《Java》程序設計課上,我一直推薦同學們分析JUnit的代碼,學習其他語言時,實現一個簡單的XUnit是我學習編程語言的必練項目。另外一個推薦是JHotdraw代碼的分析。

當然,對信息安全專業的同學來講,閱讀代碼的意義更大,漏洞分析的白盒分析是很重要的技能。

寫作能力

我們的學生就業都在黨政部門,到用人單位調研,對學生的(公文)寫作能力的要求是沒有極限的。

寫作也是“軟知識”,構建之法(電子版)提倡寫博客來公開自己的學習成果。

公開的博客一個重大好處是鍛煉了學生的寫作能力,提升了思考的深度和學習的深度。

公開的博客一個副作用是大大減少了抄襲,如果再加點威懾,效果會更好。

老師評論博客,學生響應改進,這種持續對話相比一錘子買賣的期末考試而言,對學生的成長有極大的幫助。

參考資料

  1. 如何成為卓越的大學老師

  2. 構建之法(電子版)

  3. 學會獨立思考:學習篇(電子版)

  4. 《Java程序設計》課程參考資料

  5. 匯編語言

  6. 游戲化思維(電子版)

  7. 現代軟件工程講義

  8. 程序員的思維訓練

  9. 代碼閱讀




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM