我在 KKCompany Tomorrow Lab 的實習(MA)經驗分享心得
這篇文章分享我在 2021 年 7 月到 2022 年 6月的 KKBOX/KKStream 實習經驗,實習的過程分成兩個階段(導師指導階段、部門實作階段)。我是資工系出生的,對於後端很有興趣,所以在部門實作階段就進到 KKStream 實際參與開發團隊。
以下是我在這次實習計畫的收穫
- 培養解決問題的能力
- 培養寫出 clean code 的能力
- 熟悉使用 AWS
- 與 QA 部門討論如何提升 test coverage
- 與 PO 溝通理解需求,並設計 API
- 優化 DB 操作降低 API response time
除了以上硬實力以外,在心態上面我也更加知道自己想要什麼,讓學校課程學到的知識變得更有意義。在做專題研究時可以增加更多面向的思考方式。
這篇文章內容主要按照不同的實習階段規劃:
- 實習前的準備
- 實習的前兩週
- 部門實作階段
實習前的準備
在 3月的時候我就很積極尋找各種實習的機會,在 104 上看到 KKCompany Tomorrow lab 實習計畫。應徵的時候要回答幾個有趣的問題,像是「在電梯裡遇到 Elon Musk 你會怎麼做?」之類的。我那時候搜尋「電梯演講」相關的資訊,並且寫出了一個專屬於我自己的簡短自我介紹(在許多場合都派得上用場)。JD 上面提到會實際參與部門開發與測試,這邊是最吸引我的,畢竟在學校待久了真的會想要出來見見世面,這也正是我這次實習主要的目的。
投完履歷之後過了很久都沒有收到回應。正當我以為石沈大海,5 月中的時候 KKCompany 的 HR 打給我,介紹一下實習的規劃,以及傳了線上程式測驗的邀請給我。題目總共有四題,時間限制一個半小時。前兩題約為 leetcode easy 的難度,後兩題大約 medium。隱藏測資,繳交之後成績會馬上出來。我其中一題好像邊界條件沒有想到,只有 60 分,不過其他提都有拿滿,所以平均起來還是有 90 分(之後跟 HR 聊天的時候似乎聽到 70 分以下直接掰掰,所以題目送出之前務必想清楚各種機車測資啊!)。這邊也建議學弟妹寫完題目可以稍微記錄一下,因為面試的時候主管有問我做完題目的感想,不過我做完就忘了,所以只聊到為什麼我選擇使用 python,怎麼讓優化演算法,比較可惜沒有聊到更細節。
程式測驗結束之後總共會有兩次面試,都是使用 google meet。過程非常輕鬆愉悅,第一次面試主管非常仔細、專注地聽我分享做過的專案,也會深入問我遇過什麼困難、怎麼解決等等的。第二次面試的主管位階更高了,主要針對「我想要在這次實習學到什麼」,與其說面試不如稱為聊天,過程非常輕鬆,主管也讓我知道「啊~原來學校學的東西在業界也是很重要的」。
給想來面試的人的建議
- 重點放在自己做過的專案
- 熟悉每個專案的細節、遇到什麼問題、如何解決等等的
- 展現自己的熱情
- 做完程式測驗題可以簡單紀錄下,面試時會聊到「你怎麼想出作法的」以及「可不可以做得更好」
實習的前兩週
因為疫情關係,只有第一天要到公司報到、拿東西,之後都是遠距進行。報到的時候我們獲得了七本書,是由導師團精心挑選的書,接下來的兩個禮拜我們會選擇其中兩本閱讀,並在最後進行成果發表。
實習的前兩天排了滿滿的各主管 sharing,內容非常精彩,也接觸了很多不同領域的人,其中最有印象的是 Joshua 用幾個真實故事來跟我們解釋 Design Thinking,以及 Pecy 跟我們分享 KKCompany 的企業文化,可以感受到在這邊是非常鼓勵創新的。
經過兩天連續 sharing 轟炸後,我跟 mentor 進行了第一次 meeting;在瞭解我的想法後, mentor 也給了許多經驗分享,並決定選擇「邁向大師之路」以及「心態致勝」這兩本書閱讀,前者主要在談怎麼合作開發專案、怎麼設計程式、軟體開發原則等等,後者則是心理學大師的著作,主要探討「定型心態」以及「成長心態」,並教我們如何避免掉入定型心態。
接下來的兩個禮拜,我每天都會跟 mentor sync-up 我讀書的內容,討論一些書中內容的問題,還有多挖一點 mentor 的經驗分享 XD。這兩個禮拜的收穫非常多,因為是第一次準備要加入業界的開發團隊,這兩個禮拜的時間為我鋪下了非常好的基石。我學到的內容包括硬實力的「如何寫好 code 」,還有軟實力的「如何建立成長型心態」,把所有面臨的挑戰都當作學習的機會。比較可惜的是因為 WFH 的關係,沒辦法當面跟 mentor 或是其他實習生聊,不然應該可以獲得更多有趣的經驗 XD
匆匆兩個禮拜過去以後,終於來到 sharing 的這天,除了 mentor、HR 以外,這次也找來了許多技術主管,如果感覺對了就直接找去那個部門了(?我用心準備了我要 sharing 的內容,結合了我這兩週學習到的新知識還有自己以前的經驗,並跟 mentor 順過一遍,mentor 給了我許多有用的建議,包括思考自己的聽眾想要聽到哪些內容等等的。
那天我運氣不錯,抽到第一個 sharing,過程意外的沒有很緊張,也順便聽聽別的實習生都學到了什麼。發現大家都學到了好多東西,每個人在 sharing 之後都有幾個主管問一些有趣的問題,整個過程非常輕鬆。
部門實作
Sharing 完之後每個實習生都確定了自己在下個階段會去哪邊進行部門實作。我是到 KKStream 的後端部門進行實作,第一天跟主管還有 mentor 一起 meeting,告訴我接下來會進行哪些任務,還有會學到哪些東西。
隔天我的部門主管直接幫我安排了一個非常充實的學習清單
接下來的一週我可以用自己最舒適的步調學習新的語言、技術,也第一次接觸到了摩登的語言 GO(終於不用再寫古早味的 C 語言了🎉)
在 KKStream 的第一個 Project:
第一個加入的專案是一個串流平台的 landing service,主要負責把 operator 投檔的 meta data 正確地塞進後端資料庫(內部稱之為 landing)。在這個專案中我學習到了:
- Event streaming: 用 Kafka 以及 redis-stream 來訂閱投檔的資料,並且可以起多個 instances 來處理餵進來的 message
- Clean code: 由於這是我第一次參與開發團隊,很慶幸我的團隊有良好的 code review 機制,可以跟其他成員討論各自的想法,以及學習如何想出好讀、好維護的 clean code
- 實現 unit test:由於 Golang 有強大的 testing tool,讓我在實作的過程中可以寫 unit test,以及自動產生 mock interface。在寫 unit test 的過程中讓我更加領悟了 SOLID principle,以及在程式維護上更加不會犯錯
- 改善公司內部 library 的實作問題,如原本 Redis lock 的實作時可能會產生 race condition,我參考網路上大神們的實作來改善這些問題。
- 學習 AWS 基本的工具:ECS, cloudwatch, logstash 等
總體來說,在這邊開發的體驗滿好的,可以跟同事一起學習新的技術,也有良好的 CICD 流程,減少許多開發的 effort,也有完整的 code review,讓我們是在有共識的狀態下進行團隊開發。
第二個 project:
結束第一個專案以後,緊接著我加入了另一個平台的 client API service 的專案。主要負責處理給前端撈資料的 API service。不過因為設計架構沒有很 micro service,所以其實這個 API service 是包山包海的,除了 DB 拿資料以外,還要處理 login, purchase, playback, 串接外部服務 API 等等。
在這個專案中,我體驗了以下內容:
- 體驗 scrum 敏捷開發:每天的 standup meeting,以及 refinement, planning, retro meeting 等等。過程中我更加熟悉與不同領域的人員溝通,例如與 PO (project owner) 討論 spec 細節與資料呈現邏輯等。
- 召開多次 Design Review:在過程中我需要充分瞭解新 feature 的 spec,並設計相對應的 API 讓前端取資料。除此之外也要將取資料的詳細過程畫成 UML 讓 Architect review。在這過程中我學會設計 DB schema、撰寫詳細 API document、與前端溝通達成共識,還有我畫 UML 的功力也提升了不少。
- 優化 DB:除了學習如何最有效使用 index 以外,我也使用 aggregator 工具來優化 DB query 的次數,以及使用 multi-thread 來達成平行化取得資料,來降低 API response time。
- Migrate legacy code:由於這個專案繼承自一個歷史比較悠久的專案,所以內部有許多可怕的 workaround。我們團隊花了許多時間將凌亂的程式架構整理成較好維護的架構,如抽出 repository 層專心處理資料邏輯、service 層處理商業邏輯。在這過程中我對於如何寫出 clean code 有更深的體悟,也開始對 code quality 有更高的自我要求。
小 murmur:在開發這個專案的時程壓力真的偏大,常常會有因為時程壓力而放水 code review 的情況,也沒有時間寫 unit test,導致之後在改 code 的時候常常需要顧此失彼。再來就是 spec 常常一改再改,昨天才做完的 feature 今天一看又改了 spec,有時候會覺得蠻心累的,不過這就是工程師的日常吧XD 相信這些經驗都是學習的養分,讓我在未來更知道如何避免哪些事情發生,還有增加我與人溝通的能力。
總結來說,我在部門實作的這一年學到了非常多新的技術,也完整地體驗了工程師的生活(我同事都直接把我當作正職看待),不會有實習生打雜的狀況。更重要的是我認識了一群同樣對後端技術很有興趣的同事朋友們,在開發的過程中即使時程很趕但大家還是很盡力維持程式碼品質,平常閒聊的過程中也可以學到很多同事在其他公司的經歷,讓我更了解軟體工程界的種種大小事。
保持成長型心態面對工作上的挑戰
回頭來看,我覺得 Tommorow Lab Program 前兩週讀的兩本書「邁向大師之路」及「心態致勝」都對我之後的部門實作階段很有幫助:前者讓我更全面了解軟體開發上的各種技巧,以及團隊合作中可能會遇到的問題;後者讓我始終保持著「成長型心態」面對所有開發上的挑戰,即便時程壓力再怎麼緊迫,我都能心想著:「Wow,我又成長成更厲害的的工程師了呢!」
豐富的內部 Sharing 活動
除了工作以外,在 KKStream 這邊每週固定會有一些 sharing 的活動,內容非常多變,有推薦系統部門的成員來分享最新的 Machine Learning 技術,也有做過 open source 的大神來分享在 open source 專案的心路歷程。甚至也有跟工作完全無關的,像是我的技術主管分享他對清酒的研究,我覺得相當有趣。
在這裡,可以感受到每個人都很喜歡 sharing
參加部門 outing 活動
除了工作以外,這邊也會舉辦部門活動(不過 MA 沒有部門活動費,所以我是自費參加的)。在 team building 的旅行中我更加認識了每位同事,除了工作以外的他們其實生活都挺精彩的,有玩虛擬貨幣玩到晚上不用睡覺的,也有跟我一樣喜歡哲學,從亞里斯多德聊到尼采的大學長(?
總之,在 KKBOX/KKStream的實習經驗非常棒,也獲得許多寶貴的經驗
以上就是我的分享,謝謝大家看到這邊。