CSDN 收到一條讀者的私信,情真意切,所以我承諾他今天一定寫篇文章好好回復他一下,先來看一下他的私信內容吧,

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

視頻的話推薦,推薦浙江大學翁愷教授的《程式設計入門——C語言》,
https://www.icourse163.org/course/ZJU-199001?from=searchPage#/info
可以到慕課上或者 B 站上看,慕課上有證書認證,
記住,課程里面的練習題一定要做,那可是浙江大學的練習題,不管你上什么大學,都可以直接白嫖,浙大應該能在全國排前五吧(可能不準確),總之就是可以白嫖,想想能和浙大的同學共用一個老師,共用一套學習資源,美滋滋,
然后,我再來說為什么要學習 C 語言,下圖是我在讀《深入理解計算機系統》的時候拍的一張圖,C 語言雖然是“古怪的、有缺陷的”,但同時也是一個巨大的成功,
C語言具備現代程式設計的基礎要求,它的語法是很多編程語言的基礎,比如說 Java,C 語言和 Java 常年霸占編程語言的前兩名,都非常強,C 語言學得好,對后續作業系統、編譯原理,以及 Java 的學習都是很好的基石,
如果你還處在學生階段,一定要花時間把這門課過一下,至于指標,就像我前面說的,可以稍微了解一下,如果真的一時半會學不會,就先跳過去,
說完 C 語言,我再來推薦兩門公開課,一門是哈佛大學的 CS50,一門是計算機科學速成課,這兩門課我之前都有推薦過,這里再次強調,有時間一定要刷,嗯,應該說即使沒有時間,也要擠出時間來刷,以后你會來感謝我的,
網易公開課(CS50):
https://open.163.com/newview/movie/free?pid=M6U6LS8CV&mid=M6U6MHDUR
計算機科學速成課:
https://www.bilibili.com/video/BV1EW411u7th
如果你下定決心,就像我這名讀者一樣,這一生都要從事于計算機專業,那就一定要看完這兩門課,
接下來,就是我的拿手活了!說說大學該怎么學習 Java,從大一開始,就為校招做好準備,
國內大型的互聯網公司中,阿里應該是最倚重 Java 的,所以先來看看阿里校招對 Java 研發崗的要求,

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

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

3)計算機網路
對于 Java 研發崗來說,面試當中被問到的計算機網路知識可能比計算機作業系統還要多,比如說:

計算機網路這部分知識怎么學?推薦斯坦福大學的 CS144 課程,我大致看了一下,課程講的還可以,里面 Lab 也很棒,有時間的同學可以跟著學一下,另外就是《計算機網路:自頂向下方法》這本書,值得啃一啃,
4)設計模式
如果你感覺自己代碼寫得比較爛,原因可能有兩個,其一,可能是剛入門,代碼寫得少,如果我們滿打滿算只寫過一兩千行代碼,是不可能寫出多優雅的代碼的,其二,可能不懂設計模式,設計模式是軟體設計中常見問題的典型解決方案,它們就像能根據需求進行調整的預制藍圖, 可用于解決代碼中反復出現的設計問題,如果不懂設計模式的話,遇到這些問題就只能抓瞎了,
對于面試而言,沒必要 23 種設計模式都要滾瓜爛熟,最好是結合專案能說出幾個常用的,比如說單例、工廠、簡單工廠、建造者這些,
二、編程語言
雖然阿里和百度的校招要求里面沒有特別強調編程語言這一塊,但如果你誤以為這部分內容完全不重要的話,可能就真的走偏了,對于校招,編程語言基礎和計算機基礎是同等重要的,
因為不管你學作業系統,還是學設計模式,或者刷演算法題,總歸是逃不過編程語言這一關的,代碼畢竟還是要用編程語言來敲的,
在此之前,你已經學過了 C 語言,那么再學習 Java 就會輕松很多,拿 Java 中的 String 來說,C 語言里面是沒有的,但 String 的底層結構是字符陣列,這和 C 語言里面的 char 型字符陣列是完全一樣的,再比如說,Java 中參考的概念,和 C 語言中的指標概念是有一定的相似性的;還有,理解了 C 語言的方法傳參為什么是通過值傳遞的,也就很容易明白為什么 Java 只有值傳遞沒有參考傳遞,
大家可以先看看我之前整理的這份 GitHub 上星標 115k+ 的 Java 教程,里面涵蓋了 Java 所有的知識點,包括 Java 語法、Java 集合框架、Java IO、Java 并發編程和 Java 虛擬機,內容不多,只講重點,
超級硬核,GitHub 上標星 115k+ 的 Java 教程,詳細介紹!
Java 中的知識體系可以分為 5 大塊:

提一嘴,Java 語言基礎的部分,也可以看我一直在連載的《教妹學Java》,通俗易懂,風趣幽默,目前已經更新 40 篇,目錄如下:

對于 Spring 來說,要能理解 AOP 和 IOC 這兩個重要的概念;對于 SpringMVC,要能理清處理請求的流程;對于 MyBatis,要能掌握分頁、延遲加載,
由于 Spring 的快速發展,它逐漸從一個輕量級的開發框架變成了一個“龐然大物”,越來越笨重,導致搭建一個應用程式的成本越來越高,于是 Spring Boot 就應運而生了,它只需要很少的配置就可以搭建出一個獨立應用,Spring Cloud 利用 Spring Boot 的開發便利性,巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、訊息總線、負載均衡、斷路器、資料監控等,
三、資料庫
SQL:CRUD 的核心就是利用 SQL 陳述句進行資料的增刪改查,所以基礎的 SQL 陳述句一定要熟,不要輕視,
MySQL:MySQL 是目前互聯網公司用得最多的資料庫,如果要選擇一個資料庫進行學習的話,建議學習 MySQL,要能掌握:索引、事務、鎖、存盤引擎、主從復制、分庫分表等知識,推薦看MySQL Tutorial這個英文網站教程來系統的學習 MySQL,
Redis:由于資料量越來越龐大,為了減輕資料庫的壓力,一般都會使用 Redis 作為快取,所以 Java 工程師一定要能掌握 Redis 的基本資料型別和持久化方式,還要能理解快取與資料庫一致性的問題,對快取穿透和快取雪崩也要有所了解,
四、微服務/分布式
訊息佇列:訊息佇列是分布式系統中重要的組成部分,當不需要立即獲取結果,但并發量又需要進行控制的時候,訊息佇列就派上用場了,目前主流的訊息佇列有 RabbitMQ、Kafka 等,需要掌握的知識點有:

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

大學時光說短不短,說長不長,作為“老前輩”,真的是感覺一眨眼就過去了;對于正在讀(或者將要讀)大學的學弟學妹們來說,正是青春的好時光,有很多事情要做,忙著社交,忙著拓展,忙著鍛煉,忙著課業,忙著戀愛,忙不得開交,
但最需要忙的一件事,就是別忘了忙學習,別忘了忙刷題,像演算法,基本上大廠是必考的,所以不要產生厭惡的情緒,該刷還是要刷啊!你不刷,自然崗位就給別人了,多難受,LeetCode 和牛客網上都可以刷題,如果覺得自己沒有解題思路的話,可以看看老前輩的刷題心得:刷完 300 道 LeetCode 題后,我飄了!
以上,就是“老前輩”我的一點小建議!建議收藏!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286288.html
標籤:java
