學程式這件事 — 初學、上學、再自學

軟體工程師回顧自己怎麼開始學程式好像是種流行。

Tammy Chu
8 min readJul 31, 2019

我現在就職於紐約的一家軟體公司,自己選擇在台北遠距工作。我是非本科出身的,但在國外上過私立程式學店(bootcamp),這一篇是分享與回顧自己的程式之路,希望可以鼓勵到大家,讓想學程式的人有一點頭緒。

學程式這件事 — 初學、上學、再自學
Photographer: Émile Perron | Source: Unsplash

我大學唸的是醫療工程主攻電機,碩士轉念電機系。從小到大自認喜歡研究和創造,所以選擇了理工科。上大學後這份熱情慢慢地消耗殆盡,我意識到生技業產品的週期動輒好幾年,未來如果投入這個產業不是當業務、顧問,就是泡在實驗室裏。這時我對程式的認知來自 C 語言和學界常用的數學軟體 MATLAB,而寫程式的目的就是做資料分析、視覺化或模擬。MATLAB 用起來還蠻上手的,至於 C 只在一堂電機系的計算方法課碰過,寫過幾個數學的小程式,那時候覺得寫程式也太無聊了吧。

學程式初嚐成果

剛好大三拿了一堂關於計算機組織(Computer Organization And Architecture)的課,期末作品和一個資訊科學系的同學一組,用硬體描述語言 Verilog 寫了一個小遊戲。我寫程式的目的開始改變,我想要做出有趣的東西,遊戲、app、網站這種看得見摸得著的成品。我開始自己摸索,學了一點 HTML、CSS、jQuery 和 Javascript。電腦打一打瀏覽器馬上看到的成果,我覺得頗有成就感,後來就用學校的資源通過 FTP 發布了自己的網站,內容就是美化過的履歷,還考慮到網站的 responsiveness。網站上線後我還蠻得意的,拿手機、iPad、筆電到處秀給別人看,但現在回顧其實整個網站都是 Photoshop 排版完成的圖片,一點技術都沒有。

撞牆期

當我想要繼續寫下去,面對五花八門的資源,卻沒有頭緒。我開始效仿資訊科學系的朋友,學 Java、Python,練習資料結構和演算法,但怎麼好像離我想做的東西越來越遠。tuts+和Udemy 上買了一堆各式各樣的課程,有時候在環境配置時因為版本變更就跟不上了,課程跟上了想要自己實作還是什麼都做不出來。我甚至開始在程式語言上鑽牛角尖,找到了 Learn Python the hard way 這本書,從頭到尾做了一遍還是覺得什麼收穫都沒有。

決定加入 Bootcamp

好加在這樣亂衝亂撞也沒消磨我想成為碼農的熱情 XD

我在念碩士時,身邊一些念設計的朋友早就畢業有些工作經驗,工作之餘開始接案,甚至有些直接在家裡自己接案。我很羨慕他們,心想如果做得出自己的作品,有寫程式這個一技之長,有天我也能達到這樣的工作型態。

這大概是三、四年前的事了,Programming bootcamp 那時候在美國正值炒作週期的頂端,業界大家都還在爭 bootcamp 到底有沒有用,但可以確定的是有不少頂尖 bootcamp 的學生進入了矽谷的 Big Five。因為畢業在即有點焦慮,我報名了幾家比較有聲望的 bootcamp,為了學程式橫跨北美,從西岸搬到東岸。我進了紐約的 Fullstack Academy of Code,前端使用 AngularJS(2016年中,我上到了最後一期 AngularJS,之後都是教 React ),後端使用Node.js和Express,資料庫學 PostgreSQL 和 ORM。除此之外,學校也會加資訊科學的基礎,像資料結構、演算法、Big-O 等等。每個禮拜六更是空出來學一些資訊科學的應用,還會通過 javascript 的 workshop 來演示,例如學 git 的原理時,我們便用 javascript 寫了一個簡單的 git 程式。

我每天早上八點出門,五點回家,回家後繼續盯著電腦,一個禮拜上六天的課。身旁是各式各樣的人,有健身房業務、大公司的顧問、法務秘書、行銷人、金融分析師。我這一班因為是暑期開課,還夾雜著參加 Summer of Code 的學生,他們都是資訊科學系的學生,學校教理論與架構,趁暑假特別來這裡學習實作。每個人都很有熱誠和目標,不少人五點下課後還繼續待在教室自學,當下我覺得自己這輩子再也不會被這麼多聰明人環繞了。

衝刺期

Bootcamp 的好處是課綱有系統地由簡單到難,還可以累積自己的 Portfolio。由老師上課點題,接者鼓勵學生自己解決問題,我自己認為這成長的過程本身就是一個迴圈:

  • 了解概念
  • 實作解題,包括google、嘗試、debug
  • 歸納整理
  • 重新來過

每次學到的東西會一點一點納入自己的工具箱,下一次遇到問題時雖然還是要經歷一樣的過程,但可能有個頭緒、知道怎麼切入這個問題。Bootcamp 提供了老師和助教這層安全網,讓你不至於在這個迴圈裡卡住。當你卡關時,他們會用引導的方式,把你導到可行的路上。每次聽完學生發問,老師跟助教的反應幾乎都是反問:「你可以告訴我,帶入數值,你的函數會怎麼執行?」程式腦就是在這樣一次又一次的自言自語累積下來的,久而久之會變成一種直覺。

好的課程安排不只讓學生學會使用各種套件框架,還會讓學生理解為什麼是這麼做的。我們在學完前端基礎和 ajax 原理的時候曾做過一個小作業,用HTML、CSS、Javascript、jQuery 和 Google Map 的 API 做一個安排行程的 web app(原作品還留在這丟臉)。這不是什麼了不起的 app 卻讓所有人都叫苦連天,還是新手的我們怎麼會知道如何有效地維持 application state,結果所有人寫出來的都是 spaghetti code,還在納悶這麼小的 app 都寫的亂七八糟,大型專案到底是怎麼做成的。

當神人老師向大家展示他運用Javascript 物件的解法,並解釋這樣的組織怎麼有效率,又怎麼樣可以演變成一個框架,我們才恍然大悟。物件大家都有學,怎麼就沒想到這樣的應用。要自己經歷過,才會留下深刻的印象,關於這點我最近一直在關注的教學者Huli在他這篇文章中說到:

為什麼會有那麼多套件出現?就是因為有一大堆前輩經歷過種種磨難以後,決定造福世人也造福自己,才產生了這些方便又好用的套件。

那為什麼前輩都決定要造福世人了,我卻一再提倡大家繼續受苦?

因為這是成長必經的過程。

經過了一個半月的密集學習網頁前後端的知識,後一個半月便是開始做 project,藉此整合所學到的知識。

  • 電商網站
  • 週末黑客松
  • Final Project

第一個 project 是四人一組架構一個電商網站,就讓我們徹底地複習了全端的運作。從資料庫到 API,從前端套 AngularJS 到 Digital Ocean 的部署,全部包辦。經過一個半月的修煉,大家不再是無頭蒼蠅,可以做出一個有前端有後端的網頁。更重要的是,我學會了遇到問題時怎麼找答案。

保可夢的電商網站
因為Pokemon Go正紅所以決定賣Pokemon

放手去做才會開竅

週末黑客松是最讓我印象深刻,發覺自己真的開竅了的一個 project。我發現自己可以:

  • 從無到有架起全端網站
  • 透過教學和官方文件學習,使用新的工具
  • 調適身為初學者的心態

黑客松這個 project 是以兩人一組,用三天的時間做出一個成品。我看了一個 three.js 小遊戲的教學,正躍躍欲試,便和組員決定要用 three.js 還原小時候的經典遊戲 — 小朋友下樓梯。

小朋友下樓梯
經典的小朋友下樓梯

面對空白的視窗,我們也沒有多想,只是想先做出方塊試試看。做出來了,那不如把方塊當作玩家,那要怎麼移動方塊呢?既然方塊做得出,做長方形的平台的也沒問題。

當下沒有意識到,但其實我們不斷的定義問題,然後再嘗試著解決問題,最後就做出了一個遊戲。

這段經歷算是肯定自己自學的能力。學新的事物沒有捷徑,做就對了。

小結

其實還有很多可以寫的,像是Bootcamp值不值得、後來面試的經驗(當頭棒喝的經驗)、工作時犯下的大錯等等,這些還是留到以後再說,這篇流水帳還是在這裡先做個小結。

我曾經覺得自己寫程式這條路走得很曲折,其實我在大一選系時就曾經想選資訊科學,看著我科班出身的朋友走在直直的路上,大二、大三實習,大四開始面試,畢業後不是進 Big Five 就是讓人嚮往的新創公司,而我還在原地繞圈圈。

我沒有選資訊科學系是因為有大人跟我分析軟體業的日新月異,和其他行業不一樣,經驗累積不易。因為這樣就打退堂鼓,也許我那時也還不適合走上這條路。現在來回顧,我很珍惜自己的經驗,深刻的體會到走這條路永遠都會是初學者。既然是永遠的初學者,不如習慣這未知和不安。我說的是習慣而不是克服,因為我深知這很難,冒牌者症候群在科技圈也是很常見的。寫程式也有三年了,對此我還是沒有個解法,但大家都一樣,與其質疑自己,不如繼續走下去。

--

--