注意: 虽然 JavaScript 对于本网站并非必不可少,但您与内容的交互将会受到限制。请启用 JavaScript 以获得完整体验。

人人可编程

人人可编程

这是我们在 1999 年 8 月发送给 DARPA 的一份修改后的资助提案的文本。3 月,我们听说至少该提案的早期版本已被 DARPA 接受;工作已于 1999 年末开始,并有望持续两年,尽管我们仅收到了第一年(到 2000 年 10 月)的资金。我们正在祈祷剩余的资金。

不幸的是,Python 开发团队转到其他雇主意味着我们没有在 CNRI 完成 CP4E 项目。这一变动在很大程度上是由于 DARPA 对 CP4E 承诺的资金数量令人失望。

该项目现在处于停滞状态;IDLE仍在开发中,但我们并未积极追求 CP4E 的其他目标。然而,其他人正在努力;这通常在 EDU-SIG 邮件列表中讨论。

注意:我对提案的文本做了一个更改:应其他语言的一些支持者的要求,我撤回了一个包含对其他语言的高度个人化且有时毫无根据的意见的语言比较图表。该表格在上下文中被以一些人认为令人反感的方式使用。(并非所有表格都有争议,但如果没有更多文档,似乎不宜直接进行语言比较。)

我还从文本中删除了一些管理细节,并做了一些细微的更改以适应 HTML。我对写作风格表示歉意,有时它更像资助提案而不是我所写的大多数散文。我要感谢 Jeremy Hylton、Barry Warsaw、Al Vezza、Bob Kahn、Randy Pausch 和 David Beazley 的贡献和建议,使该提案取得了成功。

--Guido van Rossum

更多资源列在以下页面中

  • Python 教育特别兴趣小组(EDU-SIG)
  • IDLE - Python 自己的交互式开发环境
  • DARPA 提案 - 一切的开始
  • 讨论关于 Ward Cunningham 原始 Wiki 上的 CP4E。

 
 
 

人人可编程
(修订提案)

为未来程序员进行的侦察探险
 
 

国家研究倡议公司

1999 年 7 月

CNRI 提案编号 # 90120-1a

负责人:Guido van Rossum



 
 
 
 
 
 
 
 
 
 

联系人:Guido van Rossum
国家研究倡议公司
普雷斯顿怀特大道 1895 号 100 室
弗吉尼亚州雷斯顿 20191-5434
电话:(703) 620-8990
传真:(703) 620-0913
电子邮件:guido@cnri.reston.va.us


创新主张

在 70 年代,Xerox PARC 提出:“我们能否在每张办公桌上都放一台计算机?” 我们现在知道这是可能的,但这些计算机不一定能让用户变得更强大。今天的计算机通常是不灵活的:普通计算机用户通常只能更改通过“向导”(一个用于罐头对话的高尚词汇)配置的有限选项集,并且在其他所有事情上都依赖于专业程序员。

我们提出一个后续问题:“如果用户可以自己编程计算机,会发生什么?” 我们期待着未来,每个计算机用户都可以“打开”计算机的“引擎盖”,并改进其中的应用程序。我们认为,这将最终从根本上改变软件和软件开发工具的性质。

我们将大规模读写软件的能力与大规模识字能力进行比较,并预测社会将发生同样普遍的变化。硬件现在足够快速和便宜,可以实现大规模计算机教育:当大多数计算机用户掌握创建和修改软件的知识和能力时,下一个重大变化将会发生。

开源运动声称,数千人对软件进行同行评审可以大大提高软件的质量。Linux 的成功表明了这一主张的价值。我们认为,下一步,拥有数百万(或数十亿)的程序员,将引起不同质量的变化——个性化软件的充足供应。

这种看待编程的新方式所需的工具将与专业程序员当前可用的工具不同。我们打算大大改进培训材料和可用的开发工具。例如,非专业程序员不应担心一个小错误可能会破坏他们的工作或使他们的计算机无法使用。他们还需要更好的工具来帮助他们理解程序的结构,无论是明确的还是隐含在源代码中的。

我们的计划有三个组成部分

  • 开发一套适合高中生和大学生(非计算机专业)的新计算课程。
  • 创建更好、更易于使用的程序开发和分析工具。
  • 围绕以上所有内容建立一个用户社区,鼓励反馈和自助。
这些组件共同构成了对下一代计算环境中编程作用的科学探索。

我们打算从 Python 开始,这是一种为快速开发而设计的语言。我们认为 Python 是学习的绝佳第一语言:与专门为初学者设计的语言不同,Python 也是许多编程专业人士的选择。它拥有一个活跃、不断增长的用户社区,该社区已经对该提案表示了浓厚的兴趣,我们预计这将是我们计划创建的教学材料和工具的肥沃的首次部署地。在研究过程中,我们将评估 Python 并提出改进或替代方案。

理由

CNRI 提议进行一项名为人人可编程 (CP4E) 的研究工作。这项工作旨在通过授权所有用户成为计算机程序员来改进计算机使用的现状,而不是引入新的硬件,甚至(主要)通过新的软件。

计算机和通信硬件的最新发展使许多人可以访问强大的计算机,形式包括台式机、笔记本电脑和嵌入式系统。现在是时候通过教育和支持软件为这些用户提供对其计算机的更多控制权了。如果用户在软件设计和实现的层面上对计算机有普遍的了解,这将导致生产力和创造力的巨大飞跃,其影响范围之广,几乎无法预见或想象。

在短期内,可用的计算机软件的数量和质量将大幅提高,因为数百万人的想象力和劳动将应用于解决该问题。富有创造力的用户将能够改进支持他们完成任务的软件,并通过互联网与面临相同任务和问题的其他同事或远方的人分享他们的改进。在专家无法求助的危机情况下,修改或自定义软件的能力非常重要。它对于日常活动也很重要:目前,一些人估计未填补的编程职位数量为 200,000 到 400,000。

研究目标

两个主要的研究目标是开发一种新型编程课程的原型和包含高度用户友好的编程环境的匹配原型软件。我们设想的典型目标受众将包括高中生和(非计算机专业)本科大学生,尽管也会考虑年龄较小的学生和成人。课程和软件通常会一起使用,因此它们应该紧密配合;每个都可以单独使用。

我们还将探索编程在未来的作用。我们正在迅速进入一个信息设备、可穿戴计算机和日常物品中深度联网的嵌入式 CPU 让用户控制其物理和信息环境的时代。最终用户的可编程性将是解锁这些技术的潜力的关键。(这是 DARPA 信息技术探索的一个共同主题,参见 [Dertouzos]。)

研究工作不会孤立进行。我们将与学术研究小组以及几所领先的高中进行合作。我们还将通过在互联网上免费提供我们的课程资料和软件来建立一个更大的社区。

我们计划从基于 Python 开始这两个组件,Python 是一种流行的免费解释型面向对象语言 [Python] [Lutz] [Watters]。Python 最初在阿姆斯特丹的 CWI 开发,目前正在由 CNRI 开发和维护。Python 非常适合教学目的,而且不是一种“玩具”语言:它作为一种快速应用程序开发语言在计算机专业人士中非常受欢迎。Python 将来自几种主要编程范例(过程式、函数式和面向对象)的元素与一种优雅的语法相结合,这种语法对眼睛来说很舒服,并且易于学习和使用。虽然我们认为 Python 是一个很好的起点,但毫无疑问,我们将会了解到可以进行改进。作为我们研究的一部分,我们将评估 Python 在教育和初学者使用方面的有效性,并设计改进或替代方案。

我们预计,我们的研究成果将在两年内得到展示,并在十年内影响整个社会。届时,在高中阶段使用我们的课程学习计算机编程的孩子们将开始加入劳动力市场(以及军队)。我们预计上述新的移动和嵌入式计算与通信技术也将在同一时间趋于成熟。因此,我们的时间表是完美匹配的。

动机

在黑暗时代,只有那些拥有权力或巨额财富的人(以及选定的专家)才拥有阅读和写作技能或获得这些技能的能力。可以说,普通民众的识字率(虽然仍未达到 100%),以及印刷技术的发明,一直是现代历史上最具解放性的力量之一。

我们只是最近才进入信息时代,预计计算机和通信技术将很快取代印刷成为信息传播技术的主要形式。大约一半的美国家庭已经拥有至少一台个人电脑,而且这个数字还在增长。

然而,尽管现在很多人使用电脑,但很少有人是计算机程序员。非程序员在如何使用电脑方面并没有真正的“权力”:他们被限制在使用“程序员”为他们确定的应用程序。不需要有远见就能看到这里的局限性。

一个更彻底的改变是将计算和通信嵌入到家庭和办公系统中。预计未来几年,包含可编程元素的设备数量将急剧增长。我们必须学习如何以有意义的方式向用户展示这种可编程性,并使非程序员能够轻松控制和编程这些设备。

在这个“未来探索”中,我们想探讨这样一个概念:就像学习阅读和写作一样,几乎每个人都可以在学校获得某种程度的计算机编程技能。

大众使用的编程语言和环境面临许多挑战。如果每个人都是程序员,那么肯定会有很多水平不高的程序员。要充分应对这种情况,就需要重新思考编程语言和开发工具的基本属性。然而,我们认为专业人士使用的工具和教育使用的工具之间不应有明确的区分——就像专业作家使用与读者相同的语言和字母表一样!

鉴于计算机和软件在社会各个方面的使用越来越普遍,我们预计对编程技能的需求只会增加。虽然大多数高质量的软件将由专业人士制作,但最终用户将需要更多的编程和定制。

这种对灵活性的追求在当今的计算及其可能的未来都可以看到

  • 功能日益强大的台式机和笔记本电脑应用程序使用脚本和宏功能。
  • 互联网的发展直接导致了对可编程性的更大需求,以创建活跃的和交互式的 Web 内容。
  • 最终用户的信息设备和嵌入日常物品中的 CPU 网络——这两者都需要用户控制和个性化。
  • 移动和智能软件代理将很常见,并且需要用户进行自定义。
我们的愿景

在未来,我们设想计算机编程将在小学教授,就像阅读、写作和算术一样。我们真正指的是计算机编程——而不仅仅是计算机使用(这已经在教授)。例如,Logo 项目 [Papert][Logo] 表明,幼儿可以从计算机教育中受益。当然,大多数孩子长大后不会成为熟练的应用程序开发人员,就像大多数人不会成为专业作家一样——但是阅读和写作技能对每个人都有用,因此(在我们的愿景中)通用的编程技能也将如此。目前,我们设定的目标不那么雄心勃勃。我们专注于向高中生和(非计算机专业)大学生教授编程。如果我们在这一方面取得成功,我们预计低年级很快也会效仿,在他们的能力范围内。

除了教授计算机如何工作这一目标外,计算机编程课程还将恢复对逻辑思维的强调,这曾经是教授几何学的主要好处。

两个特别受关注的通用计算趋势是转向信息设备以及日常机器和设备中嵌入式 CPU 的增长——无论是在军事领域还是民用领域。计算规模的缩小和网络覆盖范围的扩大,特别是无线网络,使得在设备之间共享信息以及与设备交互成为可能。编程能力将大大提高用户控制这些设备的能力。想象一下,用户可以对自己嵌入式 GPS 接收器或掌上电脑中的软件进行更改,而不是(或者除了)从供应商下载升级或从第三方购买“罐装”附加应用程序。这将大大增强人们通过编程他们的个人工具来准确地做他们需要的事情来改善生活的能力。

如果我们成功,非专业人士将能够更有效地使用他们的计算机和其他智能设备,从而减少他们的挫败感并提高他们的生产力和工作满意度。(新的休闲可能性无疑也会随之而来!)计算机用户将能够更频繁地解决自己的计算机问题,从而减少对技术支持的需求。

即使大多数用户不经常编程,熟悉编程和软件的结构也会使他们更有效地使用计算机。例如,当出现问题时,他们将能够更好地对可能发生的故障进行心理建模,这将使他们能够修复问题或解决问题。他们还能够更好地评估何时可以自己进行更改,以及何时需要专家的服务。他们将更能够与专家交谈,因为他们现在将更多地共享通用语言。一个类比是获得汽车维护方面的基本知识:您知道足够多的知识来检查您的机油并在必要时添加几夸脱,但是您也知道您不应该尝试自己更换刹车片。当机械师说“您的转子变形了,您需要新的刹车片”时,您就明白他在说什么了。

如果这项工作取得成功,可能会有数百万,最终达到数十亿的计算机程序员,他们的熟练程度各不相同。这会对软件开发技术的现状产生什么影响是难以想象的。软件的性质将发生变化,以适应这些程序员的需求,允许通过源代码修改进行定制,并且个性化将很丰富。

这项努力也可能对吸引妇女和少数族裔加入计算机编程领域产生重大影响——目前,这些群体的人数严重不足。

最近流行的开源运动 [OpenSource] 有望通过数千人的同行评审以及程序员“解决自身问题”(即,以只有个人关心的方式对软件进行微调)的能力来提高关键软件包的质量。我们预计,从数千名程序员增加到数百万或数十亿程序员将进一步改变软件开发过程的性质。在这种规模下,个人编程将变得更加重要(和可行),而大规模同行评审的重要性将相对降低,因为收益递减(整合来自数千个来源的错误修复的后勤工作已经是一项艰巨的任务)。但是,大多数当前的软件(无论是开源的还是其他的)都过于复杂,无法让任何人在不首先投入大量精力和时间来理解他们正在使用的软件的情况下进行个人定制。我们对整个软件开发过程的改变也很感兴趣,这将解决这个问题——特别是开发工具。

此外,通过让任何人都能对应用程序进行编程,我们将在不牺牲用户对高度个性化软件的渴望的情况下利用规模经济。应用程序可以批量生产,而无需强迫每个人在使用软件时适应相同的模式(或适应开发人员计划的那些可定制性的漩涡)。用户想要个性化他们的系统有很多原因;其中包括提高生产力、解决他们需求特有的问题,或者只是表达他们的创造力并将自己与同龄人区分开来。如果他们具备我们设想的基本编程素养,他们将能够实现这一点。

挑战

一些广泛的问题有助于构建我们特定的研究目标,例如:学校教授的编程语言会像我们今天所知的编程语言吗?它甚至会被称为编程语言吗?我们将如何教授它?会只有一种语言吗?教授和使用这种语言的其他基本工具是什么?是否有可能拥有一种既适合教学又对专家有用的语言和工具?

同样有趣的问题还有这些:人们将如何以及出于什么目的使用他们的编程技能?普遍具备阅读和编写计算机程序的能力将如何改变计算机软件的结构和实用性?(这与未来版本的互联网结合在一起尤其有趣,这些互联网承诺高速普及对计算和存储元素的访问。)一旦他们确信自己可以做到,人们是否会有动力实际编程他们的系统?他们一开始就会对此感兴趣吗?

一个明确的担忧是,如果大多数人都是程序员,那么他们中的许多人很可能都是水平不高的程序员。那些用母语都无法写出易于理解的句子或平衡其支票簿的人不太可能编写结构良好的计算机程序!然而,我们的意图是让每个人都可以访问编程,即使它并不容易。一些用户将雇用或与第三方编程和定制服务签约。这很像房主外包装修工作。

因此,我们需要研究如何提高程序员与系统之间交互的质量,以帮助即使水平不高的程序员也能最大限度地利用他们的计算机。例如,您可能想编写一个程序来定制您的 PDA 或烤面包机,但如果一个小错误可能擦除您的地址簿或点燃您的房子,您可能会感到沮丧。需要采取措施防止灾难,以及从对整个系统的意外更改中恢复过来的方法。(“撤消”虽然非常强大,但通常一次只适用于一个文件。从不必要的全局系统更改中恢复通常需要重新启动,甚至需要从备份介质中痛苦地恢复数据。)

另一个担忧是关于配置管理。如果没有出色的配置管理,企业会发现自己要么无法纠正问题,要么被那些以某种方式修改了操作系统或应用程序,从而无法升级或进行其他更改的程序员所挟持。一般来说,目前对大型软件系统所做的所有本地更改都可能与未来主要产品的升级不兼容。即使是本地开发的软件,也可能在主要开发人员离职后因多种原因(包括缺乏测试或文档)而变得无法使用。

除了担心可能会出错之外,对有兴趣自定义计算机的初学者程序员来说,另一个担忧是试图理解大型现有软件的艰巨任务。我们需要研究用户友好的程序分析工具;稍后会详细介绍。另一个智力挑战是以帮助新手的方式可视化(应用程序生成)数据。电子表格在这里很有价值,但并非所有数据都适合矩阵形式。

脚本语言在专业程序员中越来越受欢迎[Ousterhout],但关于性能、软件重用以及与其他语言编写的组件集成的问题仍然存在。我们可以通过增强 JPython [Hugunin1] 的功能来应对这些挑战。JPython 是一种与 Java 无缝集成的 Python 方言,以及 SWIG,一种在脚本语言和 C 或 C++ 等系统语言之间创建接口的接口生成器。

为什么要教授“通用”编程语言?

众所周知,“通用”编程语言和“领域特定”语言之间存在某种二分法。对于本文的讨论,我们广义地使用“通用”一词,包括函数式编程语言,甚至可能是逻辑编程语言,只要它们可以用作通用编程工具即可。图灵完备性是这里的关键概念。

领域特定类别则包含其他所有内容,从命令行参数语法到电子邮件标头和 HTML。这里的区分因素是存在相对狭窄的应用领域。在此类别中,我们还将诸如 Microsoft 的“向导”(实际上只是一系列由简单流程图连接的预定义对话框)以及微波炉或核反应堆上的控件和拨盘之类的东西放在一起。

领域特定语言的一个典型特性是,它们在预期的应用领域中提供了出色的控制,并且在未预料到的领域中(几乎)没有自由度。例如,HTML 没有文本条件包含或变量扩展的固有能力。(事实上,这种特性已经被多次添加为不兼容的扩展,这仅仅证明了这一点。)

另一方面,通用语言在任何特定领域通常都不是那么好。例如,用通用语言编写一个格式化文本段落的程序比用 HTML 要困难得多。但是,通用语言通过其图灵完备性弥补了这一点,这使得解决可能出现的任何问题成为可能(假设有足够的资源可用)。因此,通用语言在与领域特定语言结合使用时是理想的。

例如,如果手机是可编程的,人们仍然会使用常规的领域特定接口(键盘)来拨打特定的号码,因为这是访问该特定功能的最方便方式。但是,如果没有可编程性,就无法使其尝试某个特定朋友的几个不同号码,直到有人接听为止,除非手机供应商预料到此特定功能。

为什么要从 Python 开始?

我们建议从使教授 Python 编程成为可能开始,Python 是一种现有的脚本语言,并专注于为其创建新的开发环境和教学材料。我们有轶事证据表明 Python 是一种适合作为第一门编程语言教授的好语言。我们的工作将专注于为此目的创建工具和教育材料,并围绕这些材料培养一个社区。这将使我们能够研究 Python 在哪些方面是适合(或不适合)教学的语言,并引发未来发展的方向。

为什么要从现有语言开始?我们的经验表明,一种新语言的设计和实现需要数年时间 - 而且这项工作必须(几乎)在创建用户友好的开发环境和教学材料之前完成。因此,我们通过使用现有语言来快速启动我们的项目。根据用户反馈,我们可能会在项目期间对 Python 进行更改或完全设计一种新语言。

我们已经有一些证据表明哪些地方可能需要更改。卡内基梅隆大学的 Randy Pausch 教授(见下文)在其有限的问题领域内对 Python 进行了一些可用性研究。他们的用户似乎最困惑的是 Python 变量名的区分大小写以及整数除法的截断。更广泛和更普遍的研究将有助于推动对 Python 的特定更改,或表明需要一种新设计的语言。

Python 是一种适合教绝对初学者的好语言。它从 ABC 中衍生出许多关键特性,ABC 是一种专门为向非专业人士教授编程而设计的语言[ABC] [Geurts]。Python 社区已经收到许多个人报告,他们使用 Python 教他们的孩子编程。这些报告的共识是,该语言本身非常适合此目的 - 与 C++、Java、Perl、Tcl 或 Visual Basic 等不同,后者充斥着太多特质。

下一页的表 1 是一个(高度主观的)图表,比较了 Python 与其他一些语言的一些相关方面。从该表(和我们的经验)中,我们得出结论,Python 是教学的良好首选,它也可以很好地用作更严肃的应用程序开发的语言。与为初学者提出的其他教学语言(例如 Logo、LogoMation,甚至 Python 的祖先 ABC)不同,Python 不仅仅是一种教学语言。它适用于开发大型实际应用程序,正如 CNRI [Knowbots] [Mailman] 以及其他地方的项目所证明的那样。例如,工业光魔已将其整个工具库转换为 Python,并认为这是一个优于竞争对手的优势。

此外,Python 可以通过用其他语言(例如 C、C++ 或 Java)编写的模块进行扩展,以调解对 Python 无法直接访问的高级功能的访问(例如,高速 3-D 计算机图形包)。虽然我们不希望学生编写这些扩展模块,但这些模块的使用可以极大地丰富他们的学习体验。这种可扩展性使教师有机会通过为学生提供对其他软件包的有控制的访问,来根据学生的兴趣定制课程。

Python 可用于开发大型应用程序这一事实也符合我们愿景的另一个方面,即开发可以由非专业程序员但已掌握一些编程技能的用户定制的开源应用程序软件。尽管这不是我们这里工作的重点,但我们希望看到至少一些朝着这个目标迈进的举措,并且我们将鼓励希望朝着这个方向迈进的公司和组织。我们预计 JPython 的存在将成为这里的重要推动因素。

Python 的编程环境和文档对于向新手教学来说不够理想。特别是,现有的 Python 程序开发工具和教程(每个都有几种)都假设用户是铁杆开发人员,他们知道一整套用于编辑、运行和调试程序的外部工具,并且已经了解一种或多种其他编程语言及其开发环境。这目前阻碍了 Python 作为第一门编程语言的更广泛的实验。

表 1. 语言比较图

(已撤回)

方法

我们将创建一个下一代编程环境和教学材料,使普通用户能够编写简单的程序,并理解更大程序的结构和组织。我们还将探讨普及编程素养将如何影响普遍计算环境中软件的生产和使用。

我们的工作分为三个不同的领域:

  • 适合高中和大学生的新计算课程。
  • 更好、更易于使用的程序开发和分析工具。
  • 围绕上述内容形成的用户社区,鼓励反馈和自助。
如前所述,我们最初将使用 Python 编程语言。这将为下一步做好准备。“下一代计算环境”可能不会使用 Python,但 Python 和 CP4E 是朝着正确方向迈出的有益的实验步骤。

一旦将新开发的课程和工具的初始版本发布给社区,反馈渠道将打开。最初的反馈将主要用于改进环境和教学材料。这就是社区建设开始的地方。

课程开发

CP4E 工作的一项关键目标是开发一个课程,向从非计算机科学专业的本科生到中学生,最终到小学和初中学生教授编程素养。每个年级的学习方法可能会有所不同,以便更好地与学生成熟时的情况联系起来并接触到学生,但 CP4E 努力提供一种统一的方法,该方法将随着学生的成长而发展,一路呈现更丰富和更深入的主题材料。最初的工作将主要集中在高中生和本科生身上。

CNRI 将开发课程的基本材料,包括将在教学环境中使用的软件,以及可以作为编程教科书基础的教程和入门材料。CNRI 将与在编写教科书和其他教学材料方面经验丰富的教育工作者紧密合作,以便最好地为目标年龄段定制这些工具。

我们的目标是采用更有经验的程序员使用的软件环境和工具,并生成这些工具的版本,这些版本在教授编程技能方面将很有用。我们受到了现有 Python 交互式解释器和 IDLE(Python 的图形开发环境)的启发,这两者既可以作为专业程序员的生产力工具使用,也可以在与教程材料结合使用时作为教学辅助工具使用。我们的新工具将为新手和经验丰富的程序员提供有用的功能。

新计算课程

CNRI 建议与芝加哥大学合作开发一门新的计算机科学课程,使用 Python 作为所有级别编程教学的编程语言。Python 是一种特别适合此目的的语言,因为它易于学习、阅读和使用,但功能强大,足以说明编程语言和软件工程的基本方面。因此,即使是年轻的学生也可以使用 Python 学习编程的基础知识,但他们不会像使用 Logo 那样在应用领域受到限制。使用 Python 可以让每个学生按照自己的进度进行探索和进步。尤其令人兴奋的是,如果有天赋的学生受到激励想要学习更多或更快地学习,他们将可以轻松获得强大的编程语言和环境。

芝加哥大学将为非计算机科学专业的本科生和高中生开发一系列介绍编程和计算机概念的课程。目前,这一级别的课程往往侧重于编程语言(具有浓厚的数学味道)或诸如 HTML 和 JavaScript 等 Web 编程主题。不幸的是,这两种方法都有严重的局限性。如果课程过于正式和数学化,它可能只会吸引计算机科学专业的学生和具有技术思维的学生。另一方面,Web 编程课程虽然极大地利用了互联网的普及,但往往狭隘地关注 HTML、Perl 或 JavaScript 等特定技术。因此,学生对计算机在更大范围内的应用知之甚少,也无法获得解决未来计算问题所需的解决问题的技能。

在芝加哥大学开发的课程将涵盖我们认为每个人都必须了解的计算机知识,以便成为一名知识渊博的计算机用户。

  • 基本计算机组织结构。学生将学习计算机如何工作以及如何组装的基本知识。主题将包括布尔代数、逻辑和简单的计算机架构(例如 CPU、内存、I/O)。简而言之,这就是“幕后”发生的事情——以容易理解的方式陈述。最终,我们希望尽可能地揭开计算机的神秘面纱。
  • 编程入门。这将介绍人们使用计算机进行编程的不同方式。学生将以非正式的方式了解过程式编程、函数式编程和面向对象编程。目标不是将学生培养成专业程序员,而是向学生介绍人们如何尝试简化计算机的使用。
  • 软件架构。未来,计算机越来越有可能主要通过组装现有软件组件并编写少量胶水代码进行编程。为了实现这一点,了解软件是如何组装的至关重要。学生将学习软件设计和软件组织(到底那些 DLL 是什么?)。
  • 调试和问题解决。如何在所有方法都失败时生存下来——而无需致电客户支持。
在所有教育阶段,对软件工具和教材进行可用性研究并进行评估至关重要。这是改进此类材料和工具并使其适合特定年龄和经验群体的唯一方法。由卡内基梅隆大学的 Pausch 教授进行的可用性研究将在所有三个教学级别进行开发和实施。当然,我们还将开发传统的测试来衡量每个学生的表现。

3D 游戏

我们打算自己进行小规模的教学工作,例如在合作部分列出的当地高中,但我们不期望会做太多的教学工作。如果我们对 Python 的普及程度的经验可以作为参考,我们将不必这样做:其他人也渴望参与这个实验。

这些课程将使用下一节中描述的新开发环境。为了激励编程更有“乐趣”,我们打算将开发环境连接到流行的计算机游戏中使用的现有可编程 3D 游戏引擎。有几个这样的引擎已经或很可能可以与 Python 一起使用;我们将选择一个并为我们的受众创建一个合适的接口库。

为什么要使用 3D 游戏引擎?Logo 的经验表明,图形是吸引年轻观众注意力的好方法,但与现在青少年熟悉的电子游戏相比,它的 2D 图形看起来有些枯燥。Alice 是一个很好的引人入胜的 3D 图形环境的例子。

Knowbot 程序

除了使用 3D 游戏作为测试平台外,我们还可以使用 CNRI 的 Knowbot 技术 [Knowbots] 作为新手程序员的激励性应用。Knowbot 程序是独立的移动程序,能够在整个互联网的 Knowbot“服务站”(特殊配备的主机)之间迁移。服务站向 Knowbot 程序提供服务,例如搜索服务、数字对象存储库、拍卖服务等。

看待 Knowbot 程序的另一种方式是将其视为在服务站的更大框架内工作的小组件。Knowbot 程序是一个模块化的独立程序,可以很容易地编写成在互联网上移动,但由于其集成到框架中以及对它遇到的环境的利用,它具有强大的功能。

我们将探索如何在教学课程中使用 Knowbot 程序的几种想法。我们设想协作游戏场景,学生可以在其中创建表现出某些行为的 Knowbot 程序,并且必须协同工作才能解决一个共同的问题。这将是激励来自互联网各地的学生进行协作的好方法。

我们可能会设想寻宝游戏,学生必须应用他们刚刚学到的编程技能才能发现并迁移到服务站,解决该站点上的难题并获得宝藏。我们可能会设计分布式虚拟模拟,类似于麻省理工学院的虚拟鱼缸 [Fishtank],学生可以在其中创建复杂系统的离散元素(例如,在 Knowbot 程序中实现虚拟鱼),并观察自己的元素如何与他人交互。由于 Knowbot 技术允许在整个互联网上进行高度分布式、非常复杂的交互,因此它为我们提供了一个独特的平台来尝试丰富的协作学习机会。

编程工具

我们将设计和构建一个专门用于支持向没有编程经验的用户教授编程的编程环境。我们的目标是为用户在学习编程以及在家和办公室中使用这些技能时提供支持工具。

我们相信,大多数普通用户将利用他们的编程技能来定制和扩展他们的计算环境。大多数人不会从头开始编写新程序,而是会向现有程序添加新代码。面向此受众的编程工具必须解决三个重大挑战。

首先,该环境必须显著减轻编写、安装和调试新程序的负担。当前一代的开发工具对于专家用户来说可能很麻烦,更不用说新手了。我们必须将精心的设计和可用性研究集中在新编程环境的开发上。

第二个挑战是为消费者和生产者提供软件工件的持续演变和修改。我们将开发工具来帮助用户理解大型程序的结构,以便他们可以确定在哪里进行更改以及这些更改将产生什么影响。我们的工具还将帮助用户管理和配置软件,以便可以随着时间的推移替换或升级单个组件。这些工具将通过自动跟踪版本和依赖关系来帮助用户共享新的和修改的程序。

最终的挑战是构建在无处不在的计算环境中将有用的工具。桌面计算环境将很快被计算机控制的设备和物理系统的网络所取代。这种新环境加剧了安装、调试和管理软件的问题。它还为系统设计人员提出了构建允许最终用户自定义的软件的新挑战。

本节围绕这三个挑战组织。第一部分讨论拟议的编程环境。第二部分讨论程序分析和配置管理工具。第三部分讨论用于支持无处不在的计算环境的最终用户可编程性的应用程序框架。

我们解决这个问题的方法是研究如何通过更高级的分析、检查和理解程序的方法来增强和改进传统的编程工具,例如编辑器、调试器和类浏览器。

编程环境

程序员最基本的活动是编辑源代码、运行程序进行测试以及调试程序。(Python 没有单独的编译阶段。)编程环境当然必须支持这些活动。我们一直在为 Python 开发一个名为 IDLE 的可移植编程环境,它允许用户交互式地执行单个语句。它主要面向有经验的程序员,但将作为绝对初学者环境的起点。

IDLE 只是触及了帮助新手程序员所需的编程环境的表面。例如,它的源代码着色和缩进功能可以被更强大的程序检查器所取代,该检查器会在用户键入时指出所有语法错误、未定义的标识符、类型不匹配等等(如拼写检查器)。调试器可以支持回溯执行步骤、编辑正在运行的程序的源代码等。程序编辑器可以支持灵活的基于模板的编辑形式(Alice 小组在其有限的领域中拥有非常好的经验)。撤消功能(目前只允许撤消源代码更改)可以扩展到撤消对程序的运行时状态甚至对环境的副作用的更改(在合理的范围内——我们不能指望撤消打印或发送电子邮件消息)。例如,Alice 软件为所有涉及更改其管理的 3D 世界的操作提供了完全撤消功能。

两个具体的工作领域是撤消和扩展的类型检查器。

“撤消”对于初学者来说是一个极其重要的工具,因为它是程序员的第一道防线。除了版本控制、自动保存和其他功能外,回滚无限数量的近期更改的能力意味着程序员有更多的自由进行实验和学习。然而,大多数撤消实现的功能范围都非常有限。我们的方法将研究诸如选择性撤消和全局撤消之类的概念。在传统的撤消系统中,编辑器只是保留文件更改的链接列表,并且可以通过在此列表中移动来取消应用或重新应用这些更改(此主题有多种变体,包括撤消环和撤消/重做)。传统撤消的问题之一是,某些不良更改与某些可取更改重叠;程序员通常必须丢失可取更改才能消除不良更改。

通过选择性撤消,可以将更改局部化到更精细的粒度。例如,假设程序员对文件顶部的函数 A 进行了三个更改,并且对文件底部的函数 Z 进行了四个更改。现在,程序员发现函数 A 应该永远不会更改;选择性撤消允许回滚对函数 A 的更改,而不影响对函数 Z 的更改。

全局撤消类似于版本控制提供的功能,其中可以在系统受到不利影响时标记和回滚系统级别的更改。但是,全局撤消的不同之处在于不必预先决定标记。

我们还计划使用类型检查工具增强开发环境,这些工具可以帮助程序员发现代码中的错误并提高编译代码的性能。Python 是一种动态类型语言,如 Smalltalk 或 Scheme,它依赖于广泛的运行时检查来确保正确使用内置操作。软类型 [Cartwright] 是一种静态检查动态类型语言中的程序以检测错误并消除不必要的运行时检查的机制;该分析与编程环境集成,而不是与语言运行时集成。此机制已应用于 Scheme [Wright][Flanagan]。我们将为 Python 开发类似的类型检查机制。为 Python 开发软类型系统的关键挑战是将分析扩展到对象和模块,并适应 Python 极其动态的执行环境,该环境允许在运行时修改类和实例。

CNRI 的初步工作证明了类型分析对于提高 JPython 程序性能的价值。Hugunin [Hugunin2] 证明了 JPython 的性能提高了三个数量级。

程序分析和配置管理

我们将通过一系列工具来增强基本编程环境,这些工具可以帮助用户理解大型程序,以便他们能够自定义和修改程序;以及管理软件的安装和配置,以便他们能够在不破坏修改的情况下升级软件。我们还将开发和扩展工具,以构建底层软件组件和脚本语言之间的接口,这将使用户能够更好地控制底层组件。

重要的是,这些面向初学者的程序分析工具要易于使用,并且能够在需要详细了解分析如何进行的情况下理解分析结果。同时,我们努力使我们的工具对专家来说也足够强大——它们应该能够随着用户对工具的熟悉程度提高而适应更高的专家水平,并且应该能够处理大型程序。一个可以有效地应用于,例如,Netscape 浏览器源代码的分析工具,比一个只能在小型示例程序上运行良好的工具更有用。

我们专注于相对缺乏经验的程序员,这要求我们的工具包含出色的可视化模块,这些模块可以向用户展示已发现的设计,而不会导致信息过载。例如,当前的可视化工具通常缺乏“常识”,并且会盲目地生成由无数重复的相似子结构组成的大型树状或图形图,这些图跨越许多页面;这种效果会导致用户只见树木,不见森林。

我们计划最初专注于使用 Python 程序的工具。但是,我们期望开发的大多数程序分析技术本质上与所使用的语言无关。我们还将研究跨越语言边界的工具的使用,以便用户可以考虑脚本级别的更改对用 C 或 Java 编写的底层组件的影响。

程序分析工具将通过识别静态程序组件之间的关系来帮助用户理解程序的总体结构。这种分析工具的一个例子是 Womble,它从 Java 字节码中提取对象模型 [Jackson]。Womble 直接从源代码(或目标代码)而不是从正式规范中提取对象模型。因为这种方法不依赖于正式规范(例如 UML 模型)的存在,所以我们相信它更容易被普通用户接受。类似的方法可以用于分析 Python 程序,尽管 Python 的动态类型和“一等”函数和类带来了重大挑战。

我们还将研究程序切片 [Tip] 和程序路径 [Ball] 作为帮助用户了解在哪里进行更改以及这些更改将产生什么影响的技术。切片是一种众所周知的技术,用于识别影响特定变量的程序子集。通过程序路径进行的分析显示了代码主体中各种可能的执行路径。每种技术都对测试和调试程序有价值。两个挑战是将这些技术应用于跨语言边界,以及识别代码中隐含的但类型系统不精确表达的抽象边界。例如,Womble 认识到 Java 容器类不是应用程序对象模型的有趣部分;它仅表示使用容器的对象和包含的对象之间的关系。类似地,可以针对某些抽象边界和代码的各个方面执行程序切片。一个在不包括并发特定代码的情况下呈现程序功能方面的程序切片,可能有助于理解程序结构。(当然,并发特定代码对于理解也很重要,但可能是一个单独的问题。)

第三个工作领域是自动生成低级代码(如 C、C++ 或 Java)的脚本语言接口。由我们的合作者 David Beazley 开发的 SWIG 工具 [SWIG](请参阅下文的“协作计划”部分)帮助用户从 C 和 C++ 生成脚本语言绑定。我们将努力改进和扩展 SWIG,以提高可以完成的自动处理量,并允许用户对绑定进行更大的自定义。我们还将增强 SWIG 以生成更自然的语言绑定;例如,当字符串作为 C 程序中的函数参数传递时,它们通常由两个变量表示:一个指针和一个长度。SWIG 绑定应该自动在这两个 C 变量和一个 Python 字符串参数之间进行转换。

如果用户有权修改和自定义代码,那么当底层软件升级或系统组件被替换时,他们将面临维护这些更改的挑战。对于软件开发人员来说,版本控制已经是一个令人头疼的问题,他们必须确保他们的产品与许多操作系统和共享库兼容。用户也希望与他人(同事或亲朋好友)分享他们的自定义设置。我们将提供工具来帮助用户维护和共享程序以及对程序的修改。

我们的编程工具研究将解决的最重要的问题之一是用户可自定义性给系统配置管理带来的负担。当用户更改应用程序时,如何保证供应商对应用程序的未来更新与这些更改兼容?用户自己如何跟踪他们对应用程序所做的更改?当产品的未来版本添加了一个以前缺失的、用户已经添加的功能(以不同的形式)时会发生什么?

我们的工具将通过连续的修订来帮助用户跟踪他们所做的更改,并帮助用户在主应用程序本身被供应商修改或更新时合并他们的更改。这种方法的关键是识别每个软件版本,以及一种用于描述其属性和依赖关系的简单语言。例如,我们打算改进版本控制系统,以便它们跟踪不同抽象级别和粒度的更改,例如根据它们实现的功能而不是它们修改的源文件(或文件的一部分)来标记更改。该工具将自动识别对其他库和组件的依赖关系。我们将研究将测试框架集成到配置管理系统中的方法,以便在主应用程序升级时,用户安装的每个功能更改都将被合并和测试。

我们还将创建社区增强工具,以便更轻松地共享、集成和使用同行开发的软件。需要解决的问题包括软件包之间的依赖关系管理、易于安装(和卸载!)、应对操作系统、应用程序和库的更改、版本控制和软件包维护。必须描述和分类软件,并且必须建立用于讨论、反馈、错误报告和补丁的论坛(无论是给维护者还是来自维护者)。最重要的是,这些社区建设工具必须主要由社区本身管理;它们必须高度分布式、复制和安全。例如,用户可以共享有关各种库之间兼容性问题的信息;当与自动分发工具结合使用时,此信息可以防止导致其他应用程序无法正常工作的软件升级。

有几种现有工具试图解决其中一些或所有问题。综合 Perl 存档网络试图包含 Perl 程序员可能需要的所有 Perl 材料 [CPAN]。它是分布式的和复制的,并且使安装 Perl 模块的工作更容易(尽管并非总是足够容易)。但是,它不太适合其他类型的存档材料。在 Python 社区中,distribution-utilities 特别兴趣小组正在尝试使第三方软件的分发和安装更容易,但是它没有解决所涉及的更广泛的问题,而且,它仍然只专注于 Python 软件 [Distutils]。我们所熟悉的最雄心勃勃的相关工作是自我更新软件 [Liskov] 项目。

应用框架

我们将研究未来计算和通信方面的变化对用户控制计算机的方式的影响,以及诸如近乎无限的带宽、更易于访问功能更强大的计算机、无处不在的计算资源以及更高水平的互联网连接(即使在微型设备级别)等发展的影响。这些变化会影响用户将编写的程序类型以及这些程序将运行的计算机类型。

我们在这个领域的方法是使用实验性和原型系统来了解最终用户的可编程性应该如何暴露。随着这些技术的成熟,我们可能会将我们的经验融入到教学材料中。

许多非程序员开始编写在特定领域和应用程序框架上下文中使用的的小程序。电子表格可能是有限环境中编程的最佳示例。它提供了一种专门针对操作数字数据表的有限语言。该应用程序提供了协调框架——管理显示、控制流、I/O 等——并让用户专注于特定问题。宏工具是电子表格编程套件的一部分,它有助于许多应用程序的使用,允许用户自动化重复性任务。第二个例子可以在 MS Word 宏中找到,它也是用户自定义的常见形式。

互联网已经让许多非专业人士接触到编程,尤其是在特定领域的语言(如 HTML)和动态内容语言(如 JavaScript、PHP 和 CGI)中。在这些情况下,非程序员通常也会创建适合较大上下文的小型程序,例如,Web 服务器负责管理与客户端的 TCP/IP 连接、设置用户程序运行的环境、处理错误情况以及遵守标准协议等细节。

未来,非程序员将使用大量的资讯设备。这些设备的可编程性将大大提高其用处的一个示例领域是在信息流管理中——也许更重要的是,限制信息流。一个人可能会收到来自多种媒体(文本、语音、视频)的消息,并通过 PDA、手机和计算机屏幕等多种设备访问它们。我们期望无缝的互操作性,因此例如,可以使用手机跟进电子邮件,通过语音回复而无需查找号码。小型程序可用于自定义这些设备上的接口,并过滤和限制通过它们的消息流。

一些示例包括

  • 尝试几个不同的电话号码来联系某人,可能取决于一天中的时间或一周中的一天。
  • 当您不想被打扰时,将呼入电话转接到语音邮件或电子邮件,但仍然让重要电话通过。
  • 接听电话时降低电视或收音机的音量。
  • 记录某些电话的副本,可能通过调用语音到文本转换器。
  • 限制作为电子商务交易的一部分传输到商店或公司的个人信息量。
这些接口特性中的每一个都可能被特定设备的设计者所考虑。然而,功能丰富的界面更难使用,因此设计者可能会有意限制界面。此外,有创造力的用户总是会想到设计者忽略的功能。允许最终用户进行编程和定制,可以让用户根据自己的特定需求调整设备。

这些例子表明了编程范围中一个重要的模式:用户将在系统的计算模型和软件框架的上下文中定制应用程序和设备。因此,我们的探索将着重于如何模块化应用程序,并组织这些模块,以便用户可以添加他们想要的小功能,而不必关心整个系统的运行。

在应用程序框架或嵌入式设备的上下文中,授权非程序员修改和定制软件的关键目标之一是减少理解修改如何融入更大程序所需的认知负荷。即使对于刚接触应用程序代码库的经验丰富的程序员来说也是如此。应用程序必须是模块化的,并提供足够的高级抽象,以便可以快速且独立地理解它们的组成部分。这可以让人们主要关注需要更改的部分。在我们的方法中,我们将探索一些旨在提高软件模块化的想法。

我们打算研究现有的技术,例如面向对象编程和组件组合,作为组织软件的方法。理论上,只要接口和输入/输出语义保持不变,交换一个黑盒组件以实现不同的功能会容易得多。但在现实中,编写独立于系统其余部分的类和组件目前非常困难。我们还将探索新的概念,例如面向方面编程 [AOP],这是一种基于横切关注点来模块化软件的新方法。也许这些技术的某种组合,或新的模块化技术将会证明是有效的,例如,将每个函数组织为组件的一个方面。

社区建设

除了与选定的合作伙伴合作外,我们还将寻求广大社区的参与。我们将通过网站分享开发的课程和软件的原型,并通过新闻组和邮件列表等多种渠道征求对这些材料的反馈。CNRI 在通过网络和其他方式进行社区参与方面拥有丰富的经验。例如,Python 社区的关键焦点是 Python 网站 [Python],该网站还托管许多与 Python 相关的邮件列表;数字图书馆社区的一个重要焦点是 D-Lib 网站 [D-Lib]。这两个网站都由 CNRI 运营。现有的 Python 社区已经对 CP4E 提案表现出浓厚的兴趣,我们预计这将是启动 CP4E 项目社区活动的理想场所。

这种明确的社区参与机制将极大地有利于我们的研究,并让社区从我们的研究中获得最大的收益。早期和大规模的社区参与对我们研究的好处将包括:志愿者帮助“试驾”我们的课程和软件原型;社区成员为特定目标受众或教授特定技能或主题而开发的新课程;现有课程的本地化版本、翻译等;新的或修改的示例(您永远不会嫌示例太多,而且为特定受众量身定制的示例更有效);由我们课程的学生使用我们的程序开发软件开发的新应用程序;等等。在 Python 社区中,我们收到了许多此类贡献(包括关键文档的完整外语翻译),完全是不请自来的!

社区的好处包括提前访问新课程和软件,以及帮助教师进行教学并说服他们的管理层让所有学生(而不是那些成绩优秀的学生)学习计算机编程的重要性。我们还期望拟议的社区设施将在社区成员中培养大量的自给自足能力。例如,在合作辅导项目中,需要辅导的学生将在网上找到志愿者辅导员(通常是更高级的其他学生),教师将能够直接交流他们的经验。这种辅导活动已经在 Python 社区中发生,并将有助于减轻我们的研究团队因反复回答简单问题而造成的负担。

本着“大众计算机素养”和开源运动 [OpenSource] 的精神,我们的网站将广泛且免费地提供课程和软件。除了网站之外,我们还将创建和维护一个或多个带有存档的邮件列表,以及可能为用户提供的“聊天”服务。我们将积极参与邮件列表,以培养社区,并收集和分析社区通过这些(和其他)渠道向我们提供的反馈。

很明显,我们认为社区参与对于该项目的成功至关重要。因此,我们希望超越典型的网站设置。我们计划为教师、学生和程序员创建一个自动存档站点,该站点可用于交换课程笔记、示例、有用的软件等。我们还计划开发原型软件,以帮助用户维护本地开发和下载的软件程序包在多台计算机上的一致集合。预期的扩展、升级、补丁、最终用户修改等的频繁交换,将导致使用现有实践的版本控制问题成为一场噩梦。这在上面的“共享和维护”小节中有所阐述。

合作计划

我们将在项目中加入一定程度的计划合作,与其他学术和非学术机构合作,以确保研究的成功。特别是,我们建议将一些活动分包给卡内基梅隆大学和芝加哥大学的团队。卡内基梅隆大学的 Alice 团队已成功将 Python 作为其流行的虚拟现实软件的最终用户编程语言;芝加哥大学在计算机科学课程开发方面拥有丰富的经验和兴趣。我们还计划与其他人进行非正式的合作,并在可行的情况下向其他人开放参与。

卡内基梅隆大学

Alice 团队 [Alice] [Pausch] 在 Randy Pausch 教授的领导下,为 Windows 开发价格合理的 3D 图形和虚拟现实软件,最初在弗吉尼亚大学,现在在卡内基梅隆大学。他们将 Python 用于最终用户编程以及其系统的大部分实现(除了渲染引擎之外几乎所有部分)。他们可能拥有最广泛和记录最完善的案例研究,即将 Python 编程(尽管是在有限的领域内)教授给没有编程经验的用户,并且他们对 Python 的热情极大地鼓励我们考虑在通用编程课程中使用 Python。他们也是唯一将可用性测试应用于编程语言和应用程序编程接口的团队之一。

我们计划为 Alice 团队提供有限的资金,以互利的方式继续这部分研究。我们期望从他们教授 Python 给新手用户的经验、他们构建到 Alice 系统中的简单但有效的编程工具以及他们在用户测试方面的熟练程度中获益——这对于我们计划开发的教程和软件都非常重要。他们将从我们的教程(为 Alice 用户提供更广泛的软件开发指导)以及我们的软件(更强大的程序构建工具)中获益。

芝加哥大学

芝加哥大学可以在两个核心领域为 CP4E 研究工作做出贡献:课程开发和软件开发工具。我们还计划与芝加哥大学实验室学校合作,这是一所由芝加哥大学运营的私立 K-12 学校。我们在芝加哥大学的联络人是经验丰富的 Python 用户 David Beazley 教授。我们计划为芝加哥大学提供有限的课程开发资金。这将对我们有利,因为他们对教学有兴趣和经验;他们的好处是使用一种更优秀的编程语言和工具。

当地学校

最后,我们计划直接与选定的当地学校合作“试驾”开发的材料。与当地学校合作可以定期与教师和学生进行面对面的会议;我们认为这对于评估我们的原型课程和软件至关重要。弗吉尼亚州阿灵顿县的约克镇高中已经对该提案表示出兴趣 [Yorktown]。

另一个可能的候选学校是托马斯杰斐逊科技高中,这是一所弗吉尼亚州费尔法克斯县的公立磁铁学校,该学校已经为优秀学生提供计算机科学课程 [TJHSST]。在本项目的过程中,我们将联系马里兰州、弗吉尼亚州和哥伦比亚特区的其他当地学校进行合作。

其他研究小组

我们还计划与正在为未来开发个人计算硬件和软件(“普适计算”项目)的学术和其他研究小组进行非正式合作;这些项目都设想了某种形式的最终用户可编程性。此类项目的一些示例包括麻省理工学院的 Project Oxygen [Dertouzos]、Xerox PARC 和华盛顿大学的 Portolano/Workscape [Portolano] 以及卡内基梅隆大学的 Invisible Computing。

我们期望这种合作的主要好处是我们的技术能够在先进系统中尽早部署,而他们的好处是他们正在开发的系统可以改进最终用户可编程性。请注意,这里的时间安排非常好:例如,在 Project Oxygen 中设想的个人嵌入式系统的广泛部署预计将在我们的课程和软件可以广泛使用的大致同一时间左右。

与其他研究的比较

ABC。Python 的前身 ABC 是在 80 年代早期被设计为一种教学语言。它的座右铭是“消灭 Basic”——这承认了当时非专业人士使用的主要语言竞争对手。ABC 的设计者在向新手教授 “经典” 编程语言(如 ALGOL)方面拥有丰富的经验。他们发现,学生经常被计算机语言的偶然细节(例如运行编译器、处理不同的数字格式、神秘的 I/O 操作和底层内存管理)所淹没,以至于他们从未能够专注于良好的程序和算法设计的基本要素。

为了克服这种影响,ABC 的设计者回到了第一性原理。他们着手设计一种语言和该语言的环境,以便处理所有这些偶然细节,从而让学生有更多的时间学习编程的基本要素,而无需考虑手头的编程语言,例如清晰的控制流程和强大的数据结构,并专注于程序的优雅表达。他们提出了新的语言设计和新术语,这些术语与计算机科学家和程序员之间当时(以及现在仍然是)流行的做法截然不同。事实上,ABC 没有像预期那样产生重大影响的最大原因可能在于,他们偏离了当前的实践太多。那些可以访问运行 ABC 所需硬件的人(最初它只在 Unix 系统上运行,尽管后来被移植到 Mac 和 PC)通常是有经验的计算机用户,他们感到沮丧,因为 ABC 没有像其他应用程序一样“使用相同的语言”。

大约十年后,Python 在这种挫败感中诞生。它与 ABC 一样,专注于表达的优雅性、编程基础知识和消除偶然因素,但增加了面向对象、可扩展性以及一个强大的模块库,该模块库通过多种不同的机制(共享文件、程序嵌入、CORBA 或 COM 等 RPC 接口以及网络协议(支持 Internet 上常用的所有协议))与其它应用程序进行接口。

Logo。实际上是与 Lisp 相关的一系列语言,主要在麻省理工学院开发,Logo 当然是最著名的儿童编程语言。它拥有丰富的传统、在学校的强大根基以及许多商业产品。麻省理工学院媒体实验室的认知论和学习小组正在进行持续的研究,例如“可编程砖块”(与乐高合作)。

Logo 和我们的提议之间的关键区别在于,我们认为数百万(业余)程序员将一起开发开源软件——Logo 似乎满足于向年幼的儿童教授有限的编程技能,对于他们来说,计算机编程主要是训练他们进行抽象思维的一种方式。Logo 在现实世界的软件开发中的适用性也有限。

LogoMation。一家名为 Magic Square 的公司销售 LogoMation,一种与 Logo 相似的语言,同样强调海龟绘图。它附带一份非常适合 8 岁及以上儿童的优秀教程。LogoMation 的语法与 Python 相似(比 Logo 的语法更相似);这表明我们使用 Python 是走对了路。

但是,像 Logo 一样,LogoMation 在其提供的成长路径方面是有限的。它没有直接解决“下一步做什么”的问题,而是期望其用户转到其他编程语言进行实际工作。

Alice。Alice 网站上的评价清楚地表明,Alice 在向儿童以及没有计算机经验的成年人教授编程方面取得了成功。它还表明了“有趣”环境的重要性(并且 Alice 的 3D 图形比 Logo 的海龟图形更具吸引力)。Alice 还为我们提供了一些关于如何改进 Python 的提示:例如,他们的经验表明,Python 的大小写敏感性是一个问题。

但是,Alice 项目的重点是 3D 图形——Alice 教程实际上并没有教授太多的程序或数据结构技术。虽然我们同意 3D 图形是吸引和保持年轻观众的绝佳方式,但我们更感兴趣的是教授一般的编程,而不仅仅是图形。因此,我们初期工作的重点将是开发一个编程环境和教程,其中 3D 图形只是计算机的可能用途之一。

DrScheme。莱斯大学的 TeachScheme! 项目 [TeachScheme] 旨在开发一种基于 Scheme 编程语言的新的入门计算课程。莱斯大学工作的一个核心部分是开发 DrScheme [Findler],这是一种针对初学者的编程环境。TeachScheme 的重点是相对狭窄的受众——那些具有扎实高中代数基础并有兴趣学习计算及其在科学问题中的应用的大学生。我们设想一个更广泛的受众,他们不具备强大的数学背景和对科学问题的兴趣。我们还认为,对于大众受众来说,Scheme 这种擅长为教学目的揭示计算基本构建模块的语言是不合适的。

然而,值得注意的是,TeachScheme 项目的关键部分之一是开发环境。虽然受众和方法不同,但我们的项目和 TeachScheme 都认为开发环境是一个至关重要的组成部分。需要一个交互式的读取-求值-打印循环、一个强大的调试器以及理解程序如何工作的工具。

设施

我们将使用 CNRI 现有的计算基础设施来开发和分发拟议的材料,并辅以专门为该项目购买的桌面工作站和 Web 服务器。我们将使用 Internet 和万维网来分发所有材料。

主要人员名单

Guido van Rossum 将在 CNRI 领导这项工作。他是 CNRI 的小组负责人,也是 Python 的创建者,他仍然是 Python 的主要开发者。他还是 Knowbot 移动代理系统的首席设计师。过去,他曾从事 ABC(一种为教学目的而开发的编程语言)和 Amoeba(一种在 80 年代开发的著名的分布式操作系统)的工作。他拥有阿姆斯特丹大学的数学和计算机科学硕士学位。

Jeremy Hylton 是 CNRI 技术人员的高级成员。他是 Knowbot 移动代理系统的设计者之一,并且设计和实施了多个基于代理的信息管理应用程序。他于 1996 年获得了麻省理工学院的电气工程和计算机科学硕士学位以及计算机科学和工程学士学位。

Barry Warsaw 是 CNRI 技术人员的高级成员。他曾为包括应用程序网关系统、Knowbot 操作系统和 JPython 在内的多个 CNRI 项目做出贡献。他为 Python 语言的开发和 Grail Internet 浏览器做出了贡献。他于 1984 年获得了马里兰大学的计算机科学学士学位。在加入 CNRI 之前,他曾在 1980 年至 1990 年期间在美国国家标准与技术研究院从事机器人系统操作员接口的工作,并在 1990 年至 1994 年期间在美国国家医学图书馆从事医学数据库信息技术的工作。

工作说明

CNRI 将执行以下工作

  • 开发用于 Python 的原型编程环境,包括适用于新手使用的程序分析和管理工具。
  • 开发一个原型教程,使用上述编程环境,向非程序员(尤其是在高中或大学)教授 Python 编程。
  • 开发针对上述受众的示例软件;例如,一个允许操作第三方 3D 游戏环境的 Python 扩展。
  • 建立和维护一个网站和邮件列表,以推广上述软件和教程并征求反馈。
  • 与选定的高中和大学合作。
  • 进行小规模的教学和用户测试工作。
  • 从用户、学生和教师那里收集有关上述软件和教程的反馈,并使用这些反馈来改进软件和教程。还可以使用它来改进 Python 语言本身,或者提出更好的语言。
  • 发布一份最终报告,记录研究、经验教训、研究结果以及建议的后续研究。
卡内基梅隆大学的 Alice 小组将执行以下工作
  • 将 CNRI 开发的工具集成到 Alice 中。
  • 对 CNRI 开发的工具和教程进行用户测试。
芝加哥大学将执行以下工作
  • 与 CNRI 合作,将 CNRI 开发的教程开发成适合高中使用的计算机科学课程,并分别开发成适合大学非计算机科学本科生使用的计算机科学课程。
  • 使用开发的课程进行授课,以便提供反馈。
为了最大限度地访问所产生的材料,为本项目制作的所有软件、教育材料和报告都将在万维网上免费作为开源材料提供。

时间表

我们设想了以下工作时间表

  • 第 1 年。CNRI 的初步研究:开发初始原型编程环境;设计程序分析和测量工具;开发第一版教程;与其它研究人员和感兴趣的教师建立联系。
  • 第 2 年:在 CNRI:初步实现程序分析和测量工具;收集来自第一个软件和教程体验的反馈。在 CMU:开始将 CNRI 开发的工具集成到 Alice 中,并开始用户测试。在芝加哥大学:开始为高中生和大学生开发课程。
  • 第 3 年:继续上述活动。此外,在 CNRI:将第一个程序分析和测量工具集成到编程环境中;小规模推出增强的编程环境;开发初始示例应用程序;定义成功的评估标准。在 CMU:对程序分析工具进行用户测试。在芝加哥大学:将程序分析工具的使用集成到课程中。
  • 第 4 年:继续上述活动,完成大部分活动。此外,在 CNRI:大规模推出增强的编程环境;改进示例应用程序;开始大规模收集最终用户反馈;开始研究 Python 语言的更改。在 CMU:完成用户测试,集成到 Alice 中。在芝加哥大学:完成并推出课程。
  • 第 5 年:项目完成:报告经验,评估成功,将技术转让给教育界和工业界。
可选任务

提案中没有可选任务。

参考文献

[ABC]

http://www.cwi.nl/~steven/abc/ [Ball] Thomas Ball 和 James R. Larus,《程序跟随路径》。微软研究院技术报告 MSR-TR-99-01,1999 年 1 月。 [Alice] http://www.alice.org/ [AOP] Gregor Kiczales、John Lamping、Anurag Mendhekar、Chris Maeda、Cristina Videira Lopes、Jean-Marc Loingtier 和 John Irwin。面向方面的编程。
欧洲面向对象编程会议(ECOOP)的论文集,芬兰。施普林格出版社 LNCS 1241。1997 年 6 月。

http://www.parc.xerox.com/spl/projects/aop/

[Blair] http://www.mbhs.edu/ [Cartwright] Robert Cartwright 和 Matthias Felleisen。 通过软类型进行程序验证。 ACM Computing Surveys,1996年6月,28(2): 349-351。 [CPAN] http://www.cpan.org/ [Dertouzos] Michael L. Dertouzos。 计算的未来。科学美国人,1999年8月。 [Distutils] https://pythonlang.cn/sigs/distutils-sig/ [D-Lib] http://www.dlib.org/ [Findler] Robert Bruce Findler,Cormac Flanagan,Matthew Flatt,Shriram Krishnamurthi 和 Matthias Felleisen。 DrScheme:一个用于 Scheme 的教学编程环境。载于1997年编程语言:实现,逻辑和程序研讨会论文集,英国南安普顿,1997年9月。(计算机科学讲义,第1292卷。) [Fishtank] http://el.www.media.mit.edu/groups/el/projects/fishtank/ [Flanagan] Cormac Flanagan 和 Matthias Felleisen。基于组件的集合分析。 ACM 编程语言和系统汇刊,即将发表。 [Geurts] Leo Geurts,Lambert Meertens,Steven Pemberton。ABC 程序员手册。 Prentice-Hall,1990年。 [Hugunin1] Jim Hugunin。 Python 和 Java - 两全其美。 载于第六届国际 Python 会议论文集,加利福尼亚州圣何塞,1997年10月,第11-20页。 [Hugunin2] Jim Hugunin。 JPython 更新。特邀演讲,第七届国际 Python 会议。德克萨斯州休斯顿,1998年11月。PowerPoint 幻灯片:http://www.jpython.org/jpython-talk-1.ppt [Jackson] Daniel Jackson 和 Allison Waingold。 从字节码中轻量级提取对象模型。 载于1999年5月在加利福尼亚州洛杉矶举行的国际软件工程会议论文集。 [JPython] http://www.jpython.org/ [Knowbots] http://www.cnri.reston.va.us/home/koe/ [Liskov] http://sdg.lcs.mit.edu/~dnj/research/self-updating.html [Logo] http://el.www.media.mit.edu/groups/logo-foundation/ [LogoMation] http://www.magicsquare.com/LM2/ [Lutz] Mark Lutz。 Python 编程。O'Reilly,1996年。 [Mozilla] http://www.mozilla.org/ [Mailman] http://www.list.org/ [Ousterhout] John K. Ousterhout。 脚本:21世纪的高级编程。IEEE 计算机,1998年3月。 [Papert] 思想风暴:儿童,计算机和强大的想法。纽约:基础书籍,1980年。 [Pausch] Randy Pausch,Tommy Burnette,A.C. Capeheart,Matthew Conway,Dennis Cosgrove,Rob DeLine,Jim Durbin,Rich Gossweiler,Shuichi Koga,Jeff White。 Alice:虚拟现实的快速原型系统IEEE 计算机图形学和应用,1995年5月。 [Portolano] http://www.cs.washington.edu/research/projects/portolano/ [Python] https://pythonlang.cn/ [SWIG] http://www.swig.org/ [Tip] Frank Tip。 程序切片技术概述。 编程语言杂志,3(3):121-189,1995年9月。 [TeachScheme] http://www.cs.rice.edu/CS/PLT/Teaching/ [TJHSST] http://www.tjhsst.edu/ [Yorktown] http://yhspatriot.yorktown.arlington.k12.va.us/ [Watters] Aaron Watters,Guido van Rossum,Jim Ahlstrom。使用 Python 进行互联网编程。 MIS Press/Henry Holt,1996年。 [Wright] Andrew K. WrightRobert Cartwright Scheme 的实用软类型系统。 ACM 编程语言和系统汇刊,1997年1月,19(1): 87-152。