2017.08.14,结束了两周的等待,如愿以偿开始了自己的美团实习生活,本来抱着三五个月走人,争取下一份实习的心态,没想到一直到转为暑期实习生、到通过留用面试、再到年后继续实习,直到今天,我已经在美团度过了615个日夜。这里的人,这里的事,一切都十分美好。
写本文的目的,是想通过自身的实习经历,来总结下一名算法工程师所需要具备的基本的能力,当然,这仅仅是从我本人经历出发,如果你已经对这个岗位有了深刻的认识,那么你可以点击退出;如果你仍然处于迷茫阶段,那么我希望本文能够对你起到一定的帮助。
从我在美团这两年的实习中的所做所见,作为一名应届算法工程师,我认为应该具备下面的几种能力,当然,这种能力针对那些偏业务的算法工程师,而非纯研究型的。
1、算法的基本认识:一名算法工程师,最基本的算法能力还是必须具备的。不过,随着深度学习的发展,传统的方法如SVM等算法在实际应用中已经很少使用,至少这两年间我是没有用过的,模型一般使用的是Xgboost和LightGBM作为Base,随后使用深度学习方法或者强化学习方法进行提升。当然,推荐领域的LR和FM等方法仍然有所使用。所以,树模型是一定要牢固掌握的,然后针对你不同的求职方向,学习一些相关的深度学习模型,以及深度学习模型中一些小trick,如dropout、正则、Batch-Norm等。关于数学,个人感觉深度学习的发展已经开始弱化对于数学的要求,不过基本的梯度下降、反向传播、树模型的推导、LR的推导、FM的推导等,还是必须要掌握的。
2、过硬的代码能力:一名算法工程师,Python无疑是最适合我们的语言,但是是不是只有Python就足够了呢?当然不是,算法工程师,包含算法和工程两个方面。Python可以帮我们实现算法,还需要学习一门语言帮助我们的算法能够应用到线上。在美团,我们使用的是Java语言,作为一名实习生,我还没有机会接触到能够上线的代码,不过在未来,一定是需要负责线上代码的,所以java语言也是需要熟练掌握的。
需要提醒大家的是,尽管你可能觉得一些数据结构的知识,对于一名算法工程师来说仅仅是用来应付面试,在实际工作中并不重要,这么想,其实是大错特错了。我们很可能在不经意间,就会需要用到数据结构的知识,比如这两年我用到最多的就是Trie树。掌握好数据结构,无论是对面试还是将来的工作,都是十分重要的。
3、数据处理和分析能力:一名偏业务的算法工程师,数据处理和分析的能力是必备的。首先,一般我们都会为自己设定一个业务目标,比如整体的转化率,那么我们通常会将此分为各个阶段,并观察每个阶段的情况。比如分析外卖的整体转化率,可以划分为曝光、用户进入商家页、用户进入提交订单页,到最后完成支付等几个阶段分别观察效果,一旦哪个环节出现问题,我们可以快速定位解决。其次,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。在使用机器学习或者深度学习模型时,我们必须从大数据中提取我们的训练数据,计算相应的特征,并分析特征与我们的目标之间可能存在的关系。
在刚去美团的两个月,基本没有接触到模型相关的东西,主要负责的是建立一整套产品的数据指标框架,比如漏斗模型、留存率等等。尽管在当时觉得很枯燥,但是现在想想对自己的提升还是十分重要的。
说了这么多,数据敏感度是可以通过与数据打交道不断培养的,但是基本的工具我们可以提前掌握。在美团,我使用最多的是spark sql和hive,这大概会占据我70%的时间。关于hive,掌握一些常用的函数的使用方法,如concat_ws,row_number,case..when,if,get_json_object等等,对于spark sql,掌握其运行的基本原理,以及一些常见问题的处理方法。首先,学会如何处理数据倾斜,有时候因为一个数据倾斜问题,一整天都浪费在调试一个spark代码中了,其次,学习如何尽量减少spark任务的空间占用,同时加速spark任务运行速度,spark作业在线上调用时,会占用公共资源,你的任务占用的资源越多,别人占用的资源就越少,同时,如果你的任务运行的快,也可以给别人的任务更多的空间。spark可以通过很多语言来实现,不过我建议还是学习一下scala吧,毕竟可以和java无缝衔接。除了spark和hive,掌握一定的excel知识也是必要的。
4、模型的积累和迁移能力:在工作中,模型的积累同样是必要的,现在模型五花八门,如Transformer、Bert、DIEN等都是这几年才提出的新模型,对这些模型,我们需要不断跟进积累。同时,光了解这些模型怎么做的还不行,关键是了解这些模型为什么要这么做。但是,光积累这些模型是不够的,还需要与自己的业务相结合,针对一个业务问题,如果你能快速想到一个可行的解决方案,那么说明你的积累还算凑合,如果你无法想到一个合适的模型,那说明你还差得很远。同时,对于你新学习的模型,学会反思能不能将其部分的思想应用于你的业务问题,并对现有的模型进行改进。
好了,说了这么多,我们怎么能从繁忙的工作生活中,了解到最新的论文信息呢?对于我个人来说,主要有以下几个渠道吧:PaperWeekly公众号、原创号主(从个人看来,许多热门公众号的内容大同小异、送书、送资料、互推这种活动,使得公众号商业化了,这些公众号尽管关注人多,但我并不认为它能带来更多的价值。仅个人观点,也许是我看的少,嘻嘻)、学习交流群名词积累(在我自己的学习交流群,大家在交流的时候会说出一些自己不懂得模型,比如前几天的深度树匹配模型,如果你不懂,把它记下来,回头再详细理解)、分享交流会(在美团,一些交流会是十分有价值的,比如张俊林老师的推荐系统分享、王仲远师兄的知识图谱分享等。如果你没有机会参与这些公司内部的交流活动,那么如DataFun社区提供的免费讲座,可以多报名参加)。
5、产品能力:好吧,人人都是产品经理,我们RD有时候也是可以翻身做主人的,不一定在任何情况下都听产品经理的需求,我们需要对这些产品需求有自身的一个认识。不得不说,我在这方面还是有所欠缺的。并不是每个人都具备天生的产品思维,但只要你多看,多想,多问,相信你的产品能力一定可以有所提升,重在积累。
6、软实力:软实力包括思维能力、沟通能力、表达能力、文化修养、学习能力、团队协作能力等等,上面这些是在工作中大家需要注重培养的。
好了,以上是我在美团实习近两年来对于算法工程师这一职位的一点基本的认识。接下来,如果你已经取得了比较好的offer,那么到此你可以退出了,但是如果你还在准备今年或者明年的校招面试,我希望你可以继续看下去,我会和你分享一下去年校招过程中自己的一些经验:
笔试
提前批的公司有的是免笔试,而有的是免简历筛选,笔试题型主要有几种:
1、选择题:选择题涵盖的内容还是很多的,基础编程知识如C++和Java、概率论、机器学习基础、深度学习基础、数据结构等等
2、编程题:一般是leetcode中等难度
3、简答题:简答题主要是手推公式和业务理解。
面试
我在去年校招参加了十几家公司的面试,收获了10个左右的offer,总体感觉是:公司对于算法工程师的要求越来越高。面试主要考察的点有以下几个方面:
1、实习、论文、比赛:面试官一般会让你先进行自我介绍,然后会根据你简历上写的实习经历、论文、比赛经历进行展开。所以简历上的东西一定要是你亲身经历过的,可以按照STAR法则进行讲解。在这过程中,面试官会从算法理解、业务理解等多个方面考察你。
2、深度学习/机器学习基础:在聊完简历项目之后,往往会考察一些算法的基础。常考的是过拟合的解决、正则项、boosting模型等等,这一块需要你对深度学习/机器学习基础有所了解,同时对常见的模型有深入的认识和理解。对于简单的公式也需要理解和掌握推导(LR、普通神经网络反向传播、RNN和LSTM的前向传播、SVM、XGBoost等等)。
3、手撕代码:手撕代码题各公司的难度不一样,不过一般leetcode的中等难度的题就可以。小编建议,大家一定要把数组、链表、二叉树和动态规划的题目掌握好。
4、智力题:常考的就是概率计算问题。
5、业务理解:这一块小编觉得是非常难的,一般会给你一个场景,让你设计一套算法流程,或者问你对于当前你的项目,后续的工作方向等等。
6、其他:其他的面试官可能会考察一些工程上的问题如多进程、多线程等、spark/hive等等。
下面是去年小编的面经链接:
1、阿里(四面未通过):https://www.jianshu.com/p/304e1023c4cb
2、百度核心搜索部(三面未通过):https://www.jianshu.com/p/02d931d5c1c8
3、知乎(三面未通过):https://www.jianshu.com/p/40259bb05357
4、ThoughtWorks(初试+sp加试 通过):https://www.jianshu.com/p/0b5514908683
5、美团留用面试(共一面,通过):https://www.jianshu.com/p/bbe21ff40724
6、便利蜂(共三面,通过):https://www.jianshu.com/p/51e2d16f16a5
7、贝壳(三面+sp假面,通过):https://www.jianshu.com/p/cd0a809cf198
8、一点资讯(共三面,通过):https://www.jianshu.com/p/fffc15c9d31d
9、百度Feed(二面未通过):https://www.jianshu.com/p/65032f77f903
10、猫眼(三面未通过):https://www.jianshu.com/p/c32787be3dc8
11、搜狗(共三面,通过):https://www.jianshu.com/p/8a116eb7fd32
12、小米(共两面,通过):https://www.jianshu.com/p/e34ebebae15f
13、滴滴(共三面,通过):https://www.jianshu.com/p/bc9d5f8206a0
14、拼多多(共两面,通过):https://www.jianshu.com/p/a15bc7d0686a
15、爱奇艺(共三面,通过):https://www.jianshu.com/p/4ceb5de29c76
16、头条(共三面,通过):https://www.jianshu.com/p/5bc533d1bf62
可以看到,个人感觉自身还是有很多不足之处的,总结几次面试失败的原因,主要有亮点,首先在于数据机构题掌握的不佳,比如百度的面试、知乎的面试;其次在于对于业务的理解不够深入,还停留在领导派活,埋头苦干的地步,自己对于业务的思考不足,比如阿里和猫眼的面试。
下面推荐一些资料帮你更好的进行复习吧:
1、《统计机器学习》经典中的经典,建议至少读两遍!
2、《百面机器学习》对一些面试常见问题进行了总结和梳理
3、深度学习500问:https://github.com/scutan90/DeepLearning-500-questions/
4、SVM:http://blog.pluskid.org/?page_id=683
5、李宏毅深度学习课:https://www.bilibili.com/video/av9770302?from=search&seid=9066694202064136038
6、李宏毅强化学习课:https://www.bilibili.com/video/av24724071?from=search&seid=11841282802558935758
7、李宏毅机器学习课:https://www.bilibili.com/video/av35932863?from=search&seid=7464664329294734466
8、线性代数的本质:https://www.bilibili.com/video/av44855426?from=search&seid=15873340646320697328
好了,说了这么多,最后希望你在今年的秋天或者未来的某个秋天,能够顺利拿到自己心仪的offer,同时希望你能够不忘初心,砥砺前行!加油!