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

之前主要分享的多是演算法和資料結構方面(年后繼續),因為我認為演算法和資料結構是程式員最最最重要的內功,但是并不是唯一,
我自己作為一個非科班的程式員,并且在作業中觀察了“這兩類”工程師的表現,我認為科班和非科班最大的區別在于:科班的同學知道去學什么,問題出現了他知道自己是哪里有知識漏洞;而非科班的,可能壓根不知道自己不知道什么,
(解決方式:建立系統的知識體系、尋求老板、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 的全部內容了,
https://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 站也有搬運版:https://www.bilibili.com/video/av50599771/
喏,就是這本書的作者,斯坦福的 PhD,

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

這本書的作者通過 50 多道演算法題作為案例,像我們講解了面試官考察的思路和一些基本資料結構演算法的運用,讀這本書我們會感覺是一個資深面試官在對我循循善誘,指出我們常見的錯誤和學習的方向,
刷完這本書之后,就可以在 Leetcode 上繼續找各型別的題目進行學習,我個人感覺一般對于面試來說,如果能把兩百道中等題目刷的比較熟練是足以找到一份不錯的作業了,
各種演算法和資料結構我也寫過不少了,在我的 Github 上都有分類匯總,大家可以自行取用:
我的 Github:https://github.com/xiaoqi6666/NYCSDE
2. 設計模式
設計模式可以說是寫出高質量代碼的關鍵,
我在入職前快速學習了設計模式,入職后看代碼就順暢很多,很多設計如果你不知道這種模式就不能理解為什么要這樣做,
我覺得學習設計模式的是一個培養自己“審美”能力的程序,和畫作、音樂不同,計算機的世界審美標準比較統一,那么我們首先需要知道游戲規則,然后才能打怪升級,
推薦書籍《設計模式》:

看一遍是不夠的,也不需要一遍追求完全看懂,
在這一年里,我反復讀這本書,遇到不同的問題時去看,隨著代碼量的積累,對設計模式的理解也會不同,
同時因為 code review 時會有同事給出意見,這樣更能促進我的進步,
所以對于還沒有作業的同學,我不建議花大量時間在這上面,因為沒有人給你反饋,可能效果有限,而且這項內功是需要我們終身修煉的,不必急于一時,
3. 作業系統
說到這里,我們已經學習了 Linux 作業系統,學習了一門語言和通用框架并且做了一個小專案,學習了一種常見的關系型資料庫和非關系型資料庫,演算法和資料結構也過關了,拿 offer 應該沒問題了,
那么后端開發還需要我們學習計算機哪些知識呢?
推薦大名鼎鼎的 CSAPP:Computer Systems: A Programmer's Perspective

這本書我在很久之前的視頻里就推薦過了,它把計算機底層原理講解的非常透徹,同時 CMU 也有配套的課程:http://csapp.cs.cmu.edu/3e/courses.html ,重要性不言而喻,
當然了,書很厚,很難啃,小齊給你劃重點章節:
1,2,3,6,7,8,9 章
讀不下來?加入自習室,我們一起打卡!
那理解了計算機系統有什么用呢?
很難說具體有什么運用,但其實卻是無處不在,比如作業中的性能優化,
如果把開發當作修煉一門功夫這些方面的內容就像是內功,只有內功修煉扎實了,最后開發才能更加穩固,做出來的專案才是可靠的,于我們個人而言,才能走得更遠,
4. 計算機網路
面試還喜歡考察什么內容呢?
比如面試常常會問一道經典面試題:**從輸入一個 URL 到出現頁面的程序發生了什么?**如果你學過計算機網路就會對這個問題起碼有一個大概的認識,
那么這個問題有什么用呢?比如當你的訪問 web 頁面出現了“白頁“(web 頁面一片空白)這種故障,你會怎么排查?如果你只是著眼于自己的代碼和服務端,不清楚整個請求鏈路發生了什么,遇到一些稍微復雜的故障你就束手無策了,
無論是不是計算機科班學生,我都強烈建議把計算機網路學好,
當然,如果更加“功利“一點,我覺得直接去搜相關的”面經“來看,看看什么問題是最常問的,把相關板塊的知識弄懂熟透,形成自己的回答條理,看看自己能不能清晰的回答,
TCP 三次握手說一下? 為什么要三次握手呢?兩次、四次不行嗎? HTTP 協議哪一層? 說一下 URL 到出現頁面的整個程序?
推薦書籍:《計算機網路:自頂向下》

推薦課程:斯坦福大學 CS 144 計算機網路
B 站鏈接:https://www.bilibili.com/video/av96841516/
5. 計算機發展史
最后一點呢,是我自己感興趣的,順便推薦給大家,
計算機是一門非常非常有意思的學科,很好玩的學科,從最早的圖靈機、到如今的臺式機、筆記本電腦,以及我最近玩的樹莓派,都是非常非常有意思的,
學習這些東西是為了激發我的學習熱情,保持自己的好奇心的一種方式,
推薦視頻:Crash Course Computer Science - 翻譯叫“計算機速成課”,但并非那種“速成”,
B 站中英文版本:https://www.bilibili.com/video/av21376839/
字幕組的 Github: https://github.com/1c7/Crash-Course-Computer-Science-Chinese
這門課我真是相見恨晚,每一集只有 10-12 分鐘,一共 40 集,主講人非常激情澎湃,你能夠隔著螢屏感受到她對計算機科學的熱情,對我影響很大,

三、踏入江湖
如果你能做一個相對不錯的專案,對各類面經知識能回答的七八分,演算法題做了 200 道,我建議可以開始面試了,那么就真正踏入了江湖,
踏入江湖之后,我們仍需不斷反復修煉自己的“外功”和“內功”,不斷提高自己的功力,哪怕是同一本書,在作業的不同階段讀,一定會有不同的體會,
當然了,以上這些還只是職場硬實力,而能在江湖混的風生水起,一定也離不開過人的軟實力,
但是軟實力一定是建立在硬實力之上的,沒有雪中送炭的作用,只可以錦上添花,
當然了,如果硬實力強到一定程度,是不需要軟實力的,但不適合 99% 的人,
文中提到的所有書籍,我都整理好放在后臺了~
獲取方式:先在右下角點個在看,然后回復【05】,
路上陽光正好,愿每一位踏入江湖的少年都能瀟瀟灑灑,仗劍走天涯!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239028.html
標籤:其他
下一篇:Linux 簡介、目錄結構
