2013年7月1日 星期一

談程式學習…初學與教學 — 學習篇(一)

緣起…學程式也好幾個年頭,有感程式領域之廣,讓人能夠同時體會老手與新手的感覺。
心中的一些想法,想要訴諸文字,希望分享給在程式路上的舊雨新知。
也期望能夠帶給人一些不一樣的想法,也歡迎批評,指教。

先簡單介紹一下自己…
  • 不是生在程式之家,也不是相關科系畢業,學習程式是前半段,只有電腦書而沒有別人討論。
  • 學習程式的資質並不高,常對人說「光一個 Class 的概念,就花了我一年的時間才了解」。
  • 對於自己經歷過一點命令列時代感到幸運,對於下指令,以及之後學習其它作業系統有很大的幫助。
  • 玩遊戲的功力很差,所以常用修改軟體,誤打誤撞讓我明白了記憶、變數的使用。
  • 程式功力不曾進入「高手」的領域,一直在數種不同的程式語言間打轉,被不同平台、框架玩了許多年。
  • 在某種語言前,會是完全的新手,但是在另一種語言前,經驗足夠讓我指導新人、完成專案。
  • 除非是常在講的專有名詞,否則完全記不起來,徹底表現出「看過即忘」的特質。

我想說些什麼?


由於我不是高手,所以別指望下面的文章會提到什麼專業知識,
但也由於我不是高手,所以對於初學程式的迷惘,曾經走過的錯誤道路都還沒有忘記。
能夠用比較貼進新手的語言來描述問題,這是許多程試高手難以作到的。
不管身處程式領域裡的哪一種水平,都希望這文章能夠給每個人一些平常少聽到的想法。

純粹討論程式學習,儘量不提專屬某種程式語言的知識,想由教與學兩方面切入。
這篇專講「學習」的部分,有機會再分享自己「教學」上的一些心得。
不喜歡用太多專有名詞,所以請別在意我用了哪個詞,而注意想傳達的想法。

分析一下名詞…


程式的「全名」應該是程式語言(Programming language)。
也就是說程式在許多方面具有「語言」的特質,有字彙、文法,甚至有「習慣用法」。
同樣的,建造一個好的應用軟體,就如同寫一篇引人入勝的文章,除了對文字理解,也需要練習得來的經驗。
我們不會相信有個補習班說能夠在半年,就讓不懂外文的人變得能夠寫出暢銷散文。
同樣的,對於同樣時間內,說「有能力訓練出程式高手」這樣的文宣也應該有所保留。
會寫中文,能夠打信溝通,但一旦想要寫篇好文章,仍要大量的練習、反思。
這也說明了有人說︰一個好的程式設計師,需要五年甚至十年的時間才能養成。


新手的無力感,夢想很高,但是手上的技術少得找不到到達的那條路…


工作需要的緣故,需要學習不同程式語言,經常「復習」作為新手的感覺,
那種心中許多理想,好像有無盡的想法,但是腦袋裡知識空空,又似乎什麼都作不了的無力感。
那種理想現實「高反差」的失望,和身邊高手比較後的「渺小」,恨不得知識一股腦背下來,第二天就變成高手。
這種想法,造就了許多補習班開設了一個又一個的課程。
必須強調沒有指補習班的課程不好,或是單純在騙錢的意思,自己也去過補習班,老師不錯,也學到不少東西。
重點就在最後一句,學到東西了嗎?去補習班是為了要學東西,而不是只求結業,不是只求那張拿得很虛的證照。
滿滿筆記,不能保證腦袋也有一樣的東西。作為一個新手,應該去學習自己能夠吸收的知識,才能累積變多。

學習程式與學習數學的相似處,背誦能成就速成假像,加強理解才是真理。


大多數的人不會把數學歸類為「語言」的一種,雖然它可以用來描述現象。
但是「數學學得好,通常程式的理解速度也比較快」,因而把數學和程式作強的關連。
我並不完全同意這種看法,我認為應該來自於早期程式書籍撰寫方式,和數學教科書類似。
在數學上,告訴你這個公式是怎麼被推導出來,並帶上一些的例題讓人去觀模、計算。
而程式上,告訴你這個語法、指令的作用及結果,也給一到數個程式範例或題目,讓學習者自己去作。
學習的人需要自己去體會公式或是語法的目的,能夠判斷其使用的時機。否則很容易落入背題型、背解法的誤區。
離開學習許久的人們,還能記得幾個求學時候背下來,已經有十年以上沒使用過的公式?
程式依靠背誦記憶,的確能夠有短期速成的感覺,甚至拿到不少張證照。
但是回到現實,當要解決各式各樣的問題,是沒有固定的題型與公式可以完成的,需要靠理解,才能突破瓶頸。

學習到的是知識,但不見得是真理︰保持開放的心


學習程式是為了解決問題,所以我認為學習、撰寫程式的重點也應該放在這之上。
在參與或觀看別人討論程式問題的時候,偶而會看到一些「流派不同的爭論」。
我覺得這種討論有助於讓某些概念變得更為清楚,但是過於認真就不好,
以「別人是錯的」的方式去批判,其實只是增加對立,沒有實質幫助。
靜下心來想想,有時候只是對於名詞定義,解釋角度的不同罷了,沒有要拼到你死我活這般嚴重。
保持開放的心,學習知識,也想想別人為什麼這麼形容,理性的去分析,可以得到單單幾本書更多的東西。

其它的…就留到下一篇繼續說吧!

沒有留言:

張貼留言