(一)C語言
作為一名C程序員鱼鸠,熟練掌握C語言是最基本的一項技能。關于如何學好C語言羹铅,以及C語言話題的討論蚀狰,網(wǎng)上有很多經(jīng)典的文章。很多人工作一段時間以后都自認為自己的C語言水平已經(jīng)很高了职员÷樘#可實際在工作中,接觸的東西也多了焊切,開源項目多了以后扮授,才發(fā)現(xiàn)自己的C語言能力太一般了芳室。宏函數(shù)千變?nèi)f化的寫法,指針百花繚亂的用法…等等刹勃。寫代碼時堪侯,應常常問自己:這個行為是C語言規(guī)范定義的嗎?如果是荔仁,是C89還是C99伍宦?我現(xiàn)在用的編譯器支持嗎?如果不是C語言規(guī)范定義的乏梁,那么在程序運行的這個平臺次洼,行為是確定的嗎?所以建議大家平時可以多想想這些問題遇骑,查查資料卖毁,相信一定會對C語言有更深的理解。
(二)UNIX/Linux系統(tǒng)編程
在UNIX/Linux系統(tǒng)上開發(fā)程序落萎,掌握系統(tǒng)編程API是必不可少的技能亥啦。而這方面的經(jīng)典書籍都是一些大部頭的英文著作,讓人望而生畏练链。首先可以先找一本口碑不錯的中文書先看一下禁悠,了解一下都有哪些種類的API。這樣以后用到時兑宇,再去精讀經(jīng)典英文著作里的相關章節(jié)碍侦,或是查man手冊。此外隶糕,如果有時間瓷产,可以學習一下經(jīng)典的開源項目,了解這些開源項目是如何使用這些API的枚驻。舉個例子濒旦,Redis是很多人推薦的一個很不錯的學習C語言的開源項目。在閱讀代碼時再登,會看到保存數(shù)據(jù)到文件時會用到fsync函數(shù)尔邓,再去深入地了解一下這個函數(shù)的作用。這樣比單純地去看那些著作效果要好很多锉矢。
(三)網(wǎng)絡編程及相關知識
關于網(wǎng)絡方面梯嗽,以下三點是必會的技能:
a)網(wǎng)絡協(xié)議。在日常的工作中沽损,大家接觸和使用最多的無疑是TCP/IP協(xié)議族灯节。此外,由于工作領域不同,也可能用到其它的協(xié)議炎疆。比方說卡骂,做電信相關的程序開發(fā),平時可能接觸SCTP協(xié)議會更多一些形入。對于這些協(xié)議全跨,掌握最基本的知識是必須的,其它的邊邊角角知識可以等到用時再查亿遂。舉例來說浓若,TCP協(xié)議的“三次握手”,“四次揮手”崩掘,“TIME-WAIT狀態(tài)”這些基本的知識點要弄明白,其它的邊角知識學完老不用忘得也快少办,還是用時google一下效率更高苞慢。
b)Socket編程。Socket編程的經(jīng)典書籍一點不比講系統(tǒng)編程的書薄英妓,所以可以選一本相對薄點挽放,口碑不錯的精讀一下,這樣基本就掌握的百分之五蔓纠、六十了辑畦。另外有時間還是看一下經(jīng)典的開源代碼。這里還拿Redis舉例腿倚,Redis里關于處理網(wǎng)絡連接和通信的代碼量不大纯出,而且基本涵蓋了所有常見的UNIX平臺,看完以后一定受益匪淺敷燎。
c)協(xié)議分析工具暂筝。TCPdump、snoop(Solaris平臺工具)硬贯、wireshark等這些工具不僅能幫助我們抓取數(shù)據(jù)包焕襟,還能分析數(shù)據(jù)包,這對debug網(wǎng)絡程序有非常大的幫助饭豹。所以鸵赖,我們至少要掌握這些工具最常用的功能。此外拄衰,對于開放源代碼的工具它褪,我們更是可以從代碼中學到很多知識。舉例來說翘悉,做短信相關的項目列赎,可以從wireshark的分析短信協(xié)議的代碼里學到很多東西垛贤,這可以幫助開發(fā)者對短信協(xié)議有了更清晰的理解。
?關于怎么快速學C/C++游戲編程黍聂,有什么方法腹纳,這個問題,想必大家都已經(jīng)心中有數(shù)了诗越,打算深入了解這個行業(yè)的朋友砖瞧,可以加下小編上面的C/C++游戲編程學習裙【五 八 八,零 九 零嚷狞,九 四 二】块促,不管你是小白還是大牛,小編我都歡迎床未,不定期分享干貨竭翠,包括小編自己整理的一份2018最新的C/C++資料和0基礎入門教程,歡迎初學和進階中的小伙伴薇搁。
(四)腳本編程能力
一提到腳本編程斋扰,大家首先想到的可能就是Bash shell腳本編程了。不錯啃洋,在Unix/Linux上传货,Bash shell也許就是用的最廣泛的腳本編程語言。應用開發(fā)工程師主要用Bash shell做兩個方面的工作:a)用于編寫監(jiān)控服務腳本宏娄;b)寫一些簡單的單元測試腳本问裕,比如循環(huán)發(fā)一些命令,等等孵坚。但是Bash shell的功能遠遠要比這些強大粮宛。一些高手用Bash shell編程語言寫出了很好玩的游戲,也有人做出了很cool的網(wǎng)絡應用卖宠。所以建議大家有興趣可以多了解一下Unix/Linux的這層“殼”窟勃。當然,你也可以選擇學習Python逗堵、Perl秉氧、Ruby等。不過相比這些語言蜒秤,Bash shell至少你不用自己去安裝汁咏,而且它能做的事同樣很強大。
(五)操作系統(tǒng)及CPU體系結(jié)構(gòu)
也許有一天作媚,你會碰到這樣的情景:你的程序在Solaris上會發(fā)生core dump攘滩,在Linux上卻運行的好好的。經(jīng)過一番艱苦的debug纸泡,最后得到的原因是兩種操作系統(tǒng)對線程的調(diào)度策略不一樣漂问,這會使一個對全局變量沒有加鎖就訪問的bug在Linux上很難出現(xiàn)。所以你需要盡可能地去了解你使用的操作系統(tǒng),這樣無論對寫程序還是debug都會有很大的幫助蚤假。比如栏饮,你需要了解進程的內(nèi)存布局,這樣你就知道棧和堆到底在內(nèi)存的哪段空間磷仰,為什么內(nèi)存寫越界有時會core dump袍嬉,有時沒事。
除了操作系統(tǒng)灶平,了解CPU的體系結(jié)構(gòu)也是一門必修課伺通。比方說,SPARC CPU要求字節(jié)對齊逢享,而X86 CPU則沒有這個要求罐监。又比如SPARC CPU是大端模式,而X86 CPU是小端模式瞒爬,這就要求你對像位域這樣的定義要格外小心弓柱。你還要了解你使用的CPU的匯編語言,至少能大概看懂疮鲫。因為有些時候吆你,當你從C代碼中找不出bug的原因時弦叶,就需要你“透過現(xiàn)象看本質(zhì)”俊犯,從匯編代碼層面看看到底發(fā)生了什么。
(六)編譯器和調(diào)試器
“工欲善其事伤哺,必先利其器”燕侠。編譯器負責把源代碼生成可執(zhí)行文件,而調(diào)試器則是在程序出現(xiàn)bug時立莉,用來“降妖除魔”的不二神器绢彤。以大家最熟悉的gcc和gdb為例子。
gcc有很多編譯選項蜓耻,除了要熟悉像-O茫舶,-g這些最基本的選項,建議大家可以多了解一些其它不常見的選項刹淌。因為這些選項很可能幫助我們找到程序的一些bug饶氏。舉個例子,在比較新的gcc版本里有勾,增加了-fstack-protector這個選項疹启,而它可以幫助我們檢查到緩沖區(qū)溢出這種bug。此外蔼卡,你還可能碰到這種情況喊崖,一個bug總是發(fā)生在程序優(yōu)化后的版本,而不會出現(xiàn)在沒經(jīng)過優(yōu)化的版本。所以荤懂,多了解你的編譯器茁裙,你就可以更好地了解你的程序是如何生成的。
一個程序員不可能不碰到bug势誊,而這個時候呜达,調(diào)試器就是最好的工具∷诔埽可以說查近,在遇到bug時調(diào)試技巧和手段是否豐富是衡量一個程序員的能力和水平的重要參考。除此以外挤忙,gdb另一個重要用途就是分析程序的core dump文件霜威。程序的core dump文件好比一樁刑事案件的“犯罪現(xiàn)場”,而gdb則是刑偵官員用來在現(xiàn)場提取線索的工具册烈。對gdb越熟悉戈泼,就越能從core dump文件提取有價值的信息,也就越有助于我們定位到程序bug的“root cause”赏僧。
(七)DTrace/SystemTap
DTrace是由Sun的幾位才華橫溢的工程師開發(fā)的大猛,最開始只支持Solaris操作系統(tǒng),現(xiàn)在FreeBSD和Mac OS X也都支持了淀零。Linux上類似的工具有SystemTap挽绩,也有人把DTrace移植到Linux上,不過效果似乎并不好驾中。簡單地說唉堪,DTrace可以幾乎不會在對整個系統(tǒng)有任何性能影響下,讓你了解你的程序所發(fā)生的一切肩民。這對分析程序的熱點(“Hot spot”)唠亚,了解程序的執(zhí)行流程,定位程序bug都有很大的幫助持痰。有些時候灶搜,DTrace可能是你唯一的工具。舉例來說工窍,有個程序只發(fā)生在生產(chǎn)環(huán)境割卖,而在實驗室環(huán)境無法復現(xiàn)(當然,理論上任何bug都可以復現(xiàn)移剪,只是我們沒有找到復現(xiàn)條件究珊。)。你不可能在你懷疑的代碼打上斷點纵苛,然后用gdb去調(diào)試剿涮。這時你只能借助于DTrace言津,通過它去了解程序到底是如何運行的,當時的變量值是什么取试。此外悬槽,DTrace還可以幫你了解操作系統(tǒng)的kernel,這會滿足很多geek的好奇心瞬浓。