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

2021-02-22 帥地玩編程

知乎上有個提問:

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

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

大家就當看個故事~

以下是正文:

正文

啃完一本本書,做完一個個 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。

img

當然也有很多寫算法的,數據結構實現的,圖搜索的,也有做機器學習、深度學習的,反正各個方向都有。

做這些 lab 真的實實在在的提高了我的編程實踐能力,也算是檢驗了前期看那麼多書還是有效果滴。

所以寫了這麼多,再點次題吧,我認為自己編程能力突飛猛進就是在看完一本本大黑書、做完一個個 lab、寫下一行行代碼之後。

附錄

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

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

這是畢業整理的書:

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

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

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

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

《程式設計師內功修煉》第二版強勢來襲,匯總了高質量的算法、計算機基礎文章並且每一篇文章,要嘛是漫畫講解,要嘛是對話講解,一步步引導,要嘛是圖形並茂...

文章整體目錄

如何獲取

很簡單,在我的微信公眾號 帥地玩編程 回復 程式設計師內功修煉 即可獲取《程式設計師內功修煉》第一版和第二版的 PDF。

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

相關焦點

  • 助你編程能力「突飛猛進」的乾貨分享
    但在有能力寫更多的代碼之前,首先要學會閱讀別人的優秀代碼。所以,很明顯,提高編程能力,需要經歷以下幾個階段:想要讓編程能力「突飛猛進」,像小說裡擁有「金手指」的主角一樣,一刀999,升級像坐火箭一樣,不用持續努力,那顯然是不可能的。要知道,命運所有的饋贈,早已在暗中標好了價格。
  • 問答|什麼叫作突破?從誰開始?從什麼時候開始?
    上帝不會為你得到的,已經滿足就叫你不必追求;上帝只會對你說:「你一定要再追求,到你老的時候,退休的時候,你還不可以停止!」這種精神在我身上有的,在你身上有沒有我不知道。問:多少神學博士,多少上帝國度的英雄鬥士?
  • 零基礎如何學習編程?
    我認為當你真正開始著手做一件事情之前,你不應該也沒有資格提出任何問題。因為這時候你往往只能提出大而無當的問題,毫無價值可言。另外,當你開始做的時候,問題的答案其實自然而然就已經暴露在你面前了。我是真正0基礎學Python的,在開始之前我沒有向任何人提出過問題,最後我還不是把網站做出來了。以下為正文,希望對你的學習有所啟發。
  • 打字速度慢,可以學好編程嘛?
    當然這樣也會看你的崗位是什麼,往往能力越大的人,具體的寫的代碼,自己動得手就越少,如果說你已經到了公司主管的位置,這個打字就可以忽略了,因為公司需要的是你的頭腦,你提出想法有人會幫你落實的;所以當編程到達我說的這個級別的時候就不用考慮打字速度的問題了;
  • 編程=996?那少兒編程呢?等於少年禿?
    學習少兒編程可以,但是如何挽留我孩子的頭髮?為了錢臉都不要了,你想讓一個連18歲都不到的孩子都禿頭嗎?「996制度」讓編程遭受汙名化,那為什麼還鼓勵孩子學編程?我太南了,冤枉啊!首先,程式設計師≠禿頂不知什麼時候,大家開始把程式設計師和禿頭劃等號。為什麼牛逼程式設計師都禿頂了?解密!
  • 兩年自學進入Facebook:20多歲開始學編程, 晚了嗎?附牛逼自學To-do List
    我22歲開始編程22-我才學會什麼是「if statement」24-我進了Facebook,做的是Analyst25-我在Facebook內部轉成了Engineer26-我離開了Facebook開始創業現在的我,26歲。也許你會說我「lucky」,但我會用「special」形容自己。
  • 編程中,有哪些好的習慣從一開始就值得堅持?
    其實任何東西我們都希望它能夠「自動化」,隨著編程經驗的提升,大部分編程規範你已經瞭然於心,但是實際操作的時候,又總是忘這忘那,我們希望一個工具來幫我們自動檢測我們的程序是否是符合規範,結構良好的。這裡我稍微展開說一下,因為「想清楚」其實是一個很模糊的概念。怎樣才算想清楚了呢?我常常有這樣的經歷,對一個難題,經過了一番思考之後覺得自己想到了一個比其他人好得多的方法,結果去實現的時候,發現原來是想的時候疏漏的一個細節,方法不可行,感到很挫敗,不得不回頭過去重新審視問題,浪費了很多時間。怎樣才能想清楚呢?
  • 從C、C++、Java到Python,編程入門到底學什麼語言好?
    然而作為程式設計師吃飯的工具,程式語言之間也形成了某種鄙視鏈,各大論壇裡瀰漫著劍拔弩張的氣氛,眾口難調。也難怪有很多初學者會有疑惑,為什麼會有這麼多程式語言,我到底應該學什麼語言?從面向機器的語言、面向過程的語言到面向對象的語言,程式語言的歷史也經歷了由繁到簡。而網際網路崛起的90年代,無疑也是程式語言的黃金時代。套用維基百科的總結,「1990年代未見到有什麼重大的創新,大多都是以前構想的重組或變化。」但就是這樣的一個時代,卻是各種程式語言大放異彩的開始。
  • 成為Top Sales的三大核心能力
    作者:陳哲,70後,1994年開始IT銷售工作有25年銷售經驗的銷售老司機
  • 編程入門寶典,剛開始學習編程新手必看的5點建議!
    編程就像圍城,城裡的人想出去,城外的人想進來。  對於零基礎的小白,要殺入代碼的戰場需要準備好哪些東西呢?
  • 什麼能力可以讓自己快速進步?
    比如一名實習護士就曾問過我一個困擾她很長時間的奇怪問題,她說:「不知道為什麼,我的行動總是快於腦子,就是在醫院做事的時候,腦子還沒有想好,腳就開始不受控制地亂跑亂竄起來,等我反應過來的時候,我就會很疑惑自己剛才在幹嘛……」作為局外人,第一次聽到這樣描述時我也很疑惑,但我還是儘量調動自己所學,並結合之前與她的聊天信息給出了一個假設性的回答:「我想,這個下意識習慣可能與你在實習時受到的壓力有關。
  • 初學者的編程自學指南
    關於這份指南  之前有不少學弟學妹問我如何學習編程,根據DRY法則(Don't Repeat
  • Python編程遇問題,文科生怎麼辦?
    輕易提出看似異常簡單的「傻問題」,可能會讓我們的自我評價受挫,覺得自己沒有能力,又被別人看作「懶惰」。所以許多情況下,我們遇到問題,喜歡自己先折騰一番。動手摺騰並不是壞事。以正確的方法嘗試解決問題,會幫你積累認知。所謂的「編程經驗」,很多就是從各種失敗嘗試中提煉出來的。
  • 女俠編程記
    I was also having a frustrating time finding high quality, trustworthy resources for women who lift weights and had this continuous nagging feeling that maybe I should actually do something about it.
  • 可以從什麼時候開始休?
    女職工要根據自身情況來決定休產假。比如產前檢查一切正常,所從事的又不是重體力或環境惡劣或條件差的工作,則可以到預產期前1周左右再休產假。  產假有多少天,懷孕到什麼時候就可以修產假了,休產假的最佳時間是什麼時候等問題,想必是很多職場孕媽媽們都會想要了解的。產假保護了女職工的人權,女職工生育不管是否合法,都是享有法定產假的。  產假有多少天?
  • 管理者最重要的能力是什麼?這個我心服口服!
    人生不如意事十之八九,不管碰到什麼困難,只要你的目標明確,你就應該自己說服自己,自己激勵自己,而不應該寄希望於向別人傾訴,那樣根本不可能真正解決問題。我自己就有這個體會,冰箱項目剛開始上馬的時候我們什麼都沒有,找別人,人家不但不會鼓勵你,反倒會潑冷水。因為那時這個廠虧損很嚴重,又要貸款幾千萬,什麼時候能還上?
  • 老外總結的編程技巧
    學習一門新的程式語言(Learn a new programming language)學習一門新的程式語言將有助於你開拓新的思維方式,特別是當你使用不熟悉的語言時,你將學習到很多種思維方法應用到語言中。而所學習到的新思維方式,你可以運用在你所熟知的語言中。
  • 1個男人與1000個女人:自學編程的故事與未來
    這一個男人和那一千個女人之間發生了什麼故事? 為什麼他會選擇從國企離職,全身心投入女性學習編程做社會企業?CGC除了在嘗試一種「新型的學習方式」之外,更從「人類共同體」角度關注「平等」。準確地說,這是「一千零一個人自學編程的故事和未來」。
  • 編程入門 || 15110與 David Kosbie & Mark Stehlik
    寫客座講師與David和Mark兩位教授之前,先來一小段我上完110之後,從一個純粹的小白變成「稍微知道一些編程知識的小白」的體會吧。 要一開始就去培養自己高屋建瓴top-down design的思維,把大問題分解成小問題,先順好數學上面的邏輯,再去思考怎麼用編程解決這件事情。
  • 人分三六九等,這是不變的事實,那麼從什麼時候開始的呢
    在現在的文明社會,人分三六九等,這也無可厚非,我想闡述的是這種階級,不是我們非要推翻的那種階級,我說的階級更合適的詞是層次,而這個層級的形成,多數是因為自身的原因造成的。第一次分層:中考,50%的孩子無緣高中。