还记得软件席卷世界的时候吗?一个最近比较流行的观点是,人工智能正在席卷各类软件。过去,谷歌的首席执行官桑达尔·皮查伊(SundarPichai)谈到了“自动编写自己”的软件。有些人认为软件开发的工作只是比创造不断重复代码片段复杂一点,那么现在,人工智能的快速发展可能会让软件工程师们集体失业。
传统上,开发人员编写软件有着一系列固定的规则,例如:如果a发生,那么就进行b操作。人类码农指导着机器,这是软件1.0时代。但在软件2.0时代里,人们认识到,基于深度学习研究的进步,我们可以构建一个神经网络,来学习需要哪些指令或规则才能获得预期的结果。特斯拉人工智能总监安德烈·卡帕西(AndrejKarpathy)等人是2.0时代的支持者,他们提出的论点是,未来里,我们将不再需要亲手编写代码。我们只需要找到数据并将其输入机器学习系统,一切就完成了。在这个场景中,软件工程师的角色将转变为“数据监管员”,或是“数据赋能者”。
然而,软件工程不会很快消失。即使软件工程师2.0、数据科学家2.0这样的新职业正得到不断的发展,人工智能技术也会反过来增强软件1.0时代工作者的能力。事实上,我们还不能确定软件工程在不久的将来,是否会变得和今日完全不同。深度学习神经网络系统中将会为我们提供帮助,但它不会完全取代我们。
机器学习将如何塑造软件开发?
这将是一个全新的世界,但我们并不是活在电视剧里。事实上,一般的智能办公室助理已经能安排一天的日程,并启动电话会议。甚至有些AI支持的系统,可以为企业生成商标,并根据反馈自动改进商标。
今天,手机会自动检查拼写并提示下一个单词。在编写代码时,类似的工具也会高亮潜在的错误。例如,从事结对编程(Pairprogramming)的人自然会预想到软件2.0对他们工作方式的影响。考虑到机器学习和会话接口方面的进步,可以想象,未来的一台机器就能撑起结对编程任务的半边天。
多年来,我们一直使用自动化工具来节省编写模板代码的时间。现在,AI驱动的助手工具也越来越频繁地出现在更加复杂的软件开发中。它们以增强式集成开发环境的形式出现,为人们推荐更好的代码组合。
人工智能的角色
让我们想象一个更高级的人工智能助手在未来发挥的巨大作用。在进行编码工作时,你的AI同时会通过分析确定你正在编写的是哪种代码,并且根据你的风格来自动完成其余的代码撰写。本质上,人工智能助手更像是获得你的授意,为你完成剩下的工作。
另一个人工智能助手将大有作为的领域是测试驱动开发。与人类工作速度形成鲜明对比的是,一个机器同事可以快速进行数百万次的迭代,来找到解决测试的正确代码段。拥有一个AI同事意味着,测试验证这项任务将交由AI完成。我们不用同时应对编写测试和测试验证这两项工作,从而节约了在编码上花费的时间,让我们有更多的时间用于理解和解决业务问题。
将来,软件2.0甚至可能会帮助指导测试驱动开发,为测试提出建议,并给出它自己的原因。让我们想象一下,营销人员来到开发团队,说他们想要这样或那样的功能。如果他们能以机器能够理解的方式表达他们想要的东西,机器就能自动选择必要的测试,并提出下一步的建议。
强化,而不是代替
这引发了一个终极问题:机器会完全取代软件工程师吗?现实情况是,我们最多只能达到百分之九十几的能力,而这仍然意味着1%的失败和不可预测性。一个监控系统需要用来确保所写的代码能够正常工作。也许软件工程师的新角色就是监控代码并帮助机器学习系统达到接近%的准确率。
既然我们已经概述了可以想象的好处,下一个问题就出现了:软件编程的哪些部分可以转移到深度学习2.0框架中,哪些部分应该保留在传统的1.0框架中?时至今天,我们得到的结论是,这些深度学习神经网络在监督学习环境下表现得很好。如果向它们提供训练数据,提供好的和坏的实例,那么它们就能学会正确地输出。
但这些系统的好坏取决于训练数据的质量。正如我的一位同事所指出的,改进模型的性能常常包括改进底层代码、部署环境,以及改进训练数据。事实上,一些机器学习系统因为过于优秀,以至于它们实际上被训练数据中的人为缺陷所耽误。
最终的一点想法
我们需要设计神经网络来处理其他解决方案。软件开发的某些部分能够很好地进行深度学习,而另一些部分则不能。如果我们再看看结对编程,通过与他人共享控制权,会有许多不同的方法来完成问题。软件开发是一个不断与其他同事协作的过程。每一对新的工作伙伴都会带来不同的经历和解决问题的不同方法。组合越多,得到的解就越多。
在软件2.0中,我们得到了一个新的AI伙伴来帮助开发人员更好地完成他们的工作。我们展望一个更有活力的人机合作环境,它将带来更多、更有效的解决方案。这对每个人都有好处。