一些关于技术的小小思考。


前言

  实习返校已经有一个月啦,但是返校后实在是太忙了。最近也在调整状态中,顺手写一下技术的复盘(复盘 拉通 对齐 ~ 互联网黑话学废了(狗头保命))。

  能够得到算法实习机会,还是我读研后一直在研究的推荐算法岗,我非常幸运。

  回忆三个月的实习生活,短暂又充实。还记得拿到实习offer时发现竟是在全上海最繁华的地段工作,感觉捡到宝了哈哈哈哈。

  感受了一把互联网企业的作息时间10-8-5(感谢mentor没有让我周六加班),了解了真正的算法工程师每天是怎么干活的,和开发岗还是有很多不一样的地方。

  实习前幻想中的算法工程师的日常:
  天天看顶会paper,复现模型,科研工程两手抓,Python代码玄学魔改,工程师个个头发茂密穿着最常见的格子衬衣带着眼镜研讨模型应该再加个什么类型的注意力机制(雾),IT精英的代表,算法人上人(滑稽)!

  现实中的算法工程师的日常:
  开会拉通对齐(雾),和产品经理沟通需求和指标(吵架bushi),洗数据,特征选择,模型训练,玄学调参,分析badcase,分析离线上线各种指标,甚至还要标数据选数据等等。这样说来,写代码的时长似乎反而是最短的(知道真相的我不禁流下了我太年轻的泪水)。

  数据——不想当优秀数据清洁工的算法工程师不是合格的程序员。

  模型——先上简单的,能用再说。后期可以慢慢调。

  指标——人工评估yyds。

  以上多少带点开玩笑的语气,大佬们看了不要拍我呀(嘻嘻)

  下面是正经地技术思考贴!

算法 vs 开发

  算法分为很多种的,比如通信算法、机械算法、人工智能向算法,我这里主要说的是人工智能向的算法。人工智能向的算法,粗略地说往往称为机器学习算法,里面又包括深度学习算法。按不同方向有两大类需求最多,一类是视觉CV算法,一类是NLP算法,这是根据要实现的任务进行分类。还有根据场景进行分类的,比如推荐算法、广告算法、搜索算法。我谈谈推荐算法岗。

  搜广推在很多方面是有共通之处的,所以我们常常说搜广推是一家,当然,具体还是有业务差异的。推荐算法在几年是得到了飞速发展的,尤其是深度学习时代来临以后,各种在DNN上的魔改开始广泛出现在业务上,而不再是LR一把梭。

  可能每个在学校做科研的学生都把模型视作解决问题的关键,毕竟顶会里介绍模型的彩色图片制作精美,结构复杂,高端大气上档次,让人看了都要感叹一声这就是前沿技术的魅力吗?我在实习前,也天天想着怎么魔改我论文里的模型,让它看上去再高级一点,跟得上AI时代一些,即使我导已经点出了模型的创新是比较难的,而我依然执着于此,妄想创造个如同bert一样惊世骇俗的模型出来。

  实习中给我最大的收获是,算法工程师最核心的能力除了对各种模型的熟练以外,在数据侧的研究也要捻熟于心。

  数据!数据!数据!

  事实就是,想破脑袋去魔改模型或者玄学调参,很有可能不如认真检查数据问题对结果提升来得快。我现在可以理解,为什么很多人把算法工程师划分到数据科学里了。现在的机器学习工程师,狭隘地说,就是借工具来挖掘数据的规律,进而实现一定的预测能力。

  开发则更偏向于具体实现。如果说开发是一个人的躯干,那么算法则是一个人的灵魂。灵魂不能脱离躯干,所以算法离不开开发。但是很多小公司不需要算法,正如只需要工具人干活就好了,工具人不需要灵魂。大厂想做有理想的产品,能改变世界的产品,就会需要灵魂去创新,也就需要算法。

  开发和算法的成就感也截然不同。开发的成就感更多来自于模块或者系统编写成功,能够运行带来的快感。想着成千上万的用户正在使用我写的软件,这种存在感是成就感的来源。算法的成就感往往来自指标的提升,比如广告部门赚钱更多了,点击率更多了,转化率更多了,从而推测我们的算法起作用了。开发很多时候是在重复造轮子,而算法有时候是在寻找一个没有经验可循的新方法,这时脑洞和经验齐飞,创新不再是空谈。

  这几年来,我对算法和开发都有了若干的尝试,这对于我曾经向往的全栈有了很好的打底,想必未来在分析一个问题的时候,从开发和算法不同的角度想方案,会有不一样的思索。

编程语言之争

  一直以来,关于到底学什么编程语言好的争论从未停止过。我自己从接触开发开始,也经历过很多次摇摆。本科时最早学习的Java,毕设做的安卓app,结果第一份工作阴差阳错做的C++软件开发。后来读研,又开始做算法科研,用的Python。为了接触大数据,又重新学习Java。

  曾经我也不断问自己,到底选C++还是Java?C++偏底层,更适合于服务器开发、游戏开发、算法引擎等,Java更适合于Web、企业级应用等。我到底喜欢哪个?

  直到在实习过程中,我发现即使我是算法工程师,写Python为主,可是要上线的时候,我还是要写Java的。

  突然就真正地意识到,编程语言只是工具,面对什么场景,什么语言合适就用什么语言,而不是我喜欢什么语言写什么语言。我为什么不能既会Java又会C++还能写Python呢?

  其实只要学会一种编译语言,再学会一种脚本语言,基本上要迁移到其它语言是不难的。甚至现在刷题的时候,看到一个问题,可能也不一定限制于用某一种语言写,而是会考虑哪一种语言最适合这道题,就用哪种语言做。

  啊,我悟了。

总结

  最近一两年纠结的两大问题:选算法还是选开发,选C++还是选Java,在上面复盘了一遍,说了又好像没有完全说,哈哈哈哈哈。

  总之,写代码的活就是最好的!

  闭环了。