在过去的五年中,机器学习变得更加容易而软件工程比以往更加复杂。对于软件工程师来说,这是好事,但对机器学习专家却不是。这是机器学习向软件工程,数据科学向数据分析的发展过程。
机器学习工具正变得越来越友好Google希望使每个人都可以轻松地训练机器学习模型,无论他们的技术知识如何。随着机器学习的发展,云服务的市场也在增长,理解算法的意义也在下降。
曾几何时,我们手敲一行一行算法代码。而如今,Sklearn让我们用几行代码实现相同的结果。原来的TensorFlow很不友好,是Keras让它变得容易使用。
Google,Microsoft和Amazon现在都提供,可以在云端上选择训练和调参的服务,然后马上就能提供相关模型的API。
让任何人都可以训练AI还需要一段时间。但随着复杂性的降低,它成为了经验丰富的软件工程师的另一种工具而已。
机器学习的发展只和几种编程语言相关你会用COBOL吗?如果是,那么你就可以不愁没工作了。世界的金融体系建立在它之上,而如今没人在学COBOL编程。
大多数机器学习项目都是用Python实现的,而软件开发则分布在多种编程语言中。
如果每个机器学习工程师都有Python的经验,那么每个机器学习工程师都是你的竞争对手。而在软件工程方面,你只和使用相同语言的人竞争。
我总是惊讶地看到很多高薪的Ruby on Rails框架相关的工作。虽然它在几年前就已经过时了,但是许多大型公司(Shopify,Instacart,Kickstarter等)由于续航与工程量原因依然还在用它。
你应该,也有能力去学习多种编程语言,这是成为一个优秀软件工程师的关键。
软件工程包含更多技能我们期望软件工程师对一切都至少知道一点。
后端工程师仍然需要知道浏览器的工作方式。前端工程师也了解一些数据库概念。两者都可以防止SQL注入之类的安全漏洞。
对软件有全面的了解,可以让你更轻松地更改专业方向。它还使你具备构建端到端解决方案的能力。
广泛的技能包使软件工程师更适合丰富的环境。随着需求的增长,软件工程师通常会转向数据科学。相反,数据科学家开发软件的可能性较小。
随着人们开始将机器学习看作是手敲底层代码的替代方案,我们将看到更多从事机器学习的软件工程师。
成为有竞争力的全栈开发人员需要很多年除了使用已知的语言,也包括用了许多之间没有重合的技能。
从优化数据库,构建API微服务和构建响应前端的字面上看,基本没有共同点。它们可能用3种不同的编程语言实现。而且在这些领域,我们几乎看不到任何自动化的过程。
与此形成鲜明对比的是,全栈机器学习工程师现在正在完成功能越来越强大的AutoML,用了它之后,就可以写一个SOP(Standard Operating Procedure,标准作业程序),然后将训练分类器的工作委托给实习生。
而软件工程技能包中的所有组件都因自动化而不复存在还需要一段时间。
机器学习是产品的补充而不是产品(通常)少数公司将人工智能作为其核心产品,而大多数公司使用人工智能来补充现有产品的缺失。
Medium网站可以使用机器学习来实现文章推荐功能,但是核心产品是写作/发布平台。
有趣的是,大多数公司都将机器学习用于简单重复的任务。这使某个公司可以轻松地将上述用例作为SaaS产品提供。然后,初创公司就不再需要重新构建了。
而与基础架构相关的问题往往复杂又有许多自定义任务。比如AWS上没有任何现成的解决方案会很快搭建Medium网站的基础架构。
基础架构变得异常复杂AWS已扩展到200多种不同的云服务中。
Heroku在云端中运行应用程序的PaaS方法很棒。但是在任何大规模项目上都变得过分昂贵。
因此,现在我们有了一个全新的云端栈来管理(网络,数据库,服务器),其中一不小心会造成巨大的安全漏洞。
有一个称为“云工程”的开发子集,其目的是使软件在AWS,GCP或Azure上运行。
在较小的公司中,基础架构通常是高级开发人员的职责。
这是复杂的内容,同时也意味着工作机会和难以替代的技能包。
前端开发在不断发展当中成为一名顶尖的前端开发工程师是一项技能。
当我开始开发时,使用jQuery构建响应式前端是完全OK的。然后公司换成了Angular或React。然后Angular变成了Angular2(具有重大改进)。React从类转移到功能组件,并添加了hooks。
以上所有框架/库都以根本不同的方式工作。
有几家公司致力于基于mockups的前端自动生成。但我的同事们的共识是,他们离高质量产出还有很长的路要走。
前端开发方面的技术能力,加上对完美像素的感知,目前依然令人惊讶。
结语软件开发是一个复杂且包含广泛问题的领域。这个复杂度对雇佣员工有好处。
但更重要的是,广泛的技能包赋予了端到端解决实际问题的能力。
对于建立一个让普通人有能力解决自己技术栈中问题的开发社区,软件工程是一个很好的起点。
那机器学习有一席之地吗?当然。但解决问题比训练模型更有意义。
学习软件工程,完成开发,解决问题。