有系統的訓練、學習的挫折感
趁著一股氣,一點點怒氣(?)+受刺激覺得自己差人很多的氣+...,把一些想法記錄下來
今天演算法設計與實作課,一位復旦大學計算機學院的教授來分享一些訓練學生的方法和經驗,我印象最深刻的其中一段是「有系統的訓練」,提到他們會提供給學生除了題目外,還有詳細的測試資料、詳細的解題思路和程式碼,在有這三者的提供下訓練,另外是先從資料結構訓練起,才進入到演算法(詳細的主題順序我就不清楚了)
今天演算法設計與實作課,一位復旦大學計算機學院的教授來分享一些訓練學生的方法和經驗,我印象最深刻的其中一段是「有系統的訓練」,提到他們會提供給學生除了題目外,還有詳細的測試資料、詳細的解題思路和程式碼,在有這三者的提供下訓練,另外是先從資料結構訓練起,才進入到演算法(詳細的主題順序我就不清楚了)
會對「有系統的訓練、學習」這點印象深刻的原因,就是自從去年暑假轉換方向以來,我有時會覺得自己在學習computer science, programming的過程上,好像缺乏了什麼,有的東西事後看,訝異學習效率怎麼會差成這樣,例如之前學C、修資料結構,我現在覺得很奇怪為什麼指標、陣列之間的關係我會那麼久才搞清楚?明明不難,還有資料結構教科書前幾章,一堆沒用的資訊(無誤),當時為什麼耗那些時間在上面?還有stack, queue, linked list這些明明一個小時就可以搞清楚的東西,我當時到底是在想什麼?書是一個問題、沒有好的指導者是一個問題、沒有人可以討論是一個問題、自身學習能力不夠是一個問題...,綜合起來的後果之一就是缺乏系統性的學習,當時我是完全的新手,只約略覺得可能要從一個程式語言開始入門,但學程式語言要做什麼、對計算機要了解到什麼程度、在學習的過程中遇到問題可以怎麼辦(這點個人覺得很重要,因為問題帶來的挫折感是削弱學習動力的強大殺手)...等等
如果我能給過去的我建議,我會說,不要看C++之父寫的Programming: Principles and Practice using C++,這根本完全不適合新手,閱讀前幾章也許還好,但到某一個地方的時候會突然變得非常滯澀,跟學習程式語言不直接相關的東西(parsing)造成很大的學習障礙,我後來跑去Codecademy學javascript,親和很多,但有些枯燥乏味,我當時沒把它上完,前幾天我把它上完後發現,修完這課也許是能學到一點基礎物件導向的概念,但完全不知道JS在現實中是用在哪裡、能做什麼,也幾乎沒用JS寫到什麼大一點的程式,上完這課,頂多可以說自己懂JS的基礎語法,但不能說自己用JS寫過程式、做了什麼事情
如果我能給過去的我建議,我會說,不要看C++之父寫的Programming: Principles and Practice using C++,這根本完全不適合新手,閱讀前幾章也許還好,但到某一個地方的時候會突然變得非常滯澀,跟學習程式語言不直接相關的東西(parsing)造成很大的學習障礙,我後來跑去Codecademy學javascript,親和很多,但有些枯燥乏味,我當時沒把它上完,前幾天我把它上完後發現,修完這課也許是能學到一點基礎物件導向的概念,但完全不知道JS在現實中是用在哪裡、能做什麼,也幾乎沒用JS寫到什麼大一點的程式,上完這課,頂多可以說自己懂JS的基礎語法,但不能說自己用JS寫過程式、做了什麼事情
學習程式語言應該從做中學,實際練習、做些東西,而不是去硬背規則和語法、只讀過去這樣,我去年犯了這樣的錯誤,把學程式語言當成數學在學,讀了好一大段,有時沒特地練習,以為這樣就學到東西了,其實沒用到的東西就會忘記,變成有讀跟沒讀一樣
還有就是先挑個順手的IDE或單純文字編輯器(例如notepad++)用,並沒什麼關係,我當時知道vim、Emacs和comman line,但是新手要同時學語言又要學文字編輯器指令又要學command line指令,只是在給自己找麻煩而已,搞不好挫折感就會使得自己很難學習下去,除非身邊有高手或可以問的人,不然先單純的學語言、用個IDE編譯執行就好了,vim和command line真要學的話,晚一點學「通常」不至於造成什麼太大問題
我會說「通常」不會有什麼問題,是因為我看到好幾個python教學文章,都從command line開始講起,讓我猜想是不是學某些語言,從command line開始學起會比較好?我去年暑假查到Learn python the hard way這本免費書籍,前言一講完第一堂課就要你用command line操作,說你如果不熟悉自己電腦作業系統的command line操作的話,它有另一本速成書籍專門教各個作業系統的command line常用指令,算是很佛心了,可是這樣應該還是會讓很多人卻步吧,學個程式語言之前還要先花幾個小時學command line指令,練習腦殘又枯燥乏味,一時之間看不出用處在哪,只能咬牙硬撐過去,我前幾天把它的command line指令教學看完了,剛上它的初步幾門課,就等著看看這些command line用處在哪囉
我會說「通常」不會有什麼問題,是因為我看到好幾個python教學文章,都從command line開始講起,讓我猜想是不是學某些語言,從command line開始學起會比較好?我去年暑假查到Learn python the hard way這本免費書籍,前言一講完第一堂課就要你用command line操作,說你如果不熟悉自己電腦作業系統的command line操作的話,它有另一本速成書籍專門教各個作業系統的command line常用指令,算是很佛心了,可是這樣應該還是會讓很多人卻步吧,學個程式語言之前還要先花幾個小時學command line指令,練習腦殘又枯燥乏味,一時之間看不出用處在哪,只能咬牙硬撐過去,我前幾天把它的command line指令教學看完了,剛上它的初步幾門課,就等著看看這些command line用處在哪囉
C和C++算是跟計算機滿有直接關係的程式語言,例如不同型態各占多少bytes、指標、stack and heap架構...,因此C和C++的初學者,先了解一點基礎的計算機知識是必要的,這不會難,只是可能很瑣碎,在這幾個月的學習過程上,我事後發現常常有時只是一個小東西不知道或搞不懂、課本沒講或老師沒講,造成後續的理解出問題,但困惑和挫折感就跟著很久,直到有一天把那個小東西弄懂了,才恍然大悟,例如我在看C語言的原文書時常常看到implement這個字,直接查中文翻譯是實現、實施、落實的意思,我心裡覺得奇怪到底是在實現、實施、落實什麼玩意兒?直到某陣子我才恍然大悟原來implement就是把想法用程式語言實際寫出來的意思...,不過怎麼搞懂的我已經忘了
這跟我之前學習數學的經驗截然不同,好的數學教科書,會把主題前後分明、適當的放置,只要具備學習該科目的前置知識,一路記憶和理解下去,前面都掌握無誤的話,只要繼續搞清楚當前的東西就可以了,挫折感和困惑沒這麼「如影隨形、常駐心頭」@@ll,我覺得,如果生活圈裡面有前輩、學長、任何會的人,可以問這些瑣碎知識的話,那挫折感和困惑應該可以少很多,也比較知道什麼該花心力、什麼可以略過就好,這也是為什麼我會有「這八九個月以來學的東西,明明也許四個月就學的起來,為什麼會花這麼多時間」的想法的原因之一
另外,一直以來有個衝突點是,修課、考核的東西和模式,未必有助於紮實的學習和實際派上用場,有時候因為這東西會考,如果你在意成績的話,就得去把它(至少暫時)記起來,就得花時間在上面,舉例來說上學期的C期末考,考如何寫一個可以接受變數個參數的函數,這種東西如果不是要深入用C做些事情、寫作業系統、嵌入式系統、資料庫...什麼的,我想很多人一輩子也不會需要用C寫一個接受變數個參數的函數吧
關於學習的挫折感
我以前很少起放棄的念頭,但這學期相對之下頻率高了許多,有兩三次作業想破頭想不出來、做不出來,就放著擺爛了,有幾次瀕臨崩潰的邊緣,但剛好突破了或是找到突破口,就從邊緣救回來了,其中一次,想說既然想不出來,然後TA hour我還沒去問過,那不如去問看看吧,結果助教教我,把我教到真正掌握那一類問題的基本解法,回來寫就順多了
把壓力源的問題有效解決了,才能真正消除挫折感,人一直處在充滿挫折感、沒信心的狀態,總有一天會崩潰,造成自己走不下去
綜合上述兩個大標題,我對演算法設計與實作這門課還有一件事想講的是,我覺得有幾次作業可能安排有點不當,不過也可能是我自己實力問題?每次作業都有黑色題號的題目和紅色題號的題目,規定第二次修課的人要挑紅色題號的題目寫,通常黑色題號的題目都比較簡單,跟紅色題號的題目有明顯的難度區分,甚至直接套用課堂上學的演算法就能解開,我覺得這樣合理,題目有難易之分,讓像我這種弱的人也能學到東西,畢竟簡單的先會了才有可能寫難的,但有幾次的作業,題目中找不到幾題是可以直接套用的,許多都是要變化的題目,對像我這種弱咖來說絞盡腦汁也想不出來要怎麼做,這時候挫折感超大的,作業寫不出來,上網查資料看不懂,感覺沒學到什麼東西,好像只能等死似的感覺,不過我之前在另一篇文章講過我的想法,雖然在某方面無法跟人競爭,但不至於沒路可走
留言
張貼留言