寫作這些年來,認識了很多優秀的小伙伴,比如說鵝廠的小北,他在知乎上的一篇回答非常火,借這個機會,分享給我在 CSDN 上的小伙伴們,值得讀一讀,你一定會大有所獲,
以下是正文,
啃完一本本書, 做完一個個lab
沒有突飛猛進, 一切都是量變最終累積成質變!
但是會有那樣一些時間節點,你會明顯感覺到自己的編程能力確實有提高不少,能夠實作更多的想法.
不過老實說,就編程能力上確實沒有“突飛猛進”的感覺,都是逐漸的進步,量變引起質變嘛,
我們都是普通人,不可能像張無忌一樣因跌落懸崖,意外獲得《九陽神功》,從此開掛,走上巔峰,
只有靠不斷的看書、coding、學習優秀開源專案,構建自己的計算機知識體系,并且在特定的領域不斷專研,這樣才能成為一個優秀的工程師,
下面聊聊我自己的編程學習之路吧,我在大學之前完全沒有編程經驗,高考后,填的專業前幾個也是清一色的傳統工科,被軟體工程錄取純碎是意外,
當時甚至很擔心完全沒有編程基礎的我,上大學會不會跟不上,
后來大一,第一門編程語言就是學的C語言,怎么說呢,老師講的,書上寫的我都能看懂,但是一讓我寫一個大的程式,我就摸不到頭腦,不知從何下手,學了半學期,也只能寫寫課后習題,算算水仙花數什么的,
而且當時對計算機缺乏系統認識,即便我知道指標就是變數地址,也很難理解它到底有啥用,甚至分不太清陣列和指標的區別,以至于會出現對函式區域變數取地址回傳這樣現在看來很低級的錯誤,
大一上考完C語言后,我便在心里默默念想,這輩子再也不寫C了,只是沒想到的是,后來這成了我最愛的一門語言,
大一下開始學習資料結構與演算法、數字邏輯這些計算機核心課了,此外,還學了一門當時我看來非常牛逼的語言—Java,為啥說我當時覺得它牛逼呢?因為剛經歷過C語言的摧殘,發現Java豐富的類別庫,各種方便的工具類,再也沒有指標了,變成了物件參考,
Java我學得很認真,當時還看過馬士兵的Java Se教程,自己也用Java寫了不少好玩的東西,比如聯機五子棋、HTTP服務器等等,這讓我第一次感受到編程這么有趣,俗話說興趣是最好的老師,
在學java的時候喜歡在網上搜資料,但總覺得各種博客上的知識過于零散,為了學好Java,我在知乎搜索各種書單,先后看了《Java編程思想》《Java核心技術卷》《Java并發編程》好幾本書(不是全看哈,大部分主干章節大一暑假在家自學了安卓,并寫了幾個app玩,但發現自己不太喜歡客戶端,于是大二開學就開始學 Java 后臺開發,從 Servlet 到 SSH SpringBoot,基本上都過了一遍,后來越來越覺得這條路就是在學各種框架,總覺得不太對勁,
同時,大一暑假有大四學長學姐在學校廣場擺攤賣書,我也買了些,其中有一本就是被稱為計算機神書的CSAPP,大二在上一些無聊的課時,我總把這本書帶著,每節課可能會翻個幾頁,那時候看到匯編、記憶體管理、存盤器層次我是真的云里霧里,因為還沒學作業系統,C語言也學得很差,所以斷斷續續的看了幾章,說不上學到了什么,但讓我對這種枯燥的基礎知識第一次產生了興趣,有一種想徹底搞懂它們的想法,為了看懂這本書,又去看了王爽那本《匯編語言》,重學了C語言,由于已經學了匯編,指標對我再也不是問題了,同時看完了《c和指標》、《C專家編程》、《C陷阱與缺陷》,C語言使用得也愈加的熟練,
大二上那段時間,學院里突然刮起全員學機器學習的風氣,雖然不至于全部,但是真的是很多人都在學,于是我也不例外的加入了,先后看了點吳恩達的視頻和西瓜書,跟著寫了手寫數字識別這種入門必做的專案,但是后來總覺得對機器學習、深度學習提不起興趣,原因之一就是我覺得無法完全掌握每一步,了解每一步背后的原理,這讓我學得不安心,于是ML的學習之路也止于大二,
大二是學習內容最豐富的時間,當時室友用 Python 寫了搶課腳本,感覺很好玩,然后又跑去學Python,學爬蟲,寫了一堆爬蟲,什么爬豆瓣電影、知憾訓答、搶課腳本,玩了一段時間也沒太大興趣了,
時間來到了大二下,按照課程安排,開始上作業系統了,于是我又在知乎搜索“作業系統怎么學”,順著一堆回答,我發現原來還能跟著別人寫一個 mini OS,這對我吸引力太大了,于是我買了一本《作業系統真象還原》,這本書真的非常仔細,把寫 OS 需要用到的前置理論知識、匯編、行內匯編全都給你講清了,我一路跟著書寫,寫到了匯編開機列印出我的名字,再到后來進入C語言寫內核各個模塊,寫到記憶體管理我就中斷了,沒有繼續寫下去,這也算個遺憾吧,當時真的對這個入迷了,為了寫Min os我還去看了Linux0.11的部分代碼,把我的QQ簽名改成了 jmp 0x7c00

(這句匯編就是將跳轉到0x7c00這里,BIOS開始引導作業系統,
于是就這樣,我越來越喜歡偏底層一點的東西,所以決定走 Linux C/C++ 路線,然而現在看來確實太年輕了,Linux C/C++ 在鵝廠好多也是用來寫業務滴,,,
大二下在知乎、牛客網搜索學習路線,我大概清楚了需要看些什么書,于是開始了非常標準的 Linux C/C++學習之路,前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++物件模型》、《STL原始碼剖析》、《C++設計與演化》、《Linux內核設計與實作》、《Linux內核完全注釋》、《effecitve C++》 、《effective modern C++》、《程式員自我修養》、《Linux高性能服務端編程》、《Linux多執行緒服務端編程》(知乎陳碩大佬寫的)…,順便還看了點muduo原始碼,自己模仿著基于epoll寫一個reactor模型的web服務器,跟著知乎Milo大佬寫Json庫,總之,這段時期是寫了一些小”輪子“的,
看的書越多,其實你越能找到自己的方向,大三上我就給自己學習定位:深入C++語言(多執行緒)+ 存盤(學習redis、leveldb)+ 網路編程(學習muduo,各種網路編程模型)+ 學習分布式(mit 6.824、ddia、google三大論文等)基本上是沿著上面幾個方向去展開學習的,有的看書,有的論文,也有的看博客看原始碼,總之,知識面在大三不斷擴充,自己開始關注C10K、C100K這樣的后臺服務器開發高性能、高并發的解決方法,值得一提的是,大三上我們學院有門System Programing的課,教材就是使用的CSAPP,因此我之前大二草草看完的書,得以再次翻開,這一次我把附帶的是個實驗也挨著挨著做了,識訓良多,有位運算各種奇技淫巧,有Bomb lab刺激的打怪通關、也知道了buffer overflow attack… 還有實作基本的記憶體管理等等,印象最深的便是做bomb lab,一個個 phase 的通過真的很讓人興奮,我幾乎是連著把這幾個phase過掉的,當然頭發也沒少掉,
再到后來,我拿到了微信實習offer,然后順利轉正,在我大三下拿到實習offer后,我開始做一些國外計算機課程lab,一方面有錢拿,而且還不低,靠這個我在大三下就實作了經濟獨立,另一方面這些lab很有意思,對提高基礎和編程能力很有幫助,現在我開了一個公眾號「編程指北」分享編程學習方法、技術相關的一些東西,感興趣的同學可以去關注下~在這里列舉一些我做過的覺得有意思的lab:第一個是檔案系統這個玩意挺有意思的,就是要讓你自己去設計一個檔案系統,比如檔案、資料塊、目錄等等,而且你要提供創建、讀寫、洗掉、隨機讀、隨機寫等等介面,然后通過 Linux 的 VFS(虛擬檔案系統) 機制掛載到 Linux 內核中,然后就可以用系統呼叫 open、read、write 這些來在你的檔案系統上進行讀寫,VFS 是Linux一個機制,它規定了 IO 介面,然后你去實作這些介面,你就可以掛載在上面,通過這個東西我深入的學習和了解了檔案系統,報酬也是非常值的,

第二個是SVC
就是版本管理系統,類似 SVN 和 GIT的,但是相對 GIT 做了很多簡化,核心的就是創建分支、分支合并、回滾、commit 這些,通過這個我又去詳細了解了 GIT 的實作原理,并且自己寫了一個簡單版本的 GIT,受益匪淺,也賺到了幾千大洋,

第三個是作業系統的鎖實作
這個就是讓你基于硬體的原子指令 xchg、cmpxchg 這些實作一個鎖,這個需要行內匯編、匯編等知識,簡直是硬核!!!做完這個也解開了我對鎖實作的一些疑惑,

Web Proxy
這個就更有意思了,要求用 C++ 寫一個代理服務器,類似 Nginx 的代理功能,當然,相比 Nginx 弱雞很多,
但是麻雀雖小,五張俱全,而且老外最有意思的是要求代理服務器對一些圖片和 HTML 惡作劇,就是代理服務器隨機的在原始服務器,回傳的回應里 插入一些圖片和文字,因為那天是愚人節,,,不得不說老外還是很有趣的,

還有模擬實作 TCP 可靠傳輸的
這個就更硬核了,人家老外老師就是給力,直接做了一個網站,這個網站你可以通過 TCP 連接上去,然后你需要運行幾個節點,互相發訊息,他們之間的訊息都會經過老師的網站,所以通過網站上是可以控制丟包率的,也能控制節點的拓撲結構,要求就是讓你基于這種不可靠的信道,做出可靠資料傳輸!這簡直就是翻版 TCP 嘛,超時重傳、ACK、滑動視窗啥的都給我上!就是像下面圖中一樣,圓圈就表示你可達的范圍,不同節點形成各種網路拓撲,可以調節網路 丟包率 Loss chance,

當然也有很多寫演算法的,資料結構實作的,圖搜索的,也有做機器學習、深度學習的,反正各個方向都有,
做這些 lab 真的實實在在的提高了我的編程實踐能力,也算是檢驗了前期看那么多書還是有效果滴,(順便還讓我大學期間就月入上萬,,,所以寫了這么多,再點次題吧,我認為自己編程能力突飛猛進就是在看完一本本大黑書、做完一個個lab、寫下一行行代碼之后,附上大學期間買的一些書,畢業的時候大部分都賣了,因為實在不便攜帶:這是帶去圖書館自習室的書(常占位置)



買這些書花了我不少錢,大家都知道計算機這些書一本就是五六十、七八十起步,大學四年光買書就花了幾千塊,不過我一直認為這也是我花的最值的一筆投資,下面就是我自己整理的電子書,絕不是在網上那種打包下載的,而是自己需要學到某個方向的時候去網上挨個找的,最后匯總而成,這部分我是會不斷把它完善的,當成自己的小電子書庫,不多,但貴在精

想要獲取這些電子書,訪問下面這個鏈接,
https://codechina.csdn.net/mirrors/itwanger/JavaBooks
最后真心想說一句,滴水穿石非一日之功,學習計算機還是需要沉下心來好好啃書、看原始碼、寫“輪子”(注意不是在大學瘋狂去寫web應用做crud),逐漸構建起屬于自己的計算機知識體系,然后選擇一個專業方向不斷專研,當然了,多刷題也可以提高編程能力,所以在這里也推薦一份我看過的谷歌大佬開源的刷題筆記:
Github 瘋傳!史上最強!BAT 大佬「LeetCode刷題手冊」電子書開放下載了!
大家覺得有幫助的話,也可以幫我點個贊,筆芯~ 記得關注二哥喲,
最后,貼一下原文鏈接吧:
https://www.zhihu.com/question/356351510/answer/1578302782
CSDN認證博客專家
博客之星
Java 大牛
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243581.html
標籤:其他
上一篇:C語言編程>第十周 ② 撰寫函式fun,它的功能是:求m以內(不包括m)同時能被3與7整除的所有自然數之和的平方根a,并作為函式值回傳。
下一篇:感謝有你,一路同行,歷史文章匯總,涉及STM32、模塊使用、傳感器、物聯網、鴻蒙、仿真和綜合實體等嵌入式的方方面面,歡迎關注。
