我自己作為一個非科班的程序員,并且在工作中觀察了“這兩類”工程師的表現(xiàn),我認為科班和非科班最大的區(qū)別在于:科班的同學知道去學什么,問題出現(xiàn)了他知道自己是哪里有知識漏洞;而非科班的,可能 壓根不知道自己不知道什么 。 (解決方式:建立系統(tǒng)的知識體系、尋求老板、tech lead 的指點,快速補充基礎并反復學習。)
因此這篇文章我想粗淺的聊聊成為一個工程師需要掌握的大致學習路線,更多的偏入門一些,不涉及具體的工作方向。正如柏拉圖所說:
如果把學習比作練功的話,我把我的學習內容分為: 修煉“外功”:偏應用 修煉“內功”:偏基礎 兩者配合,才能仗劍走天涯!
一、外功1. Linux 操作系統(tǒng) 對于想做開發(fā)的同學,如果還是個小白,問我第一件事情該做什么,我會強烈推薦先學習 Linux 操作系統(tǒng),因為互聯(lián)網(wǎng)公司基本上大部分業(yè)務框架部署都是在 Linux 操作系統(tǒng)上進行的。 我認為學習 Linux 操作系統(tǒng)的重點就在于學習各種強大 命令 如何組合運用。 一是因為工作中我們經(jīng)常需要用到,比如對各種日志文件進行分析,寫腳本驅動機器幫助我們工作。 二是面試時經(jīng)常會給出一個需求場景讓你編寫相關的組合命令,比如統(tǒng)計一段日志中各種 IP 地址出現(xiàn)的次數(shù)。 給大家推薦一本 Linux 界的“圣經(jīng)”。
《鳥哥的 Linux 私房菜》蟬聯(lián)最受歡迎華語 Linux 書籍第一的位置,無人能撼動。 對于想走開發(fā)路線,或者互聯(lián)網(wǎng)技術路線的同學,學習 Linux 絕對是必須的。 這是一本既能幫助你入門,又能隨時備查的工具書。更特別的是鳥哥的寫作風格,非??谡Z化,讀起來感覺像是有人在跟你實時互動聊天。 建議想要學習的同學可以收藏一本電子版隨時備查。第一次閱讀的同學估計會被它的厚度嚇到,但其實沒有必要去一字一字的全部讀完,快速的看完前面十章,你就會對 Linux 有一個初步的認識。以后需要用到哪些命令和知識隨時再查就可以了。
2. 學習一門語言和框架 對 Linux 操作系統(tǒng)有了一定的了解之后,大家就可選擇一門編程語言及其通用框架進行學習開發(fā)。 語言的學習和框架可以借助的資料就很多了,每個人的習慣都不一樣。喜歡跟著視頻學習的可以去慕課網(wǎng)、極客時間,上面有很多性價比很高的課程。另外推薦大家可以加入一些交流群,嗯,比如我的讀者交流群,另外一些框架或者語言的官網(wǎng)里面都會有自己社區(qū)和交流群的聯(lián)系方式,里面會有很多精華帖子和大牛進行分享。 說回我自己,當時入門語言是 C++,研究生課程要用,沒基礎也只能硬著頭皮上了。 但其實很多 C++ 的課程或者書籍都是先講 C 語言,比如《C++ Primer》前面幾章都是講的 C 語言,所以也還好。 現(xiàn)在看來,我認為這三門語言都是需要學習的: Java 是綜合能力很強的語言,很多互聯(lián)網(wǎng)公司大型的框架或者開源項目都是基于 Java 的,因為它有非常完成的一套輪子,能夠快速幫助企業(yè)解決業(yè)務問題; C 語言偏底層,很多軟件都是用 C 來寫的或者和它有間接的關系,學習 C 能夠幫你更好的理解計算機; C++ 雖然有些復雜,但它在某些應用場景中有很強的不可替代性,很多公司還在用 C++ 開發(fā)核心架構,比如騰訊、百度、谷歌等。 做開發(fā)的同學經(jīng)常戲稱自己的工作就是“增刪查改”,那么增刪查改自然離不開對數(shù)據(jù)庫的使用,做項目的時候就要學習數(shù)據(jù)庫的使用。
3. 數(shù)據(jù)庫 雖然我是全棧程序員,但是工作中多數(shù)處理的還是后端問題,數(shù)據(jù)庫真的非常非常常用。 在我轉行成為“專業(yè)”的程序員之前,在金融公司里也常用數(shù)據(jù)庫,畢竟交易系統(tǒng)的下游肯定是數(shù)據(jù)庫,數(shù)據(jù)也是一切模型的前提。 初學者建議由淺入深,先學習怎么用。 推薦這本書《MySQL 必知必會》,是一本稍厚的小冊子,書中沒有講太多數(shù)據(jù)庫的底層原理,但是條理清晰、簡明扼要的介紹了初學者應該掌握的基礎知識。
一個晚上的時間坐下來靜靜的看,你會發(fā)現(xiàn)你對 SQL 語句如何編寫會有一個很系統(tǒng)性認識。 面試時候面試官常常問一個需求場景,讓你編寫相關的 SQL 語句。 比如我面試時遇到的一個問題:寫一個 SQL: table(Sno, Sname, classId, grade)查出每個班成績前三名的同學? 但僅僅是掌握基本的 SQL 語句編寫是遠遠不夠的。 “增刪查改”里面也有大學問,同樣是增刪查改,有些人就能把數(shù)據(jù)庫性能玩轉到極致。 想玩到極致自然離不開我們對 底層原理 的把握,這也是面試時候面試官最喜歡考察的內容,下面介紹兩本和數(shù)據(jù)庫底層原理相關的書籍。
《MySQL 技術內幕:InnoDB 存儲引擎》由國內資深 MySQL 專家親自執(zhí)筆。本書的內容不是著眼于基本的語法教學,而是通過對數(shù)據(jù)庫底層數(shù)據(jù)結構、工作機制的分析,告訴我們如何編寫 SQL 語句才是高效的,告訴我們索引如何利用才能發(fā)揮最佳效果。 舉幾個面試常見的問題,聯(lián)合索引為什么要最左匹配?數(shù)據(jù)庫的隔離級別是怎么實現(xiàn)的?都可以在里面找到答案,數(shù)據(jù)庫絕對是開發(fā)適合面試考察的重點。這本書是通過大量的例子和插圖進行知識講解,會給人留下很直觀印象。 還有一本書和 Redis 相關的。
Redis 是世界上最受歡迎的非關系型數(shù)據(jù)庫之一,常常用來當作緩存和 MySQL 配套使用。 Redis 本身的語法并不復雜,同學們可以找到很多這方面的語法教學資料。 面試時候常常會被問到,Redis 為什么會這么快?如果只是回答因為它是基于內存的數(shù)據(jù)庫,那么面試就涼涼啦。真正的關鍵秘訣是在于 Redis 的設計與實現(xiàn),閱讀這本書你會發(fā)現(xiàn),Redis 是通過一系列底層設計來保證它快速存取的性能。
二、內功1. 算法和數(shù)據(jù)結構 我認為算法和數(shù)據(jù)結構是計算機最重要的東西,沒有之一。 程序 = 數(shù)據(jù)結構 + 算法。 工作中需要分析復雜度,很多性能上的問題都依賴算法和數(shù)據(jù)結構來解決,并且?guī)Ыo你思維方式上的改變。有沒有學過算法,決定了你能否想到最優(yōu)的解決方案。 同時算法也是計算機的基礎,任何一個你使用的軟件或者框架中都一定有算法和數(shù)據(jù)結構。比如數(shù)據(jù)庫索引使用了 B+ 樹。 在此先推薦這本書:_Algorithms + Data Structures = Programs_
而功利一點來說,算法題的考察是進大廠必備的。 國外的不管大中小公司、國內呢像字節(jié)跳動,基本上每一輪面試官都會讓你“手撕“代碼,因為這是對我們寫代碼能力最直接的考察。 對國內的面試,我建議從《劍指 offer》這本書開始學習,然后陸續(xù)到牛客網(wǎng)或者 Leetcode 開始你的刷題之旅。
這本書的作者通過 50 多道算法題作為案例,像我們講解了面試官考察的思路和一些基本數(shù)據(jù)結構算法的運用,讀這本書我們會感覺是一個資深面試官在對我循循善誘,指出我們常見的錯誤和學習的方向。 刷完這本書之后,就可以在 Leetcode 上繼續(xù)找各類型的題目進行學習,我個人感覺一般對于面試來說,如果能把兩百道中等題目刷的比較熟練是足以找到一份不錯的工作了。
2. 設計模式 設計模式可以說是寫出高質量代碼的關鍵。 我在入職前快速學習了設計模式,入職后看代碼就順暢很多,很多設計如果你不知道這種模式就不能理解為什么要這樣做。 我覺得學習設計模式的是一個培養(yǎng)自己“審美”能力的過程,和畫作、音樂不同,計算機的世界審美標準比較統(tǒng)一,那么我們首先需要知道游戲規(guī)則,然后才能打怪升級。 推薦書籍《設計模式》:
看一遍是不夠的,也不需要一遍追求完全看懂。 在這一年里,我反復讀這本書,遇到不同的問題時去看,隨著代碼量的積累,對設計模式的理解也會不同。 同時因為 code review 時會有同事給出意見,這樣更能促進我的進步。 所以對于還沒有工作的同學,我不建議花大量時間在這上面,因為沒有人給你反饋,可能效果有限,而且這項內功是需要我們終身修煉的,不必急于一時。
3. 操作系統(tǒng) 說到這里,我們已經(jīng)學習了 Linux 操作系統(tǒng),學習了一門語言和通用框架并且做了一個小項目,學習了一種常見的關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫,算法和數(shù)據(jù)結構也過關了,拿 offer 應該沒問題了。 那么后端開發(fā)還需要我們學習計算機哪些知識呢? 推薦大名鼎鼎的 CSAPP:_Computer Systems: A Programmer's Perspective_
這本書我在很久之前的視頻里就推薦過了,它把計算機底層原理講解的非常透徹,重要性不言而喻。 當然了,書很厚,很難啃~ 那理解了計算機系統(tǒng)有什么用呢? 很難說具體有什么運用,但其實卻是無處不在,比如工作中的性能優(yōu)化。 如果把開發(fā)當作修煉一門功夫這些方面的內容就像是內功,只有內功修煉扎實了,最后開發(fā)才能更加穩(wěn)固,做出來的項目才是可靠的。于我們個人而言,才能走得更遠。
4. 計算機網(wǎng)絡 面試還喜歡考察什么內容呢? 比如面試常常會問一道經(jīng)典面試題: 從輸入一個 URL 到出現(xiàn)頁面的過程發(fā)生了什么? 如果你學過計算機網(wǎng)絡就會對這個問題起碼有一個大概的認識。 那么這個問題有什么用呢?比如當你的訪問 web 頁面出現(xiàn)了“白頁“(web 頁面一片空白)這種故障,你會怎么排查?如果你只是著眼于自己的代碼和服務端,不清楚整個請求鏈路發(fā)生了什么,遇到一些稍微復雜的故障你就束手無策了。 無論是不是計算機科班學生,我都強烈建議把計算機網(wǎng)絡學好。 當然,如果更加“功利“一點,我覺得直接去搜相關的”面經(jīng)“來看,看看什么問題是最常問的,把相關板塊的知識弄懂熟透,形成自己的回答條理,看看自己能不能清晰的回答。 TCP 三次握手說一下? 為什么要三次握手呢?兩次、四次不行嗎? HTTP 協(xié)議哪一層? 說一下 URL 到出現(xiàn)頁面的整個過程? 推薦書籍:《計算機網(wǎng)絡:自頂向下》
5. 計算機發(fā)展史 最后一點呢,是我自己感興趣的,順便推薦給大家。 計算機是一門非常非常有意思的學科,很好玩的學科,從最早的圖靈機、到如今的臺式機、筆記本電腦,以及我最近玩的樹莓派,都是非常非常有意思的。 學習這些東西是為了激發(fā)我的學習熱情,保持自己的好奇心的一種方式。
三、踏入江湖如果你能做一個相對不錯的項目,對各類面經(jīng)知識能回答的七八分,算法題做了 200 道,我建議可以開始面試了,那么就真正踏入了江湖。 踏入江湖之后,我們仍需不斷反復修煉自己的“外功”和“內功”,不斷提高自己的功力,哪怕是同一本書,在工作的不同階段讀,一定會有不同的體會。 當然了,以上這些還只是職場硬實力,而能在江湖混的風生水起,一定也離不開過人的軟實力。 但是軟實力一定是建立在硬實力之上的,沒有雪中送炭的作用,只可以錦上添花。 當然了,如果硬實力強到一定程度,是不需要軟實力的,但不適合 99% 的人。 路上陽光正好,愿每一位踏入江湖的少年都能瀟瀟灑灑,仗劍走天涯!
另外本人是一名CC++的程序員,如果你想更好的提升你的編程能力,好好學習C/C++編程知識的話!那么你很幸運~ C語言C++編程學習交流圈子,QQ群1090842465【點擊進入】微信公眾號:C語言編程學習基地 分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎入門教程) 歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦! 編程學習書籍: 編程學習視頻:
|
|