為了保證這篇文章后續(xù)能夠繼續(xù)完善,我已近將其同步到了我的 Github:https://github.com/Snailclimb/cs-guide (無價(jià)值不分享。歡迎擴(kuò)散,讓更多學(xué)姐看到。有幫助就點(diǎn)個(gè) star 鼓勵(lì)一下 ??)
網(wǎng)上已經(jīng)有挺多關(guān)于“計(jì)算機(jī)專業(yè)大學(xué)四年到底應(yīng)該學(xué)什么?”相關(guān)的文章了。不過,既然學(xué)姐問了我這個(gè)問題,我還是想再從我的角度來給她回答一下。安排!
另外,這篇文章中我不光會(huì)推薦你學(xué)習(xí)什么,還會(huì)推薦對(duì)應(yīng)的比較好的學(xué)習(xí)資料給你。
這篇文章前前后后花了兩個(gè)月時(shí)間寫完,光是完善和修改就花了一周。即使,我盡量控制不說廢話,但是這篇文章的字?jǐn)?shù)也還是超過了 1w 字 ,不過都是干貨!相信,不論是在校大學(xué)生還是已經(jīng)工作幾年的小伙伴都應(yīng)該能夠從中有所收獲。如果有幫助點(diǎn)個(gè)贊/再看鼓勵(lì)一下就好!
另外, 這篇文章也要感謝我哈工大的一位朋友小明,畢竟自己離開學(xué)校已有 1 年多,沒有他的鼎力幫助,就沒有這篇文章。
下面這張圖是周末的時(shí)候在窗臺(tái)邊寫這篇文章的時(shí)候拍的。
首先,在學(xué)習(xí)編程之前,我覺得什么編程語言、數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)這些都要統(tǒng)統(tǒng)一邊去。作為計(jì)算機(jī)專業(yè)的學(xué)生一定要首先養(yǎng)成下面幾個(gè)程序員必備的好習(xí)慣。
我把我知道的一些程序員必備的好習(xí)慣毫無保留地都整理在了這個(gè)倉庫:https://github.com/Snailclimb/programmer-advancement [2] ,強(qiáng)烈推薦大家看看,同時(shí)也期待你的完善補(bǔ)充!
然后,就是編程語言了!
幾乎所有的大學(xué)剛?cè)雽W(xué)第一年就會(huì)開設(shè)一門編程語言課,一般是 C 語言偏多。
不論你的學(xué)校是否開設(shè)了 C 語言這門課,我建議大家最好還是學(xué)一下 C 語言。拿我從事的 Java 后端開發(fā)來說,很多 Java 從業(yè)者單純覺把 Java 學(xué)好就完全足夠了,并不需要再學(xué)習(xí)像 C、C++這種稍微更難一點(diǎn)的編程語言。我覺得對(duì)于剛能寫好 CRUD 的 Java 程序員來說確實(shí)是這樣的,但是對(duì)于想要成為比較頂尖的 Java 程序員來說肯定是不行的。很多開源項(xiàng)目都調(diào)用了 C 語言庫,所以, 作為 Java 程序員,不需要你 C 編碼能力多強(qiáng),至少能夠看懂 C 代碼。
剛開始學(xué)習(xí)一門編程語言的時(shí)候,大部分人都挺吃力的。有時(shí)候一個(gè)環(huán)境搭建就折騰大半天。我記得,我那時(shí)候剛開始學(xué),很多非常非常簡(jiǎn)單的控制臺(tái)程序都寫不出來。不過,隨著后面學(xué)習(xí)的慢慢深入,我慢慢發(fā)現(xiàn)自己的編程思維和能力在變得越來越好。
在這里我想鼓舞一下初入計(jì)算機(jī)編程的各位小伙伴:萬事開頭難,你見過的所有大佬都是從懵懵懂懂的階段摸爬滾打過來的。 當(dāng)你在 C 語言課上看著前面的老師在編譯器中飛快地輸入著代碼,自己卻連編譯器都配置不好的時(shí)候,心中難免會(huì)有失落,但這決非放棄的理由,只要堅(jiān)持住,解決了一個(gè)又一個(gè)的難題,你也會(huì)成為曾經(jīng)心中的大佬。
如果想要看視頻提前學(xué)習(xí)或者上課沒學(xué)好 C 語言的話,推薦去 B 站搜索 C 語言郝斌。這個(gè)老師的課程很不錯(cuò),非常適合拿來作為初學(xué)者學(xué)習(xí) C 語言的教程。并且,視頻中老師還會(huì)給你分享一些他自己的編程學(xué)習(xí)心得。
另外,如果你覺得譚浩強(qiáng) 老師的 《C 語言程序設(shè)計(jì)》 這本書比較難理解的話,可以看一下 《啊哈 C 語言!》,這本書非常通俗易懂,非常適合之前沒有學(xué)習(xí)過編程的新手。
還有開設(shè) C++課程的高校也比較多。初學(xué)者學(xué)習(xí) C++的教材可以使用《C++ Primer》,熟練掌握基礎(chǔ)語法后,為了進(jìn)一步提高自己的編程開發(fā)能力,還可以讀一讀《C++ Primer Plus》和《Effective C++》。
實(shí)際上,大一初學(xué)編程的小伙伴在剛開始學(xué)編程語言的時(shí)候都會(huì)很吃力,以上推薦教材的正確使用方法有兩個(gè)要點(diǎn):
計(jì)算機(jī)基礎(chǔ)的話,就是我們平時(shí)常提到的老四件:1.數(shù)據(jù)結(jié)構(gòu)、2.算法、3.計(jì)算機(jī)網(wǎng)絡(luò)、4.操作系統(tǒng)。
要我說的話,這四門課是程序員最最最需要好好學(xué)的東西!另外,雖然四者都很重要,但是數(shù)據(jù)結(jié)構(gòu)和算法相比于計(jì)算機(jī)網(wǎng)絡(luò)和操作系統(tǒng)要更加重要一些!
這四大件也就是我們常說的程序員內(nèi)功修煉最重要的一部分內(nèi)容!
“直接用框架不就好了么?為啥還要學(xué)習(xí)這些東西呢?” 這句話是很多初學(xué)編程的小伙伴最疑惑的問題。
簡(jiǎn)單給大家聊聊為什么這四大件這么重要吧!
關(guān)于數(shù)據(jù)結(jié)構(gòu),我想說的是,它是這四大件中最簡(jiǎn)單、最基礎(chǔ)的一個(gè)。離開了數(shù)據(jù)結(jié)構(gòu),幾乎任何的程序都會(huì)失效,所以在討論數(shù)據(jù)結(jié)構(gòu)的時(shí)候,常常要把算法也連帶著說一說。
要單純地掌握常見的數(shù)據(jù)結(jié)構(gòu),就如同拆解一個(gè)個(gè)精妙的儀器件一樣有趣和簡(jiǎn)單。正因?yàn)閿?shù)據(jù)結(jié)構(gòu)這個(gè)東西在程序中的作用,和儀器部件特別相像,不同的數(shù)據(jù)結(jié)構(gòu)有著不同的特性,因此要想學(xué)好數(shù)據(jù)結(jié)構(gòu),圖解是必備武器!
在數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)中,強(qiáng)烈建議跟著名校的網(wǎng)課學(xué)習(xí),這些課程都經(jīng)過多次打磨,配套練習(xí)豐富,非常適合初學(xué)者。比如中國大學(xué) MOOC 上的武漢大學(xué)開設(shè)的《數(shù)據(jù)結(jié)構(gòu)》課程。
輔以教材參考書,強(qiáng)推《大話數(shù)據(jù)結(jié)構(gòu)》,光看封面你就知道這本書的風(fēng)格了,圖解學(xué)數(shù)據(jù)結(jié)構(gòu)?選這本,沒錯(cuò)的!
當(dāng)用圖解理清了各種數(shù)據(jù)結(jié)構(gòu)的原理和特性之后,還要在代碼中多加練習(xí),熟能生巧。
編程是一個(gè)冒出一個(gè)問題,解決一個(gè)問題的有趣過程。
當(dāng)有一個(gè)變量在腦海中出現(xiàn)的時(shí)候,要先思考該變量的作用是什么,以什么數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)這個(gè)變量,還要考慮在代碼中如何實(shí)現(xiàn)。比如說棧,在 C 語言中可以用數(shù)組輔以棧頂指針來實(shí)現(xiàn);在 Java 中可以直接調(diào)用 Stack 類來實(shí)現(xiàn)。只要你編程,就要用到數(shù)據(jù)結(jié)構(gòu),編的程序越復(fù)雜,用到的數(shù)據(jù)結(jié)構(gòu)就可能越多,可以說它幾乎沒有什么難點(diǎn),重點(diǎn)是熟能生巧。
算法課常常和數(shù)據(jù)結(jié)構(gòu)課放在一起,在有些高校中,會(huì)存在“數(shù)據(jù)結(jié)構(gòu)與算法”和“算法設(shè)計(jì)與分析”這樣的兩門課。
前者可能相對(duì)簡(jiǎn)單,介紹的是常用的數(shù)據(jù)結(jié)構(gòu)和基礎(chǔ)的算法;后者就相對(duì)較難,講的是算法相關(guān)的概念,以及稍微比較復(fù)雜的算法思維和算法分析。前者側(cè)重的是基礎(chǔ)邏輯算法的應(yīng)用,后者側(cè)重的是運(yùn)用算法思想到實(shí)際問題中。
舉個(gè)例子,我們常用的排序算法就屬于前者的課程內(nèi)容,一個(gè)排序問題可以有多種算法解決方案,不同方案有不同的優(yōu)劣,也就有不同的應(yīng)用場(chǎng)景,學(xué)習(xí)一題多解也可以加強(qiáng)編程熟練度。而貪心思想屬于后者的課程內(nèi)容,比如說經(jīng)典的活動(dòng)選擇問題:
設(shè) S={1,2,...,n}是 n 個(gè)活動(dòng)的集合,各個(gè)活動(dòng)的集合,各個(gè)活動(dòng)使用同一個(gè)資源,資源在同一時(shí)間只能為一個(gè)活動(dòng)使用?,F(xiàn)已知 n 個(gè)活動(dòng)的開始時(shí)間 si 和 fi,設(shè)所有活動(dòng)的最早開始時(shí)間和最晚結(jié)束時(shí)間都在資源可供利用的時(shí)間內(nèi),并規(guī)定若活動(dòng) i 和活動(dòng) j 滿足 fi≤sj(或 fj≤si),則稱他們是兼容的?,F(xiàn)求:最大活動(dòng)集合,該活動(dòng)集合內(nèi)的所有活動(dòng)都是兼容的。
該問題的解決思想使用了貪心思想,貪心策略為:每次都選 fi 最小,即結(jié)束時(shí)間最早的活動(dòng)(在滿足兼容的情況下)。以此貪心策略進(jìn)行選取活動(dòng)集合,可以滿足結(jié)果為最優(yōu)解(不唯一),該解法的最優(yōu)性可以用優(yōu)化子結(jié)構(gòu)來證明。以上這些,對(duì)于初學(xué)者來說可能聽起來云山霧繞,但這都是算法設(shè)計(jì)與分析課上的內(nèi)容。
分治思想、貪心思想、動(dòng)態(tài)規(guī)劃這三大算法在實(shí)際應(yīng)用起來非常靈活,常常讓人摸不到頭腦。我給大家的建議是:
另外,如果你刷 Leetcode 的話,你會(huì)發(fā)現(xiàn)很多算法題都是通過動(dòng)態(tài)規(guī)劃的方式來解決的,因此你務(wù)必要琢磨透動(dòng)態(tài)規(guī)劃算法的思想。
再附上一些算法領(lǐng)域的經(jīng)典學(xué)習(xí)參考書(對(duì)于初學(xué)者,推薦程度從左向右……):
下面這兩篇文章都非常不錯(cuò),一定要好好看一下:
計(jì)算機(jī)網(wǎng)絡(luò)是一門系統(tǒng)性比較強(qiáng)的計(jì)算機(jī)專業(yè)課,各大名校的計(jì)算機(jī)網(wǎng)絡(luò)課程打磨的應(yīng)該都比較成熟。
要想學(xué)好計(jì)算機(jī)網(wǎng)絡(luò),首先要了解的就是 OSI 七層模型或 TCP/IP 五層模型,即應(yīng)用層(應(yīng)用層、表示層、會(huì)話層)、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層。
Data to Drag關(guān)于這門課,首先強(qiáng)烈推薦參考書是機(jī)械工業(yè)出版社的《計(jì)算機(jī)網(wǎng)絡(luò)——自頂向下方法》。該書目錄清晰,按照 TCP/IP 五層模型逐層講解,對(duì)每層涉及的技術(shù)都展開了詳細(xì)討論,基本上高校里開設(shè)的課程的教學(xué)大綱就是這本書的目錄了。如果你覺得上面這本書看著比較枯燥的話,我強(qiáng)烈推薦+安利你看看下面這兩本非常有趣的網(wǎng)絡(luò)相關(guān)的書籍:
如果說學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)要圍繞的 TCP/IP 五層模型逐層展開學(xué)習(xí)的話,那么針對(duì)每層的學(xué)習(xí),就要以協(xié)議為單位了。一言以蔽之,我們學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)需要的協(xié)議有:
操作系統(tǒng)也是一門比較重要的學(xué)科。為何這樣說呢?
操作系統(tǒng)中的很多思想、很多經(jīng)典的算法,你都可以在我們?nèi)粘i_發(fā)使用的各種工具或者框架中找到它們的影子。
比如說我們開發(fā)的系統(tǒng)使用的緩存(比如 Redis)和操作系統(tǒng)的高速緩存就很像。CPU 中的高速緩存有很多種,不過大部分都是為了解決 CPU 處理速度和內(nèi)存處理速度不對(duì)等的問題。我們還可以把內(nèi)存可以看作外存的高速緩存,程序運(yùn)行的時(shí)候我們把外存的數(shù)據(jù)復(fù)制到內(nèi)存,由于內(nèi)存的處理速度遠(yuǎn)遠(yuǎn)高于外存,這樣提高了處理速度。同樣地,我們使用的 Redis 緩存就是為了解決程序處理速度和訪問常規(guī)關(guān)系型數(shù)據(jù)庫速度不對(duì)等的問題。
高速緩存一般會(huì)按照局部性原理(2-8 原則)根據(jù)相應(yīng)的淘汰算法保證緩存中的數(shù)據(jù)是經(jīng)常會(huì)被訪問的。我們平常使用的 Redis 緩存很多時(shí)候也會(huì)按照 2-8 原則去做,很多淘汰算法都和操作系統(tǒng)中的類似。
既說了 2-8 原則,那就不得不提命中率了,這是所有緩存概念都通用的。簡(jiǎn)單來說也就是你要訪問的數(shù)據(jù)有多少能直接在緩存中直接找到。命中率高的話,一般表明你的緩存設(shè)計(jì)比較合理,系統(tǒng)處理速度也相對(duì)較快。
總結(jié)來說,我覺得學(xué)好操作系統(tǒng)能夠提高自己思考的深度以及對(duì)技術(shù)的理解力。
操作系統(tǒng)內(nèi)容比較多,如果說你單純是為了應(yīng)付面試的話,你可以看我之前總結(jié)的一篇文章:https://snailclimb.gitee.io/javaguide/#/docs/operating-system/basis[8] 。
這篇文章的目錄如下,涵蓋了操作系統(tǒng)一些比較常見的問題。
如果你要系統(tǒng)地學(xué)習(xí)操作系統(tǒng)的話,最硬核最權(quán)威的書籍是**《操作系統(tǒng)導(dǎo)論》** 。你可以再配套一個(gè) 《深入理解計(jì)算機(jī)系統(tǒng)》 加深你對(duì)計(jì)算機(jī)系統(tǒng)本質(zhì)的認(rèn)識(shí),美滋滋!
如果你比較喜歡動(dòng)手,對(duì)于理論知識(shí)比較抵觸的話,我推薦你看看《30 天自制操作系統(tǒng)》,這本書會(huì)手把手教你編寫一個(gè)操作系統(tǒng)。
本章設(shè)計(jì)的課程并不是說專業(yè)課,只是說相比于上面的四大件,專業(yè)性更強(qiáng),主要包括面向?qū)ο蟪绦蛟O(shè)計(jì)、形式語言與自動(dòng)機(jī)、機(jī)器學(xué)習(xí)、數(shù)據(jù)庫系統(tǒng)、編譯原理。
面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)是程序員編程的核心思想,如果以后走軟件開發(fā)路線,OOP 是必須要精通的。OOP 給程序員提供了一種思維模式,將現(xiàn)實(shí)生活中的事務(wù)抽象成為“對(duì)象”,面向?qū)ο筮M(jìn)行程序設(shè)計(jì)。
舉個(gè)例子,OOP 中有三大要素——類、繼承、多態(tài)(也有封裝、繼抽象、繼承、多態(tài)四大要素)。如果把杯子抽象成為類的話,那么咖啡杯、茶杯、馬克杯等等都屬于對(duì)杯子的繼承,在該繼承中,被繼承者——杯子,被稱為父類,繼承者——咖啡杯、茶杯、馬克杯,被稱為子類。子類繼承父類,即父類有的子類一定有(除父類私有),而子類有的父類不一定有。而多態(tài)的概念是在繼承之中的,在繼承中,子類擁有父類的方法,都是杯子,那么就都能裝水。而不同的杯子可以定制自己的方法,即重載父類“裝水”的方法——裝咖啡、裝茶水等。
OOP 中還有六大原則:
可能有很多小伙伴在學(xué)完了 OOP,編了兩三年程序也沒完全弄清楚這六大原則。其實(shí)他們無處不在,這里我盡量舉例子來形象地說明這六大原則。
假設(shè)杯子分為咖啡杯和牛奶杯:
關(guān)于 OOP 大的概況,我只能用三大特性和六大原則來概括,真要學(xué)習(xí)起來,OOP 中的每一個(gè)細(xì)節(jié)都值得深入討論。OOP 早在上世紀(jì)八十年代就開始流行,作為提高程序設(shè)計(jì)生產(chǎn)力的重要思想,一直沿用到現(xiàn)在。C++和 Java 是現(xiàn)在比較主流的 OOP 編程語言,也是高校中 OOP 課程的主力教學(xué)語言。如果接觸的第一門語言的是 C 語言的話,也不用太過抵觸,雖然 C 語言是面向過程程序設(shè)計(jì),接觸過這種稍稍比較原始的編程思想,再學(xué)習(xí) OOP 的話,會(huì)有更不一樣的感覺。
“計(jì)算機(jī)專業(yè)大學(xué)四年到底應(yīng)該學(xué)什么?”,我想很多人在這個(gè)問題下的回答不會(huì)包括這門課——形式語言與自動(dòng)機(jī)。
這門課包括兩個(gè)部分:
形式語言更像是計(jì)算機(jī)專業(yè)的數(shù)學(xué)課,它研究的是嚴(yán)格的語法規(guī)則下,語義的表示?;谛问秸Z言課程的后續(xù)課程其實(shí)也不算多,編譯原理、自然語言處理等專業(yè)課程可能會(huì)用到形式語言的知識(shí),但形式語言帶給學(xué)生的更偏向于一種思想,在給定條件下對(duì)問題的定義能力和抽象能力。
自動(dòng)機(jī)是算法的一種。自動(dòng)機(jī)可以理解為一臺(tái)在給定狀態(tài)下、給定輸入得到確定的輸出(集)的機(jī)器,核心是狀態(tài) × 輸入 →{狀態(tài)}的映射。他也是代表著一類思想。自動(dòng)機(jī)思想在算法中的應(yīng)用常常被看作是傳統(tǒng)算法,由于他的思路非常簡(jiǎn)單,運(yùn)行效率高,在一些特定的場(chǎng)景下有著高效地運(yùn)用。但自動(dòng)機(jī)的缺點(diǎn)在于其定義非常復(fù)雜,正因?yàn)榇?,適用面也比較窄。
總的來說,形式語言跟正則表達(dá)式還有點(diǎn)關(guān)系,自動(dòng)機(jī)的學(xué)習(xí)過程更像是解一道道的智力題,這門課應(yīng)該還算比較有趣的一門課。
如果你要學(xué)習(xí)這門課的話,可以去中國大學(xué) Mooc 看看哈工大的形式語言與自動(dòng)機(jī)理論這門課。
機(jī)器學(xué)習(xí)這門課不一定每個(gè)高校都開設(shè),有的高??赡荛_設(shè)的是領(lǐng)域性更強(qiáng)的深度學(xué)習(xí),有的高校可能把機(jī)器學(xué)習(xí)當(dāng)作選修課開設(shè),但在現(xiàn)在的人工智能技術(shù)橫行的 IT 行業(yè)中,要掌握 AI 技術(shù),機(jī)器學(xué)習(xí)屬于一門很好的入門專業(yè)課(并不是通識(shí)課)。
機(jī)器學(xué)習(xí)中涉及了大量的概率論的知識(shí),需要扎實(shí)的概率論基礎(chǔ),還夾雜著一些不簡(jiǎn)單的線性代數(shù)知識(shí)。 機(jī)器學(xué)習(xí)的工作是在研究一種算法,在某些任務(wù)中,利用一些經(jīng)驗(yàn),研究該算法的性能。任務(wù)的種類大體可以分為分類問題和回歸問題。 分類問題,就是在給定已知條件的情況下,決定該情況屬于哪一類,比如經(jīng)典的航班預(yù)測(cè)問題,給定某一班航班的信息,預(yù)測(cè)該航班是否可能會(huì)晚點(diǎn)。而回歸問題是在給定已知條件的情況下,計(jì)算該情況的回歸值,在航班預(yù)測(cè)問題中,可能并不是預(yù)測(cè)是否晚點(diǎn)(二分類問題),而是預(yù)測(cè)該航班的到達(dá)時(shí)間(相比于基準(zhǔn)時(shí)間的晚點(diǎn)時(shí)間或早到時(shí)間),這就是回歸問題。
機(jī)器學(xué)習(xí)中比較簡(jiǎn)單的算法有決策樹、多項(xiàng)式擬合、邏輯回歸等,相對(duì)較難的算法有支持向量機(jī)(SVM)算法、EM 算法等,就不一一列舉了。機(jī)器學(xué)習(xí)在一些算法上可以看作是數(shù)值分析課程和概率論的延伸,因此在學(xué)習(xí)機(jī)器學(xué)習(xí)之前,一定要打好扎實(shí)的數(shù)值分析基礎(chǔ),學(xué)好概率論,順便別把大一學(xué)的線性代數(shù)都忘光了。
在學(xué)習(xí)的過程中,除了跟著老師在課堂上的逐步講解和推導(dǎo),課下還可以結(jié)合著 B 站上的 “白板機(jī)器學(xué)習(xí)” 來看,推導(dǎo)非常詳細(xì),小哥哥也非常耐心。
參考書的話,這里有兩本推薦的書,一本是“西瓜書”——周志華的《機(jī)器學(xué)習(xí)》。 西瓜書中的案例場(chǎng)景圍繞著“種西瓜”展開,比較能帶動(dòng)讀者興趣,但是該書涉及符號(hào)較多,讀者最好有一定的代數(shù)能力素養(yǎng),可以盡快適應(yīng)該書的符號(hào)表達(dá)和公式推導(dǎo)。該書比較適合慢慢研讀,內(nèi)容在機(jī)器學(xué)習(xí)領(lǐng)域不算深,一點(diǎn)點(diǎn)啃會(huì)有不小的收獲。另一本書是李航的《統(tǒng)計(jì)學(xué)習(xí)方法》, 該書不僅適合計(jì)算機(jī)專業(yè)的學(xué)生,也適合數(shù)理統(tǒng)計(jì)專業(yè)的學(xué)生,書中每章都圍繞著一個(gè)個(gè)經(jīng)典算法展開,推導(dǎo)過程詳細(xì),篇幅也不長(zhǎng),但內(nèi)容相對(duì)西瓜書來說比較枯燥,適合作為工具書來讀,需要學(xué)習(xí)某個(gè)算法的時(shí)候,去該書上找那一章節(jié),快速讀完,不懂的話可以多讀幾遍。
數(shù)據(jù)庫系統(tǒng)這門課在程序員的職業(yè)規(guī)劃中也是非常重要的一門課,甚至有些信息管理的專業(yè)的也要開設(shè)這門課。說這門課重要,是因?yàn)閷?duì)于程序員的發(fā)展來說,一方面關(guān)系數(shù)據(jù)庫系統(tǒng)、SQL 語言以及數(shù)據(jù)庫的三段設(shè)計(jì)(概念設(shè)計(jì)、邏輯設(shè)計(jì)和物理設(shè)計(jì))都是開發(fā)數(shù)據(jù)庫應(yīng)用程序的必備技能,通常在數(shù)據(jù)庫應(yīng)用開發(fā)崗位的面試中,數(shù)據(jù)庫的設(shè)計(jì)是面試官青睞的考點(diǎn),如何能根據(jù)需求分析并設(shè)計(jì)出完善的數(shù)據(jù)庫系統(tǒng),是程序員的必備技能,設(shè)計(jì)好了完善的數(shù)據(jù)庫系統(tǒng)之后,再用 SQL 語言等工具對(duì)其進(jìn)行實(shí)現(xiàn),那么這些其實(shí)就是個(gè)人的編碼能力了。另一方面,數(shù)據(jù)庫中的查詢處理、查詢優(yōu)化、并發(fā)控制、事務(wù)管理、日志管理等內(nèi)容,都是數(shù)據(jù)庫中稍微進(jìn)階一點(diǎn)的技能,對(duì)于一些對(duì)崗位要求比較高的,這些技術(shù)同樣要求熟練掌握。 對(duì)一些查詢優(yōu)化的等數(shù)據(jù)庫底層實(shí)現(xiàn)的內(nèi)容,也是新型數(shù)據(jù)庫開發(fā)的前置基礎(chǔ)技能,對(duì)于一些研究型人才來說,也是非常重要的。
數(shù)據(jù)庫系統(tǒng)與其他計(jì)算機(jī)專業(yè)課一樣,知識(shí)體系非常清晰,而且他有一個(gè)非常突出的特點(diǎn),就是實(shí)際與理論相結(jié)合。SQL 語言,數(shù)據(jù)庫設(shè)計(jì)等,這些都屬于實(shí)踐應(yīng)用部分,而對(duì)于一些范式定義,兩段鎖協(xié)議并發(fā)控制等,這些就偏向于理論多一些。要想學(xué)好數(shù)據(jù)庫系統(tǒng),建議大家:
教材的話,強(qiáng)烈推薦《數(shù)據(jù)庫系統(tǒng)概念》(機(jī)械工業(yè)出版社),這本書涵蓋了數(shù)據(jù)庫系統(tǒng)的全套概念,知識(shí)體系清晰,是學(xué)習(xí)數(shù)據(jù)庫系統(tǒng)非常經(jīng)典的教材!不是參考書!
參考書的話,可以看一看《深入淺出 MySQL:數(shù)據(jù)庫開發(fā)、優(yōu)化與管理維護(hù)》,該書非常適合 MySQL 開發(fā)的從業(yè)者,完全可以作為 MySQL 學(xué)習(xí)的參考書,相比《數(shù)據(jù)庫系統(tǒng)概念》來說,該書更加傾向于基于 MySQL 技術(shù)的全套開發(fā),一共分為基礎(chǔ)篇、開發(fā)篇、優(yōu)化篇、管理維護(hù)篇和架構(gòu)篇。
編譯原理相比于前面介紹的專業(yè)課,地位顯得不那么重要了。編譯原理的重要性主要體現(xiàn)在:
編譯原理的重要前置課程就是形式語言與自動(dòng)機(jī),自動(dòng)機(jī)的思想在詞法分析當(dāng)中有著重要應(yīng)用,學(xué)習(xí)了這門課后,應(yīng)該就會(huì)發(fā)現(xiàn)許多場(chǎng)景下,自動(dòng)機(jī)算法的妙用了。
總的來說,這門課對(duì)于各位程序員的職業(yè)發(fā)展來說,相對(duì)不那么重要,但是從難度上來說,學(xué)習(xí)這門課可以對(duì)編程思想有一個(gè)較好的鞏固。學(xué)習(xí)資源的話,除了課堂上的幻燈片課件以外,還可以把《編譯原理》(機(jī)械工業(yè)出版社)這本書作為參考書,用以輔助自己學(xué)不懂的地方(大家口中的龍書,想要啃下來還是有一定難度的)。
通用課的部分我想分為兩大部分來介紹,主要就是數(shù)學(xué)和英語,一般在大一和大二兩學(xué)年就可以全部修完,大二大三逐漸接觸專業(yè)課。通用課作為許多高中生升入大學(xué)的第一門課,算是高中階段到本科階段的一個(gè)過渡,從職業(yè)生涯重要性上來說,遠(yuǎn)不及專業(yè)課重要,但是在本科階段的學(xué)習(xí)生活規(guī)劃中,有著非常重要的地位。由于通用課的課程多,學(xué)分重,占據(jù)了本科階段績(jī)點(diǎn)的主要部分,影響到學(xué)生在前兩年的專業(yè)排名,也影響到大三結(jié)束時(shí)的推免資格分配,也就是保研。而從升學(xué)角度來看,對(duì)于攻讀研究生和博士生的小伙伴來說,數(shù)學(xué)和英語這兩大基礎(chǔ)課,還是十分有用的。
微積分,即傳說中的高數(shù),成為了無數(shù)新大一心中的痛。但好在,大學(xué)的課程考核沒那么嚴(yán)格,期末想要拿高分,也不至于像高中那樣刷題刷的那么狠。微積分對(duì)于計(jì)算機(jī)專業(yè)學(xué)生的重要性,主要體現(xiàn)在計(jì)算機(jī)圖形學(xué)中的函數(shù)變換,機(jī)器學(xué)習(xí)中的梯度算法,信號(hào)處理等領(lǐng)域。
微積分的知識(shí)體系包括微分和積分兩部分,一般會(huì)先學(xué)微分,再學(xué)積分,也有的學(xué)校把高數(shù)分為兩個(gè)學(xué)期。微分就是高中的導(dǎo)數(shù)的升級(jí)版,對(duì)于大一萌新來說還算比較友好。積分恰好是微分的逆運(yùn)算,思想上對(duì)大一萌新來說比較新,一時(shí)半會(huì)可能接受不了。不過這門課所有的高校都有開設(shè),而且大部分的名校都有配套的網(wǎng)課,教材也都打磨的非常出色,結(jié)合網(wǎng)課和教材的“啃書”學(xué)習(xí)模式,這門課一定不會(huì)落下。
線性代數(shù)的思維模式就更加復(fù)雜了一些,它定義了一個(gè)全新的數(shù)學(xué)世界,所有的符號(hào)、定理都是全新的,唯一能嘗試的去理解的方式,大概就是用幾何的方式去理解線性代數(shù)了。由于線性代數(shù)和幾何學(xué)有著密不可分的關(guān)系,比如空間變換的理論支撐就是線性代數(shù),因此,網(wǎng)上有著各種“可視化學(xué)習(xí)線性代數(shù)”的學(xué)習(xí)資源,幫助理解線性代數(shù)的意義,有助于公式的記憶。
對(duì)于計(jì)算機(jī)專業(yè)的小伙伴來說,這門課可能是概率論更有用一點(diǎn),而非數(shù)理統(tǒng)計(jì)??赡苣承W(xué)校只開設(shè)概率論課程,也可能數(shù)理統(tǒng)計(jì)也教,但僅僅是皮毛。概率論的學(xué)習(xí)路線和微積分相似,就是一個(gè)個(gè)公式輔以實(shí)例,不像線性代數(shù)那么抽象,比較貼近生活。在現(xiàn)在的就業(yè)形勢(shì)下,概率論與數(shù)理統(tǒng)計(jì)專業(yè)的學(xué)生,應(yīng)該是數(shù)學(xué)專業(yè)最好就業(yè)的了,他們通常到崗位上會(huì)做一些數(shù)據(jù)分析的工作,因此,這門課程確實(shí)是數(shù)據(jù)分析的重要前置課程,概率論在機(jī)器學(xué)習(xí)中的重要性也就不言而喻了。
離散數(shù)學(xué)是計(jì)算機(jī)專業(yè)的專屬數(shù)學(xué),但實(shí)際上對(duì)于本科畢業(yè)找工作的小伙伴來說,離散數(shù)學(xué)還并沒有發(fā)揮它的巨大作用。離散數(shù)學(xué)的作用主要在在圖研究等領(lǐng)域,理論性極強(qiáng),需要讀研深造的小伙伴盡可能地扎實(shí)掌握。
英語算是大學(xué)里面比較靈活的一項(xiàng)技能了,有的人會(huì)說,“英語學(xué)的越好,對(duì)個(gè)人發(fā)展越有利”,此話說的沒錯(cuò),但是對(duì)于一些有著明確發(fā)展目標(biāo)的小伙伴,可能英語技能并不在他們的技能清單內(nèi)。接下來的這些話只針對(duì)計(jì)算機(jī)專業(yè)的小伙伴們哦。
英語課在大學(xué)本科一般只有前兩年開設(shè),小伙伴們可以記住,想用英語課來提升自己的英語水平的,可以打消這個(gè)念頭了。 英語水平的提高全靠自己平時(shí)的積累和練習(xí),以及有針對(duì)性的刷題。
英語的大學(xué)四六級(jí)一定要過。 這是必備技能,絕大部分就業(yè)崗位都要看四六級(jí)水平的,最起碼要通過的。四級(jí)比高中英語稍微難一些,一般的小伙伴可能會(huì)卡在六級(jí)上,六級(jí)需要針對(duì)性的訓(xùn)練一下,因?yàn)榇髮W(xué)期間能接觸英語的實(shí)在太少了,每學(xué)期一門英語課是不足以保持自己的英語水平的。對(duì)于一些來自于偏遠(yuǎn)地區(qū),高中英語基礎(chǔ)薄弱的,考四六級(jí)會(huì)更加吃力。建議考前集中訓(xùn)練一下歷年真題,輔以背一下高頻詞匯,四六級(jí)通過只需要 425 分,這個(gè)分?jǐn)?shù)線還是比較容易達(dá)到的。稍微好一點(diǎn)的小伙伴可能沖一下 500 分,要是能考到 600 分的話,那是非常不錯(cuò)的水平了,算是簡(jiǎn)歷上比較有亮點(diǎn)的一項(xiàng)。
英語的雅思托??荚囍幌抻谙胍鰢男』锇椋约皯?yīng)聘崗位對(duì)英語能力有特殊要求的。雅思托福考試裸考不容易通過,花錢去比較靠譜的校外補(bǔ)課班應(yīng)該是一個(gè)比較好的選擇。
對(duì)于計(jì)算機(jī)專業(yè)的小伙伴來說,英語能力還是比較重要的,雖然應(yīng)聘的時(shí)候不會(huì)因?yàn)闆]有雅思托福成績(jī)卡人,但是你起碼要能夠:
畢竟計(jì)算機(jī)語言就是字符語言,聽說讀寫中最起碼要滿足讀寫這兩項(xiàng)不過分吧。
1.感覺學(xué)校教的都聯(lián)系不到實(shí)際,我本科畢業(yè)真的能找到工作嗎?
就筆者所就讀的高校來說,我是相信它的培養(yǎng)方案是有能力培養(yǎng)出具有就業(yè)能力的本科畢業(yè)生的。我相信很多名校的培養(yǎng)方案也都不會(huì)差。如果你就讀的學(xué)校不是那么出色,并且質(zhì)疑自己學(xué)校的培養(yǎng)能力的話,建議你多到名校的網(wǎng)課上取取經(jīng)。如果你是就讀于國內(nèi)名校的話,請(qǐng)相信的自己專業(yè)的培養(yǎng)方案,下限不會(huì)低。
另外,如果你的學(xué)校比較差的話,大學(xué)期間一定要盡全力讓自己的簡(jiǎn)歷更好看,你可以出去實(shí)習(xí)、參加一些含金量比較高的比賽、跟著老師做一些項(xiàng)目。
2.學(xué)校里需要參加一些社團(tuán)、學(xué)生會(huì)之類的嗎?
筆者只參加過社團(tuán),并未參加過學(xué)生會(huì)。對(duì)于這個(gè)問題,我結(jié)合我所接觸的人來簡(jiǎn)單回答一下。針對(duì)不同的發(fā)展定位,可以選擇自己投入社團(tuán)、學(xué)生會(huì)的精力。比如,你是一個(gè)技術(shù)宅,那么我想你就算加入了社團(tuán)之類的團(tuán)體,也收獲不到自己想要的能力,其實(shí)就沒有參加的必要了。如果你是一個(gè)學(xué)生干部,或者擅長(zhǎng)和人打交道,也許畢業(yè)之后從事產(chǎn)品經(jīng)理之類的工作,那么在學(xué)生會(huì)的經(jīng)歷應(yīng)該是蠻鍛煉你的能力的。是否要選擇參加團(tuán)體活動(dòng),投入多少精力,完全取決你對(duì)自己的定位如何,請(qǐng)把你自己放到合適的環(huán)境下培養(yǎng),不必人云亦云。
3.在大學(xué)里一定要參加競(jìng)賽比賽嗎?
競(jìng)賽比賽對(duì)于學(xué)生的好處有,得獎(jiǎng)了的話可能會(huì)獲得保研加分、豐富個(gè)人簡(jiǎn)歷,在應(yīng)聘中拿到不錯(cuò)的印象分。保研加分具體涉及到的競(jìng)賽需要咨詢所在學(xué)院,并非所有競(jìng)賽獲獎(jiǎng)都能加分的。
那么競(jìng)賽比賽有沒有壞處呢?也會(huì)有一點(diǎn)吧,就是指那些能力并不算強(qiáng),但仍然把大量時(shí)間花在了打比賽這上面,這其實(shí)并不是壞處,這對(duì)個(gè)人能力仍有提高,壞處指的是因?yàn)榇蚋?jìng)賽耽誤了專業(yè)課的學(xué)習(xí)。這樣一來,基礎(chǔ)也沒扎實(shí),突出能力也沒訓(xùn)練出來,撿了芝麻丟了西瓜,就不好了。
總的來說,打競(jìng)賽利大于弊,不要低估的自己的能力而排斥參加競(jìng)賽,也不要高估自己的能力過分癡迷競(jìng)賽。
以上是我針對(duì)本科計(jì)算機(jī)專業(yè)各個(gè)課程的傾力解讀,如有不妥,請(qǐng)多加指正!
https://github.com/Snailclimb: https://github.com/Snailclimb
[2]https://github.com/Snailclimb/programmer-advancement : https://github.com/Snailclimb/programmer-advancement
[3]leetcode: https://leetcode-cn.com/
[4]《硬核的算法學(xué)習(xí)書籍+資源推薦》: docs/dataStructures-algorithms/算法學(xué)習(xí)資源推薦.md
[5]如何刷 Leetcode?: https://www.zhihu.com/question/31092580/answer/1534887374
[6]《圖解 HTTP》: https://book.douban.com/subject/25863515/
[7]《網(wǎng)絡(luò)是怎樣連接的》: https://book.douban.com/subject/26941639/
[8]https://snailclimb.gitee.io/javaguide/#/docs/operating-system/basis: https://snailclimb.gitee.io/javaguide/#/docs/operating-system/basis
聯(lián)系客服