2.1 理解概念
我曾经参与一个物联网系统的设计,这其中大家经常会提到一个词"设备",但是"设备" 这个词在不同的开发者眼里有不同的概念,为此,讨论 "设备" 这个词花费了不少的功夫,最终依然没有定义清楚。
有些开发者认为"设备"是现实中看得见摸得着的物品,另外的开发者将服务器上用于映射物理设备的实例也叫做"设备"。于是,他们在沟通时经常会出现对于"设备"的理解不一致导致的混乱。
另外一个例子是"用户"这个概念。在不同的场景(上下文)下,"用户"这个概念可以是使用软件的大活人,也可以是数据库中的一条记录,也可以是服务中的用户对象,有时候也将用户服务类叫做用户。
这样就非常混乱,不仅无法沟通,而且还导致开发者对系统的认知也变得困难,很多东西处于混沌状态。
在咨询的工作中,我发现非常有意思的是,将软件中的概念一一定义清楚,整个系统的设计工作差不多就完成了。所以设计软件的过程和现实中人们相互交流非常类似。英国哲学家维特根斯坦把人们交流的过程叫做"语言的游戏",当我们描述事物的时候实际上就是将有清晰边界的元素贴上标签,这个标签就是我们说的概念。
朴素的概念是来源于个人背景和理解,因此概念难以统一。正是于此不同语言之间准确的翻译也不太可能,不同文化背景难以找到合适的概念互相映射。后来哲学家认识到人们认识的概念是由一些更为基础的属性构成的,那可以认为概念就是由属性组成的。比如 "人" 这个概念,有四肢、可直立行走、皮肤光滑等属性。
这些基本的属性又是一些更基本的概念,如果我们对这些基本的概念达成共识,那么我们就有机会对概念进行统一。类似于面向对象语言中的类,类有各种属性,这些属性最终都可以通过 8 种基本的数据结构描述。
因此属性是认识概念非常重要的一方面。属性包含了事物自身的性质、行为,比如黑白、高矮、是否能飞行、是否独立行走。事物除了自身的性质外,还与其他事物发生一定的关系,比如大于、相等、对称、属于等。事物的性质、行为以及和其他事物的关系,统称为事物的属性。
通过属性就能找到概念的边界。具有相同属性的概念是同一个概念,即使是叫法不同也不应该分为不同的概念。比如土豆、马铃薯,一旦属性的增加和移除都算作不同的概念,比如小土豆是土豆吗?通过属性就能发现生活中的命名谬误,比如小熊猫并不是小的熊猫,而是单独的一种动物。