DevOps Culture Establishment from 0 to 1-How We Established DevOps Culture in Two Years?(2)
一個人可以走很快,一群人可以走很遠,當工程師時,你的成就取決於你的成長。成為管理者時,你的成就取決於你能與你的夥伴走多遠。
這篇是下集,還沒看過上集的朋友歡迎看看呦 :D
medium
blog

起源

我們的故事不傳奇,來自一個小團隊的成立,沒有資本、沒有資源、沒有高手,兩年前的我,以iOS 開發的角色,剛剛加入這間剛成立、剛轉型的公司,沒有敏捷開發、沒有 CI/CD、沒有 Cloud 的觀念,土法煉鋼,本地超英趕美,接近隕石式開發。

這篇文章是兩年半下來的心得,會分享我是如何在這間公司中,導入敏捷開發、建立全自動的流水線、 CI/CD For iOS、Android、Web、Backend...,建立容器化環境、運用容器編排,微服務、DDD,並且多方吸收,執行 UX 開發流程方法論。

並且導入夥伴教育訓練分享、內部分享、筆記文件驅動、逐漸讓夥伴們成為 DevOps 文化人,初步了解系統思維、敏捷開發核心觀念,提倡自學能力、解決問題能力。

相信我,他並不容易,但值得你動手執行,值得你說服老闆。比起一開始就加入有完整的基礎設施的公司,我卻選擇了打造這個環境。

不一定要跟我選擇一樣的路,但希望這條路的經驗分享,對大家或多或少有一點幫助。

初生之犢不畏虎

時間來到了 2018 年 12 月底,接下來的下一個專案是重磅登場型,所有至黑時刻、爆發成長都在這個階段發生。

這個專案比較特別,是一個舊專案轉換新系統,他的需求如下:

  • 需要有個地方大量儲存照片
  • App 內顯示照片的速度要非常快,要求幾乎零延時
  • 對於行銷與營銷方向要快,需求必須快速跟上
  • 來自全世界的流量,必須支撐住
  • 許多排程的工作需要預處理
  • 需要建置在雲上
  • 需要將舊系統資料轉移至新系統
  • 原始的會員必須能正常使用
    – FB Account Kit– FB Login– Line Login
  • 沒有舊版的 Source Code,邏輯必須全部重寫
  • MySQL 4個 Database 共66張表,沒有人知道每張表的作用與關聯性
  • 複雜的商業與遊戲邏輯

就這樣開始了艱難的專案開發,當時分析了資料表就分析了近2個月,解決方案技術棧大約如下:

一起附上因為這些問題而產出的文章 :D,持續更新!

沒錯,這就是最終解決方案的技術棧,其實現在內部已經把它當成一個產品在運營了,後面會更加提到。可以看到有大堆的技術還沒產生文章XD

時間回到 2019 年 1 月,在這個專案開始時,我就決定要帶領團隊走 Scrum,現在想起來真的是蠻大膽的決定,當時一半以上的人都是新手,對於敏捷、Scrum、DevOps 毫無概念,就算有聽過,也不知道怎麼落地。並且用戶故事的開發方式本身就於開發者的技術要求本身就比較高,可想而知一開始跑得很痛苦。

當時團隊成員只有一個Fronted、新手後端(完全沒寫過)、Junior Android加上我,後來5月多了一個新手 iOS,先說結論,這個系統有百分之 77的卡片量是我完成的(包含 iOS / Android / Backend / Web)

手把手帶著新手寫

大約在 2019 年 3 月份,這時候把需要開發的卡片與故事都先列到 backlog 上了。並且開始了每週的 Sprint,因為是團隊成員大部分是新手的狀況下,我把每次 Sprint 都設置為大概一週。

期間我一直當著Scrum Master,日程大概如下:

  • 每天執行 Stand up Meeting
    – 格式大概像這樣–

–  大家輪流描述
   – 昨天做了什麼– 今天做了什麼– 有什麼問題– 想到的待辦事情

  • 週一執行 Sprint計劃會議
  • 週五執行 Sprint回顧
  • 週日由我先設計下週要做的 Backlog

要知道,推著新手跑這個是非常辛苦的,Stand up Meeting 也可能淪為形式,一開始真的會感受到大家對於這個專案或自己做的是沒有感情的,甚至還做不出來,也不太求救,好像只是一個,每天早上要站著的會議。

新手後端

抱著好想工作室的精神,認為每個人只要想學,就一定會做出一番成就。我大量了建置完整的後端環境、底層架構,這時候後端其實只要實現商業邏輯,剩下的都已經自動化。開發流程就像這樣:

  1. 領到卡片任務
  2. 查看卡片任務中的用戶故事與目標
  3. 查看卡片中 Leader(我)建議的設計
  4. 拖曳卡片至執行中
  5. 創建新的功能分支
  6. 執行軟體設計與實作
  7. 撰寫單元測試
  8. 提交分支並且發送 Pull Request
  9. Auto Run Pipeline 執行建置、測試
  10. 確認 Pipeline 執行成功後拖曳卡片到 Review
    – 如果失敗必須修正後重新提交
  11. 進行 Code Review
  12. 合併到 develop 分支
  13. 合併後自動觸發 CI/CD
  14. 自動建置、測試、部署
  15. 自動 打包 docker image
  16. 自動推送到 Private Container Repo
  17. 自動部署到 Kubernetes 中
  18. Slack 通知完成

新手後端只需要簡單的拖曳卡片與實現商業邏輯與撰寫單元測試,你說幸不幸福XD

不過最後我還是回去把後端功能翻了一遍,或許是他經驗不足,或許是心不在此,總之是蠻失落的,畢竟手把手教,卻沒有一個好的成果。這件事情導致讓我對於軟體開發沒有看到熱誠的人,不會在投入。(後面遇到有熱誠的人,真的差很多)

Junior Android

這個 Android 是有一兩個專案經驗的,但是對於軟體開發、軟體工程、溝通上都有點欠缺,完成的 Code 常常有很嚴重的 Bug,對客戶很難交代(後來找到了一位更細心的 Android)

有些功能也是手把手教學,差不多功能都有做出來,但也只限做出來而已,程式碼的易讀性易測試性很缺乏(當然後來改善了很多)

開發流程跟後端差不多,只是最後變成自動打包 APK / AAB 推送到 Google Play 內部測試這樣。

Fronted

這個 Fronted Developer 是還算有經驗的,串接後台功能還算得心應手。

後台唯一美中不足的是沒有經過 UI/UX 的設計討論,需求詳細訪談,對於營運面有善度可能還需要加強。

開發流程也差不多,最後打包變成打包成一個 Web App Container 部署到 Kubernetes

新手 iOS

時間到了2019年 5 月,這之前的 iOS 一直持續是我在開發的,這期間也一直持續在面試適合的 iOS,那時候找到這一位 iOS,雖然是新手,但以他的作品與文章來看,覺得應該可以大幅提升 iOS 進度。

但通常事實並非如此,一開始我一樣手把手教學,教了大概一個月,但他對於資料流向與結構還是很難有大幅提升。那時候很失望,也覺得很累。到了 6 月不行了,我就接回來自己趕進度,稍微暫停每日例會(還是有跑卡片,但是是發給自己),開始瘋狂自幹。

不過後來,我還是讓這位 iOS 夥伴離開了,這又是另外一個故事了。

至黑時刻

眼看著離預計的專案結束期間一天天逼近,天天趕工,天天焦慮,最終還是趕不上進度。我的內心稍稍埋怨了起來,做這麼多,教這麼多。卻沒有一點成效,團隊能不能起來,難道一定都要我嗎?

不,我確定一定有那麼一天,團隊是可能分工的,會有夥伴理解,我們執行的流程,是很有意義的!

在這至黑時刻,黑暗隧道中,你能做的,就是持續往前走,持續去溝通,堅持做對的事情。我很難描述那段時間是如何過去的,那是不是技術上的挫責,而是對於團隊分工的失望,對於自己的領導力懷疑的時刻。

另外一方面客戶也尚未達成默契與磨合,那時對於一大堆變動的需求感到茫然、無奈與憤怒,客戶並不了解技術,有些項目可能是需要很多條件完成的。

最後在 6 月底與客戶的一次溝通,找到了黑暗隧道的出口...(原預計 7 月上線)

黑暗隧道的出口與光芒

在我瘋狂趕進度的狀況下,進度有一天天稍微趕上。客戶也開始理解需求必須明確,一切好像漸漸好了起來,但還是走得非常審慎小心。

終於在 7 月中,上線了!對於正式環境也是非常容易部署的,以我們的設計只要推送到 master or tag release version 就可以部署。

客戶的需求漸漸地收斂,應用漸漸的穩定起來,跟客戶的溝通漸漸地順暢。這中間真的遇到很多貴人,非常珍愛與感謝這些人出現在我的生命中。

於是漸漸的我們團隊,走出了黑暗隧道,看到了出口的光芒,原來,我們的努力還是有成果的!

就這樣我最終以 78 % 的卡片完成率,暫時結束了這個專案,當然,下一階段也接踵而至。

走出黑暗隧道

時間來到了 2019 年 8 月底,客戶有一個成果展出,活動效果還不錯,我們到了現場看到了自己努力的成果,覺得很美好,那一刻覺得,看到自己的作品展出了,有種無法言語的感動。

這次也讓我更加體會,要做好事情,不僅僅要有方法,也要有條件,否則用力過猛,常常只會動作變形。

細心與令人放心的 Android

時間來到了 2019 年 9 月,我們非常有榮幸找到了一位非常有熱誠的 Android,他也非常用心,漸漸的追上 iOS 的進度,執行越來越順暢。反倒是 iOS 沒感覺到有進步。

有的他的到來,對於後面要找的人我更加的明確,至少,他一定要對於程式、軟體開發、解決問題與溝通,是有熱誠的人。

小憩一下

10 月後就告一段落了,這時候我提議客戶讓團隊 12 月再繼續下一階段,這期間還是維護修正 Bug,但先不開發新功能了。

這期間我重新強化了我們的開發流程,更找來了一位 QA 來幫我們的品質把關,調整腳步。

這期間陸陸續續找到越來越符合我們使命、願景、價值觀的人,我們也需要步步為營,繼續提起燈,往前走。包含 QA,Designer,iOS,Android,Backend,PM。

也在台南設置辦公室了!

參加 GDG Taipei

聚餐

參加 Google Flutter 活動

參加 RedHat 活動

文件驅動

後續我們由我引入了 notion 協作軟體,在上面可以查詢到很多東西:

  • 某個夥伴的學習筆記
  • 某個夥伴遇到某些問題,解決之後的筆記
  • 某個夥伴的研發記錄
  • 公司的開發流程
  • 專案的文件與設計
    – 每項卡片功能的設計稿圖
  • 各種會議的紀錄
  • 頭腦風暴
  • 文章分享
  • 心得分享

到了現在,每張卡片都會附上實作人的設計稿圖。

開發Wiki

研究筆記

解決問題筆記

研發記錄

每個卡片的設計圖

頭腦風暴

我們的衝刺看板

CI/CD

CI/CD

站立會議、需求會議

UI/UX 的加入

2019 年底我們找來兩位非常有熱誠的 UI/UX 設計師,之前都是配合兼職的設計師進行專案,我們覺得時候到了。這兩位設計師目前的表現也很棒!

終於我們的團隊成行了!Frontend、iOS、Android、Backend、PM、UI/UX Designer、QA

2019 年底總結

2020年的 1 月尾牙前我嘗試做了一場對於 2019 的年底總結同樂會

年底總結同樂會

做了幾個公司有趣的數據:

  1. 大家今年的 Commit 數
  2. 各個專案技術分享
  3. 特別獎
    1. 筆記王2. Commit 數最多3. 去年年度OKR 分數最高者
  4. Lighting Talk

今年的Lighting Talk主題很多樣!

想看簡報的在偷偷跟我說 :D

2019尾牙

感謝今年,驚嘆今年!

有設計師真的很好QAQ

2020 新的開始

台中出差聚餐

結果下週馬上台北聚餐

總結

2019 我們做了工程面上流程的進化與升級,接下來的挑戰將會是 UX 與需求面的流程優化。我們正在尋找各種方法與實際執行,有一定成果會再跟大家分享 :D

目前的內容已經有一些簡報可以看,按這裡

2019 我們走過了某些至黑時刻,也看到了出口的光芒,找到了更多志同道合的夥伴,我們一起工作,也一起歡笑,一起胡鬧,一起認真。感謝生命中能遇見你們,大家一起成長,一起搭上火箭,往前走吧!

下一步計畫

接下來的計劃我們決定往工程面的前面走,我們需要加強開發之前的階段。

UX Roadmap

這邊特別感謝 Tina 與他的課程 從 0 到 1 的 UX專案實戰力 - 讓 UX精準落地到專案 ,給予相當多的建議與顧問諮詢,受益非常多,接下來就是真的讓他落地。這邊有一定的成果後,一定會再跟大家分享!

如果你想跟我分享或討論,隨時歡迎,感謝你的閱讀,我們下次見。

最後偷放我簡報的畫面 :D

澄思設計-沈思世界的解決方案
解決問題的路上,也給大家解決過的問題不同的角度思考方案,包含軟體工程、架構、使用者體驗、專案管理等方法論。澄思設計以顧問的角色,積極解決客戶的問題。理解客戶的想法,這個客戶不一定是企業,也可能是個人,解決企業問題,我們使用專案解決,解決個人問題,我們使用產品解決。我們想要找的人,是能夠解決這個世界上各種大大小小問題的人,無論是透過溝通、技術解決,同時他應該會有積極與強大的自學能力,對於解決問題充滿熱誠,與團隊、與公司共同搭上火箭成長,那你可能就是我們要找的人Klearthink Design Co., Ltd.
如果你對我們公司有興趣,歡迎參考我們的職缺,我們有機會聊聊吧 :D
職缺參考

yasuoyuhao,自認為終身學習者,對多領域都有濃厚興趣,喜歡探討各種事物。目前專職軟體開發,系統架構設計,企業解決方案。最喜歡 iOS with Swift, [email protected]
如果喜歡我的文章,可以按下喜歡或追隨讓我知道呦,拍手可以拍 50 下,更歡迎許多大神指點討論。感謝您的閱讀。
部落格:yasuoyuhao’s Area

彩蛋

其實我也很喜歡拍照跟煮飯呦