來美國前就對 vgod 學長的追求神乎其技的程式設計之道系列文一直印象深刻。因此在這趟美國行前,就透過網路詢問是否可以請教學長一些問題,並參訪學長的公司 Dropbox。非常謝謝學長在百忙之中招待我們,與我們分享了自己的經驗並解答了我們各式各樣的問題。
前情提要
學長目前在 Dropbox 做的是與 ML Training 相關的 Infra。因為 Dropbox 原本的 Infra 是針對 Storage 做優化,並不適合用在需要較吃重 CPU 的 ML Training。所以學長負責針對 ML 做另外的配置,並跟其他現有的服務配合以加速 ML Training。
而在做 Infra 之前,學長在 Dropbox Paper 做 search 服務,內容從 UI、backend、infra 都有,可以說是在 Infra Team 跟 Product Team 都有一定的經驗。
這次的參訪基本上學長是一邊帶我們到處參觀,一邊回答我們的各種問題。沒有錄音以及正式的訪綱,所以以下就當天的記憶以及手邊的筆記來紀錄最有印象的幾個部分。
程式相關
準備 IOI (或類似程式競賽)的訓練對於成為一個好的軟體工程師是必要的嗎?
非必要,但對於在灣區找工作是一定有幫助的。
在這個問題中學長提到一個很有趣的觀點,**能夠「****快速寫出有效率的演算法解題」跟能夠「寫出一個有規模的軟體架構」所需要的能力是截然不同的**,而前者的習慣有時反而對後者有害。例如在解演算法題時,為求速度常常變數直接以 a、b、c 命名(或者迴圈變數全部都是 i、j),這樣的習慣在大規模的軟體架構下會讓程式碼的可讀性變差。
關於這個觀點學長在回答我們下面這個問題時也有提到。
怎麼樣才能算是好的程式碼?
可讀性高,容易讓人看懂與 trace code。
在這個問題中,我們原本有的迷思是程式碼就是應該要寫的越簡短越好(當然還是要用有意義的命名),但學長分享,程式碼有時太簡短會犧牲可讀性並增加 trace code 的負擔,例如:把所有重複的程式碼都包成 function,這樣 trace code 有時候會不必要地多往下一層看程式碼,增加 trace code 所需要花的時間。如果對於可讀性有幫助,適時地讓一些程式碼重複是可以接受的。
關於好的程式碼,學長在抽象化與命名這篇有提到命名的重要性,而在回答時學長也補充,其實命名只是在程式碼裡做完一系列歸納、找規律後的最終產物,因此真正難的還是找規律後抽象化的能力。
對於好的軟體工程師的定義
一個軟體工程師在每個階段需要的能力都不一樣。
還是新鮮人時,最基本要能夠實作出要求的功能,並知道怎麼問問題,包括什麼問題需要問以及要怎麼問。脫離新鮮人時,能夠獨立規劃完成小型專案,能夠幫助他人解答問題,最好還能夠帶著一個人成長。在往上一個階段,能夠帶超過一個人甚至一個團隊,然後能夠選擇什麼是該做的、什麼是不該做的。
Dropbox 工作相關
現在公司內部還會用到 C/C++ 嗎?
很少,以前是 100% Python,現在有部分用 Golang,也有一些 Rust 與 Java。
在這個問題中學長也提到,現實生活很多時候其實是不需要 C/C++ 在 Runtime 的執行效率。因為現在很多效能問題都可以用硬體解決,多起幾台機器就可以解決效能瓶頸,所以沒必要用 C/C++ 去犧牲整體的開發速度。從成本的角度來看,工程師的時間是比硬體成本要貴得多。
在 Dropbox 的軟體開發流程是什麼?
在 Dropbox 開發流程是相對彈性的,每個 Team 都會有自己跑 Scrum 的規定,不會有硬性規定每個 Team 都要遵守傳統 Agile 的開發流程。所以像 Sprint 的週期,在 Dropbox 兩個禮拜或三個禮拜都有。而有些 Team 會有 Daily Standup,有些只有 Weekly meeting。
在這邊學長也跟我們分享了在 Infra Team 跟之前待 Product Team 在開發週期上的差異。開發上在 Product Team 因為要快速迭代,Product Team 的 Deadline 通常會壓得比較緊,整體的週期也比較短。而在 Infra 上每個週期通常可以拉的比較長,不會像 Product Team 一樣那麼緊湊。
Dropbox 的人共有最大的特質是什麼?
Ownership,對自己的產品有認同感與熱忱,Dropbox 的員工有部分是之前創業過後被吸收進 Dropbox 的,這種人就很容易看到這樣的特質。
其他
在讀 Ph.D 時研究的 HCI 對於現在做 Infra 相關有什麼幫助嗎?
HCI 的概念其實在軟體開發的各個領域都會用到。例如:在規劃 Infra 的時候,就必須要考慮到使用者預期會如何使用這些服務,需要怎麼設計 API,要怎麼讓人可以很快的正確使用,這些都需要用到 HCI 的概念。
會想問這個問題其實是在看完學長的淺談模式”mode” 與文字編輯的技術與學習這篇文章後,對於學長從 HCI 的角度去解釋 vim 為什麼要有 command mode 跟 insert mode 印象深刻,很推薦可以看這篇文章(順便加入 vim 教 XD)。
在 MIT 時遇到的人跟 Dropbox 有什麼差別?
在 MIT 的人通常不是什麼都會,而是對於某個專門的領域鑽的非常深入。相較之下,在 Dropbox 的人擁有的技能比較廣一些。
類似的邏輯,學長也與我們分享了在讀 Ph.D 時,修的課如 Machine Learning,大部分課程的時間都是在做理論的相關證明推導,也是適合讓人在特定領域鑽的更深入。但如果不是需要繼續做相關的研究的話,剩下的功用比較多就剩下鍛鍊腦袋而已。
後記
在參觀 Dropbox 的時候,除了幾乎是這邊大科技公司標配的 Micro Kitchen、遊戲室、各種形式的工作空間、大到容易迷失方向的辦公室外,最令人印象深刻的是 Dropbox 甚至有自己的圖書館跟可以練團的地方,還有最扯淡的:米其林等級的員工餐廳與廚師供應各種類型的餐點。
員工餐廳餐點自帶擺盤,還有無法挑剔的甜點
在參觀的時候,也能看到每個會議室裡大家都用著 Dropbox Paper 開會,還幸運瞥見 Drew Houston 本尊。最後,再次感謝 vgod 學長!也祝 Dropbox 能繼續完成 Keep teams flowing 的目標。