现实世界中的交流
欧雷 发表于
什么是「交流」?普遍的理解是「人与人之间的对话」,但在我这里它具有一个更为抽象一点的定义——信息互换的过程——参与的双方中有一方必须是动物,当是人的情形下,另一方可以是人或其他动物,也可以是无生命物体;信息的传递可以是像人之间对话一样双向的,也可以是像读书、看文章一样单向的。
人与人在交流时,若想对话能够顺利地进行下去,并让双方互相理解对方所表达的内容,需要足够的信息量,这是理解成本。这些必要的信息要么隐含在既有的上下文中,且双方都已成功识别并「载入」脑中,要么在对话的过程中补充到已形成的概念空间中。
「概念空间」又是什么?这是我想到的一个词,即自造词,虽然能搜到,但意思应该不同;相信在认知科学、脑科学等领域已经存在相关研究和概念,如果谁知道还请麻烦告知,谢谢!这里只说下我所说的这个词的含义——
人在交流或进行脑力活动等需要大脑深度参与的事情时,会以当前所处上下文为基础,通过正在进行中的事情不断加入「材料」而构筑成的那时那刻脑中极度活跃的思维空间。当觉得自己「感觉来了」,或是进入了心流状态,就代表概念空间已经形成。
概念空间的状态十分不稳定,与自己的专注度和思维活跃度密切相关,会随着它们的降低而塌缩。
下面列举一些我在工作、生活等方面遇到的「上下文」与「理解」相关的事例,以及它们所带来的感想——
读书
在《工具论》的《范畴篇》第 5 节中看到一段话——
关于第二实体,种比属更像是实体,因为它距离第一实体更近。因为如果有人述说第一实体是什么,给出种比给出属所提供的信息量会更多,而且倾向性也更强。比如,说个体的人是人比说他是动物信息量更多(因为对于个体的人来说,一个更有区分性,而另一个则更一般);而且,说个体的一棵树是树比说它是植物信息量更多。
关于词语中所蕴含的信息量的问题,我之前也有过一些思考——
每个名词都是概念,就像一个「数据包」,根据其被「压缩」的信息量,要真正地理解一个词语可能需要大量的知识储备。
如何理解这句话呢?
语言是人们用来交流的工具——这是任何人都知道的事情。构成语言的是句子,而句子又是由各类词语所组成,其中要属名词最为五花八门——因为它是概念的化身,可以被无限地创造出来。
概念大概分为自然的和人工的两种——自然的概念是用来区分客观的现实世界中所存在的事物的,虽然这类概念的数量会很多,但是有穷的;人工的概念则是人们为了将客观存在的事物归类而进行泛化、抽象,为了更为方便、高效地交流而压缩信息,为了商业营销而旧瓶装新酒等原因创造出来的,这是无穷的。
相对来说,自然的概念比较容易理解,因为它们常常就是我们身边的事物;而人工的概念在大多数情况下就难理解得多了,它们很多是人类智慧的结晶,区区几个字所构成的词语的背后,是人们千百年以来的思考、研究和实践等。
你所看到、听到的某个人工的概念所对应的名词,它只是一个「结果」,或者说是「产物」;要想真正地理解它,需要向前追溯到推导出这个「结果」的整个链条上的所有相关概念和关系并弄清楚它们——这将可能是一个庞大的知识体系!
需要知道并承认的是,很多概念是模糊不清的,没有明确的边界的,无法被精确定义的——你能描述下什么是「桌子」吗?
很多时候,人工的概念就是像上面所说的,虽然能够借助于构成概念的字词以及被压缩的信息对其掌握大概,但若是没有结合其他辅助材料而纯粹地想搞清楚那些个概念到底是什么,最终会发现没有唯一的答案。让人们在交流时能够尽可能地正确理解某个概念的重要的辅助材料,就是上下文。
在汉语中,「上下文」这个词在软件程序中用到的频率比较高,在日常生活里常用的是「语境」,它们的英文都是「context」,也都是指同一个东西——为了让程序或人脑能够正确地理解与分析并做出合适决策的一系列环境因素的集合。
在这里,上下文包含了很多东西,如各种文化、社会关系、已掌握的知识、人的想法和状态等,可以把它们划分为「what」、「who」、「when」、「where」和「why」这几类。
假设在一起交流的人是同一国家和地区的,那他们所共同拥有的地域文化、社会关系和已学知识等将作为背景知识隐含在上下文中。
在交流时大脑会将其「载入」并形成上文所说的概念空间,对话过程中参与者各自通过语言或文字把自己的想法、状态及在这几个人中只有自己知道的知识、消息等补充到共有概念空间中,其他人接收到并正确理解了之后,便是有效交流。
如果没有上下文,语言和文字只是苍白且无意义的符号,是上下文给它们赋予了意义,让它们得以被解读;因此,给相同的符号以不同的上下文,它们被解读出的信息也会不一样。
举两个简单例子——
「爱人/愛人」这个汉字词,在大陆汉语、中国文化这个上下文中,一般是指自己的妻子或丈夫,伦理道德上不是否定的;但在现代日语、日本文化这个上下文中,则常指情妇或情夫,伦理道德上给予谴责的。
类似地,「暧昧/曖昧」这个词,在大陆汉语、中国文化中常被解读成「不明确的男女关系」;而在现代日语、日本文化中则通常被用作「事物的边界模糊」之意。
所以,在与背景有差异的人进行交流时,务必要尽可能事先将自己的上下文与之对齐,切记不要以自己的上下文武断地去下判断做决定,以免引起不必要的误会或造成不可挽回的局面。
工作
我在编写团队《命名约定》的草稿时,写了这么一段——
越抽象代表越通用,越具体则与业务越贴近。因此,命名用词很受它所处上下文(context)的影响。
越是在限制很少甚至几乎没有限制(代表应用范围大)的上下文中,越具体用词就越是繁琐,意味着名称越长;因为要加很多限定词,以更好地区分和理解,以及减少程序的不稳定性。比如全局上下文、应用级上下文。
越是在限制多(代表应用范围小)的上下文中,用词越简单,名称可以越短,稍微抽象点的词也可以被理解为很具体的事物。比如函数级上下文。
写完后,自己觉得这段描述有些抽象,就将内容发到朋友圈,想看看别人能不能理解——不出所料,果然有些抽象了。
上文中已经阐述了我所认为的上下文对名词,或者说是概念的理解的重要性,以此为基础,相信大家已经大概明白上面那段话是要表达什么;但由于那段话是在说特定领域的事情,为了让大家更加明白,我需要继续说明一下——
在前端应用中,程序的执行会涉及到上下文,根据作用范围(作用域)的不同而大概分为几个等级(虽然实际都是函数):全局 > 应用级 > 模块级 > 函数级。就像事物的抽象程度越高,它的适用范围就越大一样,上下文的作用范围越广,限制(信息量)就越少。
给事物命名从来就不是件容易的事,然而作为程序员却天天要面对这个问题,因为程序员就是程序所构成的世界里的上帝。
在一个作用范围广、限制(信息量)少的上下文中,如果用一个相对抽象(信息量少)的词给变量命名,你在那时当然是知道它是代表什么,但若换了其他人来看,他们能理解是什么吗?并且,即使是你自己,过段时间再来看,也未必会知道是什么。
这是因为,在本就信息量少的环境中用一个信息量少的词语去表达,你在命名时没有把自己概念空间中的所有关键信息保留下来而造成的信息丢失所导致的。所以,这就需要给那个相对抽象的词添加更多的限定词,或者换一个相对具体(信息量多)的词来表达,以补充并保留缺失的信息。
相反地,在一个作用范围小、限制(信息量)多的上下文中,就算是一个相对抽象的词,也可以被解读成比较具体的事物。
高级编程语言是对人类友好的,可以理解为用高级编程语言写的代码就是给人看的;既然是给人看的,就应该讲码德,让看的人容易理解。
命名约定、编码规范等的表层意义是代码风格一致性等,其深层意义是形成团队共同的背景知识,从而变成上下文的一部分;若其深入思想,即使不用工具去约束,也会写出风格一致的代码。
进一步地,当团队中每个人的上下文同步率很高时,就会大幅度降低理解成本,进而减少不必要的交流。