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,持續更新!
- iOS/Swift
– Code AutoLayout
– 以編程方式使用 Auto Layout 讓你直覺又簡單地設計 App UI!– 封裝 Code Auto Layout 工具 – PromiseKit
– SwiftUI & PromiseKit:讓 Alert 樣式統一又可復用 打破彈出視窗的惡夢– IGListKit-
– IGListKit 的演化:一起來看 Instagram 如何逐步解決 App 問題! - Android/Kotlin
- Web/Angular8
– 後台– 官方網站 - Backend
– asp .net core– .net console– RabbitMQ– docker– Kubernetes
– 闖入 GKE Google Kubernetes Engine — 生成鏡像到部署我的第一個應用 (1) – Redis– Container
– 一切使之容器 — Container with Application (1) – 一切使之容器 — Container with Application (2) - Cloud
– Google Cloud Stroage– Cloud Firestore– Elasticsearch / logstash / kibana – Firebase– Cloud Error / Cloud SQL– Cloud Schedule– Cloud Kubernetes– Cloud memorystore for redis– Cloudflare– Cloudinary– Cloud Build– Cloud Run - DevOps
– Agile– jira– Cloud Build– Pipeline– GitOps– ChatOps– Container– Gitlab-CI/CD– Fastlane– Continuous Integration– Continuous Delivery– Microservices– Infrastructure as Code– Monitoring and Logging– Communication and Collaboration– Azure DevOps
—
沒錯,這就是最終解決方案的技術棧,其實現在內部已經把它當成一個產品在運營了,後面會更加提到。可以看到有大堆的技術還沒產生文章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 也可能淪為形式,一開始真的會感受到大家對於這個專案或自己做的是沒有感情的,甚至還做不出來,也不太求救,好像只是一個,每天早上要站著的會議。
新手後端
抱著好想工作室的精神,認為每個人只要想學,就一定會做出一番成就。我大量了建置完整的後端環境、底層架構,這時候後端其實只要實現商業邏輯,剩下的都已經自動化。開發流程就像這樣:
- 領到卡片任務
- 查看卡片任務中的用戶故事與目標
- 查看卡片中 Leader(我)建議的設計
- 拖曳卡片至執行中
- 創建新的功能分支
- 執行軟體設計與實作
- 撰寫單元測試
- 提交分支並且發送 Pull Request
- Auto Run Pipeline 執行建置、測試
- 確認 Pipeline 執行成功後拖曳卡片到 Review
– 如果失敗必須修正後重新提交 - 進行 Code Review
- 合併到 develop 分支
- 合併後自動觸發 CI/CD
- 自動建置、測試、部署
- 自動 打包 docker image
- 自動推送到 Private Container Repo
- 自動部署到 Kubernetes 中
- 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

站立會議、需求會議

UI/UX 的加入
2019 年底我們找來兩位非常有熱誠的 UI/UX 設計師,之前都是配合兼職的設計師進行專案,我們覺得時候到了。這兩位設計師目前的表現也很棒!
終於我們的團隊成行了!Frontend、iOS、Android、Backend、PM、UI/UX Designer、QA
2019 年底總結
2020年的 1 月尾牙前我嘗試做了一場對於 2019 的年底總結同樂會
年底總結同樂會

做了幾個公司有趣的數據:
- 大家今年的 Commit 數
- 各個專案技術分享
- 特別獎
1. 筆記王2. Commit 數最多3. 去年年度OKR 分數最高者 - 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
彩蛋
其實我也很喜歡拍照跟煮飯呦


