0%

下岗工人的碎碎念

还完工牌和电脑,三天前从北京回了家,我四个月的实习生活正式结束了。


从无业游民到打工仔

刚进大学的时候,有时候会听说某某学长/学姐去了BAT。对于当时还只会写黑底白字cpp程序的我来说冲击不要太大,心中唯一的感觉是羡慕。知乎的焦虑轰炸和许多被夸大其词的“BAT面试题”让那时的我只觉得BAT只是一个遥不可及的梦。“读完本科和研究生能进个BAT就好了呀”。小白的梦想就是这么简单而枯燥。

第一次听说头条是它和腾讯大战的时候。当时对这个公司并没有特别的感觉。过去挑战BAT的公司也不在少数,可人们记住的还是只有BAT。我寻思或许不久之后这家公司也将和前人无二,被时代的车轮碾过,不留痕迹。

时间推移,国内互联网行业发展迅猛,自己也不再是那个认为互联网=BAT的一无所知的小白了,知道了还有规模和实力并不十分逊色于BAT的TMD,还知道了处于食物链顶端的FLAG。虽然不是只会用cpp写控制台了,但感觉自己离大厂距离还是很远。偶然又了解到头条特别舍得给钱,应届白菜能开出30+。对于当时只希望毕业之后能拿个20的offer的我来说又是一次大冲击。除了给钱多,同时了解到的是头条的面试也特别难,需要手撕算法题(后来才发现其实大厂都要)。从那个时候起,头条在我心中的地位已经和BAT差不多了,甚至还略高一点点?毕竟没有人和钱过不去嘛。

到了大三下学期,随着对行业的进一步认知,以及和真正拿到大厂offer的学长的接触,这个时候我意识到并不是“人中龙凤”才有机会进大厂,我们普通人努努力也有机会。也知道了头条其实叫字节跳动,今日头条只是他们家其中一个产品。他们家还有一个爆款叫抖音。尽管很希望去看一看工业界的运作流程,了解一下大厂的做事方式,但由于要准备保研,这个念头也只能留在心里。那时心里根本不觉得保研和实习两件事可以兼顾。虽然听说上届有学长同时拿到了浙大CAD和腾讯的offer,但我只简单地把这种人归类于神仙。当时只想着能拿个交浙南的offer,大学圆满。

真正意识到保研和实习是有可能兼顾的还是因为身边的同学。先是班上有两个同学先后拿到了字节跳动的前端和客户端实习offer,再到室友八月拿到抖音客户端的offer。直到突然有一天我发现,所有室友和另一个兄弟寝室的哥们全都找到了实习,只剩下了我一个无业游民,而他们也和我一样经历了保研中的所有事情。从小到大我们都在说环境会对人产生很大影响,此时此刻我终于有了深刻的感受。家长们为了把孩子送进名校争得头破血流大概也就出于这么个道理。我归因于好的环境会带来更强大的Peer Pressure,激起人的好胜心从而让人奋进。说白了就是你心里会想,大家学的都一样,他行凭啥我不行。

艰苦地找工地

时间来到九月初,尽管保研还未尘埃落定,我心里却早已急不可耐,迫切地想找一份实习。加之室友也说面试时间可以约晚一点,所以虽然此时的我啥也没准备,忐忑之下还是把简历投了出去。最初我投递的都是一些小公司,想着先积累一些面试经验,为后续字节跳动的面试做准备。目标岗位是后端。

第一次面试很快就来了,是杭州的一家小型公司,形式是电话面试。现在看来问的都是一些非常基础的知识,比如JVM的GC、Spring的IOC和AOP、MySQL的索引等等,甚至都没有算法题。然而那时啥都没准备,脑子空空的我自然是答得非常差。面试持续了三十分钟,在我一连串的“这个不太了解”中,面试官终于没能继续下去,最后意味深长说了句“不好意思,耽误你时间了啊”。后来一回想,大概是我耽误她时间了吧(狗头。

总之第一次面试很失败,唯一的收获是让我认识到靠临阵磨枪是面不过后端岗的,要准备的知识太多,于是我决定把求职意向从后端改为客户端。一是考虑到目前字节跳动对客户端的需求比较大,机会更多,二是周围同学面的几乎也都是客户端,经验积累更多,三是客户端要准备的知识相较于后端稍微少一点。做完决定,改完简历,我又投了一波。为了给自己更大的压力,这次直接投的全是大厂,包括字节跳动。心里想着约完面试时间就能压迫自己准备了。字节跳动的面试邀约来的很快,我约了是9月底,等填完保研系统再顺手拿个offer,岂不美哉。

事实证明,想法是美好的,现实往往没有那么顺利。时间来到了24号,我还在为保研的事忙得焦头烂额,《深入理解Java虚拟机》自然是没有翻开过的。意识到这种知识储备肯定要挂,我只能让HR把面试时间推迟到了国庆之后。

填完系统,当早早拿到offer和不准备实习的同学们正准备享受即将到来的70周年国庆和阳光明媚,自由自在的大四生活时,我的苦日子才刚开始。国庆节当然是不存在的,我磕磕绊绊的把《深入理解Java虚拟机》中的重要内容过了一遍,看了看HashMap的源码解析,补了补Android的基础知识,再刷了几篇面经就匆忙上阵面试了。

第一次面大厂,还要手撕代码,说不紧张那是假的。然而幸运的是,面试官的提问几乎全部精准命中我准备的内容。而且由于准备的时间很近,很多问题的细节都说得不错。面试结束立马就被告知HR会和我约二面的时间。人生嘛,总是起起落落落落落落的,我只等到了HR告诉我说觉得我实习时间太短,愿意走校招才安排二面。于是我的简历又回到了他们的简历海里。好在同学帮了大忙,让他们组把我简历又捞了起来,才总算是约上了二面。在等待二面的过程中还被百度捞了一次,来了一轮电话面。个人感觉百度的面试风格和字节很不一样,字节更注重计算机基础和算法,而百度则问了很多Android相关的知识,重要的组件几乎都问了个遍,另外还问了我准备得不多的数据库。当时Android的许多知识准备得还不太好,因此自然是没了下文。我倒也不太在意,就当给二面积累了点儿经验。

二面的日子到了,这次几乎都在问Android,自然是存在知识死角。算法题来了两道,有一道写得不是特别好,因为边界条件的问题被怼了。最后的提问环节还傻乎乎的说之后考虑读博,让面试官觉得我来做客户端可能对双方帮助都不大。结果是我的简历又回到了简历海。得亏身边去字节的人多,三面被推到了我室友的部门。这一面除了Android知识的轰炸,还有一个鬼畜的情景题,问如何设计一个下载工具。面完我感觉就不是特别好,最后还是没有过,给的反馈是我面的这个HC是要做今日头条的,上手时间太长,我实习时间又太短。也不知是真的还是为了安慰我。此时能捞我的只剩下另一个在抖音的室友,但经过两轮打击,再加上抖音的要求肯定只会更高,我是没啥信心和动力再去他们组面一次的。再加上此时时间已经到了10月中旬,秋招都快结束了,我自觉再被其他组捞起来的希望渺茫。客户端的路也这么被堵死了。

身边只剩下了一个做测试的同学。抱着死马当活马医的心态,我让他捞了一次,在一周之后等来了一个测开岗的面试邀约。这时的我早已不在意岗位,只要能进去啥岗都可以接受。在恶补了几天测试的基础知识之后,我最后的机会来了。一面二面紧挨着,二面中的一道算法题脑子一抽没做出来。幸亏自己争取了一下,让面试官补了一道,不然我可能真的会当一整学期无业游民。三面面试官是我后来的leader,他的面试是这段时间以来我经历的最魔幻的面试。开场就用一个“为什么电梯里摄像头要装在轿厢左后方的角落里?”把我问懵了。硬着头皮扯了几句之后又是两个很宽很大的问题,自觉答得也不怎么样。好在后面的两道代码题表现还不错,最后还是让我过了。第二天又经历了一轮HR面,耗时一整月,我终于找到了收留我搬砖的工地。

搬砖之旅

拿到offer,紧绷的心放松了不少,于是去杭州溜达了一趟,顺便看好了要租的房子。在学期过去一半之后,我总算来到了北京,开始了实习生活。

入职办理在中航广场,本以为入职就是交交材料,领一下电脑和工牌,一会儿就能结束,于是我饿着肚子就去了。没想到等着我的是一整个上午的入职会,和我一同办入职的新同学人数也远超我预料,整整坐满了会议室的两张大桌子。入职会的内容和我想的倒是差不多,无非就是身份查验,签合同,安装办公软件,看公司宣传片之类的事情。

入职会结束的时候已经到了饭点,接我的HR却迟迟没到,最后还是我带着另外两个同在一栋办公楼的新同学过去的。也第一次知道了大公司还有着穿梭车这种东西,15分钟一班,往返在公司的各个办公点之间,相当于公司员工的免费公交车。我的办公点在紫金数码园。暑假参加过推免面试的软件所就在隔壁。当时就在附近看到过戴字节跳动工牌的人,没想到还挺有缘,最后自己也来了这里搬砖。

饭后见了Leader和Mentor,认识了一下组内同学,了解到做的工作其实就是Web开发,准确的说是全栈开发,每个人都需要从前端写到后端。技术栈是Vue + Django。这俩我以前都没写过,因此接下来半个月也没有活,一直在配环境和学习,周末还能和同学们进城走一走,生活还是挺惬意的。

摸鱼的日子也不好意思一直过下去,自己也想着过来应该要有点产出。正好Mentor把我派给了组内的另一个缺人力的同学,于是接到了我的第一个需求(实际上整个实习期都主要在做这个)。需求的大背景是当前公司内许多数据分散在不同的平台上,产品线的同学在发版前需要去各个平台都检查一遍,十分不便。我们的工作就是将这些数据整合到我们的测试平台上。我负责其中一个统计APP中各种Crash率的子模块。

刚接到需求的时候其实有点overwhelmed,许多业内“黑话”我还没摸清,发版流程也不懂,再加上当时Vue才刚开始学,真的有点不知道从何下手。我也不太愿意问,一方面是想着同组同学都还有自己的工作,不好意思打扰人家,另一方面也是担心自己问的问题太傻,让人心里有想法,比如这都不知道,这个憨憨是怎么进来的。于是我就犟着自己盲人摸象,进度自然是很慢。后来在知乎看到一个同为刚进入字节的新同学写的一篇反思,里面说到刚入职的迷茫期就应该靠脸皮厚多问人度过。现在回想确实很有道理,你遇到的问题同组的同学大概率也有遇到,他们的一句指点往往能帮你直接解决问题。况且有些问题搜索引擎也不一定能找到答案,比如当牵扯到公司内部的库时。相比起那一点虚荣心,显然还是节省下来的那些时间更有价值。

万事开头难,首先实现方案中就有许多细节等待落实。带我的同学认为需要利用定时任务爬取数据入我们的库,这里就引出了许多问题:定时任务的时间间隔设置为多久合适?爬取的数据量有多大?爬取的时间有多长?接口中哪些字段是我们需要的?这些只能靠着自己慢慢摸索,期间还碰到了没有接口文档,字段含义全靠猜测、爬取分页过大不返回结果、部分字段有时会因为编码问题无法存入数据库等一系列奇奇怪怪的问题。于是起码一周有余的时间我都花在了写数据爬取相关的逻辑上,最后花了半个月才写完第一版后端代码,换成在学校做课程设计黄花菜都凉了。好在带我的同学很宽容,给我排了很长的工期,赶在ddl前加了几天班,还是按时交工了。

那时的我还不知道未来还有很长的返工的日子等着我。业务方无法接受定时任务带来的延时,要求数据和数据源平台完全同步。对方的数据库必然是拿不到的,因此只能改变方案,牺牲部分响应时间,请求时后端直接去数据源爬取,不再入库。这意味着整个后端逻辑几乎都要重写。Model层的代码完全失去作用,Service层代码也需要大改。加上期间业务方还在不断对模块提新需求和春节休假,导致这一个模块最终做到了二月中旬,前前后后弄了整整两个半月。吃过了苦头,对工作中沟通的重要性又有了新的认识。如果一开始就把各种细节都确定好,这次返工是完全可以避免的。

房子只租到了三月初,加之自己也要准备毕业设计了,后续我只接了一个展示当前版本未合入代码的模块,业务逻辑也差不多,另外还完成了两个模块的国际化,便临近了离职的日子。遗憾的是,因为疫情原因,直到离职我也没能再进入一次办公楼。甚至交还电脑都是在中航园区保安处,连给矮楼再拍一张照片的机会都没有。

搬砖时的一些思考

搬砖的时候我一直在想的一个问题是,如何判断一个研究方向是不是企业需要的呢?下面是我根据这段时间的观察得出的一些浅薄体会。

岗位的需求要从企业的目标和组成出发。要明确的一点是国企和私企在这两个方面有着很大不同。ICT行业的龙头企业均为私企,因此这里的分析也只针对私企。又由于我入职的是技术类岗位,对其他如法务、人力、行政、运营之类的岗位不太了解,所以分析中涉及到的岗位也都限定在技术类。

首先,私企最重要的目标当然是盈利。盈利是靠服务或产品创造的。举个例子,美团向外提供外卖服务,并从中赚取中间商差价。此外,他们还提供其他的服务,例如订机票、订酒店等等。最终这些服务都被整合到了一个叫美团的APP上,这就是他们的产品。事实上,大部分的服务最终都变成了看得见摸得着的产品,那么为什么还要单独强调“服务”这个概念呢?因为确实还存在着那么一些没办法具象化的话的东西,比如某些公司提供的一些咨询服务,他们利用专业知识和经验积累为客户提供解决方案。再举个例子,小明想要开一家公司,公司内部需要布置网络,而小明又不懂技术,这个时候他就可以向提供ICT技术咨询服务的公司求助,他们根据小明的需求告诉他需要买多少台服务器,各种设备应该选用什么样的配置,公司内应该怎么组网等等,甚至可以派人驻场直接帮助小明把这一切打理好,小明只需要找好团队公司就能直接运营了。这种服务的产物往往是一些意见,而且由于客户的需求不同会因人而异,不存在一个通用的模板,自然也不方便变成具象化的产品。

企业依靠服务和产品盈利,除开维持公司正常运转的岗位,其余人员的组成一定是围绕它们展开的。因此,分析企业对岗位的需求可以从他们的产品出发。我把公司内的技术岗位分成两条线:业务线支撑线。业务线团队是直接负责公司产品的研发的。以字节跳动的抖音为例,业务线就是直接负责抖音这个APP的团队,这个团队产出的代码最终打成包上架到各个应用商店,交付给用户。支撑线通常是为业务线提供工具或维护公司正常运转的团队,例如架构团队,他们负责整个公司基础设施的构建,包括各种数据中心,内网搭建,虚拟化等。再上层一点的团队负责公司通用组件的研发与维护,例如各种数据库、消息队列等中间件。总而言之,支撑线团队负责的是一些抽象程度高,通用性强的组件,相较于业务线更为底层。他们的产出不直接面向用户,而是作为开发的必要工具提供给业务线团队。另外,为了维护公司的正常运转,会存在着许许多多的内部系统,例如工资系统、报销系统、请假系统等等。当然换种角度看这些团队也可以被归到业务线,只是他们的产品是对内的,而不是对外的。再比如,算法团队也可以算到支撑线中。例如推荐算法团队提供封装好SDK供抖音业务线团队调用。还有一种特殊的支撑线是安全部门,负载保障公司和产品的信息安全。事实上,这种分析思想不仅仅适用于ICT行业中的技术岗,人力、行政、财务、法务等也都是为了保障公司的正常运转。

了解了岗位分类,接下来就要落实到具体的岗位了。先说业务线,业务线所需岗位和产品的形式直接相关。如果产品是APP,那么客户端工程师肯定必不可少,同时,APP中会存在服务端的逻辑,所以也需要服务端工程师。此外,为了保证产品质量,还需要配套测试团队。如果产品是Web形式的,那就需要前端后端,客户端就没有需求了。再进一步,华为、小米等一些企业的产品是各种硬件设备,如手机电脑等,他们业务部门的组成又不一样了。以手机为例,可能有的团队负责OS,有的团队负责相机,有的团队负责通信模块、有的团队负责各种原生APP。根据团队职能不同其内设岗位将再进行细分。再说支撑线。在互联网企业中,支撑线提供的岗位大同小异,因为各种基础设施所有的公司都有需求。在当前上云已成为常态的背景下,这部分岗位主要来自IaaS和PaaS的需求,例如容器、负载均衡、数据库、缓存、消息队列、大数据平台等。

此外,一些体量大,实力强的企业往往还会养一个研究团队,用于探索行业的前沿问题,以保持自己的行业领先地位。研究团队涉及到的方向大多还是和公司业务相关的,研究团队的人员往往也会积极寻求和业务部门的合作,用于落地研究成果。因为一个现实的问题是企业对这些部门的投入往往会大于他们为公司创造的看得见的价值。如果不积极寻求与业务部门的合作,当危机来临时这种部门往往会最先被裁掉。相反,业务线团队的被裁风险会相对较小,因为他们是直接为公司创造价值的团队。另外由于业务部门是直接面向用户的部门,交付压力会特别大。因为各种发版日期,产品的发布日期都是定死的,从而也导致了业务部门的加班风险很大。但收获往往和付出成正比,业务部门的年终奖相较于其他团队也会更多。

下岗后的打算

前前后后拖了半个月,这篇总结终于到了尾声。原本我设想只是简短的记录一下实习生活,没想到写着写着就成了6000字的大块头。而此刻毕设却还没有任何进展(似乎把精力花在了奇怪的地方)。

最后到了Flag环节。这个学期的计划包括每天至少一道算法题(还没倒!),学完CSAPP,自学一下编译原理(是当初偷懒没选欠下的债)。最大的希望当然是赶快搞明白毕设,顺利毕业,早日开始毕业旅行。

End.