高二之後就開始忙考試了。指考結束後,只填五個志願,全部是資工,台清交成政。當然我那時知道台大應該難上,但絕對上清大。可能是有點自負,或者已經被程式「只要最低所需」即可,幹嘛填那麼多,浪費志願名額。
可惜,大一大二開始學的課程,我完全不知道在學什麼,要嘛是基礎的數學知識,要嘛是電子電路類的邏輯課程…由於清大的教授幾乎都是電機系轉來,對於
ic 設計的學生可能跟天堂一樣。不過對我這樣的硬體白痴而言,真的是滿無助的啊~。就連資工三主修之一、也是Computer
Science的靈魂:演算法,我都在想…幹嘛一直學「排序」啊!哪招啊!
注:排序演算法是演算法中被研究最久的題目之一
不過再次快速成長的課程是大三時選修王炳豐教授開的「高等程式設計」這不是一堂必修課又非常的硬,所以選修的人數並不多。每堂課直接用
C 實作演算法去解 UVa online
的線上題目(UVa是辦程式設計比賽的組織,題目跟比賽就是像程式奧林匹亞競賽)除了要用程式解出他給的題目外,通常有很嚴格的時間限制或記憶體限制。當時才真的了解到演算法在實作上面的威力!由於那些要求都非常刁鑽,沒有好的演算法不可能通過,例:10ms內要找出給的
N 內的所有質數。所以才知道怎麼樣去利用各種演算法,並也實際感受到演算法常算但抽象的Big O的重要性。
課程進行的方式也很有趣,每堂課的作業讓同學回去想,下次上課前讓有解出的同學舉手上台講解自己的解法,我開心的是有次有上台講解當週作業,雖然我並沒有用到老師要用的演算法,硬要用我自己想出來的,還是滿有成就感的。這堂課練習到各種演算法課聽過的演算法,從排序(Sorting),
圖形(Graph, DFS, BFS), 動態規劃(DP)等…,最後在校內辦的程式比賽還得了個小名次,到現在我都還認為是我 6
年在清大上的最有價值的一門課。
前面提到資工系都在教一些很「沒用」的課程,或很多人可能都有相同的感覺:比如「資料結構」、「演算法」、「作業系統」、「計算機結構」、「網路概論」等,甚至可以說不會這些根本沒差啊,搞不好有些駭客級的程式高手都不知道這些知識。我覺得有這個感覺很正常,因為像清大這類學校其實是研究型大學,主要是研究更深的理論的地方,而這些課程就是做研究的「基本功」。我最喜歡用武俠的方式來比喻程式設計:那些語言、框架、Best practice等都是「武功招式」,而演算法、資料結構等理論就像「內功心法」。武俠小說的主角通常都是硬記心法口訣,原本都不知道心法是做什麼的,靠一招半式行走江湖。某一個情形下會突然頓悟打通任督二脈,發現內力融合招式後,連楊柳都能當劍使,進而成為一代大俠。
可以當只學招式的劍宗,也可以當鑽研內功心法的氣宗。但畢竟不是小孩了,我們可以兩個都要。當招式已經無法解決問題時,必須自己另闢一條路,才不會讓自己被框架綁住。
留言
張貼留言