打造工程友好型的C++项目

江湖上对于C++有一个很中肯的评价:“易用难学”,公认的上限高,实际工作中的C++项目乱象丛生。有多少工作多年的C++程序员不清楚C++的底层实现机制,模板为什么被称为编译时多态,以及多态的开销等等。

套一句职场俏皮话,你是否把一年工作经验纯熟地用了很多年?

正所谓:自己刨坑,自己埋。 所有入坑的小伙伴势必都有这样的感慨:C++,想说爱你真的不容易。

每天被混乱的项目按在地上摩擦到人们啊,你是否还在加班加点地写bug?同志们,这样的日子不能再过下去了,你需要一个工程友好型的C++项目

一个工程友好型的C++项目能给你带来些什么

从此翻身做主人,可以拍着胸脯和测试同事、产品经理说:“我搞定了!”

可以肉眼看到你的项目变得越来越好,越来越有序,而不是为了处理各种紧急情况,把项目改得面目全非,荒腔走板,复杂度炸天。

你终于可以,从每隔一段时间就把项目推到重来的魔咒中解脱出来。

怎样才能算得上一个工程友好型的工程

衡量标准只有一个,那就是是否有利于品控,品控,品控…

品控,保证每天能准点下班的武功秘籍。

那么工程友好型的项目有哪些要素呢?

  • 单元测试
  • 文档
  • 自动化

为啥是这三个呢?

理由很简单:反馈

如果你能坚持在项目里去做这三件事情,不糊弄的话,那么你会对你的项目有最直观的感受–舒适度

接口设计得不合理,写单元测试的时候贼费劲,方法名,参数哪哪都透着一股别扭。你会发现你搞错了次序,应该先写单元测,把标准整理出来,接口就自然清晰可见了,然后再去想里头的实现。

设计复杂度过高,你会发现你都讲不明白里头的机制,照着这个设计写文档,文档细碎繁杂且逻辑不通。

自动化就是开发的新基建,对生产效率起到决定性的作用。开发早就进入了现代化的时代,我们要跟进时代步伐,肩扛手挑的时代一去不复返,不能干逆历史潮流的事。

每个人每天的精力是个有限资源,把资源花在大量确定重复的事情上,那就只能接受996源源不断的福报了。

接受这些反馈,不断地去解决让你难受的问题,不断地改善你的项目,提高你的生产效率。

单元测试

大名鼎鼎的TDD很多人都知道,但做不到的也是大多数,典型的“知道很多道理,依旧过不好这一生”。

每天都是deadline,每天都有更高优先级的事情要做,你心里想做的,觉得应该做的事情,一次又一次地往后放。

怎么办,不怎么办,就是干!

这是个搏斗的过程,不是西风压倒东风,就是东风压倒西风。

要把单元测试正式纳入到开发中的一个环节,并且把它的功效发挥出来,体现它的价值,为它正名。

常见的C/C++单元测试框架: Google Test, Boost.Test, Catch2, Doctest等,任君选择。

IDE如:Clion,还支持了这些框架,可以独立运行某个单元测试,进一步提高生产效率。

那么如何写好单元测试呢?效仿一下知名UP主们的操作,先挖个坑,后面再安排😜。

文档

常言道:代码就是最好的文档,但是,各位童鞋,你们谁敢拍着自己的胸脯说,你是面向文档编程的?现实的情况是,一个好的文档,能给项目带来更强大的生命力,有利于让别人理解你在做的事情,正确地使用项目提供的功能,甚至出于相同的理念加入开发,壮大队伍。

这里需要隆重介绍文档神器:doxygen。

doxygen,历史悠久且功能强大,就是生成的html不好看。

我曾经因为颜值问题,试图去寻找doxygen的替代品,最后转了一圈回来,发现还是它的功能强大,我想要的东西都有(类图,搜索等)。

而其他一些流行的文档自动生成工具,或是在doxygen的输出的基础上添加功能,或是修改doxygen的样式,或是兼而有之。

最后,我改了一版doxygen的html样式。

doxygen很强大,但你还得会用啊,比如说:善用doxygen对markdown的支持,将unit test作为示例代码,文档友好程度立刻上升一个数量级。

自动化

上古时代,每一次的commit,push,publish,online,都是一场战斗。需要你提起十二万分的精神,曾经的成功并不能给当前的工作带来任何加速,相反,你依旧需要注意每一个细节,谨防踢到铁板。

一次又一次地战胜细节里的魔鬼,你会发现你就是个人肉脚本,当然,干得没有脚本好~

结合代码版本管理来做自动化,解放开发生产力。

有许多动作,都应该自动化,在你每次commit,push之后自动执行检查,更新,发布等等动作,一气呵成,行云流水。

把你的注意力放到解决问题本身,在这个过程中去锻炼解决问题的能力。

自动化初入投入或许很大,但是收益也是巨大的。一旦建成,当初的成本就一次次地被摊低,长期来说,是投入产出比非常高的一件事情。

你可以通过githook的action,bitbucket的pipeline,自建代码仓库的话可以使用githook对接Jenkins等,来完成项目的自动化工作流。

把编译、测试、发布,这些环节都纳入到自动化工作流中来。

重头戏来了,如何维持友好型项目

个人,靠习惯。

团队,靠文化。

在认同了以上几件事情的价值之后,你需要在实操中,不断地根据具体情况给出具体答案。

简而言之,你需要打造自己的最佳实践。友好的工程,简洁的代码风格,优雅的接口设计,不外如是。

具体的就先不展开了,这是个坑,深坑,深不见底。。。。🤣

操练起来

真的工程师敢于面对不断的挑战,敢于正视淋漓的翻车现场,上代码:https://github.com/lindadoudou/ProjectTemplate

这是一个C/C++项目的模板,包含了单元测试,文档生成,目前还包含了github的action。

抛砖引玉,欢迎批评指正。

最后,江湖再见。