引用表达与智能编程

我在知乎上常点赞一些回答或文章,有些是时间线上的推送内容(关注/推荐),有些是我自己搜索的感兴趣的内容。作为一个重度用户,可能没有什么方式能比查看我的timeline更好地了解我。我几乎从来不在知乎上回答问题————几乎所有我想表达的东西都已经有人表达过了。即使有所出入,也能通过赞同多个回答进行triangulation与修正。比起亲自写回答,这样做的效率高得多,而人总是趋向于选择能量最低的状态。成本(时间复杂度)是影响选择的重要因素。

这种情况并不少见。成语背后的典故,古诗词中的用典,论文中的引用文献,牛顿的站在巨人肩膀上。。。提高信息熵与表达效率的重要方式之一在于对外部知识的依赖。理想情况下这个知识应该落在表达者与受众的共同知识(common knowledge)中。如果不然,则需要进行额外的解释,互联网中的超链接与各种编程语言中的函数库(library)都是很好的例子。但是天下没有免费的午餐,主体信息的压缩通常意味着被引用信息总量的膨胀,我通过点赞十个回答来表达我的合成观点,被引用的回答长度之和势必大大超过如果我亲自写一个回答的长度,重复和无关的信息都构成了这一浪费。被引用信息总量的膨胀也势必让人工提取我的观点这件事变得更加困难,所谓点赞一时爽。。。但是为什么不让机器来做这件事呢?在协同过滤(collaborative filtering)的基础上拓展,从现有的赞同记录预测我会赞同什么样的回答并非难事(各大互联网公司的推荐系统应该已经做到这一点了)。如果能将将点赞记录转换为性格与三观的内部表达,用来预测点别的想必也是可行的,比如我对于一些抽象概念的个人理解与定义。

在编程这个问题上,从机器码,汇编语言,编译语言到脚本语言,都不过是人操作计算机的一种方式。从这个角度看,编程语言是历史最悠久的,几乎从计算机诞生起就已经存在的HCI课题。编程语言很大程度上是面向人的工程,正如SICP中的那句名言,

Programs are meant to be read by humans and only incidentally for computers to execute.

在鼠标和图形用户界面出现之前,编程和人机交互的关系是模糊的,操作电脑就是在terminal中输入命令,那写shell script算不算编程?如果算的话,逐行输入就不算吗?在这个人机交互与键盘输入指令渐行渐远的时代,我们不应忘记用鼠标双击文件夹和terminal中的cd指令本质上做的是同一件事。虽然当下为计算机开发程序的主要方式依然是键盘敲代码,但这不意味者不存在更好的,更面向人类的方式。我们能将高级语言写的文本转换成机器语言,就没有理由不能支持更高级,更自然的表达方式。我认为DynamicLand和Bret Victor在此项目之外做的一系列勇敢的尝试都提供了一个好的起点。

我愿意看到这样一个未来:计算机能理解人类用自然语言(或是脑电波)表达的意图,通过对这个人的理解(由历史记录生成profile)解决ambiguity问题。如果问题不精确,则程序行为与答案也不必精确,控制在一定范围内即可。传统的观点认为程序应当是良定义的,有确定行为与结果的。但若要让计算机成为人脑的延伸,成为未来人有如身体器官一般的存在,我们需要重新想象编程,重新想象人机交互的模式。