闵亮
(西安交通大学 城市学院, 西安 710018)
过去数十年中,尽管在软件开发的心理学、神经系统科学以及社会学方面,编程环境取得了不少进展,但始终未能解决程序员的问题。在代码中导航的时候,开发者们仍然会有迷失方向的体会[1],而且开发者在理解代码的时候仍然会出现问题[2]。这些基本问题也阻碍了其他比较重要的软件工程活动。举个例子,在代码审查时,因为审查时没有足够的能力去导航并理解代码,开发者大多会汇总问题上报,比如违反约定等,而不是去讨论设计缺陷或者瑕疵。
对于开发者所体验的几个问题之下所隐藏的认知问题,研究员们进行了探究. 其中一个问题就是空间记忆—这是一种海马旁回中的记忆系统,能支持保留空间认知的能力。有些人观察到,在其所依赖的线索- 诸如滚动条以及文档标签[3],被当作其导航的一个结果而被扰乱,开发者会遗失相关代码的轨迹。通常所参与的人本能的空间记忆处理工作失败,会导致类似的方向迷失。
启示是促使本能认知机制改变的设施。研究者们曾经试图采纳人类的关注、认知和记忆才能来改进界面。例如,一次学习减少了网络书签的存储和检索时间,也通过定位在一个3D空间的各种堆积的页面的屏幕截图,来减少检索失败次数[4]。
类似的是,研究者们曾经为编程环境中的空间记忆融入了启示。编码画布将代码文件定位在一个较大的可滚动、可缩放的平面上,在这里能够保存较稳定的代码空间位置。代码气泡允许一个开发者在一个可无限滚动的屏幕上定位相关的代码片段,这也改善了片段的导航及内涵。
空间记忆就是这么一种促使编程环境进行改善的启示,其它有很多的启示都可以被改变。虚拟现实(VR)比现有的开发者环境能更充分地利用这些启示,来使新创意机会成为可能,并且潜在地提高生产率,降低学习曲线并增加用户满意度。
本文描述了虚拟现实如何在空间认知、操作和运动以及编程环境中尚未得以充分利用的反馈中,提供启示。而后我们描述了我们所造出来的两种虚拟现实系统的原型,以及虚拟现实如何能应用于软件工程中。最后,我们对未来的工作、开放性的问题研究、以及在软件工程中用现有技术使用VR的挑战,提供了一些简要的讨论。
虚拟现实在空间认知、操控及运动还有反馈中提供启示。
1) 空间认知:空间记忆是靠位置细胞、专门的神经元来支撑的—像人一样,通过对一个物理空间以及环境中其他的上下文线索的导航,进行开火。头盔式虚拟现实显示器允许用户通过移动身体或者扭动脖子来更新视野,在此过程中向位置细胞开火。此外,这些显示器对每个眼睛都经行了轻度的不同形象的渲染(立体渲染),它能够使人的眼睛更容易去感知显示器上的形象纵深。这些显示器能够创造出一种存在感,或者“它在那里”的感觉。我们期望用户的空间记忆能够比平面显示更多地参与到虚拟现实中,特别是在观看可视化3D的时候。
虚拟现实能够直接模拟由物理导航所提供的启示。基于记录在大脑皮层表面的脑皮层电图学(eCoG),位置细胞能被观察到,在一个虚拟镇子中导航并且随后他们再次回忆穿过镇子的路径时,在同一序列中像人一样开火。
2) 操控及运动:由一个物理对象的操控所产生的启示,能够导致知觉和记忆力的改善。 例如,由一本书翻页产生的启示,在面对电脑显示器阅读相同的文本段落时,会导致理解和回忆的增加。此外,对无意浏览以及重新定位资料的能力也有所提高。通过诸如步行这样的努力,一个物理空间中的运动会有重要的认知因果关系。 其他的启示能由运动加以辅助。例如,通过空间中的自行移动可以加强感知深度。
研究者们曾经对将现有的编程环境与自然交互集成起来进行过探究。通过输入设备—如跳跃运动—是有可能跟虚拟目标进行物理互动的。物理运动在虚拟空间中也是可行的。 身体护具允许在一个虚拟空间中的自由运动,诸如步行、跑步、跳跃以及屈膝蹲伏。
3) 反馈:当评估系统的状态比较困难时,Norman所描述的湾区估值就出现了。虚拟现实会允许软件工程师呆在一个环境中- 这个环境通过剔除在程序员行动及看见其行动结果之间的时延,来试图清除这一湾区。这种快速反馈之前已经在二维的显示中实施过,但虚拟现实将这一能力扩展到了三维的显示环境中。
我们为现场编码以及代码审查建立起了虚拟现实原型- 它们具体地显示出了使用虚拟现实的启示的益处。我们证明了这一节中所述的益处,同样也能扩展到其他软件工程活动之中。
所有的系统都采用了头盔式的显示装置(Oculus Rift - Development Kit 2)以及一个用于姿态认知的跳跃运动控制器[5]。
RiftSketch是一种为虚拟现实所建立起来的现场编码环境,它能允许用户用Three.js library函数库来描述一个3D场景[6]。
RiftSketch给了用户一个简单的文本编辑器(参见图2),在另外的一个虚拟现实世界中,漂浮在他们眼前。当用户键入编码到编辑器中,环绕在他们周围的世界会立即更新,显示出由其代码所标明的3D场景。 RiftSketch也能令用户通过每一帧中执行过的回调函数来模拟其场景。用户能够在这一代码环路块中操控3D场景的状态,以便在其场景中为对象增加行为动作。这种模拟通过一种方式,令用户得以真实地感觉如同在场景中,而不是通过一个2D屏幕截图所捕获的场景。
为了有助于键盘的互动,我们允许通过使用固定在虚拟眼镜上的一个网络相机以及系统中所反映出来的对象,使现实部分得以发光,如图1所示。
图1 RiftSketch屏幕截图
那棵树是用户已经键入到漂浮的编辑器中的递归算法所生成的。飞翔的虚拟小鸟代表着从Twitter的应用程序接口拖拽过来的twitter信息,它们也是由客户所键入的代码所生成的1) 反馈:RiftSketch在所写代码及其在虚拟环境中的效果之间,提供了一个紧密的反馈回路,使得用各种解决方案、算法以及计算的实验得以快速进行。RiftSketch也是一种颇有前景的学习工具,因为用户可以立即看到其编程错误,并无需一个中间的编译步骤就可自行修改- 而这一编译步骤可能看上去像是另一种阻碍。当代码描述了一个VR场景时,这些益处在RiftSketch中都特别明显。因作者之前已经有过体验,看着完全虚拟的世界在自己输入编码时在周围变化,真的是一种绝对强有力的迷人体验。
2) 手势操控代码:另外,RiftSketch为用户提供了快捷方式以及输入方法,在其写代码时迅速编辑代码中的数字。 键盘快捷方式允许用户以01,10或者100的因子来增减代码中的数字。集成了跳跃运动控制器,能够为用户提供一种能力,通过采用上下的手部动作来操控数字。这使得用户能持续用自己的手来修正一个数字,并且立即看到它是如何影响到场景的,使得它比一次键入一个数字的手动方式能更快地进行反馈。
3) 用法举例: 考虑到如下的情景:空间任务A刚刚对彗星表面进行了探测。10年的飞行之后,探测器尽管落地不易,还是降落在了一处不能接收太阳光的位置上。自动遥感探测程序是不能找到一条可行的飞行路径的。作为一个程序员,您被赋予了任务来升级着陆器的软件,来将其自身定位在一个坚实的地表上,而在其电池耗尽以及探测器偏离彗星表面之前,你还剩下24小时。还好有伴随卫星搜集到了着陆点周围的表面详细信息,还有遥感探测数据,准确地显示出着陆器将被怎样定位以及定位在哪里。
您用数据更新了模拟程序,并且用RiftSketch来调查这一情况。在评估的着陆器的选项后,您重复了可能的解决方案,首先用手势来操控一个可能的路径以及推力设置,并且用键盘来定义代码。随着每一个解决方案,你都在RiftSketch中观察着陆器的动作。你绕着着陆器走,来检查每一次机动演习后它的位置,并进一步确认其降落足是紧紧建立在风化层上的,并且缩小比例,从轨道角度来核实其新的位置能否在这个一侧高凸的彗星上,对轨道飞行器维持一个视野。
最后,在RiftSketch进行数十遍的模拟后,您将程序上报审核。
IMMERSION展现出了如同代码片段类似于代码气泡的方法,并且,像BumpTop一样堆积在地板上,显示出片段的群体来。这些堆积能够扩展成为一个更具细节的环形来回顾以及做细节的可视化处理[7]。
1) 空间推理:审查者开始是在屏幕中央来观看激活的片段的(参见图3),而其他有关的片段都成堆地分布在地板上。审查者采用空间辨识,通过堆积有多远以及堆积的尺寸等,来判断堆积物的相关性。审查者能够扫描堆积物的标签,以及每一处堆积中的片段数量,来快速辨别每一处堆积是否是真正相关的。
IMMERSION根据系统的包装以及颜色代码,将地板分区—分区是用来显示有多少包装在审查的时候已经被代码改过了。在包装中穿梭时,我们期望审查者因空间推理的更多使用而能拥有更好的构思模型,而后能理在审查过程中更好地理解代码。类似的情况是,我们期望空间推理的增加,能使审查者在审查之后,更容易地调出审查细节来。这会使审查者将来在审查同等的编码库的时候,能提供更多有用的反馈。
2) 手势交互:审查者可以做一个抓取动作来选择一个堆积包,而后可以将手上拉,把堆积变幻成一个环形片段,来进行更详细的检查。审查者如今可以读取环形中最为重要的片段,而且可以水平抹动指尖来让环形旋转,读取更多其他片段。审查者可以将最为重要的头尾部的环形片段提出来放在屏幕中央,使之成为激活的片段。如果审查者希望回到之前的方式,他们可以像清理桌面一样动动手就完成了。
开始我们注重的,是可以通过键盘输入,来增加对探索—评论的支持,但我们发现了另外的方式来标志并用旗子标示代码。
3) 用法举例:考虑之前的彗星情景,程序员为着陆器执行了已重新定位的飞行路径。
某个审查者带上虚拟现实眼镜并且进入IMMERSION,确保这一解决方法能够有效运行。它注意到一个边界案例,它可能会引发一次碰撞,并建议轻轻地将轨道伴随卫星碰向探测器中,来避免更大的冲撞。原来的程序员在RIFTSKETCH中执行了此建议,确保这一刺激动作生效,并在向审查者递交修正结果时庆祝一番。然而审查者发现一部分的代码在IMMERSION中点亮了。当她走向这一部分时,她发现这是碰撞检测部分对系统发出的警告-系统是不允许这一代吗在模拟器之外执行的。她意识到,通过在撞击摧毁系统之前关闭引擎,她可以允许这一代码的执行。他们上传代码并且着陆器按照期望的那样自行重新定位,如图2所示。
图2 IMMERSION的屏幕截图
审查者在审核代码,来重新定位着陆器在彗星的降落位置。审查者看到激活的方法,以及地板上成堆的相关片段,并且已经将一堆片段扩展成为左侧的片段环形,来读取这些片段的细节。在上左侧,显示了一个彗星模型以及着陆器所期望的飞行路径。审查者能在地板上的代码包之间逡巡,这些个代码包根据此次审查所修改的数量,都标注颜色代码。GitHub的细节在上右方有显示。
虚拟现实(VR)为软件工程师打开了一扇门,可以创造出提升效率并使之前不可能体验成为可能的各种系统。现有的应用,包括美国航空航天局NASA- 他们正在用VR控制一个机械臂,结果是效率的显著。 教育体验项目Titans of Space[8]允许学生们用一种方式体验我们的太阳系,这种方式使他们感觉到自己真正就挨在太阳身边。
未来的研究,需要在如何为创造这些VR系统的软件工程师们,创造出更多的工具来上进行。有什么问题是VR软件工程师们需要面对,可缺乏工具加以解决的?
多个分布在世界各地的程序员,能够在一个VR现场变成空间中加入彼此,来解决如何从引发案例中解决彗星着陆问题。他们应该能提供额外的洞见,并且能更快地找到解决办法。
而后另外会有一组程序员,在一个VR程序审查环境中加入彼此,他们能够看到每个人在系统中他们自己那部分里,对那些堆积的信息所做的注释的基础上,都在思考什么。
(对虚拟现实的)投入程度。拓展现实的装置,如谷歌眼镜,其目标是帮助用户在实体物理世界中,通过增加信息覆盖来完成任务。拓展现实类产品在寻求在物理现实世界中帮助用户,而与此同时虚拟现实则谋求对物理现实世界的完全提单。是将用户沉浸在一个完全虚拟环境中有用呢,还是强化其物理现实世界更有用?
输入形式。游戏机台控制器对于导航以及有限动作支持都能运转良好,但在键盘的文本输入上没法相提并论。但是,这些个设备都要求用户同时在物理现实和虚拟世界中进行交互。手势识别用物理现实世界来取消交互作用,但会导致身体劳损。声音识别能够减少这种劳损但可能在互相分享的工作空间中引来尴尬。什么才是用户向虚拟现实VR系统提供输入的最好方式? 这是值得我们深思研究的问题。
1)从物理现实中脱离:戴上VR耳机意味着与物理现实世界的其余部分隔离,包括协作者。同伴们可能缺乏机会提问,并且现实的交流被抑制了。此外,VR耳机佩戴者们可能在处于VR环境中时,与物理现实世界的交流出现问题。耳机上固定的网络摄像头,可以与物理现实世界保持一些互动,但是视野却受到了限制,如图3所示。
2) 3D 映射:有些问题没有内在的3D表述,这种表述使VR的显示成为一种挑战。如同在IMMERSION所见,2D代码能在虚拟现实VR中显示出来,可代码本身并没有第三个维度,因而丢失了3D的表达性。这或应成为有些人所建议的,能很好地适合于3D隐喻编程的一个区域。
3) 技术限制:Oculus Rift Development Kit 2的1080p的分辨率,使文本阅读的通过率还算良好,但它需要为多时段会议进行提升。每个用户也都需要略有不同的配置, 这些个配置可以要求适度的建立时间。
二维的开发环境仍然没法充分利用好这些启示,诸如空间识别、操控以及反馈等等。本文描述了一种愿景,即软件工程师如何能通过使用新类型的工具而利用好VR — 这些个工具能够很好地利用这些启示。
描述了现场编码以及代码审查都是如何从VR工具中受益的,但可以预想到其他的软件工程活动也可以一样从VR中受益。