在过年的五年中,机器学习变得更容易了。与此同时,软件工程比以往任何时候都要复杂。
对于软件工程师而言,这是一件好事。但对于机器学习专家而言,这并不是好事。
这是机器学习向软件工程靠拢的进程,也是数据科学向数据分析靠拢的进程。
本文由 Chris 发表在 medium.com,经原作者授权由 InfoQ 中文站翻译并分享
机器学习工具正变得越来越易用
谷歌希望让所有人,无论技术背景如何,都能很容易掌握机器学习模型的训练方法。(参见:技术民主化)
随着机器学习变得越来越容易使用,云服务的市场也在增长,而理解算法的意义也在下降。
曾经,我们需要人工实现算法。现在 Sklearn 使得同样的算法只需几行代码就能实现。
原本的 TensorFlow 很难使用,Keras 让它变得简单多了。
现在,谷歌、微软和亚马逊都提供选择模型、训练模型和调参的云服务,然后通过一个 API 就能立刻部署一个模型。
我们离人人皆可训练人工智能的时代还有一定的距离。但随着复杂性的降低,训练人工智能变成了熟练软件工程师知识体系中的一个新工具而已。
机器学习开发仅局限于几种语言
语言即是护城河。就这么简单。
你了解 COBOL 吗?如果你熟悉这个语言,你这辈子都不愁没有工作了。这个世界的金融体系都建立在这个语言之上。但现在已经不再有人学习 COBOL 了。
大部分的机器学习算法都是通过 Python 来实现的,而软件工程开发需要各式各样的语言。
如果每个算法工程师都有 Python 的开发经验,那你就需要与所有算法工程师竞争。而在软件开发方面,你只需要与一部分使用同样技术栈的工程师竞争即可。
我常常会惊讶地看到很多高薪的 Ruby on Rails 开发的职位在招人。它在几年之前就已经过时了,但很多大公司(Shoptify、Instacart、Kickstarter 等等)由于历史原因还在使用它。
你肯定可以同时也必须学习多种语言,这是一名优秀的软件工程师的必备素质。
软件开发囊括更多的知识技能
我们期待软件工程师对所有领域都至少有一点了解。
一位后端工程师也知道浏览器如何运作,一位前端工程师对数据库也有一定的了解。他们都能避开类似 SQL 注入的安全漏洞。
如果你拥有对于软件工程的整体理解,就更容易切换所专注的领域。这同时也让你具备构建端到端解决方案的能力。
广泛的知识技能体系使得软件工程师更适用于多样的可能性。随着市场需求的增长,经常有软件工程师转到数据科学领域。与之相反的是,数据科学家通常不会开发软件。
随着人们开始认为机器学习是硬编码的条件逻辑的替代方案,我们在将来会看到越来越多的软件工程师从事机器学习工作。
成为一名优秀的全栈工程师需要好几年
并且,成为一名优秀的全栈工程师需要掌握很多互不相干的技术。
优化数据库、构建 API 微服务以及建造一个响应式的前端,三者之间几乎没有共同之处。它们可能需要通过三种不同的语言来实现。
在这些领域,我们目前几乎没有看见任何自动化方案。
相比之下,全栈算法工程师正在和越来越强大的自动机器学习(AutoML)竞争。使用 AutoML 的情况下,我甚至可以写一个标准作业流程(SoP),然后把训练分类器的工作分配给实习生。
而软件工程中所有技术都被自动化,不再需要人力参与的那一天还远未到来。
机器学习为产品添砖加瓦,但机器学习本身大多不是产品
很少有公司把人工智能作为它们的核心产品,而是使用人工智能让现有产品更加完善。
Medium 也许使用机器学习来推荐文章,但是它的核心产品是文章写作与发布的平台。
有趣的是,大多数公司将机器学习应用在简单且相似的场景。这样一来就更容易出现为这种场景提供软件即服务(SaaS)产品的企业。然后突然之间,初创企业发现自己不用再费力开发自己的方案了。
相比之下,系统基础架构的问题是极度复杂而不通用的。AWS 上在不远的将来也不会有现成的解决方案可以处理 Medium 的基础架构。
基础架构正在变得异常复杂
AWS 已经膨胀到拥有超过 200 个不同的云服务了。
使用 Heroku 的产品即服务(PaaS)方案来运行应用是一个不错的方案,但它在产品规模扩大后就变得非常昂贵。
因此,我们现在需要管理一个全新的云技术栈(网络、数据库、服务器),其中一个小失误就能导致巨大的安全漏洞。
开发工作中的一部分是云技术开发。其工作是使得软件能在 AWS、GCP 或者 Azure 上运行。
在小型公司里,基础架构的工作往往由高级开发者来负责。
基础架构是一个复杂的东西,但它同时也意味着工作机会和难以被取代的技能。
前端开发正在不断发展
能跟上前端发展的步伐本身就是一个技能。
我刚开始从事开发时,使用 jQuery 来构建响应式的前端还不算太难。随后,大量公司开始使用 Angular 或者 React。Angular 推出了 Angular 2(伴随着巨大的改变)。React 从类转移到函数组件,并添加了 hooks 函数。
以上所有的框架或者库都以完全不同的方式运作。
也有一些公司正在构建基于原型(mockup)的自动化前端。但是我的同事们一致认为,它离达到生产环境的要求还很远。
前端开发方面的技术能力需求,加上对 " 什么是像素级还原 " 的理解要求,都令人感到前端开发一时之间仍不可替代。
结 语
软件工程是复杂的,并且包含了各种各样的问题。这种复杂性有利于软件工程师的就业。
但更重要的是,这种完备的技术体系代表了能解决真实的、端到端的问题的能力。
要建立一个让普通人能解决自己所在领域问题的社会,软件工程就是一个不错的开端。
机器学习还有自己的一席之地吗?当然有。但是解决问题远比训练模型更重要。
去学习软件工程,做点东西,并且解决问题吧。
原文链接: