数学与应用数学-字节跳动算法岗

你们有没有发现,学数学的人转行做什么都行?

我学的是数学与应用数学,毕业后去了字节跳动做算法工程师。年薪50万+,还解决了北京户口。

说实话,这条路走得不容易。但我想说的是:数学专业不是死路,只要找对方向,一样可以年薪50万+。

选专业那天

高考出分那天,我躺在床上,看着天花板发呆。

理科613分,比一本线高了110分。这个分数可以报很多不错的学校。

我妈拿着志愿填报指南,问我:“你想学什么?”

我想了想,说:“数学吧。”

我妈愣了一下:“数学?当老师?”

“不一定。“我说,“数学是基础学科,学好了什么都能转。”

我妈不太理解,但她尊重我的选择。后来我才知道,她查了很多资料,问了很多前辈,才支持我选数学。

我被华东师范大学数学与应用数学专业录取了。

华东师大的数学专业在全国排名前十五,在师范类院校里算是很强的。

后来我才知道,选数学是我做过的最正确的决定之一。

高中的阴影

说实话,我高中的时候数学挺好的。

高考数学143分,是我们班的第二名。每次考试140+,是我妈在亲戚面前的骄傲。

所以选数学专业,我是有点自信在里面的。

结果大一就被打脸了。

大学第一课:数学分析的暴击

开学第一周,我就被数学分析给整懵了。

第一节课,老师在黑板上写了一行字:“ε-δ语言”

然后开始讲什么叫极限。

“对于任意给定的ε>0,存在δ>0,使得当0<|x-x0|<δ时,有|f(x)-A|<ε,则称A为f(x)当x趋近于x0时的极限。”

我盯着黑板,大脑一片空白。

这是什么意思?什么叫”任意给定的ε”?什么叫”存在δ”?

高中数学从来没见过这种东西啊!

下课后,我找老师问:“老师,这个ε-δ语言是什么意思?”

老师笑了笑:“这个是严格化的极限定义,是现代数学的基础。你们慢慢理解,不着急。”

我回去看了三遍教材,查了五个小时的资料,还是不太理解。

后来我去网上找了MIT的公开课,看了三个版本的讲解,才终于理解了这个概念。

高中数学是技巧,大学数学是思维;高中数学是套路,大学数学是证明。完全不是一个世界。

我记得第一节数分课,老师在黑板上写了一个证明题,全班鸦雀无声。我盯着看了半小时,一个字都写不出来。

那一刻我才意识到:大学数学跟高中数学是两回事。

大一下学期的危机

大一下学期期末考试,我数分才62分,差点挂科。

那段时间我很沮丧,开始怀疑自己:我是不是根本不适合学数学?

室友小王学得很轻松,每次考试都是90+。我问他怎么学的,他说:“就是跟着老师走啊,课后题做一遍就行了。”

我也做了啊,为什么我还是60多分?

后来我才明白,我的方法有问题。

高中学习是”刷题模式”——做大量的题,熟能生巧。但大学数学不一样。大学数学需要”理解模式”——理解概念的内涵,理解定理的证明,理解知识的联系。

光做题不理解,做再多也是白搭。

那段时间我一度想转专业。我去找辅导员,说想转到计算机专业。

辅导员问我:“你想清楚了吗?数学专业虽然难,但出路很广。计算机专业虽然热门,但竞争也很激烈。”

我想了想,说:“我再考虑考虑。“

找到学习方法

大一下学期暑假,我没有回家,留在学校自习。

我重新开始学数分。方法跟之前不一样了:

1. 概念理解 每一章的概念,我都看了至少三个版本的讲解。除了教材,我还看了复旦的《数学分析》、MIT的公开课、以及网上各种博客。

2. 定理证明 每个重要定理的证明,我都自己推导一遍。推到卡住的地方,就去查资料、问老师,直到完全理解为止。

3. 例题练习 每学完一章,做20-30道例题。不求多,但求理解。做完一道题,要能说出这道题用了什么知识点,用了什么方法。

4. 学习小组 我和班上几个同学每周聚一次讨论难题。每个人的思路不一样,讨论中能学到很多。

这套方法坚持下来,效果很明显。

大一下学期,我数分考了78分。大二上学期,考了85分。大二下学期,考了92分。

我终于找到了学数学的感觉。

数学系的日常

数学系的课程很繁重。

大二要学:数学分析III、线性代数、概率论、常微分方程、复变函数……

大三要学:实变函数、泛函分析、数理统计、随机过程、拓扑学……

每一门课都很难,但每一门课都很有用。

实变函数让我理解了”Lebesgue积分”,比Riemann积分更一般化。

泛函分析让我理解了”无限维空间”,这是现代数学的重要工具。

随机过程让我理解了”随机现象”,这对以后做机器学习很有帮助。

到大三,我的平均GPA达到了3.5,在班上排前20%。

发现新方向

大三的时候,我开始考虑就业问题。

数学系的就业方向其实挺广的:

  • 金融:量化投资、风险管理、精算师……
  • 互联网:算法工程师、数据科学家、产品经理……
  • 教育:数学老师、培训师……
  • 其他:咨询、公务员……

但我不想当老师,也不想做纯金融。

后来我接触到机器学习和人工智能,发现这正是数学的应用方向。

机器学习的本质是数学:

  • 线性回归、逻辑回归:用优化方法求解参数
  • 神经网络:用梯度下降法更新参数
  • 支持向量机:用凸优化理论分析性能
  • 主成分分析:用矩阵论做降维

数学是机器学习的理论基础。

我开始自学编程和机器学习。

Python是自学的,跟着网课学了两周。然后开始学机器学习:吴恩达的课看了两遍,周志华的西瓜书看了三遍。

第一次做项目

大三下学期,我开始做自己的项目。

第一个项目:房价预测模型

我用Python的sklearn库,实现了线性回归、决策树、随机森林等算法。

数据集是Kaggle上的房价预测比赛,大概有2万条数据,包含房屋面积、房间数、地段等信息。

预测的目标是房屋售价。

这个项目让我理解了机器学习的基本流程:数据预处理、特征工程、模型选择、参数调优……

第二个项目:图像分类模型

我用PyTorch实现了一个CNN网络,在CIFAR-10数据集上训练。

CIFAR-10有10个类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。

CNN的训练需要大量的算力。我的笔记本跑不动,就去学校的服务器上跑。

训练了大概10个小时,最后准确率达到了85%以上。

这个项目让我理解了深度学习的原理,也让我对计算机视觉产生了兴趣。

第三个项目:Kaggle比赛

我还参加了Kaggle的一个比赛:泰坦尼克号生存预测。

这是一个入门级的比赛,预测泰坦尼克号上的乘客是否生还。

我用了随机森林和梯度提升树两种方法,最后排名在前20%。

虽然不是前10%,但也积累了实战经验。

这些项目,成为我找工作的核心竞争力。

找工作的准备

大四上学期,我开始找工作。

我关注的岗位是:算法工程师,也叫机器学习工程师

算法工程师的薪资很高,大厂能给到30-50万。但要求也很高:扎实的数学基础、熟练的编程能力、丰富的项目经验。

我当时的项目经验还算丰富,但编程能力一般。

我花了两周时间刷算法题。每天刷3-5道LeetCode题目,主要是数组、链表、树、动态规划等常见题型。

刷了大概200道题之后,算法能力有了明显提升。

然后开始准备面试。

算法工程师的面试分为三部分:

  1. 编程题(Algorithm):考察算法和数据结构
  2. 机器学习基础(ML Theory):考察机器学习理论
  3. 项目介绍(Project):介绍自己做过的项目

字节跳动面试经历

字节跳动是我最想去的公司。

字节跳动是互联网新贵,抖音、TikTok、今日头条都是它的产品。算法工程师的需求量很大,薪资也很高。

字节跳动的面试流程是:笔试→技术面×3→HR面→offer

笔试

字节的笔试是ACM赛制的算法题,难度不小。

我提前刷了两个月的LeetCode,大概刷了400道题。

笔试那天,一共三道题,我做出来了两道半。

第一道是字符串处理的简单题,我很快就做出来了。

第二道是动态规划的medium题,我想了二十分钟,做出来了。

第三道是图的遍历难题,我只做了一半。

后来我通过了笔试,进入了面试环节。

一面

一面的面试官是个年轻的小哥哥,看起来很和善。

一面的内容是:算法题+基础知识。

算法题是一道二叉树的题目:“二叉树的层序遍历”。

我很快就写出来了。他看了之后点了点头,然后让我写一个变体:“二叉树的锯齿形层序遍历”。

我又写出来了。

然后他问了一些机器学习的基础知识:

  • “什么是过拟合?怎么防止过拟合?”
  • “什么是梯度消失?怎么解决?”
  • “L1正则化和L2正则化的区别是什么?”

我都回答得不错。

面试结束后,他说:“不错,基础很扎实。等下一轮面试通知吧。“

二面

二面的面试官看起来更资深一些,是组的Tech Lead。

二面的内容是:系统设计+项目介绍。

系统设计问的是”如何设计一个推荐系统”。

这道题我之前准备过,从数据收集、特征工程、模型选择、在线服务等几个方面回答的。

面试官听完,点了点头:“思路很清晰。但你对推荐系统的冷启动问题有了解吗?”

我想了想,说:“冷启动是新用户或新物品没有历史数据的问题。解决方法有:基于内容的推荐、利用社交网络数据、探索与利用策略等。”

他表示满意。

然后我介绍了我的项目经历。他对图像分类项目很感兴趣,问了很多技术细节。

面试结束后,他说:“很好,进入下一轮。“

三面

三面是主管面,面试官是组的负责人。

主管面问得比较宏观:

  • “你的职业规划是什么?”
  • “为什么选择字节跳动?”
  • “你对AI的理解是什么?”
  • “你觉得自己有什么优势?”

我根据自己的经历,如实回答了。

面试结束后,他说:“你很不错,等HR联系你。“

拿到offer

一周后,我收到了offer。

薪资结构是这样的:

  • 底薪:月薪35000元(年薪42万)
  • 年终奖:通常2-4个月工资,按绩效发放
  • 股票:入职时授予一定数量的期权,分四年行权(第一年25%,后面每年25%)
  • 补贴:餐补、房补、交通补贴等,每月约2000元

五险一金按实际工资缴纳,公积金12%。公司帮助解决北京户口。

算下来一年到手大概50-60万。

我还拿到了腾讯和阿里的offer,但综合考虑后选择了字节。

选择字节的理由:

  1. 字节的推荐算法很强,能学到很多东西
  2. 字节的成长速度很快,机会多
  3. 薪资待遇更好

入职体验

入职字节后,我被分到了抖音的推荐算法组。

说实话,一开始有点不适应。

学校的项目是小打小闹,公司的项目是大规模系统工程。

一个推荐系统要处理几亿用户的数据,每天产生几十TB的日志。这跟我在学校里做的项目完全不是一个量级。

第一次做code review的时候,我的代码被打回来三次。

组长说我的变量命名不规范,注释不够详细,代码逻辑不够清晰。

“在学校里,你写的代码只有你自己看。在公司里,你写的代码别人要看、维护、修改。要对代码质量负责。”

这句话让我印象深刻。

组里的导师是清华的博士,人很好,带着我熟悉业务。有不懂的问题可以随时问他。

前三个月是新人培训期,主要学习公司的技术栈、业务逻辑、代码规范。

我学会了:

  • 用Flink做实时数据处理
  • 用TensorFlow Serving做模型部署
  • 用A/B测试评估算法效果
  • 用Jira做项目管理

现在我已经工作一年多了,技术能力提升了很多,也逐渐适应了互联网的工作节奏。

工作日常

算法工程师的工作,大概分为三类:

1. 算法研发 根据业务需求,研发新的算法模型。比如改进推荐算法,提高用户点击率。

2. 模型优化 对现有模型进行优化。比如调参、改进模型结构、提升模型效率。

3. 工程开发 把算法模型落地成服务。需要写很多工程代码,跟纯算法研究不一样。

我的一天大概是这样的:

  • 9:00:到公司,看昨天的数据指标
  • 10:00:组会,汇报工作进展
  • 11:00-12:00:开发工作
  • 12:00-13:30:午休
  • 13:30-18:00:开发工作
  • 18:00-19:00:吃饭
  • 19:00-21:00:加班(看情况)

忙的时候加班到晚上十一点,闲的时候六点准时下班。

平均下来,一周工作50-55个小时。

我的规划

1年规划: 深入理解推荐系统的业务逻辑,成为组里的骨干力量。

3年规划: 成为技术专家,有机会带新人,职级争取到3-1或更高。

字节的职级体系是这样的:

  • 1-1:初级工程师
  • 1-2:工程师
  • 2-1:高级工程师
  • 2-2:资深工程师
  • 3-1:专家
  • 3-2:高级专家

我目前是1-2,争取三年内升到2-1。

5年规划: 考虑转管理,或者跳槽到其他大厂拓宽视野。

长期规划: 如果有机会,想创业或者加入初创公司。

碎碎念

学数学不是没有出路,关键是要找到应用方向

纯数学确实难就业,但数学+计算机、数学+金融、数学+AI……这些都是黄金组合。

我身边学数学的同学,去向各不相同:

  • 有的去了金融行业:量化研究员、风险管理师、精算师……
  • 有的去了互联网行业:算法工程师、数据分析师、产品经理……
  • 有的去了教育行业:数学老师、培训师……
  • 有的继续深造:保研、考研、出国读博……

如果你也想从数学转行做AI,我的建议是:

1. 数学基础要扎实

这是你最大的优势,不要丢了。线性代数、概率论、统计学……这些是机器学习的数学基础。工作之后你会发现,数学好的人学新东西特别快。

2. 早点学编程

Python是首选,越早学会越好。建议大一大二就开始学,不要等到大三大四才着急。

3. 多做项目

项目经验比成绩重要,能写到简历上的项目才是真本事。建议参加Kaggle比赛、做开源项目、去公司实习。

4. 刷题准备面试

算法题是互联网大厂的标配,早准备早受益。建议刷300-500道LeetCode。

5. 找实习

实习经历很重要,大厂实习经历更是加分项。建议大三暑假就去大厂实习,表现好的话可以直接拿到return offer。

6. 保持好奇心

AI领域发展很快,新的模型、新的技术层出不穷。要保持学习的热情,跟上时代的步伐。

最后,送数学系的同学一句话:数学是最强大的武器,关键看你用在什么地方。

我们学数学的人,不要妄自菲薄。我们的逻辑思维能力、抽象思维能力、解决问题的能力……这些都是宝贵的财富。

只要找准方向,我们一样可以年薪50万+。

加油!你们也可以的。


关联阅读