Hello World
CodeTengu Weekly 碼天狗週刊
CodeTengu Weekly 會在 GMT+8 時區的每個禮拜一 AM 10:00 出刊,每期會由三位不同的 curator 負責當期的內容,每個 curator 有各自擅長的領域,如果你在這一期沒有看到自已感興趣的東西,可能下一期就會有了。你也可以瀏覽一下前幾期的內容。
目前的 curator 陣容:
- @vinta - I failed the Turing Test - 科幻迷,最近在讀 Singularity Sky
- @saiday - Imnotyourson - 教召完領了 3500,得了毛囊炎
- @tzangms - Oceanic / 人生海海 - 衝動型購物
- @fukuball - ImFukuball - 有新工作了,但歡迎直接挖角
- @mingderwang - Ethereum enthusiast
- @kako0507 - 熱愛嘗試新事物的前端工程師
- @chiahsien - 人生就是不斷地填坑
- @hiroshiyui - 歧路亡羊與中年危機的典範
- @uranusjr - Smaller Things - PyCon Taiwan 2017 倒數 4 天
- @kkdai - 態度萬歲 - 喜歡 Golang 的略懂工程師,最近在學機器學習 (疑?)
- @yhsiang
- @johnlinvc - 在 KSP 內登陸月球中
你也可以關注我們的 Facebook、Twitter、GitHub(Open Source 專案)或微博,有很多 Weekly 看不到的內容。有任何建議或疑問也歡迎來 Gitter 聊聊。
@chiahsien
The Engineering Manager Handbook
最近換了工作,擔任的角色跟以往有些不同,正在積極補充一些新知,海總理就推薦了我這一本作為入門書,這本書頁數不多,言簡意賅,大致抓了一些重點:
- Manager 的任務是要讓整個團隊變得更好,其他事情都是基於這個前提而來。
- Manager 還是要偶爾寫寫程式,挑那些不會卡住別人進度或是對團隊有所幫助的任務來做。
- 養成記錄決策的習慣,並且事後要檢視這些決策的結果。
- 真誠的跟人分享,讓訊息流通更透明,並且取得他人的回饋。
- 只做必要由你來做的事情,其他的事情分配給別人做,讓你的成員一起成長。
How I share information with my team
Netflix 的 Engineering Manager 說明他是如何跟團隊分享資訊的,他每個禮拜都會用 Google Doc 寫一份 Week-in-Review(本週回顧),裡頭包含
- 本週做了什麼事
- 公司的 planning 跟 roadmaps
- 徵人的進度
- 產品的進度
- 一些開會跟公司現況的資訊等等
作者也解釋了為什麼他不把大家聚集起來開個會就好,而是採用這樣寫文件的方式,以及這樣做之後帶來的好處。
Scrum Of One: How to Bring Scrum into your One-Person Operation
一般人通常會覺得 Scrum 或是 Agile 這種工作流程比較適合多人團隊,如果是獨立開發者的話根本不需要這樣一套複雜流程來規範自己的工作方式。本文作者是個獨立開發者,他一開始的時候糾結於該怎麼找到適合自己的工作流程,後來嘗試對自己導入 Scrum 之後發現行程井井有條、生產力提高、考試都考一百分了!
或許你們工程團隊沒有跑 Scrum/Agile 流程,或許你根本不是工程師,你都可以看看這篇文章,試著從中提取一些方法到日常的工作方式裡頭,一定會有幫助的!
iOS: How to build a Table View with multiple cell types
UITableView 的重要性我就不多說了,它隨處可見並且千變萬化,許多 UI 都是用它打造出來的。有一定經驗的 iOS 工程師也都知道,雖然它很好用,可是需要處理多種不同類型的 Cell 時就會很頭痛,很容易就會寫出又臭又長的程式碼,卻又好像沒什麼好辦法可以避免。
本文作者用 MVVM 的概念來處理各個不同型態的 Cell,為這個問題提供了一個不錯的解法。底下的留言也很精彩,不少人一起分享他們在設計 Cell 時遇到的問題以及做法。
Swifty Objective-C
這是 PSPDFKit 團隊在 2016 年寫的文章,現在看來依然非常實用。這篇文章解釋了他們為何繼續使用 Objective-C 而不是 Swift、如何讓程式碼與 Swift 相容、還有如何適當的使用 C++ 讓程式碼更好維護。文中列出了許多 C++ 的小技巧,即使原本不熟悉 C++ 的人也能很快上手並從中獲益,最後他們也列出了這樣做的優點跟缺點。
@uranusjr
Pipenv: Sacred Marriage of Pipfile, Pip, & Virtualenv
如果你用過像 NPM 或 Bundler 之類的工具,可能會覺得 Python 的開發環境管理工具略為難用,例如 requirements.txt 難以升級、沒辦法自動管理 dependency 容易留下根本沒用到的套件、virtualenv 需要各種 activate 不小心就會裝錯地方(然後又很難反安裝!)。該有的功能是都有,我之前也分享過手動做相同流程的 workflow,但就是很麻煩啊。
然後 Pipenv 就橫空出世!!其實它有一陣子了,但我是最近剛好開新專案才有機會試用。它用同樣由 Kenneth 發起的 Pipfile 格式取代 requirements.txt,這個格式的基本概念等同於 Bundler 的 Gemfile 與 Gemfile.lock 概念;原本手動的 Virtualenv 管理,則以 pipenv run 與 pipenv shell 取代。完美。如果你有新專案,絕對要試試這個 solution。對於已經使用 requirements.txt 的專案,Pipenv 也內建 requirements.txt → Pipfile 的 converter;我是還不敢用,不過心臟大的可以試試看 XD
pipsi = pip script installer
承上篇。這類取代 Pip 的工具都有個缺點:需要安裝成 global site package。每個專案的 dependencies 可以用 virtualenv 來隔離,但有些工具就是需要 global 才能方便用,尤其有 CLI script 的工具像 Cookiecutter、Flake8、Xonsh。Pipsi 就是用來解決這個問題。當你執行 pipsi install [套件名] 時,你的套件會被裝到自己的 virtualenv 裡,然後 entry point 被 link 到 ~/.local/bin。這在概念上類似 NPM,會讓每個套件都有獨立的 dependency tree,讓反安裝非常簡單,也不會有 version conflicts。同樣建議使用。
The Idiomatic Way to Merge Dictionaries in Python
前陣子聊天聊到 Python 偶爾會 imperative 到讓人討厭,尤其搭配 lambda 只能一個 expression 會讓某些事情特別拗口。例如我現在有個 dict defaults,想建一個新 dict 包含它,但加上一些新資訊,最 idiomatic 的寫法是這樣:
user = {'name': 'TP'}
user.update(defaults)
問題在 update() 的回傳值是 None,所以如果我有一堆 user dicts,想為它們每一個都加上 defaults,就非得寫一個獨立的 function,才能用 comprehension(或 map)來處理:
def make_info(name):
user = {'name': name}
user.update(defaults)
return user
names = ['Alex', 'Betty', 'Charlie', 'Dorothy']
for info in map(make_info, names):
print(info)
這時候就會希望 Python 有比較 fluent 的 API。如果 update() 能夠回傳 callee,我就可以這樣寫:
map(lambda n: {'name': n}.update(defaults), names)
可惜事與願違。
這篇文章就是在探討各種 dict merging 語法,比較它們的語意差異和好用程度(主要是能否 inline,亦即能否用在 fluent interface)。
以下爆雷
真的沒什麼完美解——除非你用 Python 3.5 以上。關鍵字:PEP 448。終於!!淚流滿面。
Unconference – PyCon Taiwan 2017
約好的 (並沒有) 自肥時間。週末就是 PyCon Taiwan 啦,今年第三天我們新開了 unconference 活動,有想講的題目就上去開個新 issue 就行了,我們會幫你準備場地。只是打算來聽的人也可以進去幫喜歡的題目按個 👍 鼓勵一下。
話說有人覺得我們都沒宣傳今年的議程表根本太囂張。其實不是這樣的啊,我們是體貼才低調進行,畢竟現在票都買不到了,宣傳也只會讓大家傷心吧。你看這議程超精美還能和林軒田老師和陳縕儂老師面對面但是你想來也沒辦法呢哈哈哈哈 UCCU (σ′▽‵)′▽‵)σ UCCU
@kkdai
為了自己的習慣,弄了一個簡單的服務 GitHub issue bookmark
筆者自肥的部分又來了,這次要來介紹一個寫起來好玩的小服務.
大家是不是常常覺得在 twitter 上面有很多鏈結都很精彩,但是缺乏以下功能:
- 不好搜尋
- 不容易加上任何更多的意見
- 不容易分類
於是我寫了一個這樣的小服務透過 Heroku 來部署的.你可以透過 IFTTT 來達成完整的功能.
只要你在 Twitter 上面發表一個鏈結後,他就會發表到你的某個指定 repo 的 issue 上面,並且根據你的 hashtag 來加上 label.如此一來你可以快速的紀錄你感興趣的網址,然後之後再加上更多的意見與資料,並且可以很容易的搜尋到. 有興趣就拿去用吧..
BTW: 這當然是用 Go 開發的...
kelseyhightower/oscon-metrics-tutorial: OSCON Metrics Tutorial
OSCON 2017 剛剛在上週結束,而身為 Google Kubernetes 的傳教士 - Kelsey Hightower 當然有來宣傳 Kubernetes.講解的主要是如何在 Kubernetes 集群裡面來做量測並且透過該數值資料來做一些應用.並且有公佈全部的 script 在 Github 上面.
這個 Repo 主要使用 minikube 加上 helm 來安裝與使用,大量使用到 InfluxData 的許多工具,包括了:
- InfluxDB: 一個 Go 開發的時間序列資料庫
- Telegraf: 一個可以量測的工具
- Chronograf: 一個可以網頁顯示資料的工具
- Kapacitor: 拿來做 ETL 的工具
除了安裝這些工具外,並且透過 Kapacitor 來做 auto-scaling .想要學這些工具的話,可以玩玩這個 repo .透過 minikube 要學習完全無難度啊....
Advanced Scheduling in Kubernetes
支援多種方式的排程 (Scheduling) 一直都是 Kubernetes 這種群集管理系統很重要的功能之一.而 Kubernetes 在 1.6 的時候就支援了不少種的排程方式.從透過偏好的 Affinity 來讓 Pod 自動找到適合的節點,或是透過 Taints 來讓 Pod 自動遠離某些節點.都是可以讓排程上多了更多的彈性.
如果還沒有太多的了解,可以先看看我寫的簡單介紹..
hobby-kube/guide: Kubernetes clusters for the hobbyist
[給業餘者的 Kubernetes 架設指南] 這份指南裡面有清楚的指導如何架設完整功能並且安全的 Kubernetes Cluster , 並且把 Firewall, Authentication, Authorization 與 Storage 的規劃相關的設定都講解得相當清楚.
Contributing to the Go project
2016 的舊文章,不過很實用.
由於 Go 專案都是放在 Gerrit 想要貢獻給 #golang 專案,卻又不知道該如何開始? 這篇文章提供一整個流程的簡介.
Random Cool Stuff
第一天上工就毀了正式環境的資料庫
身為一位工程師,第一天上工的首要任務當然是設定開發環境。不過有位可憐的新手工程師,在按照教學文件把本地資料庫清空並加入測試資料時,不小心打了正式資料庫的帳號密碼,毀滅了所有的資料。最慘的是資料庫完全沒有辦法從備份回復。CTO 要他立刻走人,還告訴他會找法務跟他談談。
Reddit 和 Twitter 上的評論認為公司要負大部分的責任,而不是可憐的新手工程師。GitLab 事件的苦主 也認為這是公司政策的問題,GitLab 事件發生後沒有任何人被責備或開除。
有一個 IBM 的鄉野傳說,有個年輕人做了錯誤的決定讓公司虧了 1000 萬。當他去找 CEO Tom Watson Sr 負荊請罪時,Watson 跟他說: 『我怎麼可能讓你走呢?我們剛花了 1000 萬來教育你。』
看來繼 3/31 還有 2/1 後,6/3 也應該成為國際備份檢查日 。
由 @johnlinvc 提供。
