在这之前,还是要先做一个免责声明(disclaimer)。就像我在快手的文章只能说明快手商业化的情况一样,在字节也只能说我自己的部门的情况,不能够推广到全公司。事实上这个对比完全是基于个人经验,属于一个公司的不同的组,可能会有完全不同的工作体验,因此大家从中各取所需就可以了,千万不要把我的想法当成正确的结论……


那么我们开始吧~


01

字节跳动简介

北京字节跳动科技有限公司,成立于2012年3月,是最早将人工智能应用于移动互联网场景的科技企业之一,是中国北京的一家信息科技公司,地址位于北京市海淀区知春路甲48号。公司以建设“全球创作与交流平台”为愿景。字节跳动的全球化布局始于2015年,“技术出海”是字节跳动全球化发展的核心战略 ,其旗下产品有今日头条,西瓜视频,抖音,火山小视频,皮皮虾,懂车帝,悟空问答等。


字节跳动人工智能实验室成立于2016年,旨在针对人工智能相关领域的长期性和开放性问题进行探索,帮助公司实现对未来发展的构想。其独立研发的“今日头条”客户端,通过海量信息采集、深度数据挖掘和用户行为分析,为用户智能推荐个性化信息,从而开创了一种全新的新闻阅读模式。


截至2020年8月,抖音日活跃用户数已经突破6亿,字节跳动旗下全线产品总MAU(月活跃用户)超过15亿。


2021年5月20日,张一鸣宣布卸任字节跳动CEO,联合创始人梁汝波将接任。


提到字节跳动,大家第一印象还是抖音和Tiktok,不过实际上字节跳动的产品可远不止这些。诸如更加本土化的火山视频,投放广告的穿山甲,投身教育的瓜瓜龙等等,其实都是字节跳动的产品。也就是说实际上字节跳动的短视频业务只是它的一个部分(虽然确实是利润的绝对大头),它的业务线的广阔,可以保证互联网的几乎所有的业务,都能够在够在字节跳动找到应用的场景。并且得益于字节跳动研发线的高标准严要求,字节的内部具有相对较强的中层力量,换句话说在infra侧上,字节的总体水平是处于互联网公司相对比较高的水平的,但是如果说超过BAT什么的,这个可能还是都去过的人体验一下才有发言权,我就先闭麦了hhh。

总之如果想来到字节跳动的研发线,严格的面试准备是必不可少的。这一点各有利弊,利在于筛选进来的人一定都是水平较高的人,弊则在于招人的高要求,会对应导致符合要求的候选人的减少,这样一定程度上会限制业务的扩张,同时在缺人的时候,项目的压力就会相对较大。当然,如果真的是少之又少的人才,进入字节之后,也要匹配比较高的薪资,不然可能就真的招不了人了……即使是我自己已经来到了字节目前的组(Adscore,后面会介绍)呆了几个月,我也对高难度的面试持保留态度。但是事实上真正通过“千军万马独木桥”来到了字节研发线的朋友,可能处于不同的部门,做着不同的业务,但是都没有对自己所做的决定感到后悔。

我在字节的日子_链路


02

我在字节跳动做了什么?

要说自己做的事情,其实是一个非常非常小的零件一样的存在。不过在这之前,我想先唠唠我所在的部门的大概的组织架构(因为细节的架构业务是涉及机密的,这里就不能多说了)。毕竟字节跳动是非常强调扁平化的公司,所以他们的架构也一定程度上体现了这一点,就是有的时候让人摸不着头脑……

PART 1

首先说说大部门,我通过的实习部门是字节跳动的Adscore,Adscore这个部门,就是Ads+core,是一个非常纯粹的广告算法部门(虽然最近大leader也开始招一些数据分析师,用来支持这里算法的工作)。也就是说,基本上所有的广告相关的算法与业务,其实都会落在这个部门,因此其实很多时候,我们会说这个组是一个中台组,就像中间件或者架构中的一些中间层,用于支撑一些实际业务。

PART 2

当然了,Adscore是一个非常大的组,内部有非常多的业务细划。因为涉及架构等敏感信息,这里不详谈。但是大体上来说,算法这边可以作简单的三个部分的区分,就是模型,策略和生态。但是如果按照功能分的话,分为两个模块会比较好,就是模型和策略。我自己属于的是策略组,所以相比较快手模型组的任务来说,就又是一块全新的领域。策略组和模型组的区别,我之前写过一个想法,就是说

搞模型的,数错了,数仓有问题,表有问题,就你没问题。

搞策略的,数错了,数仓没问题,表没问题,就你有问题。

事实上就说明了,相比较模型来说,策略不是一个黑盒子,每一步都是可以被我们所定制化和追踪的。这样的话,从落表开始,到最终产品的策略上线结束,中间的每一步都是有可能有错的和设计不合理的。这也是为什么相比较而言,策略算法不容易受模型算法那么受欢迎的缘故。因为策略算法的细节太多,要管的事情很多,不像模型你调好一个参数/结构,剩下的事情就是排队等候训练了……当然了,也是因为这一点,策略相比较模型来说,对于心细程度的要求是更高的,这也很好理解。

PART 3

终于可以说我自己做的事情了!我自己参与做的产品叫作bid landscape(大家可以在Google上搜索这个词)。思考一下,广告主在投放广告之后,这一个广告会经过哪些步骤?互联网公司比较传统的广告链路一定包括召回,粗排,精排等,具体细节可能不同公司设计的略有不同,但是一定是有这些步骤的。在这个步骤下,一个广告到真正拿到收益(我们会说消耗),它的因素会和什么有关?随便一想肯定都会很多。那么这个产品要做的事情,就是考虑

当我们固定其他变量不变,只考虑广告主的出价(bidding)的话,我们可以如何给广告主提出价建议(提价?降价?提价多少?还是说因为各种settings不合理,我们不提供建议?),使得广告主的收益可以被优化。

这个事情相对来说是一个非常新的事情,即使是在国外,能够说这一个任务做的很好的,也就Google和Facebook两家。因此我所在的这四个月,虽然大家通力合作,做出了一个产品。但是实际上的效果,要想说“赶英超美”,还是有点异想天开了。但不可否认这个过程是极为充实和具有挑战性的,对于一个实习生来说,也算没有留下遗憾。

我在字节的日子_互联网公司_02


03

对比:快手和字节的算法有何差别?

再次强调:这个对比完全是基于个人经验,事实上属于一个公司的不同的组,可能会有完全不同的工作体验,因此大家从中各取所需就可以了~

03-01

“没有内卷,只有合作”

首先第一点,就是至少我所在的地方,可能因为要做一个产品的缘故,因此内部大家只管你的职责是什么,而不管你是实习生还是正式员工。但是这一点又不能等同于“如果你的工作没完成,你就需要加班把它完成”,因为正如我在这里的mentor所说

如果一个项目block在了一个实习生那里,那么担责的应该是分配任务的人,而不是这个实习生。

比方说我们在做出价相关的事情,那么我们要看表,表是全量的吗(因为离线表的数据大概率都要采样,否则无法落入Hive)?数据里面有哪些字段?广告的settings有哪些限制条件?这一块大概率是需要数仓和开发来帮忙一起看和做的。再往后,你的策略是什么?这就需要寻找其他人的文档,去学习去讨论,再看可能的问题是什么,优化点是什么?再往后,效果不好,那么为什么不好,你可不可以解释?如果可以解释,有明显的问题,这个问题可不可以量化?可以看出,策略算法是与实际业务,广告链路紧密结合的,决定了全过程一定不只是算法工程师在闷头苦干,而是算法,开发和产品的通力合作

我们组的模型侧也是很类似的,因为不管是在快手还是字节,资源都是非常紧张的,并且对于一个比较复杂的模型,很多时候出错的往往不是模型架构本身,或者训练,而是serving的部分。有的时候可能制约速度的也并不是模型本身的问题,而是其背后的推理架构,这些严格来说都是开发要做的事情,与模型算法工程师本身其实关系不大。因此引用leader的话,就是

组内没有内卷,只有合作。

一定程度上也体现了字节这种“团结办大事”的作风。

你会发现,我在快手的工作时间其实是相对自由的(虽然论实际的工作时长,快手商业化平均是比字节Adscore要长的),因为可以自己一个人,在一个相对比较初级的业务上去调研自己的东西,在这过程中mentor会努力辅助你,但是你的业务是相对独立的。但是在字节现在的部门,很多模型已经不再是看paper或者照搬paper可以了解的了,它们都根据实际的业务做了一些个性化的改造。这就使得“调参”这个事情变得几乎不可能了,大家更多的是关心它与业务的交合(比方说,是否使用了正确的数据流,label是否使用了正确的计算公式,等等)。这就使得“合作”两个字变得尤为重要。

当然事实上如果是快手的核心部门(例如社区科学部),情况可能就完全不一样,但是因为我当时不在,这里不详谈。


03-02

放眼全球,而不是全国

第二点就是字节在全球(注意,不是全国)各个地方其实都有分部(虽然研发线还是主要在北京,上海,深圳,杭州,山景城,西雅图等),这就使得出差这个事情变得普遍,也使得业务上绝大部分时间的沟通,都需要依赖远程。比方说Adscore本身其实是有小部分人是在北美的,在北美的朋友如果要和国内合作,就必须要挑选一个两个地方都合适的时间。因此事实上有很多组会都会安排在一大早,或者中午这样的时间,这都是为了照顾两边的时间。当然这也使得相对来说,北美的成员的上班时间就会比国内更晚。我们这里的上班时间平均是11点到晚上九点半,放到北美那里,有很多人可能就是下午才开始上班,一直上到凌晨,然后早上做自己的事情……虽然听上去其实挺不可思议的,但是毕竟美国的COVID-19还在肆虐,所以大家都是WFH(work from home)的,倒也无所谓了。

这一点快手就没什么好说的了,绝大部分人都是在北京的,最多也就是几个工区不一样。虽然也有合作(比方说之前在的时候,社区科学部的一个人就会到商业化的部门去debug一个训练样本的问题),但是相对来说距离不远,也不是特别需要依赖远程。当然个人感觉,虽然线上的效率不如线下,但有远程的backup肯定是好的(这里安利一波飞书,还有它的飞书妙记,开会和分享都会很快有录屏,以后有空学习也会很方便),COVID-19的出现,就非常明白的说明了这一点……


03-03

讨论时间很多……

最后就是,这里的会议是真的多……快一百人的大组有会议,非中国区的小组有会议,和mentor的项目也有几个会议(这其实也可以算是远程的坏处了,啥大事小事都得靠远程电话解决,但是这也是业务不断扩张之后带来的必然吧,毕竟北京再大,也就地球上的一小块233)。这也使得相比较快手商业化,你还可以理一个日程表出来,但是在字节Adscore,由于项目在驱动,每天的工作时间其实并不是很固定。临近sync或者项目会议的时候,你的数跑不出来,你的策略还在运行,那你一定是会十分紧张的。但是如果你没有在这个时候,可能你的压力就还好(当然了,压力还好的意思就是,你可以按照自己的节奏正常下班。虽然说网络上总说互联网公司加班严重,但是事实上一个好的公司,对于员工的生活平衡必然是要有尊重和考虑的,虽然项目在忙的时候真的会很累,但是总体上来看,大家还是做到了相对比较好的一个平衡,没有网上说的那么玄乎。至于你想十一点来,然后六点七点就下班,可能和公司关系不大,而要看个人头不头铁)。

我在字节的日子_互联网公司_03


04

字节Adscore面试题


叙述过拟合和欠拟合的表现和常见解决方案。

叙述FbProphet的关键参数。

代码题:二维数组,每一个元组内是一个整数,从左上角往右下角走,只能够向右或者向下,要求经过的数的和最少,空间复杂度为O(max(m, n)),其中m为行数,n为列数。

叙述GBDT与随机森林的区别。

概率题:给定一棵决策树,输出1的概率为p,0的概率为1-p。问如何使用两棵决策树进行组合,使得输出1,0的概率分别为1/2。

代码题:有序数组查到target元素的最左边和最右边,要求复杂度O(logn)

代码题:消除字符串的pattern(比方说字符串为baba,pattern为ba,那么会返回一个空字符串),要求只遍历一次数组。

解释一下wide & deep。

xgb的并行化做在了哪里?

给10min,上网查资料,解释xgb如何去拟合一条单调上升的曲线。

给10min,上网查资料,解释如果遇到了10^9维的数据,xgb如何做建模和特征工程。

代码题:最长上升子序列。

可以看出,这一次面试在代码题上,没有遇到hard,但是其实覆盖面上也是很广的。传统的机器学习,深度学习都有考察,还有考察一些开放题。​


06

一些想法:算法工程师对工程能力的要求体现在哪里?

事实上,我们一直在说,算法工程师不是调参工程师。但是如果反过来问,说算法工程师是什么工程师?其实就有点难回答了,我自己也不例外。事实上,为了搞清楚这个问题,不仅仅是要亲自去体验不同种算法工程师做的工作,前人的经验也是很重要的。因此我在这段时间还问了一下我们部门的mentor和兄弟部门的leader(Ads Infra,一个业务中台部门,主要会做后端和数据流的工作,是一个开发部门),他们在做什么,怎么理解这个工作。最后,其实可以得到下面这一个结论。

算法工程师对工程能力的要求不亚于计算机本科。

如果你是一位转码选手,那么最方便的方法自然是刷题刷题刷题,然后拿到实习/正式offer了,对应的补一块的知识。比方说你去做网络相关的内容,那么计算机网络这一门课肯定是必不可少了。但是这样的做法其实限制也很明显,毕竟你也不知道你是不是就一直喜欢,或者可以胜任做某一个方向的工作

对于算法来说,其实这种受制会更加明显,因为我们根本不关心底层设计什么样,但是我们却需要使用它们。举个例子,我们在做策略算法的项目的时候,我们设计好策略,需要上线,需要实验,那么实验平台代码怎么写,业务逻辑是什么?这些是不是都会接触到后端的内容?我的mentor最忙的时候,会同时打开三个屏幕,一个屏幕放Python代码,一个屏幕放C++代码,一个屏幕放Golang的代码。为什么有三种语言呢?这是因为遥远的模块就是用这三种不同的语言写的,所以他每次看都很崩溃……

我在字节的日子_深度学习_04

有人可能会问,那既然如此,我把这一部分交给开发部门不就好了嘛?事实上这就是职责所在了。思考一个问题,如果一个策略算法工程师只会写Python策略,那它值得和一个开发工程师一个价嘛?事实上,除了这个原因,还有一个原因是,实际的业务中,我们要对结果负责,这个过程遇到什么坑,其实每一个人都不知道。而你身处互联网公司,你的模型/策略要上线,你不可避免要涉及到公司的架构。所以无论如何,或许你可以不需要背计网的各种术语,或许你可以不需要明白各种架构设计会带来什么优化,但是你不能看代码的时候毫无章法,或者在修改调试的时候一头雾水而这,对应的恰恰好就是我们所说的工程能力

事实上,我们在实际做项目的时候,遇到的各种block的问题基本上都是涉及到后端的。一个例子是,我们要对广告计划的策略做测试,这会涉及到一个循环。循环加速的方法是并行,这个如果做过项目的人可能也都听说过。那么进一步问,并行可以用多少核?在并行的时候开启其他的项目,是否会对其他项目的性能产生影响?以及会不会触发核的熔断机制?这些都是操作系统的东西,你可以不懂,但是一旦遇到这个问题,真的会毫无头绪。遇事不决走oncall,oncall虽然一下子就知道问题是什么,可是时间可能也就这么浪费掉了……至于各种落表的操作,打jar包,写Redis,调网络接口什么的,这就实在是太常见了hhh。

所以,如果你仔细观察一下身边的同事的话,你会发现绝大部分的人都是CS,EE,自动化这种工科专业,而这些专业不可避免的都会学习很多软硬件相关的课程。所以我自己认为,算法工程师对于工程能力要求其实真的很高。这个想法固然是有些学生思维,毕竟你不可能到了工作场合之前,要把所有可能的内容都学习完,你也来不及。但是这一点要提示的是,如果现在有空,要努力学习一些算法工程师底层的内容,而不是上层的内容。而如果到了工作场合,也要养成持续学习的习惯,并且适当的去拓展自己在这一块的边界。如果想在算法工程师这一块有自己的成果,而不只是做螺丝钉的话,那么对工程能力的把握不可含糊,这一点,无论是我的mentor,还是我的leader,还是我们组的leader,还是兄弟组的leader,都给出了一致的意见。

所以最后其实可以补一句话,就是

算法工程师和开发工程师都是互联网的工程师,只是他们的思考角度不同,对技术栈的要求其实大同小异。

但是事实上目前算法相关的面试,几乎不考察后端相关的内容。这个当然可以理解,毕竟只考算法和leetcode都没办法招足够的人了……但是事实上,如果有幸可以加入这个行业,做这一份工作,那么千万不要忽视开发,毕竟我们身处互联网公司,CS基础就是你的根基,根基不稳,摇摇欲坠,哪一天突然掉入深渊,深渊可能早就期待你很久了。


07

小结

终于把这一篇字节篇写完啦!从杉数篇到字节篇,这一个系列今年写了四篇文章,自己也去了四家公司,有startup有大厂,有算法有开发,有机器学习有深度学习,有模型有策略。虽然前前后后跳的厉害,也确实把自己给跳累了。但是每一次认识不同的朋友,了解不同的业务,同时也能够感受不同厂的氛围,其实本身也是很有挑战性和很有成就感的事情了。当然,也衷心希望每一篇文章,都是一个好的对于公司的宣传,对于工作内容的一个朴素的介绍,也是一个好的,帮助大家了解互联网公司的一个机会。


完结撒花!希望这一年北漂经历能够让我真正有所记忆,不留遗憾。当然如果有人可以因自己的文章对互联网产生兴趣,或者通过自己的努力进入了这个行业,那就更好啦~

我在字节的日子_互联网公司_05