親愛的兒子: 當你打開這封信的時候,我已經離開波士頓回到加州了,你也已經結束自己最後一個暑假,去往自己非常喜歡的公司。 雖然你我都是程式員,但是你卻很少向我咨詢過技術相關的問題,咱們上一次一起寫代碼,也是你高考結束那個暑假了。不過前幾天你問了我一個問題,你說,如果讓你寫一封信,跟當初剛剛成為程式員的 ...
親愛的兒子:
當你打開這封信的時候,我已經離開波士頓回到加州了,你也已經結束自己最後一個暑假,去往自己非常喜歡的公司。
雖然你我都是程式員,但是你卻很少向我咨詢過技術相關的問題,咱們上一次一起寫代碼,也是你高考結束那個暑假了。不過前幾天你問了我一個問題,你說,如果讓你寫一封信,跟當初剛剛成為程式員的自己說一些話,你會說什麼呢?
我在想,我會說些什麼呢?我想說的太多了,可是如果說了,他能聽進去多少呢,就算聽進去了,他又會用到多少呢?我想起了瑞·達利歐的《原則》,如果我把我這幾年的經歷、收穫,總結成幾條原則,是不是會好一些。
以下,是我總結的幾條原則。
1.權威精神
對於某一項具體技術來說:
官方文檔、白皮書、論文,比博客更權威;
由此引申出:
谷歌比百度更權威,因為谷歌的搜索結果,權威的資料靠前,而百度,靠前的多是博客;
大多數時候,英文文檔比中文文檔更權威,因為官方文檔、白皮書、論文,大多數是英文的;
如果你想向別人解釋一項技術,那麼請向他們展示權威的資料,而非一些網路上的博客;
為什麼這麼強調權威精神?
《禪與摩托車維修藝術》里,作者和朋友騎摩托車去沙漠,車壞了,朋友依靠直覺和經驗,嘗試了各種辦法,就是修不好,而作者找到了他購買摩托車時配套的指導手冊,照著上面的步驟排查,很快找到了導致車子故障的原因,換了個零部件,車子就好了。
數學、物理的很多研究,都是基於定理之上,誰也不會基於一條未經檢驗、未被公認的理論去研究自己的工程,就好比一位軍事科學家,是不可能用一位民間科學家的一篇文章里的理論,去設計自己的軍事系統的,稍不留神,一個計算錯誤,就會把導彈射向自己。
而軟體工程,其實和數學、物理一樣,也是一門科學,這一點很多人都忘了。
為什麼他們會忘了,因為在軟體領域,破壞的成本幾乎是零。
你可以在電腦這個狹小的空間內,製造各種爆炸:記憶體溢出、棧溢出、空指針等等各種系統異常乃至奔潰,都不會對你造成傷害,電腦默默承受了這一切,CPU 幫你執行了一次又一次的任務,最多就是浪費電,不太環保而已。
事實上很多程式員就是在不斷的試錯中完成需求的,我喜歡稱他們為“試錯型程式員”,他們在網上隨便找代碼抄過去,自己跑了一下,有點問題,改了幾個 bug,看起來沒問題了,提測,測試同學又發現了幾個 bug,改 bug,bug 改完了,上線,上線後有點小緊張,怕會出現什麼“意外”,觀察了好一陣子,沒有“意外”,呼,長嘆一聲:運氣真好。
而一個具有權威精神的程式員,是不相信運氣的,他的學習、工作效率是極高的。
他從官方文檔、白皮書、論文里看到的資料,就是軟體工程的定理,他可以放心的認為它們就是正確的,而那些從非權威資料,從網路零零碎碎博客學習的程式員,他們會心虛,他們也許得看好幾篇博客,才能覺得這就是正確的結論(而這時候有可能這些博客都是錯誤的、過時的,因此他所認為的正確,其實還是錯誤的)。
也許你也嘗試過閱讀英文文檔,但由於母語環境的原因,閱讀英文,肯定沒中文快,沒關係,我並不是說你就不能從中文博客里學習:
如果你現在還需要依賴中文博客,那麼業界大牛的博客、參考了權威文檔的博客,要比那些毫無依據的博客更權威;
在博客里獲得的知識,請嘗試到權威文檔,找到對應的描述和依據。方法:把知識點關鍵詞,翻譯成英文,在谷歌里搜索,能夠在官網站內搜索更好(當然谷歌也支持指定站內搜索,site:${官網} 關鍵詞)
請多閱讀英文文檔,努力提升你閱讀英文文檔的能力;
2.底層精神
你很可能會焦慮,焦慮自己到底要做什麼,學什麼,才能讓自己區別於他們口中的“CRUD 程式員” ?
有人說,程式員門檻很低,確實,如果把能夠寫出可運行代碼的人,稱為程式員的話,那人人都有成為程式員的潛質。
會寫 CRUD 的程式員,很多,但是懂 CRUD 背後原理的程式員,則很少:
你會用 Java 在記憶體里給 i 做加一的操作,但不代表你知道 JVM 是怎麼給 i 加一的;
你會往 MySQL 里插入一條記錄,但不代表你知道 MySQL 是怎麼插入的;
你會用 Kafka 做消息隊列,生產消費消息,但不代表你知道 Kafka 是怎麼處理消息的;
似乎一切的動作,都可以歸納為 CRUD,但如果你知道 CRUD 底層的原理,那就和那些只會寫 CRUD 的程式員不一樣了,代碼上線後:
某一段代碼性能極慢,他們不知道為什麼慢,你知道;
MySQL 死鎖了,他們不知道為什麼死鎖,你知道;
Kafka 處理消息效率很低,他們不知道為什麼低,你知道;
而且你很自信,如果是你來寫CRUD,是不會讓這樣的問題上線的。
這,就是你作為一個程式員的競爭力所在。
有一張後端程式員的學習路線圖(Back-end Roadmap):
當然,不是這裡面的東西都要學,如果都學,你可能就會和其他程式員一樣,只懂得怎麼用,而不知道技術底層是怎麼實現的。
挑其中你最常用的幾項,比如 Java、Spring、Dubbo、MySQL、Kafka、Apollo,深入研究他們,閱讀他們的官方文檔,看源碼,知其然知其所以然。
檢驗的標準很簡單:梳理出自己的一套調優方法/最佳實踐,並能解釋為什麼這樣做是最優的,這就要求你弄懂它們底層的原理。
3.不只是技術
技術是用來解決問題的,但是當你工作後,你也許會發現,只靠技術,是不能解決所有問題的。
你需要熟悉公司的業務,理解需求的價值和目標,再用合適的技術去實現它,能解決問題的程式員才是牛逼的程式員;
你想用的技術,公司不支持,也許是因為需要更多的機器,你需要學會怎麼在技術和成本之間做平衡;
技術是你的一把錘子,但不要有了錘子,就認為萬物都是釘子,什麼都想用技術去解決,也許換個需求的實現方式,也能解決用戶的痛點,而且實現起來還更簡單,那何樂而不為?
只會用技術解決問題,那不是你掌握了技術,而是技術控制了你;
知道什麼時候要用技術解決問題,用什麼技術,這才是你掌握了技術。
你要學習的,不只是技術,也許還有溝通、管理、寫作、思考等等能力,也許你需要閱讀很多非技術類的書籍,我也會在後面的來信中和你分享一些書單。
4.保持技術熱情
你是不是覺得我很矛盾,剛說不要只懂技術,現在又讓保持技術熱情。
可是這兩者並不衝突呀,只懂技術是一個極端,喪失了對技術的熱情又是另一個極端,最好的狀態就是,保持對技術的熱情,又清醒的知道不必什麼都用技術去解決。
為什麼會失去對技術的熱情呢?也許就是因為上面所說的,你發現了太多太多的事情,不是用技術就能解決的,現實並非你以前認為的那麼純粹,現實世界並不像電腦世界那樣,特定的輸入就有特定的輸出。
但是,想一想你為什麼選擇了做軟體、做科學,也許當初你愛上編程,就是因為你喜歡創造,你享受自己寫下的代碼,創作的的作品,運行起來時的那種美妙的感受,哪怕只是打出一行“Hello World”,都讓你開心半天,更何況是你寫的代碼,做的輪子,被成千上萬的用戶使用了呢?
總而言之,不忘初心,不要被工作、生活的其他雜七雜八的因素,毀滅了你的技術熱情。
你想問我是怎麼保持技術熱情的?
我的方法很簡單,那就是在工作之外,自己寫些代碼解決問題,如果實在沒有問題可以解決,我就寫編程題、寫演算法題,我還喜歡用非工作語言的編程語言來寫,比如我工作用的 Java,那業餘時間我就用 Python。
寫代碼有時就像寫作,寫著寫著,你就會不由自主的回憶和思考,拾回一些丟失的東西。
5.馬上就乾
很多人懂得很多道理,但就是過不好這一生,每年年初都制定了一堆計劃,但是最後發現都沒堅持去做。
也許你看了我上面的信,有很多感觸,但是如果沒有行動,這些收穫就不能轉化為實實在在的東西。
我相信你不想成為這樣的人,怎麼辦?四個字:馬上就乾。
通常當我聽到一些很有用的話時,我不會就此打住,我會繼續追問,然後呢?然後我可以做什麼呢?有什麼事是我馬上就能做的呢?
陳皓老師(左耳朵耗子)發起的一個叫 ARTS 的打卡計劃啟發了我,如果我們可以針對我們的目標,列出對應的行動,並且給自己佈置作業:每周/每月完成多少次,甚至是跟一群人一起打卡,互相鼓勵和分享,這樣一些看似很難實現的大目標,就被我們拆分成每周/每月去完成的小目標,這樣也就變得很容易實現。這也是陳海賢老師在他的書《了不起的我》裡頭提到的 —— 小步子原理。
如果你的目標跟我一樣是:
提高閱讀官方文檔、白皮書、論文等英文權威資料的能力;
深入學習常用的技術,打造自己的競爭力;
提升溝通、管理、思考、寫作等綜合能力;
保持技術熱情;
那麼你可以這樣制定自己的每周打卡計劃:
每周至少做一個 Leetcode 演算法題。主要是為了保持技術熱情,不忘初心。
閱讀並點評至少一篇英文技術文章。主要是為了提高英文閱讀能力,讓你能閱讀更多的權威資料。
分享一個技術知識。主要是為了歸納總結你的技術學習,最好是在某個你常用的領域,不斷深入學習,提升競爭力。
分享一個你在非技術領域獲得的感受。主要是為了在其他方面也能夠得到成長。
每周完成這四個目標後,把四個目標對應的輸出合併在一起,發佈出來,完成打卡。
如果你的目標跟我不同,想在其他方面有所發展,也可以制定自己的目標和打卡計劃。但有一點,我希望你的成果,是能夠輸出出來,給其他人去看的。
如果你仔細看我的目標,你會發現,我的結果都是對外可見的。不管是代碼,還是點評文章、還是分享,以及最後的彙總發佈,因為只有你的成果,是你願意去對外分享的,你才真的收穫到了東西。
如果你只是在心裡跟自己說,我這周學習了,很努力了,但其實你並沒有收穫到什麼,那你只是在自欺欺人,假裝很努力。
但是一個人的自控力是有限的,不可能要求自己每次都能管住自己,每次都能約束住自己,這時候,就需要藉助外界的力量。這時候,找一群志同道合的人,一起學習,一起打卡,就變得特別有意義。
轉自:公眾號-柳樹的絮叨叨