# Reflection on Simple Twitter

#### **小組背景概述**
  開發模式：前後分離（兩位前端、兩位後端）

#### **負責部分＆展現能力：**
- **PM 能力：**
  - 統整小組內資訊，向導師和教練彙報
  - （PM 能力）注意小組開發狀況
  - （PM 能力）小組 Workspace 架設和檔案管理

  過去的工作職務內容主要是 PM，沒想到這次實作上還能運用到許多相關能力，像是主動溝通，主動詢問組員需求和建議，彙整小組意見，向上呈報給小組導師和班級教練；以及用文件和表格管理開發流程，透過表格就能看出當前需要完成、進行中和已經完成的任務；建立提問區，並在標題上寫下：求救中、解決中和已解決，讓導師能透過瀏覽標題，就知道這個問題目前的狀況，只需要點進去有標示「求救中」的頁面就好。

- **工程師能力：**
  - 分析測試檔、UI 設計稿、User Story 後，設計和撰寫 Restful API路由表[（link）](https://www.notion.so/Route-Table-266b51f734a64e2cbd236136bb7aaec2)
  - 撰寫 API Document [（link）](https://www.notion.so/API-Doc-7a2f6cb5acef4c3da21ecb1f291eac59)
  - 撰寫後端 API server admin, tweet, followship, like controller 邏輯
  - 跑測試
  - code review
  - 程式碼優化
  - 使用 git 指令

這次開發上跟以往課程中實作很不一樣，沒有助教手把手帶著做，需要自己分析規格，設計邏輯和架構。
第一次自己分析規格，把分析後的內容撰寫成文件，撰寫過程幫助我更有條理得去思考整個架構和每一個 request 到 response 之間會發生哪些事？request 和資料需要如何被處理？有些測試檔內沒有指定的路由，也是在分析規格中找出來的。
進而設計出路由表和寫出前端組員能快速理解的 API Document。也是因為先釐清規格和需要回送什麼資料內容，在撰寫程式碼上花的時間少很多（反而是 debug 和解決問題時間比較多XD），也不容易遺漏需要傳到前端的資料，深刻體會到寫文件的益處和樂趣，有用的文件對大家的開發上有幫助，我也覺得很有成就感。




#### **開發中過程遇到的問題＆反思（心得）：**
##### **A. 溝通：**

  第一次參與多人協作開發，不論是跟前端組員，或是跟同樣是後端的組員，在溝通上都有遇到一些摩擦

  - **跟後端組員間：**

我習慣先分析規格、釐清問題和各種流程，經過討論之後，才會開始動手寫程式的人，組員則是行動派，想到就開始做。一開始只有討論基本的分工，我負責分析規格、寫文件、規劃 RESTful API 路由和寫一半的邏輯，他負責寫專案基本設定和另一半的邏輯，然後就各自開工。
剛開始的合作過程不太順利，尤其是討論實作細節和流程中，組員性格比較強勢，很多時候讓我覺得很像被「命令」做什麼，而不是在「討論」。

鼓起勇氣說出自己的做法和為什麼會想這麼做之後，同時詢問對方為什麼會想用他的方法，發現到組員不是不能溝通的人。慶幸這樣的摩擦發生在專案初期，後續實作中，我們時常有意見完全相反的時候，有了初期的經驗，我們都能就事論事把觀點闡述清楚，經過討論後的解法，常常是融合彼此做法的第三種答案。


  - **跟前端組員之間：**
  
由於不太清楚前端是怎麼使用框架開發，在寫文件和設計 API 路由的時候，需要不斷詢問前端組員資料會怎麼渲染？依照 UI設計稿和 User Story 寫下前端會需要的資料後，再詢問前端組員需要補上什麼資料？初期還在熟悉彼此的開發模式的階段，時常發生聽不懂對方在說什麼，導致需要解釋比較久的狀況發生。

  但在和前端組員的溝通上遇到的最大問題，是沒有即時發現前端組員卡在某些技術問題上，組員也沒有即時求助，導致進度落後。單看每天回報的開發狀況（依綠燈、黃燈、紅燈區分），看到綠燈就以為大家都開發順暢。

  直到前端組員進入透過 API 取得和串接資料的流程，卻超過一兩天都沒聽到前端組員回報任何問題，我才驚覺狀況不對勁！怎麼可能都沒遇到問題！這時距離向小組導師 demo 已經不到一天，而且距離專案截止不到三天的時間，趕緊召開小組會議，請前端組員說出當前遇到的情況和問題，討論出解法，並把小組情況回報給導師和班級教練。
  緊急會議和小組遇到的狀況，讓我深刻理解到溝通的重要性，如果大家能夠每天撥出 15 分鐘，講出自己目前的進度和遇到的瓶頸，或許能早點發現組員遇到的問題，降低開發時程落後的問題，也能即時為需要幫助的組員找到度過難關的資源。

- **反思：**

每個人都是獨立的個體，過去的成長背景、經驗和歷練不同，做事情上難免會帶著過去的經驗和習慣，對於壓力的承受度也不一樣。所以就事論事，好好溝通和認真聽彼此講話真的很重要，當大家都願意把自己的想法講出來，別人也願意傾聽，一起找出解決辦法，對一個人來說是大問題的問題，就會變成小問題，甚至不是問題。

另外，設停損點和適度求助也是團隊協作上所必要的，有時候自己卡在一點，容易當局者迷，越想越往死胡同鑽。把問題拋出來跟大家討論，聽聽別人怎麼解決問題，嘗試用對方解法，理解對方的思路，有時候把別人的方法結合自己的方法，反而能創造出更有效率或更有創意的解法。

##### **B. 技術：**
**分析問題、嘗試作法和解決過程，都在各個問題的相關連結內**

**情況一：[（link)](https://www.notion.so/1-package-json-script-179079905d1244ac9dc67b22cebd2e46)**
- 說明跨開發環境導致 script 指令寫法不同，組員用 windows os ，我用 mac os，導致每次 merge main 之後，都會覆蓋掉對方的 script 指令程式碼
- 解法簡述：使用 cross-env 套件


**情況二：[（link)](https://www.notion.so/2-local-database-8b3eca3755e74f9787302b7ebff85662)**
- 每次跑測試，跑完之後，資料庫內的種子資料都會被移除，需要重新建立一次，才能再跑一次測試，無法一邊修改程式邏輯，一邊測試修改內容是否符合規格
- 解法簡述：建立專門給測試用的資料庫，就不會影響到開發環境下的資料庫

**心得：**

除了上面兩個開發過程中遇到的大問題，也有很多小問題，像是 clone下來的專案架構內，套件老舊不敷使用，不斷跳 error message，或是跑測試過程中，有些錯誤情況無法從 terminal 輕易上看，需要一直console.log()去找出問題，以及在撈資料時，耗時過久，需要透過語法先去篩選不要撈出的資料和資料表。
從分析問題、拆解問題、嘗試解法到實際解決問題，一連串的過程，雖然很耗腦力，也佔大多數的開發時間，不過我覺得很有趣，很像在玩解謎遊戲，一點一點找出線索，嘗試解決，這個方法解決不了就再找下一個，直到解決為止。

#### **總結**
雖然這次協作專案，組內發生了沒有儘早提出遇到的問題（不論是技術上或心理狀態上），導致最後大家必須連續熬夜兩天到天亮，才能勉強完成專案的情況。以及溝通上跟組員發生各種摩擦，意見不合，或因為對方的態度讓我感覺不舒服。
我仍然覺得很慶幸自己遇到這麼多問題，遇到問題並且認真去想辦法解決問題，才會成長和進步。如果這兩週沒有發生那麼事情，就不會有那麼多學習和成長的機會，像是在請求導師協助前，提問的前置作業要自己先做好，導師才能比較快速就問題點給予指導和協助；還有遇到衝突的時候，即使覺得不舒服，也要理性去面對和解決，願意提出想法和好好說明，自己和組員都會有所成長；以及要更主動溝通，讓小組內大家的聲音是暢通的，問題才能及早被發現和解決。

#### **特別感謝小組導師 Eugene 助教和班級教練 Dan**
謝謝導師 Eugene 助教，每天關心我們的開發狀況，甚至主動關心我們有沒有遇到問題，工作和生活都很忙碌，在下班和週末還是會為我們解答，指導和給予協助，對我們的付出遠超過導師的職責範圍。真的超級無敵萬分感謝導師 Eugene 助教（180度鞠躬<(_ _)>)

謝謝班級教練 Dan，在知道我們小組遇到的困難之後，即使休假也不斷關心和詢問狀況，主動幫我們爭取資源、解答和協助解決問題，沒有因為遇到困難無法準時交付專案，而直接判定我們失敗，還給予我們補救的機會，真的超級無敵萬分感謝教練 Dan（180度鞠躬<(_ _)>)

