同窗們好,我是王老師——二哥呀!(笑噴)前端
好巧!前幾天有同窗私信問過我這個問題:大學計算機專業,面臨分專業,計科,軟工,大數據,物聯網,網絡工程,該選什麼?再加上高考結束後填報志願,想必有不少同窗挺迷茫的。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 語言:
推薦翁愷教授的《C 語言程序設計》,B 站地址:
Java:
你能夠先看看我整理的這份 GitHub 上星標 115k+ 的 Java 教程,裏面涵蓋了 Java 全部的知識點,包括 Java 語法、Java 集合框架、Java IO、Java 併發編程和 Java 虛擬機,內容很少,只講重點。
GitHub 星標 115k+的 Java 教程,超級硬核!
數據庫:
數據結構與算法:
計算機組成原理:
操做系統:
計算機網絡:
你可能要問,必定要按照這個次序嗎?
答案是能夠不按照,但我這裏有 3 個重要的「先決條件」:
限於篇幅的緣由,學習資源我這裏無法列全。
但考慮到同窗們的訴求,我上週末花了兩天的時間,整理了一份 CS 自學指南,裏面囊括了全部我認爲值得推薦給你們的學習資料(有書、有視頻、有公開課、有在線文檔),這些學習資料不用懷疑,我都看過,雖然有些沒有看完,已經在 GitHub 上開源了。
你能夠大體按照我列出的順序,藉助我推薦的教材和視頻課程,最好是二者兼顧,而後花 100-200 個小時去學完每個科目,而後在以後的程序生涯裏,不斷重溫這些精華,你會來感謝個人!
要把這些內容所有學完,固然是須要花時間的,不可能一朝一夕就能完成,大學期間可能徹底學不完,即使是工做幾年後仍然可能學不完,但相信我,你會在這條路上獲得快樂,獲得知足的。
還有什麼比學習更重要的事情呢?
若是有,那就是給二哥點個贊,來個三連了!