2019 LINE Developer Day – Project Management and Agile

近十年來(其實應該超過十年了),敏捷開發逐漸在軟體工程中佔有一席之地,這個的定義大概就是如果有人說他做軟工的,那你可能會回一句「所以你對 Agile 應該很熟吧」

Speaker: Minoru Yokomichi

在 LINE DevDay 的第二天下午,有個議程也是在分享 LINE 內部是如何進行專案管理的。講者所在的部門很特別,稱作「Effective Team and Delivery Department」,由名稱可以看出來這個部門的重心。通常接著的關鍵字就是 Project Management 、Product Management 、 Agile 或 Scrum,果然講者的背景也是如此,不過多了 Engineering ,這也是符合 LINE 的企業文化。

To make “Teams” and “Delivery Processes” more effective

左邊的子部門 Delivery Management Team 中,是由一群 TPM (Technical Project Manager) 組成的。 LINE 的文化認為 Project Management 對於 Product delivery 是很重要的,但 Project Manager 這個角色並不是那麼地被需要;也就是說,LINE 的 TPM 負責的並不只是 Project Manager 這個角色任務。

產品開發的三環相扣

上圖可以看出他們對於產品開發中,對於 Product/Project Management 與 Development 各自的角色工作定義,一般而言對於前兩者的角色也就是稱為 PM (Product Manager/Project Manager) ,而後者就包含了 Engineer / QA 。

LINE 的 TPM 組成
彼此工作是有區隔,但沒有明確界限

而講者藉由 R & R 的示意圖,說明 PM/Eng 雖然工作是有各自的職責,但在實際上的產品開發合作上,卻不會那麼壁壘分明。當彼此的界限模糊的時候,就不容易有事情掉在地上沒人做的時候了,不過以我自己的經驗,我認為要達成這個目標,除了企業文化能支撐之外,團隊的成員心態也非常重要。而心態的養成,也與主管甚至高階主管的支持有非常大的關係。以這個角度看,也許 LINE 做的很成功?(因為沒有在 LINE 任職,有些內部衝突是看不到的)

談完了左邊的,接著拉到右邊的子部門 Lean & Agile Team。在這方面, LINE 的 Agile 也奉行「Be Agile, not just do Agile」,以落實 Agile 的價值與原則為主,而非一昧採用其方法論。

支持性的工作為目標

整個部門工作重心是以 Support 其他部門為主,這中間包括了提供訓練、協助解決問題以及建立內部跨域的社群(這點就跟目前很多的社群 meetup 是一樣的意思)。

簡介完了之後,搭配而來的就是實際例子,講者是以 LINE News 的產品開發為例,但我想組織圖應該是可以通用的。

初始的組織圖

通常一間大公司的組織也就大概長的像這樣子,這類的組織特性是有管理者們層層把關,做一個既有產品的優化是很容易的,因為管理者(或是資深的老鳥)可以靠著過去的經驗來判斷;但若是產品還在初期的階段,從這個角度看上去,就是看到層層的山頭了。

從組織圖迭代的演變,我們可以看得出來,工程師永遠是最好講話的(笑)。目前看起來,左方的管理群們一時之間是很難拆開的,這個我想工作個十年的人大概都可以理解是怎麼一回事吧(茶)。

接下來,講者也介紹了以前述三個核心為本的,各式各樣 LINE 提供的 Training / Workshop / Team Building / Community ,這些建議直接連到投影片去看。個人覺得這些文化養成雖然不見得能讓 LINE 變的強大,但是很有機會能讓 LINE 變的偉大的。

最後,放一張 Product Management 的 global view 為結尾(其實我不知道為什麼寫了個 Thailand 卻什麼都有啊)

Global view of LINE Project Management

2019 LINE Developer Day – Hadoop Cluster Federation With 2k+ Nodes

上週以 LINE API Expert 的身份參加了今年於東京台場舉辦的 LINE Developer Day 活動。其中有一場硬底子的分享我覺得蠻值得一提的,簡單一句就是用 Hadoop 在上層做 Cluster Federation ,總共管理了超過二千個節點。

2019 DevDay 100+PB Scale Unified Hadoop Cluster Federation With 2k+ Nodes
100+PB Scale Unified Hadoop Cluster Federation With 2k+ Nodes

之所以講硬底子,因為 LINE 工程師在進行這個擴展/遷移節點的過程中,遇到的問題有送 upstream patch 回原本的專案 repo (簡單列一下投影片有提到的,照看起來應該還有不少):

各式的服務,各式的資料

幾年前還「只不過」是一個即時通訊軟體的 LINE 。時至今日,LINE 本身的服務量已經是愈來愈大了,開始嘗試提供各式各樣的服務,想當然而所有的資料格式欄位(以 SQL 的角度來看)各有不同。

2k 個資料節點,存了超過 100PB 的資料

看起來很棒,實際上對於 Data Platform 部門的工程師則不然,如果羅馬不是一天造成的,這些服務與資料並不是同時打造好提供給大家使用的,這是日積月累的使用記錄,加上服務系統迭代更新後,產生的資料。可以參考去年的演講,那時候的資料看起來還沒有這次的一半多。所以理想與現實的差距,造就了 10 座以上的 HDFS Clusters ,在系統維護與軟體更新上都拉大了難度與時間。各個 Cluster 的版本不一,能提供的 API 以及工具也無法統一。最後工程師們決定整頓一下,一統公司內的 Hadoop 江湖(想想一次可以送 job 在 2k+ node 上跑,想到就…..)

目標: 「一法度衡石丈尺,車同軌書同文字。」

當然改變不是一蹴而就,當年(應該是每年)留下來技術債也是要還的(OS: 砍掉重練就不用了…),工程師們決定邊開飛機邊改引擎 (…)。所以定了幾個 Criteria ,包括 Minimum Downtime、Incremental Migration 以及最重要的 High Security Level/Minimum Risk 。

講者簡介了幾種他們一開始規劃的想法,比如建一個新的,然後把所有的資料往裡面搬。這個當然是一個理想但不實際的方法,除非你不在意 downtime 、不在意相容性、不在意因此要多買一倍的儲存空間。另一個進階的想法則是把最大的 cluster 再擴大,然後把其他的 cluster 整合進去,這個遇到的問題是實務面的:最大的 cluster 沒有使用 Kerberos;有兩個非常大的 cluster 是有頻繁的用戶存取的;整合完, Hadoop 還是需要再更新。最後方法就採用了 HDFS Federation 架構來解決這個問題,基本上利用 HDFS Federation 可以有 multi-namespace 的特點,來支援後續的 data/service migration 。

Start small, Iterate fast.

但即使如此,在實作上還是運到了一些問題,有經驗的工程師聽到這裡大概也可以猜出來,各 cluster 原始的版本相容性會直接地影響到 merge 的成果,在這中間的過程中踩了不少雷,也因此提出 patch 增強(或修正) upstream 原有的功能。而這些的修改,都是在一邊更新 cluster 並作適度的 ETL 時,同時間也能讓原有的系統能夠持續運作,我想這點要對 Data Platform Dept. 的工程師及架構師們致敬。

最後放上一張我認為很能代表這場演講的投影片。

In short words, you do this and achieve that…. (amazing)

20190628 Chatbots Meetup 10

Evan Lin 邀請,6/28 參與演講了 Chatbots Meetup 10 的第二場,分享如何在 Google Cloud Run 上部署 LINE Bot 的經驗談。(好像拖稿很久了)

因為時間的關係,到天瓏書局時已經開場講到一半啦。就錯過了 Evan LinWrite Image Proxy Server for LINE Bot in Go。就座的時候,LINE API ExpertCaesar Chi 正在介紹 LINE@ 2.0 offline to online ,分享如何透過 LIFF + Push 機制,讓廠商能更有效率的省錢轉換,並且也跟會眾們分享在官方帳號 2.0 轉換後的衍生想法。

接著就是我上台分享 LINE Bot on Cloud Run: 使用 line/line-bot-sdk-go ,本來是想介紹 LINE Bot on GKE ,不過準備的時候發現會需要花點時間講 K8S ,就不好講 LINE Bot 開發了,所以選了一個我也沒用過的 Cloud Run 來試看看。詳情就直接看投影片吧,然後順便把 source code 整理一下放上來

最後閃電講,直接貼共筆的圖好了 :Q 我覺得 Evan Lin講解比較詳細,哈哈,偷懶一下。

Fix: Unit “containerd.service” has failed

When I upgraded yum packages, docker service had stopped. So I check the system status try to figure out the root cause….

After google ‘Subject: Unit “containerd.service” has failed’, we can find a related github issue. It seems to be a containerd problem than a docker problem, and here’s the fix: (the following shows the before and after)

[GCP] Create disk from snapshot of another project

Step 0: create snapshot from desired disk, example name: disk-snapshot-20171026

Step 1: copy the selfLink from snapshot’s equivalent REST response: projects/another-project/global/snapshots/disk-snapshot-20171026

Note: One can get the link via the following command:

Step 2: execute the following command (replace current-project and asia-east1-a with your own project and zone, respectively)

&

[docker] Multi-stage builds

Consider the following scenario: you are going to rolling update your cluster, and it turns out your network bandwidth is limited for some reason and size of built docker image is not small enough. What’s worse, every instance of cluster will need to pull the docker image before start-up… Read more →

CoreOS remove early-docker since 1284.0.0

It happens the docker daemon wasn’t alive when I login to the console.

After review the release document, it seems early-docker.target should be remove in all related target.

Ref: CoreOS Release 1284.0

Update salt from 2015.5.3 to 2016.3.2

When reading salt’s source code, it seems we have a ‘source_hash_update’ option on “archive.extracted”, however when I added so, salt complains:

Read more →

Developing with consul on Macbook

For development use, we need to have consul running on localhost. When using a Macbook (Air), we need to specify the “-bind=0.0.0.0” and “-client=0.0.0.0” in order to have programs (tests) access to the consul agent in the container:  Read more →

重整 Exif 資料

多想幾天,可以不用重新發明輪子。 :p
Read more →