10x程序員工作法筆記

持續更新,最近更新時間:2019.10.31

簡介

我在某平臺上學習10x程序員工作法,特此記錄下我結合工作中實際情況對10x程序員工作法的理解與總結

目錄頁面


開篇詞

作爲程序員,我們將其看作一個值得全情投入的職業,希望能夠把精力放在設計算法、改進設計、優化系統這些具有創造性與成就感的本職工作上。

兩個概念:本質複雜度(Essential Complexity)和偶然複雜度(Accident Complexity)

  • 本質複雜度就是解決一個問題時,無論怎麼做都必須要做的事
  • 偶然複雜度是因爲選用的做事方法不當,而導致要多做的事
  • 舉例說明:比如你要做一個網站,網站的內容是你無論如何都要寫的,這就是“本質複雜度”。而如果今天你還在用匯編寫一個網站,效率是不可能高起來的,因爲你選錯了工具。這類選錯方法或工具而引發的問題就是“偶然複雜度”

程序員現狀:大部分程序員忙碌解決的問題,都不是程序問題,而是由偶然複雜度導致的問題

一個思考框架、圍繞這個框架的原則

  • 原則:以終爲始、任務分解、溝通反饋、自動化
  • 你以爲的“終”可能不是終,因爲你只是站在自己的角度;你以爲自己做了任務分解,在我看來,可能還不夠,因爲我希望你能夠做到微操作;你以爲的溝通反饋就是說話聊天,我想告訴你很多技術實踐的存在也是爲了溝通反饋;你以爲自動化就是寫代碼,我會告訴你,有時候不寫代碼而解決問題,可能纔是一個好方案。

不會工作方法沒關係,可怕的是深陷泥潭而不自知


思考框架

由於偶然複雜度造成的差距會有多大呢?

1975 年,弗雷德裏克·布魯克斯(Frederick Brooks)出版了軟件行業的名著《人月神話》,他給出了一個統計結果,優秀程序員的開發效率是普通程序員的 10 倍。40 多年過去了,這個數字得到了行業的普遍認同。

一個思考框架

原文

  • Where are we?(我們現在在哪?)
  • Where are we going?(我們要到哪兒去?)
  • How can we get there?(我們如何到達那裏?)

這三個問題實際上是幫我們確定:

  • 現狀
  • 目標
  • 實現路徑

如果一個人能夠清晰地回答出這三個問題,通常意味着他對要做的事有着清晰的認識

結合具體場景

在實際的工作中,這個思考框架會幫助我更好地瞭解自己的工作。比如,當一個產品經理給我交代一個要開發的功能特性時,我通常會問他這樣一些問題:

  • 爲什麼要做這個特性,它會給用戶帶來怎樣的價值?
  • 什麼樣的用戶會用到這個特性,他們在什麼場景下使用,他們又會怎樣使用它?
  • 達成這個目的是否有其它手段?是不是一定要開發一個系統?
  • 這個特性上線之後,怎麼衡量它的有效性?

如果產品經理能夠回答好這些問題,說明他基本上已經把這個工作想得比較清楚了,這個時候,我纔會放心地去了解後續的細節。

我們用思考框架對照一下,爲什麼我會問這些問題。一般來說,一個新特性要開發時,現狀我是知道的。所以,我更關心目標,這裏“爲什麼要做這個特性?”就是在問目標,“給用戶帶來怎樣的價值”是在確定這個目標的有效性。

接下來,我會關注實現路徑,用戶會怎麼用,是否有其他的替代手段,我需要了解產品經理的設計是經過思考的,還是“拍着腦袋”給出的。衡量有效性,則是要保證我的工作不會被浪費。

具體問題怎麼問遵循四項基本原則

以終爲始就是在工作的一開始就確定好自己的目標。我們需要看到的是真正的目標,而不是把別人交代給我們的工作當作目標。你可以看出這個原則是在幫助我們回答思考框架中,Where are we going?(我們要到哪兒去?)這個問題。

任務分解是將大目標拆分成一個一個可行的執行任務,工作分解得越細緻,我們便越能更好地掌控工作,它是幫助我們回答思維框架中,How can we get there?(我們如何到達那裏?)的問題。

如果說前兩個原則是要在動手之前做的分析,那後面兩個原則就是在通往目標的道路上,爲我們保駕護航,因爲在實際工作中,我們少不了與人和機器打交道。

溝通反饋是爲了疏通與其他人交互的渠道。一方面,我們保證信息能夠傳達出去,減少因爲理解偏差造成的工作疏漏;另一方面,也要保證我們能夠準確接收外部信息,以免因爲自我感覺良好,阻礙了進步。

自動化就是將繁瑣的工作通過自動化的方式交給機器執行,這是我們程序員本職工作的一部分,我們擅長的是爲其他人打造自動化的服務,但自己的工作卻應用得不夠,這也是我們工作中最值得優化的部分。

這四個原則互相配合,形成了一個對事情的衡量標準。總體上可以保證我的工作是有效的,在明確目標和完成目標的過程中,都可以儘量減少偶然複雜度。

在這裏插入圖片描述
怎麼把這四個原則用在工作中呢?我們回過頭來看一下前面的場景,產品經理把要做的功能特性擺在我面前。站在以終爲始的角度,我需要了解真正的目標是什麼,所以,我會關心爲什麼要做這個特性。爲了保證目標是有效的,我會關心它給用戶帶來的價值

有了任務分解的視角,我需要將一個大的目標進行拆解,如果我要達成這個目標,整體解決方案是遠遠不夠的,我需要把任務分解成一個一個小的部分。所以,我會關心一個一個具體的使用場景

一方面,我會了解到更多的細節,另一方面,當時間緊迫的時候,我會和產品經理來談談究竟優先實現哪個場景。

爲什麼要學會溝通反饋?因爲我需要明確,自己是否真正理解了產品經理提交的需求。所以,我要不斷地問問題,確保自己的理解和產品經理交代的內容一致。

另外,我也需要保證我的產品做出來確實能夠達到目標。所以,我會關心它上線後的衡量手段。因爲我知道,這個行業裏有太多代碼上線後,從來沒有運行過。

自動化的角度很有意思,我們做的方案通常是一個自動化方案,但我們需要了解這個方案沒有自動化之前是怎麼做的。如果不自動化,用戶會怎麼用。所以,我會關心是不是還有其它替換方案,比如,買一個現成的服務。因爲很多需求的提出,只是因爲我們有了一個開發團隊而已。

我們不是一個人孤獨地在工作,而是與其他人在協作,想要做到高效工作,我們就要“擡起頭”來,跳出寫代碼這件事本身。所以,我在開篇詞裏說,程序員解決的問題,大多不是程序問題。


我的個人博客網站是:www.coderyyn.cn
上面會不定期分享有關爬蟲、算法、環境搭建以及有趣的帖子
歡迎大家一起交流學習

轉載請註明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章