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