(一)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++编程知识,成为一个优秀的程序员关注博主。

C/C++工程师需要掌握哪些技能?他们的工资这么高,是有原因的!相关推荐

  1. Linux 运维工程师的十个基本技能点

    Linux 运维工程师的十个基本技能点 本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧. 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. ...

  2. java工程师需要的技能_Java工程师需要掌握哪些技能?

    java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.正是由于Java的这两种特征让其在众多的编 ...

  3. 人工智能工程师需具备的技能_2020年软件测试工程师需要具备的技能--需要学什么--面试题有哪些(灵魂拷问)...

    一.2020年软件测试行业的现状 2020年开年,一不小心,[新冠]黑天鹅从头上飘过,持续影响全国乃至全球的经济,软件行业公司也迎来了不少的冲击,那么一直打算入行软件测试行业,或者已经在软件测试行业耕 ...

  4. JAVA软件工程师应该具备的技能有哪些?

    前言:有朋友问我:学历和能力哪个重要?我个人觉得能力大于学历,没有能力哪来的学历,学历只是证明能力的一方面.为此在能力方面畅谈java软件工程师必备的能力.作为一名合格的java工程师,不仅需要学历, ...

  5. 一个优秀的前端工程师应具备哪些技能?

    作为一名前端工程师,产品的内外兼优才能体现它的完美,前端工程师需要学习的技能远远超过设计师. 那么一名优秀的WEB前端工程师应具备哪些技能呢,我在这里分享一下,供大家参考: 第一:HTML超文本标记语 ...

  6. 高薪Java开发工程师需要掌握哪些技能?

    一般来说想要成为Java开发工程师,那么必然需要做好Java开发技术的掌握,不同级别的工程师,需要掌握的技能程度以及情况是不同的.那么高薪Java开发工程师需要掌握哪些技能? 高薪Java开发工程师需 ...

  7. 开课吧:全栈工程师的关键开发技能(硬实力)

    一般来说想要成为一名全栈工程师,熟练了解和掌握开发技能是必然的事情,那么全栈工程师的关键开发技能(硬实力)有哪些? Git/GitHub 把Git作为关键技能的第一条,是因为它不仅仅是一个代码管理工具 ...

  8. 2020年软件测试工程师需要具备什么技能--需要学哪些

    目录:导读 一.2020年软件测试行业的现状 二.2020年软件测试行业的趋势 三.只会功能测试的测试工程师已经是新时代的测试文盲 四. 测试行业的薪资在提高 五.那么2020年作为一名初级软件测试工 ...

  9. 爬虫工程师是干嘛的?Python爬虫工程师需要掌握哪些技能?

    一.爬虫工程师是干嘛的? 1.主要工作内容 互联网是由一个一个的超链接组成的,从一个网页的链接可以跳到另一个网页,在新的网页里,又有很多链接.理论上讲,从任何一个网页开始,不断点开链接.链接的网页的链 ...

  10. 高级软件工程师必备的五大技能

    具备什么样的素质的人才能成为一名高级软件工程师?作为高级软件工程师,你不仅要具备娴熟的技能,更重要的,还要具备与人合作的能力.只有能够领导和提升他人的软件工程师,才是真正的高级软件工程师.Israel ...

最新文章

  1. python快速编程答案-100+Python编程题带你快速上手(附答案)
  2. iOS Safari 中click点击事件失效的解决办法
  3. TableCellRenderer和TableCellEditor(一)
  4. 简洁的MobX与MVP思想—大型项目实践
  5. P2633-Count on a tree【主席树,LCA】
  6. 快速排序 挖坑_由浅入深玩转快速排序算法
  7. python颜色表_Python+matplotlib绘制不同大小和颜色散点图实例
  8. 【codevs2287】火车站,第一个A掉的钻石题(迟来的解题报告)
  9. Linux如何处理 Too many open files
  10. Android RadioButton 语言切换问题
  11. 创建华丽 UI 的 7条规则 第一部分 (2019年更新)
  12. matlab中删除照片_照片也有隐私,教你如何批量删除数码照片中的相机、光圈和地理位置等 EXIF 信息...
  13. php time of 0,PHP程序时出现 Fatal error: Maximum execution time of 30 seconds exceeded in 提示...
  14. 博途调试g120_【免费资料】西门子变频器调试软件汇总
  15. 电商系统——订单页面展示
  16. HTML5+CSS3基础
  17. Activity及其生命周期
  18. 《致加西亚的信》读后感
  19. 计算机视觉 — BOF图像检索
  20. 数据结构---散列表(哈希表)链地址法

热门文章

  1. python索引例子_Python实现带下标索引的遍历操作示例
  2. flux读取不到数据_初学flux的疑问?无法添加数据到DOM
  3. HTML列表标记符有哪些,在HTML中,表格标记符为( )
  4. 根据用户id查询菜单列表(菜单权限问题)
  5. C语言递归算法(一)
  6. Java陷阱(一)——ArrayList.asList
  7. 移动互联网数据安全蓝皮报告(2021年)
  8. Python——PrettyTable
  9. usb hub区分端口_树莓派上 USB 子系统拓扑浅析
  10. 测试两个主机之间的连通性_常用的光缆4种测试方法介绍