你好,我是王喆。
今天是2021年的第一天,也是咱们课程的最后一讲,课程开始前,我要对你说一句,很荣幸能陪你一起度过这几个月的学习时间。
我相信,在这门课中,只要你认真学习、亲手实践,就一定能够搭建起深度学习推荐系统的知识框架,并且收获一套亲手实现的、包含工业级推荐系统各个模块的开源项目SparrowRecSys。这是咱们这门课的目标,也是你作为推荐工程师对深度学习方向的一次探索。
但要想成为一名优秀的推荐工程师,这一路上,包括我自己,也还在不断地学习和前行着。虽然我不能给你一张魔法船票,让你直接到达技术专家的彼岸,但我希望能通过这门课给你一个坚实的基础和宽广的视野。
在这最后一课,我想结合自己近十年的从业经验,包括国内和硅谷互联网公司的工作经历,跟你谈一谈,这个时代到底需要什么样的推荐工程师,我们应该继续朝什么方向持续努力。
在我刚进入推荐系统这个行业的时候,我心中对这个行业的初步印象是,认为这个行业就是一群搞机器学习的研究者在不断地改进模型、训练模型和提高效果,所以,我卯足了劲要成为那个能提出新的模型架构,让全公司都采用我模型的“年轻人”。
当我工作了三年之后,我终于明白,模型的工作固然重要,但它仅仅是推荐系统的一个部分,还有其他很多重要的子系统、子模块可以进行深入研究。当我工作了五年之后,我又意识到,原来能够全盘考虑推荐系统的模型、工程、业务,对它们进行整体优化的工程师才是最优秀的那一拨人。
工作八年后,我开始思考一个优秀推荐工程师的“自我修养”到底是什么,换句话说就是他该具备什么能力。下面我就把我的思考分享给你。
我认为一名推荐工程师的技术能力基本可以拆解成4个维度:知识、工具、逻辑、业务。我们一一来看。
“知识”代表了推荐工程师应该具备的推荐系统和机器学习领域的相关知识,比如我在推荐模型篇中就强调过,我们一定要建立起自己的推荐模型演化框架,厘清各个模型之间的关系,从整体上建立起推荐系统的知识体系。
而“工具”指的是我们的工程实践能力,掌握推荐系统相关的工程实践工具的使用方法。我在这门课程中讲了很多推荐系统相关的工具、平台,包括Spark、TensorFlow、Flink、Redis等等,就是希望你能够具备推荐系统知识的落地能力,把脑海中的专业领域知识转化成实际的能够支持公司业务的推荐系统。
“逻辑”指的是我们作为一名程序员的基本功,包括算法和数据结构基础,以及梳理高质量系统框架的能力。像是我们在第一课中总结过的深度学习推荐系统架构图,以及在第14课、23课这些实践章节中总结过的各种架构图,就是逻辑设计能力的体现。
至于“业务”,我想是推荐工程师跟其他后端工程师区别最大的地方了。在业务维度,推荐工程师需要把自己当成半个产品经理,从业务场景的角度来思考用户到底喜欢什么,他们的习惯到底什么样。只有这样,我们才能够不断发现改进模型的动机,持续地迭代模型。这一点,我想你通过32课中阿里模型的演进过程,肯定也有所体会。
除了推荐工程师的能力维度,我还想跟你聊一聊推荐工程师职位的面试要求,因为这也是很多在校同学和刚入行的工程师们非常感兴趣的话题。
虽然,不同的招聘职位和职级对面试者的能力要求有所不同,但各个公司也不外乎是从“知识”、“工具”、“逻辑”、“业务”,这四个维度对面试者进行考察。接下来,我们就依次来看一看面试官都是怎么考察这四项能力的。
面试官最关心的就是你对这个领域的知识储备,以及你对一些技术细节的理解。一般来说,他们会按照由广入深,层层递进地方式来考察你的掌握程度。
比如说,在知识广度方面,面试官可能会让你说说主流的推荐模型有哪些,主流的Embedding方法有哪些,然后,再根据你的回答挑一到两点继续深入。
假设,你有提到你对DIN模型比较熟悉,那么接下来的问题可能是:
所以,在面试之前,对于你自己熟悉的领域,一定要深入理解每一个细节,切忌浅尝辄止,临时抱佛脚。
面试官对“逻辑思维能力”的考察方法就是做题,一般来说也会用两种方式。
一种是直接出算法面试题,让你写一种排序算法,完成二叉树的构建、遍历、反转等等操作,或者任意类似的LeetCode面试题。这是所有CS相关职位都会检查的,因为一名推荐工程师首先需要是一名合格的、基础牢固的工程师。
第二种方式是让你去设计一个推荐系统的工程架构,可能是根据某个推荐场景,设计一套合适的特征工程和推荐模型等等。这类系统设计题更能检查你严谨、全面的逻辑思考能力。
对于逻辑能力的积累是一个长期的过程,不仅要求你在学生阶段打牢自己CS相关的知识基础,而且最好能在工作中面临实际问题的时候,多思考系统设计的问题,即使这部分功能不属于你的工作范畴,你也可以多想一想有哪些可行的设计方案,不断锻炼自己系统设计的能力。
其实,对工具的考察跟公司职位的实际需求最相关,特别是一些比较高级的职位。
如果这个职位要求更强的大数据处理能力,面试官可能会考察你对Spark的运用情况,以及对Spark背后Map Reduce过程原理的理解情况;如果这个职位希望招一位对TensorFlow,XGBoost等建模工具应用熟练的同学,面试官就会重点考察你TensorFlow的基本概念,以及怎么处理训练过程中遇到的主要问题。
对于这部分,我的建议是,你在了解所有工具基本使用方法的同时,一定要注意一到两个工具的深入实践和积累,争取成为一两个方向的专家。这样,你才能在一些高级职位的竞争中脱颖而出。
如果说前三项能力是一名合格推荐工程师的必备条件,那么业务能力则是你在合格基础上变得优秀的宝贵素质。只有对业务有深刻理解,我们才能够从完成项目的阶段进化到发现项目、领导项目的阶段,所以越高的职位,对业务理解能力的考察就越深刻。
比如:对于DIN来说,最关键的点其实并不是用注意力机制来解决这个问题,而是发现用户行为历史和目标商品的相关性。对于Wide&Deep来说,最重要的也并不是这个模型结构,而是如何设计Deep特征和Wide特征,从而发挥出这个模型最大的“功力”;对于模型服务的部分,最重要的是如何设计它才既能满足业务需求,又能实现工程上的要求。
除此之外,推荐系统中遇到的一些常见问题,如冷启动、多目标优化、探索与利用,也是面试常问的业务问题,你必须能说出自己的思考,充分地分析具体问题,提出有针对性的解决方案。
“业务”方面的提高,虽然是一个长期的过程,但我还是要建议你,在平时的工作中,不要总是想着完成一个个工程任务,按部就班的执行上级的命令,而是多思考任务背后的逻辑,多提出自己的见解,这样才能真正的提高自己解决业务问题的能力。
总的来说,“知识”和“逻辑”是一名推荐工程师的基本素质,“工具”和“业务”是影响你能不能获得高端职位的关键。但不管你处于职业生涯的任何阶段,都要注意平时的不断思考和持续学习,从“广度”和“深度”两个方面,不断提升自己的综合能力,这样才能在职业生涯的阶梯上不断前行。
清楚了能力要求,了解了面试形式,最后我们再展望一下未来,让我们预测一下接下来这几年,业界最需要怎样的机器学习人才。
说是预测,其实也不能说是十分准确,因为我跟业界的很多非常资深的工程师,技术leader探讨的过程中发现,大家对于这个问题的看法其实是惊人一致的。下面,让我们先来看看业界的技术专家们都是怎么说的。
首先是阿里的资深技术专家朱小强给我的书写序时的总结,他说:
技术发展将从依赖深度学习算法单点突破收割技术红利,开始转向更为复杂的、系统性的技术体系推进,进一步创造技术红利。这里,关键性的技术破局点是算法与系统架构的协同设计(algo-system co-design)。
所以朱小强的观点是,单纯依靠深度学习模型改进就能大幅提高效果的时代已经过去了,现在我们只有把算法和工程协同设计,才能取得进一步的突破。
第二位是前Google、Facebook高级工程师,现在的新浪微博广告核心技术负责人詹盈,他对这个问题的看法是:
成熟的算法工程师不应仅满足于基本的建模和调参,他们对于业务和产品有较为深刻的理解,并且在实践中能够拥有足够的数据分析能力去指导建模方案的完善,并确确实实地带来客观的业务收益。这一类高端的算法人才是真的稀缺,还远达不到“内卷”的程度。
可以说,詹盈的看法和我对算法工程师能力的总结高度一致:只有综合了算法能力、业务能力、工程能力,你才能成为一名高端的算法工程师。
最后是我的前老板,Hulu的全球副总裁诸葛越的话,她说:
算法工程师这个群体普遍都会遇到的是,算法研究能力和工程能力的权衡问题。在其中任何一个方向上成为专家都没有问题,企业都会有合适的位置给到你。但如果你想走到更高的职级,就需要不断拓宽与现有工作相关的技术栈。随着近两年算法岗位的成熟,有一种说法重新被大家认同,那就是“算法工程师首先是一名工程师”,可见对算法工程师工程能力的重视已经是普遍的观点了。
越姐从一个技术管理者的角度表达了自己的观点,结论也和前几位工程师一样:只有算法研究能力和工程能力都突出的人,才会在现在愈加成熟的业界环境下取得更高的职位。
最后,我想用自己说的话再给这个问题做一个总结:未来3-5年业界最需要的是:能够站在机器学习“工程体系”的高度之上,综合考虑“业务特点”、“模型结构”、“工程限制”、“问题目标”的算法工程师。在算法工程师的发展之路上,切忌“好高骛远”,只追求“好看好听”的先进技术的学生思维,回到工程师思维上来,回到解决问题的本质上来,才能够逐渐成为一名优秀的算法工程师。
好了,如果你学习到这里,我要告诉你,这是本门课程的最后一段话。这门课程,我们一直在聊技术、学实践,一直没有机会跟你聊一聊内心的话,所以借着最后的机会我想跟你“谈谈心”。
说实话,推荐工程师这条职业道路并不是一条容易的道路,同行们常说这是一个时刻处在淘汰边缘的职业,我们时刻面临着这样那样的挑战。比如说,当你在谈一个流行的技术点时,它已经进入了过时的倒计时;当你coding一天回家,还是勉为其难再多看一篇paper的时候,也许你也曾和我一样觉得不如就随波逐流算了;当你苦心作出一个模型的尝试却没有效果的时候,感觉自己的工作几乎是要从零开始。
但我还要说,这是一个充满魅力和激情的工作,它不是在简单地完成一个机械式的任务,而是用在你的观察、你的思考、你的智力,以及你的经验去实现一个个目标,当你真正突破这些目标的时候,我相信你会体会到比一道编程题AC大100倍的成就感,毫无疑问,它值得你为之付出一个长长的职业生涯。
这几个月里,你可能是在晚上回家打开笔记本继续学习,或者是在上班的路上听我的录音,又或者是在周末通过咱们的课程为自己充电,不管是用哪种方式学习,我都要说一声:“谢谢你的支持和信任”,能陪伴你走过这几个月的学习历程是我的荣幸。
今天的最后没有思考题,但如果你对这门课、这个职业,对未来和前途,有任何的感悟,我都欢迎你写下来,总结给自己看,也与这门课一同走过的同学们共勉。
好了,同学们,虽然我们的课程结束了,但我相信你的职业生涯从这里开始会更加精彩!
最后的最后,我还为你准备了一份毕业调查问卷,题目不多,希望你能花两分钟的时间填一下。一起走过了这些时间,期待听到你对我和这个课程的反馈和建议!