關聯「舊有經驗」以輔助學習的開發自「決」(學):ALPHA Camp全端網路開發第三學期課程心得(第四部分,後端:核心)
(註1,第三學期的課程在2019下半年,即筆者修習此課程後有所調整,除名稱外至少作業和教材內容有所調整,如2020年版前端課程改為第二學期的後半部分;
另外為方便稱呼,其實是想偷懶(X),底下以”JS”作為”JavaScript”的簡稱)
(註2:Codenvy已於臺灣時間2019/12/9關閉服務,Eclipse Che服務為其替代方案,皆使用Linux作業系統,但介面與VSCode更接近而友好,且能在同一畫面預覽網頁;
然而,不支援開放sudo(super user,相當於windows的系統管理員)權限,無法自行安裝新軟體,儘管可以選擇建立包含MongoDB的主機,但提供的版本寫入及查詢資料庫需要特別設定,操作方法與ALPHA Camp的教案不同,故目前不特別推薦Eclipse Che,僅適合未使用資料庫的後端專案練習,未來有空再另外介紹操作方式)
前言:如何讓後端開發與個人經驗建立「關聯」
從半年後的角度回顧當初學習後端的情況,以及配合課程最後設計的「自學經驗」回顧,我有一個大膽的想法不打算收起來──把自學案例的範圍「畫大餅」涵蓋到整學期,用一個抽象到有點學術,但其實貼近生活經驗的概念定義這階段要自行解決的問題──如何將過去經驗,與現在學習做更好的連結,使得未來成效能受期待。
上一段在討論程式開發的文章出現看似「跳痛」,但是刻意為之的。 這「腦洞大開」的發想,其實來自於教育心理學中幫助學習的認知教學策略之一:連結舊有經驗、由已知到未知。 學習新事物時,若能活化先前知識,應用前導組織(引導至教材架構)、類比(用比喻幫助了解)、精緻化(對內容多加思考)等概念,等於讓學習者認知到自己不是完全從零從頭開始,而是從一定的學識基礎上擴展,以在新知能與舊經驗間建立、產生關聯,更能減少負擔,才有更多心力繼續學習。
過去經驗與後端開發,某種程度的相似性?
在正式開始學網路開發前,我其實對電腦軟硬體的設定與應用已有一定興趣,例如對零組件DIY、系統調整優化,甚至是遊戲模組(MODS)有一定經驗,自認是進階級使用者;另一方面,以前念地理系時接觸過地理資訊系統(GIS),製圖時常常需要搜尋開放資料或自己手打建立,也會需要同時資料表連接(Table Join)擴大使用範圍。 跳到學過後端開發的現在,好像有點既視感?
這二段個人的過去經驗看似與程式開發無直接關係,但前者與伺服器建立、設定、套件安裝以及使用,廣義都是軟硬體設定與應用,而後者其實就是API串接與關聯式資料庫的概念。 與前二學期重點放在前端版面與邏輯控制幾乎全新的領域相比,第三學期對我來說有種莫名的親切感,從而更有想持續接觸的念頭,這也是我在學習網站前後端一段時間,到一定程度要決定方向時,想走後端的一大因素:熟悉的感覺最對味。
(其實想選後端還有二個較表面的原因:個人覺得與純寫後端相比,前端版面「精雕細琢」的時間與成效不一定成正比,有時花時間刻板加分有限;另一個原因則是ALPHA Camp當時的整體課程安排較偏向後端的全端開發,連帶目前個人技能樹點在後端比較多,剛好這些也是用到以前學過的推拉理論、比較利益得出的結果)
我在後端學習的大方向除了受過去經驗的啟發,其實過程中的許多細節也是如此,尤其初期正是突然想到之前學過的某項工具,才得以順利繼續課程:自行摸索線上開發平台Codenvy(舊版已關閉)的使用方法,在不能用個人電腦的時候也能練習後端開發。
初階目標:線上開發平台作為替代方案
這段期間的心得之前已經有整理成篇,這邊主要是補述前後的情況。 先將時間移回去年下半年,我由於有家人長期住院,需更多時間協助家務與看護,原先預計在8-10月間可完成的後端課程只能跟到一半,只好改到11-12月間重修。
重修前由於已經對課程前中段的內容大致有印象,印象難度比起上學期前端的部份得花更多時間理解與練習,卻不像前端有如Codepen方便隨時隨地使用的線上工具,便於充分運用零碎時間練習(如上班休息時間、在圖書館等不便或不想攜帶筆電的情況);另一方面,當時也是有一個大膽的想法:既然前期進度等於有「偷跑」過,應該相對有更多時間可用,應該要多嘗試些特別的技術或工具。
之前約略用過的Codenvy,成為後來解決問題的主力
這二點的結合,使得我迫於在課程開始前尋找後端開發可用的線上工具 (也就是線上/雲端開發環境,Online/Cloud-based IDE)。由於網路上的相關討論很少,起初查了一整天資料還沒有結過,這時突然瞄到之前在學期一介紹網路應用程式時收藏在書籤列的Codenvy圖示,想起之前建立簡單Ruby on Rails專案時,程式語言的部分有很多選項,其中應該會有Node.js。
一一摸清楚各項功能的位置後,經過教案程式碼與因應IDE介面的調整與測試,以及回頭研究範例的寫法、少量網路文章與說明文件,我終於成功找到在上面運作express伺服器,終端機指令輸入、套件安裝與網頁預覽功能也能實現!興奮的我趕緊將實驗結果整理成文分享到課程的討論區,獲得好幾人的upvote(類似FB的按讚),其中甚至有校長Bernard!
由於收到正面回饋,使我決定持續研究並持續分享,最終成了課程討論區一系列的「使用線上虛擬主機Codenvy進行後端練習」分享文,這也是我自學寫程式以來第一次嘗試發表技術文,就因想起之前學過的工具而有亮眼的起頭,有如為日後學習進展吞下一粒定心丸。
中階目標:在Codenvy上使用MongoDB
一波三折的安裝過程
待到學期中進入非關聯式資料庫(NoSQL,這邊用的是MongoDB)的章節,以全程使用Codenvy為目標的我遇到一大挑戰:教材提供的MongoDB安裝教學只適用在Windows和Mac,Codenvy上得想辦法自行安裝。 由於前面對Linux的認識,我仔細研究官方的Debian安裝說明,並發現不同發行版的安裝程序可謂「大同小異」,甚至步驟可直接跨版本照做。
順利在Codenvy安裝MongoDB後,卻發現一直無法成功啟動……。由於Codenvy既使在英文圈的討論也不算多(且對難看懂),連搜尋問題的方向也不確定,讓我卡了一段時間,直到突然仔細去看訊息,發現好像是路徑有問題。 後來突然想到,Mac與Linux的系統核心都源於UNIX,也許去讀Mac版的教材會有幫助,相似的目錄與執行命令還真的印證我的推測:問題出在Codenvy安裝後缺少資料庫執行需要的目錄!
又得到了一大線索,這回深入搜尋的結果相當幸運,找到這部影片直接教如何在Codenvy上安裝與使用MongoDB,缺漏的部分正是要將"/data/db"的資料夾結構另外建立,以及賦予使用者存取權限:
// 建立缺少的目錄
sudo mkdir -p /data/db
// 賦予檔案目錄的存取權限給使用者
sudo chown user /data
sudo chown user /data/db
路徑的問題解決了,只剩執行的部分,由於MongoDB指令不同作業系統通用,恰巧課程Mac版的教材可以直接補完,幾乎照著打就能完成最後設定。經過多次的搜尋與嘗試後,總算是在Codenvy上安裝MongoDB了,又一人生成就解鎖!
感覺前面已是搞定一大挑戰,挑戰卻才剛開始。 Codenvy其實用途偏向短期測試,並不適合額外安裝軟體使用,MongeDB能安裝只是因為沒有鎖root權限,才能讓使用者「肆意妄為」;但每次使用前後的環境其實都會重新建立與刪除,安裝的軟體往往會被刪掉(如npm套件每次要重裝),MongeDB也是如此,每次重開不只無法自動啟用,輕則路徑要重新設定,重則被刪要重新安裝。 還好我早就將安裝步驟寫起來,每次既使要重裝也不會太費時。
實際運用的開發挑戰:加強資料驗證
除了自討苦吃的雲端開發環境建置,如何用MongoDB開發專案才應該是學習後端的重點。 至於這階段的學習心得,我也已經整理成另外一篇文章,前面還包含我對非關聯式資料庫與關聯式資料庫的簡單比較,可點連結參考,這邊主要補述的是每周結束後助教對作業的回饋與額外要求:加強資料輸入規格的驗證。
其實助教對作業的回饋與額外要求早就不是新鮮事,像我早在前二學期的心得就有提過,但剛好這一階段助教特別強調資料驗證的重要性,如不要單依靠前端表單與後端mongoose的型態限制,而要運用正規表達式與mongoose內建或套件的" validation"進一步規範,像是日期不能是未來,類別一定要是五類其中之一等等,可以讓專案更精緻,故值得特別討論。
網頁資料傳輸的驗證大概可分為前端表單、後端路由、資料庫格式三個階段,儘管在前端做好完整的格式檢查就能擋掉大部分不符規定的資料,但實際上仍可能繞過網頁,透過如Postman直接向API發送請求,或直接在資料庫編輯來更動資料,無論是為內部開發過程方便、有對外開放後端操作,甚至是遭入侵,輕則資料規格不統一,重則網頁伺服器當掉。 因此,若能確實將驗證機制做好做滿,就能如廣告常講的「三重防護」擋掉已知的各種資料風險。
進階目標:工具失效後回歸適應本地環境
雖然學期三還剩關聯式資料庫的篇章,但我的Codenvy挑戰不得不戛然而止:Codenvy已於台灣時間2019/12/09關閉,雖然有替代的Eclipse Che服務,但不支援開放sudo(super user,相當於windows的系統管理員)權限,無法自行安裝新軟體(如MySQL)。 由於找不到其他免費的雲端IDE服務,只得回歸預設的開發環境,因已習慣的Codenvy相對有點生疏的VS Code。
還好,學期前中期在Codenvy開發的經驗,與後期的課程安排剛好能輔助我度過切換平台的陣痛期:其實只有最後改寫Todo List專案必須用到VS Code,非同步JS與關連式資料庫前半的內容因程式碼架構簡單,或是偏重觀念介紹,用Repl.it或紙筆與文字即可完成;另一方面,正如資料庫與程式語言學一種助於通其它種,開發介面由於提供的功能大同小異,只要找好需要的功能位置,一段時間就可以適應,再加上VS Code還像遊戲模組一樣能「客製化」,課程前面就有介紹許多實用插件,再加上自己另外找到的,VS Code變得遠比預期方便(題外話,內建的Git管理也很直覺,平時可不用手動輸指令或額外開圖形化介面)。
至於這部分的學習過程,我同樣也已經整理成另外一篇文章(連同學期四前面的部分,見本段敘述),這邊就只簡單補充對當時關聯式資料庫章節安排的想法:驚鴻一瞥的SQL?
儘管關聯式資料庫(如MySQL)與非關聯性資料庫(如MongoDB)簡單比較後在使用的概念相似多於相異,一些還沒在MySQL介紹到的概念,可以MongoDB的經驗經由自己查資料補上(如佈署流程、seeder設定與資料驗證),但還是明顯感覺到不完整,到學期四才算有把關聯式資料庫介紹完整。 固然可以理解因為學習階段目標差異,而將SQL入門介紹與進階應用拆開,還是覺得若當時有連貫比較好(也許不少人也有這個想法,新版課程就改成合併到全端/後端專修,且與前端分流,看新課綱感覺好多了)。
總之,我的Codenvy挑戰因不可抗力之因素被迫中止,但過程中所見所聞並未白費,除了還能幫我適應回歸使用VS Code開發的主線,主線之外也替我開了幾個有趣的「支線任務」,對擴張學習的領域與樂趣很有幫助。
主線之外的幾個有趣支線回顧
在想到用Codenvy解決問題之外,也有一些學習過程中接觸的新事物,是因想到以前熟悉或使用過的,而增加額外探索的動機或印象(或只是搞笑有趣),想說也一併在這段聊一下。
1. 踏上探索Linux的不歸路:
當時Codenvy的終端機除了可以執行開發時需要的指令,也因網路上搜尋說明文件與討論,使我注意到其背後的Debian屬於以前聽過的Linux作業系統,產生好奇進而瀏覽許多介紹Linux的文章。 了解其眾多的發行版差異、不亞於Windows的完整性,以及在程式開發環境上的優勢後,使我有了在電腦上使用Linux的念頭。
終於在今年全職學習初期,進度與時間壓力還不大時,經幾次查詢錯誤與重新安裝的嘗試,我終於成功在隨身碟上安裝較入門的Ubuntu發行版(以便在桌電與筆電共用同一環境,我之前在新筆電開箱系列文最後一篇有敘述方法),甚至能用於最後一學期的期中小組與期末個人專案,算是意外增加操作Linux的能力?
2. 星際大戰光劍的JS開發技術比喻:
學到使用Node.js搭配Handlebars建立完整應用程式的技術後,剛好去年底周末新的星際大戰電影上映,還算星戰迷的我除了排一天周末去觀賞外,看著電腦螢幕的專案架構時突然又有奇怪的想法:星戰中大部分出場的都是拿單隻單邊的光劍,就像網路開發最常討論到的是前端;但我今天多學了後端,相當於拿全端JS的雙刃光劍,感覺好像比較酷?
這個想法已經很中二,但我還有更多更扯的聯想:後來學到前後端分離的概念,可以讓網頁與伺服器端使用不同的技術或語言,這樣就好像雙手使用不同武器,其中若前端是以JS框架(如Vue.js)來寫,二端都是Javascript,不就變成雙持光劍?(順便暴雷)星際大戰9最後算用這招C8763(X)打倒最終魔王,系列中許多武功高強的角色都能用雙劍,雙劍JS好像更厲害!
扯遠了,從最後一學期初學Vue.js、做個人專案與同學比較時,的確感覺到前後端分離如雙持光劍更靈活多變的優勢,但從選修課程份量與學習速度推估,沒辦法第一時間學通Vue.js配Node.js的雙刀流並用在專案,我還是繼續用已經很熟悉的Node.js搭配Handlebars雙刃組合,但已經決定日後要重新將Vue.js學好,畢竟這樣能更中二(X)能進一步提升專案的使用體驗,如達成SPA(single-page application,也諧spa義)般點連結不用重載的舒適體驗。
3. GitHub不只是軟體載點
雖然標題現在看起來很白癡,但前面提過我有玩遊戲模組,也就是上網搜尋下載遊戲的改檔工具時,有不少載點提供的是GitHub的發布頁面,這成為我對GitHub的第一印象。 畢竟,對不懂程式開發的人來說,他們只需要可以載軟體來用的地方,其他的也看不懂……。
此外,在學如何正確的使用GitHub時,由於查資料時看到一些趣聞,奇怪的知識也增加了:GitHub的別稱與吉祥物。 前者是”GayHub”的戲稱,因為絕大部分開發者是男性,GitHub某種程度上算是「男性為主的大型同性交友網站」;後者則是在GitHub上常看到的貓型剪影,名叫”Octocat”(章魚貓),完整外觀如下圖(男人與貓,很有趣的組合?)。
這篇文章談了很多不正經的部分,其實也是有對應到自學目標:關聯舊有經驗。 在課程教學的過程初期,往往要先「引起動機」,才能讓學生的注意力移到課程上,其中貼近生活經驗且有趣的元素特別有助於達成目標(因此許多老師也得懂得搞笑?)。 在後端開發這塊,感覺因為範圍比較廣,且剛好伺服器與資料庫的概念與我以前的經驗比較能產生共鳴、發揮想像,讓辛苦複雜的程式開發多摻些笑點,所謂的苦中作樂?
後續發展:溫故而知新,知新而溫故
由於當初在職學習的時間有限,有些細節沒能深入探討與複習。 雖然今年初我剛結束工作到學期四開始間有一個多月的空白時間,但當時決定先填補也是在職期間待完成與複習的學期一、二進度;而後來幾個月先後忙於學期四的進度,以及期中小組與期末個人專案的開發,沒太多心力放在補進度,直到六月期末專案改得差不多了,才決定趁進入求職階段前回頭詳細的補完(不然下次有想法與時間不曉得是什麼時候了......)。
時間再度拉回半年後,對現在已能獨立開發全端網路應用程式的我來說,學期三後端開發的內容已沒初學時難懂,除了快速回顧課程內容外,也重新回憶起一些學過但後來開發時忘記的技巧(如重構程式碼避免重複、非同步JS的使用意義、NoSQL與SQL的比較等),更覺得學得有扎實沒還掉。
自行加碼補完的期末考
同學期二,這邊一樣分為「專業知識與技術」與「學習能力與行為」,前者是三個小專案與一個圖表題,後者就是現在這篇文。
專業知識與技術部分同樣為避免直接協助作弊,不談具體題目只大概描述:Q1/2前後連貫,是要寫出呈現特定終端機訊息的middleware,可以寫成單個函式,或分離成獨立檔案;Q3就是學期中某作業的資料庫改版,了解NoSQL與SQL的寫法異同之處後可以直接改寫;Q4則是運用流程控制做出短網址產生器,並盡量考慮各種操作的應對,以避免錯誤或重複;Q5算是最簡單的,把混雜的單一資料表,依原則「正規化」分拆即可。
要特別一提的是Q3與Q4,我在作答時考量因為已經多學過進階的技巧,刻意多花點時間將專案規格加強。 Q3我除了達到題目改編的要求,還有回頭用後來學的技巧,將以前下拉選單無法顯示目前選項的錯誤修復,並補充新的排版樣式與篩選選項,並補上佈署的版本供預覽,讓專案的使用體驗更加提升。 Q4我則將複雜與簡單的方法並用,先多考慮各種使用的邏輯與情境,再將之前練習過的類似功能代碼搬過來使用,並運用註解讓程式碼架構盡量易懂,能直接看出思考與運作流程。 畢竟,既然都等到學了更多才補交,就應該將品質提升到更高的層次?
小結:確立前後學習的「關聯」
用了大長篇將整個學期的心得以「自學經驗」回顧包裝,該回來做個總結,把一開始奇怪的教育心理學理論、腰斬的後端與資料庫學習主線、搞笑的其他主題延伸支線,再點出之間的「關聯」。 「關聯」在這篇的出現算是對這學期主題之一關聯式資料庫刻意的捏他/彩蛋,簡單來說就是要讓學習更「有感」。
最前面提過,這階段的目標是將過去經驗與現在學習做連結:過去使用電腦系統、遊戲模組與GIS資料的經驗,使我現在能對後端更有興趣繼續;過去讀過一些教育心理學的概念,使我現在能用些理論分析學習經驗;過去接觸過Codenvy的經驗,使我現在能轉移到新的開發環境;過去助教對資料驗證的要求,使我現在能養成注重驗證的習慣;過去休閒娛樂的主題,使我現在能延伸印象或學習;過去先走完後續進度再回頭複習;使我現在能將之前的進度整理得更全面。
這一層層的經驗與學習「關聯」屬性,就像在關聯式資料庫將多個資料表建立關聯,以建立便於回顧聯想的心智圖結構,並運用創造性思維持續擴展資料──後端程式開發能力──的可用範圍。 另外,學習也不用總拘泥於簡明固定的關聯,也要向NoSQL學習,多去發想、參考與改進更多學習方法,以適度擴充彈性與提高功效,在有限資源達到甚至超越預期成效。
最後,我想到了一個聽起來「很狂」的結論:像資料庫一樣學習(Learn like a database)!