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

沉默王二發表於2021-06-23

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

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

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

網路工程,聽起來還算是蠻高階大氣上檔次的,大家可以去百度百科或者維基百科看一下這個專業的解釋。我的理解是網路工程是將計算機以及其他裝置串聯完成網路通訊,以及智慧化監控的學科。主要的分支有:路由交換、網路安全、無線網路等等。

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

物聯網,也簡稱為 IoT,是近些年比較火的一個概念,是指將日常的物理物件連線到網際網路的過程——從醫療裝置,到可穿戴裝置,小到智慧家居,大到智慧城市。

先說說我家的情況吧,比較常用的智慧裝置有兩個,一個是掃地機器人,需要地面牆角比較規整一點才能比較順利地完成清潔工作;一個是小夜燈,人經過的時候就亮起來,過一會自己就滅了,但經常夜裡翻個身它就亮了,還有點“智障”。

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

大資料,也就是 Big Data,我瞭解到的適用於大資料的技術有:分散式檔案系統、分散式資料庫、雲端計算平臺、可擴充套件的儲存系統等。奧巴馬曾說“大資料”是未來的石油,可見其重要性。

大資料專業是典型的交叉學科,不僅涉及到計算機,還會涉及到數學和統計學,不僅對學校的學科實力有要求,對個人的硬性基本功也是有要求的。

軟體工程專業是以電腦科學為基礎的,更加強調軟體開發的工程性,包括軟體需求分析、軟體設計、軟體測試、軟體維護和軟體專案管理等。

電腦科學,也就是計科(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 站地址:

https://www.bilibili.com/video/BV19W411B7w1

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 個重要的“先決條件”:

  • 你最好先從一門程式語言開始,然後不斷縱向和橫向擴充套件;
  • 你最好先學計算機組成原理再學作業系統;
  • 你最好先學計算機網路和作業系統再學分散式系統;

限於 CSDN 外鏈的原因,學習資源我這裡沒法列全。

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

https://github.com/itwanger/LearnCS-ByYourself

你可以大致按照我列出的順序,藉助我推薦的教材和視訊課程,最好是兩者兼顧,然後花 100-200 個小時去學完每一個科目,然後在之後的程式生涯裡,不斷重溫這些精華,你會來感謝我的

要把這些內容全部學完,當然是需要花時間的,不可能一朝一夕就能完成,大學期間可能完全學不完,即便是工作幾年後仍然可能學不完,但相信我,你會在這條路上得到快樂,得到滿足的。

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

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

相關文章