凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
大家好,我是二哥呀!
13 年 Java 編程經(jīng)驗的老油條了,拒絕過阿里,在日企搬磚過 5 年,Java 領(lǐng)域的優(yōu)質(zhì)創(chuàng)作者,說實話,如果是單純奔著實習(xí) Offer 去的話,還是不難的。
說句挺不好意思的話,上學(xué)和剛參加工作那會,我一直傻乎乎的認(rèn)為,只要把 Java 吃透的話就可以了,直到近些年我才恍然大悟,我的認(rèn)知是有缺陷的。想從事 Java 后端開發(fā)工作,需要從以下 5 個方面做起,找到實習(xí) Offer 絕壁不是問題。
- C 程序設(shè)計語言,為什么學(xué) Java 要學(xué) C 語言呢?這也是我最近才想明白的一個問題,因為 C語言是其他編程語言的母胎,包括 Java,不少同學(xué)感覺自己學(xué) Java 很吃力,原因可能就在這,沒有把根基打好。
- 數(shù)據(jù)結(jié)構(gòu)與算法,清華大學(xué)的鄧俊輝教授曾說過這樣一句話,數(shù)據(jù)結(jié)構(gòu)作為構(gòu)建高效算法的必要基礎(chǔ),在計算機科學(xué)領(lǐng)域中,起到了技術(shù)體系基石的作用。而算法呢?又是面試的必考內(nèi)容,在國外,甚至可以只刷算法題就能拿到大廠的 Offer,這里給大家推薦一份純 Java 版的 LeetCode 刷題筆記,美團(tuán)技術(shù)大佬寫的,主力編程語言是 Java 的同學(xué)可以借鑒下,刷題的幸福指數(shù)會提高很多:刷完 300 道 LeetCode 題后,我膨脹到要飄起來了!純正 Java 版
- 計算機組成原理,這方面知識比較扎實的話,學(xué)妹再找你裝機修電腦的話,可以說輕松搞定。計算機是由 CPU、內(nèi)存、顯示器這些設(shè)備組成的硬件,但我們大學(xué)畢業(yè)后,往往從事的是軟件方面的開發(fā)工作。那怎樣才能在硬件和軟件之間自由穿梭呢?答案就是學(xué)好計算機組成原理。弄明白了計算機的組成原理,也就對整個軟件開發(fā)有了一個系統(tǒng)的認(rèn)知,不論是計算機的硬件原理,還是軟件架構(gòu),都能很好的駕馭,隨之而來的,我們的職業(yè)發(fā)展機會也就更多了。
- 計算機操作系統(tǒng),為什么要學(xué)習(xí)計算機操作系統(tǒng)?第一,面試要考,第二,無論學(xué)習(xí)哪門子編程語言,比如說 Java、C/C++,都需要和操作系統(tǒng)打交道,像 Java 中的多線程技術(shù),其實是由操作系統(tǒng)來負(fù)責(zé)進(jìn)程和線程管理的;第三,學(xué)習(xí)操作系統(tǒng),還能學(xué)到內(nèi)存分配方面的知識。
- 計算機網(wǎng)絡(luò),又是一塊面試經(jīng)常被問到的知識點,什么 TCP 為什么三次握手?四次揮手?TCP 為什么是可靠傳輸協(xié)議,而 UDP 不是?鍵入網(wǎng)址到網(wǎng)頁顯示,期間發(fā)生了什么?HTTPS 握手過程是怎樣的?
- Java 源碼,我大學(xué)時期有一個很牛逼的同學(xué),基本上我們遇到的問題在他那都能搞得定,我問他有什么秘訣嗎?他的答案很簡答,看 Java 源碼啊!確實,面試的時候,像 HashMap 這種源碼級別的知識點,基本上是必問項目。
我之前整理過一個 Java 工程師進(jìn)階之路的大綱思維導(dǎo)圖,這里貼出來大家圍觀下(參考自 hollis 的成神之路)。
 當(dāng)然了,這只是 Java 后端體系的鳥瞰圖,校招的時候,不會要求上面的這些知識點全部都得掌握,像設(shè)計模式這塊,通常需要大量的實戰(zhàn)經(jīng)驗才能運用得恰到好處,學(xué)生階段,往往項目經(jīng)驗比較缺乏,所以這部分內(nèi)容在大學(xué)的時候往往沒辦法施展拳腳。
我之前曾分享過這么一個觀點,假如有那么殘酷的一天,我不小心喝錯了一瓶藥,一下子抹掉了我這十多年的編程經(jīng)驗,把我變成了一只小白。我想自學(xué) Java,并且想要找到一份工作,我預(yù)計需要 6 個月的時間,前提條件是每天都處于高效率的學(xué)習(xí)狀態(tài)當(dāng)中,并且每天的學(xué)習(xí)時間至少在 12 個小時以上。
現(xiàn)在回頭再評估下,發(fā)現(xiàn)這個觀點依然是成立的。
如果大學(xué)階段,學(xué)校開設(shè)了數(shù)據(jù)結(jié)構(gòu)與算法、計算機操作系統(tǒng)、計算機網(wǎng)絡(luò)、C語言程序設(shè)計這些基礎(chǔ)課程的話,其實學(xué)起來會更快一點。
對于那些轉(zhuǎn)專業(yè)的同學(xué)來說,如果時間比較緊迫的話,可以直接上手 Java,等到拿到了實習(xí) Offer 后再把這些基礎(chǔ)補一補我認(rèn)為也是可以的。但這種情況下,就必須在找工作前很刷面試題和算法題了,通過強化突擊彌補自己在計算機基礎(chǔ)知識方面的短板。
我認(rèn)識這樣一些同學(xué),是真事,初中高中階段就對編程很感興趣,在興趣的驅(qū)使下很早的就有了編程的基礎(chǔ)。我之前就認(rèn)識這么一位小妹妹,初中的時候?qū)W習(xí)成績特別好,直接保送到北航的一所直屬高中,不是搞衛(wèi)星就是搞航天模型,立志以后做一名黑客。
 對于這些未來潛在的技術(shù)大佬,她們學(xué)什么都會特別快,因為論語里不是有一句話嘛,“知之者不如好之者,好之者不如樂之者”!
一、Java 基礎(chǔ)
關(guān)于 Java 基礎(chǔ)篇的學(xué)習(xí),我這有一份 GitHub 上標(biāo)星 115k 的 Java 教程:包括 Java 核心、Java 集合框架、Java 并發(fā)編程、 Java IO,非常全面,是我花了一周多時間手工整理的,非常辛苦,大家一定要珍惜。
太贊了,GitHub 上標(biāo)星 115k+ 的 Java 教程
 ?
 你也可以選擇看書,我推薦《Java 核心技術(shù)卷》,分為上下兩冊,上冊的難度較低,可以在短時間內(nèi)刷完。下冊涉及到的內(nèi)容有流與文件(☆)、XML、網(wǎng)絡(luò)(☆)、數(shù)據(jù)庫編程、國際化、Swing、AWT、JavaBean、安全(☆)、腳本編譯和注解處理、分布式對象、本地方法(☆),沒有標(biāo)星的內(nèi)容我認(rèn)為可以略過。
然后再看一看《Java 編程思想》,看自己是否能駕馭得了。因為思想的東西嘛,只有經(jīng)過一些實踐后才能有所感悟,否則就像王陽明一開始對著竹子格物一樣,屁也格不出來,有了后面領(lǐng)軍作戰(zhàn)的經(jīng)驗,以及到地方上體驗艱苦生活的感受后就開創(chuàng)了心學(xué)。
視頻的話,可以看一下浙江大學(xué)教授翁愷老師的。在浙大,每年最受關(guān)注的內(nèi)容之一就是永平獎的百萬大獎會花落誰家。2018 年,獲得永平杰出教學(xué)貢獻(xiàn)獎的人,就是翁愷教授。
https://www.bilibili.com/video/BV1DJ411B7cG?p=3
 ?
翁愷教授可以說是浙大的網(wǎng)紅教授,非常受歡迎,網(wǎng)絡(luò)上各種風(fēng)評都很不錯。
我來列一下 Java 基礎(chǔ)部分要掌握的知識點吧,可以按照這個順序來學(xué)習(xí),每學(xué)完一部分就打卡下。
初學(xué)階段,強烈建議大家把書本上、視頻上的代碼都敲一遍。由于不像工作后,有大量的項目可以實踐,所以不能得到及時的反饋,記筆記就顯得特別的重要。另外,一定要分門別類保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,會很有用,積累得多了,可能就變成了自己的工具庫。如果還有精力的話,可以把自己的學(xué)習(xí)心得分享出來,發(fā)表到博客上。
我之前就記了蠻多筆記的。像下面這些基礎(chǔ)到不能再基礎(chǔ)的知識點,我都有重新去學(xué),并且嘗試用自己的方式把這些知識點表達(dá)清楚。就這樣不斷的分享,不斷的積累,我好像才真有點清醒的感覺。
什么是面向?qū)ο缶幊?#xff08;OOP)?
為什么要將局部變量的作用域最小化?
Java到底是值傳遞還是引用傳遞?
如何比較 Java 的字符串?
再談 Java 的繼承和超類 Object
Java Serializable:明明就一個空的接口嘛
Java Socket:飛鴿傳書的網(wǎng)絡(luò)套接字
Java 網(wǎng)絡(luò)編程:必知必會的 URL 和 URLConnection
Java面試官:兄弟,你確定double精度比float低嗎?
請用面向?qū)ο蟮乃枷?#xff0c;談一談這次面試的過程
Java:接口和抽象類,傻傻分不清楚?
Java生成二維碼分享海報
Java:優(yōu)雅地處理異常真是一門學(xué)問啊!
教妹學(xué) Java:晦澀難懂的泛型
教妹學(xué)Java:大有可為的集合
教妹學(xué) Java:難以駕馭的多線程
Java 的核心目的和并發(fā)編程
Java:程序不過是幾行代碼的集合
如何理解 Java 中的繼承?
吃人的那些 Java 名詞:對象、引用、堆、棧
Java 的操作符——“=”號
害死人的自動遞增,不償命的自動遞減
Java 流程控制語句
Java是通過什么機制來確保對象初始化呢?
Java 訪問權(quán)限控制:public、private、protected
Java代碼復(fù)用的三種常用方式:繼承、組合和代理
Java:多態(tài)乃幸福本源
Java String,看這篇就夠了
Java 數(shù)組,看這一篇就夠了
HashMap,難的不在Map,而在Hash
Java枚舉:小小enum,優(yōu)雅而干凈
Java注解(Annotation):請不要小看我!
Java I/O 入門篇
Java:并發(fā)不易,先學(xué)會用
我給學(xué)弟學(xué)妹們提供這樣一個思路。
首先,我們需要一個思維導(dǎo)圖(我一開始貼出來的那副),順藤摸瓜,看看都有哪些知識點需要學(xué)習(xí)。
然后,我們不斷地細(xì)分,切入這些零散的知識點,從書中、視頻中、博客中找答案,吸收。
再然后,我們嘗試按照自己的思考方式去分享這些知識點,不怕丟人,勇敢地做分享,力求讓自己教會別人。
最后,和他人進(jìn)行溝通,再通過實踐去檢驗自己的學(xué)習(xí)成果。
這一套下來,不能說編程上有了突飛猛進(jìn),至少可以能突破瓶頸。
二、Java 框架
這部分也可以叫做 JavaWeb,但我更傾向于把這部分叫做 Java 框架,因為 JavaWeb 最初要學(xué)習(xí)的東西是 JSP,Servlet 這些東西,都已經(jīng)被淘汰了,再去學(xué)這些知識只會浪費時間。有了大佬推薦了這部分內(nèi)容,說 Spring 的那些系列框架也只是圍繞這些知識點展開的,有一定的道理,但還是不太建議把時間花到這部分知識點上,要知道,技術(shù)是要更新?lián)Q代的,好鋼用在刀刃上。
做 Web 開發(fā),是會涉及到前端的一些知識點的,尤其是在練手階段,不會像進(jìn)公司后一個蘿卜一個坑,只負(fù)責(zé)后端或者只負(fù)責(zé)前端,往往需要全棧,但想從事 Java 后端開發(fā)的話,前端這些知識點還是盡量少花時間,盡量在練手階段找同學(xué)合伙做項目,不要把自己搞成一個全棧,前端也是很累的一個活,需要時間的。
前端技術(shù)蠻多的,我舉幾個常見的,比如說:
- Vue,前端框架
- Vue-router,路由框架
- Vuex,全局狀態(tài)管理框架
- Ant Design Vue,前端 UI 框架
- Axios,前端 HTTP 框架
這還不包括 JavaScript+HTML+CSS 在內(nèi)。
所以,學(xué)弟學(xué)妹們明白我的意思嗎?如果一心想從事 Java 后端開發(fā),盡量找喜歡前端的同學(xué)配合一起做練手項目,不僅能鍛煉團(tuán)隊配合的默契,還能讓自己有充分的時間學(xué)習(xí)更深度的 Java 后端技術(shù)。
從事 Java 后端開發(fā)的話,自然也就離不開 Spring 的系列框架。Spring 框架早已成為 Java 后端開發(fā)事實上的行業(yè)標(biāo)準(zhǔn),如何用好 Spring ,也就成為 Java 程序員的必修課之一。同時,Spring Boot 和 Spring Cloud 的出現(xiàn),可以幫助 Java 程序員更好地基于 Spring 框架及各種基礎(chǔ)設(shè)施來快速搭建系統(tǒng),可以說,它們的誕生又一次解放了Java 程序員的生產(chǎn)力。
所以,Spring Boot 和 Spring Cloud 已成為 Spring 生態(tài)中不可或缺的一環(huán)。想成為一名合格的 Java 后端工程師,Spring Framework、Spring Boot、Spring Cloud 這三者必須牢牢掌握。
首先來學(xué) SSM(Spring+SpringMVC+MyBatis,企業(yè)級應(yīng)用的必須品)的整合教程,哪怕是已經(jīng)有了 Spring Boot,SSM 仍然是必學(xué)的,能打下更堅實的基礎(chǔ)。
其中 Spring 是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。它可以裝載 Bean(也就是 Java 中的類,包括 Service、Dao 里面的),有了控制反轉(zhuǎn)這個機制,我們就不用在每次使用類的時候先初始化,用 new 關(guān)鍵字聲明。另外,Spring 的 AOP、事務(wù)管理等等都是我們經(jīng)常用到的。
SpringMVC 分離了控制器、模型對象、分派器以及處理程序?qū)ο蟮慕巧?#xff0c;這種分離讓它們更容易進(jìn)行定制。
MyBatis 是一個支持普通 SQL 查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 對 JDBC 做了封裝,它讓數(shù)據(jù)庫底層操作變的透明。 MyBatis 的操作都是圍繞一個叫 sqlSessionFactory 的實例展開的,通過配置文件關(guān)聯(lián)到各實體類的 Mapper 文件,Mapper 文件中配置了每個類對數(shù)據(jù)庫所需進(jìn)行的 SQL 語句映射。在每次與數(shù)據(jù)庫交互時,通過 sqlSessionFactory 拿到 sqlSession,再執(zhí)行 SQL 命令。
怎么學(xué)習(xí)這部分內(nèi)容呢?我不太建議看書,因為這方面的書籍在豆瓣上的評分都不怎么高。
SSM 實戰(zhàn) 100 集:https://www.bilibili.com/video/BV1NX4y1G7wx
 Spring5框架最新版教程:https://www.bilibili.com/video/BV1Vf4y127N5
 2021 最新版 SpringMVC 視頻教程:https://www.bilibili.com/video/BV1qp4y1n7D1
 2021 最新版 MyBatis 視頻教程:https://www.bilibili.com/video/BV1c54y1a7GE
然后是 Spring Boot。Spring Boot 是由 Pivotal 團(tuán)隊提供的一個全新框架,其設(shè)計目的是用來簡化 Spring 應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。說句人話就是,Spring Boot 不是什么新的框架,它默認(rèn)配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。使用 Spring Boot有什么好處其實就是簡單、快速、方便!我推薦看純潔的微笑的博客,訪問量在千萬級別以上,影響了無數(shù)的初學(xué)者,我個人強烈推薦。
spring-boot - 純潔的微笑博客
如果說已經(jīng)掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等內(nèi)容,就有能力進(jìn)行一些真正有用的應(yīng)用項目開發(fā)了,可以拿下面這些項目作為練手,都是 GitHub 上一些星標(biāo)超級多的優(yōu)質(zhì)項目,對增加項目經(jīng)驗有很大幫助。
1)電商秒殺
SpringBoot 完整電商系統(tǒng) Mall:包括前臺商城系統(tǒng)及后臺管理系統(tǒng),基于 SpringBoot+MyBatis 實現(xiàn)。
一套微服務(wù)商城系統(tǒng) mall-swarm:采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技術(shù),同時提供了基于 Vue 的管理后臺。
miaosha:秒殺系統(tǒng)設(shè)計與實現(xiàn)。
2)博客論壇
vhr:微人事是一個前后端分離的人力資源管理系統(tǒng),項目采用 SpringBoot+Vue 開發(fā)。
halo([?he?lo?],意為光環(huán),也可以當(dāng)成拼音讀(哈嘍)):一個優(yōu)秀的開源博客發(fā)布應(yīng)用。
對于在校生來說,缺的就是實戰(zhàn)經(jīng)驗,我推薦的這些練手項目可以很好的彌補這塊短板,挑一個拿出來練就足夠了哈,不需要全部都練。
三、Java 虛擬機和 Java 源碼
先說 Java 虛擬機。
Java 虛擬機(JVM)是相對難吃透的一個環(huán)節(jié),但卻十分的重要,JVM 屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得 Java 程序只需要生成在 Java 虛擬機上能運行的目標(biāo)代碼,也就是字節(jié)碼,就可以實現(xiàn)跨平臺的訴求了。JVM 學(xué)得通透的話,可以說是非常牛逼的程序員了。
給大家推薦一個 B 站上的視頻,分為《內(nèi)存與垃圾回收篇》《字節(jié)碼與類的加載篇》《性能監(jiān)控與調(diào)優(yōu)篇》三個篇章。
https://www.bilibili.com/video/av83622425
然后再推薦一本書《深入理解 Java 虛擬機》,周志明老師的。第三版在豆瓣上的評分直接來到了 9.5 分,可以說是強得一筆!這是一部從工作原理和工程實踐兩個維度深入剖析 JVM 的著作,是計算機領(lǐng)域公認(rèn)的經(jīng)典。
 
- 第一部分(第1章),主要講 Java 虛擬機的歷史
- 第二部分(第2~5章),詳細(xì)講解了 Java 的內(nèi)存區(qū)域劃分和垃圾收集器
- 第三部分(第6~9章),深入分析了class 文件結(jié)構(gòu)、虛擬機的類加載機制
- 第四部分(第10~11章),程序編譯和代碼優(yōu)化
- 第五部分(第12~13章),主要講解了 Java 實現(xiàn)高并發(fā)的原理,包括線程與協(xié)程、鎖優(yōu)化等等。
總之一點,Java 虛擬機是成神之路上的巔峰之戰(zhàn)!
再來說說 Java 源碼。
面試的時候,面試官都特別喜歡問一些源碼方面的知識,比如說 HashMap 的一些經(jīng)典問題,加載因子為什么是 0.75?哈希沖突的時候,HashMap 是如何查找并確認(rèn)元素的等等,這些問題只有通過源碼才能得出比較準(zhǔn)確的回答,對吧?
給大家推薦 B 站上一個視頻,詳細(xì)地介紹了如何閱讀 Java 源碼。
https://www.bilibili.com/video/BV1V7411U78L
這里說一下 Java 源碼閱讀的順序:
- lang
- util
- io
- nio
- math
- time
- net
其中的重點:
- String
- Integer
- ArrayList
- LinkedList
- CopyOnWriteArrayList
- HashMap
- TreeMap
- LinkedHashMap
- ConcurrentHashMap
- CopyOnWriteArrayList
四、數(shù)據(jù)庫
學(xué)習(xí)一門編程語言,如果不去操作下數(shù)據(jù),就感覺這門編程語言空有皮囊卻沒有靈魂,對吧?所以數(shù)據(jù)庫部分是必學(xué)的。
先說書。
《SQL 必知必會》是麻省理工學(xué)院、伊利諾伊大學(xué)等眾多大學(xué)的參考教材,這本書直接從 SQL 的 SELECT 開始,講述了實際工作環(huán)境中最常用和最必需的 SQL 知識,實用性極強。該書作者后來還出了一本《MySQL 必知必會》,同樣很薄的一本書,也可以看一看。
《高性能 MySQL》,業(yè)界公認(rèn)的一本經(jīng)典的 MySQL 讀物了,有著廣泛的影響力。
 目前大多數(shù)公司的存儲都是 MySQL + Redis,MySQL 作為主要的存儲方式,Redis 作為緩存,用來加快熱點數(shù)據(jù)的讀寫速度,從而提高性能。所以學(xué)完 MySQL,可以趁熱打鐵學(xué)一下 Redis。
《Redis 深入歷險核心原理與應(yīng)用實戰(zhàn)》分為基礎(chǔ)和應(yīng)用篇、原理篇、集群篇、拓展篇、源碼篇共 5
 大塊內(nèi)容。基礎(chǔ)和應(yīng)用篇講解對讀者來說最有價值的內(nèi)容,可以直接應(yīng)用到實際工作中;原理篇、集群篇讓開發(fā)者透過簡單的技術(shù)表面看到精致的底層世界;拓展篇幫助讀者拓展技術(shù)視野和夯實基礎(chǔ),便于進(jìn)階學(xué)習(xí);源碼篇讓高階的讀者能夠讀懂源碼,掌握核心技術(shù)實力。
Redis 的重要性不言而喻了,是互聯(lián)網(wǎng)技術(shù)架構(gòu)在存儲系統(tǒng)中最為廣泛的中間件,也是后端面試中最經(jīng)常被問到的模塊之一。
《MongoDB 權(quán)威指南》是一本廣受好評的 MongoDB 權(quán)威著作,作者是谷歌的一名軟件工程師,曾有 5 年是 MongoDB 項目的核心成員。
再來說說推薦的視頻。
SQL 推薦 B 站上一個老外的課,英文中字版的,內(nèi)容制作得非常棒,所以完全不用擔(dān)心聽不懂。10 個小時就能看完。
 
https://www.bilibili.com/video/BV1UE41147KC
MySQL 的推薦 B 站上的一個女老師的,講得很精彩,彈幕也很精彩。
https://www.bilibili.com/video/BV12b411K7Zu
Redis 的也推薦一個:
https://www.bilibili.com/video/BV1S54y1R7SB
Redis 是面試中經(jīng)常考的一塊知識點,像下面這些經(jīng)常被問,參考自老錢的文章:
- Redis 有哪些數(shù)據(jù)結(jié)構(gòu)?
- 使用過Redis分布式鎖么,它是什么回事?
- 假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如果將它們?nèi)空页鰜?#xff1f;
- 使用過Redis做異步隊列么,你是怎么用的?
- 如果有大量的key需要設(shè)置同一時間過期,一般需要注意什么?
- Redis如何做持久化的?
- Pipeline有什么好處,為什么要用pipeline?
- Redis的同步機制了解么?
- 是否使用過Redis集群,集群的原理是什么?
五、計算機組成原理
眾所周知,計算機是由 CPU、內(nèi)存、顯示器這些設(shè)備組成的硬件,但我們大學(xué)畢業(yè)后,往往從事的是軟件方面的開發(fā)工作。那怎樣才能在硬件和軟件之間自由穿梭呢?答案就是學(xué)好計算機組成原理。弄明白了計算機的組成原理,也就對整個軟件開發(fā)有了一個系統(tǒng)的認(rèn)知,不論是計算機的硬件原理,還是軟件架構(gòu),都能很好的駕馭,隨之而來的,我們的職業(yè)發(fā)展機會也就更多了。
計算機組成原理這門課完全可以用一個詞來概括,就是“抽象”。在我看來這也是整個計算機設(shè)計中所蘊含的的靈魂。《計算機是怎樣跑起來的》,很適合作為一本了解計算機的入門書。在外人看來,計算機很復(fù)雜,對內(nèi)行人來說,計算機說起來很簡單:
- 輸入、運算、輸出是硬件的基礎(chǔ)
- 軟件是數(shù)據(jù)和指令的集合
- 計算機和人的思考方式不同,對計算機來說,什么都是數(shù)字
既然聊到計算機,很有必要給大家推薦 B 站上的一門計算機科學(xué)速成課,講解的內(nèi)容有:
計算機早期歷史
 電子計算機
 布爾邏輯
 二進(jìn)制
 算術(shù)邏輯單元
 寄存器 & 內(nèi)存
 中央處理器
 指令和程序
 高級 CPU 設(shè)計
 早期的編程方式
 編程語言發(fā)展史
 編程原理
 算法入門
 數(shù)據(jù)結(jié)構(gòu)
 阿蘭圖靈(我最喜歡的一集)
 軟件工程
 集成電路 & 摩爾定律
 操作系統(tǒng)
 內(nèi)存 & 儲存介質(zhì)
 文件系統(tǒng)
 壓縮
 命令行界面
 屏幕 & 2D 圖形顯示
 個人計算機革命
 圖形用戶界面
 3D 圖形
 計算機網(wǎng)絡(luò)
 互聯(lián)網(wǎng)
 萬維網(wǎng)
 計算機安全
 黑客 & 攻擊
 加密
 機器學(xué)習(xí) & 人工智能
 計算機視覺
 自然語言處理
 機器人
 計算機心理學(xué)
 天網(wǎng) & 計算機的未來
非常值得每個程序員去刷一刷的,全部都是計算機專業(yè)需要掌握的知識點啊,至少是應(yīng)該了解的知識點。關(guān)鍵是視頻的畫面特別精良,我來截幅圖給大家感受下。
 關(guān)鍵是英文中字版的,觀看起來毫無壓力。我自己每天會刷一集。像二進(jìn)制這一集,以前經(jīng)常被二進(jìn)制搞得暈頭轉(zhuǎn)向,刷了這集視頻后,明顯感覺對二進(jìn)制沒那么生疏了,仿佛一個陌生人坐在對面,喝了一杯酒后,就成了老熟人。
https://www.bilibili.com/video/av21376839
我看彈幕有人說,“第一次用 B 站看這么正經(jīng)的東西。”好他喵的真實呀!我也是。
最后再推薦一本書,《編碼-印尼在計算機軟硬件背后的語言》,這本書講述的是計算機背后的工作原理。
你是否想知道計算機如何工作和運行的?
 你是否想了解計算機是如何一步一步創(chuàng)造出來的?
 你是否想了解計算機知識的來龍去脈?
 你是否想了解計算機的歷史?
 你是否想制造出一臺自己的計算機?
 你是否想知道硬件與軟件的區(qū)別?
 你是否想知道電報機、電的原理?
 你是否想創(chuàng)造自己的編程語言?
 你是否想知道你買的電腦中說明書上說的主頻、內(nèi)存、顯示器象素、顯存的概念和意義?
 你是否想知道我們常用的十進(jìn)制的由來?
 你是否一直迷惑于二進(jìn)制的理解?
 你是否想知道那些赫赫有名的IT公司的歷史和發(fā)展?
 你是否想探詢那些天才是如何思考和發(fā)明的?
 你是否想象科學(xué)家一樣思考?
 這一連串問答摘自豆瓣書評
這本書將一一為你揭開謎底。本書的內(nèi)容涉及數(shù)理邏輯、布爾代數(shù)、組合數(shù)學(xué)、集合、物理、化學(xué)和電子學(xué)等等知識。
六、計算機網(wǎng)絡(luò)
當(dāng)今這個時代,沒有網(wǎng)絡(luò)簡直無法生存,哪怕是在電梯里的一分鐘,我都受不了那種手機沒有網(wǎng)絡(luò)的狀態(tài)。我們所學(xué)的編程知識,如果脫離了網(wǎng)絡(luò),將變得毫無意義,因為沒有哪個編程語言是要在單機環(huán)境下運行的。
計算機網(wǎng)絡(luò)課怎么學(xué)習(xí),給大家推薦四本書,一門公開課。
《網(wǎng)絡(luò)是怎樣連接的》,這本書從在瀏覽器中輸入網(wǎng)址開始,一路追蹤到顯示出網(wǎng)頁內(nèi)容為止的整個過程,以圖配文,講解了網(wǎng)絡(luò)的全貌,并重點介紹了網(wǎng)絡(luò)設(shè)備和軟件是如何工作的。
 
《TCP/IP 詳解》,這是一本完整而詳細(xì)的 TCP/IP 協(xié)議指南,基本上做通信的是人手一本。對于大多數(shù)程序員來說,了解這個 TCP/IP 對面試和編程也有很大的幫助。
《圖解 HTTP》,HTTP協(xié)議是互聯(lián)網(wǎng)的基石,學(xué)完后可以嘗試實現(xiàn)一個屬于自己的 HTTP 服務(wù)器了。
 
《計算機網(wǎng)絡(luò)-自頂向下方法》,算是一本經(jīng)典的大學(xué)教材了,
 
關(guān)于計算機網(wǎng)絡(luò)這塊,可以配合 B 站上的《計算機網(wǎng)絡(luò)微課堂》一起來學(xué)習(xí)。
https://www.bilibili.com/video/BV1c4411d7jb
這門課主要介紹了計算機網(wǎng)絡(luò)的基本概念和基本原理,從下到上依次講解物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、運輸層和應(yīng)用層,以因特網(wǎng)和網(wǎng)絡(luò)技術(shù)為實例,深入講解和分析了計算機網(wǎng)絡(luò)的基本原理、方法和技術(shù)精髓。這門課程學(xué)完后,你將:
- 輕松學(xué)懂計算機網(wǎng)絡(luò),掌握相關(guān)的理論基礎(chǔ)。
- 對于要參加 408 考研的同學(xué),可以從容應(yīng)考。
- 如果將來要從事計算機網(wǎng)絡(luò)相關(guān)的科研,也能打下堅實的基礎(chǔ)。
七、計算機操作系統(tǒng)
為什么要學(xué)習(xí)操作系統(tǒng)呢?
第一,面試要考;
第二,無論學(xué)習(xí)哪門子編程語言,比如說 Java、C/C++,都需要和操作系統(tǒng)打交道,像 Java 中的多線程技術(shù),其實是由操作系統(tǒng)來負(fù)責(zé)進(jìn)程和線程管理的;
第三,學(xué)習(xí)操作系統(tǒng),還能學(xué)到內(nèi)存分配方面的知識。
同樣推薦兩本書,《深入理解計算機系統(tǒng)》和《鳥哥的Linux私房菜 基礎(chǔ)學(xué)習(xí)》。
《深入理解計算機系統(tǒng)》,按理說,這本書的名字應(yīng)該叫《計算機系統(tǒng)導(dǎo)論》,有 C語言、數(shù)據(jù)結(jié)構(gòu)的知識就可以學(xué)這本書了,想在畢業(yè)后去大廠的學(xué)弟學(xué)妹值得花時間去三刷一下這本書,注意是三刷,第一刷大致了解,第二刷精度,第三刷溫習(xí)。可以說得上是程序員了解計算機系統(tǒng)的最佳書籍了,可以去 CSAPP 課程官網(wǎng)找 Lab 配合刷起來。
 《鳥哥的Linux私房菜 基礎(chǔ)學(xué)習(xí)》,這是一本 Linux 方面的暢銷書了,全面詳細(xì)地介紹了 Linux 操作系統(tǒng),如果要學(xué)習(xí) Linux 的話,首選。
八、數(shù)據(jù)結(jié)構(gòu)與算法
無論什么時候,程序=數(shù)據(jù)結(jié)構(gòu)+算法這種說法都是成立的。
常用的數(shù)據(jù)結(jié)構(gòu)有:
- 棧:棧是一種非常有用的數(shù)據(jù)結(jié)構(gòu),它就像一摞盤子,第一個放在最下面,第二個放在第一個上面,第三個放在第二個上面,最后一個放在最上面。棧遵循后進(jìn)先出的原則,也就是“Last In First Out”(簡稱 LIFO)——最后的一個進(jìn)的,最先出去。
- 隊列:只允許在隊尾添加數(shù)據(jù),隊首移除數(shù)據(jù)。隊列在 Java 中的出現(xiàn)頻率非常高,有各種不同的類來滿足不同的場景需求。像優(yōu)先級隊列 PriorityQueue、延時隊列 DelayQueue 等等。隊列遵循的是First In First Out,縮寫為FIFO,也就是先進(jìn)先出,第一個進(jìn)入隊列的第一個先出來。
- 數(shù)組:數(shù)組這種數(shù)據(jù)結(jié)構(gòu)最大的好處,就是可以根據(jù)下標(biāo)(或者叫索引)進(jìn)行操作,插入的時候可以根據(jù)下標(biāo)直接插入到具體的位置,但與此同時,后面的元素就需要全部向后移動,需要移動的數(shù)據(jù)越多,就越累。
- 鏈表:鏈表在物理存儲空間是不連續(xù)的,但每個節(jié)點要么知道它的下一個節(jié)點是誰,要么知道它的上一個節(jié)點是誰,仿佛就像我們之間隔著千山萬水,卻心有靈犀一點鏈。像 LinkedList 就是最典型的鏈表結(jié)構(gòu),通過引用相互鏈接。
- 樹:樹是一種典型的非線性結(jié)構(gòu),它是由 n(n>0)個有限節(jié)點組成的一個具有層次關(guān)系的集合。之所以叫“樹”,是因為這種數(shù)據(jù)結(jié)構(gòu)看起來就像是一個倒掛的樹,只不過根在上,葉在下。
- 哈希表:也叫散列表,是一種可以通過關(guān)鍵碼值(key-value)直接訪問的數(shù)據(jù)結(jié)構(gòu),它最大的特點就是可以快速實現(xiàn)查找、插入和刪除。
- 圖:圖是一種復(fù)雜的非線性結(jié)構(gòu),由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G 表示一個圖,V 是圖 G 中頂點的集合,E 是圖 G 中邊的集合。
常用的算法有:
- 查找
- 插入
- 刪除
- 更新
- 排序
算法研究的目的是為了更有效的處理數(shù)據(jù),提高數(shù)據(jù)運算的效率,數(shù)據(jù)運算是定義在數(shù)據(jù)結(jié)構(gòu)上的,各大公司的筆試基本都考這個,《劍指 Offer》上的所有題目如果能背下來,LeetCode 上的題如果能刷個一百到三百道,ACM 競賽如果能拿到一些獎項。在找工作的時候會非常有優(yōu)勢,基本上大廠小廠的 offer 可能會拿到手軟。
刷完 300 道 LeetCode 題后,我強到可以和面試官硬剛!純正 Java 版
視頻的話,推薦 B 站上的一個,韓順平老師的。
https://www.bilibili.com/video/av54029771
評論區(qū)有同學(xué)給出了數(shù)據(jù)結(jié)構(gòu)與算法在面試中經(jīng)常考的知識點,和視頻是關(guān)聯(lián)的:
- P16~P23 單鏈表
- P24~P26 雙向鏈表
- P27~P29 約瑟夫環(huán)
- P30~P35 棧·棧實現(xiàn)計算器
- P36~P42 前綴,中綴,后綴表達(dá)式,逆波蘭計算器的實現(xiàn)
- P43~P49 遞歸,迷宮回溯,八皇后
- P50~P53 排序算法基礎(chǔ)
- 54~56 冒泡排序
- 57~59 選擇排序
- 60~62 插入排序
- 63~65 希爾排序
- 66~68 快速排序
- 69~71 歸并排序
- 72~75 基數(shù)排序
- 76 各種排序的比較
- 127~131 二叉排序樹
- 132~134 BST刪除一棵子樹的節(jié)點
- 135 二叉平衡樹
- 146~151 圖,圖的深度優(yōu)先和廣度優(yōu)先
- 156~159 動態(tài)規(guī)劃
- 160~163 暴力匹配和KMP算法
- 164~ 167 貪心算法
順帶說一下,我上面總結(jié)的這套體系是非常完備的,可以說拿到任何地方都是有公信力的,幾乎完美到無可挑剔(自信有點上頭)。
如果你很幸運的,從大一就看到了這個學(xué)習(xí)路線,那么恭喜你,實習(xí) Offer 可以說是手到擒來了!如果稍微有那么一點不走運,看到的比較晚,那么一句很雞賊的話送給你,“種一棵樹最好的時間要么是十年前,要么是現(xiàn)在。”
我是二哥呀!記得給二哥點贊,好不好?(偷偷搜藏也行)
總結(jié)
以上是生活随笔為你收集整理的凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IOS7.1.2越狱手工美化(字体,状态
- 下一篇: [转载]只因写了一段爬虫,公司200多人
