時間如白駒過隙,我竟然已經是一名擁有 13 年編程經驗的老油條了!

有些自豪,因為自己從大一就開始學習的 Java 語言依然堅挺,幾乎是編程語言中的霸主了;但也有些遺憾,大學的時候沒有把這些計算機基礎課程學好,有些甚至沒有學,導致作業后有很長一段時間蠻吃力的,全靠近些年“廢寢忘食”的補課,才有所好轉,
希望學弟學妹們,能從我這些經驗中獲得一些啟發,少走一些彎路,
1)計算機編程的基石——資料結構與演算法
2)計算機編程語言的母胎——C語言
3)計算機組成原理
4)計算機作業系統
5)計算機網路
一、資料結構與演算法
無論什么時候,程式=資料結構+演算法這種說法都是成立的,
常用的資料結構有:
- 堆疊:堆疊是一種非常有用的資料結構,它就像一摞盤子,第一個放在最下面,第二個放在第一個上面,第三個放在第二個上面,最后一個放在最上面,堆疊遵循后進先出的原則,也就是“Last In First Out”(簡稱 LIFO)——最后的一個進的,最先出去,
- 佇列:只允許在隊尾添加資料,隊首移除資料,佇列在 Java 中的出現頻率非常高,有各種不同的類來滿足不同的場景需求,像優先級佇列 PriorityQueue、延時佇列 DelayQueue 等等,佇列遵循的是First In First Out,縮寫為FIFO,也就是先進先出,第一個進入佇列的第一個先出來,
- 陣列:陣列這種資料結構最大的好處,就是可以根據下標(或者叫索引)進行操作,插入的時候可以根據下標直接插入到具體的位置,但與此同時,后面的元素就需要全部向后移動,需要移動的資料越多,就越累,
- 鏈表:鏈表在物理存盤空間是不連續的,但每個節點要么知道它的下一個節點是誰,要么知道它的上一個節點是誰,仿佛就像我們之間隔著千山萬水,卻心有靈犀一點鏈,像 LinkedList 就是最典型的鏈表結構,通過參考相互鏈接,
- 樹:樹是一種典型的非線性結構,它是由 n(n>0)個有限節點組成的一個具有層次關系的集合,之所以叫“樹”,是因為這種資料結構看起來就像是一個倒掛的樹,只不過根在上,葉在下,
- 哈希表:也叫散串列,是一種可以通過關鍵碼值(key-value)直接訪問的資料結構,它最大的特點就是可以快速實作查找、插入和洗掉,
- 圖:圖是一種復雜的非線性結構,由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G 表示一個圖,V 是圖 G 中頂點的集合,E 是圖 G 中邊的集合,
常用的演算法有:
- 查找
- 插入
- 洗掉
- 更新
- 排序
演算法研究的目的是為了更有效的處理資料,提高資料運算的效率,資料運算是定義在資料結構上的,各大公司的筆試基本都考這個,《劍指 Offer》上的所有題目如果能背下來,LeetCode 上的題如果能刷個一百到三百道,ACM 競賽如果能拿到一些獎項,在找作業的時候會非常有優勢,基本上大廠小廠的 offer 可能會拿到手軟,
刷完 300 道 LeetCode 題后,我強到可以和面試官硬剛!純正 Java 版
?
二、C語言
C語言是一門古老而常青的編程語言,具備現代程式設計的基礎要求,它的語法是很多編程語言的基礎,比如說 Java,C語言和 Java 常年霸占編程語言的前兩名,都非常強,C語言學得好,對后續作業系統、編譯原理,以及 Java 的學習都是很好的基石,
這里給大家推薦一下浙大教授翁愷教授的 C語言程式設計,可以到 B 站上看,有彈幕,學起來很愉快,
https://www.bilibili.com/video/BV19W411B7w1
初學編程語言的階段,強烈建議大家把視頻上的代碼都敲一遍,由于不像作業后,有大量的專案可以實踐,所以不能得到及時的反饋,刻意練習就顯得特別的重要,另外,一定要分門別類保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,會很有用,積累得多了,可能就變成了自己的工具庫,
三、計算機組成原理
我前段時間看了一本書,名叫《計算機是如何跑起來的》,雖然在豆瓣上的評分不是特別高,但很適合作為一本了解計算機組成原理的入門書,

它讓我明白,計算機的組成是很“簡單”的:
- 輸入、運算、輸出是硬體的基礎
- 軟體是資料和指令的集合
- 計算機和人的思考方式不同,對計算機來說,什么都是數字
抽象到底層,確實是這么回事,計算機是由 CPU、記憶體、顯示幕這些設備組成的硬體,但我們大學畢業后,往往從事的是軟體方面的開發作業,那怎樣才能在硬體和軟體之間自由穿梭呢?答案就是學好計算機組成原理,弄明白了計算機的組成原理,也就對整個軟體開發有了一個系統的認知,不論是計算機的硬體原理,還是軟體架構,都能很好的駕馭,隨之而來的,我們的職業發展機會也就更多了,計算機組成原理這門課完全可以用一個詞來概括,就是“抽象”,在我看來這也是整個計算機設計中所蘊含的的靈魂,
四、計算機作業系統
為什么要學習作業系統呢?
第一,面試要考;
第二,無論學習哪門子編程語言,比如說 Java、C/C++,都需要和作業系統打交道,像 Java 中的多執行緒技術,其實是由作業系統來負責行程和執行緒管理的;
第三,學習作業系統,還能學到記憶體分配方面的知識,
既然說到計算機作業系統,這里很有必要給大家推薦一門計算機科學速成課,在 B 站上也有,它講的內容非常適合所有計算機專業的學生過一遍,如果學弟學妹們還沒有看過這門課,記得一定要刷一遍!我先把目錄列一下:
- 計算機早期歷史
- 電子計算機
- 布爾邏輯
- 二進制
- 算術邏輯單元
- 暫存器 & 記憶體
- 中央處理器
- 指令和程式
- 高級 CPU 設計
- 早期的編程方式
- 編程語言發展史
- 編程原理
- 演算法入門
- 資料結構
- 阿蘭圖靈(我最喜歡的一集)
- 軟體工程
- 集成電路 & 摩爾定律
- 作業系統
- 記憶體 & 儲存介質
- 檔案系統
- 壓縮
- 命令列界面
- 螢屏 & 2D 圖形顯示
- 個人計算機革命
- 圖形用戶界面
- 3D 圖形
- 計算機網路
- 互聯網
- 萬維網
- 計算機安全
- 黑客 & 攻擊
- 加密
- 機器學習 & 人工智能
- 計算機視覺
- 自然語言處理
- 機器人
- 計算機心理學
- 天網 & 計算機的未來
全部都是計算機專業需要掌握的基礎知識,至少是應該了解的知識點,視頻的制作非常精良,我相信大家看完后一定會大有所獲,

英文中字版的,觀看起來毫無壓力,我自己每天會刷一集,像二進制這一集,以前經常被二進制搞得暈頭轉向,刷了這集視頻后,明顯感覺對二進制沒那么生疏了,仿佛一個陌生人坐在對面,喝了一杯酒后,就成了老熟人,
https://www.bilibili.com/video/av21376839
?
我看彈幕有人說,“第一次用 B 站看這么正經的東西,”好他喵的真實呀!我也是,
然后是兩本書,《深入理解計算機系統》和《鳥哥的Linux私房菜 基礎學習》,


《深入理解計算機系統》,按理說,這本書的名字應該叫《計算機系統導論》,有 C語言、資料結構的知識就可以學這本書了,想在畢業后去大廠的學弟學妹值得花時間去三刷一下這本書,注意是三刷,第一刷大致了解,第二刷精度,第三刷溫習,可以說得上是程式員了解計算機系統的最佳書籍了,可以去 CSAPP 課程官網找 Lab 配合刷起來,
《鳥哥的Linux私房菜 基礎學習》,這是一本 Linux 方面的暢銷書了,全面詳細地介紹了 Linux 作業系統,如果要學習 Linux 的話,首選,生產環境下,幾乎所有的服務都是在 Linux 環境或者類 Linux 環境下運行的,像 Linux 的基本命令:top、cp、mv、rm 等等命令都是必須得熟練到記憶到手指上的,
五、計算機網路
當今這個時代,沒有網路簡直無法生存,哪怕是在電梯里的一分鐘,我都受不了那種手機沒有網路的狀態,我們所學的編程知識,如果脫離了網路,將變得毫無意義,因為沒有哪個編程語言是要在單機環境下運行的,
計算機網路課怎么學習,給大家推薦四本書,一門公開課,
《網路是怎樣連接的》,這本書從在瀏覽器中輸入網址開始,一路追蹤到顯示出網頁內容為止的整個程序,以圖配文,講解了網路的全貌,并重點介紹了網路設備和軟體是如何作業的,

《TCP/IP 詳解》,這是一本完整而詳細的 TCP/IP 協議指南,基本上做通信的是人手一本,對于大多數程式員來說,了解這個 TCP/IP 對面試和編程也有很大的幫助,

《圖解 HTTP》,HTTP協議是互聯網的基石,學完后可以嘗試實作一個屬于自己的 HTTP 服務器了,

《計算機網路-自頂向下方法》,算是一本經典的大學教材了,

關于計算機網路這塊,可以配合 B 站上的《計算機網路微課堂》一起來學習,
https://www.bilibili.com/video/BV1c4411d7jb
記住一點,我們學的是計算機科學,不是編程語言,不管你的主力編程語言是 Java、C++、Python,還是 Go,一定不能只停留在編程語言本身,像資料結構與演算法、作業系統、計算機組成原理、計算機網路等方面的基礎一定要打好!
參加作業后,編程語言是會根據公司的需求進行切換的, 所以只有把我推薦的這五門課程的基礎打牢,切換到任何一門編程語言你都是可以勝任的,
最后,多 BB 幾句,希望能給學弟學妹們一些參考,
無論什么時候,一定要找到學習的目標,以及學習的套路,找不到的話,就只能事倍功半,付出了很多努力,卻遲遲得不到最好的回報,學習的時候一定要把自己當成一臺計算機,既有輸入,也要有輸出,只輸入不輸出會堵塞,只輸入不輸出會枯竭,
這五門課程有些大學應該都會講到,那么恭喜你,在這樣的學校,你很幸運;如果哪一門沒有,記得一定要在課余的時間補上,
多看資訊密度大、質量高的學習資料,像大學圖書館那些《21 天學會 XXX》的書就不要去浪費時間了,可以把精力花費到我推薦的這些課程上,
多交流,多思考,刻意練習,像演算法,基本上面試是必考的專案,不要產生厭惡的情緒,該刷還是要刷!你不刷,崗位可能就給別人了,推薦大家到 LeetCode 上刷題,如果覺得自己沒有解題思路的話,可以看看下面這份刷題攻略,
刷完 300 道 LeetCode 題后,我強到可以和面試官硬剛!純正 Java 版
最后,我再強調一下,一定要動手敲代碼,做筆記,把自己沒有理解的知識點總結下來,哪怕是畫一些思維導圖,有一句話很糙,偉大的牛逼之前總是傻逼式的堅持,但理是這么一個理的,學習計算機的程序中,你可能會遇到各種各樣的困惑,重要的是,一定要堅持,
我是二哥呀,如果內容對你有幫助的話,記得給我三連(點贊、收藏、關注)——做個手有余香的人,如果你有什么學習問題,可以在評論區留言,我看到的話會第一時間回復,學習路上一起手拉手,小步快跑~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281613.html
標籤:其他
