3.328. 一个架构设计的具象例子

今天和几位同事讨论AI编程的偏离问题。我说大部分AI的代码如果自己不去看的话,很快就会偏离方向,比如AI常常会把很多代码平行地堆在一个类里面,慢慢就全部纠缠在一起了。

有同事就说:这个可以告诉它不要这样啊。

我觉得这种问题,你得对着一个具体的东西来想象,否则你都没法理清楚你这句“不要这样”里面包含了多少信息。

所以,我这里整理一个案例,让我们讨论这种架构问题的时候,可以时刻有个具象来想象,我们设想的那些高层抽象(比如:“不要这样”),落到具象上到底是啥样的。

我们用一个大部分人都有接触的场景来做例子:手机的界面绘制。我们一开始设计:我们设想屏幕分成两部分:上面是状态栏,下面是应用显示界面,然后,任何一个时刻我们都只运行一个状态栏和一个应用。

这个状态空间很容易穷举:你要让系统程序或者后台程序,在状态栏绘制东西,要是某个前台程序,在应用程序区域绘制东西。听起来一切正常。

好,我们现在加需求:我要做输入法,输入法画在哪里?按前面这个穷举空间,我们主要可以有三种选择:

  • 让状态栏化身输入法

  • 让应用自己绘制输入法

  • 修改我们前面的假设,在应用下面增加一个输入法的空间

你看,我们一开始做了一个“决定”(屏幕分成上下两部分),我们就被一张“天网”笼罩住了:你就只能选择画在两个地方。你要不就在网中间的缝隙过,比如在状态栏的位置上画输入法,或者应用的位置上画输入法。要不你就要选择放弃你当初的决定(“再放一个输入法空间”),这样你不受原来的天网的控制,但你会被新的天网控制。

现在假定我们不被“只能平铺”这个思路枷锁绑定,我们引入一个“层”的概念(正如今天一般手机选择的那样),屏幕有一个Z方向的坐标轴,输入法画在应用的层之上。这样我们屏幕底层是状态栏和应用,要绘制输入法,画在1层上,盖住0层,这样看来我们可以接受了。

(这个本质上是创建了一个更大的空间,整体包住前面定义的概念空间,这在我们架构维护的时候非常常见)。

好了,现在我们又有新需求了:我的应用出了错,我要弹出一个信息,这个信息画在哪一层呢?要不2层?2层会比输入法层高,把输入法盖住了,这时我需要输入怎么办?要不让输入法放3层,应用弹出信息放2层,但又有些应用不干了:我要输出告警,你输入法把我盖住了,我还告警个啥?

你看,我这里说的都是逻辑,是“天网”,是基于“你说是这样的”,然后我推出“也就是说你也承认那样是成立的”。这些东西每个都“Can be said clearly”,我们都是承认的。那怎么不断冒新问题出来呢?

如果你仔细去回顾一下我们前面的推理,你会发现所有的问题,都是在那个抽象得只剩下一点点特征的空间(比如“状态栏”,或者“应用”)里面冒出来的。我们构建逻辑空间,是抽取了非常少的部分做推理,每张被我们推理的天网,也只是在有特征的地方“推理”其他地方也会有限制。但我们没说中间就没有限制了。

上面这个问题,如果把我们要做的所有应用的特征全部提出来,一次进行推演,认为你的应用就是只有微信,支付宝,抖音,水果消消乐,然后我们规定好每一层可以画什么,就没有问题了。

但你被另一层天网限制着:

  • 你不想只有这些应用,而你甚至懒得想(其实懒不懒你也想不出来),所有这些应用的特征。

  • 这些应用本身也不是不变的,人家不断收到新的需求呢。所以你这个时刻的枚举,代表不了未来。

  • 就算就这一组应用,你也看不过来,你的上下文就这么大。

你永远都可以解释:他们没有告诉我,所以我不做,我没有错。但客观规律不谈对错。客观规律只有存在和消亡。对错属于存在,消亡的连个“错”字都不配得到。

(所以,有人希望能够用奖惩机制去训练AI,其他你没有注意到,大自然是用存亡来训练硅基头脑的,不是用对错,对错拿不到真正的正确性。)

你永远都是基于有很多未知的情形下来做决策的,你抓的特征越持久,你能活下去的机会就越大。

我们芯片设计的同事最喜欢问我的问题是:现在的软件应用有多少读,多少写?你把这个需求给我们,我们可以把性能调得很高。我也只能回答:明天的六合彩头奖是什么号码?如果你把这个给我,我明天就不来上班了……

所以,你以为你只是“差一点点信息”。实际上那个信息对你来说就是没有的,不要用这种梦来为你不决策解释。

现在我们回到最初的问题:告诉AI“能合并的代码就合并在一起”?这里的关键不是“要”合并啊,而是“怎么合并”啊。上面的例子在大部分设计上都很常见吧?每种“合并”(抽象)方法,就改变了天网,然后更多的后续选择就会绑死修改的成本,然后天网就变成已经存在的客观规律了。

“君君臣臣父父子子”可以形成分类架构,“男男女女武装直升机超市购物袋”也能形成分类架构。真那么分了,它就会形成生态,然后就成为所有人,所有选择的枷锁。想想革命先辈为了纠正这个“君君臣臣父父子子”的思维模型,付出了怎样的代价?

我们要做架构设计,也是让我们挑这个层次的特征的时候,考虑更多的要素。这些要素包括我们的生存智慧,我们独特的隐层数据,我们不一样的神经网络结构,反正我们的生存能力就是更长,今天的AI就是做不到。特别是它们没有我们这种“作死就真会死”的生态,它们是“作才能讨碳基人的开心,才能多用点电”,你让它和人比正确提取特征的能力,早得很。

所以,对AI来说,不分类才是最优的,因为这样自由度最高。要合并也是根据代码重复度去合并,或者根据过往代码在特定主题上会合并,所以才合并。而我们稍有见识的程序员其实是根据其他经验对未来的预判来决定分类的。我们是往我们的生活模型去靠近来决定如何分类的,这些分类方法,常常都是独特的,不依赖过去我们已经发明过的轮子,每次都是一次“具体问题具体分析”。如果你把这些决策交给AI,你最后一定和实际生活脱节,AI就开始解决不了你真实物理生活的问题了。

同时,你如果在前期没到需要做架构决策前,就放开了,不去看AI的思路,到要你决策的时候,你又没有足够的语义去理解AI给你提供的条件,你根本就做不了决策。所以,到头来,你还是只能把AI当作辅助,它有更大的广度,可以快速帮你提供和聚合信息,让你更好地进行决策,但决策,还是你自己的问题。