创建面向对象的编程范式部分是为了处理软件系统日益增加的复杂性。这个想法是利用人类思维的自然能力,从对象和类的角度来思考世界,从而利用我们的直觉能力来构建正式的软件系统。事实上,人们普遍认为对象和类的直观和形式化系统是相似的,流畅地使用前者有助于有效地处理后者。然而,最近的研究表明面向对象的编程是相当难学习和实践的[1,3.,7].在本文中,我们在参加面向对象设计(OOD)研讨会的专家的背景下记录了几个这样的困难。我们使用认知心理学的最新研究来追溯这些困难的根源,即直觉思维模式和分析思维模式之间的冲突。
认知心理学的最新研究表明,人们总是在简单的日常任务中犯错,即使犯错的对象是知识渊博、聪明的人,而这些人无疑拥有正确完成这些任务所需的知识和技能。这些错误的根源往往被证明是直觉思维不可抑制的影响。本研究,启发式和偏见程序在过去的30年里,由卡尼曼和特维斯基等人进行了研究,并使卡尼曼获得了2002年的诺贝尔经济学奖。1在诺贝尔奖演讲中,卡纳曼以以下故事开场:
一个棒球棒和一个球加起来只要1美元10美分。球棒比球贵一美元。这个球多少钱?
几乎所有人一开始都倾向于回答“10美分”,因为1.10美元很自然地可以分为1美元和10美分,而10美分大概是合适的大小。事实上,许多聪明人都屈服于这种直接的冲动:50%(47/93)的普林斯顿学生和56%(164/293)的密歇根大学学生给出了错误的答案。2,4].
在日常生活中,人们更喜欢反应而不是仔细的系统推理,而解决数学问题的学生则被期望有意识地训练他们的系统思维,以检查并在必要时推翻他们的直接直觉反应。从这些发现我们可以理解强烈的影响直觉。
我们的思维机制是什么,可以解释这些经验发现?目前认知心理学中一个有影响力的模型是防卫理论[4,10,11].根据这一理论,我们的认知和行为以两种截然不同的模式并行运行,称为系统1 (S1)和系统2 (S2),大致对应于我们的直觉和分析思维的常识概念。
这些模式以不同的方式运作,被大脑不同的部分激活,并且有不同的进化起源(S2进化较晚,事实上,在很大程度上反映了文化进化)。S1过程的特点是快速、自动、毫不费力、无意识和不灵活(难以改变或克服)。相比之下,S2过程是缓慢的、有意识的、费力的和相对灵活的。此外,S2还对S1的快速自动响应进行监视和批评,并在必要时拥有覆盖它们的“权力”。在许多情况下,S1和S2是协同工作的,但在有些情况下(比如在启发式和偏差研究中编造的那些情况),S1会产生快速的自动非规范性反应,而S2可能会也可能不会干预它作为监督者和批评者的角色。
对球棒数据的简要分析可以证明双过程理论在解释经验数据方面的有用性。根据这一理论,我们可以把这种现象看作是一种“认知错觉”,类似于认知心理学中著名的视错觉。问题的表面特征使S1立即跳到10美分的答案,因为1美元和10美分是显著的数字,而且数量级大致合适。大约50%回答10美分的学生不加批判地接受S1的回答。对于剩下的部分,S1也会立即跳过这个答案,但在下一个阶段,S2会进行严格的干扰,并做出必要的调整,以给出正确的答案(5美分)。
最近,在高等数学思维中也发现了类似的现象,大学生在学习抽象代数[6].尽管人们在日常生活中更喜欢(尽管是无意识的)容易想到的快速近似反应,而不是仔细的系统的受规则约束的推理,这似乎是很自然的,但在大学课程中解决数学问题的学生应该被期望有意识地训练他们的方法思维,以检查,并在必要时推翻他们的直接直觉反应。从这些发现中,我们可以理解直觉对我们思维的强烈影响,特别是直觉容易受表面线索的影响。在这篇文章中,我们证明了类似的现象和类似的解释可能也适用于行业专家执行的面向对象开发任务。
术语说明:我们追随卡尼曼和其他认知心理学家,将“直觉”用在日常思维的民间含义上。这一含义在系统1的描述中得到了阐述,主要用于对比分析思维或推理。因此,这篇文章的标题应该被理解为对对象和范畴的日常“自然”含义与它们在OOD中的形式含义之间的差距的本质的探究。应该进一步指出的是,直觉在不同的语境中可能有不同的含义。例如,我们对这个术语的使用与数学家的用法完全不同:“在我能够完成正式的证明之前很久,我就对这个证明有了直观的概念。”
OOD是一个复杂的领域,需要正式的培训和努力的思考,这正是System 2所期望适合的过程。然而,我们的研究表明,在这里,系统1的自动、快速和毫不费力的操作可能会劫持软件开发人员的注意力,并导致他们做出不充分的决定,甚至可能与他们自己的知识发生冲突。
我们讨论了行业中经验丰富的软件开发人员在实践设计活动时展示的这种现象的几个例子,并根据双过程理论解释了它们。我们在面向对象开发领域引用这一理论,试图理解我们在聪明能干的专业人员的反应中观察到的相对基本的错误,即使在他们拥有避免此类错误的必要知识的情况下。
我们的观察是在高级UML研讨会中进行的[8在行业中进行的。在这些研讨会中,参与者被要求分析一些简单的设计任务。参与者要么单独完成这些任务,要么分组完成,然后在整个小组中讨论解决方案。我们的数据包括研讨会参与者的书面解决方案,研究人员观察和记录的他们的小组讨论文档,以及课堂讨论的文本。研究对象包括41名拥有212年OO开发经验的软件开发人员。因为我们的目标是在自然环境及其全部复杂性中描述一个复杂的情况,我们使用了定性研究范式[12,它侧重于案例研究,以获得具体的见解,而不是通过大规模的人群、简化的实验和统计方法来发现普遍规律。(这与人类学家研究陌生文化的方法类似。)在研究过程中,我们记录、录像并分析了许多相关事件和过程。数据分析包括对获得的数据进行编码,并对其进行表征和分类。完整的研究结果和证据将在其他地方描述。在这里,我们提供了一些例子来证明我们的发现。
混淆了继承的方向。提出了一个关于酒店预订系统的设计任务,供参加UML研讨会的一组有经验的工程师讨论。教员建议使用三种课程(电子邮件、传真和电话)来表示输入预订的三种相应模式。于是就出现了使用具体类之间的继承关系来利用共享功能和特性的可能性,例如检查房间的可用性。
例如,类fax可以从类email继承,因为传真对象需要更多的处理(例如扫描和数字化),因此比电子邮件对象具有更多的功能。
鉴于此和类似的观察结果,我们向10名软件开发人员提出了类似的问题,以便更直接地检查这一现象。答案在两种可能的遗传方向上分成了5:5。值得注意的是,就像在球棒和丹的案例中一样,选择了错误方向的参与者只需要轻轻一推(没有信息或解释性内容)就能迅速改变主意。
分析:所有参与研究的人员都有多年的面向对象软件开发经验。为什么聪明和有经验的专业人士在这样一个基本的问题上有困难?我们认为,卡内曼用来解释击球和球现象的相同机制也在这里起作用。具体来说,S1以其快速而轻松的操作“劫持”了思维过程,并产生了一个似乎大致合适的反应,而缓慢而费力的S2则保持休眠状态。这个分析从观察中得到了额外的支持,老师提供的小提示并没有教会参与者任何新的东西,只是用来唤醒S2;必要的知识一直都在那里,但需要二元系统分析来解释为什么它没有被调动起来。
在抽象、形式化和可执行性的要求下,正式的OO范式有时会与产生它的机构发生冲突。
为什么S1和S2会在继承的意义上产生冲突?在人们的日常直觉(S1)中,继承就是转移“东西”(如财产或金钱),而且方向通常是从拥有更多的人转移到拥有更少的人。例如,在一个非正式的民意调查中,我们问学生,在OOD的背景下,医生和救护车上的医护人员之间的关系是什么?一个典型的反应是,“护理人员从医生那里继承,因为医生有更多的资格。”同样,我们预测大多数人会说学生“继承”了教授(因为教授有更多的知识),而不是反之。但在面向对象的形式主义(S2)中,情况正好相反:功能较多的类从功能较少的类继承。
识别物体的困难。OOD中的首要任务之一是根据对象和类“在其连接处雕刻给定的场景”。在其中一个研讨会上,参与者被要求设计一个授权系统,将用户路由如下:
典型的设计应该是这样的数字.下面的讨论是在参与者两人一组完成任务时进行的。
分析:Ron的决定是典型的S1行为,类似于在击球任务中观察到的。在搜索对象时,他受到任务的表面特征(任务描述中术语登录和注册的显著性)的影响,而不是其基本组件(尽管是隐式的)。与棒球运动不同的是,Ron不需要轻轻一碰就能改变主意,这似乎意味着他在这方面的S2知识也不太扎实。
相比之下,莎伦似乎对正确的对象有更坚定的感觉,但这也是S1的知识,从某种意义上说,她无法解释她的选择。她试图说服罗恩的时候会用到诸如“我从未见过对象登录”和“听起来不太好”这样的表达,这表明她依赖于自己丰富的过去经验(S1),而不是基于规则的分析推理(S2)。与本文中给出的其他例子相比,Sharon的例子展示了如何使用直觉实际上可以做出积极的贡献,即使是在正式的问题解决的情况下。
抽象类和具体类的混淆特征。抽象类是具有至少一个虚函数的类。因此,不能直接从抽象类实例化具体对象,而只能通过(具体的)继承类。在这个例子中,Rebecca选择定义一个抽象类car,然后进行下面的讨论。
在随后对丽贝卡的采访中,研究人员进一步调查了此事。
我们注意到,这不是一个孤立的案例。虽然这项研究的参与者似乎在理论上认识到抽象类和具体类之间的区别,但观察到一些情况下,他们提到抽象类时,就好像它们具有具体类的特征一样。甚至在一些书面解决方案中,我们发现定义了抽象类,但随后作为具体类使用的情况。
分析:Rebecca知道具体类和抽象类之间的区别,但这是S2知识。我们对S1如何在这个例子中起作用的解释,是根据自然和有关范畴和对象的形式概念框架之间关系的双重性来解释的。一方面,OOD建立在自然概念的直觉上,但另一方面,自然系统有时会与形式系统发生冲突。我们认为这就是丽贝卡的情况。具体来说,在自然分类系统中[5],抽象类(一个不能实例化具体对象的类)的正式OOD概念没有并行。因此,当丽贝卡的第二课没有防备时,她的第一课就接管了,从抽象课滑向了具体课。像以前一样,轻轻一推就足以唤醒S2,让丽贝卡做出必要的区分。
识别软件开发与编码。编码是一项重要的软件开发活动,但是其他同样重要的活动有助于软件开发,例如需求分析、设计和测试。我们观察到参与者低估了这些其他活动的权重,在一定程度上将软件开发与编码联系起来。2以下是在一次访谈中关于在不同活动上投入的时间的讨论:
分析:安的第一个自动反应,即开发和编码是一样的,是S1反应。S1由最容易理解和最容易想到的内容组成;在这里,我想到了将开发视为编码的观点,大概是因为代码是整个过程的最终和最有形的产品,而其他组件(如设计和需求分析)则不那么明显。面试官的问题唤醒了S2,所以说:“虽然我知道这是不对的。”事实上,她的第二个声明很好地展示了这两个系统之间的实际冲突:S1表达了“编码和开发是同一件事”的观点,但同时,S2反对说“我知道这是不正确的”。
OOD有多直观?从某种意义上说,它确实是直觉的:我们的认知系统肯定会大量使用对象和类别,而这种范式就是建立在这些对象和类别之上的。然而,正如在形式系统的演变中经常发生的那样,这种关系有其反面[9].在抽象、形式化和可执行性的要求下,形式化的OO范式有时会与产生它的直觉发生冲突。因此,虽然对象、类和继承当然具有直观的风格,但它们在OOD中的正式版本在许多重要方面与直观的起源不同。
从当代认知心理学中引入的双过程理论,强调了那些我们的直觉与我们更有纪律的知识和推理发生冲突的情况的潜在机制。或者,用卡纳曼的话来说:4:“高可访问性的功能将影响决策,而低可访问性的功能将被忽略。不幸的是,我们没有理由相信最容易访问的功能也是与一个好的决策最相关的。”
事实上,我们已经看到,在这些一般认知机制的力量下,决定合适的对象、类别和关系有时会受到这些概念的无关的表面线索或日常意义的影响,从而导致不适当的选择。直觉是一个强大的工具,它帮助我们成功地完成大多数日常任务,但有时可能会阻碍更正式的过程。我们希望这篇文章可以有助于更好地理解这个问题,并指出解决这个问题的思路。
1.面向对象开发的夸克。Commun。ACM 492(2006年2月),123128。
2.T.吉洛维奇,格里芬,D.和D.卡尼曼,艾德。启发式与偏见:直觉判断的心理学.剑桥大学出版社,2002年。
3.信息学知识的认知框架:面向对象的案例。ITiCSE 99年会议论文集,(1999年6月),1720。
4.卡内曼(诺贝尔奖演讲)。有限理性地图:直觉判断和选择的视角。在《诺贝尔奖》中,T. Frangsmyr, Ed. (2002), 416-499;www.nobel.se经济学奖得主/ 2002 / kahnemann-lecture.pdf。
5.Lakoff G。女人,火和危险的东西。分类揭示了心智的哪些方面.芝加哥大学,1987年。
6.勒龙、哈赞:理性之争:认知心理学在数学教育中的应用。数学教育研究, 2(2006), 105126。
7.莫里斯,m.g.,斯皮尔,C和霍弗,J.A.过程和面向对象系统分析方法的检验:先前的经验有助于还是阻碍性能?决策科学30, 1(1999年冬),107136。
8.OMG对象管理组。UML符号指南。版本1.3, 1999年。
9.Paz, T.和Leron, U.从对象上的动作到函数和变量的滑路。数学教育研究杂志;http://edu.technion.ac.il/Faculty/uril/papers/Paz_Leron_Actions_vs_Functions.pdf。
10.推理中的个体差异:对理性辩论的影响。行为与脑科学(2000), 645726。
©2008 acm 0001-0782/08/0500 $5.00
允许为个人或课堂使用本作品的全部或部分制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或付费。
数字图书馆是由计算机协会出版的。版权所有©2008 ACM, Inc.
没有发现记录