我的編程能力從什么時候開始突飛猛進的?
知乎上有個提問:
你的編程能力從什么時候開發(fā)突飛猛進?
覺得挺有意思的,所以順手回答了下,同時也發(fā)到我的公眾號上來,這篇文章純碎是記流水賬,也沒什么干貨。
大家就當(dāng)看個故事~
以下是正文:
正文
啃完一本本書,做完一個個 lab,沒有突飛猛進,一切都是量變最終累積成質(zhì)變。
但是有那樣一些時間節(jié)點,你會明顯感覺到自己的編程能力確實有提高不少,能夠編碼實現(xiàn)更多的想法,接受新知識的速度也會加快,我想這是不是就是零散的知識點逐漸連成線、組成面呢?
不過老實說,就編程能力上確實沒有“突飛猛進”的感覺。
我們都是普通的劇本,不可能像張無忌一樣因跌落懸崖,意外獲得《九陽神功》,從此突飛猛進、開掛,走向人生巔峰。
只有靠不斷的看書、coding、學(xué)習(xí)優(yōu)秀開源項目,構(gòu)建自己的計算機知識體系,并且在特定的領(lǐng)域不斷專研,這樣才能成為一個優(yōu)秀的工程師。
下面聊聊我自己的編程學(xué)習(xí)之路吧。
迷茫的大一
我在大學(xué)之前完全沒有編程經(jīng)驗,高考后,填的專業(yè)前幾個也是清一色的傳統(tǒng)工科,被軟件工程錄取純碎是意外。
當(dāng)時甚至很擔(dān)心完全沒有編程基礎(chǔ)的我,上大學(xué)會不會跟不上,還因為考慮過復(fù)讀,現(xiàn)在想想也是天真。
大一開學(xué),第一門編程語言就是學(xué)的 C 語言,怎么說呢,老師講的,書上寫的我都能看懂,但是讓我寫一個大的程序,我就摸不到頭腦。不知從何下手,學(xué)了半學(xué)期,也只能寫寫課后習(xí)題,算算水仙花數(shù)什么的。
而且當(dāng)時對計算機缺乏系統(tǒng)認(rèn)識,即便我記住了指針就是變量地址,也很難理解它到底有啥用。甚至分不太清數(shù)組和指針的區(qū)別,以至于會出現(xiàn)對函數(shù)局部變量取地址返回這樣現(xiàn)在看來很低級的錯誤。
大一上考完 C 語言后,我便在心里默默念想,這輩子再也不寫 C 了,但沒想到的是,后來這成了我最愛的一門語言。
大一下,開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)字邏輯這些計算機核心課了。
此外,還學(xué)了一門當(dāng)時我看來非常牛逼的語言:Java。
為啥說我當(dāng)時覺得它牛逼呢?
因為剛經(jīng)歷過 C 語言的摧殘,發(fā)現(xiàn) Java有豐富的類庫,各種方便的工具類。
再也沒有指針了,變成了對象引用,簡直是新大陸。
所以我學(xué)得很認(rèn)真,還記得當(dāng)時看過馬士兵的 Java Se 教程,不過現(xiàn)在馬老師已經(jīng)出來單干了哈哈哈。
自己也用 Java 寫了不少好玩的東西,比如聯(lián)機五子棋、HTTP Server 等等。
這讓我第一次感受到編程這么有趣,俗話說興趣是最好的老師,Java 也算是幫我解鎖了對于編程的興趣。
在學(xué) Java 的時候喜歡在網(wǎng)上搜資料,但總覺得各種博客上的知識過于零散,為了“精通” Java,我在知乎搜索各種書單,先后看了《Java編程思想》《Java核心技術(shù)卷》《Java并發(fā)編程》好幾本書,自覺 Java 基礎(chǔ)還算可以,不過現(xiàn)在已經(jīng)快兩年沒寫了,至于原因后面會提到。
就這樣來到了大一暑假,在家實在沒事干,當(dāng)時覺得開發(fā) APP 好牛逼,于是開始自學(xué)了安卓,并寫了點 APP 玩,比如天氣、貪吃蛇,現(xiàn)在他們還躺在我的 Github 上。
不過學(xué)了一段時間,自己就感覺不太喜歡客戶端開發(fā),似乎寫 APP 那點成就感被消磨耗盡了。
于是大二開學(xué)就開始學(xué) Java Web,從 Servlet 到 SSH、SpringBoot,基本上都過了一遍,甚至還買了本現(xiàn)在看來很腦殘的書《Java Web整合開發(fā)-王者歸來》,就是下面圖中那本:

后來,越來越覺得這條路就是在學(xué)各種框架,雖然學(xué)到了東西,但是總覺得不太對勁。
同時,大一暑假有大四學(xué)長學(xué)姐在學(xué)校廣場擺攤賣書,我也買了些,其中有一本就是被稱為計算機專業(yè)神書的 CSAPP。
瘋狂嘗試的大二
大二時,在上一些無聊的課時,我總把這本書帶著,每節(jié)課可能會翻個幾頁,那時候看到里面的匯編、內(nèi)存管理、存儲器層次我是真的云里霧里,因為還沒學(xué)操作系統(tǒng),C 語言也學(xué)得很差。
所以斷斷續(xù)續(xù)的看了幾章,說不上學(xué)到了什么,但讓我對這種枯燥的基礎(chǔ)知識第一次產(chǎn)生了興趣,有一種想徹底搞懂它們的想法。
后來在知乎大佬的指引下,為了看懂這本書,去看了王爽那本《匯編語言》,也在上圖。
重學(xué)了 C 語言(主要是指針和內(nèi)存),由于已經(jīng)學(xué)了匯編,指針對我再也不是問題了,同時看完了《C和指針》、《C專家編程》、《C陷阱與缺陷》,對 C 語言使用得也愈加的熟練。
大二那段時間,學(xué)院里突然刮起全員學(xué)機器學(xué)習(xí)的風(fēng)氣,雖然不至于全部,但是真的是很多人都在學(xué),明明 16 年大一時客戶端安卓開發(fā)還挺火的,到了 17 年各種機器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)就席卷而來。
不能不感嘆,IT 行業(yè)日新月異呀,不學(xué)習(xí)就可能被淘汰。
當(dāng)然了,我也不例外的加入了,先后看了些吳恩達(dá)的視頻、西瓜書。
跟著做了手寫數(shù)字識別這種入門必做的項目,但是后來總覺得對機器學(xué)習(xí)、深度學(xué)習(xí)提不起興趣,原因之一就是我覺得無法完全掌握每一步,了解每一步背后的原理,再加上自己數(shù)學(xué)也學(xué)得不太好,這讓我學(xué)得很沒底氣。
于是機器學(xué)習(xí)之路也止于大二。
大二是學(xué)習(xí)內(nèi)容最豐富的時間,當(dāng)時室友用 Python 寫了搶課腳本,感覺很好玩。
然后自己又跑去學(xué) Python,學(xué)爬蟲。
寫了一堆爬蟲,什么爬豆瓣電影、知乎回答、搶課腳本,玩了一段時間也沒太大興趣了。
時間來到了大二下,按照課程安排,開始上操作系統(tǒng)了。
于是我又在知乎搜索「操作系統(tǒng)怎么學(xué)」,不得不說知乎上各位前輩大佬的回答對我的指引作用極其的大。
順著一堆回答,我發(fā)現(xiàn)原來還能跟著別人寫一個 mini OS,這對我吸引力太大了。
于是我買了一本《操作系統(tǒng)真象還原》,這本書真的非常仔細(xì),把寫 OS 需要用到的前置理論知識、Intel手冊、匯編、內(nèi)聯(lián)匯編全都給你講清了。
我一路跟著書寫,寫到了匯編開機打印出我的名字,再到后來進入 C 語言寫內(nèi)核各個模塊,寫到內(nèi)存管理我就中斷了,沒有繼續(xù)寫下去,這也算個遺憾吧。
這本八百多頁的書,我花了兩個月時間啃了五百多頁,一下課就跑去圖書館,在我的虛擬機中跑 qemu,那時候就沉浸在類似下圖這種界面:

當(dāng)時我真的對這個入迷了,為了寫 mini os我還去看了 Linux0.11 的部分代碼,看了哈工大李治軍老師的 OS 公開課,原因就是哈工大 OS 實驗課是用的 Linux 0.11 來魔改。
還很奇葩的把我 QQ 簽名改成了 jmp 0x7c00

(PS: 這句匯編就是跳轉(zhuǎn)到 0x7c00 地址,BIOS 開始引導(dǎo)操作系統(tǒng)
于是就這樣,我越來越喜歡偏底層一點的東西,所以決定走 Linux C/C++ 路線,然而現(xiàn)在看來確實太年輕了,Linux C/C++ 在鵝廠好多也是用來寫業(yè)務(wù)滴。。。
大二下在知乎、牛客網(wǎng)搜索學(xué)習(xí)路線,我大概清楚了需要看些什么書(搜索敲黑板,一定要學(xué)會主動搜索各種信息。
專注的大三
于是在大三左右開始了非常標(biāo)準(zhǔn)的 Linux C/C++學(xué)習(xí)之路:
前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++對象模型》、《STL源碼剖析》、《C++設(shè)計與演化》、《Linux內(nèi)核設(shè)計與實現(xiàn)》、《Linux內(nèi)核完全注釋》、《effecitve C++》 、《effective modern C++》、《程序員自我修養(yǎng)》、《Linux高性能服務(wù)端編程》、《Linux多線程服務(wù)端編程》(知乎陳碩大佬寫的)......
順便還看了點 Muduo 源碼,自己模仿著基于 Epoll 寫一個 Reactor模型的 Web 靜態(tài)服務(wù)器,跟著知乎 Milo 大佬寫 Json 庫,總之,這段時期是寫了一些小”輪子“的。
(PS:知乎上有朋友問我是如何看完這么多書的,其實在之前的文章中就寫了,看書我會有選擇的挑章節(jié)看,不會從頭看到尾的,而且大三開始課就少了,我基本就在刷這些書,其實時間還蠻多的?畢竟我也沒參加什么社團、學(xué)生會之類,也沒女朋友。。。
那時候會每天記錄看書的進度,感覺特別有勁:

書看得越多,其實你越能找到自己的方向,大三上我就給自己學(xué)習(xí)定位:
深入C++語言(多線程)+ 存儲(學(xué)習(xí) Redis、leveldb)+ 網(wǎng)絡(luò)編程(學(xué)習(xí)muduo,各種網(wǎng)絡(luò)編程模型)+ 學(xué)習(xí)分布式(MIT 6.824、ddia、google 三大論文等)
基本上是沿著上面幾個方向去展開學(xué)習(xí)的,有的看書,有的論文,也有的看博客看源碼。
總之,知識面在大三不斷擴充,自己開始關(guān)注學(xué)習(xí) C10K、C100K 這樣的后臺服務(wù)器開發(fā)高性能、高并發(fā)的解決方法。
當(dāng)然了,還有些到現(xiàn)在還沒開始,比如 leveldb 的源碼、6.824 的 lab,可能是變懶了......
也可能是學(xué)習(xí)變得不那么純碎面向技術(shù)了,變成面向工作、面向賺錢了哈哈哈。
值得一提的是,大三上我們學(xué)院有門 System Programing 的課,教材就是使用的 CSAPP,因此我之前大二草草看完的書,得以再次翻開,這一次我把附帶的是個實驗也挨著挨著做了,收獲良多,有位運算各種奇技淫巧,有 Bomb lab 刺激的打怪通關(guān)、也知道了buffer overflow attack.... 還有實現(xiàn)基本的內(nèi)存管理等等。
印象最深的便是做 bomb lab,一個個 phase 的通過真的很讓人興奮,我?guī)缀跏前疽惯B著把這幾個 phase 過掉的,當(dāng)然頭發(fā)也沒少掉。
當(dāng)時還在簡書寫了個萬字長文記錄:
再到后來,我拿到了微信實習(xí) offer,然后順利轉(zhuǎn)正。
在我大三下拿到實習(xí) offer 后,開始做一些國外計算機課程 lab,一方面有錢賺,而且還不低,靠這個我在大三下就實現(xiàn)了經(jīng)濟獨立,另一方面這些 lab 有些很有意思,對提高基礎(chǔ)和編程能力很有幫助。
在這里列舉一些我做過的覺得有意思的 lab(之前有篇文章寫過):
第一個是文件系統(tǒng)
這個玩意挺有意思的,就是要讓你自己去設(shè)計一個文件系統(tǒng),比如文件、數(shù)據(jù)塊、目錄等等,而且你要提供創(chuàng)建、讀寫、刪除、隨機讀、隨機寫等等接口,然后通過 Linux 的 VFS(虛擬文件系統(tǒng)) 機制掛載到 Linux 內(nèi)核中,然后就可以用系統(tǒng)調(diào)用 open、read、write 這些來在你的文件系統(tǒng)上進行讀寫。VFS 是Linux一個機制,它規(guī)定了 IO 接口,然后你去實現(xiàn)這些接口,你就可以掛載在上面。通過這個東西我深入的學(xué)習(xí)和了解了文件系統(tǒng),報酬也是非常值的。

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

第三個是操作系統(tǒng)的鎖實現(xiàn)
這個就是讓你基于硬件的原子指令 xchg、cmpxchg 這些實現(xiàn)一個鎖,這個需要內(nèi)聯(lián)匯編、匯編等知識,簡直是硬核!!!做完這個也解開了我對鎖實現(xiàn)的一些疑惑。

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

還有模擬實現(xiàn) TCP 可靠傳輸?shù)?/strong>
這個就更硬核了,人家老外老師就是給力,直接做了一個網(wǎng)站,這個網(wǎng)站你可以通過 TCP 連接上去,然后你需要運行幾個節(jié)點,互相發(fā)消息,他們之間的消息都會經(jīng)過老師的網(wǎng)站,所以通過網(wǎng)站上是可以控制丟包率的,也能控制節(jié)點的拓?fù)浣Y(jié)構(gòu),要求就是讓你基于這種不可靠的信道,做出可靠數(shù)據(jù)傳輸!這簡直就是翻版 TCP 嘛,超時重傳、ACK、滑動窗口啥的都給我上!就是像下面圖中一樣,圓圈就表示你可達(dá)的范圍,不同節(jié)點形成各種網(wǎng)絡(luò)拓?fù)洌梢哉{(diào)節(jié)網(wǎng)絡(luò) 丟包率 Loss chance。

當(dāng)然也有很多寫算法的,數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,圖搜索的,也有做機器學(xué)習(xí)、深度學(xué)習(xí)的,反正各個方向都有。
做這些 lab 真的實實在在的提高了我的編程實踐能力,也算是檢驗了前期看那么多書還是有效果滴。
所以寫了這么多,再點次題吧,我認(rèn)為自己編程能力突飛猛進就是在看完一本本大黑書、做完一個個 lab、寫下一行行代碼之后。
附錄
附上大學(xué)期間買的一些書,畢業(yè)的時候大部分都賣了,因為實在不便攜帶:
這是帶去圖書館自習(xí)室的書(常占位置)

這是畢業(yè)整理的書:

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

最后真心想說一句,滴水穿石非一日之功,學(xué)習(xí)計算機還是需要沉下心來好好啃書、看源碼、寫“輪子”。
逐漸構(gòu)建起屬于自己的計算機知識體系,然后選擇一個專業(yè)方向不斷專研。
文章整體目錄

如何獲取
很簡單,在我的微信公眾號?帥地玩編程?回復(fù)?程序員內(nèi)功修煉?即可獲取《程序員內(nèi)功修煉》第一版和第二版的 PDF。
推薦,推薦一個 GitHub,這個 GitHub 整理了幾百本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,GitHub地址:https://github.com/iamshuaidi/CS-Book(電腦打開體驗更好),地址閱讀原文直達(dá)
