对于技术岗位而言,开发岗累还是算法岗累呢?
本人应届生缺乏职业规划,身边有拿算法岗offer的,也有开发岗offer的,对于哪个更累,大家说法不一样( ˉˉ ), 想问一下知乎上有经验的各位。 两边都做过,算法偏推荐和广告,现身说法。在做开发的时候,主要是体力和精神紧绷,做不完的需求和紧迫的deadline,没完没了的加班。体力上会更累一些,精神上虽然紧绷,但大部分的时候不慌。
而在做算法的时候,主要就是精神压力了。大量的不确定性,导致没有办法保证这次做的事情会不会有产出,没有产出就没有办法生存,会主动的做尝试很多idea。不确定性带来的心理压力,是做开发的时候没有的,心累。 微信公众号:行走的汉堡
做算法主要是心累。很可能你一个月也做不出在离线测试集上表现好的模型,也可能测试集表现不错,上线后表现平平甚至一路下滑,还可能上线的头两个月数据起飞,但过了几个月之后突然暴跌!就问你怕不怕!那感觉,就是玄学,就象是算命!毫无掌控感!总有一种被不确定性支配的恐惧。
还有一种非常常见的局面,上线后模型表现一直可以,但是,领导要你百尺竿头,更进一步,不然没有新的KPI了,但你绞尽脑汁,使尽千方百计,线上效果始终没有显著提升!那你年底的KPI 要怎么写呢, 就问你怕不怕?如果没有新的业务给你做,你就吊死在这个模型上了,最后只能转岗甚至离职!
另外,我相信大家最害怕的,就是试验一个老板给的idea ! 试验之后如果效果好还好说,但有经验的人就会知道,90%的可能是试验后效果不佳!一是老板看的最新论文通常是在别的业务场景下做的模型,数据分布和我们的业务可能完全不同,也可能论文本身就是灌水坑货!二是老板没有身处一线对数据进行过摸底和分析,对数据的理解都是靠拍脑袋甚至意淫!这就尴尬了,效果不好,是你的问题,还是老板的问题呢?至少,老板一开始肯定是不信的,一定是你的代码有问题,一定会逼你加班找bug或者分析badcase!如果你不能自己憋出一个大招,来个线上效果大幅提升实现翻盘,今年的325很可能就被你提前预定了!
实际上发展到今天,很多算法上的红利,在很多业务上都已经到达瓶颈了,尤其是大厂的核心业务,无论怎么加特征、怎么折腾炼丹炉、怎么搭积木都基本没有显著提升了,反倒是工程上可能有一定的提升空间!这个时候做算法的就尴尬了!要么抓紧活水到新业务去打从头打新怪,要么跳槽!如果公司小,没有太多新业务可以选择,或者公司产品本身开始走下坡路,算法工程师就会很蛋疼。
最后一点,其实做算法非常没有安全感,不仅仅是因为模型效果本身的各种不确定性,还有就是长期做算法开发能力会退化,甚至变成一个彻底的crud boy、sql boy,脱离了大公司、大平台,战斗力就会变得微不足道,毕竟前端、后台、架构这些才是硬技术,开发工程师才是硬通货。想利用业余时间学习开发,却又在福报的面前成为一种奢望,而能不能碰上算法+开发+架构的全链路实操项目,完全是个玄学,取决于部门怎么发展、领导怎么安排工作,可遇而不可求。 我都做过,职业头三年做开发,做到了主程后感觉日子无聊,脑子僵化,所以后面辞职读了个研,转行做算法了。
我虽然做开发岗时在国内,做算法时在国外,但平均工作时长差不多,不同之处在于:
开发岗是循规蹈矩完成任务多些,为了赶计划,一般都996,如果当周计划完成不了,那就加班,总能完成。并不是说开发岗就是简单的,开发岗确实也有很多东西很复杂,要慢慢理解,但开发岗相对来说确定性因素会多些,制定的开发计划一般都可以细分到每人每日做什么。算法脑洞要大些,一旦脑洞开了,脑袋会刹不住车,你会有很多新想法想试验,例如想到了新的特征想加入现有模型,想试验某个大神新发布的模型等等。所以即使现在公司没有要求我每天打卡上下班,甚至允许在家办公,但我还是经常带着电脑回家,每天会试验到十一二点才休息。
但说到哪个累,其实各有各的累法:
开发岗的累在于可发挥的空间不算大,按照代码规范写,每周固定时间相互review下。如果是当主程,可发挥空间大些,你会主动想如何去设计一个更好的架构来提升性能等。由于主要的活都是循规蹈矩,所以开发岗主要是体能上的压力大。算法岗的压力在于试验的不确定性。例如要开发一个信贷评估模型,或者一个推荐搜索模型,你可以预估开发第一版的时间,但你很难预估要花多久才能把一个模型的准确率提升到90%。由于这种不确定性,你经常脑子里有种「今天这个结果上不去老子就不睡了」的想法,这就是我为啥经常一天不小心就工作了十二个小时的原因。不过好处是,虽然工作量比较难量化,但工作结果容易量化,你的推荐模型帮助公司A提升了多少业绩,一对比就出来了。
所以我的建议是:
如果你是害怕不确定性的人,害怕自己总不能按时完成工作,害怕辛苦工作一周后结果周五写周报时没成果汇报,你可以选择开发岗,你的心理压力会小些。如果你是喜欢探索,喜欢看到自己最终工作的成果能被数字量化 ,那算法岗更适合你。
要我重新选择的话,我100%还是喜欢现在的算法岗。工作过程充满惊险与刺激,工作结果清晰可见,这样的工作很能激励我的主动性。由于这探索的过程令人兴奋,更长的工作时长并不会让我觉得更累。 我就是听说开发“累”而选择了算法岗的那枚小饼干。
事实也的确如此,从工作时长和代码量来看,业务部门的开发同学绝对是我望尘莫及的存在。每到赶项目工期的时候,我的开发朋友们就失去了周末,到项目室进行封闭开发,晚上也回的real晚,项目上线更是到凌晨,大促前还经常凌晨起来压测,绝对是身体上的考验。但是因为是实打实的代码,实打实的项目,在绩效和心态上还是比较稳的,万一失败还有产品运营背锅呢不是。
而我,作为一块算法的小饼干,虽然不用熬夜等上线,不用凌晨压测,但并不意味着轻松,算法的工作产出并不在于码力多强,而在于有没有能够拿的出的产出,包括但不限于算法方案的提出,落地实现和指标优化。而这些东西都不是熬夜就能有的,而是需要不断的分析数据,尝试想法,结合业务,对照方案得出的。虽然没有严格的时间节点,但需要反复的思考打磨,要看最新的技术博客论文,不断输入,然后落地输出。
万一想法不work,就得好好想想周报怎么写了(嗨,快周五了呢)。 开发耗红,耗蓝
算法耗蓝,耗技能点。
相对而言,如果一个开发会自我平衡,一天下来,回城补血之前,红可以消耗大半,蓝也基本耗干。
算法的话,回城的时候,蓝肯定是光了,但是红可能省很多,(耗红的算法工程师,我们都劝退了),但是回城之后,大量购买技能卷轴,拼命学习技能,技能树要枝繁叶茂,并且结构形状合理。很难。
如果你想成为一个战士,那么做开发
如果你想成为一个法师,那么做算法。
欢迎站内私信应聘我们公司,根据你的职业特性,设定职业发展(好像陈小春) 入职不久,算法团队和研发团队在一个办公区域,我是算法,初步体会:
开发:需要大小周,加班频繁。不断的有业务需求,做完一个又接着一个。即使你对这个业务有自己的想法,那边产品也得让你硬着头皮做。。。可能还会让你做个两个版本看看。
算法组:双休,偶尔加班。和第一条回答一样,主要就是精神压力了。你没有活得找活干呀,这就考虑你找事的能力,要主动的尝试很多idea。没有活或者idea效果不好->没有产出->绩效低。这就是心累了 两个都做过,强答一波。
这两个岗位虽然说起来都是工程师、技术岗,但是两者的工作内容和性质差得真不是一点半点。从业当中,也都有心力交瘁的时候,但是体验和触发条件都不太一样。简单说一说。
首先说开发,我个人在做开发的时候,蛋疼点主要有以下几个。
1. 7 * 24 on call
只要线上有问题,一定会有电话打进来。凌晨两三点也不是没有可能,而且很多时候,这些问题未必是你的锅,很有可能只是因为某某项目的负责人上有你的名字。
这点我想应该大小公司都有,之前和蚂蚁的同事聊天,他给我吐槽说他凌晨起夜已经成了习惯。因为好像蚂蚁到了晚上还有很大的流量,经常hbase抖动,每次抖动都会有电话打过来。
不仅工作日如此,周末、假期都必须响应。所以基本上电脑随身携带是肯定的,哪怕是过年回家、出国旅游基本上也都要带着电脑。而且根据墨菲定律,千万不要有侥幸,我侥幸过两次,都中招了。最夸张的一次,在香港太平山上拿着手机看代码。。。
什么?线上故障的时候,你睡得太死了没听到电话?
Emmmm,轻则被leader说上几句,重则,可能你需要准备下一个offer了。
2. 大促、熬夜
只要是电商公司,没有不大促的,只要大促,没有不要熬夜的。
大促意味着巨大的流量,自然对系统的稳定性是一个顶级的考验。就拿双十一举例,你以为只要在双十一当天多准备几台机器就好了?too young,双十一之前压测的次数不会少于两次,由于害怕系统故障影响不好,每次压测一定是凌晨。
就算两次压测好了,两次压测加上大促当天的值班,至少每次大促都需要熬三天夜。每次熬夜,至少要两三点才能睡觉。
来来来,你告诉我,这样的大促一年有几次?
光数的出来的大促就有四次,321, 618, 11.11, 12.12……
3. 肝deadline一时爽,一直肝deadline……
我自诩是一个工作效率很高的人,但是做开发的时候,肝deadline也一样是家常便饭。
肝deadline的原因很多,很多时候并不取决于自己。比如刚接手项目不熟悉,有些陈年旧坑需要填,以及产品安排需求不合理,或者是老板不正常期望等等。
尤其是当多个需求一起deadline,并且被测试和老板疯狂cue,以及还要肩负回答运营问题的时候,我相信,光凭想象就可以理解其中的酸爽。
4. 其他问题
除了上面三点之外,其他蛋疼的点也很多。不过相比之下没有那么严重,所以我就放在一起说了。
比如大多数公司文档都不健全,接受陈年项目一定会采坑,往往还不小。
比如经常重复性工作,今天增删改查,明天改查增删。面试的时候高并发、分布式,进去工作之后curd。经年累月没有成长,如果是大公司的话,很多人干几年也没有过从0开始真正搭建项目的经验。
比如产品或者运营或者是老板不好沟通。要么是不懂技术沟通成本很高,要么就是无脑强势,不懂装懂,我不管你觉得,我要我觉得。
吐槽完开发,再来说说算法。
说起来算法高大上,其实很多开发存在的问题,算法同样存在。我也来列举一下算法岗一些蛋疼的点。
1. 理想林志玲,现实罗玉凤
很多人被算法岗吸引,就是觉得算法岗高大上,机器学习,人工智能。但其实真正从事之后,会发现根本不是那么回事。
如果在小公司,整天为数据发愁,不是这个数据没有,就是平台或者工具稀烂。如果在大公司,数据、平台、工具都有了,但是每天当SQL boy。你和业务谈算法,业务说明天上线,先统计上一版。老板整天告诉你,我想看这个、这个和那个,你去帮我跑一下。
你想说抽空能把某个模型优化一下,结果发现手上排的SQL根本写不完。
2. 我知道这样不行,可是为什么呢?
做算法的过程,很多时候是一个和自己较劲的过程。
因为模型和开发的代码不同,开发用代码实现的功能结果是明确的,原因是可追溯的。但是模型不是,经常在别人场景下效果好的方法到你这里一团稀烂。特别是你老板报以期望的方法,你很难解释。。
有些老板和产品会觉得用某某方法,能不能找到问题的原因呢?甚至还经常会有人让你拉几笔数据出来看一下。
大数据时代,只有相关性,没有因果性,但这个道理,很多人就是不懂。嗯, 有时候你老板也不懂。
3. 外界过度的期望,让你迷茫,一些人的牛逼,让你不知所措
也是因为现在算法太火了,很多不明就里的人会用仰望的目光来审视。某些时候这个是好事,比如当和投资人聊钱的时候。但大部分情况下,则未必。
比如某些决策者会有错觉,会有幻想,比如会提出一些“我们是数据驱动的公司”口号。口号不是问题,问题是当指标落到你头上。
以前遇到过这么一档子事,公司要给一群不活跃的人发红包,希望算法能识别出发了可能就会活跃的人,给他们多发几块钱,以此来带动dau的提升。
嗯,我们dau小三百万,红包最多发5块,只有几万个,请问用什么算法可以提升dau,在线等……
同样,这行吹逼的情况非常严重,简直章口就来。反正别人不知道你到底怎么做的……当很多人都这么做获得好处,而你坚持底线,一直默默无闻的时候。不说痛苦,至少受点委屈是少不了的。
以上,只是我一家之言,如果言中,请勿对号入座。
最后,世上没有完美的职业,总要有所得有所失。如果你能明白可以忍受什么,不能接受什么, 我想,你一定可以做出不后悔的选择。 累看哪方面,开发与算法其实都累,不过这两个岗位的累有一些区别:
开发的累:在于有做不完的需求的累。
需求就意味着代码量。大量代码需要coding,大量bug需要修复,主要是大部分时间都在高度集中。
具体体现在周报内容比较具体,有做了什么,什么正在做,什么还未做。
算法的累:在于不确定性的累。
一种是:面对新业务时候,开始不知道做什么,怎么做,需要大量的调研,看数据,然后做尝试。这种具体体现在周报不知道写什么,每周周报都类似,比如正在调研,分析数据。哈哈
另一种是:使用一个算法或者模型(特别是现在的机器学习与深度学习),有可能开始效果不好,有可能是算法不行,有可能是数据不够,也有可能是参数需要调试。需要不断的试样。
这种具体体现在,周报文字基本类似,只是几个数字改了。甚至一个月下来,周报的数字变差了。
开发对于算法,好处在于,大部分是需求明确,知道做什么,重点就是想如何实现,如何更好得实现。
算法对于开发,好处在于,代码量没有那么多,大部分时间都在胡思乱想。
你想做什么,主要还是看你现在的技能与你的兴趣。我觉得没有谁好谁差,谁更辛苦的区别。主要还是看自己适不适合。 很多同学都会觉得科研是很迷人的,而工程是无趣的。其实对应算法岗和工程岗很多人会误以为前者需要更多的对未知的探索就像设计房子,而后者更多的是按照计划图纸来施工。因此前者有意思,而后者是新时代的体力劳动者。
从工业界的角度来说,算法岗一般的目的是在稳住ABC指标的前提下提升D或者降低E。而所谓的算法一般指的不是有固定解的传统计算机优化问题,而是玄学的机器学习。因为后者的解不是deterministic,你做100次可能得到答案都不相同。为了确定一个新算法真的有提升,人们开始做A/B测试,开始把一个新算法分解为多个部分做ablation study(通过控制变量法去理解一个新算法中到底是哪个部分起效)。
因此我部分赞同「算法岗是心累,开发岗是身体累」的观点。但我不同意的是算法岗的代码量会小,核心原因是因为对于结果的不确定性需要大量的调整、实验、以及测试。这种不确定性带来的额外工作量真的不如纯粹的开放岗需求明确的工作量小。
我觉得(机器学习)算法岗其实更像实验科学,需要大量的排列组合,并期待其中某个配比能有效。我知道理论可以指导设计,但很多理论放在现实场景下真的不奏效。实话实说,我搞研究这几年感觉自己衰老速度全面加速了,大概这是心累和身体累的双重加持。代码一点不少写,还得做大量的尝试得到能用的结果。
所以不要误以为算法岗不需要编程,它需要大量的代码尝试各种排列组合。可能你的1万行代码最后有用的也就几百行,但为了找到这几百行,你不得不试1万行。而很多时候大家不在话你是不是写了1万行代码,而只是在乎最后的几百行是否奏效。除此之外,很多能用的算法你还真不一定想得出为啥它有效,还得为了证明它有效胡吹一些技术上的创新。
但很有可能你只是手动/半自动的搜索到了一组不错的参数。
所以我其实觉得算法岗比较适合实验科学+商科背景的同学,既熟悉各种排列组合又熟悉包装内容,更符合算法工程师的描述。而喜欢严谨的1+1,不喜欢做无用功的同学还是开发岗更好,那种一步一个的脚印的感受,其实是挺踏实的。