3.319. 设计的本质
本文记录一个最近的一个观察。我发现,设计本质是在发明“名”,或者说发明一个比较严格的名。
名是归纳,是在乱相中找到规律。但实际上很多东西没有规律,或者说规律性不明显,而设计是填补这些规律。
比如说“内存管理”,是一种规律,它有一个隐隐约约的对规律的认识和对这个规律的期望在其中:我知道有一片内存,肯定可以从里面拿一部分出来,晚点可以还回去,等下次要用的时候可以再拿。这个规律是隐隐约约的,但里面具体怎么做到的,这个“信息”不存在。
那么设计就是要为这个分配填补无规律的细节。比如,分配要求太多了就返回失败,产生碎片了进行位置调整,……等等。最后这个“内存管理模块”——虽然包含很多细节——但就可以用这个名字去代替了。我们都不用管黑盒里面具体是怎么做的,我们只管找它要,给它还,细节都包装在里面了。这个“内存管理模块”就是一个相对“严格的名”。
所以我们说函数需要是个高扇入低扇出的设计,因为函数的扇出是它内部的细节黑盒,而扇出是它被使用的名和规律特征。如果扇出和扇入一样大,这个函数就没有“总结”的效果了。比如你会这样写函数:
int put_data(struct DATA *data) {
if (--data->ref_count <= 0) {
free(data);
}
}
但你不会这样写:
int dec_data_ref_count_if_ngt_0_free(struct DATA *data) {
if (--data->ref_count <= 0) {
free(data);
}
}
因为我们是在制造一个“函数调用代理为data的使用者减少,如何处理资源可以不用管”的规律,里面具体是用引用技术,还是用引用树,内存如何分配,都不是我们要制造的规律。我们人脑其实只能在“名”上思考,我们是从一个“名”,代理为另一个“名”。为了做到这一点,我们打开这个名,找出一组“小名”,然后填补约束,让另一个名也呈现规律。设计的本质,就是这个打开小名然后构造另一个规律的过程。
理解这一点有什么用呢?我也不知道。我先记下来,看看未来在解决其他一些问题的时候,能否更好解释那些问题。