一點(diǎn)小建議!
微信上收到一條讀者的私信,情真意切,所以我承諾他今天一定寫篇文章好好回復(fù)他一下。先來看一下他的私信內(nèi)容吧。

首先映入我的眼簾的是這個稱呼——“老前輩”,我一下子沒忍住,笑了!
說起來也奇怪,上學(xué)的時候,同學(xué)幾乎都比我大,玩得好的基本上都是哥哥或者姐姐。就連高三時追過的一個學(xué)妹,后來得知竟然比我大幾個月。
可這些年呢?不管是遇到的讀者,還是寫公號的朋友,幾乎不約而同的比我小,有上初中的,有上高中的,有讀大學(xué)的,有在職的,幾乎都是 90 后或者 00 后。比我年長的,還真的是鳳毛麟角、屈指可數(shù)!
不得不感慨,自己真的是“老前輩”了!!!!!!!!!殘忍!!!!!!!!
至于說讀了我的文章后“深有感觸,百般感想”,我不得不承認(rèn),這話恭維出了一股濃烈的文學(xué)家的色彩,了還!
一名普普通通的中職計算機(jī)學(xué)生,即將踏進(jìn)大專的計算機(jī)應(yīng)用領(lǐng)域,極度的誠懇,袒露心聲,但“堅信我的一生定與計算機(jī)相關(guān)”,鏗鏘有力,讓我這個“老前輩”都有點(diǎn)震撼到了!
其實(shí)很多人學(xué)編程都會遇到困難,一開始極度的迷茫,沒有方向。
我上大學(xué)之前,沒怎么接觸過電腦。僅有的機(jī)會應(yīng)該就是去網(wǎng)吧聊 QQ,打忍者神龜了吧!或者看某些動作電影。
那真的是一個蠻荒的年代。
上了大學(xué)后,雖然陰差陽錯的選了計算機(jī)專業(yè),但同學(xué)們都心里門清,這是學(xué)校最不重視的專業(yè),老師們的水平也非常堪憂,上課的時候明顯感覺到力不從心。
整個大學(xué)看得最多的書,就是《21 天學(xué)會 XXX》系列了,害,學(xué)的那叫一個什么玩意。
一度懷疑,大學(xué)畢業(yè)后人該何去何從?
但上帝眷顧了我,讓我有幸在實(shí)習(xí)的時候進(jìn)入一家外企,并且順利通過了三次考試,沒有被辭退,后來經(jīng)過自己的努力竟然是新人當(dāng)中最快成為團(tuán)隊 Leader 的那一個。冥冥之中,這就成為了我的人生轉(zhuǎn)折點(diǎn)。
往事不堪回首,有太多的心里話想要說給大家聽,請牢記。
第一,不管學(xué)校的課程有多爛,一定不要掛科。
不知道是從哪里傳來的一句鬼話,“不掛科的大學(xué)是不精彩的。”
我大學(xué)的時候還特別喜歡這句話,于是還真掛科了好幾門,最后補(bǔ)考應(yīng)該是批卷老師手下留情,都是壓著及格線過的。
我有幾個同學(xué),大學(xué)的時候特別喜歡打魔獸,幾乎整天的時光都泡了游戲當(dāng)中,有些還知道收獲愛情,有些可真慘,畢業(yè)的時候是一無所有,愛情沒有,畢業(yè)證都沒有,掛的科真的難補(bǔ),老師再放水,也得自己過及格線啊。
學(xué)歷雖然說不能代表一切,但步入了社會,想要做一名合格的打工人,這學(xué)歷是必不可少的,進(jìn)工廠還必須得要求學(xué)歷呢。
985、211 的學(xué)歷是學(xué)歷,雙非的本科也是學(xué)歷,就連被看不起的大專好歹也是學(xué)歷啊!
第二,自己要知道學(xué),下勁學(xué)。
成績好,可以去好的學(xué)校,選擇好的專業(yè),成績不好,只能將就,自然身邊遇到的同學(xué),整體水平可能就要差一些。
如果你去的是一個不好的學(xué)校,身邊的同學(xué)都在無所事事,都在消磨時光,假如你覺得既然大家都這樣,那自己也這樣吧,等到畢業(yè)的時候,才發(fā)現(xiàn)人家是叛逆,家里已經(jīng)安排妥當(dāng),你就真后悔也買不到后悔藥了!
我大學(xué)的同學(xué)當(dāng)中,有三個,是公認(rèn)的喜歡編程的,愿意把自己培養(yǎng)成一名技術(shù)極客的。
當(dāng)我們都在實(shí)現(xiàn)簡單的一對一的 Socket 和 SocketServer 通信時,他們?nèi)齻€當(dāng)中的一個,已經(jīng)做出了多對多的聊天室模式,就像“飛秋”那樣,既能發(fā)文字,還能發(fā)圖片、表情,甚至文件都行!
還知道把 JDK 也打包到程序當(dāng)中,直接雙擊人家打包好的程序就能跑起來,我們的還得先裝 JDK,再在命令行啟動 SocketServer,然后再啟動 Socket,才能聯(lián)得通。
差距直接就拉滿!
他們仨根本就不管老師的教學(xué)進(jìn)度,完全是憑借自己的愛好去學(xué)習(xí)的,他們想通過編程來改變命運(yùn)。十多年過去了,他們也都實(shí)現(xiàn)了自己的夢想。
我說的都是真人真事。其中有兩個,在我的青銅時代讀者群里,有一個,在我的黑鐵時代讀者群里,在群里的讀者都可以找到他們的頭像。
第三,不知道怎么學(xué),不知道學(xué)什么,我來告訴你。
之前的叫道,這個叫術(shù),一條龍服務(wù)。
首先,我強(qiáng)烈推薦大家先學(xué)一下 C 語言,先不說為什么,先推薦學(xué)習(xí)工具和學(xué)習(xí)資源。
代碼編輯器用 VS Code。
書的話推薦《C 程序設(shè)計語言》,我大概花了一周的時間過了一遍,很有收獲。如果指針看不懂,沒關(guān)系,可以先跳過,但像變量、算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、條件表達(dá)式、控制流、方法、傳參等等,這些其他編程語言里都有,學(xué)一遍就不用學(xué)第二遍了。

視頻的話推薦,推薦浙江大學(xué)翁愷教授的《程序設(shè)計入門——C語言》。
https://www.icourse163.org/course/ZJU-199001?from=searchPage#/info
可以到慕課上或者 B 站上看,慕課上有證書認(rèn)證。
記住,課程里面的練習(xí)題一定要做,那可是浙江大學(xué)的練習(xí)題,不管你上什么大學(xué),都可以直接白嫖。浙大應(yīng)該能在全國排前五吧(可能不準(zhǔn)確),總之就是可以白嫖,想想能和浙大的同學(xué)共用一個老師,共用一套學(xué)習(xí)資源,美滋滋。
然后,我再來說為什么要學(xué)習(xí) C 語言。下圖是我在讀《深入理解計算機(jī)系統(tǒng)》的時候拍的一張圖,C 語言雖然是“古怪的、有缺陷的”,但同時也是一個巨大的成功。

C語言具備現(xiàn)代程序設(shè)計的基礎(chǔ)要求,它的語法是很多編程語言的基礎(chǔ),比如說 Java。C 語言和 Java 常年霸占編程語言的前兩名,都非常強(qiáng)。C 語言學(xué)得好,對后續(xù)操作系統(tǒng)、編譯原理,以及 Java 的學(xué)習(xí)都是很好的基石。
如果你還處在學(xué)生階段,一定要花時間把這門課過一下,至于指針,就像我前面說的,可以稍微了解一下,如果真的一時半會學(xué)不會,就先跳過去。
說完 C 語言,我再來推薦兩門公開課,一門是哈佛大學(xué)的 CS50,一門是計算機(jī)科學(xué)速成課。這兩門課我之前都有推薦過,這里再次強(qiáng)調(diào),有時間一定要刷。嗯,應(yīng)該說即使沒有時間,也要擠出時間來刷,以后你會來感謝我的。
網(wǎng)易公開課(CS50):
https://open.163.com/newview/movie/free?pid=M6U6LS8CV&mid=M6U6MHDUR
計算機(jī)科學(xué)速成課:
https://www.bilibili.com/video/BV1EW411u7th
如果你下定決心,就像我這名讀者一樣,這一生都要從事于計算機(jī)專業(yè),那就一定要看完這兩門課。
接下來,就是我的拿手活了!說說大學(xué)該怎么學(xué)習(xí) Java,從大一開始,就為校招做好準(zhǔn)備。
國內(nèi)大型的互聯(lián)網(wǎng)公司中,阿里應(yīng)該是最倚重 Java 的,所以先來看看阿里校招對 Java 研發(fā)崗的要求。

看完之后,你可能會覺得,“咦,也沒說具體的要求呢?”是的,大廠在校招的時候?qū)幊陶Z言是沒有限制的。Java 的關(guān)鍵字就出現(xiàn)了一次,還是“或許,你并不熟悉 Java 編程語言,更精通 C,C++, PHP,.NET 等編程語言中的一種或幾種”,這什么鬼?
嗯,再來看百度的。

啊,你心中萬分歡喜,終于他喵的出現(xiàn)了“熟悉 Java 編程語言”的要求。
校招不同社招,更看重的是你的計算機(jī)基礎(chǔ)功底和你的學(xué)習(xí)能力,并不看重編程語言本身。要知道,我們學(xué)的是計算機(jī)科學(xué)(CS),而不是編程語言,編程語言只是工具而已。
可能很多同學(xué)會說,你只說了阿里和百度,它們是國內(nèi)互聯(lián)網(wǎng)的杠把子,比較難,但其實(shí)如果你去查了其他公司 Java 研發(fā)崗的要求,你會發(fā)現(xiàn),基本上和這兩家要求的差不多,只不過深度和廣度不大一樣。
按照這兩家的招聘要求,我來說說具體該學(xué)哪些知識。
第一、計算機(jī)基礎(chǔ)
1)數(shù)據(jù)結(jié)構(gòu)與算法
這部分的重要性,通過阿里和百度的校招要求就能看得出來了,兩家都不約而同地放在了很前面的位置。
數(shù)據(jù)結(jié)構(gòu)是一種具有一定邏輯關(guān)系,在計算機(jī)中應(yīng)用某種存儲結(jié)構(gòu),并且封裝了相應(yīng)操作的數(shù)據(jù)元素集合。它包含三方面的內(nèi)容,邏輯關(guān)系、存儲關(guān)系及操作。不同種類的數(shù)據(jù)結(jié)構(gòu)適合于不同種類的應(yīng)用,而部分甚至專門用于特定的作業(yè)任務(wù)。例如,計算機(jī)網(wǎng)絡(luò)依賴于路由表運(yùn)作,B 樹高度適用于數(shù)據(jù)庫的封裝。
為什么數(shù)據(jù)結(jié)構(gòu)這么重要呢?清華大學(xué)計算機(jī)系鄧俊輝教授有過這樣一段描述:
數(shù)據(jù)結(jié)構(gòu)是計算機(jī)科學(xué)的關(guān)鍵內(nèi)容,也是構(gòu)建高效算法的必要基礎(chǔ)。其中涉及的知識,在相關(guān)專業(yè)的課程系統(tǒng)中始終處于核心位置。以 ACM/IEEE Computing Curricula(計算機(jī)教學(xué)大綱)為例,其中對于幾個相關(guān)專業(yè)(計算機(jī)科學(xué)、計算機(jī)工程、信息系統(tǒng)、信息技術(shù)、軟件工程)的共同要求中,數(shù)據(jù)結(jié)構(gòu)與算法作為程序設(shè)計概念與技能的核心,緊隨在數(shù)學(xué)之后,排在第二位。
算法就更不用說了,大廠的面試題都考,必須玩得 66 的,ACM 的題,或者 LeetCode 的題目,必須刷到自己都感覺廢了的地步。
大學(xué)階段,最好能參加點(diǎn)算法比賽,能拿獎就更好了,加分項!加分項!加分項!重要的事情說三遍。
2)計算機(jī)操作系統(tǒng)
編譯原理、操作系統(tǒng)、圖形學(xué)被稱為程序員的三大浪漫,所以可想而知,操作系統(tǒng)對計算機(jī)而言有多么重要。工作當(dāng)中的很多疑難雜癥都和操作系統(tǒng)密不可分,比如說:
內(nèi)存為什么會泄露 文件為什么會打不開 服務(wù)進(jìn)程為什么會宕掉 網(wǎng)絡(luò)服務(wù)為什么會掉線
除此之外,在進(jìn)行服務(wù)端高性能編程的時候,也經(jīng)常會用到內(nèi)存、進(jìn)程、線程、IO 相關(guān)的知識。可以說學(xué)好操作系統(tǒng),能直接解決在工作當(dāng)中遇到的很多問題。另外,操作系統(tǒng)也是面試考察的一個重點(diǎn),比如說:

3)計算機(jī)網(wǎng)絡(luò)
對于 Java 研發(fā)崗來說,面試當(dāng)中被問到的計算機(jī)網(wǎng)絡(luò)知識可能比計算機(jī)操作系統(tǒng)還要多,比如說:

計算機(jī)網(wǎng)絡(luò)這部分知識怎么學(xué)?推薦斯坦福大學(xué)的 CS144 課程,我大致看了一下,課程講的還可以,里面 Lab 也很棒,有時間的同學(xué)可以跟著學(xué)一下。另外就是《計算機(jī)網(wǎng)絡(luò):自頂向下方法》這本書,值得啃一啃。
4)設(shè)計模式
如果你感覺自己代碼寫得比較爛,原因可能有兩個。其一,可能是剛?cè)腴T,代碼寫得少,如果我們滿打滿算只寫過一兩千行代碼,是不可能寫出多優(yōu)雅的代碼的。其二,可能不懂設(shè)計模式,設(shè)計模式是軟件設(shè)計中常見問題的典型解決方案,它們就像能根據(jù)需求進(jìn)行調(diào)整的預(yù)制藍(lán)圖, 可用于解決代碼中反復(fù)出現(xiàn)的設(shè)計問題,如果不懂設(shè)計模式的話,遇到這些問題就只能抓瞎了。
對于面試而言,沒必要 23 種設(shè)計模式都要滾瓜爛熟,最好是結(jié)合項目能說出幾個常用的,比如說單例、工廠、簡單工廠、建造者這些。
二、編程語言
雖然阿里和百度的校招要求里面沒有特別強(qiáng)調(diào)編程語言這一塊,但如果你誤以為這部分內(nèi)容完全不重要的話,可能就真的走偏了。對于校招,編程語言基礎(chǔ)和計算機(jī)基礎(chǔ)是同等重要的。
因為不管你學(xué)操作系統(tǒng),還是學(xué)設(shè)計模式,或者刷算法題,總歸是逃不過編程語言這一關(guān)的,代碼畢竟還是要用編程語言來敲的。
在此之前,你已經(jīng)學(xué)過了 C 語言,那么再學(xué)習(xí) Java 就會輕松很多。拿 Java 中的 String 來說,C 語言里面是沒有的,但 String 的底層結(jié)構(gòu)是字符數(shù)組,這和 C 語言里面的 char 型字符數(shù)組是完全一樣的。再比如說,Java 中引用的概念,和 C 語言中的指針概念是有一定的相似性的;還有,理解了 C 語言的方法傳參為什么是通過值傳遞的,也就很容易明白為什么 Java 只有值傳遞沒有引用傳遞。
Java 中的知識體系可以分為 5 大塊:

大家可以先看看我之前整理的那份 GitHub 上星標(biāo) 115k+ 的 Java 教程,里面涵蓋了 Java 所有的知識點(diǎn),包括 Java 語法、Java 集合框架、Java IO、Java 并發(fā)編程和 Java 虛擬機(jī),內(nèi)容不多,只講重點(diǎn)。
提一嘴,Java 語言基礎(chǔ)的部分,也可以看我一直在連載的《教妹學(xué)Java》。
對于 Spring 來說,要能理解 AOP 和 IOC 這兩個重要的概念;對于 SpringMVC,要能理清處理請求的流程;對于 MyBatis,要能掌握分頁、延遲加載。
由于 Spring 的快速發(fā)展,它逐漸從一個輕量級的開發(fā)框架變成了一個“龐然大物”,越來越笨重,導(dǎo)致搭建一個應(yīng)用程序的成本越來越高,于是 Spring Boot 就應(yīng)運(yùn)而生了,它只需要很少的配置就可以搭建出一個獨(dú)立應(yīng)用。Spring Cloud 利用 Spring Boot 的開發(fā)便利性,巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等。
三、數(shù)據(jù)庫
SQL:CRUD 的核心就是利用 SQL 語句進(jìn)行數(shù)據(jù)的增刪改查,所以基礎(chǔ)的 SQL 語句一定要熟,不要輕視。
MySQL:MySQL 是目前互聯(lián)網(wǎng)公司用得最多的數(shù)據(jù)庫,如果要選擇一個數(shù)據(jù)庫進(jìn)行學(xué)習(xí)的話,建議學(xué)習(xí) MySQL,要能掌握:索引、事務(wù)、鎖、存儲引擎、主從復(fù)制、分庫分表等知識。推薦看MySQL Tutorial這個英文網(wǎng)站教程來系統(tǒng)的學(xué)習(xí) MySQL。
Redis:由于數(shù)據(jù)量越來越龐大,為了減輕數(shù)據(jù)庫的壓力,一般都會使用 Redis 作為緩存,所以 Java 工程師一定要能掌握 Redis 的基本數(shù)據(jù)類型和持久化方式,還要能理解緩存與數(shù)據(jù)庫一致性的問題,對緩存穿透和緩存雪崩也要有所了解。
四、微服務(wù)/分布式
消息隊列:消息隊列是分布式系統(tǒng)中重要的組成部分,當(dāng)不需要立即獲取結(jié)果,但并發(fā)量又需要進(jìn)行控制的時候,消息隊列就派上用場了。目前主流的消息隊列有 RabbitMQ、Kafka 等。需要掌握的知識點(diǎn)有:

注冊中心:注冊中心本質(zhì)上是為了解耦服務(wù)提供者和服務(wù)消費(fèi)者,Zoopkeeper 在國內(nèi)很長一段時間都是注冊中心的一哥。
分布式框架:目前的主流就是 Dubbo 和 Spring Cloud,雖然我們經(jīng)常拿它們兩個做比較,但Dubbo 負(fù)責(zé)人曾說,Dubbo 未來的定位并不是要成為一個微服務(wù)的全面解決方案,而是專注在 RPC 領(lǐng)域,成為微服務(wù)生態(tài)體系中的一個重要組件。
分布式不是校招的必選項,如果你在這塊不是很擅長的話,盡量不要在簡歷上突出,免得面試的時候面試官纏住分布式這塊不放手,畢竟校招偏重的是基礎(chǔ),分布式懂一些就好,可以做一些練手項目,作為加分項即可。
五、工具
Intellij IDEA:建議直接上手 Intellij IDEA,用熟練后你會愛不釋手的。
Git:版本控制系統(tǒng)非常重要!!!!!!即便你只是一個人在編碼,它也可以幫助你創(chuàng)建項目的快照、記錄每個改動、創(chuàng)建不同的分支等等。如果你參與的是多人協(xié)作,它更是一個無價之寶,你不僅可以看到別人對代碼的修改,還可以同時解決由于并行開發(fā)帶來的沖突。版本控制系統(tǒng)有很多,其中最突出的代表就是 Git。
Maven/Gradle:所謂的項目構(gòu)建指的是完成工程發(fā)布流程需要的一系列步驟,包括編譯、測試、打包、部署等,Maven/Gradle 是目前最流行的兩款項目構(gòu)建工具。
Docker:從 2013 年發(fā)布至今, Docker 一直廣受矚目,被認(rèn)為可能會改變軟件行業(yè),它將應(yīng)用程序與該程序的依賴,打包在一個文件里面。只要運(yùn)行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運(yùn)行,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣,這樣就不用再擔(dān)心環(huán)境問題了。
六、實(shí)戰(zhàn)項目
大學(xué)階段,重視計算機(jī)基礎(chǔ)的同時,一定要拉出來一個項目自己親手體驗一把,不要糾結(jié)這個項目多少人做過,你要做的是通過這個項目來鞏固自己學(xué)過的那些基礎(chǔ)知識。俗話說,“光看不練假把戲”,我要說的是“光學(xué)不練假把戲”,看似學(xué)會了很多知識,一上手自己就抓瞎,這是很多人容易犯的毛病。說白了,就是動手能力差。
我這里給你推薦一些牛逼的 Java 練手項目,文檔都非常全面,非常適合自學(xué)。
1)電商秒殺
SpringBoot 完整電商系統(tǒng) Mall:包括前臺商城系統(tǒng)及后臺管理系統(tǒng),基于 SpringBoot+MyBatis 實(shí)現(xiàn)。
miaosha:秒殺系統(tǒng)設(shè)計與實(shí)現(xiàn)。
2)博客論壇
vhr:微人事是一個前后端分離的人力資源管理系統(tǒng),項目采用 SpringBoot+Vue 開發(fā)。
halo([?he?lo?],意為光環(huán),也可以當(dāng)成拼音讀(哈嘍)):一個優(yōu)秀的開源博客發(fā)布應(yīng)用。
這些項目都非常適合作為練手項目。像 vhr,我是貢獻(xiàn)者之一,目前有 20k+ star 了。

大學(xué)時光說短不短,說長不長,作為“老前輩”,真的是感覺一眨眼就過去了;對于正在讀(或者將要讀)大學(xué)的學(xué)弟學(xué)妹們來說,正是青春的好時光,有很多事情要做,忙著社交,忙著拓展,忙著鍛煉,忙著課業(yè),忙著戀愛,忙不得開交。
但最需要忙的一件事,就是別忘了忙學(xué)習(xí)。
以上,就是“老前輩”我的一點(diǎn)小建議!
