作者 | 梁唐
大家好,我是梁唐。
最近在知乎里接了几个咨询,基本上都是学生党提的,问的内容也都大同小异,想要做某某工程师,但是不知道该学什么,该如何准备,请问我有什么建议。今天就和大家聊聊这个话题,算是一个简单的科普吧。
对于职场老鸟来说,互联网公司的业务、技术虽然说不上门清,但也都知道一个大概。对于学生党而言,估计是两眼一抹黑,可能只是大概知道,阿里是做电商的,腾讯是做社交和游戏的,百度做搜索的。
至于电商、搜索、社交如何做,又用到哪些技术,该学什么知识点,就答不上来了。
如果我们从搜索、社交、游戏的角度去切分,的确不好回答,毕竟涉及的领域太多,人力有限,想都搞明白显然不太可能。所以我们可以从更大的角度去思考,如果不考虑技术细节,将互联网公司的工作内容分分类,可以分成哪些?
我个人觉得可以简单分成两类,一类是做功能,一类是做性能。
所谓做功能,也就是开发原先没有的功能。不论是做一个新的网站界面,还是做一个游戏里的功能,本质上都是做功能,从无到有。做性能则是从1到100,也就是说这个功能已经有了,我们以此为基础,继续做优化,提升某个指标或者是效果。比如说优化服务器的响应速度,优化算法模型的预测能力,等等。
那么问题来了,一共公司里是做功能的人多,还是做性能的人多?
很明显,做功能的人多。
不信的话,大家不妨打开一下手机淘宝,稍微数一数,能找到多少个界面,每个界面里又有多少可以交互的功能。即使在不考虑淘宝巨大流量的前提下,单单是开发这么多的功能,又需要多少工程师?
我找到了一张2018年阿里官方给出的代码统计图,仅仅2018年一年,新增的代码量就足足有12亿行。虽然这么多代码,不完全是功能性的开发代码,但是这个量级也可见一斑,非常恐怖。
大家可以看到新增的代码当中,Java和JavaScript这两项之和超过了一半,我们都知道Java和JS分别是前后端的主流代码。所以我们可以简单推断出,用来开发新功能的代码至少占到了一半。
在互联网行业当中,开发新的功能有一个专门的术语,叫做业务。所谓的业务开发团队,也就指的是开发新功能的团队。听起来好像蛮高端的,但实际上大部分的业务功能抽象到最后,都可以用各种形式的增删改查来表达,也就是大家经常吐槽的CRUD。
尤其是在大厂当中,做功能和做性能几乎是完全分开的。开发业务的团队就只负责业务功能的开发,性能的维护以及提升,往往有专门的团队负责。常见的套路是,性能团队开发组件和工具,业务团队依葫芦画瓢,照着前人设定的规范和指南,以正确的姿势使用这些工具进行增删改查。
这样带来的核心问题是,只是单纯的编写代码是得不到能力的提升的,真正锻炼人有含金量的,其实是工程师解决问题、提升系统性能的能力,而不是编写代码的能力。这也是大家普遍吐槽大厂拧螺丝的原因。
说完了功能开发,再来说说性能优化。
这里说的性能优化主要又可以分成两个部分,一个是系统相关的性能优化, 一个是算法系统的能力优化。我们分开来说。
先来说说系统优化,如果大家实际做过项目,就会有亲身体验。很多时候开发功能本身是不难的,网上仿照淘宝做的购物商城和自制的聊天工具到处都是,甚至我当年计算机网络的大作业就是自己用Java写一个聊天工具。尽管巨丑无比,但功能上完全是可用的,核心功能有了,再找设计师优化一下界面并不是很难的事情。
真正的难点其实在系统的承载能力,比如微信的日活跃用户近十亿,淘宝的双十一当晚的流量更是能达到每秒十亿。想让机器抗住这么大的流量,才是真正的难点。互联网行业中的核心技术有一大半都在这里,如何让服务器响应尽量快,让数据库吞吐的数据量尽量大,让用户的延迟尽量小,让用到的机器尽量少……
具体用到的技术就多了,像是什么数据库分库分表、微服务架构、后端的各种框架、中间件、动态部署等等,围绕分布式、数据库和系统设计几个方面展开。这就是为什么很多工程师钻研到最后,都摇身一变成了架构师。代码也不写了,整天开会,看起来好像谁都能干,但实际上要把系统设计漂亮,绝不是件轻松的事,要懂的知识又杂又多。
再来说说算法系统的性能优化,主要是围绕着点击率、转化率等几个业务指标展开。
看起来好像全是算法工程师的事,只要设计好模型,用好特征就可以提升效果。但实际上远远没有这么简单,算法的模型和特征都不是凭空来的,需要用到大量的数据。想要把规模庞大的数据使用好,则又需要一个强大的数据系统的支持。很多公司把这一层承接大数据的平台称为数据中层,其实主要就是给算法团队使用的。
对于数据中层而言,有些像是幕后英雄。因为用户不能直接感知到,用户能感觉到推荐效果的好坏,能体验到搜索、推荐带来的便利,但是感知不到这背后的数据团队发挥的作用。数据团队有些特殊,既要承担上游团队提来的业务需求,也需要承担数据支撑以及系统的优化,既有业务价值也有技术挑战。
说了这么多,估计有同学要问:这些东西和我们有什么关系呢?
其实关系很大,因为职业发展长达数十年,并不是进入大厂就一劳永逸就可以准备退休了。这中间还有着漫长的路要走,想要把职业发展的道路走好走顺,至少不能盲目,得有一个方向。
那这个方向是什么呢?其实就是技术发展,说来说去技术实力才是工程师的立身之本,也是职业发展的第一要义。技术实力也不是凭空的,什么都学什么都会既不现实,也事倍功半。想要不当CRUD的搬运工,需要我们围绕性能优化而不是功能开发。
而性能优化有哪些路线呢?我前面也列举了,简单总结一下,大概有三条。
一条是围绕后端服务器响应能力的技术路线,一条是围绕算法系统效果的算法模型路线,还有一条是数据中台承载大数据的大数据工程师路线。这三条是大的路线,其中又有许多小的分支,比如后端服务器中又会分是后端方向还是数据库DBA方向,还是容器虚拟化、运维方向。算法也会分推荐、搜索、广告和NLP、CV,数据中台也有区分,有的负责存储优化,有的负责数据链路。
除了这些之外还有两条线,一条是前端路线,一条是客户端路线。这两个我不太了解,就不过多阐述了。总的来说互联网公司普适性比较强的技术基本上就这些方向,根据各个公司的业务特点,可能会有所区分。比如滴滴、高德围绕地图和定位、定价,饿了么、美团围绕骑手运力规划等等,也会有一些技术方向和积累,但相对比较小众,也不一一展开了。
那是不是不做技术,做了业务就死路一条呢?
其实也不是,做业务发展很好的也很多。因为对于业务开发来说,业务理解也是一门杀手锏。产品经理设计的功能落实到用户手上给用户体验的时候和产品当初的设想是会有很大偏差的,甚至南辕北辙的也不再少数。作为工程师能够理解这些偏差,理解这个场景有自己的看法也非常重要。从这个角度来说,有一点产品和开发结合的意思在里面。
但业务会变,工作岗位也会变动,只有业务理解肯定也是不行的,对于大多数一线工程师来说,技术实力依然是立身之本。
所以我个人的建议是,无论是否毕业,现在的工作是什么。都要有一条自己的技术发展路线,能够沿着它一直钻研下去,先从学习前沿技术开始,再到诞生自己的想法。等攒出了几招自己独有的绝活,在互联网行业混得如鱼得水也就不是难事了。