優秀的程式設計師是如何處理技術 Bug 的?

優秀的程序員是如何處理技術 Bug 的?

最近我的圈子裡人們都在討論“如何成為更優秀的程序員”。 看了他們的討論,我決定分享一下我關於“如何成為更優秀的程序員”的經驗。我希望向別人介紹我認為有用的經驗,以便他們應用到自己的生活中。

我“變得更優秀”的辦法是建立在訓練的基礎上的。我每週都要做一系列的“練習”。我設計的訓練有兩個明確的目標:

  • 學習如何解決我以前不知道怎樣解決的問題;
  • 學習如何更快地編寫正確的程序。

我的訓練方法總共由四個不同的練習組成,每個都能幫我實現上面的兩個目標。這四個練習分別是:

  • 讀一篇論文;
  • 學習一個新工具;
  • 讀一本書的幾個章節;
  • 在寫程序時錄製屏幕,然後審查寫程序的過程,找出如何才能寫得更快。

我會具體解釋下每個練習。我還會分享一些我如何進行這些練習,以及我從這些練習中得到的好處。

優秀的程序員是如何處理技術 Bug 的?

讀一篇論文

這個練習的目的是為了擴展我在計算機科學方面的知識。我發現閱讀論文有兩個直接的好處,第一就是一些論文改變了我對特定問題的看法,比如《The Tail at Scal》(https://ai.google/research/pubs/pub40801)這篇論文介紹了長尾的違反直覺的延遲。

我從這篇論文裡學到一個很有意思的事情,就是在多臺機器上執行請求會影響延遲。作者研究的數據來自某個Google服務,該服務在處理請求時,會將請求的各個部分分發到多個不同的服務上。文章利用一些數據估算了將請求分佈到100個不同的服務上時會發生什麼。作者發現,如果測量從所有100臺服務器上接收響應的時間,那麼超過一半的時間是在等待最後五個響應!這是因為最慢的5%的請求要比所有其他請求慢得多。這篇論文還給出了幾種降低長尾延遲的方法。我發現這些方法在我的工作中非常有用。

讀論文的另一個好處就是它能為我提供知識,使我從整體上理解不同的系統。以Google的分佈式數據庫Spanner為例,Spanner使用了許多不同的技術,如Paxos、兩階段提交、MVCC和謂詞鎖等。通過閱讀這些論文,我理解了這些技術的概念。這樣我就可以從整體上理解Spanner,並理解與其他系統相比Spanner做出的權衡。

我發現,我閱讀的大部分論文都來自於我讀過的論文的引用,或者來自Morning Paper的推薦。《Designing Data Intensive Applications》(https://dataintensive.net/)這本書也引用了許多值得一讀的論文。

優秀的程序員是如何處理技術 Bug 的?

學一個新工具

解決問題的最簡單的方式之一就是使用一個已有的、專門用於解決該問題的工具。在這個練習中,我會選一個工具並學習之。通常我會在本地設置好工具,閱讀幾篇指南,再閱讀一點手冊。我過去學過的工具很廣泛,從jq、sed等bash工具,到Kafka或Zookeeper等分佈式系統。

學習bash工具能幫我更快地解決許多常見的任務。簡單的文本處理使用sed通常比使用編程語言更容易。類似地,學習不同的分佈式系統能幫我理解解決不同問題所需的不同工具。

這樣當我面對某個問題時,我能知道該用什麼工具來解決。

優秀的程序員是如何處理技術 Bug 的?

閱讀一本書的幾個章節

我用書籍來補充我無法從論文或工具中得到的知識。我閱讀的書籍覆蓋的話題非常廣泛。我最近讀的書包括:

  • 《重構》(Refactoring),我發現通過這本書能很好地理解好代碼應該是什麼樣子,以及怎樣將壞代碼變成好代碼。
  • 《儘管去做》(Getting Things Done),這本書對優先級排序和任務跟蹤很有幫助。它幫我建立了一套規則,保證我能把重要的事情先做完。
  • 《新手經理人聖經》(The First Time Manager),我最近在工作上成了團隊的協調人,主要責任是在有需要時與其他團隊溝通,也負責組織我們團隊的會議。這本書是理解基本的管理概念的很不錯的入門讀物。
優秀的程序員是如何處理技術 Bug 的?

錄製屏幕

這個是我最喜歡的練習,它對我解決問題的改變最大。這個練習就像運動員審核自己的錄像,以便找出改進的方式一樣。我打算在編程上使用同樣的辦法。關於錄製屏幕的練習,我有以下經驗:

  • 它能幫我在編寫代碼時進行測試。這樣做可以減少定位bug的時間,從而減少調試代碼的時間。如果所有的代碼都沒有bug,那麼bug必然出在新寫的代碼中。
  • 在調試一個問題時, 增加一個調試專用的功能通常很值得。舉例來說,我之前解決過的一個玩具性質的問題是寫一個LRU緩存,有個bug是無法把正確的元素替換出去。我加了一個函數用來輸出緩存的狀態,這樣就能迅速確定出錯的原因了。我能夠看到緩存的實際行為和正確行為之間的差異,這樣就能迅速地確定bug的位置。
  • 在寫任何代碼之前,花五分鐘確定一個方案是物有所值的。這樣做有兩個好處,它能讓我確定我選擇的方案是正確的,更重要的是,它能強迫我選擇唯一的一個方案。通過觀察自己的視頻記錄,我發現我在兩種不同方案的來回切換上浪費了很多時間。實際上任何一種方案都可以工作得很好。

現在回想起來,這些經驗教訓都很明顯,但如果沒有屏幕的記錄,並觀察我在哪裡浪費了時間,我完全不能意識到這些問題。

這個練習的步驟是:

  • 記錄我自己解決某個問題的過程。可以是我在工作上遇到的問題,或者是在某個編程挑戰網站上(如Leetcode)遇到的問題。
  • 以10倍速度重放視頻記錄,找出每段時間我在做什麼。
  • 計算我在每一類事情上花費的時間。我在調試bug上花了多少時間?在構建某個功能時花費了多少時間?
  • 查看我花費時間最多的分類,然後繼續挖掘究竟是什麼花費了時間。
  • 想辦法找出節省時間的辦法。通常都能找到辦法,提前組織代碼的結構,這樣就能寫更少的代碼,或者更容易找到bug。

我強烈推薦記錄你的屏幕——這是找出提高工作效率的小改進中,最容易的一個辦法了。

我去年一整年都在進行這種訓練,從我自身來說真的發生了很大的變化。我學到了許多本來不可能學到的關於系統和工具的知識,我還能比以前更快地解決問題。我希望你喜歡這些練習,並將其中一些應用到自己的工作中。

以後我將分享我在訓練過程中的發現。首先,我要在每次做某個練習時寫一篇博文,記錄下我在練習中得到的經驗和教訓。我覺得記錄下我的經驗教訓應該對我很有好處,也能成為其他人的很好的學習資源。

原文:http://malisper.me/my-approach-to-getting-dramatically-better-as-a-programmer/

如果大家喜歡這篇文章的話,希望大家能夠收藏,轉發 謝謝!更多相關資訊可以關注西安華美校區,免費獲得java零基礎教程!額外附送excel教程!


分享到:


相關文章: