初見山
我與程式的緣分是從大學開始的,大一時透過改寫 Arduino 的範例程式碼,操作基礎的元件,當各種模組能照著自己規劃的流程作動時,心裡的成就感油然而生,覺得這東西真酷!
大二升大三時,對於入學時選擇的科系已沒有太多熱情,剛好在那個暑假,看到學校有推動一個 Coding365 的計畫,是給想要學習程式設計的非本科學生一個機會可以認識程式,進而將心中想法實現的計畫。課程內容非常豐富,但同時也有點過於囫圇吞棗,可能今天在上 Java,明天在教 Python,後天上課發現在上 Unity,每天一上完課,我就跑去圖書館借一本相對應語言的書,在課程進行到一半時,書桌上已堆滿各種語言的磚塊書,相當然爾,我一頁都沒翻。後期進行提案時,實在不知道要做什麼,就幫著其他小組的智能辨識系統作標註,草草結束了為期兩個月的程式體驗計畫。對那時的我來說,程式彷彿是一輩子都高攀不起的對象,我以為要將課程所教會的所有技術都學盡,才能進行後續的開發,確實讓我對程式這種可怕的東西望而卻步。
大四時,該修的學分都拿的差不多了,同學問我要不要修修看一門入門的程式設計課,這門課在我即將畢業時,被學校規定為校內必修,雖然依我的入學年份沒有修也可以畢業,但也抱著不修可惜的心就去上了。這門課主要操作的程式語言是 processing ,一套用來開發互動式藝術的開源軟體,這算是第一次比較有系統地認識一種程式語言,跟著課程畫出很多會動來動去的圖,也做出一些好像有點功能的小程式,但當時也不太知道學習這種語言之後要用來做什麼,乖乖上完課後,也沒再打開專屬 processing 的編譯器。
畢業前,有運用 Arduino 幫自己及同學製作畢業作品,但也僅止於在網路上找到相應的程式碼,複製後刪刪改改,會動可以交差就好,大學期間的程式學習到此也告一段落了。
見山是山
接著當完兵,出社會後的工作跟程式設計一點關係都沒有,但我也漸漸發現在工作中,自己極度討厭做重複的工作,就以做社群的發文圖來說,每次都要動很多次滑鼠才可以將畫面重現,我嚮往可以按一鍵就把前置工作都完成,於是動手將常用的圖檔格式轉成 ppt、canva 檔,讓所有人都可以透過一鍵複製的方式,把需要的模板重複利用。又比如要寄送參與證明要先做一張張的 pdf ,再把證明一次次的寄給不同人,這實在是太可怕了,於是我著手研究 google appscript,利用 doc 當作模板,把 sheet 中的個人資料引入後,合併轉換成 pdf,再將其以 gmail 方式寄出。雖然當時也是使用網路上的既有程式碼進行修修改改,但看到複雜、重複性的工作被自己簡化後,我感到滿滿的成就感,「這就是我想要做的工作」這樣的想法在心裡已悄悄發芽。
在重新燃起對程式設計的熱情後,我開始自主學習有關網頁設計的知識,hahow、freeCodeCamp、youtube、udemy,上班以外的時間,我在各種平台間學習,但線上課程過於自由的學制,讓我遇到問題時找不到人問、遇到挫折時也不知道如何化解,甚至有時也不知道自己不知道什麼,日子一天天過去,我感覺自己的成長曲線越來越趨平,一週打開 codepen 的次數也越來越低。
也差不多在那個時候我開始尋找比較有系統的學習方式,從政府職訓到民間補習班,大家的網頁上洋洋灑灑寫了課程中會學到多少的技術、畢業生的出路有多好之類的行銷用語,看久了有點精神疲乏,也出現選擇障礙的問題,因此在訂閱幾個 boot camp 的電子報後,又回頭使用既有的習慣學習。
又過了幾個月,在某個上班上到有點不開心的一天,收到了Alpha Camp(以下簡稱AC) 的電子信,內容是有關程式自學挑戰,研究了一下後,覺得這種階段式的學習好像蠻能測驗自己對程式的熱情有多少,於是在挑戰報名結束前幾天,我報名了,也正式踏入為期半年的系統化學習。
後來我才知道,程式自學挑戰其實就是 AC 的學期 1,學期 1 從最基礎教起:變數、資料型別、運算子、條件運算式等等,但這個階段最讓我受用的是課程中期教授的「運算思維」,認識運算思維後才知道自己之所以喜歡程式的原因,就是它能把事情中重複的部分抽出,透過編寫程式碼的方式,讓流程自動化,這種只花一次力,後期輕鬆做的工作讓人感到滿足,此外,也在這時認識了「虛擬碼」,了解可以先把問題列出來,以口語的方式編寫架構,等到架構差不多後再將其轉化為程式碼,這個過程不但能釐清思考脈絡,也可以避免打開空白編輯器卻不知道下手的窘況。學期 1 的尾聲,教授的是基礎的 HTML 及 CSS,由於我先前已有學過,這邊就沒花到太多力氣。
在順利通過學期 1 後,接著並進入學期 2 的學習,在學期 2-1 中,修習重點在於 JavaScript 的前端開發,並把 js 的基礎概念再做強化,陣列、物件、函式等等,在這個階段進入到真正的應用,也學到了如何透過內建函式對資料進行操作,此外,也初次接觸到 bootstrap,這個讓切版變快速的神奇套件,後期對 DOM 的操作更是有意思,一開始覺得這根本是魔法,原先覺得要修改網頁資訊應該很困難吧,想不到也只是簡單的「選取+修改」兩個步驟而已。在這個階段, 也有強化到自己的心理素質,在一篇「如何用正確心態和方法運用觀摩」中矯正了自己對觀摩的心態,一開始都會覺得程式都是要自己寫的才算會,但其實透過觀摩可以了解更多解題的想法,對於自身解決問題的能力是有增無減,抱著正確的心態才能在學習的路上越走越遠。
學期 2-2 講述的是軟體開發常用的實用工具、架構,例如 ajax、MVC 架構、程式碼模組化等等,ajax 絕對是這個階段的主力魔法,怎麼可能可以透過一行程式碼程式碼就獲得後端的資料!這帶給我很大的震撼。接下來的課程是把拉回來的資料進行排版,也帶到了使用 MVC 架構讓專案的骨架顯現,減少往後擴充的難度,另也學到如何透過模組化程式碼降低耦合性(coupling),讓程式碼的可讀性及維護性提升,在課程的最後也教到了版本控制系統 git,並透過 GitHub 儲存自己的程式碼,為日後的合作專案打下基礎。
在進入學期 2-3 前,需要選擇主修的方向,有鑒於想要了解完整網路應用程式的架構,我選擇了後端,接下來的四週中,淺嚐了使用 Node.js 開發的過程,在比較熟悉 Express 架構後,接著便使用 MongoDB 練習基礎的 CRUD 操作,也差不多在這個時候,課程難度加大很多,前面幾個學期大部分內容在先前大概都有聽過,但後端幾乎每個套件之於我都是全新的挑戰,從 HTTP 傳輸協定開始到運用 body-parser 獲取表單回傳的資料,再到使用 handlebars 刻出可重複利用的模板,最後還將做完的作品部署到 Heroku 上,一步步的跨出舒適圈,也讓自己對於開發者的自我認同一點點的增加。
然後,我離職了。
見山不是山
在學期 2-3 前,我是在上班以外的時間進修,評估了當時職場的未來性及自身對於軟體行業的期待後,決定辭職全心投入接下來學期 3 及 Twitter 專案的學習,事後來看絕對是相當重要且必要做出的決定,因為學期 3 的難度可謂是直線上升,難到我覺得 AC 是刻意為之,避免多數同學在 2-3 就打消繼續學習的念頭,除了難度的增加,課程量、作業量也有顯著提升,原本每天投入 3 小時便可維持學習進度,到學期 3 已經必須每天花上 6 小時以上才勉強跟得上,可想而知,這段日子絕對是相當充實。
最初的使用者認證系統先給了個下馬威,課程利用 Passport 實作本地登入及第三方登入的功能,相比之前可以透過畫面的改變來驗證程式的正確與否,後端的難度就在於要透過終端機不直觀的報錯訊息,一行行找到 bug 在哪裏,才能進行修正。接著也花很多時間了解 js 非同步處理的前世今生,從單執行緒的語言本質開始,到 Callback hell 的閱讀障礙,到 Promise 的封裝練習,再到 Async/Await 清楚的語法結構,在實作中慢慢了解為什麼之前撰寫的程式碼會有不如預期的執行順序。接續走入的是關聯式資料庫 MySQL 的學習,這段時間認識了 SQL 語法、Migration 用法、資料表關聯等等的技術,對於資料庫有更深的了解。下一個目標則是打造具多功能的餐廳論壇,處理完基礎的 CRUD 後,又教授了許多的複合功能,像是收藏、喜歡、追蹤等等,加上先前學到的關聯式資料庫,進行一連串複合式的資料查詢、渲染練習,讓我對功能建構的認識又更上一層。最後是設計 API 伺服器,將部分功能轉成 API 丟出資料的方式,為之後的 Twitter 專案鋪上關鍵的踏腳石。
學期 3 後緊接著的就是 Twitter 專案,在這個專案中我們要組隊,並實際完成一個中型具前後端的專案,由於這段心得太長,已獨立撰寫一篇「Simple Twitter 專案開發心得」,這邊便不再贅述。
從 AC 畢業後的故事不是過去而是繼續,就讓時間沉澱後再來補上心得。
還是見山不見山
回顧學習程式至今的歷程,可謂是跌跌撞撞,路也是繞了又繞,但仍帶給我許多啟發,第一個啟發是我體認到同儕的重要性,有一群相似目標、進度的夥伴一起學習,的確會受到鼓勵、壓力、競爭等等的良性互動,這都能使學習的曲線加速推進,第二個啟發是問問題的重要性,在 2022 年以前,想要獲得程式答案,可以透過 Google、Stack OverFlow 論壇、技術部落格等等的方式,但在我正式踏入程式學習的時候,一切都有很大的改變,AI 技術的興起,讓我得以透過與 ChatGPT 一問一答的方式,快速獲得各種可能的解法,降低等待回覆時的焦慮,但同時也凸顯資訊判斷能力的重要性,如何從茫茫答案海中,找出可用、能用、適用的解法,絕對是下一階段要繼續努力的方向。第三個啟發是自學方式的重要性,我想每個人或多或少都知道自學很重要,但如何自學卻很少為人所知,這是因為自學的過程需要由自己探索,有人可以在網路海中拼湊出自己要的資料,有人要透過系統性的方式先了解該門學科的架構、重點知識,才能去拓展知識,我是接近後者的,因為我發現碎片化的知識無法幫助我建立全局觀,學到一半也會不知道接下來該去哪裡,因此有一套可依循的模型對我而言是重要的。
最後想感謝一路上幫助我成長的人,包含線上課程的講師、協助解惑的助教、適時補充重點觀念的技術部落格、一起努力學習的同學,還有好多好多不知道名字的人值得我感謝,學習程式的初衷既是想擺脫無聊重複的工作,也是想擴展自己的能力幫助更多的人,路還沒到終點,可能永遠也不會到,見山不是山,可能要再很久才能見山還是山。