在微软的Build大会上,微软首席技术官凯文·斯科特(KevinScott)谈到了一个实验项目,其中一个在GitHub上受过代码训练的AI实际上创建了程序:它基于描述性注释和消息签名生成函数主体。与此类似,一份无关的研究论文报告说,程序在无监督的情况下从一种语言翻译为另一种语言,实际上比自然语言翻译更容易。
微软的演示很好,仅仅是演示,并且研究论文仅仅是研究论文。微软的AI能够为一些相对简单的函数提供方法主体。这显然是相当有限的。这就引出了一个问题,即您究竟如何编写注释来告诉AI该怎么做;我们只是用一种模棱两可,不精确的人类语言来代替精确编程语言中的描述吗?我敢肯定,训练模型要比雇用程序员编写一些简短功能花费更多。编程工作数十年内不会消失,码农还是有存在的价值的。
不过,对我们而言,重要的是要考虑自动化对于编程的未来可能意味着什么。我可以告诉您编程已经高度自动化,并且一个好的优化编译器已经是一个先进的AI系统,它可以将您的提示转化为工作代码。
编程不会“消失”或“变得过时”。但是,其含义将改变。尽管微软的演示可能表明程序员最终可能会从编写简单功能的任务中解放出来,但代码生成引擎肯定是由一组程序员(可能是一大批)构建的。编写高级工具(例如Microsoft的编码引擎本身)的程序员可以松一口气。设计API的程序员也一样,因为您仍然必须提供函数/方法签名。
尽管此演示可以吐出函数,但我几乎看不到任何迹象表明它可以从其编写的函数中构建更大的系统。尽管它具有调用已编写函数的能力,但是它无法将已编写规范中的大型程序组合在一起。它可能可以吐出一个简单的账单,但是肯定不能吐出一个完整的账单系统。毫无疑问,但这可能要花费数十年的时间。普通码农现在很安全。
但是,这一壮举仍然引出了关于编程的含义的问题。在视频中,凯文·斯科特(KevinScott)谈到了减少程序员在乏味,重复性任务上花费的时间。是的,这就是我们所有人对AI的评价:它将减少花在乏味,重复性任务上的时间,并腾出更多时间进行创造性工作。不过,让我们分解一下。大部分编程都在详细说明如何执行某些过程。这可能很乏味,通常是重复的,并且肯定容易出错。我们确实需要更多地考虑编程应该是什么。用斯科特的话来说,编程的“创造性”方面是什么?
我不确定“创意”是否正确。早在年代和年代,程序员被称为“分析师”。尽管这项工作可能与现在的工作几乎没有什么不同,但让我们考虑一下“分析师”的含义。分析师分析问题;他们考虑问题是什么,以及如何有效地解决它。他们考虑将其分解为多个部分。他们甚至可能在考虑是否应该解决该问题。他们可能会思考应如何解决,引发什么道德问题以及应如何处理这些问题。可以滥用软件吗?如果是这样,怎么办?可以采取哪些步骤来防止滥用?分析人员需要考虑人们将如何使用该软件:什么是用户界面,什么是用户体验,残疾人可以使用它吗?
“分析师”本质上是在进行软件体系设计:就软件应该做什么以及应该如何构建做出大的决策。分析师和架构师需要了解业务案例。他们需要从业务角度向管理人员提出有关软件系统的决策。
我们对编写代码以及通过“代码行”衡量生产力的重视是鼠目寸光。只需看一下我们用于构建,测试,归档和部署代码的所有出色(绝对必要)的工具。但是,那些本质上和革命性的工具并不能解决真正的问题:我们正在解决正确的问题吗?有成千上万的应用程序通过了每个单元测试,每个集成测试和每个验收测试,但是仍然很难使用。而且我们正在学习,我们很少想到软件的新方面:是否有需要使用我们软件的小组?您的软件是否支持辅助功能?无法访问计算机和网络的人可以使用它吗?对系统进行设计,以使需要使用它的人员可以便捷的使用它。我们还需要更多这样的分析。
编程不仅仅是代码和函数的编写。这项工作中最重要的部分与在面试中在白板上书写快速排序无关。有很多事情要考虑;目前,程序员花太多时间把代码赶写出来才能满足发布日期,而不是花在思考更大的事情上。那几乎总是别人的工作。但是,无论是否投入生产,微软的研究都为我们提供了一个思考编程真正含义的机会。真正的工作是什么?我们到底想完成什么?