腾讯以及各大厂的c++开发环境是啥样的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯以及各大厂的c++开发环境是啥样的?相关的知识,希望对你有一定的参考价值。

参考技术A

大厂的C++开发环境基本都是“MacBook Pro+远程Linux主机”“,或者直接在Linux上开发,至少在腾讯、百度、Google这些C/C++技术栈为主的企业,主要都是通过这种方式工作。编辑器方面基本上都是Vim为主,部分人也会用Emacs,不过这几年随着Visual Studio Code变得越来越受欢迎,在大厂里面也开始有很多人开始使用。

工具到底重要不重要?真的非常重要

大企业由于一些 历史 原因,导致了很多工具的使用已经成了固定的传承,就拿鹅厂来说,鹅厂之前用过SourceInsight作为主力开发工具,腾讯内部很多早期代码GBK,这个 历史 遗留问题直到现在还在困扰着腾讯的部分项目,大家也知道问题,不过想要彻底重构真的非常麻烦,工程量都是极大的,版本管理用过SVN,不过现在新的项目基本上也都是用Git管理。微信事业群也有正版的Clion这些工具供你使用,很多人也会用Vim、VS Code,不过本地基本上还是编辑器,大多数写好代码直接云端编译就好了。


Google可能是全世界最好的C++大厂了,这个不是吹的,如果你同时在Google、百度、腾讯这些大厂都工作过的话,你会发现Google为什么是这个星球上最牛的互联网公司,Google的代码规范就甩开很多大厂一个档次,Google的C++代码规范可能是这个星球上最好的代码规范了,没有之一。在Google你可以选择自己的办公电脑,一般台式机、笔记都会有。

Google并不会强制限制你用什么系统,但是Google有基于Debian定制Linux系统,很多人会用这套这是一个网络IDE,是的基于网络的,现在你应该明白为啥Google那么推崇Chrome下完成一切工作的原因了吧,因为他们自己连IDE都这么用。Linux,也有很多人用MacBook,用Windows系统的人也不再少数。大家写代码会用cider,也有很多使用Vim和Emacs的,甚至像贾扬清也说过,自己在Google就是用Sublime Text编辑器,总之选择会非常多样化,公司不会强制干涉。


工具真的非常重要,我非常不赞同很多人说,工具不重要,重要的是算法、重要的是数据结构,重要的是数学思维能力,我不否认内功的必要,但是有了好的内功,好的招数也非常重要,而开发工具就是你的武功招式。每个人不要去纠结别人怎么说,自己把主流的工具自己从头到尾试一下,最终选择一个自己顺手的工具就好,大体上来说大多数人的选择往往代表着一定的合理性。

好的工具能够极大地提高工作效率,不过我认为工具好与不好不是大众判定的,而是你自己用着顺手不顺手,不是说大多数人都喜欢的工具就一定是好的,得看每个人的使用习惯。就好比说我比较喜欢Emacs,不是很喜欢Vim,不代表Vim是更差的工具,这只是相对我而言,我更喜欢Emacs这个编辑器。

数学、算法、数据结构,这些基本功是修炼内功,不过光修炼内功也肯定不行,那么开发工作中这些编辑器、IDE、版本管理工具、以及编译器等等,都是你的工具,只有同时把内功和招数都练好了,你才能真正的无敌。

简单介绍下腾讯微信事业群后台开发环境。

微信事业群比较特殊,喜欢自己搞一套东西自己用,有些基础设施跟腾讯其他事业群的不太一样。

硬件:

现在通常是macbook pro + 远程Linux主机。远程主机方面当前已经舍弃了以前集体户式的开发机,每人拥有一台相对独立的云主机,我的配置是8核Xeon Gold + 16GB + 500GB,考虑到这台机绝大多数时间只是跑个编辑器,性能还是挺富余的。

软件:

版本控制: 目前基本都迁移到git了,以前是用svn。vim党基本都是直接用git命令,有些vs code的用户会在mac上用图形化的前端。

编译系统: 现在是基于bazel搞的一套东西,开发阶段编译代码时使用一条指令将本地代码diff发送到编译机来编译,这样可以共享很多中间文件,速度蛮快的。以前是在本地开发机编译,有些比较大的模块编一次几十分钟,而且编译吃掉太多cpu还会导致vim卡顿……

工具链: 用的是GCC那一套,由于后台服务都是微服务,每个小模块都可选使用gcc4或者gcc7构建,最近我写了个小模块用了c++17,就是用gcc7编译上线的。希望哪天可以支持clang,我比较喜欢clang的编译报错信息……

微信后台开发的一天(理想情况Orz): 其他一些碎碎念:

微信的后台开发环境一直有很多槽点,但也一直在改进,每年都能看到一些进步。现在还没解决的比较影响开发效率的应该就是代码的语义分析工具了。

目前大家写代码的环境都是没有精确的跳转和补齐能力的,考虑到大家的环境很不统一,估计也没什么动力统一去搞。由于微信的后台代码量非常非常大,如果暴力把所有代码都加到一个工程里,ycm之类的东西根本跑不动,按一下tab卡5分钟还不一定能缓过来(gdb的时候也是不怎么敢按tab的)。

后台C++项目都是基于bazel的BUILD文件管理依赖,总体上来说比较粗放,基本上每个新人刚来的时候都会折腾一下这个东西,试图搞定基于BUILD的补全方案,但最后性能和准确性上很难满足日常使用的需求。目前我的解决方案是用universal-ctags定期给常用目录下的文件生成tags,写代码的时候凭经验去跳。

在微信写业务非常傻瓜化,微信的微服务框架svrkit准备了一堆配套工具来生成代码,新起一个服务就是写一个protobuf文件,里面定义好接口,然后用这个文件生成整个服务的框架代码,再把业务逻辑填进去就好了。

微信的C++基础库里面大到消息队列,小到string的trim都有提供,写普通的业务代码需要什么功能基本都可以找到,完全就是堆积木,对普通的业务部门来说,面试造火箭入职拧螺丝一点都不夸张。

微信的开发最讨厌的事情有两个:一个是别人写的代码没有注释,另一个是自己写代码还要写注释。这造成了很多工具、功能、逻辑的细节都是口口相传,或者沉没在浩如烟海的km文章、邮件里。没事去看看别人的代码总会有惊喜……有时是惊吓。当然这一点最近也在慢慢改变,基础能力相关的组件开始开辟一些wiki、git issue之类的进行系统的介绍了。

离开项目运行场景来谈开发环境,没有一点意义。这主要还是看你的项目应用场景。选什么开发环境,如果项目组没有特殊要求,完全可以自行决定,只要你可以保证代码可以在公司统一的编译环境编译通过就OK了。下面谈谈最常见的Linux、Windows平台C++常用的开发工具。

1、Linux

如果产品最终在Linux平台运行,下面谈谈自己身边使用率最高的两种。

1)Vim

号称 编辑器之神 ,也许真的也就只有神一般的人才会坚持使用。身边很多老一辈的程序员对Vim的使用到了炉火纯青的地步,C++开发过程中配合智能提示杀手锏插件 YouCompleteMe ,这玩意配置好了,几乎可以达到IDE的高效。强大的快捷键功能让你专心投入代码。选择Vim的大部分都是直接在Linux平台进行开发。

2)SourceInsight

这里很多人都是在Windows平台开发,然后远程将代码上传到Linux环境进行编译。同步方式多种多样,有用samba挂载Linux开发的目录到Window上变成虚拟目录的,我比较习惯的是WinSCP,可以实现自动同步。

当然,现在很多人也会选择VSCode进行开发,毕竟这玩意跨平台支持,而且要比Vim好上手。

2、Windows

如果你的项目最终运行在Windows环境下,那么C++开发,当然是选择 宇宙第一IDE 了,VisualStudio系列当之无愧。最新版本的VS已经和Git无缝接合,而且支持CMake项目的创建,不仅支持Win项目的调试,更支持Linux远程调试。

最大的缺点可能就是安装包实在是太大了,最新版的安装包大小,仅仅勾选C++,就需要9.46G的空间,当然,现在都已经2021年了,我相信这么一点磁盘空间对你来说不是什么大事情。

最新版本的VS已经支持Mac平台了,不过目前尚不支持C++开发。

如果不是项目特殊需求,不建议再去选择VC6这样的老古董了。不支持C99新语法,C++11 更别提了。重要的事情说三遍, 千万不要用VC6.0!千万不要用VC6.0!千万不要用VC6.0!


腾讯不限制使用某一种编辑器,可按个人喜好自由选择。

看了上面的回答,腾讯C++开发环境仅仅用linux不可信。

首先早期的oicq以及之后的qq客户端都是基于windows平台的,没有linux平台应用场景(之前很长时间甚至linux版本的软件),不可能在linux上开发。

现在的微信软件,在androidios上运行,windows也有相关的客户端,应该是一套代码,在不同平台上编译。

微信和qq服务器考虑到并发和部署,应该是基于linux系统或者unix系统。

其它的 游戏 业务估计也差不多。

花式指针是啥样的?

【中文标题】花式指针是啥样的?【英文标题】:How does a fancy pointer look like?花式指针是什么样的? 【发布时间】:2017-04-18 12:24:56 【问题描述】:

C++ 参考文献提到了一个名为fancy pointers 的概念。我是从最近一个被严重否决且随后被删除的问题中了解到它们的存在的。

定义比较模糊:

当成员类型指针不是原始指针类型时,通常称为“花式指针”。

他们的用例示例是:

一个花哨指针的例子是与地址无关的映射 指针 boost::interprocess::offset_ptr,这使得可以 在共享内存中分配基于节点的数据结构,例如 std::set 和内存映射文件映射在每个不同的地址 过程。花式指针可以独立于分配器使用 通过类模板 std::pointer_traits 提供它们。

我不明白那个解释。创建精美指针的语法是什么?为什么在这种情况下我不能使用常规指针?

【问题讨论】:

当社区编辑出错时... 我的观点是任何像指针一样的东西,但不是。几乎所有迭代器都是自定义类类型,但它们的行为就像指针一样(有时存在限制,您无法执行指针支持的所有操作)。类似于指针的抽象是 fancy pointer. 另一个问题的核心是,unclear 关于被问及的内容(没有提及该术语的出现位置或上下文) .另外,我不会认为“花式指针”是一个常用术语。 @crashmstr 好吧,如果它在 C++ 参考中,这似乎很常见。 引入这个无意义的“术语”的编辑是here。我不知道该用户是在开玩笑还是在认真,但这种愚蠢已经够了。 【参考方案1】:

花哨的指针只是一个术语,用于表示类似指针但不是指针的东西。以迭代器为例。几乎所有迭代器都是自定义类类型,但它们的行为就像一个指针(有时存在限制,你不能执行指针支持的所有操作,因为它们不提供随机访问,但这是幻想的一部分。)

换句话说:像指针一样的抽象是一个花哨的指针

【讨论】:

以上是关于腾讯以及各大厂的c++开发环境是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

addSubview 方法是啥样的?

PHP全栈开发工程师需要一些啥样的技能

运行oracle数据库,对服务器硬件需求是啥样的

运行oracle数据库,对服务器硬件需求是啥样的

花式指针是啥样的?

它是啥样的 SQL? TODATE()、TOCHAR()、isdate 格式()