[碎碎念] 程式應該要怎麼考?

先說明我個人立場,我是贊同上機考,實作題,做得出來就給分,做不出來拉倒,因為現實就是這麼殘酷,管你是新手還是老手都一樣。

先說明我個人立場,我是贊同上機考,實作題,做得出來就給分,做不出來拉倒,因為現實就是這麼殘酷,管你是新手還是老手都一樣。

最近網路出現了這樣的問題,說是某個學校的期中考 (還是期末考) 考題:

image

這樣的問題一看就知道是出自某本書的教師手冊或題庫,而在網路時代最方便的一件事就是可以 Google,我用了其中一個題目的關鍵字為線索,先找到了某間學校的教學網頁,然後又找到了這份資料,最後找到這本書是:

image

嗯...其實看到題目的 style 後,我馬上就知道是某些專門寫給學校用的書,只是不確定是哪一本而已,經過這樣的搜尋後,果然印證我的想法,這類專門寫給學校的書,基本上都是題庫一堆,讓老師在出題時能很快的將題目出完,改考卷也不用花太多時間,畢竟大學的老師除了教學工作外,還要做研究或是應付有事沒事就來的評鑑,不過也有很用心的老師,完全不用那些題庫,直接自己從書上出題的,這類老師很不錯,但放眼所有的大學,大概只有國立或前段私立大學 (含科大與技術學院) 才會這麼做。

不過我不想談政策面的問題,想想12年國教吧,那不是我們能理解的。我想要談的是程式怎麼考這件事。

首先由同學面來看。

現在上大學的學生,會有多少人在上程式課時不睡著,不打電動,不滑手機,不聊天?我自己去大學當業師時,認真聽課的連 10% 都不到,一班 40 個人,只有 4 個人會專心,其他人呢?睡覺,打電動,滑手機,聊天,還有光明正大跑出去的,蹺課的我還沒算進去喔。請問,都沒有聽課和參與課堂練習的學生,老師期中期末出的考題,不管怎麼出,會寫才有鬼吧。有些老師期末還給同學帶回家寫喔,所以才會有上面那個問題,連期末考都要叫人家幫你寫,那是不是以後薪水也人家幫你領就好

當然一定會有人有意見,說這堂課好無聊,老師不會教,程式看不懂,...要想 100 個理由都想得出來,沒錯,若學生有下列幾個條件,確實有不上課的資格:

  1. 自己有自修能力,可以跟得上或超強老師的進度,而且是可寫出東西不是嘴砲至上的。
  2. 在這堂課上,自己本來就比老師強,那頂多就出席分數零分,但期中期末還是可以考滿分,也不會被當。
  3. 不想學,又不在乎被當的 (尤其是必修)。
  4. 早就想要轉系,且已經在進行轉系程序的。
  5. 早就想退學的。

請先捫心自問,你是屬於哪一種,如果都不是,請問你為什麼可以不專心聽課?時間花在哪,成就就在哪,有在唸,當然就學得多,有唸才會有問題,有問題才能問老師,老師才能給你更多,不是嗎?

再來由老師面來看。

大學老師平常其實忙碌程度不是學生能想像的,光是應付研究工作和上面要求的辦理事項就夠他們頭大的了,教學工作一般除了他們擅長的之外,若要教一門不擅長的課,等於又要花較多時間備課,在人性的驅使下,有些老師當然就會要求出版社提供一些教學工具,例如簡報檔或是題庫等等,減少老師在備課時的負擔。其實這算蠻合理的,老師透過教學工具來降低他們的備課負擔,把多出來的時間拿來處理研究或是專業上的鑽研,對老師本身也很有用處。

不過,我個人對題庫這件事是不太贊同的。題庫的目的是要讓老師知道這一段的考試方向以及可能的題型,甚至是引導老師要如何出題來考驗學生的學習成果,而不是讓老師照本宣科直接拿來出題,否則不等於是書的作者在考學生,而不是老師在考學生嗎?

再者,以選擇題或填充題的方式考程式,不是能測出程式能力的方法,最好的方式其實是直接實作,不是0就是1的作法,同時分成幾個方向來評分:

  1. 結果 (這可以用自動化的評分系統做) 30%
  2. 程式結構 (這個可以用語法分析器或是人工來做,尤其是抄襲問題) 50%
  3. 編碼習慣 (例如命名規則,語法的可讀性以及進階技巧的應用) 20%

當然啦,出題簡單,改卷很難,因為出題只要寫個題目和參考答案就好,但改卷可能因為內容過多或是用筆寫看起來雜亂的因素 (review code 也要花不少心力),會讓改卷占用的時間較長,這也是很多老師愛出選擇題和填充的原因,但程式語言或是系統開發的課程,只用選擇題怎麼可能測得出學生的程度?除非題目出得像微軟 MCP 考試那種選擇題 (有複選題),才有可能測出程度,但大學生不可能出那種題目,所以與其出選擇,不如出幾個小程式的題目,這樣考出來的程度還遠比那些準確多了,題目的範圍就以教過的範圍為準,以實作方式的測驗最能測出學生的實作能力。

期末報告與系統展示也是能測出學生程式能力的好方法,但不是只看學生表演,老師要請學生去說明為什麼要這樣寫 (Why),以及有沒有更好的寫法等,在進度 Review 時就要做,讓學生先適應這樣的作法,然後在期末報告時給一個完整的系統,或是由老師指定題目,學生做一學期,利用課堂的進度來引導學生的實作進度,這樣的作法我不能說一定,但起碼可以測出學生的程式碼編寫能力。還有一個重點,就是每個人都要報告,不是只有一個人唱獨角戲,每個人都要說明自己的程式貢獻。

最後再由業界的角度來看。

業界需要的,通常是可以寫得出程式的人,而不是說得一口好程式的人,學校培養的應該是能寫程式的人,靠選擇題來測驗最多只能培養說得一口好程式的人,這類業界並不想要,說得一口好程式不會讓它變成真的能動的東西,反而還有可能干擾到其他程式員的進度和工作,尤其是一個新鮮人,沒有實務歷練的情況下,說得一口好程式反而可能只是奇妙的幻想而已,業界的現實不是學界能夠應付的,實作能力往往比理論重要得多,但有理論基礎的實作會比沒有更好,所以理論應該要能在實務發揮,而程式的實作正是讓理論發揮的最好工具。

業界看重的是問題解決能力以及實作的能力,不會寫程式或是寫程式能力太弱的人,若在三個月內拉不上來,基本上就是謝謝再聯絡,公司的筆試基本上也不太可能用選擇題,而是申論或是實作題,面試更是無範圍的大哉問,所以不用幻想業界還會用選擇題,用問答題就已經要偷笑了。

所以總結來看,程式的考法,實作永遠比選擇和填充重要,沒有實作,測不出學生的實力,請各位老師們,別再用題庫了吧,還是自己好好的出題,否則培養出一堆說得一口好程式的人,業界和新鮮人只會回頭罵學校而已...

或許你有更好的作法,請你告訴我。