嵌入式工程師講述:C語言從小菜雞到老司機
為什么要學習C語言
我們不說它那些語言特性的優(yōu)點啊,不說什么速度快呀,可移植啊,代碼緊湊啊,等等啊,這些我們不說。因為語言特性和我們自身的關系也不大對吧?那么為什么要學C語言呢?我給你三個理由。1.C更偏底層C是一門造輪子的語言,更加貼近操作系統(tǒng),有多貼近?連windows、linux操作系統(tǒng)都是C寫的,學習c語言,能非常近距離的「看到」一個程序的運行流程,編譯、匯編、鏈接、運行。內存的申請和釋放,每一個變量是怎么存儲于內存中的,他們又分別存在內存中的什么區(qū)。學習C語言要直面操作系統(tǒng)的特點,這個過程能學到很多底層相關的知識,相比C語言,學習其他語言可能就沒有這么底層啊,很多東西都會有一種霧里看花的感覺,無法深入的理解本質。學習這些底層知識與機制,對于你程序里排查問題、做性能優(yōu)化,非常有好處,會幫你開闊思路。2.就業(yè)面更廣說實話,在我的認知里,沒有C語言做不了的事情,只有C語言不適合做的事情。我舉三個必須使用c語言的例子,三個完全沒有一點關系的行業(yè)。- 嵌入式,就是做和硬件相關的行業(yè)
- 網絡游戲
- 互聯(lián)網web服務
C語言學習路徑
如果把學習c語言比作是攀登一座巍峨聳立的大山,那么我要說的這條路徑呢,就是最快的爬到山頂的路徑,我會幫你把那些路邊的野花野草全部通通干掉,把那些可能導致你迷失方向的小路也都干掉,只留下最簡單直接的垂直的一條直達山頂的路線,讓你爬山爬的非常過癮。為了能夠清晰的表達我想說的這個路徑呢,我還畫了一個腦圖,看我是不是很用心。腦圖文件有點大,清晰的圖片文章放不下,如果有想要下載這個腦圖的小伙伴,可以關注后回復“C語言”,即可下載。我把學習C語言的路徑分成了4個階段,小菜雞、入門雞、進階機和老司機。這4個階段的學習過程中,要遵循一定的學習原則,我也總結了5個學習原則分享給大家,這樣才能保證質量又保證效率。一、小菜雞
首先是小菜雞,小菜雞指的就是純小白,作為一個小白呢,你要對計算機,對程序有概念。這部分可以看看日本作家寫的幾本計算機知識相關的科普書,《計算機是怎樣跑起來的》、《程序是怎樣跑起來的》,這兩本書對新手都非常友好。這些基本概念該怎么學習呢?下面說第二個學習原則:一定要有合適的練習題。什么是合適的練習題,合適的練習題有3個特點。一是有明確的訓練目的。比如說學習函數,那合適的練習題就會把練習重點放在函數的各個特征上,而不應該有其他的一些知識盲點。二是不應該需要花費太長時間。這個花費的時間應該剛剛好能夠使你保持專注,一旦失去專注力,浪費時間不說,還可能完不成練習。三是合適的練習題的難度應該是能夠稍稍高出你自身的水平。使你每次練習都有一點新的收獲,如果每次練習都在畫菱形、畫正方形,畫了也白畫。有了合適的練習題的訓練,你就會比較快的掌握基礎知識了。我建議這個階段快速突擊,小菜雞的階段不宜久留,宜速戰(zhàn)速決,1周時間搞定,最多2周。否則啊,學習很容易變得枯燥乏味,就會產生這玩意到底有沒有用啊,這種負面情緒。還是拿登山做舉例,小菜雞階段就是在山腳下聽老師講理論課,老師講了半天,登山鞋有哪些品牌,如何選擇,登山杖該怎么使用,登山時姿勢是什么樣,全身肌肉如何發(fā)力,遇到雨雪天氣怎么保暖,遇到山體滑坡怎么自救等等,一直講這些理論。你說我報名了登山運動練習班,光理論講了半年,學員當然要問,會選登山鞋到底和會不會登山有什么關系?學登山么,懂了最基礎的理論知識,就趕緊是騾子是馬拉出去溜溜了!先登個幾百、一千米看看,把登山實踐過程中遇到的問題點記錄下來,再翻書本找教練學習理論。學習編程語言也是一樣,懂了最基礎的之后,就可以做些與實際生活相關的小項目,遇到不會的再回頭學就可以。這里我插入第三個學習原則,叫做「最少必要知識」。就是說剛接觸一個領域,一門知識,先把最關鍵的那些知識學會,你就可以做些簡單的東西出來了,這時就應該盡快開始實踐,特別是那種需要動手的學科,沒有必要糾結要全學完再開始,而且有些高級的東西必須需要時間的積累才能理解,就算你學會了考試考過了,沒有時間打磨,那也是紙上談兵啊。所以我再強調一遍,小菜雞階段不宜久留,應當速戰(zhàn)速決,1周時間搞定,最多2周。得馬上做點有成就感,有滿足感的東西出來。
二、入門雞
所以,趕緊進入第二個階段,入門雞。這第二個階段的目的是在對編程有了一點初步認識之后,嘗試自我開發(fā)自己對編程的興趣。我建議用windows系統(tǒng)的接口做一些比較有趣、好玩的程序,比如我簡單列了幾個適合練手的小程序。我為什么推薦windows呢?一是因為windows的圖像界面編程是非常方便的,拖拖拽拽就能畫個界面出來,所見即所得很容易形成成就感;二是因為windows特別適合小白,它把程序背后編譯、鏈接等等在新手階段不需要了解的知識全部隱藏掉了,只要關注你的代碼就好。可以從最簡單的開始,比如說先彈出一個這樣的對話框,其實也沒有寫幾行代碼。但是這個東西就很有趣,就要比那種黑乎乎的命令行看著順眼的多對吧,你可以把這個程序發(fā)給你的同學,如果你同學只會寫楊輝三角,那你這簡直就是高了一個段位。這是什么?這不就是成就感嗎?我上學那會就對圖形界面很感興趣,我到現(xiàn)在依然記得第一次用windows編寫了一個最簡單的對話框的那種喜悅,我感覺我就是計算機的上帝,我讓他干嘛他就干嘛,這才叫編程嘛。我用C語言寫過一個音樂播放器,還用java寫過一個撲克牌游戲,當時真的是,課程設計都直接高分。圖形界面編程很容易激發(fā)一個人的興趣,俗話說,興趣是最好的老師,一旦你學習編程的興趣和熱情被點燃,那這興趣會驅動著你繼續(xù)學習下去,你會不斷完善你所編寫的代碼,直到它展現(xiàn)出你想要的樣子。在這些編程練習中,你會反復用到第一個階段學到的理論知識,遇到不會的,翻翻書,找找視頻馬上補上,這樣的練習有了理論指導會事半功倍。這個階段的時間長短呢,自己決定,如果越做越爽,也可以一直在這個階段玩下去。這里我再插入第四個學習原則,就是要自己給自己訂立目標。不能漫無目的的瞎學,要有個指引,訂立的目標最好是可以衡量的,不然你都不知道自己學沒學會。比如立下目標,要在3小時內學習5個C標準庫的接口。能夠知道在什么情況下用、并且會用5個接口就算達成了目標。再比如做個音樂播放器,要把一個音樂播放器做到什么樣的效果,有哪些功能,先從整體上考慮好,然后為了實現(xiàn)這些目標不斷完善,一旦達到了目標,就可以進入下一個目標了。三、進階機
那么下面是第三個階段,進階機。這個階段要學一些編程語言之外的東西。數據結構、算法、網絡的理論和實踐都該安排上了。數據結構可以先學些最基礎的,像棧啊、隊列啊、鏈表,他們的概念是什么,有什么區(qū)別和聯(lián)系,樹形結構比較難理解,看不懂可以先略過。簡單的算法也要懂一些,排序和查找是最常用的,必須要掌握。計算機網絡是整個互聯(lián)網行業(yè)網絡通信的理論基礎,也必須學,物理層、鏈路層可以不會,網絡層、傳輸層和應用層必須掌握最關鍵的幾個協(xié)議。最后,學習了這些理論知識還是要實踐,沒有實踐的理論就像是蓋在沙子上的碉堡,俗稱沙雕。如果你不想做沙雕,那就把代碼寫起來!這個階段該學習在linux上寫代碼了,畢竟在實際的工作中,基本沒有人在windows上用C語言開發(fā)程序。我覺得非常合適的一個練習項目就是網絡聊天軟件,像QQ一樣的,可以用linux寫服務端,用windows寫客戶端,這個過程中的練習會加深對操作系統(tǒng)的系統(tǒng)調用、數據結構、網絡這些知識的理解。而且網絡聊天軟件很有趣,做起來也沒那么枯燥,做好了之后發(fā)給你女神一個專屬客戶端,你們在你自己寫的軟件里聊天,邊聊天邊吹牛,豈不美哉!這個階段涉及不同課程的知識,應該花費比較長的時間。我建議代碼要一行一行的寫,就像飯要一口一口的吃,三連支持要邊看邊點。項目中每一行代碼都要搞明白什么意思,這樣你才能寫出健壯的、沒有bug的代碼。我在寫這個稿子的時候專門去找了一些開源的聊天軟件,沒有找到我想要的C語言的windows linux這樣組合的,并且適合新手的項目。不知道小伙伴們對這個學習路徑是否認可,對這樣的項目是否有興趣,我就大言不慚的在此立下一個flag,如果這篇文章的點贊數超過100,我就實現(xiàn)一套適合自學的代碼,分享給大家。四、老司機
那么接下來呢,就來到了C語言學習的最后一個階段:老司機階段。這個階段不再需要學習基礎知識,而是要開始向高手、向大師學習了。使用廣泛、經得起時間考驗的開源代碼是這個階段最好的學習資料,我列出了幾個網絡行業(yè)相關的C語言的開源項目,這也是我在工作中經常接觸到的項目。有JSON格式數據的解析庫cjson、最小的http服務器tinyhttpd、高性能的http服務器nginx,還有物聯(lián)網常用的傳輸協(xié)議mqtt,如果想學習tcp與udp的實現(xiàn),有個協(xié)議棧找叫l(wèi)wip,與linux內核的網絡協(xié)議棧相比,代碼量少了不是一星半點,非常適合學習。我不知道你是什么行業(yè),你所在的行業(yè)又有哪些著名的開源C項目,歡迎留言分享給大家!我相信它們都可以拿來做自學的材料。剛開始學習開源代碼肯定是一臉懵B的,你會驚呼,C語言還能這樣寫?你會懷疑,我眼前的代碼還是那個熟悉的C語言么。相信我,每個人都是這樣的,我總結了幾個學習源碼的方法也分享給大家,這個腦圖后面也有:首先要保證代碼是沒有錯誤可以直接運行的,不然一運行就出錯,就沒有辦法繼續(xù)下去;接著我們要先從整體上理解整個項目的功能是什么,它的輸入是什么,輸出是什么,先在頭腦里有個預期;在看代碼的時候可以只關注數據結構中最關鍵的字段和最關鍵的語句,與主干邏輯無關的代碼可以直接忽視掉。**進階機階段是學習的是怎么使用接口,老司機階段就是學習怎么實現(xiàn)接口了。能看明白開源代碼,能講明白實現(xiàn)原理,你就踏入了專家之路。end
好的,以上就是關于C語言的學習路徑了,總的來說,C語言簡單直接,非常容易上手,但想做到精通就沒那么容易了。不知道大家有沒有聽說一個「一萬小時定律」,是說只要你在一個領域投入超過10000小時的練習時間,你就會成為那個領域的專家。這就是我要說的最后一個學習原則,長期主義。其實10000個小時也沒有多遙遠,如果一天工作8小時,除去節(jié)假日,一年的工作時間有2000個小時,所以如果你一直在學習和使用C語言,并按照這個路徑和剛剛說的那些學習原則堅持下去,5年就會成為編程高手!不知道你聽了有什么感覺呢?歡迎留言說出你的故事。END來源:科巖成果,作者:科巖版權歸原作者所有,如有侵權,請聯(lián)系刪除。
▍






