<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5608字,需瀏覽 12分鐘

           ·

          2020-11-20 20:23

          知乎上有個提問:

          你的編程能力從什么時候開發(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。

          img

          當(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è)方向不斷專研。

          讀者福利
          《程序員內(nèi)功修煉》第二版強勢來襲,匯總了高質(zhì)量的算法、計算機基礎(chǔ)文章并且每一篇文章,要嘛是漫畫講解,要嘛是對話講解,一步步引導(dǎo),要嘛是圖形并茂...

          文章整體目錄


          如何獲取

          很簡單,在我的微信公眾號?帥地玩編程?回復(fù)?程序員內(nèi)功修煉?即可獲取《程序員內(nèi)功修煉》第一版和第二版的 PDF。

          推薦,推薦一個 GitHub,這個 GitHub 整理了幾百本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,GitHub地址:https://github.com/iamshuaidi/CS-Book(電腦打開體驗更好),地址閱讀原文直達(dá)

          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男女啪啪的网站 | 操韩日熟女的逼视频 | 男人天堂资源网 | AV国产毛片乱伦 | 柏欣彤Av色福利一二区 |