程式再探索:ALPHA Camp 學期一學習紀錄

啟程

第一次對於程式的探索是在大一的時候。當時的自己還懵懵懂懂,沒有多加思考便選擇了學校的程式設計通識課程。現在想想,這個「沒有多加思考」真的是埋下了失敗的伏筆,因為我完全沒有思考自己的需求,只是因為想學程式的衝動想法就開始修課了。一個學期做出四個內容自訂的小專案、期中期末以及期末大專案的要求對我這個完全新手來說可以說是無所適從。在難以跟上進度以及期中考的挫敗之後,我只好交出了停修單。

這次失敗帶來的挫敗經驗是相當深刻的,在這之後我一直懷疑自己是否有能力寫程式,埋身於文學的世界中。

直到快升上大四,看著未來職涯的選擇問題開始出現,才發現自己好像待在美麗的虛構世界裡太久了。此時我看到了這篇文章:[心得] 文組生轉工程師攻略,這篇文章中的「產業極限」提供了我對職涯的思考方向。

文組出身轉職工程師,他如何向面試官證明實力?

另外,在尋找資訊的途中,我讀了《刻意練習》這本書,而這本書對我的思維有了極大的改變。讓我得到了相當重要的概念:成長性思維。

所謂的傑出表現並不是因為「天賦」才能夠達到,而是透過持續有效的練習造就出來的。我用這樣的想法思索過往的失敗學習經驗,發現自己並不是因為沒有學習天賦才沒有辦法學好程式,而是因為缺乏有效練習,加上因為擔心自己會不會問了笨問題,沒有尋求專業人士的協助,才導致了學習經驗的挫折。

在理解了成長性思維以及對於自己的學習經驗多加思索之後,我認為學習程式對我來說再也不是有沒有能力學習的問題,而是怎麼有效學習的問題。
所以我就開始尋找能夠有效學習程式的方式。

自學

能夠自己學習程式自然是相當重要的能力。在PTT上看到想要轉職工程師的疑問時,人們通常也會建議你尋找免費或是只需要花一點小錢的課程(e.g. Udemy)來學習,而我在找尋學習資源時也有使用像是 freeCodeCamp The Odin Project 這類免費學習資源。不過在使用這些資源時,有時我會覺得自己停滯不前,有時我覺得自己一口氣學了好多東西,但是我卻不太確定該如何使用。

不管是覺得自己學了太多還是毫無進度可言,都可以看出在自我學習時是很容易陷入迷惘的狀態的。不過至少在這一小段自學過程中,我開始覺得寫程式是件很有趣的事。

3分鐘小測驗,找到適合自己的學習入口

實體 Bootcamp

我也曾想過要不要參加Bootcamp這類的課程。花三個月時間培養成為工程師能力的想法看起來雖然很誘人,不過對於仍然在學的我來說,是不可能把平日的時間都投注在培訓班的。另外,實體Bootcamp的花費幾乎都要十幾萬,是筆不小的花費。最重要的是,當我看到成為軟體工程師所要學習的技術有這麼多時,雖然沒有因此而被勸退,然而我也開始明白,學習這些技能並不能夠囫圇吞棗,應該要把學習的時間拉長,好好地把這些技術學好。

選擇 ALPHA Camp

在查找資料的過程中,我看到了ALPHA Camp(意外的是,我後來才發現前面提到的那篇PTT文也有提到ALPHA Camp的文章)。我在ALPHA Camp看到許多關於軟體工程師的文章,對於軟體工程師有了初步的了解。ALPHA Camp分階段學習的方式看起來較有系統,也可以讓我不用付出太多成本,就能夠學到基本的網頁開發知識,而且上課時間彈性,讓我可以排出一定的時間學習。於是我就付出了三千元,開始了在ALPHA Camp的再探索。

當然,我可以選擇拿三千元在Udemy買好幾門的課程(打折的時候),不過ALPHA Camp課程一些相當好的地方讓我覺得花這筆錢也無妨,甚至願意為此付出更多:

了解 ALPHA Camp 與眾不同的學習體驗

學期制 + 班級進度制

我認為ALPHA Camp的學期制還有班級進度制提供了相當好的學習效果。學期制指的是以學期作為學習階段的分界,班級進度制則是以一段固定時間的班級為單位,在有時間進度壓力的情況下一週一週的進行學習,一旦超過時間(以週為單位),雖然可以繼續觀看課程內容,但是作業就不會被批改。

或許有人會認為在受到約束的情況學習好像是一種強迫學習,是對於所學技能沒有熱情的表現,不過我認為這樣的學習方式是一種「配速」,以適當的方式使用這些學習熱情。即使一個人對於所學技能有相當大的熱情,也不可以日日夜夜投入絕大多數的時間瘋狂學習。這樣一路狂飆的學習方式有時可能會造成反效果,讓自己好幾天都不想碰目前正在學習的東西。我自己在使用freeCodeCamp和The Odin Project時,有時就會出現這種不愉快的學習經驗。

如果能夠透過一個對當前學習技能有所了解的人,按照適當的學習分量分配學習進度,像是訓練菜單那樣,這樣就能夠以一個穩定的方式成長。

另一個不錯的制度則是提前預讀。提前預讀則是指在購買課程之後,能夠在開課前預先閱讀課程全部的內容,只不過不能繳交作業。提前預讀讓我可以大致了解會在這個學期學到什麼東西,讓我快速的抓到自己在哪個地方可能會卡住,以在開課之後更精準地分配時間。另外,在我一開始狂熱地看課程時,提前預讀的制度也能讓我不會一頭熱的提前學習,把東西通通學完,而能夠將學習的熱情維持到開課,並持續到課程結束還有接下來的課程。

另外,ALPHA Camp在開課期間也有提前進度的選項,只要把該週進度學完,並繳交作業,即可申請提前進度,解鎖下一週的內容。在進行ALPHA Camp的學習前,我從freeCodeCamp、The Odin Project和YouTube上許多的教學影片學了一些基礎的HTML和CSS。而透過ALPHA Camp作業的驗證,我能夠確定目前學的東西是符合ALPHA Camp目前希望學生所學習到的,因此得以申請提前進度,多花一點時間在我預讀時就遇到困難的地方。

當然,ALPHA Camp並沒有讓我一直暴衝,而是時不時地提供超前進度的學生額外挑戰,讓超前進度的學生除了能夠預先學習之後的內容,還能夠刻意練習之前學習的內容,並以給予其他同學回饋的方式學習。

文科生的ALPHA Camp 程式學習之旅,5 大理由推薦AC

學習社群

社群也是ALPHA Camp的一大特色。除了可以透過學習平台Lighthouse互動,學期一的學生也有Line群組可以互動。雖然我很少透過這些平台互動,然而看到許多同學在這些平台上熱烈討論、抱怨作業困難的時候,我能夠感覺到有許多人與自己走在同一條學習的路上,讓自己感覺不會那麼孤獨。

打造最有效的線上學習體驗-ALPHA Camp 自有學習平台 Lighthouse

時不時出現的工作坊和社群活動也是相當不錯的活動,透過班級進度制,可以針對課程當中的主題進行教學,像是JavaScript的迴圈,以及前端切版。由於負責教學的助教具有工程師的工作經驗,也能透過提供自身工作的經驗讓我們學到更多東西,像是看除錯工具的方法、開發者工具的使用以及如何在google下關鍵字等。工作坊之後提供的額外挑戰也讓自己有額外練習的機會。

社群相談室則是第二週所舉辦的社群活動。透過分組一對一的對談、團體討論以及一些學長姐的經驗分享,可以看到各式各樣抱著不同動機前來學習程式的人。雖然我遇到的大多都是具有工作經驗的社會人士,不過也藉此知道了來到ALPHA Camp的人,有不少其實是為了讓自己更方便與工程師溝通,而不只是為了轉職成為工程師而已。這也不禁讓我開始設想要是我沒有成為工程師,我是否有在當前職涯可以運用能力的地方。

小結

回顧了課程之後,我覺得ALPHA Camp就好像異世界裡的小酒館(看了太多異世界動畫之後的比喻)。冒險者們聚集在小酒館中,接下各式各樣的任務,比較厲害的人可以接更難的任務,幫助比較沒那麼厲害的冒險者,得到額外的報酬,而那些沒那麼厲害的冒險者也能夠接符合當前能力的任務,慢慢讓自己變強。

這間小酒館也提供讓許多人能夠交流,大吐苦水的地方,透過社群讓自己不再孤獨。

學期一每週課程內容

接下來就稍微說一下我在這三週中分別做了什麼。因為每一週我都有申請提前進度的關係,所以這裡的週是以課程的內容作計算。

第一週

第一週的內容以基礎JavaScript教學以及運算思維的教學為主。雖然有著相當挫敗的程式學習經驗,我發現自己先前所學的C#語言還是能夠幫助我理解這一週所學的JavaScript語法。可能是因為我先前用C#寫過類似於猜拳的小程式作業的關係,在處理判斷式與迴圈的部分並沒有遇到太大的困難,很快就完成了這一週的指標作業「擲骰子 10 局積分賽」,透過迴圈以及隨機產生數字的方式產生出兩人比賽擲骰子十局的結果以及獲勝者。

不過,這不代表我沒有任何的收穫。在寫「給菜鳥的臨櫃小抄」作業時,我需要使用虛擬碼與流程圖呈現出「販賣電影票種的判斷式」,因應不同的條件,給予不同電影票種的判定。虛擬碼和流程圖是我先前從沒有使用過的工具,因此我在寫這份作業感覺有些痛苦,不太懂為何一定要寫這份作業。還好在閱讀過一次虛擬碼與流程圖的介紹過後,知道這些東西能夠幫助我思考,以及規劃更加複雜的程式,於是我還是努力的將作業完成(至於在完成作業之後才發現我想的太複雜就又是另一個故事了)。

運算思維也是第一週課程當中的重要概念。雖然第一週的內容用運算思維來思考好像有點殺雞焉用牛刀的疑問,不過運算思維是一種思維,我相信在日後不管是在寫程式還是在工作上,秉持著這種思維能夠對解決問題有非常大的幫助。

認識演算法與運算思維

另外,在第一週的開學工作坊中,有一項「新手任務」,要觀摩同學作業並分享從中學到的作法與思維。雖然因為沒有回答在指定的位置而沒有完成任務,但是透過觀摩同學的作業,也可以從同學程式碼書寫風格的不同,找到值得學習的部分。

第二週

第二週的內容是關於JavaScript的演算法、基礎HTML與CSS的教學以及User Story的概念介紹。

一文讀懂 HTML、CSS 是什麼

雖然說是「演算法」,不過其實只是學習如何讓程式執行的更有效率。透過將原本隨機在1-100亂猜的猜數字題目進一步改善,讓猜數字的「電腦」可以更有效率的猜對數字。

一開始我完全想不到如何改善這支程式,只是設定電腦在猜一個數字後,重新設定電腦隨機猜數字的範圍。但是這樣還是很沒有效率,甚至會讓電腦鑽牛角尖一直猜同一個數字,於是我只好問就讀資工系的強者我弟弟。

弟:「不是讓它從中間猜就好嗎?你玩猜數字不會這樣猜?」
我:「不會啊。」
弟:「你玩猜數字都隨機亂猜?」
我:「對。」
弟:「……」

當然即使得到了這個答案,我還是花了好一段時間才寫出能夠在十回合內猜出1-100之間數字的猜數字遊戲,不過透過第一週學習的虛擬碼與流程圖,我能夠靠自己發現出程式的問題所在並進一步改善,也算是印證了先前所學知識的用處。

在猜數字遊戲之後,課程進入了HTML和CSS的部分。因為在freeCodeCamp和The Odin Project都曾經學過相關的知識,因此對於語法可以說是有一點熟悉,不過有關使用開發者工具的部分還是讓我學到不少。

最後的部分則是User Story。雖然這個部分可能因為很接近實務反而對初學者來說有點…太遠了?不過還是學到了必須優先考慮使用者的需求,而不是自顧自的開發這點。我想這樣的技能以後一定會用到。

第二週的線上活動是社群相談室,這裡就不作贅述了。

另外,超前進度的我在第二週得到了額外的挑戰,要求我找到兩份未被批改的同學作業並給予回饋。透過給予同學回饋,除了能夠讓因為遲交作業沒有被助教批改的同學得到修正的機會,我也能透過檢視同學的作業,尋找自己在寫作業時疏忽的地方,對於雙方來說都有相當多的好處。

第三週

第三週的內容就真的複雜許多,除了學習更多有關介面的內容,還有期末考的部分。雖然只要完成指標作業,就可以得到結業證書,不過因為學習教練鼓勵我們完成額外的作業,加上覺得之前JavaScript的部分還練不夠,想要再多寫一點JavaScript的東西,所以還是認真地把期末考的題目通通做完。

不過在寫期末考之前,我遇到的最大難關便是切版作業了。首先因為自己不太會畫畫的關係,在畫出要切版網頁的線框稿(wireframe)時花費了不少功夫(我甚至拿著我的紙在電腦的螢幕上比劃)。再來,寫網頁的CSS也是一大挑戰。我希望能夠固定住切版網頁左邊的圖片,不要讓圖片因為視窗大小不同而呈現不同的內容,因此在google了不少資料後寫下了CSS,結果網頁的結果卻絲毫沒有改變,圖片的顯示內容還是會隨著視窗大小改變。

還好在嘗試幾次失敗之後抱持著完全模仿切版圖片的想法,在規定了整個網頁寬與高的範圍後,終於讓圖片維持在固定的大小。雖然辛苦,而且總覺得好像花了太多時間在一個其實可以一下就解決的問題上(只要限制網頁的width就好),不過看到與切版圖片幾乎相同的成果,還是讓我很有成就感(雖然我覺得還是比不上JavaScript突然想到解法時的那種eureka moment)。

前端資源懶人包:11 個切版學習資源與工具

期末考基本上就是綜合運用先前學習的JavaScript、HTML和CSS的能力。在前面的切版作業摧殘(x)之後,期末考的切版作業就簡單許多(雖然還是發生了因為選擇器設定錯誤導致的破版情形)。JavaScript的兩道題目我也寫得相當愉快。雖然可能因為對於電腦的思考邏輯還不熟悉的緣故,導致我第二題寫出來的虛擬碼轉換成程式時無法產生預期的結果,不過還是透過程式碼的修正找出我自己邏輯上的盲點,完成了期末考的所有題目。

不過最讓我意外地還是JavaScript的第一題題目。這題題目非常簡單,只需要對輸入的三個數字進行判定,判定這組數字是等邊三角形、等腰三角形、不等邊三角形還是非三角形即可。然而就在我信心滿滿地交出題目後,我卻拿到了一個try harder!,代表我的程式有地方出錯了。我焦急地尋找可能出現錯誤的地方,卻發現我寫了一個詭異的判斷式:a + b <= b。原本這個判斷式是用來篩選兩邊相加小於等於第三邊的數字,將其判定為非三角形,結果這個錯誤的判斷式導致所有兩邊相加小於等於第三邊的數字被判定成為三角形,導致整支程式出現錯誤。在這次失誤之後,我也重新檢討,要求自己在繳交程式碼之前必須要再三確認。

是終點,也是起點

在完成了所有作業之後,我拿到了ALPHA Camp的學期一結業證書。這對我自己來說是項證明,證明自己能夠學好程式,並完成一些小小的目標。透過這次的再探索,我覺得我找到了學習程式的熱情,並透過課程安排,讓這種熱情可以延續下去。課程當中的社群活動與工作坊除了能夠從專業人士的操作學到程式技能,當中對於未來職涯的思考也是相當重要的收穫。希望可以透過接下來的學習,一邊確定自己的志向,另一方面也能夠學到更多讓自己更有所成長的能力。

3分鐘小測驗,找到你適合從哪開始學習程式

(本文轉載自 ALPHA Camp 學員 林蔽(LimB)   Medium