大家好,我是程式員吳師兄,一個堅持在 CSDN 日更原創的程式員,
今天想和大家聊一聊為什么有人勸別選計算機專業?
和大家說一句掏心窩的話:直到 2021 年,計算機專業依舊是寒門改變命運的一個最佳選擇之一,要不是怕被噴,我都想把之一去掉,因為想了半天,我實在找不到其它與之匹配的選擇,,
之所以會出現有人勸退計算機專業,我琢磨了一下,可能有以下幾個原因:
1、本身對編程無感,但聽說計算機專業高薪,所以人云亦云的進來,后來發現這錢沒有想象中那么好掙,996 是常態,于是發出吶喊:別選計算機!
2、家里有礦,背景好,進可玩玩金融,退可當個包租公,瞧不起敲臭代碼的程式員,于是居高臨下鄙視到:別選計算機,
3、身邊有程式員,對程式員存在誤解,認為程式員都是穿格子衫黑眼圈禿頭的形象,選了計算機專業最侄訓變成單身狗,出于好心,提醒別人:別選計算機專業,
4、稀里糊涂的參加了培訓班,一出來發現找不到作業,浪費了大半年時間和上萬元人民幣,怒斥道:RNM,退錢,別選計算機專業!
5、對計算機專業持悲觀態度,認為計算機現在已經太火了,火過頭了,比白酒還火,各行各業都想轉計算機,人員早就飽和,現在進就等著失業吧,
看完這些原因,可以得出一個很明顯的結論:計算機專業并不是適合每一個人,勸進勸退都可以,
計算機專業不適合那些怕苦的人,不適合那些不缺錢的人,不適合那些不熱愛技術的人,
計算機專業最適合的群體是那些熱愛計算機技術同時又想高薪的同學,想想一畢業就有可能找到月薪 20k 甚至 30k 的作業,而同齡人在其它非金融行業才五六千起步,寒門逆襲的故事正在書寫,
并且,計算機專業畢業去找作業,那些互聯網大廠并不像招其他崗位的人一樣,十分看重學歷或者看重大學成績,一次表現優異的秋招,足以,
說來說去,對于想改變命運的寒門學子來說,我是相當勸進學計算機的,當然,很有可能你會說:我也想選計算機專業,但我怕自己不熱愛技術,
關于這個問題,我建議在一開始的時候可以去看一個視頻,叫做《計算機科學速成課》,這套課程是 Crash Course 旗下的計算機科學相關的視頻,早期發布在 Youtube 上,整個系列課程高達 12 億的播放量,現在你可以在 B 站上免費觀看,有漢化有彈幕,
之所以建議看這個視頻,是因為這個系列視頻總時長 10 個小時,一共 40 集,基本上每集控制在 10 分鐘左右,只要不到 10 小時就可以粗略了解計算機科學這門學科,如果你是一個門外漢,相信我,通過這個短短的 10 個小時足以幫你打開計算機的大門,
Crash Course 的這套計算機科學視頻一共 40 集,基本上每集控制在 10 分鐘左右,所以,只要不到 10 小時就可以粗略了解計算機科學這門學科,如果你是一個門外漢,相信我,通過這個短短的 10 個小時足以幫你打開計算機的大門,

你可能會不禁疑惑,十幾分鐘能學到啥?而事實上,Crash Course 的視頻資訊量很大,每一秒的時間都是精華,視頻里面不僅有影像、視頻資料、圖表等,更有老師面授,老師的語速也是很快的,如果跟不上,建議 0.75 的速度進行觀看,



如果你是小白,想了解一門學科,不妨通過該系列視頻作為切入點;如果你是某學科學生,可以用該視頻梳理總結課程的框架結構;如果你想拓寬知識,這個系列視頻作為下飯菜也是十分合適的,
Crash Course 的 Youtube 官方頻道地址如下:
https://www.youtube.com/user/crashcourse
B 站頻道地址如下:
https://www.bilibili.com/video/av21376839
書籍搭配使用:
圖解作業系統、網路、計算機組成 PDF 下載!
如果你現在是計算機專業的學生,想要投入程式員的行業,拿高薪,那么強烈建議你學好以下幾門計算機基礎課程:
1、計算機組成原理
2、計算機作業系統
3、計算機編譯原理
4、資料結構與演算法
5、計算機網路
一方面這些計算機基礎內容是面試必備,另外一方面你想要在程式員的領域學的更深入一些,這些計算機基礎內容完全是必須的,
計算機基礎知識對程式員來說到底有多重要?
一、計算機組成原理
來源于深入淺出計算機組成原理
從上面這張圖可以看出來,整個計算機組成原理,就是圍繞著計算機是如何組織運作展開的,
我們依舊來舉例子:)
每個程式員應該都知道 Ascii碼,GB2312,GBK,Utf8,Unicode 等編碼格式,如果你沒接觸過,那總出現過檔案壓縮后解壓亂碼的情況吧?
了解了這些編碼的存盤格式,你才會明白為什么會有中文亂碼問題,靠,我在寫這個回答的時候,我的后端同事發給我的日志就出現了中文亂碼,,,,
再來個例子,
比如 LRU 快取演算法 的例子,它的設計也是借鑒計算機組成原理的內容的,
看影片輕松理解「鏈表」實作「LRU快取淘汰演算法」
?
在計算機的世界里,空間換時間,時間換空間這個概念在復雜的設計中時常出現,
如果你想更詳細的了解 計算機組成原理 的知識,推薦一本書:《計算機組成:結構化方法》,
二、作業系統
先來看一下作業系統都有哪些內容,

現代計算機系統由一個或多個處理器、主存、列印機、鍵盤、滑鼠、顯示幕、網路介面以及各種輸入/輸出設備構成,
說實話,程式員不可能會掌握所有計算機系統的細節,所以在硬體的基礎之上,計算機安裝了一層軟體,這層軟體能夠通過回應用戶輸入的指令達到控制硬體的效果,從而滿足用戶需求,這種軟體稱之為作業系統,它的任務就是為用戶程式提供一個更好、更簡單、更清晰的計算機模型,
我們依舊通過一個例子來解釋作業系統在作業中的幫助,
比如說,做一個網路代理軟體,不過是從 socket 上收一個包然后轉發給另一個 socket 而已,這好像和作業系統沒多大關系吧?
但真做了,你會發現,用一個執行緒處理網路IO,只要寫對了,那么哪怕系統壓力很大,只要CPU頂得住,就可以保證引入的延遲總是在幾個毫秒之內;但如果用了多執行緒分別處理收/發,那么只要網路壓力稍大,引入的延遲就會增加,很快額外延遲就可能突破幾十個毫秒(這實際上已經完全不能用了),
想搞明白這是為什么,對作業系統調度原理、時間片等概念沒有足夠深刻的理解,是不可能的,
尤其是,當你突然遇到類似“系統壓力一大網路延遲急劇升高”的 bug 時,如果對作業系統沒有深入理解,你連準確描述都做不到,連查資料、求幫助都不知道該往哪個方向努力,更不用說 debug了,
換句話說,你可以不造輪子,但是你要知道這輪子是怎么造的,否則你連問問題都不知道如何去描述,
再降維一點,你總要掌握如何安裝 Windows 系統吧,否則妹子讓你去她房間里修電腦你都只能拒絕掉!

三、編譯原理
眾所周知,編譯技術是計算機科學史上的明珠之一,
對于編譯原理,很多程式員的困惑就是:我也不會去設計一門新的編程語言,有必要學習編譯原理嗎?學了有什么用呢?
實際上,編譯原理不是用于炫耀的屠龍技,程式員在作業中經常會碰到需要編譯技術的場景,比如:
- 撰寫界面模板引擎;
- 為專案撰寫各種各樣的 DSL;
- 深度理解甚至開發出 Spring、Hibernate、阿里巴巴 Druid 這樣的工具,
- 除此之外,決議用戶輸入,防止代碼注入,為前端工程師提供像 React 那樣的 DSL,像 TypeScript 那樣把一門語言翻譯成另一門語言,像 CMake 和 Maven 那樣通過組態檔來靈活作業,運維工程師分析日志檔案等等高級別的需求,都會用到編譯技術,
當然,說實話,編譯原理并非隨隨便便就能入門的!
換言之,需要準備一些基礎知識在學習,
編譯原理的學習和實踐通常基于對計算機編譯程序、計算機基本作業原理、甚至一定的數學知識有一定積累,這些知識分別分布并應用在了編譯原理的不同階段,
沒有這些基本知識的積累,很快就會在某個階段由于功底不夠而無法再繼續后面的學習,
所以不要一開始就去啃編譯原理,
四、資料結構和演算法
正如 N.Wirth 教授所說的: 資料結構+ 演算法=程式,
遇到一個實際問題,充分利用所學的資料結構,將資料及其之間的關系有效地存盤在計算機中,然后選擇合適的演算法策略,并用程式高效實作,
這句話可能有點抽象,我舉個例子給你們解釋一下,
在作業程序中,我們多多少少都接觸過 OAuth2 ,在使用 OAuth2 授權的時候,通常應用會彈出一個類似這樣的資訊:
-
獲取用戶基本資訊介面
-
獲取用戶串列介面
-
用戶分組管理介面
,,,

思考一下,如果讓你設計資料庫,應該怎么設計資訊存盤權限?
如何你熟練掌握了各種資料結構的特點的話,那自然而然想到使用 bitmap 來存盤權限,
我們把權限劃分成最小粒度之后,每一個 bit 都它的含義, 例如我們把權限劃分為以下幾種:
- 獲取你的頭像、性別、昵稱等基本用戶資訊
- 以你的身份發布微博
- 獲取你的好友串列
- 獲取你的朋友圈資訊
- 每勾選一個選項,就代表著這個權限被授權,為了保證可擴展性,我們使用一個 uint64 來保存這些 bit ,也就是說,我們一共可以劃分 64 種細分權限,然后對這些權限進行組合,
例如,第一個 bit 如果設定了,那么就代表可以獲取你的昵稱、頭像、地區、性別等基本用戶資訊, 第二個 bit 如果設定了,就可以用你的身份發狀態,
資料結構的實際作用還有挺多,感興趣的可以搜索以下知識點:
- 二叉樹搜索用于中斷處理、登記快取查找等
- 哈希表,用于實作索引節點、檔案系統完整性檢查等
- 紅黑樹用于調度、虛擬記憶體管理、跟蹤檔案描述符和目錄條目等
- Radix樹,用于記憶體管理、NFS相關查找和網路相關的功能
…
上面這些例子是關于資料結構的,我再舉一個演算法的例子,如果有幫助,不妨點個贊收藏一下,好的內容值得肯定,
同樣的也來思考一個問題:計算機的快取容量無論再大,快取滿了還是要洗掉一些內容,給新內容騰位置,
那么洗掉哪些內容呢?我們肯定希望刪掉哪些沒什么用的快取,而把有用的資料繼續留在快取里,方便之后繼續使用,那么,什么樣的資料,我們判定為「有用的」的資料呢?
這個時候采取的策略就是 LRU 快取淘汰演算法,
LRU 的全稱是 Least Recently Used,也就是說我們認為最近使用過的資料應該是是「有用的」,很久都沒用過的資料應該是無用的,記憶體滿了就優先刪那些很久沒用過的資料,
關于資料結構和演算法的學習,大廠在面試環節最喜歡考察的就是 LeetCode 的了,如果你有刷題的想法,那么推薦你看看這份演算法刷題筆記,不是讀者朋友拿到了理想 Offer:
BAT大佬寫的Leetcode刷題筆記,看完秒殺80%的演算法題!
?
覺得不錯的話,記得點個贊喲,祝無論是自學編程還是計算機科班的學生,都能打好計算機基礎,成為一名優秀的程式員,
也可以關注下我程式員吳師兄,一個致力于把每道演算法題都用影片的形式講清楚的七年老程式員,持續分享計算機相關內容的干貨,希望能幫助每一個人在編程這條路上走的更舒坦,
作者簡介
作者:大家好,我是程式員吳師兄,在 GitHub 上開源了一個專案 LeetCodeAnimation,目前有 60k star,通過影片的形式講解演算法,已經幫助成千上萬的程式員入門演算法了,歡迎關注公眾號「五分鐘學演算法」,和我們一起學習演算法,
點擊了解程式員吳師兄
轉載說明:未獲得授權,禁止轉載
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287388.html
標籤:其他
上一篇:【每天學一點系列~】一文帶你徹底弄懂結構體大小和記憶體對齊
下一篇:出現ST link communication error 和 the content of stlink is corrupt的解決方法。
