自學程式,你應該知道的四件事情(三)如何突破程式學習的「絕望沙漠」
在這「全民學寫程式」的年代,寫程式的門檻逐漸降低,無論你是打算成為軟體工程師、還是希望透過「自學寫程式」來提升自己的職場競爭力,我都想跟各位分享四件事情;這四件事情是我過去寫程式二十多年以及教學十年經驗來所累積的心得,目的很簡單:
「協助你縮短程式語言的學習時間,並達到更好的成效」
而這篇文章,討論的議題是「如何突破絕望沙漠」,我們現在開始吧!
如果你已經開始會做一些有趣的東西,例如網路爬蟲、簡單的 app 或是能連接資料庫的動態網站,並開始想要學習更深入的技術、甚至是想要轉職成軟體工程師,那麼你就會面臨到下面的議題:
(也可以參考小弟之前的拙作: 轉職軟體工程師,你必須經歷的三個階段)
在初學程式的時候,一開始可能會先感覺到非常非常的困難,然後有那麼一瞬間,你會突然發現:「Wow!原來寫程式就是這種感覺啊,好像沒有什麼是難得倒我的」。但,好景不長,當你想做的功能越來越複雜,你的野心越來越大的時候,你就會面臨圖片中的「desert of despair」,在後續的文章裡面,我們稱之為「絕望沙漠」。
出處:為什麼學習寫程式這麼難?
在這段期間,你會發現「你怎麼樣努力都不會進步」,好像你多學了很多知識,但這些新學的知識,卻又好像沒有辦法幫助自己到達下一個階段。於是開始懷疑自己:
- 「我不是本科生,是不是學不會寫程式?」
- 「我是不是該開始從底層語言開始學?是不是該去學 C 或 C++?」
- 「我是不是沒有天份?程式應該很吃天份吧?這就是我的極限了吧?」
其實,會有這些無力感(就是上圖中的「絕望沙漠」階段),是「現代軟體開發」所產生出來的結構問題,原因來自於兩點:
- 為了方便而過度簡化。
- 為了簡化而產生高度相依。
為了方便而過度簡化
舉例來說,如果你是有完成上一篇文章「部落格系統」的朋友,你就會發現「哇,原來創造資料庫這麼簡單?原來創造出一個能夠存資料、修改資料、刪除資料的網站這麼迅速?」。
如果你完全不做客製化、每次的流程都一樣,或許,寫程式就是這麼簡單。但我們所有人都知道不客製化是不可能的,你會想要有特別的流程、想要有更彈性的介面,這個時候,過去幫助你的「套件」一瞬間反而變成毒藥,讓你「不知道背後發生什麼事情」,再加上基礎不足的前提下,想要動手修改套件來符合你的流程更是難上加難。
為了簡化而產生高度相依
舉例來說,在以前的網站開發,每一個新的技能,可能都像是一間一間的小木屋,每蓋出一個小木屋,每一個小木屋都是能夠使用的。我要表達的意思是,每當學會一個新的技能,都會很有感受,都會有變強、變厲害的感覺。但現代的網站開發,為了讓工程師能夠有效率的完成工作,使用了許多框架、套件或工具來幫助工程師完成工作。
就像是蓋現代的大樓一下,無論你要蓋十層樓、還是一層樓的房子,大家都知道必須得打好地基,然後用新的工法來完成你的房子;在學習過程當中,你要花更多的時間去學習許多「一開始你並不清楚為什麼要學習」的技能,這些技能「雖然你感受不到,但其實一直幫助著你」。
如果發現自己正在「絕望沙漠」的階段,也清楚了造成這兩階段的原因,那又該如麼突破呢?
我的經驗是:「找一個已經在這行工作的前輩當 mentor 吧!活生生的前輩,比 95% 的教材來得有效!」
為什麼?因為一般的教材不一定能夠呼應你現在的「脈絡」。所謂「脈絡」的意思,就是「你目前最缺乏的是什麼?你的弱點是什麼?你真正卡關的問題在哪裡?」
由於現代的程式學習,每一個技能的相依度很高,以上面提到的蓋房子為例,假設蓋房子總共需要三個技能,「打地基、測量、建模型」,你可能已經很熟悉打地基以及測量,但你的建模型能力很弱,而你的教材,並不會知道你哪個地方特別弱,甚至連你自己也不知道。
而前輩的作用,就是看著你做事情的脈絡,給予你最有效果的建議,縮短你的學習期間。
但前輩是唯一的解法嗎?倒也不見得。
有前輩指引或許是最快的路徑,但在我過去的程式生涯,也發現許多朋友,透過與社群或同儕的切磋、靠著自己的熱情,也進步得非常快(否則,哪裡來的「第一個前輩產生」?)。
這兩個突破點都需要「人」,我不能自己一個人自學嗎?
當然可以的,請參考我的下一篇文章「設定容易評量且具體的學習目標」
附註:如果你學的是 Ruby、如果你剛好方便來台北,我們每週二在台北車站附近有一個只收 50 元場地費的社群活動(Ruby 默默會),歡迎你抱著你的問題來找我們,這邊有許多「活生生的前輩」 : P
--待續--
工商服務
實體課程:ASTRO Camp 全端工程師實戰培訓營
線上課程:五倍學院線上課程