2022年10月24日 星期一

再談 APCS

http://4rdp.blogspot.com/2022/10/apcs.html

每年底學測前,總是興起準備 APCS 考試的話題,因為近日看到金門大學陳鍾誠教授挑起這議題,想說說自己的看法。先說,我是已經 36 年程式設計資歷的工程師,相當清楚如何入門學習程式設計、遭遇困難問題如何逢凶化吉,以及程式工作的職涯發展,另外,自己的小兒也正在讀交大資工,在此分享我們的經驗。

我的心得是,一輩子走程式設計這條路,不是人人都有辦法一直走下去,因此應該要先審視自己的個性,程式人通常有以下特點:

一、愛好自學 ─ 電腦科技日新月異,三不五時會有新技術、新語言、新工具出現,因應需求有時被迫更換使用新東西,非愛好學習者,通常承受不住這種壓力,我寫了三十多年程式,到現在還是經常在學東西,不只程式語言,更多的是跟程式無關的,因為有時解決問題的靈感來自其它領域的知識。學習方法不外乎老師教授以及自己學習,老師教的最大好處,快速有系統地把知識傳授給你,但是你的腦子能否快速吸收這些大量知識,那又是另一回事,很多知識是需要基礎的,如果少了這些先備知識,是無法充分理解應用的,況且有些問題是不明的,因此自己要訓練自己有自學能力,能夠成為自己的老師,分析問題原因,可用的對策有哪些,否則卡關無法突破,你就會想要轉職,個人認為時間花在補習上,你就少了時間訓練自學。

二、理性思考 ─ 越理性的人,邏輯思路通常越清晰,邏輯越清晰,寫出來的程式出錯的機會就越少,品質也越好。程式除錯時也非常需要縝密的抽象思考,甚至要有觀察力、想像力,當程式出現異常時,我會先觀察問題現象,根據線索釐清問題,想像以及假設程式處在某種狀況才導致問題,從這些地方下手多數可以迎刃而解,當然也曾遇過要同時改善三五個地方才能解決的,甚至也碰過不可能的任務 ─ 控制不可控制的系統,這些都需要像偵探般細心判案才能解決問題,個人覺得棋奕類的遊戲是訓練抽象思考很好的工具。不善於理性思考的人,寫出來的程式出錯率極高,光除錯就把自己搞死了,你就不會想當程式設計師了。

三、耐性沉著 ─ 人非先知聖人,程式總有寫錯的時候,此時需要除錯,這也是最考驗耐性的時刻,如果你能一邊寫一邊測試,那是最好的,因為可以容易立即發現錯誤並修正它,不過這也會造成進度緩慢,因為有些程式一直被重複測試浪費時間。那一次全部寫好再測試不就好了?如果這麼做,複雜系統可能無法立即發現錯誤點在哪裡,需要程式碼一個區塊一個區塊檢查,有時還看不出問題點,學生時代,我曾用一個禮拜時間寫出約 1000 行組合語言程式碼,結果用三個禮拜的時間除錯,經過那次教訓後,就採用邊寫邊測的方式設計程式,雖然程式設計進度不快,但是成功率提高很多。因此耐性沉著是程式人非常關鍵特質,少了它,你撐不久。


沒有以上特質的人也不是不能寫程式,它只會佔據你生命中一段很短的歷程,例如學生時代為了交作業或考試而寫程式,之後就再也不想碰。回頭來談 APCS,雖然我已經不需要去考這個試,但對這制度既愛又恨,如我去年十月發表對它的看法一樣,不需要為考資工系特別去補習如何準備 APCS,個人肯定 APCS 可以鑑別出同學的程式設計能力,我也贊同學生參加短期暑期營隊,去啟蒙和體驗了解自己是否喜愛程式設計的活動,但反對為了考試以補習方式去強化這方面能力,而應該是自己去探索怎樣寫出程式,個人認為能探索出來的人,才有辦法於未來在這個行業生存很久,因為他們通常也具有程式人基本特質。

除了參加程式營隊之外,我覺得參加桌遊社團活動也是不錯,舉板橋重慶國中資訊科方日升老師的教學為例,多年前他因為電腦教室整建,幾乎整年無法用電腦上課,他就帶同學們玩桌遊,遊戲玩完之後請同學畫流程圖,描述遊戲的流程,這是很好訓練程式思考的方法,初級程式設計師或是複雜專案設計時,流程圖可以幫助思考,一般而言,畫得出流程圖,程式也就寫得出來。

反對補習的另一原因,不符經濟效益,如淡江大學電機系饒建奇教授觀察,初學完 30 小時,多數同學 APCS 成績大約為觀念 3 級,實作 2 級,想藉此讀頂大資工,一般而言還要再投入學習時間可能約在 500 小時以上,達到觀念 4 級,實作 4 級的門檻,而且各大學入學經由 APCS 管道錄取人數仍遠少於傳統課業路線, APCS 入學名額約占 5% 左右,倘若你把這 500 小時投在數英自這三科學習,錄取頂大資工的機率會遠高於考 APCS ,絕對划得來。

另外以小兒為例,他中小學時期,曾問他想不想學習程式設計?他總是拒絕我,我知道他不是很有耐性的人,並且當時沒有興趣,就不強迫了,怕強迫了,會打壞將來他學習的興致,不過知道他對數學有高度興趣,就帶他走數學之路,是一條數學創作之路,我們父子就經常相互出考題考對方,有沒有解出答案不重要,重點在激發思考,這裡也記錄他從小到大想出的各式奇怪的問題,有人一定覺得奇怪,為什麼不教他寫程式而是想數學呢?程式設計不急著學,到大學讀理工科系,學校自然會安排課程,再加上同儕影響,自然有強烈動力學習,雖然起步晚,但是整體思考更成熟,學識更豐富,知道自己在學甚麼,學習有目標,效率會更好,而且懂得數學知識,那麼處理某些問題更應手,舉個例子,不使用程式語言中函式庫時,設計一個開根號或是對數函數程式,你知道要怎麼寫嗎?數學是演算法的基礎,我指導他就是未來要能自己創建東西,不要只有 follow。

去年他很幸運申請到交大資工,就讀之後,發現同學很多之前都沒寫過程式,但是數學都很強,超多建中數資班之類的同學,他們邏輯清楚學習很快,不過他有一位宿舍室友以 APCS 特優入學,程式設計方面當然是輾壓所有同學,但是其它學科成績卻遠遠落後,一半以上科目不及格。而小兒自己除了第一學期,因為沒寫過程式而被操的哀哀叫,其它科目應付都游刃有餘。我觀察他屬於不愛寫程式的資工人,但是只喜歡西洋棋,他會去研究如何爬梳棋站資料,整理如何開局以提高勝率,現在他也是交大西洋棋社創始社長,反正趁年輕去闖蕩一番,不過期望他未來學好程式設計,再加上創新的想法,能貢獻社會。

回歸主題,不喜歡數學的人是不是就不能寫程式?個人認為還是可以寫,只是側重在一些不太需要用到數學的應用程式或網頁設計,因為涉及執行效能的系統引擎、系統程式之類,還是需要擅長數學及演算法的資工專家來設計會比較優。

總結來說,APCS 適合超愛寫程式的人來考,通常是一群同學中,自認前 5% 左右的程式設計高手,考 APCS 性價比會比較高,其他的同學,是可以用來申請電資類科系參考,而校系自願不在這領域的,通常是打水漂,我覺得認識自己再去選擇合適的升學管道比較好。

沒有留言:

張貼留言