数学与应用数学-字节跳动算法岗
你们有没有发现,学数学的人转行做什么都行?
我学的是数学与应用数学,毕业后去了字节跳动做算法工程师。年薪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道题之后,算法能力有了明显提升。
然后开始准备面试。
算法工程师的面试分为三部分:
- 编程题(Algorithm):考察算法和数据结构
- 机器学习基础(ML Theory):考察机器学习理论
- 项目介绍(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,但综合考虑后选择了字节。
选择字节的理由:
- 字节的推荐算法很强,能学到很多东西
- 字节的成长速度很快,机会多
- 薪资待遇更好
入职体验
入职字节后,我被分到了抖音的推荐算法组。
说实话,一开始有点不适应。
学校的项目是小打小闹,公司的项目是大规模系统工程。
一个推荐系统要处理几亿用户的数据,每天产生几十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万+。
加油!你们也可以的。
关联阅读
- 大厂就业参考 4.【直接就业】高价值信息差
- 专业参考 数学类.md
- 案例索引 0000_1001案例总索引
- 知识库总索引 0000浪尖大学四年知识库_总索引