Thoughts💡 .Net Conf 2020 社群日 — 與會心得

Jayden Lin
Dec 20, 2020 · 8 min read

筆者任職於 Yahoo ,粉絲團:《程式猿吃香蕉🍌》

首先感謝主辦單位提供了這麼棒的活動,一連兩天的社群技術議程讓我收穫滿滿,在社群日所分享的主題並不限於 .Net 的技術,對於第一次與會的我感到十分新鮮,在此也要肯定微軟在台灣對技術社群的耕耘。

附帶一提,我目前所在的工作專案上並未使用到 .Net 的技術,會參加此活動實在是因為議程主題太吸引我,尤其是 91 App 主講的幾個主題。在實際參與後,也完全沒讓我失望,不僅滿滿的乾貨,也很啟迪人心。

此外,兩天活動中精心安排的「捕捉大神」活動設計也十分有趣,以集點的概念用 Line Bot 掃描在講者身上的 QR Code (如下圖所示),算是給了許多生性害羞的工程師一個由頭,可以多與講者交流,我自己也借此機會與講者小聊了一下。

(Line Bot 捕捉大神遊戲)

回歸技術面,此次我參加的議程有:

  • 非同步系統的服務水準保證:淺談非同步系統的 SLO 設計
  • 微型任務編排器 — 以 Process Pool 為例
  • 刻意練習:如何鍛鍊你的抽象化能力

以下會就這幾場的內容摘錄我的心得。

▍非同步系統的服務水準保證:淺談非同步系統的 SLO 設計

這一場是由來自 91 App 的講者 Andrew 主講,講者在一開始先說明了 SLO、SLI、以及 SLA 的定義:

(SLA, SLO, SLI 的定義)
  • SLO (Service Level Objectives) : 服務要達到的目標,例如:消費者註冊帳號驗證簡訊要 5 秒內發送給消費者。
  • SLI (Service Level Indicator) : 為了達到 SLO 要監控的指標,例如:監控簡訊需求發送到 Message Queue 的時間、在 Message Queue 中的等待時間、處理簡訊需求的時間等等。
  • SLA (Service Level Agreements) : 根據 SLO 跟 SLI 的要求所制定的協議,可能會涉及 2 方的合約。

講者提到消費者註冊帳號驗證簡訊的例子:消費者註冊帳號會發送簡訊驗證,而這些發送簡訊的需求會先進入 Message Queue 後,再排隊進行處理 (例如套用簡訊樣式等等),最後再呼叫第三方程式做簡訊發送。而此服務的 SLO 要求是,在簡訊的需求發送後,5 秒內要能呼叫第三方程式做發送。

然而,此 Message Queue 是與行銷部門的行銷簡訊發送功能所共用,所以某次當行銷部門大量發送行銷簡訊時,便發生了 Message Queue 堆積的情況 (如下圖所示),無法完成 SLO 的要求。

問題本身並不難理解,許多人可能會立馬想到使用兩個不同的 Message Queue 來做分流,或是加開簡訊處理的機器來消化掉 Message Queue 堆積的情況,當然這些都是解法,但讓我驚豔的是,講師默默地提出靈魂拷問:

『看能不能以系統化的方式來解這個問題。』

這句話給了我非常大的啟發,當我們面對問題的時候,是採用兵來將擋水來土淹的方式一一處理掉,還是說我們會去將問題抽象化,探索是否有更系統化的做法來推演這類的問題?

接下來,講師採用限制理論(Theory of Constraints,TOC)的框架來思考這個問題:

  • 找出瓶頸:限制理論提到,瓶頸前一步驟,通常會有堆積的特徵,由此我們可以判定簡訊處理那這邊是瓶頸。
  • 充分利用瓶頸:在改善之前,先不要浪費,充分利用瓶頸的產能
  • 提升/打破瓶頸:透過加開簡訊處理的機器來提升瓶頸,或是另開 Message Queue 來打破瓶頸。

雖然推演出一樣的結論,但重點在於使用系統化的思考方式 (例如:使用限制理論來思考) 來解決問題。

雖然大學時期便已讀過 Goldratt 對於限制理論的幾本經典書籍(《目標》、《絕不是靠運氣》、《仍然不足夠》以上列出幾本,有興趣的朋友可以看看),但我卻並未能將這些思考方式應用於實際工作上,講者在這場講座上強調了這個『抽象化思考』思維,讓我收穫甚多。

▍微型任務編排器 — 以 Process Pool 為例

這一場同樣是由 91 App 的講者主講,講者 Steven 提到,因為業務需求需要手刻 Process pool ,並實際以程式碼手把手帶大家看 Process Pool 從零到有的開發,以及設計思路。架構圖如下所示:

簡單來說,不同的任務會有不同的 Process pool 來處理,並且透過 Thread 來平行處理任務,是一個典型的 Producer / Consumer 模型。

『模型畫得出來,但能不能做得出來?』

同樣是來自講者的靈魂拷問,筆者我自己在目前的公司也曾接觸過手刻 Process Pool 的系統,深知這類系統對於基本功的要求,其對於多執行緒、例外處理、狀態保存或分享等方面都很需要經驗,若是牽扯到任務之間的相依性則更為複雜。

結束時我有提問一個關於狀態保存/分享的問題,講者回答大意是:當 B 任務需要 A 任務的資料時,A 會將「資料已經處理完成」的訊息透過 Message Queue 來傳送,對應的 B 任務得知資料已經準備好,便會進行下一輪的處理。

講者在講座中,帶我們實際走過一遍手刻 Process pool 的 POC 附帶 Live Demo,算是十分有誠意,收穫頗豐。我認為這類微型任務編排器很適合當工程師平時的作業練習,來磨練自己的功力。

『當基本功愈扎實,

能提出的解決方案便能愈多元』

▍刻意練習:如何鍛鍊你的抽象化能力

這一場是由 91 App 的講者 Andrew 以及 Fion 主講,再次強調了抽象化能力的重要性。

講者舉例,用「日心說」來解釋太陽系天體的運行,會比用「地心說」來解釋容易得多,因此選擇一個好的「模型」十分重要,而好的模型又需要好的「抽象化能力」,講者提出好的抽象化的幾個重點:

  • 要能去除對象中不必要的「細節」
  • 但要能維持對象的「特徵」
(地心說與日心說的差異)

而要養成這個抽象化的能力,則需要「刻意練習」,強迫自己去發現問題,用抽象化的方式去拆解問題,這也呼應到前一場「 非同步系統的服務水準保證:淺談非同步系統的 SLO 設計」講座中,提到使用限制理論(Theory of Constraints,TOC)的框架來思考 SLO 的問題。另外,講者也提到利用製作 Interface 的方式來抽象化問題的手法,我個人認為這是一個非常實用的作法,很值得參考使用。

Fion 講者主講的部分,提及她如何用抽象化思考,完成 《康威生命遊戲》這個經典的題目,其中包含思考:

  • 時間的紀錄方式
  • 細胞的可視範圍
  • 演化的時序計算等等

講者製作了許多精美的圖片,來演繹她的思路,待官方釋出投影片時,非常建議大家可以下載來看看。

(大會已釋出簡報,也可以連結參考:https://github.com/Study4/DotNetConfTaipei2020/tree/master/slides)

(康威生命遊戲圖示)

▍心得

我在先前的文章也強調過「抽象化思考」在計算機科學(Computer Science)學科中的重要性,有機會在講座中聽到實際案例是如何利用這些思維來解決問題時,還是覺得很開心。

幾場講座下來,我認為難能可貴的是講者不僅提供實際案例,更提供其背後的思路,讓聽眾知道講者「是怎麼推演出這個結論」(包含 Andrew 講者用限制理論推演其思路、Steven 講者手把手實作 Process Pool、以及 Fion 用圖象化解釋其抽象化思路),而這些思路是十分有價值的,它提供一個思考方式,而不只是答案。

整體而言是非常棒的活動,明年還會想再參加,謝謝講者與主辦單位。

若是喜歡我分享的內容,歡迎幫我按個拍手,可拍 50下,給我一點鼓勵,或是加入我的粉絲團《程式猿吃香蕉🍌》,一起分享軟體知識與心得!

程式猿吃香蕉

喜歡將軟體知識以簡單生動的方式講給你聽

程式猿吃香蕉

『來點更營養的軟體知識,吃香蕉吧!』我們是一群軟體開發愛好者,喜歡將軟體知識以簡單生動的方式講給你聽,順口好消化,營養又健康!

Jayden Lin

Written by

Yahoo 擔任 Lead Engineer,負責廣告系統,帶團隊做跨國開發。也是《程式猿吃香蕉》團隊創辦人,喜歡將實用的軟體知識以簡單生動的方式講給大家聽 😄😄😄

程式猿吃香蕉

『來點更營養的軟體知識,吃香蕉吧!』我們是一群軟體開發愛好者,喜歡將軟體知識以簡單生動的方式講給你聽,順口好消化,營養又健康!