Alpha Camp 學期三團體專案回顧

從 0 到 1 的專案開發心得

Zong-Rong Huang
7 min readAug 9, 2020
Photo by Brooke Cagle on Unsplash

在 Alpha Camp (AC) 第三學期的 Simple Twitter 專案中,我們團隊採取前後端分離的開發方式:

  • 後端開發:利用 Node.js 和 Express 框架建立 API 伺服器
  • 前端開發:利用 Vue.js 建立頁面並串接 API 取得資料

最後,再將前後端成果結合成一個具備基本 Twitter 功能的平臺。

我的開發角色

在團隊中,我是後端 API 開發的其中一員,負責開發以下功能:

  • 一般使用者功能:取回及編輯使用者資料、對推文及回覆按讚或取消讚、取回使用者按讚或回覆的推文
  • admin 管理員功能:取得所有使用者資料、取得所有推文資料及任意刪除推文

前後端串接完後,我和另一位後端開發成員 Jessie,一起依據 AC 提供的檢查表確認成品是否如預期正常運作。

另外,進行 socket.io 挑戰題時,我先依官方教學文件建立初步的實驗環境,發佈到暫時性的 ngrok 公開伺服器,讓團隊成員體驗、觀察 socket.io 的運作方式。後續正式開發則由 Jessie 為主力。

完成專案的關鍵

Photo by Jungwoo Hong on Unsplash

回顧兩周精實的開發過程,整理了一些我自己覺得專案能夠順利前進的關鍵。

強力組員及助教支援

Jessie 在工作上已經有開發經驗,很迅速地為全組規劃了開發時程,讓大家能有立即可追求的目標,減少猶豫的時間。而且具備豐富的技術能力,在我們其他新手組員遇到技術問題時,也能跳下來跟我們一起討論、排解,順利推進開發進度。

Eli 獨自負責前端開發。由於我和 Jessie 對於前端工具了解有限,Eli 自行解決許多排版和串接問題,最終成果令人驚豔!

更棒的是,我們也從團隊助教 Eugene 得到不少開發的線索,在解決部署、資料庫使用、前端處理上有很多收穫。

前端引導後端

由於前後端各自開發,要順利將雙邊成果整合在一起會是個潛在難點。

參考了先前的學員專案開發心得後,發現一項很好的建議:

以前端為主,讓前端需求引導後端實作。

由於最終成果是以前端頁面呈現,再加上前端開發只有一人負責,由後端二人協助滿足前端需求會更有效率。

試想,如果後端提供的 API 不夠友善、方便,前端還得花更多心思串接和處理資料,一定會影響整體進度。

多面向的溝通管道

團體專案完全採遠端協作,我們大量使用 Zoom 和 Google Meet 進行視訊或語音溝通。

Google Meet 很適合開發時長時間掛在上面,一有問題可以直接透過語音和組員溝通 (類似在公司隨時用內線打給同事的感覺)。

如果覺得語音溝通不夠清楚 (例如要看 code),會再轉用 Zoom 或打開 Google Meet 的分享螢幕來討論。

專案一開始,我們就立刻用 Zoom 開了第一場視訊會議。雖然當時的討論沒有觸及太多細節,卻是透過影音認識團隊夥伴、建立團隊連結的好機會。我想,這也是開發時相處的很不錯的原因之一。

我們也在 Google Doc 上建立 API 文件,紀錄呼叫 API 的路由、參數、回傳結果和錯誤訊息。前端能夠藉此確認回傳的資料和格式是否符合需求,也能了解有哪些錯誤訊息可以利用。後端修改程式碼時也不致於亂了頭緒。

再次體會到,API 文件在團隊開發中不可或缺,是所有人開發時的最終依歸

AC 推薦使用的 Basecamp 群組也是我們常用的服務:我們在上面匯整了重要開發資源,方便隨時使用;如果進行沒那麼即時的交流,通常會在上面留言、討論。

技術學習

Photo by Joshua Sortino on Unsplash

專案實作過程中,對於先前所學有更加深入的理解,同時也學到新的技術。

非同步 Promise 及 async… await 語法

實務上必須和資料庫溝通和使用外部服務,幾乎都脫離不了非同步處理。累積了大量使用非同步 Promise 和 async… await 語法的經驗。親身體驗到非同步語法真的很重要!

多虧專案中有大量實作,現在更能掌握非同步處理流程。Promise 也不再感覺那麼虛無縹緲。

Git 協作流程

在專案前期,為了讓自己本地的程式碼和團隊 repo 程式碼同步,總是得先把自己本地的專案資料夾整個砍掉,再用 git clone 把團隊 repo 內容下載到本機。

反覆幾次,實在是覺得效率低落且無比麻煩,而且每次都要重新建立 .env 檔案內的設定。(抱頭)

後來,查了資料後才更清楚如何用 git fetch 和 git merge 來整合本機和團隊的程式碼,用起來非常方便!整合程式碼後,就能順利開啟 pull request 把更新內容推上團隊專案 repo。

果然是有痛點才會有成長動力!

自動化測試

由於 AC 要求專案的最終結果必須通過自動化測試,因此也額外學了如何理解測試程式碼,推敲出我們如何處理資料和設定資料庫。

例如,回傳單筆資料時,測試希望直接回傳一個物件,而非一個內含物件的陣列。

為了通過測試花了不少時間,但認識了自動化測試也算是值得 (只要沒有耽誤到開發進度)。

後端開發思維

開發時觀察到,後端程式開發時採取限制導向的思維。裡面通常會加入不少限制。例如,推文內容不能超過 140 個字元、某些欄位必填等等。如果傳入的請求沒有滿足這些限制,不會執行接下來的程式碼,或是不會和資料庫進行溝通。

前端頁面其實可以執行不少檢查。然而,後端程式作為與資料庫溝通的最後一道防線,還是要設下檢查機制,避免使用者繞過前端頁面趁機存取敏感資料

假設,某使用者猜出 URL 代表的意義,可能直接輸入帶有特定參數值的 URL。如果後端程式沒有加上必要的限制條件,使用者就有機會動用資料。

設下限制的額外好處是:當請求沒有通過限制時,也就不需動用資源和資料庫溝通,減少不必要的問題發生。

請求沒有通過限制時,我們也儘量提供客製化的錯誤訊息。不僅方便前後端開發時除錯,也能給使用者明確的回饋,強化使用體驗。

另外,回傳資料給前端時,也得避免回傳密碼等機密、敏感資訊,避免資料曝光。

資料庫併發問題

有趣的是,在開發時遇到了從來沒有想過的併發 (concurrency) 問題:

當使用者 A 修改某筆資料,同時使用者 B 剛好在讀取同一筆資料。如果修改和讀取時間極為接近,可能導致使用者 B 讀取到修改前的資料,產生資料不一致的問題。

經過團隊助教提醒,Sequelize 提供某些能夠直接將改動寫入資料庫的方法,能夠避免併發問題。不需先從資料庫拿到資料,在伺服器端修改,再等待資料庫寫入。

如果能再重來

首先,希望自己可以早點研究 socket.io 的用法,有助推進團隊在挑戰題的完成度,也能多分擔一點開發進度。

另外,也希望減少熬夜寫 code 的次數。由於全職工作,無法每天抽出大量時間進行專案,雖然請了幾天假,但平日還是得靠熬夜撐出寫 code 的時間。

即使發現熬夜好夥伴 — 維他命 B 群 — 能夠緩解熬夜的不適,但次數一多,還是會累積不少疲勞,讓頭腦愈來愈不清楚。

頭腦清醒的話,整個開發過程應該會更輕鬆、愉快,效率更好。

結論

這次 Simple Twitter 專案是非常難得的實作經驗。完整感受從 0 到 1 打造可運作產品的不確定感、成就感和有限時程帶來的壓力,規模也比以往作業都大上不少,是更接近業界實況的實作。

其中感受最深的是團隊合作:每個成員都是專案中不可缺少的一部份,有自己獨特的貢獻

面對壓力時,我們能夠理解彼此的辛苦,所以能夠體諒和給予支援,帶來很多的團體凝聚感和同理心運作體驗。

對於寫程式開發產品,有了更深一層體會:

不僅要單打獨鬥,更需要團隊合作。

最後,還是要感謝團隊成員 Jessie 和 Eli。沒有你們,專案不會如此順利。

--

--

Zong-Rong Huang

Frontend web developer/technical writer that writes to learn and self-entertain. I’m based in Taiwan.