既然疫情嚴重,連假就在家加班吧!

— Weihang Lo 2020.4

這裡是 WWW 第拾貳期,Wow Weihang Weekly 是一個毫無章法的個人週刊,出刊週期極不固定,從一週到五年都有可能。初期內容以軟體工程為主,等財富自由後會有更多雜食篇章。

Words Are Hard - An Essay on Communicating With Non-Programmers

以直白的口吻,分享和不同背景的人講解技術的法則。節錄重點如下:

  • 避免用過多行話
  • 放尊重點,不要擺出紆尊降貴的姿態
  • 給技術解釋加些人性生動的類比
  • 視覺化圖表比口語更易理解
  • 承認自己不熟,但可花時間研究

願我們一起打破工程師古怪又難溝通的刻板印象。

The Raft Consensus Algorithm

最近嘗試貢獻 TiKV,順便複習一下 Raft 共識演算法 Raft 主要訴求是 Understandability,因為 Paxos 太複雜(無誤),Raft 的 server 分為三個 state:

  • follower:所有非 leader 的 server 都是 follower
  • leader:所有 client request 都會送到 leader,一個 Raft group 理論上只有一個 leader
  • candidate:達到 election timeout 的 follower 會把自己提升為 candidate,並向其他 server 發出訊息:「請 promote 我當 leader」

而 Raft 主要有兩個的步驟:

  • Leader Election:從 follower 中投票選出 leader,可以處理 split vote
  • Log Replication:將 state machine 以 log 形式複製到每個 server,大多數的 server 回覆後才會 commit change

不贅述了,這個簡單的動畫教學很清楚點出 Raft 最重要的核心元件,當然自己看論文 😈。

We need tool support for keyset pagination

這篇文章的重點只有一個:不要使用 offset 來做分頁。原因如下:

  • offset 的 SQL 標準定義是先 fetch 所有 row,再丟棄被 offset 掉的 row
  • 承上,小 offset 效能影響不大,高 offset 就很慘
  • 若在計算 offset 時,同時 insert 新 row,就可能拿到重複的 row
  • 不論 SQL 還是 NoSQL database 都可能受影響

哪些 SQL 可能會有這樣問題:

  • OFFSET keyword
  • 雙參數的 LIMIT [offset, ] limit
  • 一些用 row-numbering 來篩選 lower-bound,如 ROW_NUMBER()ROWNUM

作者想表達的是,這並非 Database 的鍋,而是 framework 應使用其他 pagination 方法,例如 keyset pagination,也就是傳入上一分頁最後一組 key,來找下一分頁。當然,並非所有情境都適合這種分頁模式,且要改善程式分頁效能之前,請先做 benchmark,阿彌陀佛。