Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
136 lines (71 sloc) 17.3 KB
layout title date categories
post
腾讯实习总结
2018-09-01 09:00:05 +0800
总结

In short

很遗憾没有拿到留用 offer,办公环境真是好,福利超级棒,人很 Nice,思想很活跃,技术栈有点老和闭源,关注理财。

Main

我实习的时间不长,看到的东西比较片面,就像苏格兰黑山羊。

到腾讯实习后,才知道一面面试官是搞数据挖掘和分析的,二面面试官是客户端大佬,而我应聘的岗位是后台开发。我一直在想如果他们不从事后台开发,他们面试我的标准是什么呢?他们为什么觉得我能胜任后台开发的工作呢?或者对实习生,招聘要求没有那么高。

工作所在组:IEG ==> 增值服务部 ==> 营销服务与应用中心 ==> 接口开发组。

事业群 IEG 是负责互娱方面的,包括游戏开发、腾讯动漫等主营业务。

增值服务部主要负责游戏的公共部分的开发,比如数据分析、游戏公共主件的开发、游戏接口封装等,可以理解为部门是为其他游戏服务的,帮助游戏开发和运营。

营销服务与应用中心主要有几个核心业务,游戏公共活动主件开发、游戏接口开发、登陆功能与关系链等【游戏内比较公共常见的功能】、帮助游戏快速出海、充值平台、实名认证、防沉迷等。

接口开发组是提供游戏接入平台,避免其他业务重复性地对接游戏,提供游戏一致的访问协议和接口,其中组内还曾经维护着防沉迷系统和充值系统。

每个组的人都不多,我所在组加上我就 8 人,其中真正从事技术方面工作的也就 6 人,因为维护的系统已经相当稳定,会接其他的组的任务和部门新下发的项目。给我第一印象就是组内的后台开发工程师是通过 ssh 连接到跳板机,然后通过 vim 编辑器写代码的,日常开发工作中几乎不接触图形界面,顿时感觉自己虽然用着 ubuntu,但是平时通过 IDE 写代码的有点菜,在后来的项目中我也见识到他们快速开发的能力是多么的强,对所使用的技术、框架是多么的了解。

Q&A

我问了组里和部门同事几个关于技术的问题:

  1. 问:为什么开发用的技术有点老?

使用什么技术实现不是最关键的,关键是程序最终要达到项目指标,比如并发量、延时等,一般项目对使用什么具体的技术栈,可以由开发者自定义,但是引入新技术的过程中,如果出了什么岔子,可是要负责任的,除非对新引入的技术非常了解和该技术已经得到外界的认可,不然不会随意引入新技术。做后台最关键的是架构、存储怎么做到可靠、服务的可靠性怎么保证、线上出了问题能不能快速定位并解决。如果线上业务出了问题,而且还有很多用户在访问,怎么通过各种技术手段、工具定位问题,日常使用的框架每一行代码要有熟练了解,并且可以通过日志快速追踪到问题。所以他们一般选择最稳定的解决方案,而这个解决方案可能是已经使用了好几年的,经过多次项目考验的。如果线上业务出了问题 5 分钟内不能定位问题、10 分钟内不能解决,那么问题就很严重了。

  1. 问:日常在服务器终端开发,怎么进行调试?

GDB 等调试工具效率并不高,比较好的方式是使用日志追踪执行流信息。

在导师给我安排的实习计划中,有一项任务就是学习 GDB,比如临时 attach 到一个进程进行调试等。

  1. 问:有没有计划改技术栈?

没有这个必要,现在使用的技术从外界看来可能有点断层,但是确实非常稳定,对于老员工来说这些技术比外界使用的新技术好,而且开源代码有可能面临无人维护等问题,比如发现了一个 bug 或者发现了框架的性能热点,如果直接给开源社区提一个 issue 或者 pull request,开源社区有可能没有马上响应,或这个功能开源社区认为并不那么重要,公司内部改了开源框架,导致框架产生了另一个分支,同样需要内部维护。当初腾讯起家时开源社区还没有这么活跃,现使用的框架都是根据业务特点来设计的。现在使用的很多技术框架系统都糅合在一起了,比如日志、监控上报、检测系统等等,一时半会要改不太容易。

技术闭源的缺点是新人学习成本相对高,离职后,即使再熟悉内部系统也带不走,现在腾讯在推开源,希望能降低新员工学习成本和让离职员工有可以带走的东西。

  1. 问:工作后每天下班都已经比较晚而且也很累了,工作后还有保持学习吗?

需要保持学习,但不只是技术方面,还有理财。

之前部门发起精英项目,鼓励员工发起新项目,解决业务痛点。虽然我们组是后台开发,但也计划发起机器学习、区块链相关的项目。

  1. 为什么我们使用 vim 而不使用 IDE 呢?

不熟悉 vim 觉得他效率很低,但是如果熟悉 vim 后效率就能够得到大大地提升【我熟悉 vim 后效率确实也挺高的】。

还没支持 Linux 入域,后台开发的应用最终是运行在特定发行版的 Linux 上,C++ 的跨平台能力并不是十分强,如果使用 IDE 在本地开发的代码,需要测试需要重新将代码同步到远端,而中间还通过了跳板机,与 CLion 的直接同步到目的机器的做法不太一致。这样开发效率会受到大大的影响,经常会在不同机器上编辑代码,C++ 在运行前需要通过编译和链接阶段,没有像 Python 等脚本语言这么方便。

注:部分同事也会选择使用 VSCode、Sublime 等编辑器或 Visual Studio、Sublime 等编辑器,然后同步到远端编译、链接、调试。我在刚入职时也折腾过 vim 插件安装【完全离线方式安装 YouCompleteMe 就弄了我好几天】,CLion 结合 Windows 的 Ubuntu 子系统开发,因为部门使用的 Linux 发行版是 Centos 改造的,部分东西可能不兼容,所以最后还是选择了 ssh 到服务器,直接使用 vim 编写代码。

  1. 大部分机器是不允许访问外网的,不能直接 clone Github 的开源项目,也不能通过 pip install 安装库,那么如果怎么安装软件和库呢?

第一,通过代理。

第二,自己下载开源软件的源代码,将源代码传到服务器上,然后 make install。

注:之前一直不知道怎么不获取 root 权限安装软件,后来才知道可以从源码编译软件。如 apt install 或 yum install 之所以需要 root 权限是它们需要将可执行文件复制或链接到 /usr/bin 目录下,而该目录的权限列表:drwxr-xr-x 2 root root 64K Sep 1 13:44 bin,头文件拷贝到 /usr/include,库拷贝或链接到 /usr/lib 下。可以通过配置程序 configure 或 config 来设置 prefix 来指定软件安装的目录,只需要这个目录有写权限和可执行权限。使用时再指定头文件所在位置、库所在位置就可以。

What I see & How I feel

发现身边的同事(实习生或正职)学历普遍是高校研究生,或者海归,自己作为一个普通本科生感觉能够进来实习非常幸运的。如果我作为面试官,在不是很了解应聘者的前提下,我会选择学历更高的,因为至少从学历侧面地证明他们的实力。腾讯现在不少业务在出海,更是海归欢迎。腾讯能够招聘这么多优秀的人才,证明外界对腾讯的认可程度还是很高的,而且福利、薪资等也很诱人。

正职可以申请一个台台式主机(可为 iMac)、两台显示器、以及一个笔记本(可为 MacBook Pro),在有需要的时可以申请服务器、测试使用的移动设备、内存条、显卡等等,可见公司对于工程师的支持力度非常大。

下午有水果盘,有时是零食、雪糕、小龙虾,早餐免费吃,晚饭宵夜券可以抵,吃不需要愁。早上有班车(覆盖面非常广),晚上 10 点后下班够免费打车回家。公司内还有很多培训,无论是技术方面的、还是产品、设计、管理等方面,很多讲座是在上班时间,可以在上班时间学习,错过了可在内部系统看回放。

内部有一个类似知乎的问答系统,匿名提问,实名回答,有一些比较尖锐的问题,公司高层也会回答员工的问题。内部有很有优秀的文章,具体到还有关于产品的具体设计、技术实现,从中能够学习到不少东西。因为员工的考核与内部文章有关,所以员工发布优秀文章的积极性高,显现出制度力量的强大。

和组里的成员吃饭时,他们会聊一些关于理财方面的话题,特别是中美贸易战开始那段时间,中国股市下跌,美国股市创新高等,房价走势如何,政府推出了什么新政策。做技术的,除了关注技术外,也该关注理财方面的知识,怎么利用之前积累的财富去创造更大的财富也是一个重要问题。

部门从事与游戏相关,最近腾讯内部组织了很多游戏相关的比赛,如王者荣耀、刺激战场、斗地主、麻将、LOL等,午休和晚饭后,不少人会开黑打游戏,培养大家的友谊,鼓励员工了解公司的产品。很遗憾我们组的队伍在第一场就被对方 KO 了。

部门每周包运动场提供给喜欢运动的员工锻炼身体,比如篮球场、足球场、羽毛球场,公司内有免费健身房,专业的教练上课和私人辅导。他们身体素质确实下降得非常快,有些可能毕业没多少年,长肚腩了,体能也大不如前。工作时间坐的时间太长了,有些员工购买站立工作台,这样对他们的腰椎和脖子会有比较好的保护。

外界经常吐槽互联网加班严重,特别是做游戏方面的。公司内部并不建议员工加班,每周三晚上严禁加班。公司重视员工健康,提供免费的体检服务。我们部门在我实习期间大部分人都是双休的。

一开始我感觉组里的人并不很忙,工作还是很轻松愉快的。但当他们接了一个新项目后,整个中心都忙起来了,从策划架构到编码实现,整个过程非常快速,我参加了某些会议,听了他们讨论,知道这是一个很重要的项目,而且技术挑战性很大的项目。我导师告诉我,真正项目中编码过程并不长,更长的是前期方案的协定和后期的测试,他们做的项目一般都面相所有腾讯游戏,如果方案选错了,要调整的难度是非常大的,特别是数据结构和架构上的更改。有专门的测试开发岗位,有一次分享中看到他们的自动化测试,感觉真的很牛逼,公司有一个开源测试服务:https://github.com/Tencent/GAutomator

公司提供员工很大的学习时间和空间,在一次部门新人入职会上,有一名 5 星产品经理说,入职第一年主要还是学习积累、了解周边资源。

部门举行 GM 面对面项目,目的是让部门的每一名员工都有机会直面总经理,反馈问题和解惑等。很荣幸,作为实习生有机会参加饭局。问了一些关于管理、人员提拔等事情,总经理管理方面确实有一套,其中他提到不会跨级去考核员工,对员工的考核尊重直接上级的意见,直接上级更了解员工,他要做的是放权。部门招聘最后一关是总经理,他主要是看人,看大家能不能聊到一块去,适不适合部门的氛围等,他提到外国招聘有些是一起去一个旅行,看双方是否真的能够相处,能否信任对方。做事情前首先要看资源。

公司内部职称的晋升主要是通过答辩,如技术答辩描述在公司里做了什么项目、项目采用的技术与架构、最终成效如何。我第一想到的是我对过往做的项目还熟悉吗?有什么数据能够说明我做的事情的成效吗?我过往写的代码有留下文档吗?文书工作很重要的,要学会如何管理文档。在我的一个开发中,组里的人多次要我拿出文档,我没做好,我提供了不同版本的文档,数据很多都是在企业微信上发的,没有记录备份好,很多信息丢失在聊天记录里,只能重新做压测或者从聊天记录中找回数据,工作效率难免会变低。

内部系统都是配有管理端的,这样做一方面方便运维人员操作,另一方面方便推广,有些管理端是提供给产品经历等使用的,比如活动管理。

My work

导师给我列了一个实习计划,大部分内容主要是学习,如公司内部的技术、组里维护的框架、搭建一个中心常用的服务模型。

组里主要使用 C++,所以我也花了一周时间去找回 C++ 的感觉,从服务器上使用 vim,自己写 Makefile 编译、链接,使用 GDB 调试还是很有难度的,但这个过程让我重新了解了 C++,原来不适用 IDE 进行开发是这样的,IDE 屏蔽了很多技术细节,好处是开发效率的提高,坏处是程序员了解的东西更少了,更加不熟悉当前使用的技术。

我主要是做了两个项目:

  1. 根据组里使用的技术,搭建一个以 Protobuf 序列化数据、持久化于 MySQL、缓存至 Redis、L5 客户端负载均衡、SPP 微线程网络框架及C++ 编程语言服务模型。
  2. 腾讯游戏接口 IDIP 改造,使用 Openssl + Curl 实现 HTTPS 接入、Curl 连接池实现、使用 AES CBC 模式实现二进制流加密、签名验证、大包 JSON 解析优化、使用 Valgrind 定位性能热点、Python搭建测试桩、tcpdump 抓包分析及证书调研。

写代码的时间并不长,时间更多花在调研和写测试代码,自己先写一个简单的例子,验证后再合并到业务框架代码中。一方面是由于这样做代码比较简单清晰,容易调试,还有就是部署业务代码太麻烦了。

游戏接口 IDIP 主要干的事情是游戏协议转换、限流、动态配置和监控上报。

架构是客户端应用通过 tcp 连接访问 router(支持长连接,通过 '\n' 切包),worker 向 router 发起注册,worker 定时向 router 心跳保活,router 将请求路由到具体的 worker 处理,worker 加载 libparser.a 协议转化代码实现,管理端下发配置 xml 配置文件和 sqlite DB,其中 xml 描述协议、sqlite 配置一些动态信息(xml 描述一个请求 A 应该附带什么参数、参数的类型是什么、如果没有附带参数是否应该设置为默认值等等,对应有响应描述。sqlite 配置秘钥、游戏大区信息等),libparser.a 解析 xml 提取中数据,根据请求来判断应该怎么处理请求。libparser.a 访问游戏服务可通过二进制方式或 HTTP / HTTPS 方式。

游戏有加密、携带签名等需求,我的工作主要是在原有框架基础上添加 HTTPS 接入等,因为 HTTPS 短连接性能问题比较严重,所以打算引入长连接和共享 sessionID 方案,减少证书发送和重新协定秘钥等操作。

一款游戏需要传输很大的数据量,一个 16KB 大小的 JSON 回包,这样导致了 JSON 解析成性能热点,CPU 负载非常高,导师给了一个任务调研如何定位程序的热点,网上推荐 Valgrind 工具,Valgrind 不仅仅可以检测 C/C++ 的内存泄露,还可以检测缓存命中、调用分析、堆分析、线程竞态分析,测试后能够生成报告。而我主要使用调用分析,通过 Valgrind 生成的数据,再转化为调用图,很清晰地看到程序的调用性能热点。

隔壁组的一个高级工程师推荐使用 perf 工具,它真的很简单直接,比如通过 perf top 抽取栈顶信息,看程序大部分时间都在运行哪个函数,从而判断程序的热点。

最终定位到是一个递归太多了,将递归优化后问题迎刃而解。

修改代码或者新增了功能之后怎么保证程序的正确性?只能通过测试去保证了,因为 IDIP 框架的特殊性,没有专门的测试岗位,由开发者去写测试。我主要通过 Python 搭建测试桩,包括客户端请求模拟、HTTP 测试桩、HTTPS 测试桩和 TCP Server 测试桩,嵌入一些日志和统计代码。

部署是一个复杂的过程,router 和 worker 需要分开部署,幸好有管理端可以自动化很多部署工作,我导师尝试着带着我通过 cmd 来直接部署。需要配置白名单、L5 负载均衡、XML、SqliteDB、使用 supervisor 管理 worker / router 进程、将编译好的 libparser.a 放置到特定目录上,最后再将 router 和 worker 启动起来,判断 router 和 worker 是否正常启动。

程序产生的日志是惊人的,一个日志文件就上 GB 大小,而且有很多个不同时间结点的日志文件。可以通过 awk / grep / sed 等文本工具很方便地实现日志的查阅、统计、替换功能。

end

腾讯是一家很 Nice 的公司。

工作之后感觉生活还是挺无聊的(社会上有趣的事情挺多的,不应该让自己这么无聊),除了上班其他时间不知道应该干什么,应该多发展兴趣爱好,多交朋友,业余时间应该保持学习,学习一点新东西,拓宽自己的路子,有条件也可以了解一下理财方面的知识。实习后感觉身体素质差了不少,要加强锻炼。