LY Corporation Tech Blog

支持 LY Corporation 和 LY Corporation Group (LINE Plus, LINE Taiwan and LINE Vietnam) 服務,宣傳技術和開發文化。

Beyond Development: Exploring the Multifaceted World of Engineering at LINE as a TECH FRESH

前言

嗨大家好,我是郭子麟 Brian。我目前就讀於台灣大學資訊工程所碩一,現在於 LINE TRAVEL 擔任 Backend Intern。

今天我想分享的主題為 Beyond Development。我想透過這個主題和大家分享原來一個具有規模的應用服務,除了開發以外還有非常多細節需要重視。過去還沒進 LINE 時,我對於軟體工程師的刻板印象就是撰寫前後端、開發功能提供使用者操作,僅此而已。但大家有沒有想過,如果今天工程師的任務就只有開發而已,那我們到底要怎麼確保一個服務在經歷高流量能不能表現正常,亦或是發生問題時,我們要怎麼快速知道並改進?以 LINE 為例,在台灣有高達 9 成以上的人使用 LINE 的服務,因此除了開發便利的功能給使用者外,一個 robust 的應用程式更需要保證其服務的正確性與可用性,並在發生緊急狀況時能夠即時監控並改善,這些其實就是透過 Observabilit( 可觀測性)這個概念實現。因此在接下來的篇幅,我會先和大家介紹什麼是 Observability、Observability 三本柱的介紹,並透過 LINE Travel 實際發生的一個例子,說明 observability 如何幫助我們快速找到問題並除錯。最後,我也會和大家分享我是怎麼準備 LINE 面試的,並帶大家看看當一個 LINER,究竟有什麼超棒的福利!

介紹

Intro to Observability

Observability,中文翻為可觀測性,目的就是在於讓一個服務變得可以觀測。那這樣的特性能為我們帶來什麼好處呢?其實好處非常多,以下列出我認為重要的三個優點:

  1. Proactive Issue Detection: 有狀況發生的時候,允許我們建立實時監控儀表板(dashboard)以跟蹤服務運行狀況。當服務回應速度降低或狀態不理想時,我們可以立即在儀表板上看到。這有助於我們在問題變得更嚴重前先行偵測並解決。透過 dashboard 就能知道在哪一段時間服務回應速度或狀態不理想
  2. Root Cause Analysis: 當服務性能降低或出現 bug 時,可觀測性可以提供大量有用的數據和信息,協助我們快速定位問題的根源。這樣我們就可以更精確且迅速地解決問題,降低了修復時間和成本。
  3. Performance Optimization: 通過持續的觀測服務,我們可以准確判斷服務的性能瓶頸在哪裡,並瞭解是哪些服務間的互動出了問題,進而找到改善的方式。這不僅能提升各項服務的效能,也能更有效地使用資源。

如何實現:Observability 三本柱

Logging

在後端開發中,每個來自用戶端的請求(request)都被視為一個獨立的事件,而我們為了確保這些事件的狀態和行為可順利追蹤,針對每個事件都會紀錄一則 log。

一則完整的 log 通常會紀錄的訊息包含:請求的屬性(request properties),例如請求的時間、來源、目標,請求的內容等,一同記錄下來以側記每個請求的特性。此外,服務的回應狀態或當請求出現錯誤時的錯誤回應(Error response 等資訊也會被寫入 log。這些紀錄的內容可以讓開發者洞悉服務的運作狀況,並在問題發生時,有充足的資訊進行排查和修復。

利用可視化工具 Grafana,我們可以結合使用資料搜集服務 Loki,以收納和查詢這些 log。Loki 提供了一個集中化、統一的方式來存儲和訪問這些 log,而 Grafana 的強大查詢功能,則讓我們能夠透過建立查詢(query)的方式快速找到某些特定的 log。

舉例來說,當我們想查找一段時間內的錯誤訊息(error message)時,我們可以在 Grafana 上建立一個查詢,過濾出在這段時間內所有包含 error 訊息的 log。這種靈活、即時的查詢能力,使得 log 變得更為活用,也讓問題排查和服務監控的工作更加簡單和高效。

Metrics

在後端監控中,指標(Metric)是另一個重要的數據來源,它由 ID 和樣本 Sample 組成。ID 是 Metric Name 和標籤 Label 的結合,用以標識一個具體的評量項目。樣本則是 Value 和 Timestamp 的組合,記錄該度量在特定時間點的數值。

指標的一大優勢在於固定的開銷(Constant Overhead)。它類似於字典的結構,ID 是固定的,而值會隨著時間而更新,這樣的結構使得存取和更新變得極為高效。

除此之外,指標的數據化特性也讓我們可以簡單地設置警報規則(Alerting Rule)。例如,我們可以設置一個規則,如果在一段時間內,發生 400 Bad Request 的次數超過特定的 Threshold,就會觸發警報。這樣的警報可以透過發送電子郵件或與工作通訊軟體串接,以迅速通知相關負責人員。這種及時的警報機制,能讓我們及時察覺並解決問題,提升服務的穩定性和品質。

Traces

Traces 則提供了一種可視化的方式讓我們能完整地追蹤每一個請求(Request)在系統中的流動情況。Traces 記錄了一個請求從進入系統開始,經過哪些服務,到最終完成的完整過程。更重要的是,它也會詳細記錄每一個服務處理該請求所花費的時間。這種資訊對於了解和優化系統的性能非常有價值。

由於 Traces 的視覺化特性,我們可以透過它快速的了解某一個 Component,可能是一個模組或 service 在處理請求時的行為和性能。例如,如果某個服務的處理時間過長,我們可以在 traces 中清楚地看到這狀況,進而對那個服務進行深入的分析和優化。

From 20 to 2 Seconds

在實際的後端開發中,我們的 Travel Team 深深體驗到 Observability 的重要性,並透過它即時發現並改善問題。其中一個例子就是我們的 "Hotel Query" 功能:

Hotel Query 是 LINE 旅遊其中一個重要功能,使用者只需要輸入想去的目的地、出發時間、以及人數,按下搜尋後,系統就會返回一個飯店列表。然而在前陣子,我們發現 Hotel Query 在某些請求下,需要超過 30 秒才能返回結果。照理來說這樣的操作不應該花費如此久的時間,因此很明顯說明服務在某些環節出了狀況。

而在過去,如果沒有 Observability,我們遇到這種狀況根本束手無策,只能逐步檢查 source code,試圖找出可能讓程式執行異常的程式碼。但這樣的方式既耗時又沒效率。

因此我想分享的是,我們如何透過過往所建立的 Observability 機制,讓我們可以快速且準確地找出問題並解決。

首先,我們設立了回應時間的指標(Response Time Metric),從中我們即時發現 Hotel Query 發生異常。

接著,我們進行日誌搜尋(Logging Search),試圖查找錯誤訊息,並了解到問題是出在與 ElasticSearch 溝通時,服務出現了執行時間異常緩慢的問題。而這就讓問題從整個服務的範圍將縮到與 ElasticSearch 串接的程式碼片段。

因此我們重新檢視了相關的程式碼,發現是一段程式碼中需要進行兩個陣列的比對,但因為演算法設計不好的緣故,做了非常無效率的比對,導致複雜度達到 O(mn)。

而發現這件事情後,我們馬上著手改善程式碼,最後透過利用了 HashMap 的空間換時間特性,使陣列間的比對效率大幅提升,複雜度降到 O(m+n)。

以上的故事說明了透過 Observability 的實踐,我們即時地發現了問題,並迅速地進行了問題的定位和改善,顯著提升了服務的性能和用戶體驗。

How I Prepare for LINE Interview

再來,我想跟大家介紹一些比較輕鬆的,也就是我當初是怎麼準備 LINE 的面試的!

首先我想和大家分享一些我認為對面試很有幫助的 tech stacks:

Tech Stacks You Might Need

第一個就是 OOP我認為 OOP 非常重要的,在 LINE Travel 我們會透過 clean architecture 的概念去撰寫程式碼。它的核心概念是將程式碼解耦,OOP 能夠在這塊幫助你很有條理地梳理每段程式碼負責的角色。

再來,如果你想當 backend engineer,至少需要熟悉一個 backend framework。以 LINE Travel 為例,我們就是使用 Node.JS 為主的 Express。如果你擅長用 Python, 你也可以嘗試使用 Django 或 FastAPI。此外,backend 最常做的操作就是讓 application 與 database 做連線來處理各種資料。因此熟悉至少一種 database 的操作,不論是 SQL (PostgreSQL, MySQL) 或 NoSQL (MongoDB) 我認為會對後端技能有很大的幫助。總之,如果能夠熟悉一個框架、資料庫並且善加利用它們去完成一些專案,不僅能夠讓你更熟悉這些技術,也能讓你的履歷更加分!

至於比較進階的部分如 CI/CD 及 testing,在學生時期可能比較少機會能夠去接觸到這樣的技術。但它其實在整個軟體開發服務的 cycle 上是非常重要的,可以說是與開發同等重要的流程。因此有興趣的同學可以自己去摸索這塊領域,並嘗試為你的專案寫一些測試,讓整個服務是更穩定、robust 的。特別是寫測試這件事情,與學生時期把東西做出來就好的概念差很多。大家可以多看看測試相關的技術文章(unit test / integration test / e2e test),就會知道寫測試之於一個有規模的應用程式是必要的,它能夠為我們的服務帶來穩定、高品質且不易出錯的優點。

最後是 Docker。Docker 能夠建構出一個乾淨的環境,讓我們不用考慮各種環境 issues 去開發應用程式,並且確保服務能夠在不同的 hosts 運作。這項技術簡化了部署過程,減少了因環境差異引發問題的可能性。此外,Docker 能夠將應用程式隔離在容器中,這不僅能增強安全性,也提高了軟體交付的整體效率和可靠性。

那除了具備這些技能以外,我們要怎麼向面試官證明你會這些技能呢?最好的方式,就是綜合這些技術去寫 side projects。像我當初針對面試,就有分享一個過去我基於上面提到的這些技術所撰寫的一個 side project。這樣的話,就能夠很容易地說服別人說你懂這些技術。而不是你在你的履歷寫你會這些東西,卻沒有實質的方式證明你會。所以,Side Project 真的非常重要啊!!!

Referring to Other's Experiences

LINE TECH FRESH 的制度行之有年,網路上其實有非常多的資源。我當初也是受惠於這些人的分享,了解到需要準備什麼題目,並從中獲得許多面試的技巧並吸取他們的經驗。

Also, Belief Matters

最後來分享一個有點無厘頭的 XD。我是一個還蠻迷信的人,而在 LINE 面試前一個禮拜,我聽到一首歌就叫做 LINE。當初面試前我真的每天都在聽,甚至面試前五分鐘都還在聽,總感覺聽了 LINE 就一定會上 LINE 哈哈哈。想不到還真的讓我上了!雖然是沒有什麼科學根據的方式,但有興趣的同學還是可以嘗試看看!

How is it like to be a LINER

那麼到底在我實習的這段期間,我對於在 LINE 工作有什麼感想呢?接下來將跟大家分享我在 LINE 的所聞所感以及 LINER 有什麼 work life balance 的地方!

Organization Culture at LINE

我在 LINE 感受到的企業文化可以歸納為三點:Embracing Changes, No Stupid Questions, and Everyone Matters.

Embracing Changes

我認為在 LINE,各個 teams 都非常樂意且積極地接觸新技術。因為在軟體工程領域,變動的速度實在是太快了。舉例來說,一年前大多數的人根本不認識 LLM,也沒想過它現今能夠如此盛行;沒有人想過 ChatGPT 可以為我們的生活帶來如此重大的改變,因此接受、學習並擁抱這些改變是必要的。而我在 LINE 工作的期間,真的可以感受出大家非常重視最前瞻的技術。只要一有新技術釋出,我們就會有同事自行組讀書會或 workshop 和大家一同鑽研,並發想這樣的技術可能可以怎麼應用在 LINE 的服務上。我認爲這樣的氛圍能夠讓我們持續進步,也能讓 LINE 各項服務變得更好!

No Stupid Questions

再來是沒有笨問題這件事。過去的我可能會不太敢問問題,因為怕別人覺得這太基本,為什麼還需要問。但在這邊,不論是 Travel 或其他 teams 都非常樂意幫助我解答各種疑難雜症,並且會很細心、很用耐心地手把手教我一些對他們來說可能是非常簡單的任務。此外,在 LINE 真的有非常多各個領域的專業,從 Dev, QA 到 SRE,軟體開發的整個流程,都有對應的專家能夠提供我們非常多的幫助與建議。我非常感謝有這樣的團隊氛圍,讓實習生不會覺得自己很不足,反而能透過不斷地請教、學習,從中獲得更多的經驗與硬實力。

Everyone Matters

最後,對我來說非常有感觸的是在 LINE,每個人都是重要的。過去聽其他朋友會分享他們的實習就像是去打雜,學不到什麼東西。但是在 LINE,我完全不這麼認為。像上面提到 Observability 的概念,都是我的 mentor 與我一同討論學習計畫,幫助我熟悉這些技術,並將它真的套用在 LINE 的服務上,解決真實存在的問題。我認為 LINE 不會因為實習生還是學生的關係,就讓我們只做很簡單的任務。反而是更加重點地栽培我們,讓我們能夠學習在學校看不到的技術與新知,這點真的非常感動!

Life @ LINE (Happy Happy Happy!)

到了尾聲,就讓大家看看最開心的部分 XD。在 LINE 我們會有 team buildings,可以去吃牛排、壽喜燒、頂級自助餐等等的!(口水又開始流了

然後如果喜歡熊大的同學,真的不能錯過這個有三公尺高的熊大!他一年四季會根據不同節日變裝,還有自己的生日會打扮的漂漂亮亮亮亮的。來 LINE 上班的每一天在一樓就能看到他,真的是非常幸福啊!

再來是每層樓都有的按摩椅!這真的超級棒,只要先預定時段就能夠使用。我有時候吃完飯就會這邊睡個午覺,或是偶爾坐在按摩椅上寫程式?哈哈哈總之真的非常舒服。然後我們還有按摩師傅進駐在 LINE,公司也有提供補助。我們一樣可以透過預約的方式就能直接在公司內的按摩室享受到超級舒服的按摩療程,是不是心動了!

結論

而擔任實習生,也有非常多演講的機會。在 LINE 的這段期間,我已經有兩次的分享經驗。能夠在台上跟大家分享我學習到的新技術或一些感想,這份經驗對我來說真的非常寶貴!過去在學校可能只有期末專案時有機會上台分享自己做的事情,好像也沒什麼機會能夠有一個舞台讓你分享你所鑽研的技術或任何帶給你成就感的經驗。但在這邊,只要想分享,大家一定會不遺餘力地幫你找到合適的機會,滿足你的分享欲