48、终端用户编程:概念、争议与未来方向

终端用户编程:概念、争议与未来方向

在当今数字化的时代,编程已经成为了一项重要的技能。然而,对于大多数非专业程序员来说,编程仍然是一个具有挑战性的领域。终端用户编程,作为一种让非专业人士也能参与编程的方式,正逐渐受到关注。本文将探讨终端用户编程的概念、相关争议以及未来的发展方向。

终端用户编程的定义与相关问题

终端用户编程通常指的是非专业计算机科学家或程序员使用编程语言的活动。这些终端用户可能是建筑师、科学家、艺术家、商人等,他们的编程活动主要围绕着与自己领域相关的商业应用程序。例如,科学家可能会使用Mathematica或Maple等系统来开发数学模型;建筑师可能会使用AutoCAD提供的Lisp方言进行编程;广告商可能会使用Director应用程序提供的Lingo语言来创建演示文稿。

然而,这个定义引发了一些潜在的问题。首先,什么是编程语言?许多应用程序设计师更喜欢使用“脚本编写”等术语来描述他们系统的语言组件,那么“脚本语言”和“编程语言”之间是否有实质性的区别?此外,像大多数电子表格应用程序提供的公式语言是否应被视为编程媒介?当会计师在电子表格单元格中写入求和符号时,他是否在进行编程?

其次,如何定义“终端用户”?数学家和科学家是否是我们所认为的“典型”终端用户?还是我们应该考虑那些来自“非技术”领域的人?以及在K - 12教育中使用的编程语言(如Logo),孩子们作为非专业程序员,是否属于我们定义的“终端用户”?

这些问题不仅仅是学术上的争论,它们还涉及到软件应用程序的设计和开发。作为软件设计师,我们是否应该在应用程序中包含编程语言?如果是,这些语言应该是什么样子的?我们应该避免还是接受终端用户编程?如果终端用户编程在应用程序设计中被认为是必要的或可取的,那么在教育环境中应该如何引入它?

终端用户编程的利弊

终端用户编程的利弊存在着不同的观点。

反对终端用户编程的观点
  • 可学习性论点 :编程对于大多数非计算机科学家来说太难掌握。从经济角度来看,任何包含广泛编程环境的应用程序都可能会让普通用户感到畏惧,从而在市场上输给那些更容易学习的竞争对手。此外,由于编程需要很长时间来学习,而应用程序用户通常有任务截止日期,基于语言的应用程序会给用户带来无法承受的时间压力。
  • 无需编程论点 :编程是不必要的。几乎任何可以通过编程语言完成的任务都可以通过非语言手段实现。最好的无编程语言应用程序的丰富性和功能性证明了直接操作作为应用程序设计范式的多功能性。
支持终端用户编程的观点
  • 可定制性论点 :不可编程的应用程序由于缺乏语言,因此缺乏用户创建扩展的直接手段。编程为定制或扩展功能不足的软件提供了一种机制。
  • 表达媒介论点 :编程语言为用户提供了重新概念化领域的表达媒介。通过在编程语言中表达想法,我们可以对这些想法有新的、更丰富的理解,编程语言成为了思考的工具。
  • 交流媒介论点 :编程语言为用户之间交流想法提供了一种媒介。一旦用户为特定目的开发了自己的程序,该程序可以被其他用户共享和扩展。书面语言,特别是文本语言,成为了“用户文化”的代表媒介。

这些论点构成了关于终端用户编程实用性辩论的核心。实际上,这些论点之间并没有直接或必然的矛盾。支持终端用户编程的人并不否认编程学习的难度,但他们认为编程带来的能力和表达力是值得付出努力的。同样,“无需编程”的论点在原则上可能是正确的,但在实践中,编程语言的可塑性和丰富性可能为用户提供了一种优雅而紧凑的媒介,其效用是大量单独的直接操作元素无法比拟的。

终端用户编程与专业编程的区别

“终端用户编程”这一术语意味着它与大多数计算机科学家所使用的“专业编程”有所不同。在编程设计和程序构建方面,终端用户编程和专业编程存在一些区别,但在某些情况下,这些区别更多地是强调的轻微转变,而不是根本性的质的差异。

终端用户语言设计的选择

设计终端用户编程语言时,设计师面临着一个关键选择:是从头开始创建一个全新的、特定于应用程序或领域的语言,还是在现有的通用语言基础上进行扩展。

创建新的特定于应用程序的语言有其优势。例如,Director的Lingo语言、HyperCard的HyperTalk语言和Mathematica语言等,这些语言可以特别关注可学习性或可读性,利用周围应用程序的结构,或包含视觉或图标元素。

而使用增强的通用语言也有好处。例如,AutoCAD的Lisp方言和Word的Basic方言。相同的底层语言可以在多个应用程序中使用,用户学习一种语言后可以应用于多个领域。此外,使用通用语言可以利用其广泛的研究历史和成熟的语义,以及编译器和调试器等工具。

可学习性问题

终端用户语言与专业语言是否必然不同?以AutoCAD用户使用其Lisp方言为例,他所面临的编程任务是否与专业Lisp程序员有根本不同?

一般来说,专业程序员和非专业程序员的一个根本区别在于他们对学习编程本身(以及任何给定语言)的兴趣程度。终端用户更关注完成工作,他们没有太多时间学习编程的细节,也不太注重编程的美学。因此,他们更愿意在匆忙学习的媒介中编写不太规范的程序。

基于这个论点,在为终端用户提供编程语言时,语言的可学习性成为了一个至关重要的问题。这体现在两个主要方面:一是设计更容易学习的语言;二是设计包含改进工具的终端用户编程环境,以帮助用户学习应用程序的语言。

可学习语言的探索

传统的通用语言(如C、Fortran、Basic、Lisp)被许多应用程序设计师认为对于终端用户来说太难或缺乏吸引力,因此需要创建更新、更易学习的语言。以下是几种创建可学习语言的主要方法:
- 视觉 - 图标语言 :视觉编程语言有着悠久的历史,有多种类型。一些语言几乎完全通过图形元素工作,一些混合了文本和图标元素,还有一些使用视觉元素来影响程序布局。虽然有证据表明通过图表展示程序结构可以提高程序的可理解性,但也有研究表明,对于有经验的程序员来说,文本语言可能更容易理解。此外,视觉元素对于领域专家可能更有用,但对于新手来说,理解视觉表示可能需要时间和技巧。
- “隐式”或“隐藏”语言 :这种技术通过允许用户指定程序应该如何工作的示例,让编程环境根据这些示例创建可运行的程序,从而避免用户学习编程语法。例如,Myers的Peridot系统、Maulsby和Witten的Metamouse系统以及Cypher的Eager系统。然而,在实践中,对于大型和复杂的任务,这种方法尚未完全实现。而且,它与终端用户编程的“表达媒介”和“交流媒介”论点不太相关,因为它避免了对想法进行明确、可读和正式的表示。
- 特定于领域或界面的语言 :许多终端用户语言更注重将语言元素与特定的应用程序、界面或领域集成。例如,电子表格公式语言专门设计用于处理电子表格单元格的内容;HyperTalk语言围绕HyperCard界面进行定制,在界面构建领域具有很强的表达能力。这种语言的可学习性在很大程度上受到应用程序和界面上下文的影响。

支持语言学习的工具和环境

除了设计可学习的语言,还可以通过设计支持用户学习语言的工具和环境来提高终端用户编程的可学习性。例如,Mathematica的“函数浏览器”允许用户通过浏览按主题区域排序的分层“索引”来探索大量的Mathematica原语;Director的界面允许用户在滚动框中浏览Lingo原语名称。大多数终端用户可编程系统都包括可编辑的示例程序和标准帮助设施,以向用户介绍语言词汇和基本控制结构。

一些研究系统也采用了其他方法来促进终端用户语言的学习。例如,Lieberman的Mondrian系统和Myers的Garnet系统将通过演示编程与文本程序构建相结合;DiGiano的Chart ‘n’ Art系统引入了“自我披露”的语言组件,在用户使用应用程序的直接操作部分时,逐渐向用户揭示更多的教程信息。

终端用户编程与专业编程的差异总结

虽然前面讨论的许多策略也适用于专业编程环境,但终端用户编程和专业编程之间仍然存在一些明显的区别:
- 程序复杂度 :终端用户通常编写简短且相对简单的程序,而专业程序员经常参与创建包含数千行代码的系统级项目。
- 团队协作 :专业程序员通常作为大型团队的成员工作,而终端用户大多独自或在非常小的团队中创建程序。
- 语言分析 :专业程序员倾向于使用指称语义的概念工具来分析语言,关注程序的正确性、可修改性、可测试性和可维护性等问题。而终端用户语言的分析几乎与特定的应用程序上下文不可分割,更注重语言对特定领域或界面的适用性以及可学习性。

然而,这些区别并不是绝对的。一些终端用户也会编写中等规模到大型的程序,并且在一些情况下,终端用户也会形成社区,其中的“本地开发者”会面临与专业编程团队类似的程序交流和理解问题。此外,终端用户编程领域也开始认识到程序分析和正确性的重要性。

儿童作为程序员

终端用户编程不仅涉及成人专业活动,在教育环境中,儿童编程也面临着类似的问题和争论。与成人领域不同的是,儿童编程的争论通常围绕着编程活动本身的优点。

除了前面提到的支持终端用户编程的论点外,还有两个适用于儿童编程的额外论点:
- 思维提升论点 :编程的认知益处可以转移或扩展到程序主题之外的其他领域。参与编程的人(尤其是儿童)可能会成为更好的问题解决者,学习适用于广泛领域的通用技术或认知技能(如逻辑推理、自上而下的设计等)。
- 计算机素养论点 :编程是成人世界中的一项宝贵技能,类似于阅读和写作技能。因此,儿童应该将编程作为一种“技术素养”来学习,因为掌握这项技能最终会使他们在成年后更具就业竞争力。

然而,“思维提升论点”的支持证据一直难以获得。一些研究表明,编程经验对儿童的一般问题解决能力没有明显影响,但也有研究发现编程对儿童在某些特定领域(如几何)的理解有积极作用。此外,“计算机素养论点”也存在问题。虽然许多成年人现在在职业中需要使用计算机,但编程本身在成人生活中的重要性远不及读写能力。而且,专业编程语言的变化非常快,很难确定儿童是否应该在年轻时就投入时间学习编程。

在过去的十年中,儿童编程的兴趣一直在稳步下降,课堂上的儿童编程活动基本上被各种教育工具、游戏和模拟所取代。然而,随着时间的推移,那些促使专业应用程序走向可编程性的论点(即可扩展性、表达媒介和交流媒介论点)可能也会应用于教育工具和应用程序领域。

为了使儿童语言更易于学习,也有许多努力致力于将视觉元素融入儿童编程语言中。例如,Boxer语言在基本的文本语言基础上增加了二维“盒子”;Function Machines系统将函数表示为可构造的动画“机器”;ToonTalk系统将各种动画人物与程序的创建和评估结合起来;Agentsheets和KidSim系统基于在二维平面上创建图形重写规则的编程范式;*Logo语言将基本的Logo编程范式扩展到了大规模并行编程。

以下是儿童编程相关研究的一个简单总结表格:
|研究方向|研究结果|
| ---- | ---- |
|编程对一般问题解决能力的影响|部分研究表明无明显影响,部分研究发现特定领域有积极作用|
|编程对几何理解的影响|有研究表明有积极影响|
|编程技能的可转移性|受编程教学质量和时长影响|

综上所述,终端用户编程是一个充满争议和潜力的领域。虽然存在着学习难度和时间投入等障碍,但编程带来的个性化工具、思想表达和交流等好处也是显而易见的。未来,应用程序设计师将继续努力克服这些障碍,实现编程的益处。在语言设计方面,需要建立更精确的语言分类体系,探索编程与直接操作界面的集成方式,解决终端用户语言多样性带来的问题,并关注终端用户编程的社会维度。同时,儿童编程在教育领域也有很大的发展空间,需要进一步研究如何更好地将编程融入儿童教育中,以培养他们的技术素养和创新能力。我们需要以积极的态度看待终端用户编程的未来,为实现一个更加广泛和民主的编程环境而努力。

终端用户编程:概念、争议与未来方向

终端用户编程的未来方向

终端用户编程的相关争论在很长一段时间内都不会消失,因为支持和反对的观点都有一定的合理性。编程带来的个性化工具、思想表达和交流等好处十分明显,而学习难度和时间投入等障碍也同样显著。应用程序设计师将持续努力克服障碍,实现编程的益处。以下是未来十年终端用户语言设计可能出现的一些理论方向。

语言和环境的分类

终端用户编程相关的术语非常不精确,这不利于相关讨论。例如,一些应用程序将记录操作序列的功能称为“创建脚本”,还有“脚本语言”“公式语言”等说法。当应用程序声称包含“语言”时,我们应该明确其具体含义。

至少需要进行一些粗略的区分。“脚本编写”和“编程”应该有不同的含义。合理的“脚本语言”定义是,它是应用程序中对操作的文本表示,这些操作可以通过应用程序界面的直接操作(虽然可能很繁琐)来完成。也就是说,脚本语言的数据对象应仅对应应用程序中的可见对象,基本操作应对应用户操作。例如,在一个绘图应用程序中,如果可以选择笔的颜色和宽度,然后绘制一个正方形,并将这个操作序列命名,那么这个应用程序至少具备脚本语言的功能。如果语言可以创建界面中无法直接选择的新颜色、笔样式、渐变或基本形状,那么它就超出了脚本语言的范畴。

对于任何自称“语言”的东西,至少应具备以下几个属性:
- 控制结构 :除了简单的顺序执行外,应具备至少一些非平凡的控制结构,如响应条件、重复操作、递归调用过程、并行执行多个操作等。
- 复合数据结构 :允许用户创建和命名某种形式的复合数据结构,如集合、列表、树、数组等。
- 抽象能力 :为用户提供抽象的手段,最常见的是将操作命名并参数化为带有可变参数的过程。

基于上述属性,可以根据语言的对象和操作是否完全源自界面中用户操作的描述,以及是否包含上述三个“关键”属性,对基于应用程序的语言类型进行初步分类,如下表所示:
|语言类型|对象和操作来源|是否包含关键属性|
| ---- | ---- | ---- |
|脚本语言|仅来自界面用户操作描述|可能不包含全部关键属性|
|编程 - 脚本混合语言|部分来自界面用户操作描述,部分有扩展|包含部分关键属性|
|完整编程语言|不限于界面用户操作描述|包含全部关键属性|

这个表格只是一个非常粗略的分类尝试,未来需要更精细的分类体系。目前,传统的编程语言分类(如函数式、命令式、逻辑式)不足以应对当前终端用户可编程系统中大量基于应用程序的语言和部分语言。

编程语言与直接操作界面的集成

早期,终端用户编程的价值争论围绕着编程语言和直接操作界面的对比。从历史上看,直接操作和编程被视为创建应用程序的不同策略。但实际上,有很多方法可以将终端用户编程与直接操作界面构造相结合。

用户可以编写简单的程序来定制界面中滑块或单选按钮的操作;可以使用直接操作绘图工具创建图形对象,并将其作为书面程序的参数;还可以编写程序,在运行过程中提示用户进行一系列直接操作。

直接操作界面和编程语言的优势是互补的。直接操作构造适用于强调人类判断和手眼协调的任务,如选择悦目的颜色组合、识别面部、操纵光标绕过障碍物等。而编程构造适用于最适合用形式化术语表达的任务,如模拟科学模型、绘制随机游走或分形或平铺图案、在大型数据库中搜索由复杂属性组合表示的模式等。

因此,我们既需要根据语言提供的构造类型(如是否存在条件语句或复合数据对象)对终端用户语言进行分类,也需要对编程和直接操作构造的集成策略进行分类。例如,可以根据直接操作提供给编程语言的信息类型来描述直接操作,选择图标或单选按钮等操作可指定离散数据对象,而其他类型的直接操作可能用于演示程序思路(如编程示范系统)。还可以根据“方向性”区分不同类型的策略,即编程语言构造是定制界面元素,还是界面操作作为语言构造的输入或示例。

随着新的界面技术(如虚拟现实界面、3D 查看设备、手势和语音输入等)变得越来越普遍,应用程序设计师将越来越希望将这些技术与终端用户语言集成。例如,可能希望通过语音命令调整运行程序的参数,编写程序提示手势输入,或根据条件规则调整 3D 查看设备的分辨率。拥有语言 - 界面集成技术的分类体系可以帮助我们有条理地讨论这些问题,并激发我们对新界面硬件和新编程语言如何相互作用的想象。

下面是一个简单的 mermaid 流程图,展示了编程与直接操作界面集成的可能流程:

graph LR
    A[用户操作界面] -->|直接操作| B(生成数据或示例)
    B -->|作为输入| C(编程语言构造)
    C -->|定制或生成| D(界面元素或程序)
    D -->|反馈| A
终端用户编程中的“巴别塔”问题

许多曾经被认为是专业软件工程特有的问题,如程序正确性证明,在终端用户编程领域同样存在。终端用户语言的不断增加带来了与专业领域中多种编程语言类似的机会和问题。

一方面,不同的终端用户语言具有不同的优势,如创建交互式界面、搜索数据库、绘制数学函数等。保持语言风格的创造性多元化对整个终端用户编程社区有益。另一方面,众多的终端用户语言意味着很少有终端用户能够真正精通多个应用程序的语言,每个新应用程序都可能有自己的语法和词汇,以及学习曲线。而且,一个语言社区的工作成果很难转移到其他社区。例如,一个 Mathematica 程序员编写的用于查看和操作三维实体的程序,要移植到其他系统中需要付出相当大的努力。

“标准的好处与选择的好处”之间的权衡是一个终极难题。原则上,一种通用且高度可扩展、极易学习的语言将是理想的标准,但在现实世界中,由于终端用户语言与广泛不同的领域和界面相结合,很难有一种语言能够占据主导地位。因此,一个值得探索的研究方向是找到减轻终端用户编程中多元化带来的不利影响的方法。

一种可能的方法是创建“语言模块”,即终端用户语言的片段,可以以一种能够在多个目标终端用户语言中加载的方式编写。例如,一个 Mathematica 程序员创建的用于处理傅里叶变换的程序集,可以创建一个可转移的语言模块(可以看作是傅里叶变换领域的自包含“包”),然后加载到其他终端用户语言系统中。实现这个想法需要大量的技术工作,如设计让用户访问、浏览和测试公共语言模块集合的方法,但这可能是解决终端用户语言“巴别塔”问题的一种可行途径。

终端用户编程的社会维度

传统观念中,终端用户程序员通常被描绘成独自工作,偶尔对自己喜欢的应用程序进行小扩展的形象。但实际上,终端用户编程存在一个重要的社会维度。

一些研究表明,围绕可编程应用程序会形成“用户文化”,这种文化的成功或失败可能取决于支持终端用户程序员群体发展的社会结构,如教室、公司、在线新闻组等。因此,研究这种文化的形成和生存能力,以及语言设计如何促进或阻碍这种文化的发展非常重要。这与支持终端用户编程的“交流媒介论点”相关,即语言可以作为文化产物将终端用户社区联系在一起。

除了特定应用程序如何融入特定社区的问题外,终端用户编程还涉及更广泛的社会问题,这些问题往往在不知不觉中影响着相关争论。例如,人们常认为编程语言学习时间太长,大多数终端用户更关注完成紧急任务,而不愿投入时间学习语言。但如果人们被允许并鼓励花时间发展对工具的专业技能和工艺水平,终端用户编程可能就不会那么有争议,编程带来的个人创造力可能会更广泛地传播。

如果每个小学生都能使用为儿童设计的可编程应用程序,那么当他们成年后,使用编程语言可能就不会那么令人生畏,反而会更有趣。在这样的世界里,人们不会被分为编程专家和“非程序员”,而是会有各种不同风格、专业领域和投入程度的“程序员”。这就像音乐或写作能力一样,我们不会将人严格分为音乐“专家”和“非音乐人”,而是认可各种不同水平和风格的音乐人才。

总之,终端用户编程领域需要研究人员积极思考并探索如何促进一个更广泛和民主的编程环境的发展,而不是被动地接受现状。我们应该关注语言设计、社会结构等多个方面,以克服终端用户编程面临的障碍,实现其带来的好处,让编程成为更多人表达想法、解决问题的有效工具。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值