收到一條讀者的私信,情真意切,因此我承諾他今天必定寫篇文章好好回覆他一下。先來看一下他的私信內容吧。git
首先映入個人眼簾的是這個稱呼——「老前輩」,我一會兒沒忍住,笑了!程序員
提及來也奇怪,上學的時候,同窗幾乎都比我大,玩得好的基本上都是哥哥或者姐姐。就連高三時追過的一個學妹,後來得知居然比我大幾個月。github
可這些年呢?無論是遇到的讀者,仍是寫博客的朋友,幾乎不約而同的比我小,有上初中的,有上高中的,有讀大學的,有在職的,幾乎都是 90 後或者 00 後。比我年長的,還真的是百裏挑一、屈指可數!面試
不得不感慨,本身真的是「老前輩」了!!!!!!!!!殘忍!!!!!!!!算法
至於說讀了個人文章後「深有感觸,百般感想」,我不得不認可,這話恭維出了一股濃烈的文學家的色彩!數據庫
一名普普統統的中職計算機學生,即將踏進大專的計算機應用領域,極度的誠懇,袒露心聲,但「堅信個人一輩子定與計算機相關」,鏗鏘有力,讓我這個「老前輩」都有點震撼到了!編程
其實不少人學編程都會遇到困難,一開始極度的迷茫,沒有方向。後端
我上大學以前,沒怎麼接觸過電腦。僅有的機會應該就是去網吧聊 QQ,打忍者神龜了吧!或者看某些動做電影。設計模式
那真的是一個蠻荒的年代。數組
上了大學後,雖然陰差陽錯的選了計算機專業,但同窗們都內心門清,這是學校最不重視的專業,老師們的水平也很是堪憂,上課的時候明顯感受到力不從心。
整個大學看得最多的書,就是《21 天學會 XXX》系列了,害,學的那叫一個什麼玩意。
一度懷疑,大學畢業後人該何去何從?
但上帝眷顧了我,讓我有幸在實習的時候進入一家外企,而且順利經過了三次考試,沒有被辭退,後來通過本身的努力居然是新人當中最快成爲團隊 Leader 的那一個。冥冥之中,這就成爲了個人人生轉折點。
往事不堪回首,有太多的內心話想要說給你們聽,請牢記。
第一,無論學校的課程有多爛,必定不要掛科。
不知道是從哪裏傳來的一句鬼話,「不掛科的大學是不精彩的。」
我大學的時候還特別喜歡這句話,因而還真掛科了好幾門,最後補考應該是批卷老師手下留情,都是壓着及格線過的。
我有幾個同窗,大學的時候特別喜歡打魔獸,幾乎成天的時光都泡了遊戲當中,有些還知道收穫愛情,有些可真慘,畢業的時候是一無全部,愛情沒有,畢業證都沒有,掛的科真的難補,老師再放水,也得本身過及格線啊。
學歷雖說不能表明一切,但步入了社會,想要作一名合格的打工人,這學歷是必不可少的,進工廠還必須得要求學歷呢。
98五、211 的學歷是學歷,雙非的本科也是學歷,就連被看不起的大專好歹也是學歷啊!
第二,本身要知道學,下勁學。
成績好,能夠去好的學校,選擇好的專業,成績很差,只能將就,天然身邊遇到的同窗,總體水平可能就要差一些。
若是你去的是一個很差的學校,身邊的同窗都在無所事事,都在消磨時光,假如你以爲既然你們都這樣,那本身也這樣吧,等到畢業的時候,才發現人家是叛逆,家裏已經安排穩當,你就真後悔也買不到後悔藥了!
我大學的同窗當中,有三個,是公認的喜歡編程的,願意把本身培養成一名技術極客的。
當咱們都在實現簡單的一對一的 Socket 和 SocketServer 通訊時,他們三個當中的一個,已經作出了多對多的聊天室模式,就像「飛秋」那樣,既能發文字,還能發圖片、表情,甚至文件都行!
還知道把 JDK 也打包到程序當中,直接雙擊人家打包好的程序就能跑起來,咱們的還得先裝 JDK,再在命令行啓動 SocketServer,而後再啓動 Socket,才能聯得通。
差距直接就拉滿!
他們仨根本就無論老師的教學進度,徹底是憑藉本身的愛好去學習的,他們想經過編程來改變命運。十多年過去了,他們也都實現了本身的夢想。
我說的都是真人真事。其中有兩個,在個人青銅時代讀者羣裏,有一個,在個人黑鐵時代讀者羣裏,在羣裏的讀者均可以找到他們的頭像。
第三,不知道怎麼學,不知道學什麼,我來告訴你。
以前的叫道,這個叫術,一條龍服務。
首先,我強烈推薦你們先學一下 C 語言,先不說爲何,先推薦學習工具和學習資源。
代碼編輯器用 VS Code。
書的話推薦《C 程序設計語言》,我大概花了一週的時間過了一遍,頗有收穫。若是指針看不懂,不要緊,能夠先跳過,但像變量、算術運算符、關係運算符、邏輯運算符、賦值運算符、條件表達式、控制流、方法、傳參等等,這些其餘編程語言裏都有,學一遍就不用學第二遍了。
視頻的話推薦,推薦浙江大學翁愷教授的《程序設計入門——C語言》。
能夠到慕課上或者 B 站上看,慕課上有證書認證。
記住,課程裏面的練習題必定要作,那但是浙江大學的練習題,無論你上什麼大學,均可以直接白嫖。浙大應該能在全國排前五吧(可能不許確),總之就是能夠白嫖,想一想能和浙大的同窗共用一個老師,共用一套學習資源,美滋滋。
而後,我再來講爲何要學習 C 語言。下圖是我在讀《深刻理解計算機系統》的時候拍的一張圖,C 語言雖然是「古怪的、有缺陷的」,但同時也是一個巨大的成功。
C語言具有現代程序設計的基礎要求,它的語法是不少編程語言的基礎,好比說 Java。C 語言和 Java 常年霸佔編程語言的前兩名,都很是強。C 語言學得好,對後續操做系統、編譯原理,以及 Java 的學習都是很好的基石。
若是你還處在學生階段,必定要花時間把這門課過一下,至於指針,就像我前面說的,能夠稍微瞭解一下,若是真的一時半會學不會,就先跳過去。
說完 C 語言,我再來推薦兩門公開課,一門是哈佛大學的 CS50,一門是計算機科學速成課。這兩門課我以前都有推薦過,這裏再次強調,有時間必定要刷。嗯,應該說即便沒有時間,也要擠出時間來刷,之後你會來感謝個人。
網易公開課(CS50):
計算機科學速成課:
若是你下定決心,就像我這名讀者同樣,這一輩子都要從事於計算機專業,那就必定要看完這兩門課。
接下來,就是個人拿手活了!說說大學該怎麼學習 Java,從大一開始,就爲校招作好準備。
國內大型的互聯網公司中,阿里應該是最倚重 Java 的,因此先來看看阿里校招對 Java 研發崗的要求。
看完以後,你可能會以爲,「咦,也沒說具體的要求呢?」是的,大廠在校招的時候對編程語言是沒有限制的。Java 的關鍵字就出現了一次,仍是「或許,你並不熟悉 Java 編程語言,更精通 C,C++, PHP,.NET 等編程語言中的一種或幾種」,這什麼鬼?
嗯,再來看百度的。
啊,你心中萬分歡喜,終於他喵的出現了「熟悉 Java 編程語言」的要求。
校招不一樣社招,更看重的是你的計算機基礎功底和你的學習能力,並不看重編程語言自己。要知道,咱們學的是計算機科學(CS),而不是編程語言,編程語言只是工具而已。
可能不少同窗會說,你只說了阿里和百度,它們是國內互聯網的槓把子,比較難,但其實若是你去查了其餘公司 Java 研發崗的要求,你會發現,基本上和這兩家要求的差很少,只不過深度和廣度不大同樣。
按照這兩家的招聘要求,我來講說具體該學哪些知識。
第1、計算機基礎
1)數據結構與算法
這部分的重要性,經過阿里和百度的校招要求就能看得出來了,兩家都不約而同地放在了很前面的位置。
數據結構是一種具備必定邏輯關係,在計算機中應用某種存儲結構,而且封裝了相應操做的數據元素集合。 它包含三方面的內容,邏輯關係、存儲關係及操做。 不一樣種類的數據結構適合於不一樣種類的應用,而部分甚至專門用於特定的做業任務。 例如,計算機網絡依賴於路由表運做,B 樹高度適用於數據庫的封裝。
爲何數據結構這麼重要呢?清華大學計算機系鄧俊輝教授有過這樣一段描述:
數據結構是計算機科學的關鍵內容,也是構建高效算法的必要基礎。其中涉及的知識,在相關專業的課程系統中始終處於核心位置。以 ACM/IEEE Computing Curricula(計算機教學大綱)爲例,其中對於幾個相關專業(計算機科學、計算機工程、信息系統、信息技術、軟件工程)的共同要求中,數據結構與算法做爲程序設計概念與技能的核心,緊隨在數學以後,排在第二位。
算法就更不用說了,大廠的面試題都考,必須玩得 66 的,ACM 的題,或者 LeetCode 的題目,必須刷到本身都感受廢了的地步:他喵的,BAT 大佬的這份刷題筆記太強了!
大學階段,最好能參加點算法比賽,能拿獎就更好了,加分項!加分項!加分項!重要的事情說三遍。
2)計算機操做系統
編譯原理、操做系統、圖形學被稱爲程序員的三大浪漫,因此可想而知,操做系統對計算機而言有多麼重要。工做當中的不少疑難雜症都和操做系統密不可分,好比說:
除此以外,在進行服務端高性能編程的時候,也常常會用到內存、進程、線程、IO 相關的知識。能夠說學好操做系統,能直接解決在工做當中遇到的不少問題。另外,操做系統也是面試考察的一個重點,好比說:
3)計算機網絡
對於 Java 研發崗來講,面試當中被問到的計算機網絡知識可能比計算機操做系統還要多,好比說:
計算機網絡這部分知識怎麼學?推薦斯坦福大學的 CS144 課程,我大體看了一下,課程講的還能夠,裏面 Lab 也很棒,有時間的同窗能夠跟着學一下。另外就是《計算機網絡:自頂向下方法》這本書,值得啃一啃。
4)設計模式
若是你感受本身代碼寫得比較爛,緣由可能有兩個。其一,多是剛入門,代碼寫得少,若是咱們滿打滿算只寫過一兩千行代碼,是不可能寫出多優雅的代碼的。其二,可能不懂設計模式,設計模式是軟件設計中常見問題的典型解決方案,它們就像能根據需求進行調整的預製藍圖, 可用於解決代碼中反覆出現的設計問題,若是不懂設計模式的話,遇到這些問題就只能抓瞎了。
對於面試而言,不必 23 種設計模式都要倒背如流,最好是結合項目能說出幾個經常使用的,好比說單例、工廠、簡單工廠、建造者這些。
2、編程語言
雖然阿里和百度的校招要求裏面沒有特別強調編程語言這一塊,但若是你誤覺得這部份內容徹底不重要的話,可能就真的走偏了。對於校招,編程語言基礎和計算機基礎是同等重要的。
由於無論你學操做系統,仍是學設計模式,或者刷算法題,總歸是逃不過編程語言這一關的,代碼畢竟仍是要用編程語言來敲的。
在此以前,你已經學過了 C 語言,那麼再學習 Java 就會輕鬆不少。拿 Java 中的 String 來講,C 語言裏面是沒有的,但 String 的底層結構是字符數組,這和 C 語言裏面的 char 型字符數組是徹底同樣的。再好比說,Java 中引用的概念,和 C 語言中的指針概念是有必定的類似性的;還有,理解了 C 語言的方法傳參爲何是經過值傳遞的,也就很容易明白爲何 Java 只有值傳遞沒有引用傳遞。
你們能夠先看看我以前整理的這份 GitHub 上星標 115k+ 的 Java 教程,裏面涵蓋了 Java 全部的知識點,包括 Java 語法、Java 集合框架、Java IO、Java 併發編程和 Java 虛擬機,內容很少,只講重點。
Java 中的知識體系能夠分爲 5 大塊:
提一嘴,Java 語言基礎的部分,也能夠看我一直在連載的《教妹學Java》,通俗易懂,風趣幽默,目前已經更新 40 篇,目錄以下:
對於 Spring 來講,要能理解 AOP 和 IOC 這兩個重要的概念;對於 SpringMVC,要能理清處理請求的流程;對於 MyBatis,要能掌握分頁、延遲加載。
因爲 Spring 的快速發展,它逐漸從一個輕量級的開發框架變成了一個「龐然大物」,愈來愈笨重,致使搭建一個應用程序的成本愈來愈高,因而 Spring Boot 就應運而生了,它只須要不多的配置就能夠搭建出一個獨立應用。Spring Cloud 利用 Spring Boot 的開發便利性,巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等。
3、數據庫
SQL:CRUD 的核心就是利用 SQL 語句進行數據的增刪改查,因此基礎的 SQL 語句必定要熟,不要輕視。
MySQL:MySQL 是目前互聯網公司用得最多的數據庫,若是要選擇一個數據庫進行學習的話,建議學習 MySQL,要能掌握:索引、事務、鎖、存儲引擎、主從複製、分庫分表等知識。推薦看MySQL Tutorial這個英文網站教程來系統的學習 MySQL。
Redis:因爲數據量愈來愈龐大,爲了減輕數據庫的壓力,通常都會使用 Redis 做爲緩存,因此 Java 工程師必定要能掌握 Redis 的基本數據類型和持久化方式,還要能理解緩存與數據庫一致性的問題,對緩存穿透和緩存雪崩也要有所瞭解。
4、微服務/分佈式
消息隊列:消息隊列是分佈式系統中重要的組成部分,當不須要當即獲取結果,但併發量又須要進行控制的時候,消息隊列就派上用場了。目前主流的消息隊列有 RabbitMQ、Kafka 等。須要掌握的知識點有:
註冊中心:註冊中心本質上是爲了解耦服務提供者和服務消費者,Zoopkeeper 在國內很長一段時間都是註冊中心的一哥。
分佈式框架:目前的主流就是 Dubbo 和 Spring Cloud,雖然咱們常常拿它們兩個作比較,但Dubbo 負責人曾說,Dubbo 將來的定位並非要成爲一個微服務的全面解決方案,而是專一在 RPC 領域,成爲微服務生態體系中的一個重要組件。
分佈式不是校招的必選項,若是你在這塊不是很擅長的話,儘可能不要在簡歷上突出,省得面試的時候面試官纏住分佈式這塊不放手,畢竟校招偏重的是基礎,分佈式懂一些就好,能夠作一些練手項目,做爲加分項便可。
5、工具
Intellij IDEA:建議直接上手 Intellij IDEA,用熟練後你會愛不釋手的。
Git:版本控制系統很是重要!!!!!!即使你只是一我的在編碼,它也能夠幫助你建立項目的快照、記錄每一個改動、建立不一樣的分支等等。若是你參與的是多人協做,它更是一個無價之寶,你不只能夠看到別人對代碼的修改,還能夠同時解決因爲並行開發帶來的衝突。版本控制系統有不少,其中最突出的表明就是 Git。
Maven/Gradle:所謂的項目構建指的是完成工程發佈流程須要的一系列步驟,包括編譯、測試、打包、部署等,Maven/Gradle 是目前最流行的兩款項目構建工具。
Docker:從 2013 年發佈至今, Docker 一直廣受矚目,被認爲可能會改變軟件行業,它將應用程序與該程序的依賴,打包在一個文件裏面。只要運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行同樣,這樣就不用再擔憂環境問題了。
6、實戰項目
大學階段,重視計算機基礎的同時,必定要拉出來一個項目本身親手體驗一把,不要糾結這個項目多少人作過,你要作的是經過這個項目來鞏固本身學過的那些基礎知識。俗話說,「光看不練假把戲」,我要說的是「光學不練假把戲」,看似學會了不少知識,一上手本身就抓瞎,這是不少人容易犯的毛病。說白了,就是動手能力差。
我這裏給你推薦一些牛逼的 Java 練手項目,文檔都很是全面,很是適合自學。
1)電商秒殺
SpringBoot 完整電商系統 Mall:包括前臺商城系統及後臺管理系統,基於 SpringBoot+MyBatis 實現。
miaosha:秒殺系統設計與實現。
2)博客論壇
vhr:微人事是一個先後端分離的人力資源管理系統,項目採用 SpringBoot+Vue 開發。
halo([ˈheɪloʊ],意爲光環,也能夠當成拼音讀(哈嘍)):一個優秀的開源博客發佈應用。
這些項目都很是適合做爲練手項目。像 vhr,我是貢獻者之一,目前有 20k+ star 了。
大學時光說短不短,說長不長,做爲「老前輩」,真的是感受一眨眼就過去了;對於正在讀(或者將要讀)大學的學弟學妹們來講,正是青春的好時光,有不少事情要作,忙着社交,忙着拓展,忙着鍛鍊,忙着課業,忙着戀愛,忙不得開交。
但最須要忙的一件事,就是別忘了忙學習,別忘了忙刷題。像算法,基本上大廠是必考的,因此不要產生厭惡的情緒,該刷仍是要刷啊!你不刷,天然崗位就給別人了,多難受。LeetCode 和牛客網上均可以刷題,若是以爲本身沒有解題思路的話,能夠看看老前輩的刷題心得:刷完 300 道 LeetCode 題後,我飄了!
以上,就是「老前輩」個人一點小建議!建議收藏!