问题来源:https://www.zhihu.com/question/49015040701
围城外的人,可能会以为开发岗是工地里搬砖的,而算法岗是类似建筑师指导别人搬砖的。但实际上,这种感觉肯定是不对的。互联网公司发展到现在,算法岗和开发岗本质更像是两种不同型号的螺丝钉,只是处于流水线位置不同而已。并且,很多算法岗需要做的工程量也越发像开发岗看齐,已经远不是当个“调包侠”就能过关的了。
先说下开发岗和算法岗在职责上的区别,以一般的推荐/广告系统为例,有数据库 -> 召回 -> 粗排 -> 精排 -> 混排 -> 前端等上下游模块。
- 开发岗需要做的是根据具体需求来搭建/维护对应的线上模块,写代码实现线上逻辑。具体而言,开发岗更像纯粹的“工程师”,需要根据需求来进行功能开发、测试、代码上线,比如在召回等某个模块修改个代码逻辑以推进某个业务上线。由于每项工作都是目标确定,工作量也是可以直观衡量的,所以工作确定性很强,产出也比较确定。一旦需求比较多时,就会堆时间加班解决,而加班多工作量肯定会更多,成绩一般也更突出。所以,开发岗更多是“身体累”。
- 算法岗的目标主要是通过各种手段提升对应指标,比如推荐系统的点击率、转化率、用户停留时长等。举上面例子来说,是通过优化召回、粗排、精排等策略/模型结构,优化模型训练数据,对接新业务优化业务指标等各种不同方式来提升指标。到了现在算法已经接近瓶颈时,算法会过得非常难受,每个优化点不一定会有用(大多是无效的),需要反复提出新方案、优化、排查指标、再提出新方案不断循环直到拿到某个收益点。有时改几行代码结果带来收益,有时又投入巨大工作量也没收益,所以,这方面工作量和工作目标上更不好量化,算法岗更多是“心累”。
在能力上,算法需要了解很多算法领域的知识,但是对工程能力的要求也逐渐与开发岗看齐。- 算法需要熟悉各类机器学习/深度学习算法知识、各类策略、比较前沿的新算法/模型,除此之外,现在对算法的工程能力要求也是越来越高,基本的架构(比如上面说的公司内部推荐/广告算法各个模块的代码)、架构开发基础(C++,Java等)、数据开发(spark等、flink)。主要原因一方面是简单的模型优化已经很难拿到收益了,新开发的算法逐渐更复杂,想要让模型更合乎预期就需要对架构很熟悉方便模型设计、指标排查、提出新方案等,另一方面,也是为了快速迭代,开发同学需求太多做不完的时候,算法岗不可能干等着别人开发,自己动手完成一部分简单开发能够保证工作正常推进。
- 开发岗则需要对架构知识、开发基础等各种知识比算法同学更深入,具体哪部分技术重要取决于具体的开发岗位。
最后谈下这二者面试情况,大体上说算法岗有一定泡沫,内卷比较严重,开发岗位置更多。- 由于前几年ai太火,各个专业都往“算法”上转,当年削尖脑袋进算法各方向的学生这两年也开始批量毕业。因此,显而易见的是算法岗面试会更内卷一些,尤其是cv、nlp等偏研究性质且落地场景不多的算法岗位。目前推荐/广告算法还不算卷,主要原因是没有平台导致很少学校会专门研究这两个方向。面试上主要还是看以往的算法项目经验及对算法本身的理解、算法基础知识、刷题等。
- 开发岗种类比较多,比如后端、前端等,而且根据不同业务可能又会使用不同的技术栈(比如一些用C++,另一些用go等)。开发岗是硬需求,每个公司都需要且数量不少,所以内卷程度会比算法轻。面试上,也都大同小异,主要也是问过往项目,基础知识(对应开发方向的)以及刷题。
至于未来发展,个人努力是比不过时代潮流的,碰到好的业务好的领导算法能够很容易带来业务增长,那么个人上升速度也会很快。开发岗也是同理,选择一个好的平台,好的团队比选择开发岗还是算法岗更重要。上面主要是以互联网公司中推荐/广告算法岗位和开发岗进行比较的,其他还有偏研究类型的cv、nlp等算法岗,这里就不再多说了。
作者:AI蜗牛车
有这么几个维度的不同,其中有我个人的总结,以及和周围一些做开发的同学聊的。这几年逐渐趋于平齐,但是还是有很多公司依然是同等级情况下,算法>开发。并且可以参照很多人才计划,例如阿里星,美团北斗,快star,还有腾讯大咖。大多数都是给了算法类,其实也有一些给了所谓的“开发”,但我个人觉得那些不算开发,应该叫研发,就是里面其实有很多高并行,以及调度算法在,比如分布式存储方向等等,但是这类方向在学校很难接触到(然而是目前企业稀缺的)算法岗有纯粹的research,那种就是读论文,搞模型,写论文的,偏向高校的学术研究。但是如果是算法“工程师”,其实所谓算法工程师的理解其实就是用算法工程解决问题。本质上都是解决问题工程师,然而算法可能算法的环节,思想更多,开发亦然。https://www.zhihu.com/question/485065074/answer/2109345799开发的话本身技术栈相对来说宽泛,比如只要我后端学的牛,我可以去面很多核心部门。然而对于算法来说,方向偏细分,比如你想拿到不错的offer,最好的前提是方向match,match的话可能事半功倍,但是话说回来,这其实是相对来说很难得,比如时空序列,也有气象背景和交通的,细节还是有差距的,比如cv的细分领域更多了去了,推荐也分文本的,视频流的等等,所以总体面试可能就较局限(相对开发来说)开发无疑是更多的,算法无疑是更少的,并且这两年早已没之前那么大泡沫。这个其实也能理解,比如做一个app,如果是一个软件首先你需要把这个开发系统构建起来,就需要很多开发的人,而算法可能是之后的事情。会发现周围在大佬中比率更高的方向都是AI,最终从事算法岗工作的基本上大多数都是在周围眼中相对来说优秀的,当然开发也有很多大佬,这里只能用相对来说。并且各行各业中的高学历(这里指清北),很多学习数学和经管,以及物理专业的都来从事这个方向,别看他们也是非科班,但是有的学习能力足够强,再加上学习AI其实大家都是从头开始,还不像开发需要知道那么多计算机基础知识,只需要英文以及数学过关,其他就是看自己的学习和理解能力了,所以他们并不会弱势,反而很多人学的很牛逼,导致整体占坑多了。
03
作者:Ambersky
本人工作title是算法工程师,实际工作中大约是50%的算法+50%的开发,平时也会和朋友讨论何谓算法,何谓开发。
从我一个入职不到一年的菜鸡算法角度来看,算法岗玩的是数学关系,开发岗玩的是逻辑关系。开发岗的职责是搭建一个产品的所有逻辑,从底层的到顶层的。前端页面之间的跳转逻辑,后端与数据库之间的交互逻辑,前后端的交互逻辑,这些是开发岗需要做的。比方说我的产品是某视频平台,那么打开呈现的界面,点击视频进入到播放页面,注册账号修改信息等操作,都是开发岗完成的。算法岗的职责,顾名思义就是算法,算法分很多种,机器学习,数据挖掘,NLP,CV,推荐等都是常见的算法领域。算法岗很多情况下是某个产品的核心,在产品中负责某个非常细分的点,或是为某个关键功能提供支持。回到视频平台的场景,每次刷新推荐页都有新的视频出现,如何确定刷新过后推荐给用户什么视频,是推荐算法做的事。一个算法会经历很多轮迭代,会有很多算法工程师抓着头皮想着怎么优化,多做些特征工程?参数再调优一下?换个更合适的模型?等等。这些操作,更多的是数学关系,比方说需要关注数据集的分布情况,相关性矩阵,模型损失函数等。当然也有很多算法是研究方向,我举的例子不过是一小部分。毕业不久眼界也比较狭隘,如有不准确之处也望大佬们指正轻喷。
04
作者:kuadoh
在目前大环境下,从收入方面出发,算法和开发基本没有啥区别。(17年前后随着深度学习爆火,起薪上一开始是算法岗更高)下面从算法岗的角度谈谈自己的理解。算法岗主要针对的是无法通过直接编程进行解决的问题(主要是非结构化的输入,如图像,语音,文字等的识别。如果通过人为地写if-else规则去处理这类输入,程序将变得繁琐冗长且不一定能够覆盖所有情况),需要将它转化为一个数学问题进行建模后,结合标注的数据进行该数学问题求解,用得到的数学模型(某个函数y=f(x)一般是个概率函数)。而开发岗负责的就是能够结构化的输入了,需要处理的情况也是相对固定的。以一个人脸识别接口为例,开发岗负责的部分可能会包括,将需要识别饿图像进行压缩,然后通过网络发送到服务器上解压缩,然后将图像输入算法模块得到的结果通过网络传回客户端。如何承受短时间大量的人脸图像输入同时服务器不宕机,客户没感觉到卡顿,就是常见的后端开发岗需要解决的问题了。像别的答案提到的那样,开发岗往往是身体累,而算法岗是心累。开发岗面对的问题往往是比较明确的(怎么更快地处理输入并保持准确),能通过代码分析和debug找到问题所在,然后通过扎实的CS基础知识解决或者堆机器解决,举个简单的例子,比如说我有一份几十pb的数据需要找到top100,但是我内存放不下,可以通过堆排序的思想进行处理;或者有钱的直接使用很多机器进行分布式处理快速解决。但是对于算法的一些问题,因为目前常用的算法模型是一个黑盒,往往是难以定位和解决的,没有一套所有情况都适用的方案。比如说一个动物识别程序将某只哈士奇识别成了狼,这种bad case的原因是没有一个明确的理论另外分析的,解决的方法一般也只是对这类情况增加更多的训练样本或者尝试更先进的网络结构。总结就是算法面对的不确定性更大。
05
作者:关建淳Arvin
先来说说算法岗,通常涉及到算法的岗位有两个,分别是算法设计和算法实现,现在有不少团队把这两个岗位进行合并,做算法设计的同时也要负责实现。但是也有一些团队是分开的,做算法设计的不管实现过程。从工作的复杂性上来说,算法工程师的工作强度还是比较大的,但是算法工程师的职业周期也比较长。很多算法工程师最终成长为企业的首席科学家,或者是首席技术官等岗位,可以说算法工程师的发展前景是非常可观的。再来说说开发岗。其实软件团队的大部分岗位都是开发岗位,有前端开发、后端开发、移动端开发等,可以说大部分程序员做的都是开发岗的工作。与算法岗位不同的是,开发岗位人数多,占比大,而且大部分开发岗位的职业周期都比较短,一般开发岗位在做到一定年龄(比如35岁)之后都会转型。一部分会转向项目经理等管理岗位,一部分会转型做架构师,还有一部分转型为行业咨询专家等,当然,也有一部分开发人员转型为算法工程师。算法岗和开发岗哪个前景更好?其实只要技术到位,这两个岗位未来的发展前景都不可限量。如何成为一名优秀的程序员,做好以下两点非常重要:一方面要立足本职工作,另一方面也要紧跟技术发展趋势,通过岗位提升和自主学习不断完善自身的知识结构,从而提升自己的职场竞争力。