關聯「舊有經驗」以輔助學習的開發自「決」(學):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

ALPHA Camp Lighthouse學習平台成就:來自Bernard校長的upvote

由於收到正面回饋,使我決定持續研究並持續分享,最終成了課程討論區一系列的「使用線上虛擬主機Codenvy進行後端練習」分享文,這也是我自學寫程式以來第一次嘗試發表技術文,就因想起之前學過的工具而有亮眼的起頭,有如為日後學習進展吞下一粒定心丸。

Codenvy還能使用時的介面(截自2019.10課程討論區貼文)
Codenvy執行簡易伺服器的畫面,畫圈表開啟與關閉按鈕(截自2019.10課程討論區貼文)
Codenvy上nodemon的設定與執行畫面(截自2019.10課程討論區貼文)

中階目標:在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(mongod)執行失敗的畫面(截自2019.11課程討論區貼文)
Codenvy上MongeDB(mongo)執行成功的畫面(截自2019.11課程討論區貼文)

感覺前面已是搞定一大挑戰,挑戰卻才剛開始。 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的念頭。

這部影片有列出較常見的發行版與派系關係(Debian系、Red Hat系、ArchLinux系……),更複雜的關聯圖可參考維基

終於在今年全職學習初期,進度與時間壓力還不大時,經幾次查詢錯誤與重新安裝的嘗試,我終於成功在隨身碟上安裝較入門的Ubuntu發行版(以便在桌電與筆電共用同一環境,我之前在新筆電開箱系列文最後一篇有敘述方法),甚至能用於最後一學期的期中小組與期末個人專案,算是意外增加操作Linux的能力

2. 星際大戰光劍的JS開發技術比喻:

學到使用Node.js搭配Handlebars建立完整應用程式的技術後,剛好去年底周末新的星際大戰電影上映,還算星戰迷的我除了排一天周末去觀賞外,看著電腦螢幕的專案架構時突然又有奇怪的想法:星戰中大部分出場的都是拿單隻單邊的光劍,就像網路開發最常討論到的是前端;但我今天多學了後端,相當於拿全端JS的雙刃光劍,感覺好像比較酷

學會用Node.js搭配Handlebars的中二感,取自:https://imgur.com/gallery/ru22uGg

這個想法已經很中二,但我還有更多更扯的聯想:後來學到前後端分離的概念,可以讓網頁與伺服器端使用不同的技術或語言,這樣就好像雙手使用不同武器,其中前端是以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”(章魚貓),完整外觀如下圖(男人與貓,很有趣的組合?)。

Octocat的圖片,取自:https://www.flickr.com/photos/goshakkk/6083284063

這篇文章談了很多不正經的部分,其實也是有對應到自學目標:關聯舊有經驗。 在課程教學的過程初期,往往要先「引起動機」,才能讓學生的注意力移到課程上,其中貼近生活經驗且有趣的元素特別有助於達成目標(因此許多老師也得懂得搞笑?)。 在後端開發這塊,感覺因為範圍比較廣,且剛好伺服器與資料庫的概念與我以前的經驗比較能產生共鳴、發揮想像,讓辛苦複雜的程式開發多摻些笑點,所謂的苦中作樂?

後續發展:溫故而知新,知新而溫故

由於當初在職學習的時間有限,有些細節沒能深入探討與複習。 雖然今年初我剛結束工作到學期四開始間有一個多月的空白時間,但當時決定先填補也是在職期間待完成與複習的學期一、二進度;而後來幾個月先後忙於學期四的進度,以及期中小組與期末個人專案的開發,沒太多心力放在補進度,直到六月期末專案改得差不多了,才決定趁進入求職階段前回頭詳細的補完(不然下次有想法與時間不曉得是什麼時候了......)。

時間再度拉回半年後,對現在已能獨立開發全端網路應用程式的我來說,學期三後端開發的內容已沒初學時難懂,除了快速回顧課程內容外,也重新回憶起一些學過但後來開發時忘記的技巧(如重構程式碼避免重複、非同步JS的使用意義、NoSQL與SQL的比較等),更覺得學得有扎實沒還掉。

自行加碼補完的期末考

同學期二,這邊一樣分為「專業知識與技術」與「學習能力與行為」,前者是三個小專案與一個圖表題,後者就是現在這篇文。

專業知識與技術部分同樣為避免直接協助作弊,不談具體題目只大概描述:Q1/2前後連貫,是要寫出呈現特定終端機訊息的middleware,可以寫成單個函式,或分離成獨立檔案;Q3就是學期中某作業的資料庫改版,了解NoSQL與SQL的寫法異同之處後可以直接改寫;Q4則是運用流程控制做出短網址產生器,並盡量考慮各種操作的應對,以避免錯誤或重複;Q5算是最簡單的,把混雜的單一資料表,依原則「正規化」分拆即可。

要特別一提的是Q3與Q4,我在作答時考量因為已經多學過進階的技巧,刻意多花點時間將專案規格加強。 Q3我除了達到題目改編的要求,還有回頭用後來學的技巧,將以前下拉選單無法顯示目前選項的錯誤修復,並補充新的排版樣式與篩選選項,並補上佈署的版本供預覽,讓專案的使用體驗更加提升。 Q4我則將複雜與簡單的方法並用,先多考慮各種使用的邏輯與情境,再將之前練習過的類似功能代碼搬過來使用,並運用註解讓程式碼架構盡量易懂,能直接看出思考與運作流程。 畢竟,既然都等到學了更多才補交,就應該將品質提升到更高的層次

小結:確立前後學習的「關聯」

用了大長篇將整個學期的心得以「自學經驗」回顧包裝,該回來做個總結,把一開始奇怪的教育心理學理論、腰斬的後端與資料庫學習主線、搞笑的其他主題延伸支線,再點出之間的「關聯」。 「關聯」在這篇的出現算是對這學期主題之一關聯式資料庫刻意的捏他/彩蛋,簡單來說就是要讓學習更「有感」

最前面提過,這階段的目標是將過去經驗與現在學習做連結:過去使用電腦系統、遊戲模組與GIS資料的經驗,使我現在能對後端更有興趣繼續;過去讀過一些教育心理學的概念,使我現在能用些理論分析學習經驗;過去接觸過Codenvy的經驗,使我現在能轉移到新的開發環境;過去助教對資料驗證的要求,使我現在能養成注重驗證的習慣;過去休閒娛樂的主題,使我現在能延伸印象或學習;過去先走完後續進度再回頭複習;使我現在能將之前的進度整理得更全面

這一層層的經驗與學習「關聯」屬性,就像在關聯式資料庫將多個資料表建立關聯,以建立便於回顧聯想的心智圖結構,並運用創造性思維持續擴展資料──後端程式開發能力──的可用範圍。 另外,學習也不用總拘泥於簡明固定的關聯,也要向NoSQL學習,多去發想、參考與改進更多學習方法,以適度擴充彈性與提高功效,在有限資源達到甚至超越預期成效。

最後,我想到了一個聽起來「很狂」的結論:像資料庫一樣學習(Learn like a database)

How SQL/NoSQL Is Making Me a Better Learner,取自:https://towardsdatascience.com/how-sql-is-making-me-a-better-scientist-28289d5bee56

--

--

Bob Yu-Zhen Huang is developing on web

2020年代第一天起,以第一篇廢文開始網路開發的學習紀錄,短期目標是不定期分享關於寫程式,或與資訊、軟體、電腦勉強沾得上邊(?)的學習心得與感想(先定廣一點方便擴張範圍……);長期的話,則是將這個站停掉(!)──待未來自行架設部落格新站後搬過去(開發專案與習作彙整:https://github.com/BOBYZH)。