我是Sean,過去曾經是半導體工程師,沒有資工背景,也不懂程式語言。2019年從零學習寫程式,跨領域轉職為資料科學家。目前在新創電商服務,協助訓練影像辨識模型及推薦系統開發。從事軟體開發工作約兩年多。
在這篇文章中我想回顧這兩年學習的過程,並且問自己一個問題:假如能重來一遍,我會如何學習寫程式?要是回到兩年前,我會怎麼調整我的學習策略呢?
以下會聚焦在學習策略,而不是學習心態。心得有以下兩點。
不要學太多
開始工作後,我習慣在下班時間泡在Udemy或 Coursera的線上課程來補充需要的知識。線上課程的主要目的:可讓我在短時間有組織架構的學習一套新的技術知識,更可以在往後隨自己需求作延伸學習。
另一方面,通常在線上課程學習的過程,會是一種正向的體驗。你跟著課程演進,練習課程中的程式碼,看著程式碼跑起來,你會得到成就感,並且最後會得到一張數位結業證書,看起來真不錯!不知不覺你會迷上這種正向體驗,你會感覺到你付出的時間得到立即的反饋。兩年中,我上了不少線上課程。覺得晚上的線上課程,比起白天的程式開發還要輕鬆愉快,沒有時間壓力,不需要debug,也更容易有成就感。
但太認真的學習,是一種陷阱,特別是過度專注細節。有些程式初學者,為了想把知識完整學習。會花時間研究困難的知識點,例如想精通Recursion的各種使用方式,但實務上程式開發很少用到Recursion 。過度專注細節,是個性認真的初學者特別容易踩中的陷阱。
學習技術的目的除了吸收知識外,更重要的是要將學到的東西輸出,也就是在未來的專案中實現出來。換句話說,學習的方向與深度是根據你手上任務的需要,學太多或學得完整沒有太大的助益。我自己也有上過不少線上課程的內容,因為後來工作上沒有用到這些技術,很快就淡忘了。
所以,對初學者而言,先學有必要的知識技術就好。只要盡力理解基本觀念,並且動手將這些概念實踐出來,不用太專注在細節。
現在一樣習慣在下班時間或通勤路上學習,但已經不會堅持將一門線上課程完整練習過,而是只專注在我需要的部分。
以專案為主
進行side project,是能讓程式初學者快速成長的好方法。從一開始的專案題目發想,接著搜集資料,學習需要用到的技術,嘗試解決過程中會遇到的所有問題。雖然單純上線上課程也可以學到不少東西,但自己完成一個小專案能帶來的價值是更高的。
通常一開始會從其他人的專案開始模仿。當然重製他人專案也是好方法,當你被bug卡住時,可以有個參考範例幫你度過難關。許多市面上的線上課程,也是帶你從頭到尾製作一個完整專案。只是要確保自己並不是只把程式碼複製貼上喔。
舉幾個小專案範例:
你喜歡美食,可以嘗試做一個介紹美食的靜態網頁,從一個只有純文字的HTML開始,接著學如何放入圖片、連結,順便開始學習使用CSS調整排版,下一階段還能嘗試加入bootstrap的擴充元件來美化網頁。
若你對投資理財有興趣,可以把搜集來的股票價格放在陣列中,嘗試計算價格移動平均或波動性。接著來做一些邏輯計算,也許你認為超過某個價格就該買進,低於某個價格就該賣出,把這些判斷寫進程式碼。你或許會想說,能不能自動抓取股價呢?那麼你就會去研究爬蟲技術,甚至嘗試用資料庫來存取你的股價資訊。
我認為所有初學者都應該以專案為主,越簡單的專案越好。找一個你有興趣或著你認為有用的主題做開發。一開始不用做到60分,30分就好。先求有再求好,完成了一個簡要雛形後,再持續迭代,慢慢增加新功能。
我做的第一個專案是幫朋友寫的抽籤程式。當時使用python,引入random包,將要拿來抽籤的字串放在陣列中,使用random包裡面的choices()函式,瞧,一個簡單的專案就完成了。
過去並沒有刻意在下班後做side project的習慣,以專案為主的心態也是最近才建立起來,目前也正調整節奏,每週分配更多時間做小專案的開發。最近因為工作關係,使用AWS的Chalice框架寫了隻遵循MVC架構的Restful API,以此為契機,在工作之餘順便學習了Flask框架,正嘗試使用Flask來架一個簡易小網站來展示機器學習模型。另外我還有出於個人興趣的線上課程學習,也希望能在課程結束後做一個簡單的side project 來實現課程中學到的技術。重點是,30分就好!
小結
對初學者來說,實踐比理論重要。
先掌握最基礎的資料結構與學會寫邏輯程式控制資料後,使用一點好奇心來發想專案題目,從一個小題目開始,接著再慢慢增加該專案的其他功能。且注意力放在專案開發必要的技術上,不要學太多。我想,這會是讓一個初學者快速成長的有效策略。
文章出處是Sean Wang 的Medium Blog,內有其他軟體工作的相關技術與心得文,歡迎點閱