寫給程式員兒子的一封信

来源:https://www.cnblogs.com/chen-chen-chen/archive/2020/02/05/12266928.html
-Advertisement-
Play Games

親愛的兒子: 當你打開這封信的時候,我已經離開波士頓回到加州了,你也已經結束自己最後一個暑假,去往自己非常喜歡的公司。 雖然你我都是程式員,但是你卻很少向我咨詢過技術相關的問題,咱們上一次一起寫代碼,也是你高考結束那個暑假了。不過前幾天你問了我一個問題,你說,如果讓你寫一封信,跟當初剛剛成為程式員的 ...


親愛的兒子:

當你打開這封信的時候,我已經離開波士頓回到加州了,你也已經結束自己最後一個暑假,去往自己非常喜歡的公司。

雖然你我都是程式員,但是你卻很少向我咨詢過技術相關的問題,咱們上一次一起寫代碼,也是你高考結束那個暑假了。不過前幾天你問了我一個問題,你說,如果讓你寫一封信,跟當初剛剛成為程式員的自己說一些話,你會說什麼呢?

我在想,我會說些什麼呢?我想說的太多了,可是如果說了,他能聽進去多少呢,就算聽進去了,他又會用到多少呢?我想起了瑞·達利歐的《原則》,如果我把我這幾年的經歷、收穫,總結成幾條原則,是不是會好一些。

以下,是我總結的幾條原則。

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):

後端程式員技術圖

https://mmbiz.qpic.cn/mmbiz_png/lA1CtgibZZmyt3iaIoyCOiaGZraX54JIKzMiczLhgxQxbt66ia5aMq14zdU9iboAYA8ncFdP1J8gBNff6opXXnxicvkTA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

當然,不是這裡面的東西都要學,如果都學,你可能就會和其他程式員一樣,只懂得怎麼用,而不知道技術底層是怎麼實現的。

挑其中你最常用的幾項,比如 Java、Spring、Dubbo、MySQL、Kafka、Apollo,深入研究他們,閱讀他們的官方文檔,看源碼,知其然知其所以然。

檢驗的標準很簡單:梳理出自己的一套調優方法/最佳實踐,並能解釋為什麼這樣做是最優的,這就要求你弄懂它們底層的原理。

3.不只是技術

技術是用來解決問題的,但是當你工作後,你也許會發現,只靠技術,是不能解決所有問題的。
你需要熟悉公司的業務,理解需求的價值和目標,再用合適的技術去實現它,能解決問題的程式員才是牛逼的程式員;
你想用的技術,公司不支持,也許是因為需要更多的機器,你需要學會怎麼在技術和成本之間做平衡;
技術是你的一把錘子,但不要有了錘子,就認為萬物都是釘子,什麼都想用技術去解決,也許換個需求的實現方式,也能解決用戶的痛點,而且實現起來還更簡單,那何樂而不為?
只會用技術解決問題,那不是你掌握了技術,而是技術控制了你;
知道什麼時候要用技術解決問題,用什麼技術,這才是你掌握了技術。
你要學習的,不只是技術,也許還有溝通、管理、寫作、思考等等能力,也許你需要閱讀很多非技術類的書籍,我也會在後面的來信中和你分享一些書單。

4.保持技術熱情

你是不是覺得我很矛盾,剛說不要只懂技術,現在又讓保持技術熱情。
可是這兩者並不衝突呀,只懂技術是一個極端,喪失了對技術的熱情又是另一個極端,最好的狀態就是,保持對技術的熱情,又清醒的知道不必什麼都用技術去解決。

為什麼會失去對技術的熱情呢?也許就是因為上面所說的,你發現了太多太多的事情,不是用技術就能解決的,現實並非你以前認為的那麼純粹,現實世界並不像電腦世界那樣,特定的輸入就有特定的輸出。

但是,想一想你為什麼選擇了做軟體、做科學,也許當初你愛上編程,就是因為你喜歡創造,你享受自己寫下的代碼,創作的的作品,運行起來時的那種美妙的感受,哪怕只是打出一行“Hello World”,都讓你開心半天,更何況是你寫的代碼,做的輪子,被成千上萬的用戶使用了呢?

總而言之,不忘初心,不要被工作、生活的其他雜七雜八的因素,毀滅了你的技術熱情。

你想問我是怎麼保持技術熱情的?

我的方法很簡單,那就是在工作之外,自己寫些代碼解決問題,如果實在沒有問題可以解決,我就寫編程題、寫演算法題,我還喜歡用非工作語言的編程語言來寫,比如我工作用的 Java,那業餘時間我就用 Python。

寫代碼有時就像寫作,寫著寫著,你就會不由自主的回憶和思考,拾回一些丟失的東西。

5.馬上就乾

很多人懂得很多道理,但就是過不好這一生,每年年初都制定了一堆計劃,但是最後發現都沒堅持去做。
也許你看了我上面的信,有很多感觸,但是如果沒有行動,這些收穫就不能轉化為實實在在的東西。

我相信你不想成為這樣的人,怎麼辦?四個字:馬上就乾。

通常當我聽到一些很有用的話時,我不會就此打住,我會繼續追問,然後呢?然後我可以做什麼呢?有什麼事是我馬上就能做的呢?

陳皓老師(左耳朵耗子)發起的一個叫 ARTS 的打卡計劃啟發了我,如果我們可以針對我們的目標,列出對應的行動,並且給自己佈置作業:每周/每月完成多少次,甚至是跟一群人一起打卡,互相鼓勵和分享,這樣一些看似很難實現的大目標,就被我們拆分成每周/每月去完成的小目標,這樣也就變得很容易實現。這也是陳海賢老師在他的書《了不起的我》裡頭提到的 —— 小步子原理。

如果你的目標跟我一樣是:

提高閱讀官方文檔、白皮書、論文等英文權威資料的能力;
深入學習常用的技術,打造自己的競爭力;
提升溝通、管理、思考、寫作等綜合能力;
保持技術熱情;
那麼你可以這樣制定自己的每周打卡計劃:

每周至少做一個 Leetcode 演算法題。主要是為了保持技術熱情,不忘初心。
閱讀並點評至少一篇英文技術文章。主要是為了提高英文閱讀能力,讓你能閱讀更多的權威資料。
分享一個技術知識。主要是為了歸納總結你的技術學習,最好是在某個你常用的領域,不斷深入學習,提升競爭力。
分享一個你在非技術領域獲得的感受。主要是為了在其他方面也能夠得到成長。
每周完成這四個目標後,把四個目標對應的輸出合併在一起,發佈出來,完成打卡。

如果你的目標跟我不同,想在其他方面有所發展,也可以制定自己的目標和打卡計劃。但有一點,我希望你的成果,是能夠輸出出來,給其他人去看的。

如果你仔細看我的目標,你會發現,我的結果都是對外可見的。不管是代碼,還是點評文章、還是分享,以及最後的彙總發佈,因為只有你的成果,是你願意去對外分享的,你才真的收穫到了東西。

如果你只是在心裡跟自己說,我這周學習了,很努力了,但其實你並沒有收穫到什麼,那你只是在自欺欺人,假裝很努力。

但是一個人的自控力是有限的,不可能要求自己每次都能管住自己,每次都能約束住自己,這時候,就需要藉助外界的力量。這時候,找一群志同道合的人,一起學習,一起打卡,就變得特別有意義。

轉自:公眾號-柳樹的絮叨叨


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝C++環境MacOS安裝xcode查看是否安裝成功:$ g++ -vHell WorldC++ 程式的源文件通常使用擴展名 .cpp、.cp 或 .c。Hello WorldC++ 程式的源文件通常使用擴展名 .cpp、.cp 或 .c。編譯源文件$ g++ c.cpp由於命令行中未指定可執行程... ...
  • 一、ProxyHandler處理(代理伺服器) 1.使用代理IP,是爬蟲的常用手段 2.獲取代理伺服器的地址: www.xicidaili.com www.goubanjia.com 3.代理用來隱藏真實訪問中,代理不允許頻繁訪問某一個固定網站,所以代理一定要很多很多。 4.基本使用步驟: (1)設 ...
  • 數據結構小白入門 數據結構指一組相互之間存在一種或多種特定關係的數據元素的集合, 當我們需要在電腦中存儲這些數據時,還涉及到數據的,組織方式,在電腦中的存儲方式,以及定義在該數據上的一組操作; 一組數據相互之間有某種關係 組織方式 存儲方式 以及可對其進行的一組操作 理解: 我們學習的最終目的是 ...
  • 準備工作 IDEA 2019.3.1 MySql 8.0.17 Tomcat 7.0.9 開始步驟 一、創建一個項目,添加Web支持 點擊菜單:File NEW Project 1380074/202002/1380074 20200205231042588 855824854.png) 選擇左側的 ...
  • 問題1:Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app react-native run-android react-native star ...
  • 運用在React 中 setState的對象、數組的操作時是不能用類似array.push()等方法,因為push沒有返回值,setState後會出現state變成Number,為了方便他人和自己查看,因此寫個數組和對象的操作方法小筆記。 1、修改object中某項 this.setState({ ...
  • 1.最後生成的效果是這樣的: 2.第一個對話框如下(包含了樣圖),用於輸入維度個數【最小為4,最大不限】: 3.第二個對話框如下,根據維度個數生成了信息錄入表【每個維度3個信息,每3個一次重覆,不清楚意義清查看第一步】 4.第三個對話框如下,該錄入名稱最終展示在圖形中央上部,以及命名為圖片的文件名 ...
  • 1. 切勿混用帶符號類型和無符號類型 如果表達式里既有帶符號類型又有無符號類型,帶符號類型會自動轉換為無符號類型。 2. 列表初始化 列表初始化當用於內置類型時,如果存在精度丟失編譯器將報錯。 3. 變數聲明和定義的關係 4. C++操作符代替名 5. const限定符 6. 類型別名 7. dec ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...