作者:Kerr Wang
鏈接:https://www.zhihu.com/question/20730157/answer/82034823
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
首先,要學(xué)Linux編程综苔,你得會(huì)用Linux,也就是得在命令行環(huán)境下生存下來(lái)。什么叫生存下來(lái)呢竖慧?就是我現(xiàn)在給你一臺(tái)主機(jī),鍵盤(pán)逆屡,顯示器啥的圾旨,然后給你一個(gè)服務(wù)器版的Linux系統(tǒng)的光盤(pán)或者其他什么安裝盤(pán),你去把這臺(tái)主機(jī)用起來(lái)魏蔗。什么叫用起來(lái)呢砍的?你平常用Windows電腦干啥,你現(xiàn)在還用這臺(tái)電腦干啥莺治。新建文件啊廓鞠,查看文件,編輯文件谣旁,保存文件床佳,復(fù)制,移動(dòng)榄审,刪除砌们,打包,解壓,聯(lián)網(wǎng)浪感,下載個(gè)什么東西啊等等基本操作你得會(huì)昔头。還有軟件怎么安裝,不僅要熟悉apt-get和yum影兽,還有給你源碼的軟件怎么安裝你得會(huì)揭斧,另外要熟悉Linux下的文件系統(tǒng),每個(gè)目錄是干啥的峻堰,目錄下的文件是干嘛的讹开,插入一個(gè)U盤(pán),如何掛載這個(gè)U盤(pán)捐名,操作U盤(pán)下的文件你得會(huì)啊萧吠。這個(gè)看一本書(shū)就行了,《鳥(niǎo)哥的Linux私房菜-基礎(chǔ)篇》桐筏,記得是基礎(chǔ)篇纸型,記得安裝Linux系統(tǒng)自己操作一遍,還有一本是服務(wù)器篇梅忌,你既然是要學(xué)Linux編程開(kāi)發(fā)狰腌,那就不用看服務(wù)器架設(shè)篇了。做完這一步牧氮,你可以開(kāi)發(fā)了琼腔。
Linux下開(kāi)發(fā),兩種基本語(yǔ)言踱葛,C和C++咯丹莲,至于其他人要說(shuō)Python,Java尸诽,Ruby啥的不討論甥材,因?yàn)榫陀懻揕inux下的開(kāi)發(fā),什么是Linux開(kāi)發(fā)呢性含?就是利用Linux的API進(jìn)行開(kāi)發(fā)咯洲赵,首先你得會(huì)C語(yǔ)言或者C++語(yǔ)言啊,這個(gè)去看丹尼斯的《C程序設(shè)計(jì)語(yǔ)言》商蕴,注意是丹尼斯的叠萍,C++的就去看《Essential C++》或者《C++ Primer》,然后在Linux下的程序開(kāi)發(fā)绪商,Linux的API是遵循POSIX標(biāo)準(zhǔn)的苛谷,自行谷歌什么叫POSIX。Linux下程序開(kāi)發(fā)幾大塊格郁,文件操作腹殿,這個(gè)很重要独悴,你要知道Linux下的一個(gè)思想叫一切皆文件,可見(jiàn)文件讀寫(xiě)多重要了赫蛇。I/O模型,五大I/O模型雾叭,阻塞悟耘,非阻塞,復(fù)用织狐,信號(hào)驅(qū)動(dòng)和異步I/O暂幼,環(huán)環(huán)相扣絲絲相連,概念和操作都要仔細(xì)琢磨移迫,最重要的當(dāng)屬?gòu)?fù)用旺嬉,就是select,poll和epoll厨埋,面試筆試就問(wèn)這個(gè)東西邪媳,要知道他們的適用范圍和優(yōu)缺點(diǎn)。進(jìn)程和線程荡陷,包括進(jìn)程和線程的概念和區(qū)別雨效,進(jìn)程和線程的建立,同步废赞,通信徽龟,互斥等等。網(wǎng)絡(luò)編程唉地,就是socket編程,Linux編程据悔,這個(gè)學(xué)不好等于啥都沒(méi)學(xué),這個(gè)估計(jì)還得了解一下TCP/IP協(xié)議耘沼,編程方面主要是那幾步极颓,申請(qǐng)socket,bind群嗤,listen讼昆,accept幾步,要熟悉種常見(jiàn)的服務(wù)器模型骚烧,進(jìn)程池線程池方式的浸赫,多進(jìn)程方式的,復(fù)用方式的赃绊,最重要的是復(fù)用方式的既峡,這部分可以先只寫(xiě)服務(wù)器,測(cè)試直接用Telnet就好了碧查,加快速度么运敢。其余的就是數(shù)據(jù)庫(kù)校仑,這個(gè)東西不屬于Linux,但是還得會(huì)传惠,要不然啥都做不了迄沫,看那本《MySQL必知必會(huì)》,當(dāng)然深入的話還得找本專(zhuān)業(yè)的書(shū)細(xì)細(xì)看卦方。這個(gè)時(shí)候就可以真刀真槍的去干點(diǎn)有意思的事了羊瘩,比如寫(xiě)個(gè)終端下的類(lèi)似于QQ的軟件啊,包括服務(wù)器和客戶端啊盼砍,慢慢的增加并發(fā)數(shù)尘吗,比如可以同時(shí)支持五千人在線啊,文件傳輸啊等等浇坐。然后學(xué)學(xué)Qt睬捶,熟悉一下圖形界面,可以把你的終端下的QQ完全改成圖形界面下的近刘。估計(jì)到這個(gè)時(shí)候擒贸,你差不多在Linux下進(jìn)行像樣的開(kāi)發(fā)了吧。在這個(gè)過(guò)程的學(xué)習(xí)中觉渴,相信你已經(jīng)學(xué)會(huì)Makefile的編寫(xiě)啊酗宋,編譯啊,鏈接啊等等一些細(xì)枝末節(jié)的東西了疆拘,還得反思一下把零散的東西串一串蜕猫,要系統(tǒng)化。
接下來(lái)就是繼續(xù)深入了哎迄,Linux為什么這么多人用回右,好處在哪里,你得去稍微的看看內(nèi)核源碼啊漱挚,內(nèi)核的進(jìn)線程調(diào)度啊翔烁,我告訴你,Linux內(nèi)核的一個(gè)鏈表都?jí)蚰阊芯亢脦坠?jié)課的旨涝。哦蹬屹,這個(gè)時(shí)候,數(shù)據(jù)結(jié)構(gòu)啥的又得翻出來(lái)加強(qiáng)一下了不是白华,計(jì)算機(jī)網(wǎng)絡(luò)啥的也得看看慨默,操作系統(tǒng)原理啥的也得看看呢不是,把這些東西放在這里是合適的弧腥,前面讓你知其然厦取,知道怎么編程怎么做,現(xiàn)在要知其所以然了不是管搪。
在學(xué)習(xí)的過(guò)程中虾攻,要不斷積累和了解最新的東西铡买,最起碼要知道個(gè)概念,比如分布式霎箍,大數(shù)據(jù)奇钞,云計(jì)算,機(jī)器學(xué)習(xí)漂坏,計(jì)算機(jī)視覺(jué)景埃,JIT等等,形成知識(shí)鏈樊拓,這樣不會(huì)導(dǎo)致你最后不知道學(xué)啥纠亚。有個(gè)建議塘慕,一定要學(xué)一下Python筋夏,一定要學(xué)一下Python,一定要學(xué)一下Python图呢,重要的事情說(shuō)三遍条篷。它能極大的提高你的工作效率,也能和C/C++結(jié)合在一起用蛤织,很nice的語(yǔ)言赴叹。
最后推薦幾本書(shū)(前面的包含在內(nèi)):
《鳥(niǎo)哥的Linux私房菜 基礎(chǔ)篇》
《C程序設(shè)計(jì)語(yǔ)言》 丹尼斯寫(xiě)的
《Linux C編程一站式學(xué)習(xí)》 宋勁杉寫(xiě)的
《Eensstial C++》
《C++ Primer》
《Effective C++》
《Linux網(wǎng)絡(luò)編程》 宋勁彬?qū)懙?/p>
《Unix環(huán)境高級(jí)編程》
《Unix網(wǎng)絡(luò)編程》 兩部
《Linux高級(jí)程序設(shè)計(jì)》 華清遠(yuǎn)見(jiàn)的
《MySQL必知必會(huì)》
《數(shù)據(jù)庫(kù)系統(tǒng)概念》
《大話數(shù)據(jù)結(jié)構(gòu)》
《算法導(dǎo)論》
《Linux內(nèi)核情景分析》
《深入理解Linux內(nèi)核》
《深入理解計(jì)算機(jī)系統(tǒng)》
《現(xiàn)代操作系統(tǒng)》
《深入理解計(jì)算機(jī)網(wǎng)絡(luò)》
《TCP/IP》的三卷經(jīng)典書(shū)
廖雪峰的Python學(xué)習(xí)網(wǎng)站
另外各大論壇,stackoverflow指蚜, 博客園乞巧,CSDN等等,多逛逛摊鸡,當(dāng)然還有知乎也要多逛逛绽媒。差不多就這么多了吧,前文列舉的東西免猾,只要完成一半是辕,估計(jì)就不用我教你學(xué)了,你自己應(yīng)該知道自己該學(xué)啥了……有時(shí)間在更猎提,估計(jì)是沒(méi)時(shí)間了……
1月20日更:
之前有一點(diǎn)忘記寫(xiě)了获三,一定要學(xué)習(xí)一款版本管理工具,首先要了解一下什么是版本管理锨苏。然后選擇一款版本管理工具疙教,這個(gè)很重要。目前常用的是git和svn伞租,就用git就好了松逊,當(dāng)然你要去用svn那也行。還是建議用git肯夏,看廖雪峰的git教程就好经宏。