第一件事情是學會二分尋找。我看過很多剛入門的程式設計師,要麽是自學編程的,沒有系統地學過演算法,連二分尋找都不知道;要麽是本科念完,演算法都還給老師了,總之就沒有這樣一種基礎意識。看他們定位問題,從第一行程式碼開始加斷點或者是打印上下文資訊,我會有一種強烈的沖動:還是讓我來吧。
如果你有一段程式碼,例如說一個函式,或者多個互相呼叫的函式,最終結果不是你想要的,你不要從頭開始找哪裏出錯了。你應該找一個中間點,從那裏開始二分尋找。你在中間點查一個斷點,或者是把上下文資訊打印出來,以此確定程式執行到中間點時的狀態是不是還是符合你預期的。如果符合你預期,問題處在中間點之後;如果已經不符合你預期了,問題出在中間點之前。如此重復,直到你能定位問題出在哪裏。
如果你能定位到問題出在哪裏了,要麽是顯而易見的邏輯錯誤,你自己把寫錯的邏輯糾正過來就好了;要麽是更底層的問題,你覺得你的邏輯是沒錯的,但底層的執行時、框架、瀏覽器、作業系統之類的就是不按照你預期的方式進行處理。這時候你只能透過搜尋去學習,為什麽你依賴的底層沒按照你的預期進行處理。你的預期有可能是對的,底層出錯了,你要想辦法繞過去;你的預期也有可能是錯的,因為你沒有真正理解你依賴的底層,這時候你要繼續學習新知識,調整你對底層的理解,然後修正你的程式碼邏輯。
遇到這種問題時,你應該用什麽關鍵字搜尋呢?這是個很難教的東西,因為是否能抓準關鍵字來搜尋是非常依賴於眼界和經驗的。這種狀況我在教新手編程時遇到過,在教非常有經驗的程式設計師上手新公司技術時也遇到過。
教一個新手編程:我跟他說,你遇到這個問題,你自己搜尋一下。他嘗試用他能想象得到的關鍵字搜尋了一番,就是找不到答案。我來一搜,答案就在 StackOverflow 上,或者這個開源計畫已經有人提了個 Issue。為什麽他搜不到呢?原來某些更復雜的技術概念他還沒學到,我直覺能想到用什麽關鍵字,但他根本意識不到那些關鍵字的存在。
教一個非常有經驗的程式設計師上手新公司的技術:我跟他說,遇到這個問題你搜一下公司內網咖,我們的內部搜尋系統非常強大的,Wiki、文件、討論……什麽都能覆蓋到。他怎麽都搜尋不出來,但換我來一下子就搜到了。為什麽他搜尋不到呢?因為公司內某些系統、術語、代號他還從來都沒聽說過,而我一下子就能想到,於是我能搜尋到。
這種眼界和經驗是沒辦法系統化、一次性地教給一個新人的。就算你嘗試一次性地把很多知識傳授給一個新人,他也無法全部都記下來。所以最好的學習方法是不斷地透過覆盤來學習——我遇到了這樣一個問題,我嘗試了如下的操作,沒有解決好問題,或者解決了但效率很差,那比我厲害的人遇到同樣的問題是如何解決的?他們如何使用不同的操作更高效地解決同樣的問題?我能從中學到什麽?讓我重來一次的話我會怎麽做?
這時候自然引申出來的一個問題是:去哪裏認識這些比自己厲害的人?如何能獲得他們的幫助和指導?這有付費和免費兩個途徑。
付費的話,例如說知乎的付費咨詢啦。(知乎的產品和運維,如果我這個答案幫助你們提高業務指標了,記得多收錄我其它答案啊!)有不少人都在嘗試付費咨詢這樣一件事情,這個行業在中國還很不成熟,但如果你付得起的話可以試一下。我做一對一的 career coaching,收費是 300 美元一小時(5 美元一分鐘的費率),有需要的可以私信聯系我。
說完付費的再說一下免費的,這裏面最重要的一點是跟比你厲害的人建立關系,讓對方意識到你也在為他在乎的領域創造價值。以下是我提供的一個簡單的步驟:
- 去關註比你厲害的人,看看他平時釋出的內容都在說什麽,了解他最在乎的領域是什麽。
- 在他釋出的內容下面參與互動,發表你對於他的領域的見解,最重要的是你的見解要能在他已有的內容之外創造新的價值。
- 在跟他有持續互動之後,他可能會主動想要認識你,否則的話你也可以主動私信他,提出說你想認識一下他。如果是你主動的話,你最好帶上一個有價值的話題,以此展開私信對話。
我可以給你一個非常具體的例子,當年 @窮碼農 跟我聊上後,他私信我的第一句話是「鼓起勇氣不要臉一波,可以給我這個回答送個專業嗎?」我覺得他寫的答案品質都不錯啊,確實在為刷題的留學生提供了價值,於是我毫不猶豫地幫他的答案點了個專業。
在你跟一個比你厲害的人建立關系後,給點耐心多聊聊,在你有需要是別人往往是願意幫助你的。