深度揭秘:机器学习对软件开发带来哪些影响?

摘要: 当软件开发遇见机器学习,到底能碰撞出什么样的火花呢?

机器学习有望从根本上改变软件开发的本质,这也许是自FORTRAN和LISP被发明以来软件开发领域改变最大的一次。这些变化对数百万正在从事软件开发的人而言,意味着什么呢?失业?裁人?现有的软件开发将变得面目全非?程序员

自20世纪70年代以来,咱们尽量的构建了足够多的软件。咱们有高级语言,低级语言,脚本语言以及用于构建和测试软件的工具,但咱们利用这些工具作的事情却没有发生太大变化。咱们如今拥有的语言和工具比50年前要好得多,但它们本质上是同样的。咱们仍然使用代码编辑器,但这些编辑器变得更花哨了:他们有彩色的高亮,变量名补全,它们有时能够帮助咱们完成重构等任务,但他们仍然是emacs和vi的后代。面向对象编程表明了一种不一样的编程风格,但从某种本质上而言并非“全新”的事物,对于函数式编程咱们能够一直追溯到50年代。算法

将来咱们将专一于机器学习而不是人工智能。机器学习曾经被称为“AI最管用的那一部分”,更重要的是,“机器学习”这种提法能够避开相似“通用智能”这种叫法。由于这样的系统目前不存在,而且可能永远不存在,目前来看只有人类才能作到这一点。而机器学习可能只比模式识别多一点点,但咱们已经看到模式识别能够完成不少工做。实际上,手工编码的模式识别是咱们当前工具集的核心:这真的是现代优化编译器所正在作的。数据库

麦肯锡估计“使用现有技术,只有不到5%的职业能够彻底自动化。然而,大约有60%的职业工做活动中,具备30%或更多的组成部分可以被自动化。”软件开发和数据科学不会成为彻底被自动化的职业之一。但优秀的软件开发人员一直在寻求对于繁琐,重复的任务的自动化,毫无疑问,软件开发自己将日益变得能够被自动化。这并非一个激进的愿景,由于咱们在过去的半个世纪里持续的为了自动化工具而努力。编译器对编写机器代码的过程进行了自动化。脚本语言经过将更大,更复杂的程序粘合在一块儿来自动执行许多枯燥无味的任务。软件测试工具、自动部署工具、容器和容器编排系统等等,这些都是为了对开发、部署、管理软件系统的过程进行自动化的工具。并且这些都没有利用机器学习,但这确定是下一步它们要作的。编程

机器学习会不会吞并软件?

毕竟,“软件吞噬世界”是一个日益抽象和广泛化的过程。笔记本电脑,手机或智能手表已经逐渐取代收音机,电视机,锁和钥匙,电灯开关,这是由于咱们并无将计算机仅仅当作数字计算器而是通用机器。从这个角度来看,很容易将机器学习想象成下一个抽象层次,这是咱们迄今为止发现的最通用的问题解决工具。固然,神经网络已经证实了它们能够执行许多特定任务。由资深人士乐观地表示,对于许多任务而言,收集数据比编写程序更容易。对于一些很是有趣且困难的程序,这无疑是正确的,好比说收集围棋或国际象棋的训练数据很容易,但很难写一个程序成功地玩这些游戏。另外一方面,数据收集并不老是那么容易。咱们没法设想自动标记图片的程序,特别是在Facebook和阿里巴巴这样收集了数十亿张图片的网站,并且其中许多图片已被人类标记过。对于像人脸识别这样的任务,咱们不知道如何编写软件,并且很难收集数据。对于其余任务,例如计费,能够很容易地根据一些简单的业务规则编写程序。若是你可以收集数据,你编写的程序将更好地适应不一样的状况,还可以检测异常,这一点当“将人类归入软件迭代的循环”时,尤其如此。安全

正在代替代码的机器学习

机器学习正在使代码变得高效:Google的Jeff Dean说,500行TensorFlow代码已经取代了谷歌翻译中的500000行代码。虽然代码行数是一个值得质疑的指标,但不管是从编程工做量角度来看仍是从须要维护的代码量来看,这个突破都是可称赞的。更重要的是这段代码是如何工做的:相比于五十万行的代码,这是一个通过训练以用于翻译的神经网络。神经网络能够随着语言的变化和使用场景的变化,在新数据上被从新训练,并且整个代码都不须要重写。虽然咱们不该低估训练任何复杂度的神经网络的难度,但咱们一样也不该低估管理和调试一个巨大代码库带来的问题。网络

研究代表,神经网络能够经过组合现有模块来建立新程序。虽然以这种方式构建的程序很简单,可是让单个神经网络可以学习执行几个不一样的任务是很重要的,每一个任务一般都须要一个单独的程序。架构

Pete Warden认为:“开发人员必须成为一名教师(教机器),一名训练数据的策划人。”咱们发现,这种说法很是具备启发性。软件开发不会消失,但开发人员必须以不一样的方式来思考本身。你如何构建一个解决通常问题的系统,而后教该系统解决一个特定的任务?这貌似听起来像是一个风险很高又麻烦的场景。但这意味着咱们的系统将变得更加灵活,具备很强的适应性。Warden设想的将来,更可能是关于产出的,而不是关于撰写代码行数。Peter通过更加系统的思考,认为机器学习能够从训练数据中产生短程序,而不是很大的程序。机器学习

数据管理和基础设施

早期的迹象代表,机器学习有着能够赛过传统的数据库索引的性能:它能够学习预测数据的存储位置或者预测数据是否存在。机器学习明显更快,而且须要更少的内存,但也有着至关大的限制性:当前基于机器学习的工具不包括多维索引,并假设数据库不常常更新。从新训练比重建传统数据库索引须要更长的时间。尽管如此,研究人员正在研究如何学习到多维索引,查询的优化,从新训练的性能。编辑器

机器学习已经进入了数据基础设施的其余领域。数据工程师正在使用机器学习来管理Hadoop,从而能够更快地响应Hadoop集群中的内存不足等问题。 Kafka工程师使用机器学习来诊断问题,从而简化了管理许多配置的问题,这些配置会影响数据库的性能。数据工程师和数据库管理员不会过期,但他们可能须要发展一下他们的机器学习技能。机器学习将帮助他们使困难的问题变得更简单,管理数据基础架构这个工做,将不会像正确设置数百个不一样的配置参数那样,它会更像是在训练一个系统,让整个管理工做运行的更有条理。函数式编程

使困难问题变得可管理是数据科学最重要的问题之一。数据工程师负责维护数据管道:提取数据、清理数据、特征工程和模型构建。同时他们还须要负责在很是复杂的环境中部署软件,一旦部署了这些基础架构,还须要不断监视它,以检测(或防止)资源用尽,确保模型正确运行。这些都是很是适合用机器学习处理的任务,咱们愈来愈多地看到像MLFlow这样的软件可以被用于管理数据管道。

数据科学

在自动化编程的早期表现形式中,工具旨在使数据分析师可以执行更高级的分析任务。Automatic Statistician是一种更新的工具,可自动进行探索性数据分析,并为时间序列类型的数据提供统计模型,且附有详细说明。

随着深度学习的兴起,数据科学家发现本身须要寻找合适的神经网络架构和参数。让神经网络学着找到合适本身架构的过程,也可能被自动化。毕竟,神经网络就只是单纯的自动化学习工具:虽然构建神经网络结构须要大量的人力工做,可是不可能手动调整模型的全部参数。将来的场景应该是使用机器学习来探索全部可能的神经网络架构:正如一篇文章指出的,10层网络可能就有10的10次方种可能性。已经有其余研究人员使用强化学习来让神经网络架构开发变得更加容易。

模型建立不是一劳永逸的事情:数据模型须要不断进行测试和调整。咱们开始看到的用于持续监控和模型调整的这些工具并非特别新颖,好比用于A/B测试的老虎机算法已经存在了一段时间,对于许多公司来讲,老虎机算法算是强化学习的第一步。机器学习一样也能够用来查找软件中的漏洞,有些系统会浏览代码,并寻找已知的缺陷。这些系统不必定须要可以修复代码,也不承诺找到全部潜在的问题。可是他们能够很容易地对危险的代码进行高亮显示,而且他们能够容许在大型代码库上进行开发的程序员提出诸如“还有相似这样的问题存在于其余地方吗?”之类的问题。

游戏开发者也正在探索利用机器学习来下降游戏开发成本以及创造更多有趣的游戏。机器学习能够用来制做看起来更逼真的背景和场景吗?游戏开发者都知道对逼真的场景和图像进行绘制和建模又耗钱,又费时。目前,非玩家角色(NPC)所作的一切都必须明确编程。机器学习能够用来模拟NPC的行为吗?若是NPC能够学习到行为,咱们能够期待更有创意的游戏玩法出现。

展望将来

软件开发人员的将来是什么样的?软件开发是否会一样走上麦肯锡为其余行业预测的演化路径呢?在软件开发和数据科学中所涉及的30%的工做是否会被自动化?也许,刚刚咱们所谈的只是对将来某种状况的简单解读。但毫无疑问,机器学习将改变软件开发。若是将来咱们如今所认为的“编程”中很大一部分被自动化了,那也没什么好惊讶的。编译器不进行机器学习,但他们经过自动生成机器代码来改变软件行业,这在将来可能并非什么新鲜事。

重要的问题是软件开发和数据科学将如何变化。一种可能性,其实是一种事实:软件开发人员会在数据收集和准备方面投入更多精力。没有数据训练,机器学习就什么都不是。开发人员必须作的,不只仅是收集数据; 他们必须构建数据管道,以及构建管理这些管道的基础设施,咱们称之为“数据工程”。在许多状况下,这些管线自己将使用机器学习来监控和优化本身。

咱们能够看到训练机器学习算法成为一个独特的子专业;咱们可能很快会有一个新职业-“训练工程师”,就像咱们目前谈论的“数据工程师”同样。Andrew Ng在他本身的《机器学习渴望》一书时中说:“这本书的重点不是教你ML算法,而是教你如何让ML算法有效。没有编码,也没有复杂的数学。本书几乎彻底侧重于模型训练过程,而不只仅是编码,训练才是让机器学习有效工做的本质。”

咱们提出的想法都涉及一种能力:它令人类可以生产出更快、更可靠、更好的可以生效的产品。开发人员将可以将更多时间花在有趣且更重要的问题上,而不是把基本工做作好。那些问题多是什么问题呢?

在一篇关于智能加强的讨论里,Nicky论证了,计算机在针对一个问题寻找最佳答案上表现出色。由于计算机的本质是计算工具。可是他们不是很擅长“找到一个值得回答的有趣问题”,这件事是人类作的。那么,咱们须要提出哪些重要的问题呢?

这些重要的问题已经在不断的被发现了,好比咱们刚刚开始认识到道德在计算中的重要性,才开始考虑更好的用户界面,包括会话界面:它们将如何运做?即便在人工智能的帮助下,咱们的安全问题也不会消失。先无论安全问题怎样,咱们全部的设备都在变得“聪明”。这意味着什么?咱们但愿它们作什么?人类不会编写尽量多的低级代码。可是正由于他们将不会去编写那些代码,因此他们能够自由地思考代码应该作什么,以及它应该如何与人交互。须要解决的问题永远不会少。

很难想象“人类再也不建立软件”的将来,但很容易想象“将人归入软件研发的循环”中在将来将占愈来愈多的比重。



本文做者:【方向】

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索