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