造枪的活儿,交给机器。
那这东西在生活里能干嘛?
答案是,几乎所有动作不难,却要重复亿万次的地方,背后都藏着这样一条可以被改造的流水线。
你滑手机相册,几千张照片唰一下按时间排好,是排序。
你网购时商品按价格从低到高一列,是排序。
地图给你算最近的路,外卖给你派最近的骑手,游戏里每一帧成百上千个物体重新排先后……
这些你天天在用,却从不留意的瞬间,底层全是同一批被重复了千万上亿次的小动作。
平时没人在乎它们快一点还是慢一点,因为单看一次,都是眨眼的事。
可一旦放到重复上亿次的尺度上,这眨眼的差距,就会变成实打实的电费、服务器和等待时间。
江临要做的机器,就是钻进这些没人留意的角落,把那些还能更快的小动作,一个个揪出来,定做,替换,提速。
而且它不挑活儿。
今天能给五个数排序,明天就能优化别的小动作。
这个项目用得上,下个项目照样用得上。
一念及此,江临越来越兴奋。
因为排序,只是个敲门砖。
真正让他头皮发麻的,是这道门缝背后那个更大的东西。
如果连找最优程序这件事本身,都能交给机器去做呢?
那么在废土世界里,他就不必再为每一个设备,每一种控制顺序,每一套观测流程,都亲手去写最好的方案。
他一个人,精力有限。
但如果有一天,机器能替他搜出一部分小程序,小流程,小动作。
那么它就不再只是一个排序工具,而是一个单人科研系统的增幅器。
过去,人写程序,是亲手给出每一步。
第一步比这两个数,第二步比那两个,第三步交换……
一步步把答案铺出来。
这要求写的人脑子里先有答案,再把答案翻译成代码。
江临现在想做的,是反过来。
他不再亲手给答案,只告诉机器三件事。
什么是起点——一堆乱掉的数。
允许做什么动作——挑两个位置,比一下,错了就换。
什么算赢——所有可能的乱序,最后都被捋顺。
然后,让机器自己去试。
说白了,就是把排序这件事,变成了一个游戏。
乱掉的数,是棋盘。
每一次比一下,该换就换,是落子。
把所有乱序都捋顺,是通关。
机器要做的,就是自己去玩这个游戏,一步步试,直到找出一套能通关的走法。
这个想法有个让人头皮发麻的地方。
人,从此不必知道答案了。
人只负责定义这个游戏。
画好棋盘,定好规则,标好胜利的样子。
至于具体怎么走,走哪条路最快,交给机器去穷举,去试错。
江临新建了一个文档,敲下三行注释,作为这个游戏的全部规则。
有一堆乱掉的数。
每一步,挑两个位置比一下,错了就换。
直到所有数都被捋顺。
很短。
短到不象一个程序的开始。
但他盯着这三行看了将近一分钟。
因为这三行的意思,已经不再是手写排序,而是让机器自己搜索排序程序。
第一个要解决的问题是,机器怎么知道自己试对了?
这恰恰是这条路最干净的地方。
五个数,所有可能的乱序,一共只有一百二十种。
一百二十种,小到可以一种不漏地全列出来。
所以机器根本不需要猜某套走法对不对。
它可以把这一百二十种乱序全部丢进去,让那套走法挨个跑一遍,只要有一种没被捋顺,这套走法就当场判死,扔掉。
这是数学意义上的干净。
不是我觉得它应该对,而是我把所有可能都试过了,它就是对的。
人靠直觉,会漏,会错。
机器靠穷举,一种都不会放过。
凌晨,第一版找程序的程序跑了起来。
它很笨,几乎不会偷懒,只是从所有该比哪两个的选择里,一层一层往下试。
每走一步,就回头看看那一百二十种乱序,还剩多少没被捋顺。
哪条路让混乱减少得最多,就顺着那条往下走。
江临给它定了个朴素的评判标准。