当前位置: 首页 > 编程日记 > 正文

我在美团的这两年,想和你分享

xmorient

作者 | 石晓文
来源 | 小小挖掘机(ID:wAIsjwj)

01

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、软实力

软实力包括思维能力、沟通能力、表达能力、文化修养、学习能力、团队协作能力等等,上面这些是在工作中大家需要注重培养的。

02

好了,以上是我在美团实习近两年来对于算法工程师这一职位的一点基本的认识。接下来,如果你已经取得了比较好的offer,那么到此你可以退出了,但是如果你还在准备今年或者明年的校招面试,我希望你可以继续看下去,我会和你分享一下去年校招过程中自己的一些经验:

1、笔试

提前批的公司有的是免笔试,而有的是免简历筛选,笔试题型主要有几种:
1、选择题:选择题涵盖的内容还是很多的,基础编程知识如C++和Java、概率论、机器学习基础、深度学习基础、数据结构等等
2、编程题:一般是leetcode中等难度
3、简答题:简答题主要是手推公式和业务理解。

2、面试

我在去年校招参加了十几家公司的面试,收获了10个左右的offer,总体感觉是:公司对于算法工程师的要求越来越高。面试主要考察的点有以下几个方面:
1、实习、论文、比赛:面试官一般会让你先进行自我介绍,然后会根据你简历上写的实习经历、论文、比赛经历进行展开。所以简历上的东西一定要是你亲身经历过的,可以按照STAR法则进行讲解。在这过程中,面试官会从算法理解、业务理解等多个方面考察你。
2、深度学习/机器学习基础:在聊完简历项目之后,往往会考察一些算法的基础。常考的是过拟合的解决、正则项、boosting模型等等,这一块需要你对深度学习/机器学习基础有所了解,同时对常见的模型有深入的认识和理解。对于简单的公式也需要理解和掌握推导(LR、普通神经网络反向传播、RNN和LSTM的前向传播、SVM、XGBoost等等)。
3、手撕代码:手撕代码题各公司的难度不一样,不过一般leetcode的中等难度的题就可以。小编建议,大家一定要把数组、链表、二叉树和动态规划的题目掌握好。
4、智力题:常考的就是概率计算问题。
5、业务理解:这一块小编觉得是非常难的,一般会给你一个场景,让你设计一套算法流程,或者问你对于当前你的项目,后续的工作方向等等。
6、其他:其他的面试官可能会考察一些工程上的问题如多进程、多线程等、spark/hive等等。

3、面经分享

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

可以看到,个人感觉自身还是有很多不足之处的,总结几次面试失败的原因,主要有两点,首先在于数据机构题掌握的不佳,没有学会举一反三,比如百度的面试、知乎的面试;其次在于对于业务的理解不够深入,还停留在领导派活,埋头苦干的地步,自己对于业务的思考不足导致面试失败的,比如阿里和猫眼的面试。

4、资料推荐

下面推荐一些资料帮你更好的进行复习吧:
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=158733406463206973

写在最后

说了这么多,最后希望你在今年的秋天或者未来的某个秋天,能够顺利拿到自己心仪的offer,同时希望你能够不忘初心,砥砺前行!加油!

原文链接:我在美团的这两年,想和你分享


精彩推荐



6月29-30日,2019以太坊技术及应用大会 特邀以太坊创始人V神与以太坊基金会核心成员,以及海内外知名专家齐聚北京,聚焦前沿技术,把握时代机遇,深耕行业应用,共话以太坊2.0新生态。


扫码或点击阅读原文,既享优惠购票!


640?wx_fmt=jpeg


推荐阅读

  • Python从入门到精通,这篇文章为你列出了25个关键技术点(附代码)

  • 基础必备 | Python处理文件系统的10种方法

  • B站超全分享!2万人收藏的免费计算机科学速成课

  • 如何正确的获取数据?

  • 苹果 SwiftUI 踢馆谷歌 Flutter!

  • 惊!为拯救美国落伍的 STEM 教育,纷纷出手教老师编程?!

  • 超级黑幕:开发者千万别被算法迷惑了!

  • 程序员爬取 42 年高考数据,告诉你高考为什么这么难?

  • 把病毒写到区块链上可以永远不死? 我们做了一个大胆的实验…… | 技术头条

  • 新一代私有云来了!看透基于开源生态的产品化


640?wx_fmt=png


点击阅读原文,查看更多精彩内容。

相关文章:

【Qt】QtCreator updatePchInfo:switching to none

1、Pch名词解释 Pch(PreCompiled Headers)预编译头文件。 使用方法: CONFIG+=precompile_header PRECOMPILED_HEADER=XXX.h 2、updatePchInfo:switching to none 和QtCreator代码格式化Beautifier插件配置了clang code model有关系。 猜测:clang分析预编译头文件相关,…

学习框架、库的经验

熟悉基础语法把框架的功能过一遍,看看有哪些功能从文档的demo入口去学习上手会更快在你的开发目录要有一个专门写demo的页面,用以调试页面,试验新功能如果框架或者库提供有demo则更好,可以从中得到很多有用的东西

开源应用程序结构

2019独角兽企业重金招聘Python工程师标准>>> 给有兴趣的同学介绍的。这里面介绍了很多著名的开源软件的架构,相信读后会有所收获。 地址:http://www.aosabook.org/en/index.html 转载于:https://my.oschina.net/qinlinwang/blog/71649

免费GPU哪家强?谷歌Kaggle vs. Colab

作者 | Jeff Hale译者 | Monanfei责编 | 夕颜出品 | AI科技大本营(id:rgznai100)谷歌有两个平台提供免费的云端GPU:Colab和Kaggle, 如果你想深入学习人工智能和深度学习技术,那么这两款GPU将带给你很棒学习…

【SVN】svn“E155017工作副本的参考文件损坏、E200014文件校验和不匹配”的解决方法

1、问题描述 在执行svn提交时报错 svn: E155017: 工作副本的参考文件损坏 svn: E200014: ‘test.cpp’ 的文件校验和不匹配: 期望:xxxx 实际:xxxx 2、解决方法 2.1 拷贝 最好将提交的项目拷贝一份; 2.2 删除 使用svn rm --k…

QT程序启动加载流程简介

1. QT应用程序启动加载流程简介1.1 QWS与QPA启动客户端程序区别1.1.1 QWS(Qt Window System)介绍QWS(Qt Windows System)是QT自行开发的窗口系统,体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示,QWS Client实现界面,两者…

QQ2012 Under Ubuntu

下载地址: QQ2012 Under Ubuntu转载于:https://www.cnblogs.com/ismdeep/archive/2012/08/09/2630067.html

25亿布局大湾区,创新工场的AI下一站

2019年6月5日,创新工场大湾区总部正式开业启动,集“产业投资AI 研究院商业赋能落地”三个功能为一体。当天创新工场还首次分享人工智能工程院成立两年来的成绩单,创新奇智的大湾区布局,并发布大湾区人才战略。创新工场也正式宣布第…

【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口

1、简述 TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口。 2、设备树 设备树中关于串口部分的描述 2.1 基础配置 注意:在这里状态都配置成禁止&#xff…

unix的发展

转载http://blog.51cto.com/1193432/1671058转载于:https://www.cnblogs.com/vwei/p/9588823.html

让你的输入框使用Google云语音输入技术

2019独角兽企业重金招聘Python工程师标准>>> 只需一行代码,你的网站上面输入框(input),直接可以在谷歌浏览器(chrome)上面使用Google的云语音输入技术。 在你的输入框input的HTML属性里面&#…

速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条

作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee译者 | 刘畅责编 | Jane出品 | AI科技大本营(id:rgznai100)【导读】在论文《YOLACT:Real-time Instance Segmentation》中,作者提出了一种简洁的实时实例分割全…

JSP内置对象基础知识小结

JSP提供9大内置内象:一、request内象:封装了由客户端生成的HTTP请求的所有细节,主要包括了http头信息,系统信息,请求方式,请求参数等。1、获取访问请求参数:request.getParameter("arg&quo…

一个正执行的程序如何启动另一新程序并关闭现执行程序

最简单的方法有两个函数即可实现: //启动新程序WinExec("存放另一新程序的路径", SW_SHOW);//关闭现执行软件 ExitThread(0); 若在win ce 下,用WinExec这个函数就不对了,那时就应该用ShellExecuteEx了。 SHELLEXECUTEINFO ShExecIn…

【android】java.lang.NoClassDefFoundError或classnotfount等异常错误

在android上开发,当导入一个外部的包,可能会出现这类错误,我已经两次碰到了,一次是用科大讯飞的android开发包,另一次是用Jsoup包(html 解析)。 解决方案: 先去掉加入的外部包 不要把…

Java面试题(一)部分题目

博主马上要面对几家公司的面试,故自己准备了点面试题,仅供参考! 1,线程的创建的方式:答:1,继承Thread(注意,此类其实也是实现了Runnable接口的),2,实现Runnable接口2,1. …

在win ce中如何使正在运行的软件自动升级更新

创建两个独立的程序A和B:A是现正在运行的程序,B是用于辅助新版本的A覆盖旧版A 在客户端先运行A,使A提供从服务器端下载新版A放于一临时文件夹中,并运行B,关闭A; 运行的B用于执行:用新版A覆盖旧…

刘铁岩:AI打通关键环节,加快物流行业数字化转型

导语:近日,在微软亚洲研究院创新论坛上,微软亚洲研究院副院长刘铁岩分享了关于“AI物流”行业的实践经验。以下为其发言内容。 随着时代的发展,人工智能成为了决定性的技术,我们所谈的企业数字化转型也正在从“互联网”…

Unity的三种Interceptor

Unity默认提供了三种拦截器:TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。 TransparentProxyInterceptor:代理实现基于.NET Remoting技术,它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRe…

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei(腾讯高级工程师)转载自腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而“循环”,则是实现让…

作为JavaScript开发人员,这些必备的VS Code插件你都用过吗

本文翻译自:https://www.sitepoint.com/vs-code-extensions-java-developers/转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。如今,Visual Studio Code无疑是最流行的轻量级…

matlab常遇小问题汇总

1、如何注释掉多行: 同时注释掉多行,有2种方法可行: (1)、选中所有要注释的行,按快捷键"Ctrl R" 或者 选择工具菜单"Text --> Comment"; 如果释放所有要注释的行,则按快捷键"Ctrl T&qu…

《几何与代数导引》习题1.35.4

求直线之间的距离$l_1:\frac{x1}{-1}\frac{y-1}{3}\frac{z5}{2}$.$l_2:\frac{x}{3}\frac{y-6}{-9}\frac{z5}{-6}$.解:点$q(-1,1,-5)$在直线$l_1$上,点$p(0,6,-5)$在直线$l_2$上.$\vec{pq}(-1,-5,0)$.直线$l_1$的方向向量为$(-1,3,2)$,直线$l_2$的方向向量…

深度学习难,这本书让你轻松学深度学习

深度学习在短短几年之内便让世界大吃一惊。它非常有力地推动了计算机视觉、自然语言处理、自动语音识别、强化学习和统计建模等多个领域的快速发展。随着这些领域的不断进步,人们现在可以制造自动驾驶的汽车,基于短信、邮件甚至电话的自动回复系统&#…

matlab中用于小数取整的函数的用法

matlab中小数取整的函数大约有四个:floor、ceil、round、fix 若 A [-2.0, -1.9, -1.55, -1.45, -1.1, 1.0, 1.1, 1.45, 1.55, 1.9, 2.0]; floor:朝负无穷方向靠近最近的整数; floor(A) ans -2 -2 -2 -2 -2 1 1 1 1 …

SQLServer之删除约束

使用SSMS数据库管理工具删除约束 1、连接数据库,选择数据表-》展开键或者约束-》选择要删除的约束-》右键点击-》选择删除。 2、在删除对象弹出框中-》点击确定。 3、刷新表-》展开键或者约束-》查看结果。 使用T-SQL脚本删除约束 语法: --声明数据库使用…

新建silverlight项目提示未将对象设置到实例解决方案

1.打开 visual studio 命令提示 输入一下命令 2.devenv /resetskippkgs 这条命令会启动visual stuio 关闭visual studio然后输入下面的命令3.devenv /setup

毕业十年后,我忍不住出了一份程序员的高考试卷

作者 | 程序员小吴转载自公众号五分钟学算法(ID: CXYxiaowu)一、选择题(共计 50 分)1、在下列四种排序算法,只有( )是一种不稳定排序A、冒泡排序B、选择排序C、插入排序D、归并排序2、一个数组&…

查看matlab中函数源代码的方法

有几种方法可以实现查看matlab里自带函数的源代码: 在命令窗口中输入: (1)、type 函数名(如 type rgb2gray 或者 type rgb2gray.m):即可在命令窗口中显示此函数的源代码; (2)、open 函数名(如 open rgb2gray 或者 open rgb2gray.m):即可打开…

Watir-webdriver处理table

最近大脸猫同学给了我一个popup的demo,让我试着定位弹出窗口中的按钮元素。在研究过程中,发现webdriver与watir代码有区别,一度让我很郁闷,在网上也找不到相应的解决方案,刚才code运行成功,在这记一笔&…