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