碼天狗週刊 第 115 期 @vinta - Python, MongoDB, Apache Spark

本文同步發表於 CodeTengu Weekly - Issue 115

Timezone in Python: Offset-naive and Offset-aware datetimes

關於 datetime 和 timezone 的處理可能是每個軟體工程師遲早都會遭遇的難題之一,以前一直沒有搞得很清楚,前陣子總算有時間稍微整理了一下 timezone 在 Python 裡需要注意的地方。跟大家分享一下。

之前幾期的 issues 裡,其他 curator 也都不約而同分享過 Falsehoods Programmers Believe About XXX,其中就有幾個主題是「時間」,有興趣的人可以翻一下。

延伸閱讀:

MongoDB Query Performance over Ranges & Indexes that Help

上禮拜換了新工作,負責解的第一個 issue 就是改善某個複雜的 MongoDB aggregation 的效能。雖然對 MongoDB 還不是很熟(只有在第一份工作用過一陣子,而且後來就改用 PostgreSQL 了),不過遇到 slow query 問題的起手式基本上都是先 explain 一下,從 queryPlannerexecutionStats 欄位可以知道哪個 stage 的哪個 query 用了哪個 index、掃描了多少數據和回傳了多少數據。最後透過修改了 query 的寫法並且加了一個「欄位順序正確」的 compound index,總算成功地把執行時間從 1.x 秒降到 0.01x 秒。

這篇文章講的就是「欄位順序」對 MongoDB 的 compound index 的影響。作者還給出了一個簡單的判斷方式:

The order of fields in an index should be:

  • First, fields on which you will query for exact values.
  • Second, fields on which you will sort.
  • Finally, fields on which you will query for a range of values.

延伸閱讀:

Spark 2.x Troubleshooting Guide

這份簡報和延伸閱讀的那篇文章列出了許多 Apache Spark 在使用上常見的問題和解法,這陣子在用 Spark 做推薦系統的時候,幾乎把這些地雷都踩過了,如果可以早一點讀過這些資料就好啦。

題外話,如果你也是用 Google Cloud Dataproc 跑 Spark cluster 的話,千萬記得可以用 Preemptible VMs,能夠省下不少費用。不要像我一樣白白被多收了好幾百塊美金,心寒啊。

延伸閱讀:

Learning at work

這篇文章是 Stripe 的工程師分享的「如何在工作中學習」的文章。不過重點其實不是如何學習,而是「在工作中」學習。

畢竟要求每個工程師都應該在下班之後還要花很多時間學新技術、開發 side project 或是貢獻 open source 專案其實是不太現實的嘛。而且一天工作 8 小時,但是可以真的進入 mindflow 專心寫程式的時間可能連 4 小時都不到(我承認我超少)。有時候可能是狀態不對或是你就是欠缺完成任務所需要的知識,這時候與其硬幹、用 workaround 或是產出一些自己都不明所以只是剛好能動的程式碼,那還不如好好地利用上班時間,仔細鑽研一下你要解決的問題、搞懂那些你之前沒搞清楚的東西。再不然也可以重新審視一遍那個你剛剛解決的 bug 的 root cause,因為每個 bug 其實都是一個學習的契機啊。

就像陈皓說的「多些时间能少写些代码」,共勉之。