本文约5000字,阅读需要30分钟。
大家好,这里是桔了个仔,目前是一名Data Scientist(不太想翻译成数据科学家,毕竟感觉自己就是个工程师),过去几年在做基于机器学习的风控与合规系统,参与了一些算是成功的项目,和团队一起,成功在几个跨国银行那里落地了我们开发的系统。
根据我的经历以及对身边同事的观察,我个人会把落地工程师的「落地能力」分为三个维度:
很多人以为算法工程师日常工作就是调下参,改个算法再跑跑,直到神经网络输出符合预期。在入行前,他们以为算法工程师的日常是这样的:
事实上,算法工程师可能涉及的技术范围是很广的。很可能是这样的[1]:
中间那个小小的几乎都快看不见的黑块,你放大图片,会发现里面写着ML Code,这就是「算法」的部分。当然,别被这个图吓到,这不一定全是你的工作,这里是一个团队的任务,这个团队可能是两人的团队,也可能是几十人的团队,但可以肯定的是,无论你在哪个公司,一个算法工程师都不太可能只做纯「算法」,不要忘了「工程师」三个字。对于要做产品落地的工程师,搞算法的时间很可能不到10%,其他技术部分可能占据你40%。要增强自己落地能力中的技术水平,除了算法要基础打好,你还需要:
前面技术部分花了10%+40%的工作时间,然后其他50%的时间呢?用来和客户或者产品经理沟通,然后理解业务,做ppt,汇报结果。杂事很多,很难接受吧?没错,我刚入行时也是觉得自己一身技术无处施展,后来我上司一句话启发了我:
技术是逻辑的艺术,业务也是,所以只搞技术不管业务的,不能算是逻辑能力出众的。
你现在应该有疑问了,那怎么才算「懂业务」?嘿嘿,马上道来。
其实关于「懂业务」,可以分为宏观业务和微观业务两部分。
宏观业务指的是行业的「共性」。例如:
微观业务是指不同部门/公司在实践上的不同。微观业务是最容易被人忽视的而且也是最辛苦的,因为大家都有不同的「知识沉淀」方式,学习起来并没有那么立竿见影。但我发现有趣的一点是,当你接触微观的业务多了,你还是能从中提取「共性」。例如某个算法工程师,之前在银行做风控,在银行获取数据流程会比较长,每个步骤要做的事情不能跳过;现在去某互联网金融公司做风控,可能获取数据流程变得很短,但是你会发现共性是,大家都有准入审查、逾期催收等环节,用到的技术可能也是相近的。
现在你已经掌握了各种技术,准备大干一场,准备拿最强的深度学习模型,给客户设计一款准确率非常高的产品。现在你开始学习相关业务,我建议你带着问题学习。不过,你什么都不懂时,你应该问自己的第一个问题是什么?没错,那就是:
做这个系统的真实需求是什么?
这个问题很重要。有个故事是这样的:
某大型日化公司引入了一条国外肥皂生产线,这条生产线将肥皂从原材料加入直到包装箱自动完成。不过产品线有瑕疵,个别肥皂盒是空的,这家公司联系厂商后被告知这是设计上的缺陷,无法避免。于是老板要求工程师们解决这个问题,以数名博士为核心形成一个技术攻关团队,耗费大笔资金之后,终于宣告解决。解决的办法是在生产线上安装一套 X 光机进行扫描识别。在另一家私人企业,老板让新来的小工解决问题,小工所用的办法是,找来一台电风扇放在生产线旁边
不知道这是真实故事还是段子,不过我们可以知道的是,如果你只顾着解决自己拿到的问题,而不想问题背后的真实需求是什么,埋头苦干,用复杂的方法来解决个很简单的事,那么会弄出大炮打蚊子的笑话。
第二个该问自己的问题是:
有什么制约因素?
对于机器学习系统,落地时的制约因素主要包括(但不限于):
要在这三个限制因素里面取得微妙的平衡,才能使得产品落地。我刚做数据科学工作时,总喜欢搞算法调优来炫技,但其实压榨算法的边际收益很低,你用一个月把算法准确率从70%提升到80%,可能还不如提前一个月把系统上线使用起来的收益高。
第三个该问自己的问题是:
算法、性能评估和业务是否吻合?
还是拿我自己的经历做例子。
我工作中面对的数据,是非常的不平衡的,我们做二元分类,100条数据里,标签为1的只有2~3条,其他97~98条数据标签都是0。这个时候显然需要选择一些合理的评估方法,首先就排除了用准确率(Accuracy)作为评判标准了,F1-score, AUC都可以备选。原因?可以看我在另一个问题的举的例子。
然后是模型选择。银行的业务需要强解释性,所以又否决了所有黑箱模型。剩下的就在tree-based model、logistic regression还有线性kernel的svm之间选择了。
上线之后要评价模型对正负样本区分度,于是又要引入KS值。随着时间迁移,数据分布可能会变化,又要引入PSI值来监控数据偏移程度来决定是否重新训练模型。
你看,模型和评价指标,都是和业务息息相关的。
如果你看到这里还是感觉到迷茫,不知道怎么补足相关业务知识,例如产品和运营的知识,可以看我之前写的一个回答,这里就不重复叙述了。
那怎么检验自己真的「懂业务」了呢?你可以检查下自己能不能做到下面这些点:
懂技术了,又懂业务了,是不是感觉还不够差点什么能力去推动产品落地?这个是抛开技术和业务之外的东西,要描述成一个具体的能力,真的很难,我会把这些能力都归结于「软实力」。我认为主要是表现在沟通,思维这两方面。情商、亲和力、共情能力、有眼光,这些算不算软实力?当然算,但你有没有发现,这些软实力都是基于沟通和思维的。
沟通和思维等软实力包括(但不限于):
这里说个真实故事,和算法无关,和软实力有关。我大舅是开工厂的,产品良品率之前一直上不去。我二舅退休后就去我大舅厂里做质量监督。我二舅就中学学历,普通话也不标准,但我二舅进厂后,产品良品率上去了,工厂也扭亏为盈了。我问他怎么做到的,他说,很简单啊,对于那些手工不精湛的小伙子,我就亲自做一遍给他看,并告诉他,我一个退休老头都能按质做好,为啥你不行?就这么耐心的一个个沟通,一个个教学,盯着他们直到确认他们能做好为止。看起来这很简单是吧,但这过程需要耐心沟通,需要系统性思维找到关键因素。这就是软实力的表现之一。
如果你观察销售团队的日常,你会发现,他们做的事情看起来简单,大部分时间就是给客户发发邮件,和客户开开会,都是动嘴皮子的事情,但是如果让你去做这些,你会发现你会缺少自己貌似很难推进,你会问自己,自己嘴皮子咋就不那么好呢?软实力就像肌肉,运用软实力的过程就像搬砖,把砖头从A点搬到B点看着很容易,但搬起来才发现自己肌肉还不够强大。
而锻炼软实力的方法?无它,只有干多了,软实力才能上去。具体的说,对于算法工程师而言,就是不要逃避那些繁琐的看似没收获的事情。例如在我为某客户落地风控系统的过程中,我们需要和他们的项目经理保持联系,有问题也要给他们的数据团队反馈。其实这过程还挺难搞,因为他们作为一个跨国大公司,显然数据中心是需要同时对接很多vendor的,所以当和他们合作时,需要经常主动推进项目进度,不然他们的项目经理会问责我们。例如我们有个pipeline每天固定时间要跑,他们作为上游,需要在运行时间前把数据给到我们。当时间到了,数据还没给到我们,我们要做的第一个事,就立马需要给数据团队发送邮件,抄送项目经理,分清责任;然后积极跟进回复,搞清楚原因,和数据团队商量个预计解决时间,并且在这个时间点来临前就问问进度,以预留足够时间来应变。在这些看似繁琐的沟通过程中,我掌握了推进工作的方法,养成了积极推动工作进展,并在deadline来临前检查进度以预留时间应变的好习惯。
算法工程师的「落地能力」包括技术能力,业务理解,还有软实力。但对自己要求不要太苛刻,就好像你玩游戏时很少能用到每个维度的能力都满分的英雄一样,人的能力是有个频谱的,不可能方方面面都能做得满分,所以不要对自己感到挫败。
就拿我自己说,大家别看我说的头头是道,但是说实话,说了这么多,其实我自己也并不能每个方面都做得好。这个「落地能力频谱」就像是一个打分卡,帮助你从更全面的角度来分析自己的能力频谱。有的人技术不那么精湛,但很懂业务,很会带队,也能使得产品顺利落地;有的人技术满分,但业务和沟通能力欠缺,但配合其他团队成员的优势,也能使得产品顺利落地。
所以,接受自己的不足,尽可能动态平衡自己的能力频谱,总有一日,你能成为具有超强「落地能力」甚至能独当一面的算法工程师。