聊天改变世界
编程何以能成为一种现代职业?
因为人类有欲望,程序本质上是一种让机器满足特定人群在特定环境下的欲望的方式。程序通过指挥机器输出字符,画面,声音等操作,来满足人的特定欲望。过去一两百年来,整个信息产业的发展,无非是这个过程的不断演进。
在我过去十多年的职业经历中,我学到一个令我印象极其深刻的道理。一个优秀的IT公司,就好像一台设计精良的生物计算机,你灌输一句话需求,它就应该自动自发的完成一系列流程,包括需求分析、应用开发、代码编写、直到交付测试给用户使用。这台机器的用户界面可能就是个微信群,你要做的只是往群里写一些需求,再掏些钱,然后等上一段时间,你就会发现世界被改变了。
聊天改变世界,一个好CEO最重要的技能是聊天。
逆天的ChatGPT插件
经过几年的酝酿,最近我们每天都在体验着人类的技术爆发,你根本不知道一觉醒来,就会又有什么神奇的新东西发布了。ChatGPT 已经拥有了十分强大的编程能力,我一直好奇这样的怪兽开放API时,究竟会是什么样的形式。上周,OpenAI公布了 ChatGPT 插件开发文档(https://platform.openai.com/docs/plugins/introduction),它完全没让我失望,我切实体会到了来自未来的编程方式。不!不是来自未来,它已经来了!
不妨从人类的编程方式历史开始说起。编程是人类与计算机打交道的方式。理解人类编程方式的进化,可以从程序载体,也就是程序长什么样,以及人类编写程序的方式两个方面来观察。
机器语言时代
最早的时候,人类使用一种机械式的分析机,它只能进行简单的数学计算。Ada Lovelace(1815-1852)在1843年发表了一篇文章,发明了一种使用打孔卡片输入程序控制计算机进行逻辑运算的方法。这时候的程序其实只是一堆数字。
这被认为是最早的编程方式。这已经是180年前了!
汇编语言与高级语言时代
在电子计算机发明后,计算机的体系结构逐渐稳定下来。1950年代,人们开始设计一些助记词指令代替数字来与计算机打交道,汇编语言就这样被发明了。汇编语言能够将人类可读的指令转换为机器可读的指令,助记词的加入让编程语言首次实现了“人类可读“,从此出现了”代码“这种东西。
与此同时,显示屏、键盘成了程序员编写程序使用的工具,程序员的工作从搬动开关、给卡片打孔这类体力劳动中解放了出来。
这已经是大概70年前的事了。
随着计算机的普及,计算机的用途逐渐从科学计算扩展到商用领域。1957年,IBM的程序员们为IBM 704计算机发明了叫做FORTRAN(Formula Translation)的高级语言,它简化了汇编语言的指令,高级语言更加接近人类的自然语言。
有意思的是,那时候人们并不怎么信任计算机的计算结果。据说在IBM 704计算机交付使用时,现场依然配备了数百名计算员复查确认计算机计算结果,直到大约十年后,计算工作才被完全交给计算机(参考:https://zh.wikipedia.org/wiki/IBM_704)。
随后科技突飞猛进,摩尔定律一直延续了几十年,集成电路持续进化,计算机的处理能力发生了翻天覆地的变化。
可视化编程
1984年,乔布斯发布了划时代的产品 Macintosh,开创了 GUI 的时代。GUI 的出现为高级语言带来了很多不一样的东西,人类除了打字外,还可以用鼠标来操作计算机了。从 GUI 诞生一开始,人们就开始琢磨怎么用图形化的方式编写程序代码,也叫可视化编程(Visual Programming)。
早在1988年,乔布斯还在折腾自己的 NeXT 电脑公司时,一个重要产品就是用于构建图形应用程序的 IB (Interface Builder)。微软也紧随其后,在1991年推出了帮助人们拖拖鼠标就能创建图形应用程序的 Visual Basic。这些可视化编程工具一直在持续进化发展,直到今天依然在广泛使用。
这大概是30多年前的事儿。
在可视化编程的世界里,程序的载体是一些可视化图形,程序员可以通过鼠标或者触摸设备操作他们。这听起来很酷,可现实是残酷的,人们很快发现,可视化编程存在许多难以解决的硬伤。比如 GUI 在复杂系统面前的效率远不如字符高效,而且难以优化程序性能;比如可视化编程开发工具自身开发难度就很高,很难跟上各种迅速进化的高级语言发展,往往一代图形化开发工具发布,语言已经进化到下一代了;又比如图形界面的程序代码相比简单的字符代码来说,更难以长期维护管理以及多人协作等等。
因此,完全的可视化编程始终没有实现,只有在某些特别的场景,比如儿童编程教育或者工业软件设计下,可视化编程才得到小范围的应用。但人们对在更大领域范围使用可视化编程的探索一直没有停止,近年来各类低代码编辑器依然层出不穷。
不过,可视化编程作为一种辅助手段一直存在,而且日益成熟。它大大提升了程序员们的工作效率。现在几乎所有主流平台都有基于 GUI 的可视化编程环境。
丰富的现代编程语言
高级语言自身也不断进化,朝着更加擅长完成特定任务的方向演进。比如早在1970年代Xerox PARC做图形用户界面的早期研究时,就提出了 MVC (Model-View-Controller) 模式。它将应用程序分为了负责实现数据存取与算法的 Model 部分,负责绘制图形界面的 View 部分,以及与负责处理用户请求和业务逻辑的 Controller 部分。又比如互联网和云计算的发展使得应用程序不再只运行在一台计算机上,今天一个应用程序完成一次操作,可能会调用互联网上许多设备协同工作。
这个过程中,一条简简单单的数据,被转换成各种各样形式存在着。从用户的视角看来,数据可以是PDF文件中的一行文字,可以是Excel文件中的一个表格行,也可以是海报图片中的一小块图片。如果从程序员的视角来看就更加复杂,它可以是一段JSON,也可以是一张JPG图像;它可以是Java中的一个类实例,也可以是数据库中的一行数据;它可以是HTML中的包含的几个数字,也可以是路由器中的几个数据包。
这就是为什么1960年代科学家仅仅用4K的内存就可以控制登月飞船,可今天人们还在抱怨电脑运行的太慢。
为了描述和处理如此复杂的数据,就出现了许多特别适合某一场景的程序语言,比如HTML这样的内容标记描述语言,GraphQL这样的专用接口查询语言,或者YAML这样的数据描述语言。这种划分让高级语言开始向专一功能化的方式发展,高级语言之间设计分工越来越明确。
一些语言比如JavaScript中还包含了大量动态特性,今天的程序员们,常常在各种各样花里胡哨的编程语言中玩得不亦乐乎,甚至今天各厂商都爱定义一套自己编程语言才满足,让人颇有一种开发能力过剩的感觉。
程序员们很大一部分的折腾,都是在试图驯服 GUI 这头怪兽。人们通过 GUI 操作计算机,程序将人们的操作(鼠标移动点击或者手指触摸)翻译成计算机指令,计算机再将处理结果转换回显示屏幕上某些像素的颜色变化,人眼观察到这些变化,接受消息,满足需求。
这大概是近10年发生的事儿。
自然语言——程序语言终结者!
各种各样的高级语言,配合上眼花缭乱的图形化辅助工具,人们已经习以为常,直到 ChatGPT 出现在大家眼前。扯了那么多,我们来看看 ChatGPT 的插件系统提供了一个怎样的编程平台。
最精彩的部分在建立 ChatGPT 与你的服务API交互的过程,它以AI的方式包装了传统的应用程序。这部分过程,就好像用汇编语言的助记词指令代替人类无法看懂的机器码数字一样神奇。
我们可以忽略掉其他基础性的工作,包括完成用户验证以及创建清单文件的事情,作为开发者,你需要理解这些事情,但这些事情都是标准化的,其实很容易可以由AI帮助完成。
拿官方文档中的简单TODO插件的例子来说,你需要为ChatGPT撰写一些说明,像下面这样(是的,你也不需要用英文,中文也可):
生成一份OpenAPI定义的YAML代码,用于编写ChatGPT插件,包含下面的信息
描述:
一个ChatGPT插件,允许用户使用TODO列表,并可以管理该列表。如果你不知道用户的用户名,在向插件进行查询之前请先询问用户。否则,使用用户名“global”。
它只有一个端口,服务器接口在https://gpt.bobyuxinyang.com
路径为/todos
接口描述如下
获取:获得用户TODO列表
发送:增加一条TODO项目,接受一个参数,content参数描述todo的内容,返回todo的id
删除:从列表中删除一条TODO项目,接受一个参数,id参数描述todo的id
另外,后端服务需要以JSON格式返回一些数据,比如下面这些。
{"todos:"["买点东西","遛狗","写写代码"]}
就是这些了!
其实最重要的事仅仅是编写那几段描述,剩下的事情都可以交给AI,然后比如下次当用户提要求”我要往TODO列表增加一个项目,内容是看书“,ChatGPT就会自动调用你的API处理剩下的问题。
我们要的不是AI辅助编程,我们要的是“自然语言原生编程”,就好像过去几年流行的云原生概念与云计算的区别一样。
从程序员的视角,你只需要写下完成任务的思路,剩下就不用做了。什么高级语言,都能自动生成,什么 GUI,不需要的!我们只需要关注需求,一切都关于数据!我们真的需要 GUI 吗?我们真的需要高级语言吗?
(当然还是需要的,我们现在还需要用他们来创造AI)
不多说了,不理解的地方去问 ChatGPT就好。
给我们的启示
在现实世界里,会耍 Excel,会写 Python,会用什么 SPSS 之类的复杂专业软件工具一直是所谓专业人士的必备技能。现在我们突然发现,过去这些所谓的专业人士,本质上都是在做信息中介的工作。
未来人们 最重要的事情是会聊天,通过聊天就可以解决实际问题,改变世界。另外,第二重要的事情,是 拥有第一手数据。之所以是第二重要,是因为第一手数据也可以通过聊天得来^_^。
最近经常有人问,是不是AI来了我们以后都不要编程了。必然不是,而是现在编程的门槛变得更低了,千万不要把写代码这件事和编程划等号,当聊天也可以是编程的时候,你就必须思考怎么才能“好好聊天”。你需要学习逻辑、数据结构、架构设计等等一系列知识,才可以应付未来的聊天场景,不然就会变得毫无竞争力,这是另外一个话题了。
当我们拥有了导航软件,大部分人受益其中,但自身辨认方向的能力可能也有所退化。不过,这并非意味着辨认方向的能力不再重要,反而对于专业人士,它变得更加重要。
编程工作不会消失,程序员不会被替代,而且编程效率的提升会使需求成百上千倍的激发出来,市场空间无限巨大,产业互联网的故事就要实现了。
2023.3