# 【NO.118】C++后台开发，以我之见

![img](https://pic3.zhimg.com/80/v2-7694bcb9180778650c4c8ab710df2562_720w.webp)

今天趁着过完春节快要回公司工作之际，也马上进入金三银四的时期，谈谈我个人对后台开发的一些个人见解，希望能够对在校的学生或者刚刚接触C++后台开发的同学有点帮助。

还记得自己在学校的时候，一直都比较注重的是：编程语言+数据结构与算法。没错，对于一个在校的计算机专业的学生，这是很重要的方面。但是，这往往不够，或许是因为毕业前一直没有进入企业实习，以至于自己在毕业之前，对自己未来的职业规划做得很不够，不知道自己以后会做什么方向，那时候比较宽泛且迷茫的定位是，只要是软件开发的工作，我都OK。毕业后，主要是从事C++后台开发，工作一段时间后，才知道自己擅长什么，对什么感兴趣。

## 1.**前端和后端，你喜欢什么？**

一提到前端，大家都会想到html+javascript+css，或许这是web前端的最最基本的东西了吧。我个人会将与用户直接打交道的端称为前端，除了前面所提到的传统意义上的前端，我还会把android和ios开发的app称为前端。现在前端各种框架的迭代速度相当的快，要跟上各种比较NB的框架的步伐，也不是那么简单的事情。虽然工作之后，没有做过前端方面的项目，更多的是与前端工程师FE合作，但是我知道，前端领域也有很多东西要学，而且前端的东西由于能自己直接看到开发结果，或许在工作中会很有成就感，所以永远不要觉得前端工程师做的事情没技术含量，萝卜青菜，各有所爱，任何一个领域，只要深入了，都很有技术含量，关键在于自己喜不喜欢，擅长不擅长。就我个人而言，更喜欢的是后端开发，主要原因是在学校的时候一直学的是C++，工作之后一直做的是后端的项目，没有直接参与前端的项目，既来之，则安之，既然上天给我分配了一个方向，我就应该在这个方向上做深入研究。

## 2.**后台开发是什么？**

我第一次听说过后台开发这个岗位是在腾讯的招聘网站上，有一个岗位叫后台开发。个人觉得，后台开发也很广，开发语言也很多，如：php，node.js，java，C/C++，go ，每一个公司都有自己主打的语言，如腾讯和百度的后端开发中，C++用的比较多，当然php也用得比较多，阿里和美团，java用得比较多。当然，语言只是一种实现工具而已，不能单一地认为那种语言好那种语言不好，没有最好，只有最适合。后台开发，是相对前端开发而言，个人觉得，所有跟前端直接交互的开发都可以认为是后台开发。企业里面，除了前端开发的岗位，就是后台开发了吗？当然不是。这也是我要说的，希望能够给在校的学生一点思考。在互联网公司里面，有美学功底非常好的UE工程师，他们常常会站在用户的角度进行审美，提高用户体验，能够在产品真正落地之前，做出各种demo；有市场调研和需求分析的产品经理PM，具有严密的逻辑思维和良好的沟通能力；有前面所提到的前端工程师FE，负责向后端发送用户提交的请求，并接收后端返回的结果，进行展示；有软件研发工程师RD，需要具备一定的研发能力和bug定位和修复，系统性能优化等能力；有测试开发工程师QA，上线前的最后把关；又做运维的OP，负责维护和监控线上的稳定；有做运营的，像双十一等大型的购物节，一般都需要强大的运营支持；有做大数据的，hadoop+spark+storm各种大数据框架；有做基础架构的；有做算法分析的。。。还有更多的职位。

## 3.**C++后台开发需要掌握什么？**

这个话题有点大，而且像我这种小菜，只能抛砖引玉。语言只是基础，不能一味地去研究语法糖。记得我在学校的时候，特别喜欢去研究语法糖，现在想想，浪费了很多时间。当然，作为C++后端的研发工程师，**你首先需要掌握C++的基础语法，需要掌握STL里面常用的库和算法**，如果你觉得这还不够，你可以去系统地学习下**boost库**，里面多STL里面所不具有很备的，看看C++11就知道了，里面很多新增的东西都是来自boost库。当然，仅仅掌握语言还远远不够，C++做后台开发时，模块跟模块直接除了通过lib库或so库的方式相互调用外，还有更多的是采用网络交互，这个时候，你就需要**掌握多线程编程和网络编程的基础知识，**当然，由于开发效率的需要，现在你不需要从零搭建一个网络服务框架，比如：ACE、boost的asio和libevent。当然现在已经有各种开源的RPC框架了，比如google-rpc，你可以通过调用本地函数来完成网络包的发送与接收，so easy！那么网络通信包的格式如何定义呢？客户端和服务端需要提前约定？数据交互格式，常用的包括：js**on、xml和protobuffer**，通常前端后后端交互会采用json，而后端各个模块的交互，你可以随便选择；对于HTTP协议的交互，我用的比较多的是json，而 tcp协议，我用的比较多的是protobuffer。当然，服务端的平台有很重要，国内后台开发，基本都是运行在Linux系统上，**所以你需要掌握Linux系统的常用的命令**，这样你才可以在Linux系统上运用自如，所以，如果你想从事或者即将从事C++后台开发，请暂时抛下VS下的C++学习，从现在开始，转向Linux平台下的C++开发，那里有**你要编译器GCC/G++，调试时用到的gdb，**如果你想依次性一个命令编译所有的文件，**请学习下如何编写makefile。**好了，有了编程语言，有了编译和调试方法，你就可以将你的应用程序放在你的Linux系统上监听客户端的请求了。如果某一天，你的程序出core了怎么办？你必须要学会如果找出bug，除了前面提到的gdb，在大型的应用里面，你必须要学会掌握如何追bug，这个时候，**你就要学会打日志**，并且分等级打印日志，这样**一出问题了你就能够快速定位问题的所在**。日志有了，程序也能正常跑了，那你怎么算你程序的性能或者收益呢？所以，**你需要学会编写脚本语言**，我个人**推荐你去掌握shell脚本和python脚本**，脚本语言能够一边执行一边编译，具有比较高的开发效率，不用你每次执行前编译，掌握了脚本，你不用再那么忙了，哈哈。

**提高自己的技术硬实力**。**技术的瓶颈是认知的问题，认知不是知其名，还需要知其因，更需要知其原。**这个话题更大，但是适合很多技术岗位。在工作中，你不能只跟项目中的业务逻辑打交道，那样你会觉得自己做的事情越来越没意思，越来越没技术含量。你应该**有一种开源的情怀**，你要找一个比较NB的开源软件，如 redis， zookeeper，nginx等，去阅读其中的源码，当然，你也可以将你写的一些库上传到gitlab上，让大家给你提建议，**相信开源让人进步**；你可以去gitlab上下载和学习各种有意思的开源库，这会给你带来更多的成就感。同时你要**学会利用各种资源来解决你所遇到的各种问题**，如segmentfault，stackoverflow等国外著名的网站。

原文链接：https://zhuanlan.zhihu.com/p/352365043

作者：[Hu先生的Linux](https://www.zhihu.com/people/huhu520-10)