语言控制力问题
编程语言提供欲望和实现之间的转换能力,软件工程师的劳动是利用编程语言的这种转换 能力建立一个转换的实例。
最近讨论芯片的发展趋势的问题的时候,有人提出了这样一个模型:他认为计算芯片未来 的分类可以包括这样四种:
逻辑处理为主的:比如通用CPU,这种芯片是程序员驱动的,对程序员的数量有要求, 被软件生态所左右,你芯片内部的算法再好,如果没有软件生态支持你也推不出去。
少逻辑处理为主的:比如GPU,这种芯片写好一个简单的逻辑,重复实施到各个SM或者 PE上,这种生态不需要太多的程序员,一个算法写完了,就开始堆芯片,卖沙子。这种 是软件算法驱动的。
无逻辑处理的:比如TPU/NPU,这个几乎不受程序员群体的控制,甚至算法本身也不是 控制要素,数据才是控制要素。没有数据,你连算法调试都无法完成。
自动知识发现的:这种计算CPU不依赖人教它的算法,而是自己发现知识,自我成长。 这种东西的控制要素是它自己,如果要在它自己之外找一个“原因”,这种处理器的驱动 力是数学家。
这四种处理器的设计很有趣,因为按顺序它恰恰是程序员逐步失去控制力的一个过程。从 这个角度,我们可以讨论一下语言设计上的一些基本策略。
当我们给一个人说:你把那个房间打扫打扫,我们感觉我们是有“直接控制力”的,因为我 们几乎可以比较精准地控制他会怎么做:拿扫把,在房间里用广度有限或者深度有限进行 遍历,然后把垃圾扫在一起,然后扫进簸箕,倒掉。
这时我们认为我们对这个事情有完全的控制力。(当然,如果那个人居然拿个风扇把房子 里吹得尘土飞扬,垃圾都飞到床底下,然后说房子打扫干净了,你就不一定觉得你有控制 力了。所以这是个有依赖的事情,我们只是说大部分的情况)
但如果这时你是给卫生局长说“你把县城打扫打扫,准备迎接爱国卫生城市评比”,这其实 你就没有控制力了,因为你其实不知道卫生局长(包括他下面的人)怎么搞定这件事情的 。你提出的是你的“需求”,而不是“控制”这件事情如何发生。
这个问题不能细究,因为“需求”和“控制”是没有清晰的界限的,但我们仍有直接的感觉, 知道什么时候我们是可以控制的,什么时候是不能控制的。这背后的区别,在于我们是不 是想要控制它,你想要控制的东西不能控制,你就觉得你对某个东西失去控制了。
你在C语言中定义一个全局变量int a,你知道它有多大,预期这个变量一定会出现在BSS段 里面,你甚至会写ldscript,控制这个变量具体被放在那个地址上,然后你把他们都初始 化成0xff,这个地方你就有控制力。
但在Java里面这个就不好使了,因为Java并不承诺你定义一个变量(关键是Java也没有全 局变量这个概念)就一定放在哪里,甚至也不承诺你这个变量占多少地方。如果你要控制 这个东西,你就会觉得这东西缺乏控制力。
很多时候我们写操作系统喜欢用C写,不愿意用高级语言写,就是这么个控制力的问题。我 要写下的语句,我都能控制它的汇编大概是怎么样的,流水线会如何平衡,内存会怎么利 用,我就不会希望语言把我们这种控制力取消了。
所以我个人也是不喜欢C++的(虽然有时写用户Daemon的时候我也会用),因为C++总想平 衡控制力的广度和深度的关系,但这两者本来就是矛盾的。如果我不关心性能,只关系计 算,我宁愿用Java或者Python,我反而更加聚焦。C++的最大好处可能是足够复杂,可以用 来低成本发明一种新语言。
所以,一般来说,我们感觉控制力越强,控制广度就越弱。控制力的分配其实是逻辑的分 工:我给一个要求,定义了部分的逻辑,剩下的逻辑我就不做了,自由度留给你。你根据 这个要求,也做出了部分的逻辑,剩下的逻辑不做了,自由度留给他……如此类推,构成了 整件事情的完整逻辑链。
架构设计,是做了部分不太容易自相矛盾的逻辑,保证下一级在这个逻辑下也能做出他的 逻辑,同时保证整个逻辑链高效。
要做架构设计,指望控制得很细是不可能的,控制得细和控制得多(也就是控制力的深度 和广度)是个两难的问题。所以架构设计的关键在于,你是否控制了那个潜在的“整个逻辑 链”最关键的部分。架构设计要“准”,而不是要“细”和“精确”,这里分层的核心在于“整体 高效”,达到整体高效的方法是逻辑链是否简单,我们能否把密的逻辑汇聚在一起,让每个 “智慧个体”都有一个相对简单的概念空间。
这个观点我们以前也推理过了,不是本文想讨论的问题。本文想讨论的问题是:AI发展起 来,程序员是不是会失业?未来的编程语言会向什么方向走?
从控制力这个角度来说:是的,分层越低的工程师(比如做操作系统的)越会失业,因为 这个模型的发展方向是“堆沙子”,沙子多了,人脑就懒得控制那么多的“具体情况”了。人 脑会向控制的上层走,下层会交给AI。就好像,今天,我们要判断一个图是不是一只猫, 我们其实根本不知道判断逻辑是什么,我们是交给一个算法,让它告诉我们这是啥。这背 后当然需要工程师,但这个能养几个工程师?这要的是训练集,跟软件本身逻辑的进步已 经无关了。
我们当然还是会针对每个应用做出一些具体的设计,但这个养不了那么多工程师。芯片设 计的同事们也不用笑得花枝乱颤的,因为在这个理论中,数字电路设计其实也是写程序, 需要的人才也会越来越少的,要不成为精英,要不就没你什么事了。
所以我是不相信什么未来是程序员的世纪,什么不会编程就会变成新时代的文盲的。未来 你不能称为架构师或者科学家,仅仅当个程序员,你就等着失业吧:)
当然,这个是不是人类的末日呢?是不是机器统治人类呢?这完全看你怎么看。我觉得人 类的发展和进步,就来自人机混合。今天你觉得你的能力比古人强,到底是你变成了巨人 ,力量增长百倍,肋生双翼,翱翔九天之外呢?还是你用上了汽车,坐上了飞机呢?你被 汽车飞机奴役了吗?
换过来,未来如果你未来,说“我要去北京,纽约,东京玩一下,主要是吃吃当地的美食” ,计算机帮你安排好行程,定好了机票和酒店,让你过目。这到底是你的头脑力量增强还 是你被计算机奴役了呢?
要说被奴役,你现在早就被奴役了:你现在长大至少打十几种疫苗,否则你分分钟活不下 去,你这人工合成的怪物,你失去了大自然的纯洁性了,你惭愧不?