什麼是 10x 程式設計師

LeanCloud發表於2019-01-11

原文轉載自 Antirez

翻譯:江巨集

在程式設計界的傳說中,一個 10x 程式設計師可以完成普通程式設計師十倍的工作量。所謂普通程式設計師,可以想象是一個擅長他/她的工作,但沒有 10x 程式設計師那樣神奇能力的人。更好地描述「普通程式設計師」的說法是它代表了專業程式設計師裡平均的程式設計輸出水平。

程式設計社群對於這種動物是否存在有兩極分化的看法:有的人認為根本不存在,有的人卻認為不僅存在 10x 程式設計師,如果你知道怎麼尋找的話,甚至能找到 100x 程式設計師。

如果你認為程式設計是一個「線性」學科,很明顯 10x 程式設計師存在的可能性看起來確實不符合邏輯。跑步者如何做到比另一個跑者快 10 倍?或者說一個建築工人在相同的時間內如何做到其他人十倍的工作量?然而,程式設計是一種很特殊的設計學科,即使當程式設計師不參與架構上的實際設計時,在實現一個產品時,仍舊需要對實現策略進行設計。

所以如果程式的設計和實現不是線效能力,那麼在我看來,工作經驗、程式設計能力,知識儲備,辨別無用元件的能力等都是非線性的優勢,它們以乘積的方式在產品開發中發揮作用。當然,當程式設計師能同時負責軟體的設計和實現時,這種事半功倍的現象就更多了。一個任務越是「目標導向」,潛在的 10x 程式設計師就越有空間利用她/他的能力以比別人少很多的努力達到目標。當手頭的任務更僵化,對開發工具及實現方式有很多限制時,10x 程式設計師在更短的時間內完成更多工作的能力就被削弱了:它仍然可能利用對「區域性」設計的把控來做的更好,但卻無法根本上改變到達目標的路徑,包括把設計規範的某些部分徹底去掉,以大大減少工作量卻達成幾乎同樣的目標。

在作為程式設計師工作的二十年裡,我觀察過很多和我一起工作的程式設計師,由我指導以達到既定目標,如為 Redis 和其他專案提供補丁。正是在這些協作過程中,很多人認為我是很高效的程式設計師。考慮到我遠非工作狂,我就以自己為參考來談談如何快速開發。

以下是我認為對程式設計效率影響最大的幾點特質。

純程式設計能力:完成子任務

程式設計師最明顯的優劣勢體現在實現程式的一個部分的子任務中,包括函式,演算法或其他任何東西的實現。令人驚訝的是,根據我的經驗,非常有效地使用基本指令式程式設計工具以實現某些東西的能力並不像大多數人認為的那麼普遍。在一個團隊中,有時我觀察到非常不稱職的、甚至簡單的排序演算法也不知道的程式設計師能完成的工作卻比理論上應該很強在實踐中卻很弱的大學畢業生要多。

經驗:模式匹配

我所說的經驗指的是已經探索過的一系列重複性任務的解決方案。經驗豐富的程式設計師經過積累最終知道如何處理各種子任務。這不僅能提高效率,也是防止設計上的錯誤的強大武器,這些錯誤往往是簡化設計的最大敵人。

重點:實際時間 VS 假設時間

不看質量光看程式設計花費的時長是毫無意義的。內部和外部因素都可能影響你的專注程度。內部因素是拖延症、對專案缺乏興趣(不喜歡的事情你一定無法全身心投入)、缺乏鍛鍊、睡眠不好或很少等。外部因素是頻繁的會議、工作環境不佳、經常被同事打斷等等。很自然,提高專注度,減少中斷對於提高開發效率有不可忽視的作用。有時為了集中注意力,需要採取一些極端措施。比如我,通常只在固定時間收發電子郵件且只回復重要部分。

學會取捨:通過幹掉 5% 來獲得 90%

當人們不願承認一個非根本的目標造成了很大一部分設計的複雜度,或者因為一個根本功能和一個非根本功能之間存在取捨壓力而造成更重要的目標難以達到時,複雜度就產生了。對設計者而言,認識到設計中難以都實現的那些部分非常重要,也就是說,付出的努力與收益不一定是成正比的。在專案中為了獲得最大收益,就需要專注於能在有限的時間內完成的最重要的部分。例如,在設計訊息代理 Disque 時,我意識到通過只盡力(而不是絕對)保證訊息的順序,專案的其他方面都可以得到實質性的改進:比如可用性、查詢語言以及客戶端互動、簡潔性和效能等。

簡潔性

這是一個顯而易見的觀點,這一點至關重要。為了理解簡潔性,有必要檢查複雜度都是如何產生的。我認為複雜度的兩個主要驅動因素是不願意進行設計上的犧牲,以及設計活動中錯誤的積累。

仔細考慮設計的過程,每一次錯誤選擇都使我們離最優解決方案更遠。一個最初的錯誤當遇到錯誤的人時,不會導致這個系統的重新設計,而會導致設計另一個更復雜的方案來應對這個錯誤,因此,這個專案就隨著每個錯誤的出現而變得更加複雜和低效。

簡潔性可以通過在腦子裡進行“概念驗證”的推理來實現,這樣可以讓程式設計師設想大量的簡潔的設計,然後動手實現看起來最可行和最直接的方案,隨後再靠經驗和個人設計能力改進設計,併為子級設計找到合理的方案。

然而每當需要一個複雜的解決方案時,都有必要花很多時間思考如何避免複雜度,只有在考慮過各種替代方案後都沒發現更好的選擇之後再繼續朝那個方向走。

完美主義,或者說如何犧牲生產力並引入設計偏見

完美主義有兩種型別:一種是讓程式的可量化效能達到最優的工程師文化,另一種是人格特質。我認為這兩種情況下完美主義都是程式設計師實現快速交付的最大障礙。完美主義和對他人評價的恐懼會導致設計偏差,導致選擇不當,僅根據心理或無關緊要的可量化引數來改進設計,卻從未考慮諸如程式的健壯性,簡潔性,及時交付能力之類的事情。

知識:一些理論會有幫助

在處理複雜的任務時,關於資料結構,計算的根本侷限性,適合特定任務的重要演算法等的知識將會對找到合適設計的能力產生影響。並沒有必要在各方面都成為一個超級專家,但知道一個問題的多種潛在解決方案是必須的。例如,接受設計上的犧牲(接受一定錯誤率)並瞭解高概率地估計集合大小的方法,可以避免設計出複雜,緩慢和佔用大量記憶體的從流資料中計算唯一元素數量的方案。

底層:瞭解機器

即使是在使用高階語言時,有很多程式裡的問題都是由對計算機完成特定任務的方式產生誤解造成的。因為所使用的工具或演算法存在根本問題,這甚至可能導致專案需要從頭開始重新設計和實現。掌握好 C 語言,理解好 CPU 如何工作以及搞清楚核心如何執行、系統呼叫是怎樣實現的,可以避免在後期出現嚴重的意外。

除錯技巧

花費大量時間找 Bug 是很常見的事。如果你善於逐步獲取 Bug 狀態以用理性的步驟修復,並且編寫程式碼的時候注意儘量簡化以減少 Bug,就可以大大提升效率。

在我看來,以上這些特質對輸出產生 10 倍的影響並不奇怪。它們使得好的實現可以從一個可行的模型和比替代方案簡單數倍的設計開始。有一種強調簡潔性的方式,我喜歡稱之為「機會主義程式設計」:在開發的每一步中,選擇實現對使用者有最大影響並需要最少努力的功能。

相關文章