卷王指南,大學計算機專業,面臨分專業,計科,軟工,大數據,物聯網,網絡工程,該選什麼?

同窗們好,我是王老師——二哥呀!(笑噴)前端

好巧!前幾天有同窗私信問過我這個問題:大學計算機專業,面臨分專業,計科,軟工,大數據,物聯網,網絡工程,該選什麼?再加上高考結束後填報志願,想必有不少同窗挺迷茫的。git

我就來(主觀地)一一分析下,從後往前。github

網絡工程,聽起來還算是蠻高端大氣上檔次的,你們能夠去百度百科或者維基百科看一下這個專業的解釋。個人理解是網絡工程是將計算機以及其餘設備串聯完成網絡通訊,以及智能化監控的學科。主要的分支有:路由交換、網絡安全、無線網絡等等。算法

我以前在的一個公司(十年前了),一百多號開發,但就兩三個網絡專業的人才,他們很重要,一旦機房的網絡出問題,都得靠他們解決。嗯,說句「心懷鬼胎」的話,日常咱們最喜歡的一件事就是網絡出問題,或者公司斷電,嗯,天賜的「摸魚好時機」。固然了,這種機會很少,這兩三位同事老是能在最短的時間內把問題解決掉。數據庫

物聯網,也簡稱爲 IoT,是近些年比較火的一個概念,是指將平常的物理對象鏈接到互聯網的過程——從醫療設備,到可穿戴設備,小到智慧家居,大到智慧城市。編程

先說說我家的狀況吧,比較經常使用的智能設備有兩個,一個是掃地機器人,須要地面牆角比較規整一點才能比較順利地完成清潔工做;一個是小夜燈,人通過的時候就亮起來,過一會本身就滅了,但常常夜裏翻個身它就亮了,還有點「智障」。後端

相對來講,物聯網還有很大的發展空間,好比智慧交通,再好比智慧農業,具體點的例子就是經過溼度傳感器來自動觸發灌溉等。安全

大數據,也就是 Big Data,我瞭解到的適用於大數據的技術有:分佈式文件系統、分佈式數據庫、雲計算平臺、可擴展的存儲系統等。奧巴馬曾說「大數據」是將來的石油,可見其重要性。markdown

大數據專業是典型的交叉學科,不只涉及到計算機,還會涉及到數學和統計學,不只對學校的學科實力有要求,對我的的硬性基本功也是有要求的。網絡

軟件工程專業是以計算機科學爲基礎的,更增強調軟件開發的工程性,包括軟件需求分析、軟件設計、軟件測試、軟件維護和軟件項目管理等。

計算機科學,也就是計科(Computer Science,簡稱 CS),不只會研究計算機的硬件,也會研究計算機的軟件,更具體的主題包括編程語言、程序設計等。

先插個樓,開局一張圖:計科最佳指南。

我以前讀過鄒欣大佬(目前是 CSDN 副總裁)的一本書——《構建之法》,第一章就對軟件工程和計算機科學的關係作了解釋,它們開設的課程很類似,但本質上它倆是徹底不一樣的。

計算機科學這一學術領域能夠分爲:計算機理論、信息和編碼理論、算法和數據結構、形式化方法、編程語言等

偏實踐的領域:計算機體系結構(或者叫計算機組成原理)、操做系統、計算機網絡、安全性和密碼學、人工智能、計算機圖形學、人機交互、嵌入式系統和軟件工程

按照武俠小說來說,計算機科學更像是九陽神功、乾坤大挪移這種頂級內功;而軟件工程更像是七傷拳、龍抓手、太極拳法等武功招式。在內功渾厚的基礎上,武功招式就能夠打出最大的傷害值。

另外還有一種比較功利性的說法:若是打算本科畢業後就參加工做,可選軟件工程,若是打算考研進修,可選計算機科學

不過,在我看來,不管選擇計算機科學仍是軟件工程,大部分同窗最終的選擇都是作一名軟件工程師。(落腳點仍是很實在,增刪改查嘛,hhh)

固然了,軟件工程師能夠分爲兩種:一種是充分理解了計算機科學,從而有能力應對充滿挑戰的創造性工做;另外一種僅僅憑着對一些高級工具或者框架的熟悉而勉強應付。

第一種工程師能隨着時間的流逝,不停地成長,最終成爲技術大牛;而第二種工程師每每浮於表面,只學習某些特定的工具和技術,而不研究底層的原理,慢慢就會停滯不前。

我我的的總結就是,軟工的內核仍是計科,計科學得好,軟工、大數據、物聯網、網絡工程都是能夠自如應對的

接下來就很重要了!怎麼才能好學計科呢?怎麼才能成爲別人眼中的大牛呢?

先說理論。

若是你要學習物理,我推薦你順着物理的發展史學習,先學習牛頓的經典物理,再學習熱力學、電磁學,而後學習相對論、量子力學這些完全推翻經典物理的,最後學習電動力學這種硬核的。

整個學習過程,是自底向上的。學計科也要這樣嗎?

先學習電路,而後學習馮諾依曼結構,造一臺計算機?接着再學習如何用匯編寫個 mini os?接着學習如何寫一個簡易版的編譯器?最後再學習高級編程語言,好比說 Java、Python、C++?

顯然這樣是行不通的!計算機科學的學習最好是自頂向下

什麼是頂?在我看來,就是一門高級的編程語言,好比說 Java、C++ 或者 Python。我我的從事 Java 後端開發的時間比較久,因此仍是拿老本行來講。

當你學習到 Java 併發編程中的「原子性」、「同步」、「異步」、「進程」、「內存分配」這些概念的時候,你天然而然會產生不少疑問,而後就會去學習操做系統,學習計算機組成原理,而後你的一系列問題就會逐漸被解決。

當你在學習 Java 的時候遇到性能問題時,你就會去研究,啊,原來 Java 是一門解釋型的編程語言,而 C 語言是一門編譯型的編程語言,因此 Unix/Linux 這種操做系統要用 C 語言來實現,由於要最大限度的壓榨硬件的瓶頸。

固然了,Java 爲了提高自身的性能也是費盡心思,好比說即時編譯(JIT,Just-In-Time)經過在運行時將字節碼編譯爲本機機器代碼來提升性能;好比說垃圾回收機制的升級,從 GC 到 ZGC,GC 的痛點在於垃圾回收期間,全部的線程都會中止活動,等待 STW(Stop The World)的結束,而 ZGC 在標記、轉移和重定位階段幾乎都是併發的,大大縮短了停頓的時間。

跑偏了,繼續來講。

當你用 Java 實現某個業務需求時,發現人家的算法實現比你快得多,你天然會好奇,爲何會這樣?而後你發現人家用的數據結構和你的不一樣,接着你就會去學習數據結構,再瞭解一些高效的算法,好比動態規劃等。

你看,從學 Java 的語法開始,你一步步學到了操做系統、計算機組成原理、數據結構與算法。

跟着需求去學習,才能真正學好計算機科學

我也會給你推薦《CSAPP》這本黑皮書,畢竟永遠的神,但若是你沒有編程基礎就去啃,你可能很快就會被勸退的;反而,一開始,你讀一讀我寫的《教妹學Java》,或者去 B 站上看尚硅谷或者動力節點這些培訓機構的 Java 視頻課,沒準你會越學越以爲有信心——這麼簡單的東西,我這麼聰明,還能學不會?你會有這種自信的錯覺的!

反而一開始去啃 CSAPP,你會感受,老天!我特麼是個廢材啊,我學的什麼鬼玩意,這居然看不懂,學不會?

你可能要問,編程語言有不少種,Java、Python、C/C++、Go、JavaScript 等等,選哪個呢?

選擇 Java 吧,常聽人說「人生苦短,我用 Python」;選擇 Python 吧,常聽人說「Go 是 Google 的親兒子,發展勢頭正勁」;選擇 Go 吧,常聽人說「前端(JavaScript 必學)更容易學習一些」;選擇 JavaScript 吧,常聽人說「C/C++ 具有現代程序設計的基礎要求,是不少編程語言的基礎。」

而後就又麻了!

我是從大一就開始學習的 Java,當時沒有選擇,由於不知道還有其餘編程語言(噓),學校讓學 Java 就學了 Java。只能說很是的幸運,選對了。

那麼同窗們也不須要糾結,前端、Java、Python、C++/C,到底怎麼選?學校安排啥就學啥,若是學校沒安排,那麼選 Java 多是最樸實無華的選擇,由於綜合(就業崗位和薪資)考慮的話,Java 是其餘編程語言沒法替代的。

固然了,你也能夠選擇 C 語言,這也是一個沒法反駁的選擇,C 語言是其餘不少編程語言的基石,學了這個,再學其餘任何一門編程語言都是很好的基礎,只不過,指針這塊確實使人頭痛!

選擇一門編程語言後,踏踏實實地去學習,就會連根拔起不少其餘方面的內容,好比說數據庫、數據結構與算法、計算機組成原理、操做系統、計算機網絡等等。

  • 那 C 語言該怎麼學呢?
  • 那 Java 該怎麼學呢?
  • 那數據庫該怎麼學呢?
  • 那數據結構與算法該怎麼學呢?
  • 那計算機組成原理該怎麼學呢?
  • 那操做系統該怎麼學呢?
  • 那計算機網絡該怎麼學呢?

一個一個來解決。

C 語言:

推薦翁愷教授的《C 語言程序設計》,B 站地址:

www.bilibili.com/video/BV19W…

Java:

你能夠先看看我整理的這份 GitHub 上星標 115k+ 的 Java 教程,裏面涵蓋了 Java 全部的知識點,包括 Java 語法、Java 集合框架、Java IO、Java 併發編程和 Java 虛擬機,內容很少,只講重點

GitHub 星標 115k+的 Java 教程,超級硬核!

數據庫:

  • 《SQL 必知必會》
  • 《高性能 MySQL》
  • 《MySQL技術內幕-InnoDB存儲引擎》
  • 《Redis 深度歷險:核心原理與應用實踐》

數據結構與算法:

計算機組成原理:

  • 《計算機是如何跑起來的》
  • 《CSAPP》,也就是《深刻理解計算機系統》

操做系統:

  • 龍書《操做系統概念》
  • 《現代操做系統》

計算機網絡:

  • 網絡是怎樣鏈接的
  • 圖解 HTTP
  • 圖解TCP/IP
  • TCP/IP詳解 卷1:協議

你可能要問,必定要按照這個次序嗎?

答案是能夠不按照,但我這裏有 3 個重要的「先決條件」:

  • 你最好先從一門編程語言開始,而後不斷縱向和橫向擴展;
  • 你最好先學計算機組成原理再學操做系統;
  • 你最好先學計算機網絡和操做系統再學分佈式系統;

限於篇幅的緣由,學習資源我這裏無法列全。

但考慮到同窗們的訴求,我上週末花了兩天的時間,整理了一份 CS 自學指南,裏面囊括了全部我認爲值得推薦給你們的學習資料(有書、有視頻、有公開課、有在線文檔),這些學習資料不用懷疑,我都看過,雖然有些沒有看完,已經在 GitHub 上開源了

github.com/itwanger/Le…

你能夠大體按照我列出的順序,藉助我推薦的教材和視頻課程,最好是二者兼顧,而後花 100-200 個小時去學完每個科目,而後在以後的程序生涯裏,不斷重溫這些精華,你會來感謝個人

要把這些內容所有學完,固然是須要花時間的,不可能一朝一夕就能完成,大學期間可能徹底學不完,即使是工做幾年後仍然可能學不完,但相信我,你會在這條路上獲得快樂,獲得知足的。

還有什麼比學習更重要的事情呢?

若是有,那就是給二哥點個贊,來個三連了!

相關文章
相關標籤/搜索