Try   HackMD

回顧個人學習經歷 insideAPCS

Day 2 自學的契機

由於想要完整將自己從小至今的學習歷程完整敘述,容我從小一開始接觸程式的故事說起:


從記憶中對實作的印象是國小二年級,跟著國小課後班一起玩類似智高的積木課。而真正開始觸碰 NXT 等連結小電腦的積木玩具是在三四年級,記得是三五個同學和老師一起組各種不同的東西,上課的老師和地點都許多改變,地點也常常會更改,但最後常在附近的某間海洋大學上課。當時大多都是透過 NXT 配上當時 LEGO 字型設計的圖形化語言介面實作。印象中當時做出比較有趣的企劃有:

  • 抓球機器人。能夠透過多個按鈕操控手臂,能夠自由地將球抓起並在指定位置放下。

  • 用超音波感測器、噪音感測器和按鈕做出的長號。在氣孔、兩個按鈕及滑把的輔助下,練習一陣子可以發出大小聲,且有一個半到兩個八度(含半音階)且能夠演奏簡易曲子。

  • 能夠到處晃且不怕踩空碰牆的車子。那時最喜歡的在上課前拿一台車在學校到處晃,在下課時尋找他跑到哪裡。

  • 各種不同型態的車子。因為大部分的企劃都是製作車子,因此開始做出分別在3分鐘、5分鐘、10分鐘內就能做出來的車子,各自有不同結構穩定度、能夠裝感測器的位置分佈等。

最後一學期跑到了某一間國中和那裡的同學一起上課,身為唯一國小生的我很怕生,加上當時被老師規定要用能夠操控 NXT 的文字語言 NXC 來寫程式,有如手腳被綁一般變成什麼都不敢做。但當時知道有個全國 NXT 機器人比賽,我對其中的循跡車很有興趣,因此那段時間我就在很短的時間內就做出了一台車,並在上面放上四個紅外線感測器。

在之後的課程便只有不斷的調整參數,希望能夠在最短的時間走完賽道,但在一開始要在不離線的情況下走完全程就是個問題。當把感測器的部分調整好後,把轉速調高又有不同問題需要解決。經過多次嘗試才變成下面的樣子,能夠利用最高速走完全程。最後成功獲得當時國小組的第一名,也是印象中最後一個 NXT 專題。


到了國中碰巧認識了 Scratch 這個程式語言(即便我現在不承認他是),激起了我原本想要做遊戲的想法,再加上剛好有比賽可以參加,決定趁這次機會做出來。因為從文字介面回到能夠用指令方塊堆疊,因此學習速度也非常快。最後用了快兩個禮拜的時間終於做出了像樣的 平面跳躍遊戲 Space Crisis

我不敢說我透過這個遊戲學到了什麼東西,但這或許是我有史以來第一次在沒有老師指導的情況下,自己從 0 開始自學,全部內容都是找網路上的文章學習的。或許現在回頭看不算什麼,但這有很大部分奠定了之後在這條路上的學習方式。

Day 3 自己的專題研究

事實上,自學並不是一件簡單的事。

在之前的 NXT 企劃,要不是有老師建議我要怎麼做出那個架構,我根本想不到長號的滑管居然可以用超音波感測器來輸入;要不是有老師在旁邊教我每個程式方塊在做什麼,我壓跟也沒辦法寫出那麼困難的東西,不如說當時的我也沒有能力依靠自己就把這些酷東西做出來。

但在這無數次經驗中,或許是看到大家是如何解決問題,偶而只是參與在其中,就可以看到大家是如何一再的解決問題。在循跡車的部分也是,都是老師和學長姐在旁先示範一次如何調整,我再試著照做,才有可能在後面調整的那麼完美。要不是當時有他們,面對完全沒有接觸過的語言,我也不可能能夠做出來。

昨天提到在國一時做的 專題是我第一次完全自學的初經驗,而國二的專題研究則是因為碰壁而不斷打破當時自己對自學的想像。


當時我決定的專研題目為拾穗問題,如果要以數學的方式解決的話需要用到簡單的微積分,而當時的我也確實透過網路上的文章和國中數學老師的幫忙學會了。但若是要增加不同的變因,對我來說用數學方式解出來是不可能的(事實上也不應該),也因此決定試著用程式模擬。

那時為了要做出一個模型能夠模擬拾穗問題的程式,不是選擇如 C++ 或 Python 等當時的主流程式語言,而是和選擇和爸爸一樣常寫的 php,一方面是當有問題時才有人可以問,二來是這樣我爸才會看我的扣不爽幫我改

在過程中我嘗試加入了非常多變因,有如在 Civilization VI 加入不同資料片一般,每種變因都會讓整個研究題目煥然一新。即便這已經不在科展的領域規範內了,但我根本沒有擔心過,在煩惱的只有要怎麼把他用程式呈現,要怎麼找到最佳的策略期望值才能最高等等

(整個過程都被當時的我紀錄在2017年的鐵人賽自我挑戰組,若有興趣可以去看。)

現在回頭看才知道當時我對專題研究投入非常大的熱情,就之前的回憶來看,我幾乎沒有任何一個時間不在想的。或許在此之後的專題也沒能像這樣投入如此大把的時間,但確實,當時我的技術力確實沒辦法把持住這種複雜的題目,以至於只能把它當作是一個遊戲去研究,沒辦法將這些變因一般化。但為了解決問題,我寧願花時間把每一個能夠想到的變因都寫出來,就算是用電腦模擬也沒有關係,因為把內心所想實作出來才是我想要的。事實上若是以研究領域來看,或許連微積分、線性代數、機率論都不夠,還要再去修一門賽局理論才能做出一點皮毛。

若是當時只是接手老師想到的題目,或是做了一個自己沒有興趣的題目,或許過程就不會這麼有趣了。

Day 4 你的專研不是你的專研

升上高中也有專題研究的學分。為了找到適合的題目,我和同個專研的同學一起到師大資工(和科學班合作的校系之一)訪問教授。前後去了幾個禮拜,從聲音分析、叢集計算等,甚至還有用機器學習來訓練 AI 玩遊戲等,認識了很多不同領域。但我們對這些題目都興趣缺缺,嘴上說著有興趣,但也僅止於有興趣,試個幾天就沒有打算繼續研究下去了。而這樣的情況持續了好一段時間,直到高二為止我們完全沒有任何進展。

到了高二被推坑教育部辦的「科技大擂台 與AI對話」比賽。因為沒有任何經驗及基礎,所以硬是在網路上找了許多影片及文章,大概了解模型的原理及如何使用後,在一陣慌亂中結束了第一次對機器學習的接觸。雖然沒有得到任何名次,但覺得這或許是個能夠繼續研究的領域。

很不幸的,這個坑是個無底洞。光是如何使用 UNIX 指令就已經分身乏術了,還要同時熟悉使用虛擬機的資源、機器學習的原理和修改方式,手中擁有的感覺都不屬於自己一般,和之前的所有研究都還要複雜很多,也都不是自己能夠簡單掌握的領域。而事實上我們的研究觸及到的領域也非常廣泛,除了我當年在鐵人賽寫的筆記來學習機器學習的模型外,若要更深挖掘,線性代數(傅立葉轉換)、微積分、語言學、自然語言處理等都需要研讀一番後才有可能有完整的認知。(現在還是不會QQ)

我和專研夥伴花了半年的時間後才終於把研究做出了雛形,雖然現在回顧會發現很多問題(是真的很多),但至少在當時能夠拿到校內資訊組特優,也才有勇氣說這個專題是自己一手造成的。不過這一切回想起來也覺得非常神奇,居然是從一個完全沒有得名的比賽開始發芽的。而原本每週都去師大資工看到的那些題目卻沒有任何感受。或許是因為有比賽的壓力在才願意把頭伸進去一探究竟,但也有可能是心底的某個角落就對這個領域觸動也說不定。

從完全不熟悉的疏遠感,每天開始一點一滴的理解,慢慢把知識轉變成自己的經驗,應用到自己的研究上或許因為難度一下子提升太多,導致研究的過程中沒有什麼實感,也不覺得這是個能夠拿出去給別人看的東西,但其實這些步驟在之前的所有企劃、專題都是一樣的。

個人認為這樣的想法搬到學習程式設計有異曲同工之妙,獻給各位參考。

Day 5 競賽程式經驗談

我第一次聽過程式競賽時是在我剛進到國三的下學期。

在這之前我對於程式的相關經驗除了國中科展學的 PHP 及所有在第 2 篇提到的之外,我也曾在國三修資訊之芽 Python 班並學了一點語法和模組的使用方式,其外並沒有任何對於程式競賽的基礎,甚至連他的比賽規則是什麼也不清楚。

在升上高一的暑假我參加了校內的程式競賽培訓,為期3~4週,內容為C++的基本語法、基本資料結構及簡單演算法。當時就算是這樣的內容我也學得零零落落,畢竟當時沒有花太多時間在上面,有練習程式也全都是在培訓的時候而已。在校內選拔我上了選手候補,但在開學後我仍跟著校隊在上課時間請公假出來訓練。

這時候才是我真正開始認真研讀程式競賽的基礎知識。當時高三的學長姐們非常耐心的教我們各種演算法和資料結構,雖然還不太會把這些思緒轉變成程式,但觀念相較暑假清楚很多。但因為沒有勤勉的練習,還是沒辦法跟緊上大家的腳步,在最後的幾次練習賽的表現還是被學長姐遠拋在後面。

除了校內的培訓外,我幾乎每年都會參加清大資工辦的程式競賽集訓營,在為期五天的營隊中,會塞給我們前所未有,到現在都還沒完全學會的所有演算法的知識。在那段時間只有不斷的知識轟炸,完全沒有任何時間休息,只要一放鬆就會完全不知道台上的學長在講什麼。晚上的時間是實際在電腦教室實作白天學到的知識,但手就是趕不上腦袋想的,想寫出來的東西全部卡在腦袋中,手感完全沒有進步的感覺。(而各種因緣際會,我沒有參加過台大辦的集訓營,但我相信內容也非常的結實)

隨後在競賽程式的道路上,我跟著一起同學參加了各種不同比賽。除了各家企業辦給高中生的程式競賽,或是走上資訊奧林匹亞的選拔之路(雖然我沒有進過)。在這些一點一滴累積的經驗中,才真的可以頓悟當時在清大程式營聽過但沒有吸收的概念。但事實上是我在高二時都在做研究,一樣沒有太多時間練習演算法訓練手感,只能在比賽間慢慢透過實戰提升實力。而最後一個正式比賽便是在高三時的北市賽,也是我唯一比較能拿出來看的成績了。(優等第二)

而認識 APCS 更是我在高二時才透過升學講座才發現的能力測驗。由於我和同學當時已經有在練習了,因此在近乎裸考的情況下印象中都得到最低 4/3 平均 5/3 的成績。而我在兩場考試後,最後的成績為觀念題 5、實作題 4,而這同時是目前所有學校採計 APCS 分數的最高標準。


即便我在高中前的程式經驗並沒有特別豐富,但我相信這個經驗沒有辦法讓所有人參考。尤其是在跟著校隊一起練習的方面,也是要學校有這樣的社群才能夠跟著成長,相信也不是所有人都能夠如此幸運的能夠有朋友一起練習。下一篇章會先從 APCS 考試內容及準備方式開始談起,並嘗試從 0 開始架構出學習藍圖。