2015年7月4日

[隨筆] 程式能力該如何檢定?

最近這幾年推廣寫程式的風潮越演越烈,比方說科技界的大老的推廣人人都該寫程式甚至也有教授開始推廣國中小的學生開始學習寫程式。究竟為什麼推廣寫程式,我想已經有很多文章在闡述這點了,今天想談的是從這點往下延伸的問題:
究竟如何判斷一個人的程式能力?

對於一個資工系的學生來說,不會寫程式一定會被質疑究竟就學的這段期間都幹嘛去了?特別是到了業界,從 XX 學校的資工系畢業的學生不會寫程式,這可是會被質疑該系培育學生不確實,會直接影響到系所名譽的~不過我猜大概早就沒救了 (欸。所以幾年前交大跟師大聯合弄了個大學生程式能力檢定 (Collegiate Programming Examination, CPE) 的東西出來,目的是推廣到各大學去,並以此作為檢定大學生程式能力的平臺。

CPE 既然是交大跟師大聯合搞出來的東西,當然這早就已經變成他們資工系的畢業門檻了。舉例來說,交大資工每個月 (沒記錯的話拉) 都會舉辦一次程式檢定,畢業門檻就是必需要在某次的檢定中解出 2 道題目才過關 (有錯請幫忙補充修正)。兩年前這規定延伸到了研究所,所以現在也變成交大資工研究所的畢業門檻了。之前擔任交大資工大一程式設計的駐點助教讓學生問問題時,就有人來詢問怎麼準備這種測驗了。稍微岔開題外話 XD 當時來問問題的都不是大一,問的問題也都是他們當時修的課的程式問題,所以後來我就不爽當了...雖然薪水還滿不錯的。

回到主題,既然系上拿 CPE 當作檢訂程式能力的標準,了解 CPE 的題目可以大致窺探設定這一套系統的人的想法。所以呢,我們來看看 CPE 的網站簡介都寫了什麼:
為了提升國內學生的程式能力,各大學相關教授於2009年組織了「國際計算機器協會程式競賽台灣協會」,做為跨校交流與合作的平台。該協會並於2011年 2月通過「組織章程」、「大學程式能力檢定辦理要點」、「大學程式能力檢定考試規則」。為使組織更進一步法制化,以更順利推動各項事務,故於 2013/11/30召開正式成立大會,更名為「臺灣國際計算機器程式競賽暨檢定學會」(ACM-ICPC Contest Council for Taiwan,簡稱ACM-ICPC Taiwan Council),並成為內政部登記在案的正式學會。該學會下設有一個「大學程式能力檢定委員會」(Collegiate Programming Examination Committee, 簡稱CPE Committee),負責推動辦理CPE程式檢定考式。

藍色字體是重點:所以簡單來說 CPE 就是個 ACM-ICPC like 的平臺。這類平臺不稀奇,畢竟我大三開始的那一年開始有越來越多的學校加入這類競賽、也有些教授跟教育部拿了經費自己弄了個平臺出來,或者是有些學校系所也自己搞自己的程式競賽,畢竟評判系統都可以公開下載了,只要會系統的環境設定& 大致摸懂這套系統怎麼用,任誰都可以自己搞一個程式競賽,我當初擔任系上學術長時就有跟另一位也是擔任學術長的同學玩過了 (最大的問題是你怎麼吸引別人參加 XD)。我大學快畢業時,系上其實也有針對程式能力檢定找了大學部的一些人 (各年級都有) 一起討論這問題,雖然最後的結論是要再討論,不過其實討論過程中有個問題很值得思考:究竟該拿什麼樣的題目測驗程式能力?

以我參加過幾次這類 ACM-ICPC like 的程式競賽的經驗來說,我並不認同拿這類程式競賽的題目當作程式能力檢定的題目。當然,有些題目其實還滿不錯的,而且可以測驗到程式設計師遇到一個問題時究竟會如何面對與解決的能力。注意到我藍色字體的關鍵字了嗎? 這類程式競賽測的是解題能力,當然還有如何把解題的想法加以實作出來的實作能力,但最關鍵的地方是解題能力,畢竟如果你連碰到的問題都沒解法了,遑論如何實作? 但是對我來說,我認為的程式能力是有沒有辦法把自己的想法透過程式加以實現的能力。換言之,這類程式競賽的題目所測驗的方向跟我認為該測驗的程式能力其實方向不同,所以我本身不認同用這類競賽當作檢驗程式能力的標準。

舉個例子,像是這個問題:要作的事情很簡單,如果我告訴你我希望你寫一個程式模擬題目中所敘述的行為,你有沒有能力寫出一個程式可以正確的做出這樣的行為,這就是我認為的程式能力。

反之,給你這個問題,但是我先告訴你照著上面寫的方法作會花太久的時間,請你想別的方法解決,那麼我會說這是訓練你的解題能力,而不是程式能力。也因此,其實我不太認同拿 CPE 當作檢定 "程式能力" 的標準。當然,如果那些教授一開始認為的程式能力就是以解題能力為最優先考量,那 CPE 確實很適合,不過就我本身所了解的,其實那些教授主要的重心是放在不要讓畢業的學生出去後被別人說不會寫程式。

作個總結:究竟如何才算是程式能力很好,我覺得這還滿值得討論的,而且我相信一定會有存在彼此想法差異非常大的人 XD 舉個最簡單的例子:參加 ACM-ICPC 這類程式競賽的人,練習的重點是放在如何解題還有熟練度,寫出來的程式除非是常用的演算法或資料結構,不然通常可讀性、維護性會很差,原因在於如果要寫出一個效能非常好的程式,第一個犧牲的絕對是可讀性及維護性,反正那些程式不可能再被拿出來利用;反之,專注於開發系統架構的人,我相信可讀性及維護性絕對是重點,畢竟這類程式可是要常常修改維護或是新增/修改/刪除各項功能的。因此我們究竟該如何定義一個人的程式能力,甚至當作畢業的門檻,我覺得這很值得思考與討論。


備註:
這篇文章來自於某次學弟跟我聊到他覺得系上程式能力檢定的題目很不合理,簡單問了之後就發現是類似這個問題的數學題。不過因為數字非常大 (ex: 輸入最大是 1e9) 但是時限只有 1 秒,所以這類問題考的其實是推理、歸納找規律的能力。

沒有留言:

張貼留言