在交大資工一個學期的觀察與心得

小提示:如果你是高中生,可以先看給高中生的大學選校系建議

前言(寫於2013九月)

實在是太多人在下面留言告訴我線性代數到底有什麼用了,看到這麼多相似的留言我已經有點膩了。我寫這篇的目的也不是想要知道線性代數的用途。

這篇文章似乎很容易讓人抓錯重點,這篇本來只是寫給自己看的,我也沒料到會在搜尋引擎衝到那麼前面。不過我不打算因爲流量衝高就去修改內文以澄清我的重點。

有一位朋友私底下和我說(在文章發佈很久以後),這不過就是我來錯地方了,這地方的風氣不適合我,我覺得大概就是這樣吧。

可以這麼說,我來到(交通)大學,然後發現這個地方和自己先前所想的不一樣,於是寫了這篇描述我原本的預期或是理想。就風氣這方面來說,選大學是場賭博,因爲要進來之後才能體會這究竟是不是對的地方。

我大致上不喜歡這個地方,但我也發現這個地方爲我所提供的也並不是完全沒用,也不盡是壞處。並且,這些壞處不值得我再去賭一次,意思是我會繼續待在這裏。只是我發現的這些好處和待下來的理由,和我原本的預期、一般學生的理由、教授認爲讀大學的理由已經不一樣了。也沒關係,就各取所需就好了吧。

正文

在交大也一個學期了。寒假聚餐時聽臺大資工的同學談臺大的情形,也有點感覺到兩個學校不同的…應該說中心思想吧。

必須承認,我非常笨的以為到了大學就可以做自己喜歡的研究,自己學想學的東西,但這兩件事情其實在交大受到了嚴重的阻礙。

從小學還算愉快,到國中悲慘的3年,再到附中…我大概是從國中就對電腦產生濃厚的興趣,到了附中加入網管之後才篤定要將電腦作為我一生的職志,不管做什麼工作,反正大概就是與電腦相關。所以從上高中開始我讀書的主要目的就漸漸變成「拿到不會太爛的成績」,然後把其他時間拿去玩電腦(主要啦,社交活動、打遊戲的時間老實說也不少)。那時候生活的主要目標就是電腦、社團,讀書從來不是目標,讀書只不過是為了達到目標而必須克服的障礙。考大學呢?考大學在我當初以為,也是一個阻礙,讓自己有更多自由時間的阻礙,為了讓自己未來有更多自由時間,我犧牲考大學時的自由時間。

進了交大才知道,交大比起附中並不會讓我有更多時間,反之在交大,取得自由時間的阻礙更大了,意味著我必須花更多的時間才能克服這個阻礙。

我不知道該說我笨、天真,還是我從小學到高中都是被制度、家長、老師騙著長大的,被騙著以為大學就可以做自己喜歡的研究、自己學想學的東西(理想中是由我自己訂想學什麼,然後自己找資料學習,遇到瓶頸問教授,研究完成之後交報告,沒有考試)。不管是哪種,到了交大,一廂情願以為從此可以自己學習(或至少更接近自己學習)的理想正式破滅。

大一上我覺得我90%的心力都在對付線性代數與微積分,尤其是線性代數。線性代數的抽象讓我難以理解,每每遇到瓶頸,我又會開始思考究竟為什麼要讀線代,我問了老師,「為什麼我們要讀線代?」,老師回答的還是老生常談 google 一下或是看維基百科就可以得到的答案:「線代在圖形處理、訊號處理等方面非常有用 blablabla」。這我也知道啊, but shut up and show me the code ,哪個計劃、哪隻程式使用線性代數解決了什麼問題,這活生生的例子才是我想知道的,我想知道線代究竟實際上可以幹嘛,而且我要看到原始碼。但是畢竟是我一開始沒有講清楚我要的是什麼樣的答案(第一次問問題就這麼直接的問如此特定的問題,還要求教授舉例,這似乎也有點咄咄逼人,不太禮貌。這是兩難。),教授自然也不太可能給我我想要的答案。得到這個完全沒用(google 都知道)不滿意的答案之後,再加上我作業已經好幾次沒交(此教授的作業幾乎都是是該章節課本習題全部),上課一直睡著(不是故意的,是因為聽不懂…),小考成績很差,我也不好意思再回教授說:「這不是我要的答案」。我不希望讓他覺得說這學生自己不唸書、態度不佳還來問我這種問題,要我給答案。這不知道為什麼而學的感覺讓我格外痛苦,一方面我覺得到了大學不應該再是家長老師告訴我們要學什麼就學什麼,一方面那時我還有自己程式的計劃進行中(這計劃完成之後說不定可以賺錢),不能把時間分配給有用(能賺錢)又有趣的事情而要費心讀一個教授說很有用但我卻找不出到底有用在哪裡的科目。

當初,在我心目中的排名,交大資工是比臺大資工還要好的選擇,想要進來交大資工的原因很大一部分是因為我覺得我在交大資工比較有機會遇到真正對電腦有興趣的人,而不是那些因為資訊奧林匹亞保送進大學的人,我覺得資訊奧林匹亞的某一些人,他們「數學很好」、「對數學有興趣」,但是他們有興趣的是數學,不是電腦。我想遇到的是對電腦有興趣的人。

題外抱怨一下,我覺得資訊奧林匹亞沒資格稱作「資訊」奧林匹亞,「演算法奧林匹亞」才是比較符合事實的名稱。

確實,我在交大資工遇到不少真的對電腦很有興趣的人,這些人有一些以前也有自己努力研究過電腦的東西,具備實力。但我看到一些人不是在(試圖)發揮/提升自己的實力,打造自己的 project 之類的,而是為了應付各種的作業、考試而忙得不可開交。或許他們單純是被課業壓住,或許他們覺得學校的課程是提升實力比較好的方法,但我認為接 case 、做 project 這是比較好的方法。更何況我覺得做 project (不管後來是為了要創業,或是單純 opensource 出來)是對這世界比較負責任、有貢獻的做法。電腦、網路給了人類很大的力量,對於這些實力已經足夠改變世界(就算是一點點)的人來說,為什麼不是去思考如何讓這世界(或者狹窄一點,臺灣社會)更好,而去花時間做好考試、作業?身為臺灣頂尖的交通大學資工系學生,又正處於人生最有創造力的幾年,為何要選這麼多課,花時間學這麼多東西,而不是利用這種優勢去改變世界、回饋世界?

對於那些單純想要在學術界鑽研的人,他大概也覺得沒什麼關係吧。我是比較喜歡關心社會罷了。

希望臺灣能再有多一點人致力於改善臺灣。

上面講的改變世界,或許有人看了會覺得我太理想化,當然有些人會是比較顧慮現實面。我所抱持的理念是:「只有那些笨到以為自己可以改變世界的人,才能真的改變世界」至少在我還相信這一套的時候,在我未來或許被現實逼得無法再相信這一套之前,我還是要為這世界、為我所相信的東西做一點事情。

即使我能做的不過是送個 bug report , 翻譯一些自由軟體,轉貼、瞭解、思考反媒體壟斷、關廠工人的議題。

聽臺大資工的朋友說,最近接了什麼 case 、有學長姐回來找人做 part-time ,我覺得很羨慕。交大在這方面的機會比較少,比較需要靠自己爭取。以臺大、清大、交大來說,我看來交大的創業風氣是三校當中稍弱的。臺大有創意創業學程,這可能不代表創業風氣,但至少表示校方有著墨在這塊。聽臺大的同學說很多回來找 part-time 人員的都是學長姐開的公司。清大和交大的一些學生有(應該算是)合辦 AppUniverz 。我比較有明顯的感覺臺大的創業風氣比交大盛行,清大的情形我就不清楚了。

我有去過交大創業俱樂部(非正式學生社團)的聚會,跟裡面的人聊天之後發現,大部分的人都有想過要創業或是做 project ,只是顧慮到課業上的壓力、自己的能力、創業的機會,大多都沒有著手實現。創業俱樂部以外,我也聽到一些學長在討論創業或是 project 的構想,並且有幸認識一位學長做了很多有趣的計劃,其中很多都 opensource 出來了。

想想自己,在交大的這一個學期當中,也有很多需要反省改進的。時間的利用上我做的特別糟,作業幾乎都是前1、2天才開始趕工,禮拜四下午的作業交出去之後的這段時間最頹廢,因為到了禮拜五下午才需要再去上課,就會覺得自己時間好像很多,於是就開始看電影、聽音樂、打遊戲之類,有時候做的事情更少,因為線代遭遇到重大挫折然後就開始思考究竟為什麼要讀線代、為什麼要讀大學,想了很久總是得不到答案,陷入憂鬱狀態地做什麼事都提不起勁,不想洗衣服、不想洗澡,什麼事都不想做,就只是坐在椅子上逃避、拖延,然後整個禮拜四就耗掉了。睡眠時間也比高中時長多了,不是每天都需要6點起床,睡眠也就睡得很不規律。躺在床上的時間8、9個小時,其中睡不著,或是醒了但是賴床的時間就佔了1、2小時。

高三時喜歡交大資工有很大一部分的原因是 CCCA ,交大網路策進會,雖然它倒了,但是我那時候想說繼任的 NBA 應該會有類似的性質、環境。為什麼會喜歡 CCCA ?因為我在附中網管 CNMC 受到很大的啓發、學到很多東西和經驗,附中資訊中心給 CNMC 的權限和資源相當大,這是超級難能可貴的。我期待到了規模更大的交通大學,我可以在 CCCA (NBA) 學習到更多專業知識和難得的網管實務經驗。

後來發現 NBA 和交大校計中的實際狀況和我想的真的是天差地遠,NBA 的資源(設備、經費、權限)與 CNMC 相比少得可憐。NBA 根本不是 CCCA 的繼任者,而是完全被砍掉重練,而且校計中以我看來也沒有想要「重練」它的意思,完全就要靠社員自己。社團內部的課程也都還沒有上軌道,以我看來社團的宗旨也還不夠明確。

我也在 NBA 開一些課,希望哪天計中看到我們的實力能夠給我們更多的機會和資源。雖然這幾堂課我自認都還頗認真準備,但是整體的課程來說,我對自己也不甚滿意,這幾堂課(好像3堂吧)只能讓聽衆學到零碎的知識,缺乏整體的認識。因為我自己時間上的限制,沒有辦法每週開課,我覺得教學的效果頗為有限。就連 CNMC 完整2學期+寒暑假的課程我都覺得稍嫌不足了,何況是這短短3堂課。

光是關於 CNMC 、CCCA 、NBA 、兩校計中的環境,這就可以寫一整篇了……

隔週週一晚上的 PyHUG (Python Hsinchu User Group) 是我一整個禮拜最快樂的一段時間(另一段快樂的時間是週二的神經科學導論),雖然老實說,我從來沒有寫過 Python ,短期之內也不打算學(因為沒有需要),PyHUG 講題我也很多聽不懂。快樂的地方在於可以互相技術上的交流、瞭解老師、同學之外的人的生活、價值觀。我在 PyHUG 聽到許多新技術和工具,像是 Scrapy 拿來做 crawler 看起來頗方便、RabbitMQ 的用途還有某公司究竟是如何使用 RabbitMQ 等等,雖然我短期之內可能用不到,不過我至少知道了新工具、新方法,未來遇到問題的時候用這些工具解決起來應該會比較輕鬆。光是認識這些人,跟他們聊天,其實就很開心,跟他們講我最近在玩什麼,比起同學他們會比較聽得懂。

至於神經科學導論,喜歡這門課的原因很大一部分是因為我真的有興趣,教授的教法也適合我,最後我覺得我整學期學到最多的也是這門課。現在想想,「有興趣」和「教授方法」對「會不會學到東西」有重大的影響。我對線代完全沒興趣,再加上不適應教授的教法,導致線代最後應該是教授幫我加到60分我才過的,老實說我自己覺得我也並未瞭解線代、觸碰其核心想法,根本不具備通過這門課的資格。我對微積分起先沒興趣,幾堂課之後逐漸熟悉教授的教學方法,剛好跟高中三年的數學老師很類似,後來有感受到一點微積分的微妙與有趣,興趣漸漸提高(感謝這位教授)。另一堂法學緒論是原本自己有興趣,結果選到的教授卻只會照講義念,學到的也不過是民法和刑法上的各種名詞、概念,大部分與高中公民重疊。

從學期中開始,我有越來越強烈的想法開始覺得,很多的東西都可以自己靠網路學了。記得神經科學導論的教授剛開學的時候提到,這門課不需要買任何書籍,如果想要複習的話,可以去看投影片和維基百科。我去讀了維基百科的一些條目,如 Neuron , Brain ,我十分訝異於這些條目的詳細、結構分明與容易理解。看完了 Neuron 一整個條目,我就已經瞭解神經元的運作(瞭解程度差不多剛好到通識課程的難易度與詳細度),而且到了寫文章的這時候,雖然許多細節忘掉了,但是我發現整個大圖像 (Big picture) 還是清楚的,我的整個骨架都還記得(學起來了),就差細節可以隨時再從維基百科填補。維基百科真的幫助我在神經科學學到了不少。

另一個親身經歷又讓我加深了這種看法。線代課程我的進度一直是落後的(因為完全靠自己讀課本),剛開始是一章、然後2章、3章,學期中我意識到如果我再只靠這個方法大概永遠也追不上,我想起先前在網路上看到的 Khan Academy , 它是一個類似開放課程的線上教學網站,我去試聽了一堂線代的影片(很前面的章節),發現我居然聽得懂,於是就再聽第二個影片,也聽得懂,然後幾天之後我已經補完一個章節了(雖然說我依舊是懶得寫習題)。不像真的老師,因為他的課程是影片,所以看不懂的地方可以一看再看,要是不小心睡著了也可以重來,也可以快轉(像是他在計算矩陣相乘時我就可以跳過)。影片的長度7~30分鐘,相對於教授的課程上需要注意力集中50分鐘,要維持30分鐘注意力的集中簡單多了。(因為對線代沒興趣所以注意力沒辦法集中很久……)

網路上的資源這麼多,除了維基百科和 Khan Academy ,全世界很多的大學也都有開放式課程,就算不是 MIT 、哈佛的學生,也可以免費享受他們高品質的課程。我不禁開始想,那讀大學究竟是為了什麼?上大學最主要的目的不就是為了要「學習」嗎?如今這麼多的學習都可以透過網路和圖書館自己完成,那教授為什麼還要教這些我根本就可以自己學的東西?教授還應該繼續教線性代數、微積分嗎?是不是應該去教網路上學不到的東西?(這是以我的觀點來說,我也知道不是每個人都有能力、意願自己學習)

以我看起來,我所修的課,有些取代性非常高(可以輕易的被網路上的東西取代),我不希望我來大學學到的是別人在網路上也可以學到的東西——如果是這樣的話我去網路上學就好了,幹嘛還要來大學。我期待我來大學所學的是網路上所學不到的、只有在大學能夠學到的東西,那麼這些東西是什麼?主要是人,我覺得。教授的經驗、同學、PyHUG 這些!學習人,大概就是去瞭解他們的想法和經驗吧。大學應該提供的是更多這種與人接觸的平臺,而不是更多的必修課啊。

想想上面那一段的論述其實也有點瑕疵,總而言之,我所希望學到的內容是知識性的東西少一些,因為知識比較容易從網路和書上取得,而經驗性的東西多一些。大致上是如此。

更新

以下是對於 Facebook 上面一些留言的回應。

有人提到,要在網路上學到一些文組的科系的內容,還是有些困難。以我目前所看到的,確實如此,不止是很多文組的科系,我看起來目前的狀況來講要在網路上學東西能夠學得最完整的還是資工系的主題居多。對於有些理組科系來講可能也有點困難,像是核工系和建築系,這兩個是比較明顯的例子,但是我的推測是除了資工系的東西可以靠網路,要在網路上學到其他科系的內容都還有一段路要走。

Philip Chen 學長提到:

對於"大學"這個議題可以參考 肯.羅賓森 寫的幾本書
我記得裡面有提到現代的大學體制出現於工業革命之後,現代大學的出現是為了"製造"產業所需要的人才。

所以在苦惱為什麼大學是這樣那樣,而不是我所想要的那樣這樣時,或許可以用這個角度來思考:大學之所以教我們某些東西而不教我們另外一些東西,是因為政府、產業、資方等等認為社會/職場上需要這樣的人。現代的大學在根本上是在服務產業的,所以它不會專注在如何讓學生發展成他自己想要的樣子,它只是很單純的從一個"如何製造出需要的人"的角度去思考。

所以這種教育總是以一個宏觀的角度看事情,它關注的是整個體制裡的多數的人,至於那些非主流(?)、較有獨立思想的人而言,這些人本來就不是主要被關注的對象,所以在這個體制理會覺得格格不入、不適應、感到痛苦都是很自然的。也不是說這樣的體制就是萬惡的根源,因為100%客製化的教育本來就是有困難的。

所以如果發現自己是這類非主流的人,似乎只要能清楚了解上述的邏輯,也清楚體制的設計不適用在自己身上,那麼與其試圖抵抗整個體制,不如就坦然地設法找到一條自己走得通的路就是了。剛好身在現在也很幸運能有open course,讓不適應體制的人能夠獲得更良好的客製化教育。

比較矛盾的是
現在產業在嚷嚷找不到需要的人、學生在學校又覺得學的東西用不到,所以學校該不該直接變成職業訓練所?
但是如果這麼做,又會有新的意見說大學失去原有的意義了。
所以還是回到自己吧,知道自己想成為什麼樣子,然後看看學校裡、學校外有什麼資源就都拿來用吧

大學的兩個目的,「學術研究」與「培養產業所需的人才」有時候是還蠻衝突的吧。每個系在所因爲產業環境的不同,對這兩個目的的努力都會有不同的比例吧,以資工系來說,本來就是比較傾向培養人才這邊。另一件值得思考的事情是,大學究竟應該培養人才到什麼地步,像是該不該教網頁設計、App 創作?還是將這些東西交給電腦補習班,而資工系只負責基礎理論,像是計算機概論、計算機網路概論?

最後謝謝學長的建議,確實還是要靠自己。

更新2

好像蠻多人關心我的線代的,也感謝很多人給了我線代有用的實例,另外也有些人說我在逃避。至少我覺得我自己沒有逃避啦,雖然我線代的進度落後,但是 我還是有試圖修補它啊,我很認真的試著讀懂教科書(雖然效果不彰),還去看了線上課程。這學期的所有課程我也都有通過啊,這樣至少沒有逃避的很嚴重吧?有 位學長說的很好:「要學一個自己不知道要用在哪裡的東西,有點難激起學習動機」、「只知道圖學相關會用到,然後實際情形是如何,上課根本沒提到」。我確實 也有找尋過我的學習動機(線代應用的實例),我最後是在接近期末考的時候找到了。我並不是說線性代數一無是處,我的意思是:若是上課時能夠提到線代應用的 實例,那這門課應該更能夠引發學生的學習動機,學起來應該會更快樂。

最後,我希望讀文章的大家能夠不要一直把焦點放在我的線代上面,也請瞭解一下我其他的觀察和想法啊。

Import SVN folder as Git branch

Steps overview

  1. Import each SVN folder as individual temporary Git repos
  2. Create a new Git main repo
  3. In main Git repo, set up branches to track each master branches in temporary Git repos

Import each SVN folder as individual temporary Git repos

First, you may need to map SVN users into Git users.

$ cd ~/projects/
$ svn co svn://svnserver.com/projectX
$ cd projectX/
$ svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > ../projects/authors.txt

Then edit the file as you need, for example mine:
pellaeon = Pellaeon Lin <nfsmwlin@gmail.com>

Import your SVN folders

$ cd ~/projects/
$ git svn clone -A ~/projects/authors --no-metadata svn://svnserver.com/projectX/your/svn/folder1 temp1
$ git svn clone -A ~/projects/authors --no-metadata svn://svnserver.com/projectX/your/svn/folder2 temp2
(and so on)

Create a new Git main repo


$ mkdir -p ~/projects/mainrepo/
$ cd ~/projects/mainrepo/
$ git init .

In main Git repo, set up branches to track each master branches in temporary Git repos

Pull in master

$ git remote add temp1 ~/projects/temp1
$ git pull temp1 master

For each branches, pull in from corresponding temp repos

$ git checkout -b temp2
$ git remote add temp2 ~/projects/temp2
$ git pull temp2 master

Now you have the main repo you wanted, you can delete the temp repo.

References