有乾貨、更有故事,微信搜索【 編程指北】關注這個不同的程序員,等你來撩~
知乎上有個提問:程序員
你的編程能力從何時開發日新月異?
以爲挺有意思的,因此順手回答了下,同時也發到個人博客上來,這篇文章純碎是記流水帳,也沒什麼乾貨。算法
你們就當看個故事~編程
啃完一本本書,作完一個個 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.82四、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、寫下一行行代碼以後。
附上大學期間買的一些書,畢業的時候大部分都賣了,由於實在不便攜帶:
這是帶去圖書館自習室的書(常佔位置)
這是畢業整理的書:
買這些書花了我很多錢,你們都知道計算機這些書一本就是五六10、七八十起步。大學四年光買書就花了幾千塊。不過我一直認爲這也是我花的最值的一筆投資。
固然了,我還有本身整理的電子書庫,毫不是在網上那種打包下載的,而是本身須要學到某個方向知識的時候,須要看了,去網上挨個找的,最後彙總而成。這部分我是會不斷把它完善的,當成本身的小電子書庫,很少,但貴在精。
最後真心想說一句,滴水穿石非一日之功,學習計算機仍是須要沉下心來好好啃書、看源碼、寫「輪子」。
逐漸構建起屬於本身的計算機知識體系,而後選擇一個專業方向不斷專研。
歡迎各位去知乎看原文,順便幫我點個贊呀,拜謝!
文章持續更新,全文首發自個人我的公衆號,能夠微信搜一搜「 編程指北 」第一時間閱讀