CC++⼯程师需要掌握哪些技能?他们的⼯资这么⾼,是有原
因的!
(⼀)C语⾔
作为⼀名C程序员,熟练掌握C语⾔是最基本的⼀项技能。关于如何学好C语⾔,以及C语⾔话题的讨论,⽹上有很多经典的⽂章。很多⼈⼯作⼀段时间以后都⾃认为⾃⼰的C语⾔⽔平已经很⾼了。可实际在⼯作中,接触的东西也多了,开源项⽬多了以后,才发现⾃⼰的C语⾔能⼒太⼀般了。宏函数千变万化的写法,指针百花缭乱的⽤法…等等。写代码时,应常常问⾃⼰:这个⾏为是C语⾔规范定义的吗?如果是,是C89还是C99?我现在⽤的编译器⽀持吗?如果不是C语⾔规范定义的,那么在程序运⾏的这个平台,⾏为是确定的吗?所以建议⼤家平时可以多想想这些问题,查查资料,相信⼀定会对C语⾔有更深的理解。
(⼆)UNIX/Linux系统编程
在UNIX/Linux系统上开发程序,掌握系统编程API是必不可少的技能。⽽这⽅⾯的经典书籍都是⼀些⼤部头的英⽂著作,让⼈望⽽⽣畏。⾸先可以先⼀本⼝碑不错的中⽂书先看⼀下,了解⼀下都有哪些种类的API。这样以后⽤到时,再去精读经典英⽂著作⾥的相关章节,或是查man⼿册。此外,如果有时间,
可以学习⼀下经典的开源项⽬,了解这些开源项⽬是如何使⽤这些API的。举个例⼦,Redis是很多⼈推荐的⼀个很不错的学习C语⾔的开源项⽬。在阅读代码时,会看到保存数据到⽂件时会⽤到fsync函数,再去深⼊地了解⼀下这个函数的作⽤。这样⽐单纯地去看那些著作效果要好很多。
(三)⽹络编程及相关知识
关于⽹络⽅⾯,以下三点是必会的技能:
a)⽹络协议。在⽇常的⼯作中,⼤家接触和使⽤最多的⽆疑是TCP/IP协议族。此外,由于⼯作领域不同,也可能⽤到其它的协议。⽐⽅说,做电信相关的程序开发,平时可能接触SCTP协议会更多⼀些。对于这些协议,掌握最基本的知识是必须的,其它的边边⾓⾓知识可以等到⽤时再查。举例来说,TCP协议的“三次握⼿”,“四次挥⼿”,“TIME-WAIT状态”这些基本的知识点要弄明⽩,其它的边⾓知识学完⽼不⽤忘得也快,还是⽤时google⼀下效率更⾼。
b)Socket编程。Socket编程的经典书籍⼀点不⽐讲系统编程的书薄,所以可以选⼀本相对薄点,⼝碑不错的精读⼀下,这样基本就掌握的百分之五、六⼗了。另外有时间还是看⼀下经典的开源代码。这⾥还拿Redis举例,Redis⾥关于处理⽹络连接和通信的代码量不⼤,⽽且基本涵盖了所有常见的UNIX平台,看完以后⼀定受益匪浅。
c)协议分析⼯具。TCPdump、snoop(Solaris平台⼯具)、wireshark等这些⼯具不仅能帮助我们抓取数据包,还能分析数据包,这对debug⽹络程序有⾮常⼤的帮助。所以,我们⾄少要掌握这些⼯具最常⽤的功能。此外,对于开放源代码的⼯具,我们更是可以从代码中学到很多知识。举例来说,做短信相关的项⽬,可以从wireshark的分析短信协议的代码⾥学到很多东西,这可以帮助开发者对短信协议有了更清晰的理解。
(四)脚本编程能⼒
⼀提到脚本编程,⼤家⾸先想到的可能就是Bash shell脚本编程了。不错,在Unix/Linux上,Bash shell也许就是⽤的最⼴泛的脚本编程语⾔。应⽤开发⼯程师主要⽤Bash shell做两个⽅⾯的⼯作:a)⽤于编写监控服务脚本;b)写⼀些简单的单元测试脚本,⽐如循环发⼀些命令,等等。但是Bash shell的功能远远要⽐这些强⼤。⼀些⾼⼿⽤Bash shell编程语⾔写出了很好玩的游戏,也有⼈做出了很cool的⽹络应⽤。所以建议⼤家有兴趣可以多了解⼀下Unix/Linux的这层“壳”。当然,你也可以选择学习Python、Perl、Ruby等。不过相⽐这些语⾔,Bash shell⾄少你不⽤⾃⼰去安装,⽽且它能做的事同样很强⼤。
(五)操作系统及CPU体系结构
也许有⼀天,你会碰到这样的情景:你的程序在Solaris上会发⽣core dump,在Linux上却运⾏的好好的。经过⼀番艰苦的debug,最后得到的原因是两种操作系统对线程的调度策略不⼀样,这会使⼀个对全局变量没有加锁就访问的bug在Linux上很难出现。所以你需要尽可能地去了解你使⽤的操作系统,这样⽆论对写程序还是debug都会有很⼤的帮助。⽐如,你需要了解进程的内存布局,这样你就知道栈和堆到底在内存的哪段空间,为什么内存写越界有时会core dump,有时没事。
除了操作系统,了解CPU的体系结构也是⼀门必修课。⽐⽅说,SPARC CPU要求字节对齐,⽽X86 CPU则没有这个要求。⼜⽐如SPARC CPU是⼤端模式,⽽X86 CPU是⼩端模式,这就要求你对像位域这样的定义要格外⼩⼼。你还要了解你使⽤的CPU的汇编语⾔,⾄少能⼤概看懂。因为有些时候,当你从C代码中不出bug的原因时,就需要你“透过现象看本质”,从汇编代码层⾯看看到底发⽣了什么。
(六)编译器和调试器
“⼯欲善其事,必先利其器”。编译器负责把源代码⽣成可执⾏⽂件,⽽调试器则是在程序出现bug时,⽤来“降妖除魔”的不⼆神器。以⼤家最熟悉的gcc和gdb为例⼦。
gcc有很多编译选项,除了要熟悉像-O,-g这些最基本的选项,建议⼤家可以多了解⼀些其它不常见的选项。因为这些选项很可能帮助我们到程序的⼀些bug。举个例⼦,在⽐较新的gcc版本⾥,增加了-fstack-protector这个选项,⽽它可以帮助我们检查到缓冲区溢出这种bug。此外,你还可能碰到这种情况,⼀个bug总是发⽣在程序优化后的版本,⽽不会出现在没经过优化的版本。所以,多了解你的编译器,你就可以更好地了解你的程序是如何⽣成的。
⼀个程序员不可能不碰到bug,⽽这个时候,调试器就是最好的⼯具。可以说,在遇到bug时调试技巧和⼿段是否丰富是衡量⼀个程序员的能⼒和⽔平的重要参考。除此以外,gdb另⼀个重要⽤途就是分析程序的core dump⽂件。程序的core dump⽂件好⽐⼀桩刑事案件
的“犯罪现场”,⽽gdb则是刑侦官员⽤来在现场提取线索的⼯具。对gdb越熟悉,就越能从core dump⽂件提取有价值的信息,也就越有助于我们定位到程序bug的“root cause”。
游戏开发工程师需要学什么(七)DTrace/SystemTap
DTrace是由Sun的⼏位才华横溢的⼯程师开发的,最开始只⽀持Solaris操作系统,现在FreeBSD和Mac OS X也都⽀持了。Linux上类似的⼯具有SystemTap,也有⼈把DTrace移植到Linux上,不过效果似乎并不好。简单地说,DTrace可以⼏乎不会在对整个系统有任何性能影响下,让你了解你的程序所发⽣的⼀切。这对分析程序的热点(“Hot spot”),了解程序的执⾏流程,定位程序bug都有很⼤的帮助。有些时候,DTrace可能是你唯⼀的⼯具。举例来说,有个程序只发⽣在⽣产环境,⽽在实验室环境⽆法复现(当然,理论上任何bug都可以复现,只是我们没有到复现条件。)。你不可能在你怀疑的代码打上断点,然后⽤gdb去调试。这时你只能借助于DTrace,通过它去了解程序到底是如何运⾏的,当时的变量值是什么。此外,DTrace还可以帮你了解操作系统的kernel,这会满⾜很多geek的好奇⼼。
希望你有⼀天也能成为优秀的C/C++⼯程师,共勉!
学习C/C++编程知识,成为⼀个优秀的程序员关注博主。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。