|
在当代信息技术大发展的背景下,仍然使用C++的领域,要么是信息系统底层的基础设施,要么是性能攸关的领域,这反而对C++开发人员提出了更高的要求。我注意到很多使用C++的开发人员并不是计算机专业出身(我是电力系统专业,大约超过50%以上电力的C++开发人员是非计算机专业)。即使是现在的计算机、软件工程专业的学生,所学的重点是课本知识,面向实战的C++开发经验也是缺乏的。本文主要目的是从初入工业级C++开发人员的角度出发,给出技术发展的建议。
首先,由于C++的领域已经偏向基础底层或嵌入式,从业人员更应该树立责任心。软件缺陷造成用户很大损失的,我知道的案例(电力方面)就不少于10次。任何完善的软件工程,都无法最终解决软件质量问题。《国富论》开篇就讲到分工对于效率提高的巨大作用,我完全赞同。但在软件工程领域,过度分工往往走向反面。把找bug的任务都交给测试人员,开发人员会出越来越多的bug;把工程实施全部交给现场工程人员,开发出的系统会越来越难部署;开发人员不去与现场与用户直接交流,开发的软件会越来越难用。C++往往在大系统里面是比较底层的任务,但开发人员不能只关注自己的局部任务,而要有系统观,要服务于自己任务的最终目的。
下面是进阶之路,我分为四个档次。
第一阶段是入门,这阶段刚完成了诸如《C++ Primer》等理论课程的学习,但缺乏实际经验。因此,首先是学习掌握项目的编程规范,当然还有版本管理等软件工程措施。谷歌公司的编程规范很值得参考,虽然具体有些条款是有争议的(比如说不让用异常,但我主要是做硬实时约束的高性能计算,也是赞同不用异常的)。有争议的条款需要项目负责人根据实际情况裁剪。
另外,掌握一些自动化工具有助于编程质量。例如cppcheck,这个软件可以指出许多低级的缺陷:例如单个参数的类构造函数会提示加explicit;未初始化的变量都会提示;传string作为函数参数,会提示传引用。虽然比较繁琐,但确实可以消除潜在的bug。还有Clang-Format自动格式化,这样团队所有人开发出的代码在基本格式上都是一致了。
第二阶段是对C++有更深入的认识。特别是对标准库有深入的理解,例如自己可以实现vector的代码,常见的算法也可以自己写一写,与标准库的实现对比对比。有些东西并不是那么显而易见的。比如我自己练习写includes,复杂度很容易写成O(nlog2n),其实标准库是线性复杂度。还有rotate,这个函数看起来简单,但要非常优化,需要数论方面的知识。还有sort函数,水就更深了。这一阶段非常适合阅读Scott Meyers的Effective系列书。
第三阶段是针对自己的工作领域,游刃有余,可以独立开展工作,是项目骨干。这一阶段,应该对内存布局很熟悉了,知道哪些东西在栈上,哪些在堆上,哪些在静态存储区。完全理解RAII的概念,可以熟练使用valgrind调试内存问题。还有针对自己的工作领域,掌握必备的工具。比如在电力系统分析方面。掌握高性能矩阵计算方面的库,以及拓扑分析方面的库。在界面开发方面,掌握Qt这样的库,等等。应具有设计方面的知识,领悟《设计模式》、《代码大全》等书。
第四阶段是对业务、计算机系统都有深入的理解,可以指导他人开展工作。在计算机系统方面,读完《深入理解计算机系统》这本书是绝对有必要的。掌握编译与链接的区别,CPU流水线的乱序,内存与缓存的关系,并发编程的底层机制等等。这一阶段应该可以开发底层或高性能的组件或框架给他人使用。在设计方面,要有所为更要有所不为,不能过度设计,为简单的功能设计过于复杂的框架。
在第四阶段之上其实还有更高的段位,但已经大大超过了我的能力,只能大概给一些描述:例如具有行业影响力,参与书籍编写、标准规范编制。带领实现的C++软件确实解决了生产的重大问题,产生很多效益等等。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-21 22:31
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社