过去的5年里,机器学习变得越来越容易,机器学习工具也正在变得愈加“平民化”。而与此同时,软件工程却比以往更复杂了。然而,这对于软件工程师来说是件好事,但对于机器学习(ML)专家来说则不然。
原因何在?事实上,这是机器学习到软件工程,数据科学到数据分析发展的进程。
机器学习工具正愈加“平民化”
谷歌希望每个人都能接触到机器学习模型的训练,不论他们的技术知识如何。随着机器学习大众化,云服务的市场逐渐增长,理解算法的价值则逐渐下降。
很久以前,我们手动编码算法。后来,Sklearn可以在几行代码中完成同样的操作。原始的TensorFlow很难使用,Keras使其变得容易。如今,谷歌、微软和亚马逊都提供服务用以选择、训练和调整云中模型,然后立即在API后提供模型。
可能在不久的将来,人人都可以训练人工智能。但是随着复杂性的降低,对于经验丰富的软件工程师来说,它只是信手拈来的另一个工具而已。
机器学习发展集中于几门语言上
语言的重要性不必多说。你知道COBOL(面向商业的通用语言)吗?如果知道,便能获得一份终身工作。世界金融体系依赖于此。然而如今没有人再学习COBOL了,大多数机器学习是通过Python来实现,而软件开发则是通过多种语言实现的。
如果每位机器学习工程师都具备使用Python的经验,那么你的竞争对手就是每一位机器学习工程师。但从软件的角度来说,你只会和使用相同技术的部分工程师竞争。
我总是能看到许多高薪的软件工程师(Ruby onRails)职位,这令我很惊讶,这个职位早在几年前就过时了,但是由于历史遗留问题,许多大公司,如Shopify、Instacart、Kickstarter等,仍在使用它。
你确实可以并且应该学习多种语言,这对于能否成为一名优秀的软件工程师来说至关重要。
软件工程需要更多技能
我们总是期待软件工程师对每个方面都至少有一些了解。
快速草图
后端工程师知道浏览器的工作原理,前端工程师也具备一些数据库的概念。两者都能防止如SQL注入这样的安全漏洞。对软件有一个整体理解能使改换专业变得更容易,还能帮助构建端到端解决方案。
广泛的技能组合使软件工程师能更好地适应模棱两可的环境。随着需求的增长,软件工程师经常转行到数据科学领域。但反过来,数据科学家则不太可能去开发软件。随着人们开始将机器学习看作硬编码条件逻辑的替代品,更多软件工程师去涉足机器学习领域。
成为有竞争力的全栈开发者需要数年时间
实际上,优化数据库、构建API微服务以及构建响应式前端这三者之间并没有什么共同点。他们可能是由3种不同的语言实现的,这些领域里几乎没有自动化。
与此相比,全栈机器学习工程师正在实现愈加强大的自动机器学习技术(AutoML),笔者可以为此编写一个SOP(标准操作程序),并将训练分类器的任务交给实习生。软件工程技能组各个部分的自动化淘汰还需时日。
(通常)机器学习是产品的补充而非产品本身
少数公司将人工智能作为其核心产品,而大多数公司将人工智能作为既有产品的补充。媒体可能会使用机器学习进行文章推荐,但其核心产品是写作或是出版平台。
有趣的是,大多数公司将机器学习用于简单和相似的用例。这使得单个公司很容易将上述用例作为软件及服务(SaaS)产品。再然后,突然之间初创企业不再需要在内部构建它了。
这与极度复杂且定制化的基础设施问题形成对比,亚马逊网络服务(AWS)上没有能在短时间内处理Medium基础设施的现成方案。
基础设施正变得异常复杂
亚马逊云服务(AWS)已经拓展出200多种不同的云服务。Heroku在云中运行应用程序的平台即服务(PaaS)方法很不错,但很昂贵。现在有一个全新的云服务平台来进行管理(网络、数据库、服务器),在这里,一个小失误可能会引发很大的安全隐患。
有一个名为“云工程”的完整开发子集,其任务是使软件在AWS、GCP或者Azure上运行。在小公司中,建设基础设施的任务通常落在高级开发人员的肩上。这个任务很复杂,但同时也意味着宝贵的工作机会和难以复制的技能。
前端开发正在持续发展
当笔者开始做开发时,还可以用jQuery构建响应式前端。但不久后公司转向了Angular或者React,Angular升级为Angular2(突发的改变),React将类组件转换为功能组件,并加入了hook。以上这些框架/函数库的工作方式完全不同。
一些公司致力于基于模型自动生成前端。但笔者的同事们一致认为,我们距离高质量产品还有很长一段路要走。
软件开发十分复杂,但这种复杂性意味着不可替代的技能,这非常有利于就业。广泛的技能组合赋予了人们端到端解决实际问题的能力。为了构建一个能使普通人自行解决问题的社区,软件工程是一个不错的开端。
机器学习该何去何从呢?它仍然拥有一席之地,但显然,解决问题比训练模型更为重要。