我的編程能力從什麼時候開始突飛猛進?

有乾貨、更有故事,微信搜索【編程指北】關注這個不一樣的程序員,等你來撩~

知乎上有個提問:

你的編程能力從什麼時候開發突飛猛進?

覺得挺有意思的,所以順手回答了下,同時也發到我的公衆號上來,這篇文章純碎是記流水賬,也沒什麼乾貨

大家就當看個故事~

正文

啃完一本本書,做完一個個 lab,沒有突飛猛進,一切都是量變最終累積成質變。

但是有那樣一些時間節點,你會明顯感覺到自己的編程能力確實有提高不少,能夠編碼實現更多的想法,接受新知識的速度也會加快,我想這是不是就是零散的知識點逐漸連成線、組成面呢?

不過老實說,就編程能力上確實沒有“突飛猛進”的感覺。

我們都是普通的劇本,不可能像張無忌一樣因跌落懸崖,意外獲得《九陽神功》,從此突飛猛進、開掛,走向人生巔峯。

只有靠不斷的看書、coding、學習優秀開源項目,構建自己的計算機知識體系,並且在特定的領域不斷專研,這樣才能成爲一個優秀的工程師。

下面聊聊我自己的編程學習之路吧。

迷茫的大一

我在大學之前完全沒有編程經驗,高考後,填的專業前幾個也是清一色的傳統工科,被軟件工程錄取純碎是意外。

當時甚至很擔心完全沒有編程基礎的我,上大學會不會跟不上,還因爲考慮過復讀,現在想想也是天真。

大一開學,第一門編程語言就是學的 C 語言,怎麼說呢,老師講的,書上寫的我都能看懂,但是讓我寫一個大的程序,我就摸不到頭腦。不知從何下手,學了半學期,也只能寫寫課後習題,算算水仙花數什麼的。

而且當時對計算機缺乏系統認識,即便我記住了指針就是變量地址,也很難理解它到底有啥用。甚至分不太清數組和指針的區別,以至於會出現對函數局部變量取地址返回這樣現在看來很低級的錯誤。

大一上考完 C 語言後,我便在心裏默默唸想,這輩子再也不寫 C 了,但沒想到的是,後來這成了我最愛的一門語言。

大一下,開始學習數據結構與算法、數字邏輯這些計算機核心課了。

此外,還學了一門當時我看來非常牛逼的語言:Java。

爲啥說我當時覺得它牛逼呢?

因爲剛經歷過 C 語言的摧殘,發現 Java有豐富的類庫,各種方便的工具類。

再也沒有指針了,變成了對象引用,簡直是新大陸。

所以我學得很認真,還記得當時看過馬士兵的 Java Se 教程,不過現在馬老師已經出來單幹了哈哈哈。

自己也用 Java 寫了不少好玩的東西,比如聯機五子棋、HTTP Server 等等。

這讓我第一次感受到編程這麼有趣,俗話說興趣是最好的老師,Java 也算是幫我解鎖了對於編程的興趣。

在學 Java 的時候喜歡在網上搜資料,但總覺得各種博客上的知識過於零散,爲了“精通” Java,我在知乎搜索各種書單,先後看了《Java編程思想》《Java核心技術卷》《Java併發編程》好幾本書,自覺 Java 基礎還算可以,不過現在已經快兩年沒寫了,至於原因後面會提到。

就這樣來到了大一暑假,在家實在沒事幹,當時覺得開發 APP 好牛逼,於是開始自學了安卓,並寫了點 APP 玩,比如天氣、貪喫蛇,現在他們還躺在我的 Github 上。

不過學了一段時間,自己就感覺不太喜歡客戶端開發,似乎寫 APP 那點成就感被消磨耗盡了。

於是大二開學就開始學 Java Web,從 Servlet 到 SSH、SpringBoot,基本上都過了一遍,甚至還買了本現在看來很腦殘的書《Java Web整合開發-王者歸來》,就是下面圖中那本:

後來,越來越覺得這條路就是在學各種框架,雖然學到了東西,但是總覺得不太對勁。

同時,大一暑假有大四學長學姐在學校廣場擺攤賣書,我也買了些,其中有一本就是被稱爲計算機專業神書的 CSAPP。

瘋狂嘗試的大二

大二時,在上一些無聊的課時,我總把這本書帶着,每節課可能會翻個幾頁,那時候看到裏面的彙編、內存管理、存儲器層次我是真的雲裏霧裏,因爲還沒學操作系統,C 語言也學得很差。

所以斷斷續續的看了幾章,說不上學到了什麼,但讓我對這種枯燥的基礎知識第一次產生了興趣,有一種想徹底搞懂它們的想法。

後來在知乎大佬的指引下,爲了看懂這本書,去看了王爽那本《彙編語言》,也在上圖。

重學了 C 語言(主要是指針和內存),由於已經學了彙編,指針對我再也不是問題了,同時看完了《C和指針》、《C專家編程》、《C陷阱與缺陷》,對 C 語言使用得也愈加的熟練。

大二那段時間,學院裏突然颳起全員學機器學習的風氣,雖然不至於全部,但是真的是很多人都在學,明明 16 年大一時客戶端安卓開發還挺火的,到了 17 年各種機器學習、神經網絡就席捲而來。

不能不感嘆,IT 行業日新月異呀,不學習就可能被淘汰。

當然了,我也不例外的加入了,先後看了些吳恩達的視頻、西瓜書。

跟着做了手寫數字識別這種入門必做的項目,但是後來總覺得對機器學習、深度學習提不起興趣,原因之一就是我覺得無法完全掌握每一步,瞭解每一步背後的原理,再加上自己數學也學得不太好,這讓我學得很沒底氣。

於是機器學習之路也止於大二。

大二是學習內容最豐富的時間,當時室友用 Python 寫了搶課腳本,感覺很好玩。

然後自己又跑去學 Python,學爬蟲。

寫了一堆爬蟲,什麼爬豆瓣電影、知乎回答、搶課腳本,玩了一段時間也沒太大興趣了。

時間來到了大二下,按照課程安排,開始上操作系統了。

於是我又在知乎搜索「操作系統怎麼學」,不得不說知乎上各位前輩大佬的回答對我的指引作用極其的大。

順着一堆回答,我發現原來還能跟着別人寫一個 mini OS,這對我吸引力太大了。

於是我買了一本《操作系統真象還原》,這本書真的非常仔細,把寫 OS 需要用到的前置理論知識、Intel手冊、彙編、內聯彙編全都給你講清了。

我一路跟着書寫,寫到了彙編開機打印出我的名字,再到後來進入 C 語言寫內核各個模塊,寫到內存管理我就中斷了,沒有繼續寫下去,這也算個遺憾吧。

這本八百多頁的書,我花了兩個月時間啃了五百多頁,一下課就跑去圖書館,在我的虛擬機中跑 qemu,那時候就沉浸在類似下圖這種界面:

當時我真的對這個入迷了,爲了寫 mini os我還去看了 Linux0.11 的部分代碼,看了哈工大李治軍老師的 OS 公開課,原因就是哈工大 OS 實驗課是用的 Linux 0.11 來魔改。

還很奇葩的把我 QQ 簽名改成了 jmp 0x7c00

(PS: 這句彙編就是跳轉到 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 庫,總之,這段時期是寫了一些小”輪子“的。

(PS:知乎上有朋友問我是如何看完這麼多書的,其實在之前的文章中就寫了,看書我會有選擇的挑章節看,不會從頭看到尾的,而且大三開始課就少了,我基本就在刷這些書,其實時間還蠻多的?畢竟我也沒參加什麼社團、學生會之類,也沒女朋友。。。

那時候會每天記錄看書的進度,感覺特別有勁:

書看得越多,其實你越能找到自己的方向,大三上我就給自己學習定位:

深入C++語言(多線程)+ 存儲(學習 Redis、leveldb)+ 網絡編程(學習muduo,各種網絡編程模型)+ 學習分佈式(MIT 6.824、ddia、google 三大論文等)

基本上是沿着上面幾個方向去展開學習的,有的看書,有的論文,也有的看博客看源碼。

總之,知識面在大三不斷擴充,自己開始關注學習 C10K、C100K 這樣的後臺服務器開發高性能、高併發的解決方法。

當然了,還有些到現在還沒開始,比如 leveldb 的源碼、6.824 的 lab,可能是變懶了......

也可能是學習變得不那麼純碎面向技術了,變成面向工作、面向賺錢了哈哈哈。

值得一提的是,大三上我們學院有門 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、寫下一行行代碼之後。

附錄

附上大學期間買的一些書,畢業的時候大部分都賣了,因爲實在不便攜帶:

這是帶去圖書館自習室的書(常佔位置)

這是畢業整理的書:

買這些書花了我不少錢,大家都知道計算機這些書一本就是五六十、七八十起步。大學四年光買書就花了幾千塊。不過我一直認爲這也是我花的最值的一筆投資。

當然了,我還有自己整理的電子書庫,絕不是在網上那種打包下載的,而是自己需要學到某個方向知識的時候,需要看了,去網上挨個找的,最後彙總而成。這部分我是會不斷把它完善的,當成自己的小電子書庫,不多,但貴在精。

最後真心想說一句,滴水穿石非一日之功,學習計算機還是需要沉下心來好好啃書、看源碼、寫“輪子”。

逐漸構建起屬於自己的計算機知識體系,然後選擇一個專業方向不斷專研。

歡迎各位去知乎看原文,順便幫我點個贊呀,拜謝!

你的編程能力從什麼時候開始突飛猛進?

文章持續更新,全文首發自我的個人公衆號,可以微信搜一搜「 編程指北 」第一時間閱讀,後臺回覆【pdf】有我搜集的上百本經典的計算機書籍電子版。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章