导读
作者从自身经验出发,从三个方面:软实力、技术和业务讲述了算法工程师落地的能力具体指向,为想要成为算法工程师或者已经工作中的小伙伴们提供一点小小的建议。

大家好,这里是桔了个仔,目前是一名Data Scientist(不太想翻译成数据科学家,毕竟感觉自己就是个工程师),过去几年在做基于机器学习的风控与合规系统,参与了一些算是成功的项目,和团队一起,成功在几个跨国银行那里落地了我们开发的系统。根据我的经历以及对身边同事的观察,我个人会把落地工程师的「落地能力」分为三个维度:数据科学家应具备的落地能力 - 图1

1.技术层面

很多人以为算法工程师日常工作就是调下参,改个算法再跑跑,直到神经网络输出符合预期。在入行前,他们以为算法工程师的日常是这样的:数据科学家应具备的落地能力 - 图2图源《如何创造可信的AI》
事实上,算法工程师可能涉及的技术范围是很广的。很可能是这样的:数据科学家应具备的落地能力 - 图3
图源:《Hidden Technical Debt in Machine Learning Systems》

中间那个小小的几乎都快看不见的黑块,你放大图片,会发现里面写着ML Code,这就是「算法」的部分。当然,别被这个图吓到,这不一定全是你的工作,这里是一个团队的任务,这个团队可能是两人的团队,也可能是几十人的团队,但可以肯定的是,无论你在哪个公司,一个算法工程师都不太可能只做纯「算法」,不要忘了「工程师」三个字。对于要做产品落地的工程师,搞算法的时间很可能不到10%,其他技术部分可能占据你40%。要增强自己落地能力中的技术水平,除了算法要基础打好,你还需要:

  • 学会数据获取。原始数据需要经过ETL才能被算法利用。ETL(Extract, Transform, Load)是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。也许你们公司有专职的数据工程师来做ETL,但你如果能稍微参与到ETL的过程中,不仅让你在大数据技术方面得到提升,而且对你理解上游业务非常有帮助。ETL工具的典型代表有:Informatica、Datastage、OWB、微软DTS等。

  • 构建特征。如果没有机会参加到ETL里,也没关系,我也没,毕竟客户不想给让我们接触原始数据。这时候,你也可以处理ETL之后的数据,从中构建特征。其实特征构建的过程能帮助你理解业务,例如给银行预测信用卡逾期风险,你了解到,债务负担率和用户风险有着一定关联,于是你会考虑把用户所有信用卡的欠款加起来除以这个用户的收入,得到一个新的特征。关于相关技术,我知道很多人肯定马上想到pandas,但老实讲句,我做了几年数据工作,能用到pandas的机会真的不多。产品都要落地了,几百万条的数据马上进来了,还在玩pandas?spark, hadoop, flink等分布式计算平台赶紧给我研究起来。

  • 可视化数据。我相信问出来这个问题的人都知道哪些python库可以做可视化,例如matplot, seaborn等等。当然,除了python库,excel里的可视化也要做好,这与算法无关,但在你做汇报时能帮助你把一个结果解释清楚。

  • 会用服务器。一般数据产品部署,得上云或者私有服务器吧,那么如果你还不熟悉linux,那就赶紧练练吧。你把系统部署到服务器时,是不太可能用鼠标拖拽个exe就完事的。如果你还能熟练使用aws等云服务,那就更好了。

  • 至于UI层面,例如构建网页等等,开发app这种,这就不再推荐算法工程师学了,毕竟人的精力有限。

  • 前面技术部分花了10%+40%的工作时间,然后其他50%的时间呢?用来和客户或者产品经理沟通,然后理解业务,做ppt,汇报结果。杂事很多,很难接受吧?没错,我刚入行时也是觉得自己一身技术无处施展,后来我上司一句话启发了我:技术是逻辑的艺术,业务也是,所以只搞技术不管业务的,不能算是逻辑能力出众的。你现在应该有疑问了,那怎么才算「懂业务」?嘿嘿,马上道来。

2.业务层面

其实关于「懂业务」,可以分为宏观业务和微观业务两部分。

宏观业务**指的是行业的「共性」。例如:

  • 你的产品所服务的对象所在的行业都有什么「痛点」。sorry,句子有点长,而且说法也有点「老土」,但了解客户痛点永远都是必须的。例如我做金融风控,客户的痛点是「旧的专家系统规则更新慢」,而我们提供「基于机器学习的方案」,数据来了就自动更新规则,就能解决他们痛点。

  • 他们这项业务目前的工作流程如何。例如我做反洗钱,那么我得了解洗钱的三个步骤,反洗钱的警报产生,警报调查等等。这些流程在不同客户之间都是一样的,我了解清楚了这些,我才能知道,我的产品是在哪个环节发挥价值。如果你做的项目是对内的,例如为自己公司电商搞推荐算法,那你必须清楚用户在你们APP上的路径,例如首页到搜索页再到详情页。以及在每条路径上,怎么做推荐商品,例如有的商品是推荐搭配,有的商品是推荐近似替代品。

微观业务是指不同部门/公司在实践上的不同。微观业务是最容易被人忽视的而且也是最辛苦的,因为大家都有不同的「知识沉淀」方式,学习起来并没有那么立竿见影。但我发现有趣的一点是,当你接触微观的业务多了,你还是能从中提取「共性」。例如某个算法工程师,之前在银行做风控,在银行获取数据流程会比较长,每个步骤要做的事情不能跳过;现在去某互联网金融公司做风控,可能获取数据流程变得很短,但是你会发现共性是,大家都有准入审查、逾期催收等环节,用到的技术可能也是相近的。
现在你已经掌握了各种技术,准备大干一场,准备拿最强的深度学习模型,给客户设计一款准确率非常高的产品。现在你开始学习相关业务,我建议你带着问题学习。不过,你什么都不懂时,你应该问自己的第一个问题是什么?没错,那就是:

做这个系统的真实需求是什么?

这个问题很重要。有个故事是这样的:某大型日化公司引入了一条国外肥皂生产线,这条生产线将肥皂从原材料加入直到包装箱自动完成。不过产品线有瑕疵,个别肥皂盒是空的,这家公司联系厂商后被告知这是设计上的缺陷,无法避免。于是老板要求工程师们解决这个问题,以数名博士为核心形成一个技术攻关团队,耗费大笔资金之后,终于宣告解决。解决的办法是在生产线上安装一套 X 光机进行扫描识别。在另一家私人企业,老板让新来的小工解决问题,小工所用的办法是,找来一台电风扇放在生产线旁边不知道这是真实故事还是段子,不过我们可以知道的是,如果你只顾着解决自己拿到的问题,而不想问题背后的真实需求是什么,埋头苦干,用复杂的方法来解决个很简单的事,那么会弄出大炮打蚊子的笑话。

第二个该问自己的问题是:
**

有什么制约因素?

对于机器学习系统,落地时的制约因素主要包括(但不限于):

某大型日化公司引入了一条国外肥皂生产线,这条生产线将肥皂从原材料加入直到包装箱自动完成。不过产品线有瑕疵,个别肥皂盒是空的,这家公司联系厂商后被告知这是设计上的缺陷,无法避免。于是老板要求工程师们解决这个问题,以数名博士为核心形成一个技术攻关团队,耗费大笔资金之后,终于宣告解决。解决的办法是在生产线上安装一套 X 光机进行扫描识别。在另一家私人企业,老板让新来的小工解决问题,小工所用的办法是,找来一台电风扇放在生产线旁边

不知道这是真实故事还是段子,不过我们可以知道的是,如果你只顾着解决自己拿到的问题,而不想问题背后的真实需求是什么,埋头苦干,用复杂的方法来解决个很简单的事,那么会弄出大炮打蚊子的笑话。

数据科学家应具备的落地能力 - 图4

要在这三个限制因素里面取得微妙的平衡,才能使得产品落地。我刚做数据科学工作时,总喜欢搞算法调优来炫技,但其实压榨算法的边际收益很低,你用一个月把算法准确率从70%提升到80%,可能还不如提前一个月把系统上线使用起来的收益高。

第三个该问自己的问题是:
**

算法、性能评估和业务是否吻合?

还是拿我自己的经历做例子。我工作中面对的数据,是非常的不平衡的,我们做二元分类,100条数据里,标签为1的只有2~3条,其他97~98条数据标签都是0。这个时候显然需要选择一些合理的评估方法,首先就排除了用准确率(Accuracy)作为评判标准了,F1-score, AUC都可以备选。原因?可以看我在另一个问题的举的例子。如何评价德国训练探雷犬和寻尸犬识别新冠患者,称准确率达94%?嗅探犬接触患者后会成为病毒传播介质吗?

https://www.zhihu.com/question/442962994/answer/1717172385

然后是模型选择。银行的业务需要强解释性,所以又否决了所有黑箱模型。剩下的就在tree-based model、logistic regression还有线性kernel的svm之间选择了。上线之后要评价模型对正负样本区分度,于是又要引入KS值。随着时间迁移,数据分布可能会变化,又要引入PSI值来监控数据偏移程度来决定是否重新训练模型。你看,模型和评价指标,都是和业务息息相关的。

如果你看到这里还是感觉到迷茫,不知道怎么补足相关业务知识,例如产品和运营的知识,可以看我之前写的一个回答,这里就不重复叙述了。

算法工程师如何补足产品和运营知识?

https://www.zhihu.com/question/436066262/answer/1695872348

那怎么检验自己真的「懂业务」了呢?你可以检查下自己能不能做到下面这些点:

  • 检查下自己是否能快速复现方案?
  • 如果能快速复现方案,是否能估算每个阶段大致需要多少人多少时间?
  • 面对不同的数据量,能否估算一个大概的服务器性能需求?

    3.软实力层面

    懂技术了,又懂业务了,是不是感觉还不够差点什么能力去推动产品落地?这个是抛开技术和业务之外的东西,要描述成一个具体的能力,真的很难,我会把这些能力都归结于「软实力」。我认为主要是表现在沟通,思维这两方面。情商、亲和力、共情能力、有眼光,这些算不算软实力?当然算,但你有没有发现,这些软实力都是基于沟通和思维的。

沟通和思维等软实力包括(但不限于):

  • 和客户沟通的能力。听你讲的客户并不一定是算法工程师或者数据科学家,你是否能把自己的方案原理讲清楚?设计到技术的概念,是否能让非技术的听众也能大致理解?
  • 思考能力。例如结构化思维和批判性思维。其实有一定套路,只要多加练习就能掌握。推荐书籍有《金字塔原理》、《批判性思维工具》等。
  • 推动团队的能力。和个人魅力息息相关。

这里说个真实故事,和算法无关,和软实力有关。我大舅是开工厂的,产品良品率之前一直上不去。我二舅退休后就去我大舅厂里做质量监督。我二舅就中学学历,普通话也不标准,但我二舅进厂后,产品良品率上去了,工厂也扭亏为盈了。我问他怎么做到的,他说,很简单啊,对于那些手工不精湛的小伙子,我就亲自做一遍给他看,并告诉他,我一个退休老头都能按质做好,为啥你不行?就这么耐心的一个个沟通,一个个教学,盯着他们直到确认他们能做好为止。看起来这很简单是吧,但这过程需要耐心沟通,需要系统性思维找到关键因素。这就是软实力的表现之一。

如果你观察销售团队的日常,你会发现,他们做的事情看起来简单,大部分时间就是给客户发发邮件,和客户开开会,都是动嘴皮子的事情,但是如果让你去做这些,你会发现你会缺少自己貌似很难推进,你会问自己,自己嘴皮子咋就不那么好呢?软实力就像肌肉,运用软实力的过程就像搬砖,把砖头从A点搬到B点看着很容易,但搬起来才发现自己肌肉还不够强大。

而锻炼软实力的方法?无它,只有干多了,软实力才能上去。具体的说,对于算法工程师而言,就是不要逃避那些繁琐的看似没收获的事情。例如在我为某客户落地风控系统的过程中,我们需要和他们的项目经理保持联系,有问题也要给他们的数据团队反馈。其实这过程还挺难搞,因为他们作为一个跨国大公司,显然数据中心是需要同时对接很多vendor的,所以当和他们合作时,需要经常主动推进项目进度,不然他们的项目经理会问责我们。例如我们有个pipeline每天固定时间要跑,他们作为上游,需要在运行时间前把数据给到我们。当时间到了,数据还没给到我们,

我们要做的第一个事,就立马需要给数据团队发送邮件,抄送项目经理,分清责任;
然后积极跟进回复,搞清楚原因,和数据团队商量个预计解决时间,并且在这个时间点来临前就问问进度,以预留足够时间来应变。

在这些看似繁琐的沟通过程中,我掌握了推进工作的方法,养成了积极推动工作进展,并在deadline来临前检查进度以预留时间应变的好习惯。

总结

算法工程师的「落地能力」包括技术能力,业务理解,还有软实力。但对自己要求不要太苛刻,就好像你玩游戏时很少能用到每个维度的能力都满分的英雄一样,人的能力是有个频谱的,不可能方方面面都能做得满分,所以不要对自己感到挫败。
就拿我自己说,大家别看我说的头头是道,但是说实话,说了这么多,其实我自己也并不能每个方面都做得好。这个「落地能力频谱」就像是一个打分卡,帮助你从更全面的角度来分析自己的能力频谱。有的人技术不那么精湛,但很懂业务,很会带队,也能使得产品顺利落地;有的人技术满分,但业务和沟通能力欠缺,但配合其他团队成员的优势,也能使得产品顺利落地。
所以,接受自己的不足,尽可能动态平衡自己的能力频谱,总有一日,你能成为具有超强「落地能力」甚至能独当一面的算法工程师。

Hidden Technical Debt in Machine Learning Systems https://wiki.esipfed.org/w/images/5/5f/NIPS-5656-hidden-technical-debt-in-machine-learning-systems.pdf