我是如何提高自己的「編程能力」的?

  • 2020 年 12 月 23 日
  • 筆記

上周的投票,大家最關心的還是提高技術,那我們今天就來聊聊這個話題。

之前主要分享的多是算法和數據結構方面(年後繼續),因為我認為算法和數據結構是程序員最最最重要的內功,但是並不是唯一。

我自己作為一個非科班的程序員,並且在工作中觀察了「這兩類」工程師的表現,我認為科班和非科班最大的區別在於:科班的同學知道去學什麼,問題出現了他知道自己是哪裡有知識漏洞;而非科班的,可能壓根不知道自己不知道什麼

(解決方式:建立系統的知識體系、尋求老闆、tech lead 的指點,快速補充基礎並反覆學習。)

因此這篇文章我想粗淺的聊聊成為一個工程師需要掌握的大致學習路線,更多的偏入門一些,不涉及具體的工作方向。歡迎大家在文末分享你的學習心得,正如柏拉圖所說:

人只有通過和別人討論,才能知道我們的經驗是不是真實的。

文章略長,如果一次沒時間看完,建議先拉到文末參與抽獎送書活動~

如果把學習比作練功的話,我把我的學習內容分為:

  • 修鍊「外功」:偏應用
  • 修鍊「內功」:偏基礎

兩者配合,才能仗劍走天涯!

一、外功

1. Linux 操作系統

對於想做開發的同學,如果還是個小白,問我第一件事情該做什麼,我會強烈推薦先學習 Linux 操作系統,因為互聯網公司基本上大部分業務框架部署都是在 Linux 操作系統上進行的。

我認為學習 Linux 操作系統的重點就在於學習各種強大命令如何組合運用。

一是因為工作中我們經常需要用到,比如對各種日誌文件進行分析,寫腳本驅動機器幫助我們工作。

二是面試時經常會給出一個需求場景讓你編寫相關的組合命令,比如統計一段日誌中各種 IP 地址出現的次數。

給大家推薦一本 Linux 界的「聖經」。

《鳥哥的 Linux 私房菜》蟬聯最受歡迎華語 Linux 書籍第一的位置,無人能撼動。

對於想走開發路線,或者互聯網技術路線的同學,學習 Linux 絕對是必須的。

這是一本既能幫助你入門,又能隨時備查的工具書。更特別的是鳥哥的寫作風格,非常口語化,讀起來感覺像是有人在跟你實時互動聊天。

建議想要學習的同學可以收藏一本電子版隨時備查。第一次閱讀的同學估計會被它的厚度嚇到,但其實沒有必要去一字一字的全部讀完,快速的看完前面十章,你就會對 Linux 有一個初步的認識。以後需要用到哪些命令和知識隨時再查就可以了。

2. 學習一門語言和框架

對 Linux 操作系統有了一定的了解之後,大家就可選擇一門編程語言及其通用框架進行學習開發。

語言的學習和框架可以藉助的資料就很多了,每個人的習慣都不一樣。喜歡跟着視頻學習的可以去慕課網、極客時間,上面有很多性價比很高的課程。另外推薦大家可以加入一些交流群,嗯,比如我的讀者交流群,另外一些框架或者語言的官網裏面都會有自己社區和交流群的聯繫方式,裏面會有很多精華帖子和大牛進行分享。


說回我自己,當時入門語言是 C++,研究生課程要用,沒基礎也只能硬着頭皮上了。

但其實很多 C++ 的課程或者書籍都是先講 C 語言,比如《C++ Primer》前面幾章都是講的 C 語言,所以也還好。

後來刷題的時候覺得 C++ 刷題有些麻煩,聽了朋友建議選擇了 Java,真心感謝他的建議,在這裡我也建議如果你不知道應該選什麼語言,自己也沒有特殊偏愛的話,那就無腦選 Java 吧。

因為 Java 市面上學習資料非常的多,無論是國內還是國外大廠 Java 的就業面都非常廣,對於新人來說目前是個很穩妥的選擇。

當然,如果你不放心,可以在任何一個招聘網站上面查一查各種語言給崗位需求,只要不是那種很窄門的語言,我覺得學習都是沒有問題的。像 Go、Python、C++ 等等就業面還是廣泛的。

現在看來,我認為這三門語言都是需要學習的:

  • Java 是綜合能力很強的語言,很多互聯網公司大型的框架或者開源項目都是基於 Java 的,因為它有非常完成的一套輪子,能夠快速幫助企業解決業務問題;
  • C 語言偏底層,很多軟件都是用 C 來寫的或者和它有間接的關係,學習 C 能夠幫你更好的理解計算機;
  • C++ 雖然有些複雜,但它在某些應用場景中有很強的不可替代性,很多公司還在用 C++ 開發核心架構,比如騰訊、百度、谷歌等。

如何學習呢?這裡拿 Java 舉例來說。

A. 基礎部分

推薦書籍:

同時推薦 B 站尚學堂的這套免費課程,可以說包含了 Java 的全部內容了。

//space.bilibili.com/392179313

我自己總結的關於 Java 集合的文章:

👉 Java 集合框架看這一篇就夠了

另外如何寫出高效的 Java 代碼,再次拿出我喜歡的這本 Effective Java了,其實我覺得 Effective C++ 會更好些,不過 Java 這本有針對 Java 的內容,具體的介紹可以看我這個視頻:

B. 實戰部分

學習一門語言和框架我認為最好的方式就是做項目,做項目除了鍛煉我們開發能力外,在找實習和找工作時候也是和面試官很好的切入點。

Java 的 Spring 框架是必須要用的,推薦《Spring 實戰》這本書。

Spring IoC 和 AOP 是核心,如何理解,看我這篇文章:

👉 一分鐘帶你玩轉 Spring IoC

你可以去 Github 上找一些感興趣的項目入手,或者是跟着一些課程視頻做項目。

比如我們習以為常的博客系統,你可以親自動手實現感受一下做一個博客的全過程。

面試時候面試官常常會問:

  • 你做這個項目有什麼亮點?
  • 你解決的最難問題是什麼?

這些問題都是想考察你知識深度,所以做項目時候要思考一些有趣的點,或者就是別人的東西自己內化一下。

比如說,我使用了幾種不同的緩存技術極大的降低了響應耗時,接下來再跟面試官去講自己的實現思路和對緩存技術的深入理解,做到「年輕人有備而來」。

做開發的同學經常戲稱自己的工作就是「增刪查改」,那麼增刪查改自然離不開對數據庫的使用,做項目的時候就要學習數據庫的使用。

3. 數據庫

雖然我是全棧程序員,但是工作中多數處理的還是後端問題,數據庫真的非常非常常用。

在我轉行成為「專業」的程序員之前,在金融公司里也常用數據庫,畢竟交易系統的下游肯定是數據庫,數據也是一切模型的前提。

初學者建議由淺入深,先學習怎麼用。

推薦這本書《MySQL 必知必會》,是一本稍厚的小冊子,書中沒有講太多數據庫的底層原理,但是條理清晰、簡明扼要的介紹了初學者應該掌握的基礎知識。

一個晚上的時間坐下來靜靜的看,你會發現你對 SQL 語句如何編寫會有一個很系統性認識。

面試時候面試官常常問一個需求場景,讓你編寫相關的 SQL 語句。

比如我面試時遇到的一個問題:寫一個 SQL: table(Sno, Sname, classId, grade)查出每個班成績前三名的同學?

但僅僅是掌握基本的 SQL 語句編寫是遠遠不夠的。

「增刪查改」裏面也有大學問,同樣是增刪查改,有些人就能把數據庫性能玩轉到極致。

想玩到極致自然離不開我們對底層原理的把握,這也是面試時候面試官最喜歡考察的內容,下面介紹兩本和數據庫底層原理相關的書籍。


《MySQL 技術內幕:InnoDB 存儲引擎》由國內資深 MySQL 專家親自執筆。本書的內容不是着眼於基本的語法教學,而是通過對數據庫底層數據結構、工作機制的分析,告訴我們如何編寫 SQL 語句才是高效的,告訴我們索引如何利用才能發揮最佳效果。

舉幾個面試常見的問題,聯合索引為什麼要最左匹配?數據庫的隔離級別是怎麼實現的?都可以在裏面找到答案,數據庫絕對是開發適合面試考察的重點。這本書是通過大量的例子和插圖進行知識講解,會給人留下很直觀印象。

還有一本書和 Redis 相關的。

Redis 是世界上最受歡迎的非關係型數據庫之一,常常用來當作緩存和 MySQL 配套使用。

Redis 本身的語法並不複雜,同學們可以找到很多這方面的語法教學資料。

面試時候常常會被問到,Redis 為什麼會這麼快?如果只是回答因為它是基於內存的數據庫,那麼面試就涼涼啦。真正的關鍵秘訣是在於 Redis 的設計與實現,閱讀這本書你會發現,Redis 是通過一系列底層設計來保證它快速存取的性能。

二、內功

1. 算法和數據結構

我認為算法和數據結構是計算機最重要的東西,沒有之一。

程序 = 數據結構 + 算法。

學習算法究竟有什麼用呢?為什麼大廠喜歡考察算法?可以看我這篇文章:

👉 刷題到底有什麼用?你這麼刷題還真沒用

工作中需要分析複雜度,很多性能上的問題都依賴算法和數據結構來解決,並且帶給你思維方式上的改變。有沒有學過算法,決定了你能否想到最優的解決方案。

同時算法也是計算機的基礎,任何一個你使用的軟件或者框架中都一定有算法和數據結構。比如數據庫索引使用了 B+ 樹。

在此先推薦這本書:Algorithms + Data Structures = Programs

而功利一點來說,算法題的考察是進大廠必備的。

國外的不管大中小公司、國內呢像位元組跳動,基本上每一輪面試官都會讓你「手撕「代碼,因為這是對我們寫代碼能力最直接的考察。

國外面試

對於國外面試的準備,大家可以看我之前寫的自己的備考經歷:

👉 從小白到 6 個 offer,我究竟是怎麼刷題的?

同時推薦普利斯頓老爺爺的算法課,B 站也有搬運版://www.bilibili.com/video/av50599771/

喏,就是這本書的作者,斯坦福的 PhD。

國內面試

對國內的面試,我建議從《劍指 offer》這本書開始學習,然後陸續到牛客網或者 Leetcode 開始你的刷題之旅。

這本書的作者通過 50 多道算法題作為案例,像我們講解了面試官考察的思路和一些基本數據結構算法的運用,讀這本書我們會感覺是一個資深面試官在對我循循善誘,指出我們常見的錯誤和學習的方向。

刷完這本書之後,就可以在 Leetcode 上繼續找各類型的題目進行學習,我個人感覺一般對於面試來說,如果能把兩百道中等題目刷的比較熟練是足以找到一份不錯的工作了。

各種算法和數據結構我也寫過不少了,在我的 Github 上都有分類匯總,大家可以自行取用:

我的 Github://github.com/xiaoqi6666/NYCSDE

2. 設計模式

設計模式可以說是寫出高質量代碼的關鍵。

我在入職前快速學習了設計模式,入職後看代碼就順暢很多,很多設計如果你不知道這種模式就不能理解為什麼要這樣做。

我覺得學習設計模式的是一個培養自己「審美」能力的過程,和畫作、音樂不同,計算機的世界審美標準比較統一,那麼我們首先需要知道遊戲規則,然後才能打怪升級。

推薦書籍《設計模式》:

看一遍是不夠的,也不需要一遍追求完全看懂。

在這一年裡,我反覆讀這本書,遇到不同的問題時去看,隨着代碼量的積累,對設計模式的理解也會不同。

同時因為 code review 時會有同事給出意見,這樣更能促進我的進步。

所以對於還沒有工作的同學,我不建議花大量時間在這上面,因為沒有人給你反饋,可能效果有限,而且這項內功是需要我們終身修鍊的,不必急於一時。

3. 操作系統

說到這裡,我們已經學習了 Linux 操作系統,學習了一門語言和通用框架並且做了一個小項目,學習了一種常見的關係型數據庫和非關係型數據庫,算法和數據結構也過關了,拿 offer 應該沒問題了。

那麼後端開發還需要我們學習計算機哪些知識呢?

推薦大名鼎鼎的 CSAPP:Computer Systems: A Programmer’s Perspective

這本書我在很久之前的視頻里就推薦過了,它把計算機底層原理講解的非常透徹,同時 CMU 也有配套的課程://csapp.cs.cmu.edu/3e/courses.html ,重要性不言而喻。

當然了,書很厚,很難啃,小齊給你劃重點章節:

1,2,3,6,7,8,9 章

讀不下來?加入自習室,我們一起打卡!

那理解了計算機系統有什麼用呢?

很難說具體有什麼運用,但其實卻是無處不在,比如工作中的性能優化。

如果把開發當作修鍊一門功夫這些方面的內容就像是內功,只有內功修鍊紮實了,最後開發才能更加穩固,做出來的項目才是可靠的。於我們個人而言,才能走得更遠。

4. 計算機網絡

面試還喜歡考察什麼內容呢?

比如面試常常會問一道經典面試題:**從輸入一個 URL 到出現頁面的過程發生了什麼?**如果你學過計算機網絡就會對這個問題起碼有一個大概的認識。

那麼這個問題有什麼用呢?比如當你的訪問 web 頁面出現了「白頁「(web 頁面一片空白)這種故障,你會怎麼排查?如果你只是着眼於自己的代碼和服務端,不清楚整個請求鏈路發生了什麼,遇到一些稍微複雜的故障你就束手無策了。

無論是不是計算機科班學生,我都強烈建議把計算機網絡學好。

當然,如果更加「功利「一點,我覺得直接去搜相關的」面經「來看,看看什麼問題是最常問的,把相關板塊的知識弄懂熟透,形成自己的回答條理,看看自己能不能清晰的回答。

  • TCP 三次握手說一下?
  • 為什麼要三次握手呢?兩次、四次不行嗎?
  • HTTP 協議哪一層?
  • 說一下 URL 到出現頁面的整個過程?

推薦書籍:《計算機網絡:自頂向下》

推薦課程:斯坦福大學 CS 144 計算機網絡

B 站鏈接://www.bilibili.com/video/av96841516/

5. 計算機發展史

最後一點呢,是我自己感興趣的,順便推薦給大家。

計算機是一門非常非常有意思的學科,很好玩的學科,從最早的圖靈機、到如今的台式機、筆記本電腦,以及我最近玩的樹莓派,都是非常非常有意思的。

學習這些東西是為了激發我的學習熱情,保持自己的好奇心的一種方式。

推薦視頻:Crash Course Computer Science – 翻譯叫「計算機速成課」,但並非那種「速成」。

B 站中英文版本://www.bilibili.com/video/av21376839/

字幕組的 Github: //github.com/1c7/Crash-Course-Computer-Science-Chinese

這門課我真是相見恨晚,每一集只有 10-12 分鐘,一共 40 集,主講人非常激情澎湃,你能夠隔着屏幕感受到她對計算機科學的熱情,對我影響很大。

三、踏入江湖

如果你能做一個相對不錯的項目,對各類面經知識能回答的七八分,算法題做了 200 道,我建議可以開始面試了,那麼就真正踏入了江湖。

踏入江湖之後,我們仍需不斷反覆修鍊自己的「外功」和「內功」,不斷提高自己的功力,哪怕是同一本書,在工作的不同階段讀,一定會有不同的體會。

當然了,以上這些還只是職場硬實力,而能在江湖混的風生水起,一定也離不開過人的軟實力。

但是軟實力一定是建立在硬實力之上的,沒有雪中送炭的作用,只可以錦上添花。

當然了,如果硬實力強到一定程度,是不需要軟實力的,但不適合 99% 的人。

文中提到的所有書籍,我都整理好放在後台了~

獲取方式:先在右下角點個在看,然後回復【05】。

路上陽光正好,願每一位踏入江湖的少年都能瀟瀟洒灑,仗劍走天涯!