为大众设计计算机编程
为大众设计计算机编程
这是我们于 1999 年 8 月提交给 DARPA 的修订后的资助提案文本。3 月份,我们得知 DARPA 至少接受了该提案的早期版本;这项工作于 1999 年底开始,有望持续两年,尽管我们只收到了第一年(截止 2000 年 10 月)的资助。我们对剩下的部分抱有希望。
不幸的是,Python 开发团队迁往其他雇主,这意味着我们未能完成 CNRI 的 CP4E 项目。这次搬迁很大程度上是由于 DARPA 为 CP4E 提供的资金少得令人失望。
该项目现在处于停滞状态;IDLE 仍在开发中,但我们没有积极追求 CP4E 的其他目标。不过,其他人正在这样做;这通常在 EDU-SIG 邮件列表中讨论。
注意:我对提案文本做了一处修改:应其他语言一些支持者的要求,我撤回了一份语言比较表,该表包含对其他语言高度个人化且有时毫无根据的看法。该表被断章取义地使用,导致一些人认为 objectionable。(并非所有表格内容都有争议,但在没有更多文档的情况下,似乎更明智的做法是不要进行直接的语言比较。)
我还从文本中删除了一些行政细节,并进行了一些细微修改以适应 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
国家研究计划公司
1895 Preston White Drive, Suite 100
Reston, VA 20191-5434
电话:(703) 620-8990
传真:(703) 620-0913
电子邮件:guido@cnri.reston.va.us
在七十年代,施乐帕洛阿尔托研究中心(Xerox PARC)提出了一个问题:“我们能否让每个办公桌上都有一台电脑?”现在我们知道这是可能的,但这些电脑不一定赋能了它们的用户。今天的电脑往往不灵活:普通电脑用户通常只能通过“向导”(一个对预设对话框的崇高称呼)配置有限的一组选项,而其他一切都依赖于专家程序员。
我们提出了一个后续问题:“如果用户可以编程自己的电脑,会发生什么?”我们期待一个未来,每个电脑用户都能“打开”他们的电脑,并改进其中的应用程序。我们相信这将最终从根本上改变软件和软件开发工具的性质。
我们将大规模读写软件的能力与大规模识字率相比较,并预测对社会产生同样普遍的影响。硬件现在足够快且便宜,使得大规模计算机教育成为可能:当大多数计算机用户掌握创建和修改软件的知识和能力时,下一个重大变化将会发生。
开源运动声称,数千人的同行评审可以大大提高软件质量。Linux 的成功证明了这一主张的价值。我们相信,拥有数百万(或数十亿)程序员的下一步将带来不同质量的变化——个性化软件的丰富可用性。
这种看待编程的新方式所需的工具将不同于专业程序员当前可用的工具。我们打算大力改进可用的培训材料和开发工具。例如,非专业程序员不应该担心一个小错误可能会破坏他们的工作或使他们的计算机无法使用。他们还需要更好的工具来帮助他们理解程序的结构,无论是源代码中明确的还是隐含的。
我们的计划包含三个组成部分
- 开发一套适合高中生和大学生的新计算课程。
- 创建更好、更易于使用的程序开发和分析工具。
- 围绕上述所有内容建立一个用户社区,鼓励反馈和自助。
我们打算从 Python 开始,这是一种为快速开发而设计的语言。我们相信 Python 是一种很好的第一门学习语言:与专门为初学者设计的语言不同,Python 也是许多专业程序员的选择。它拥有一个活跃且不断增长的用户社区,该社区已经对这份提案表达了浓厚的兴趣,我们预计这将成为我们提议创建的教学材料和工具的肥沃的首次部署之地。在研究过程中,我们将评估 Python 并提出改进或替代方案。
CNRI 提议开展一项名为人人学编程 (CP4E) 的研究工作。这项工作旨在改善计算机使用现状,不是通过引入新硬件,也不是(主要)通过新软件,而只是通过*赋能所有用户*成为计算机程序员。
计算机和通信硬件的最新发展使许多人能够使用功能强大的计算机,包括台式机、笔记本电脑和嵌入式系统。是时候通过教育和支持软件让这些用户对他们的计算机拥有更多控制权了。如果用户对计算机有软件设计和实现层面的总体理解,这将导致生产力和创造力的大幅提升,其深远影响难以预料或想象。
短期来看,可用计算机软件的数量和质量将大幅提高,因为数百万人的想象力和劳动将被投入到这个问题中。富有创造力的用户将能够改进支持他们完成任务的软件,并与他们的同事分享改进——或者通过互联网——与面临相同任务和问题的远方其他人分享。在危机情况下,当专家无法提供帮助时,修改或定制软件的能力至关重要。对于日常活动也很重要:目前一些人估计未填补的编程职位数量在 20 万到 40 万之间。
两大主要研究目标是开发一套新的*编程课程*原型,以及一套高度用户友好的*编程环境*匹配软件原型。我们设想典型的目标受众将包括高中生和(非计算机科学专业)大学本科生,尽管也会考虑更年轻的学生和成年人。课程和软件通常会一起使用,因此它们应该紧密协调;每个都也可以独立使用。
我们还将探讨编程在未来的作用。我们正迅速进入一个信息家电、可穿戴计算机以及日常物品中深度联网的嵌入式 CPU 为用户提供对其物理和信息环境控制权的时代。终端用户可编程性将是释放这些技术潜力的关键。(这是 DARPA 信息技术远征队的共同主题,参见 [Dertouzos]。)
这项研究工作不会孤立进行。我们将与学术研究团体以及几所领先高中合作。我们还将通过在互联网上免费提供我们的课程材料和软件来建立一个更大的社区。
我们计划从基于 Python 开始,这是一种流行的免费解释型面向对象语言 [Python] [Lutz] [Watters]。Python 最初在阿姆斯特丹 CWI 开发,目前由 CNRI 开发和维护。Python 非常适合教学目的,而不仅仅是“玩具”语言:它作为一种快速应用程序开发语言,在计算机专业人士中非常受欢迎。Python 结合了多种主要编程范式(过程式、函数式和面向对象),语法优雅,易于阅读、学习和使用。虽然我们相信 Python 是一个好的起点,但无疑我们会发现改进的可能性。作为我们研究的一部分,我们将评估 Python 在教育和初学者使用方面的有效性,并设计改进或替代方案。
我们预计我们的研究成果将在两年内展示出来,并在十年内影响整个社会。届时,在高中学习我们的课程的儿童将开始加入劳动力(和军队)。我们预计上述新的移动和嵌入式计算和通信技术将在同一时间成熟。因此,我们的时间线匹配得很好。
在蒙昧时代,只有那些有权势或巨额财富的人(以及少数选定的专家)才拥有读写能力或获取读写能力的能力。可以说,普通民众的识字率(虽然仍未达到 100%),加上印刷技术的发明,是现代历史上最具解放意义的力量之一。
我们最近才进入信息时代,预计计算机和通信技术很快将取代印刷成为信息传播的主要形式。大约一半的美国家庭已经拥有一台或多台个人电脑,而且这个数字仍在增长。
然而,尽管现在许多人使用电脑,但很少有人是电脑程序员。非程序员在使用电脑方面并未真正“获得赋能”:他们只能以“程序员”为他们设定的方式使用应用程序。无需远见卓识便可看到其中的局限性。
一个更根本性的变化是将计算和通信嵌入到家庭和办公系统中。预计未来几年,包含可编程元素的设备数量将急剧增长。我们必须学习如何以有意义的方式向用户展示这种可编程性,并使非程序员能够轻松控制和编程这些设备。
在这次“未来探险”中,我们想探讨这样一个概念:几乎每个人都可以在学校获得*某种程度*的计算机编程技能,就像他们可以学习读写一样。
对于大众使用的编程语言和环境来说,存在许多挑战。如果每个人都是程序员,那么糟糕的程序员肯定会层出不穷。要充分应对这种情况,需要重新思考编程语言和开发工具的基本特性。然而,我们认为专业人士使用的工具和用于教育的工具之间不应该有明确的界限——就像专业作家使用与他们的读者相同的语言和字母表一样!
鉴于计算机和软件在社会各个方面的日益普及,我们预计对编程技能的需求只会增加。虽然大多数高质量软件将由专业人士生产,但终端用户将需要更多的编程和可定制性。
这种对灵活性的追求在当今的计算及其可能的未来中都可以看到实例
- 日益强大的桌面和笔记本电脑应用程序使用脚本和宏功能。
- 互联网的增长直接导致了对可编程性的更大需求,以创建活跃和交互式的 Web 内容。
- 终端用户信息设备和嵌入日常物品中的 CPU 网络——两者都将需要用户控制和个性化。
- 移动和智能软件代理将变得司空见惯,并需要用户进行定制。
在未来,我们设想计算机编程将在小学教授,就像阅读、写作和算术一样。我们真正指的是计算机*编程*——而不仅仅是计算机使用(这已经在教授)。例如,Logo 项目 [Papert][Logo] 表明,年幼的孩子可以从计算机教育中受益。当然,大多数孩子不会成长为熟练的应用程序开发人员,就像大多数人不会成为专业作家一样——但读写技能对每个人都有用,因此(在我们的愿景中)通用编程技能也将如此。目前,我们将目标设定得不那么雄心勃勃。我们专注于向高中生和(非计算机科学专业)大学本科生教授编程。如果我们在这一点上成功,我们预计较低年级将很快跟进,在他们能力范围内。
除了教授计算机工作原理的目标之外,计算机编程课程还将重新强调逻辑思维,这曾经是教授几何的主要益处。
两个特别引人关注的通用计算趋势是向信息设备的转变以及日常机器和设备(无论是军事还是民用领域)中嵌入式 CPU 的增长。计算尺寸的缩小和网络(尤其是无线网络)覆盖范围的扩大使得设备之间共享信息和进行交互成为可能。编程能力将极大地提高用户控制这些设备的能力。想象一下,用户可以对例如他们的 GPS 接收器或手持记事本中嵌入的软件进行自己的更改,而不是(或除了)从供应商下载升级或从第三方购买“现成”的附加应用程序。这将极大地赋能人们通过编程他们的个人工具来精确地完成他们需要它们做的事情来改善他们的生活。
如果成功,非专家将能够更有效地使用他们的计算机和其他智能设备,从而减少挫败感,提高生产力和工作满意度。(新的休闲可能性也无疑会随之而来!)计算机用户将能够更频繁地解决他们自己的计算机问题,从而减少对技术支持的需求。
即使大多数用户不经常编程,对编程和软件结构的熟悉也会使他们更有效地使用计算机。例如,当出现问题时,他们将能够更好地构建可能失败的心理模型,这将使他们能够修复或解决问题。他们还将能够更好地评估何时可以自行更改,以及何时需要专家服务。他们将能够更好地与专家交流,因为他们现在将拥有更多的共同语言。一个类比是获得汽车维修的基本知识:你了解足够的知识来检查你的机油并在必要时添加几夸脱,但你也知道你不应该尝试自己更换刹车。当机械师说“你的转子变形了,你需要新的刹车片”时,你明白他在说什么。
如果这项工作成功,最终可能会有数百万甚至数十亿的程序员,掌握不同熟练程度的技能。这将对软件开发现状产生的影响难以想象。软件的性质将发生变化,以适应这些程序员的需求,允许通过源代码修改进行定制——个性化将变得非常普遍。
这项工作还可能对吸引女性和少数族裔进入计算机编程领域产生重大影响——目前,这些群体在这一领域的人数严重不足。
最近流行的开源运动 [OpenSource] 承诺通过数千人的同行评审,以及程序员“挠自己的痒痒”(即以只有个人关心的小方式调整软件)的能力来提高关键软件包的质量。我们预计,从数千名程序员增加到数百万或数十亿名程序员将进一步改变软件开发过程的性质。个人编程在这种规模下将变得更加重要(和可行),而大规模同行评审将相对不那么重要,因为收益递减(整合数千个来源的错误修复的后勤工作已经是一项艰巨的任务)。但大多数现有软件,无论是开源还是其他,都过于复杂,无法让任何人在不投入大量精力和时间来理解他们正在使用的软件的情况下进行个人定制。我们对整个软件开发过程的改变也感兴趣,这将解决这个问题——特别是开发工具。
此外,通过使任何人都能对应用程序进行编程,我们将利用规模经济,同时不牺牲用户对高度个性化软件的渴望。应用程序可以大规模生产,而无需强迫每个人在使用软件时都适应相同的模式(或仅仅适应开发人员计划的可定制性范围)。用户会出于多种原因希望个性化他们的系统;这些原因包括提高生产力、解决他们特有的问题,或者仅仅是表达他们的创造力并使自己与众不同。如果他们拥有我们所设想的基本编程素养,他们将能够实现这一点。
一些宽泛的问题有助于我们明确具体的研究目标,例如:学校教授的编程语言会与我们今天所知的编程语言相似吗?它甚至还会被称为编程语言吗?我们将如何教授它?会只有一种语言吗?还有哪些其他工具对于教授和使用这种语言至关重要?是否有可能拥有一种既适合教学又对专家有用的语言和工具?
同样有趣的问题是:人们将如何以及出于何种目的使用他们的编程技能?近乎普遍的读写计算机程序的能力将如何改变计算机软件的结构和实用性?(这与未来版本的互联网结合起来尤其有趣,后者承诺高速、无处不在地访问计算和存储元素。)一旦人们确信自己能够编程,他们是否会被激励去实际编程他们的系统?他们最初会感兴趣吗?
一个明显的担忧是,如果大多数人都是程序员,那么他们中的许多人很可能都是*糟糕的*程序员。那些无法用母语写出可理解的句子或平衡支票簿的人,也不太可能写出结构良好的计算机程序!然而,我们的目的是让编程对每个人都 accessible,即使不 easy。一些用户会雇用或委托第三方编程和定制服务。这就像房主承包改造工作一样。
因此,我们需要研究如何改善程序员与系统之间的交互质量,以帮助即使是糟糕的程序员也能充分利用他们的计算机。例如,您可能想编写一个程序来定制您的 PDA 或烤面包机,但如果一个微小的错误可能会擦除您的地址簿或点燃您的房子,您可能会感到气馁。需要防灾措施,以及撤销对整个系统不需要的更改的方法。(“撤销”虽然非常强大,但通常只适用于一个文件。撤销对不需要的全局系统更改通常需要重新启动,甚至痛苦地从备份介质恢复数据。)
另一个担忧是配置管理。如果没有出色的配置管理,企业将发现自己要么无法纠正问题,要么被程序员挟持,这些程序员以阻止升级或进行其他更改的方式修改了操作系统或应用程序。一般来说,目前对大型软件系统的所有本地更改都有可能与主要产品未来的升级不兼容。即使是本地生产的软件,当主要开发人员离职时,也可能因缺乏测试或文档等多种原因而无法使用。
除了担心可能出错之外,对于有兴趣定制计算机的初学者程序员来说,理解一个庞大的现有软件也是一项艰巨的任务。我们需要研究用户友好的程序分析工具;稍后将详细介绍。另一个智力挑战是可视化(应用程序生成)数据,以帮助新手。电子表格在这方面非常有价值,但并非所有数据都适合矩阵形式。
脚本语言在专业程序员中越来越受欢迎 [Ousterhout],但关于性能、软件重用以及与其他语言编写的组件集成的问题仍然存在。我们可以通过增强 JPython [Hugunin1] 的功能来解决这些挑战,JPython 是一种与 Java 无缝集成的 Python 方言,以及 SWIG,一个在脚本语言和 C 或 C++ 等系统语言之间创建接口的接口生成器。
众所周知,“通用”编程语言与“领域特定”语言之间存在某种二分法。在本次讨论中,我们以宽泛和宽松的意义使用“通用”一词,包括函数式编程语言,甚至可能包括逻辑编程语言,只要它们可以用作通用编程工具。图灵完备性是这里的关键概念。
领域特定类别则包含其他所有内容,从命令行参数语法到电子邮件头和 HTML。这里的区分因素是存在相对狭窄的应用领域。在这个类别中,我们还包括像微软的“向导”(实际上只是由简单流程图连接的一系列预定义对话框)以及微波炉或核反应堆上的控制器和拨盘。
领域特定语言的一个典型特性是它们在其预期应用领域提供了出色的控制,而在意外领域则(几乎)没有自由。例如,HTML 没有固有的条件包含文本或变量扩展的能力。(此类功能多次作为不兼容扩展添加的事实仅仅证明了这一点。)
另一方面,通用语言通常在任何特定领域都不那么出色。例如,用通用语言编写程序来格式化一段文本比用 HTML 难得多。然而,通用语言通过其图灵完备性弥补了这一点,这使得解决可能出现的*任何*问题成为可能(假设有足够的资源可用)。因此,通用语言与领域特定语言*结合*使用时是理想的选择。
例如,如果手机是可编程的,人们仍然会使用常规的领域特定界面(键盘)来拨打特定号码,因为这是访问该特定功能最方便的方式。然而,如果没有可编程性,就无法在不尝试多种不同号码的情况下,直到某一个号码被接通为止,拨打特定朋友的电话,除非手机厂商预先考虑到这个特定功能。
我们提议从使 Python(一种现有的脚本语言)的编程教学成为可能开始,并专注于为其创建新的开发环境和教学材料。我们有传闻证据表明 Python 是一种很好的作为第一门编程语言来教授的语言。我们的工作将集中于为此目的创建工具和教育材料,并围绕这些材料培养一个社区。这将使我们能够研究 Python 作为教学语言的优缺点,并为未来的发展指明方向。
为什么要从现有语言开始?我们的经验表明,设计和实现一种新语言需要数年时间——而且这项工作必须(几乎)完成才能创建用户友好的开发环境和教学材料。因此,我们通过使用现有语言来启动我们的项目。根据用户反馈,我们可能会在项目期间修改 Python 或完全设计一种新语言。
我们已经有了一些需要进行更改的证据。卡内基梅隆大学的 Randy Pausch 教授(见下文)在他们的有限问题领域内对 Python 进行了一些可用性研究。他们的用户似乎对 Python 变量名的大小写敏感性和整数除法的截断最为困惑。更广泛和普遍化的研究将推动 Python 的具体更改,或表明需要设计一种新语言。
Python 是一种非常适合教授编程初学者的语言。它的许多关键特性都源于 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 访问的高级功能的访问(例如,高速 3D 计算机图形软件包)。虽然我们不期望学生编写这些扩展模块,但*使用*这些模块可以大大提升他们的学习体验。这种可扩展性让教师有机会根据学生的兴趣量身定制课程,为他们提供对其他软件包的受控访问。
Python 可用于开发大型应用程序这一事实与我们愿景的另一个方面相关,即开发开源应用软件,这些软件可以由非专业程序员,但已掌握一定编程技能的用户进行定制。尽管这并非我们此处工作的重点,但我们希望至少能看到一些朝着这个目标迈进的举措,我们将鼓励希望朝这个方向发展的公司和组织。我们预计 JPython 的存在将成为一个重要的促成因素。
Python 的编程环境和文档对于初学者教学而言并不理想。特别是,现有的 Python 程序开发工具和教程(各有几种)都假设用户是一个经验丰富的开发人员,他知道一套外部工具来编辑、运行和调试程序,并且已经知道一种或多种其他编程语言及其开发环境。这目前阻碍了 Python 作为第一门编程语言的更广泛实验。
表 1. 语言比较表
我们将创建下一代编程环境和教学材料,使普通用户能够编写简单程序并理解大型程序的结构和组织。我们还将探讨广泛的编程素养将如何影响普适计算环境中软件的生产和使用。
我们的工作分为三个不同的领域
- 一套适合高中生和大学生的新计算课程。
- 更好、更易于使用的程序开发和分析工具。
- 围绕上述各项形成的用户社区,鼓励反馈和自助。
一旦新开发的课程和工具的初始版本发布到社区,反馈渠道将开放。最初的反馈将主要用于改进环境和教学材料。这是社区建设开始的地方。
CP4E 工作的一个关键目标是开发一套编程素养课程,适用于从非计算机科学专业的本科生,到中学,最终到小学和初中学生。每个年级的教学方法可能会有所不同,以便更好地与学生在成长过程中建立联系和达到他们,但 CP4E 努力提供一个统一的方法,随着学生的成长而发展,沿途呈现更丰富和更深入的主题材料。最初的工作将主要集中在高中生和本科生。
CNRI 将开发课程的基础材料,包括用于教学环境的软件,以及可作为编程教材基础的教程和入门材料。CNRI 将与经验丰富的教育工作者密切合作,他们擅长制作教材和其他教学材料,以便最好地为目标年龄组量身定制这些工具。
我们的目标是采用经验丰富的程序员使用的软件环境和工具,并制作这些工具的版本,使其在教授编程技能时有用。我们受到现有 Python 交互式解释器和 IDLE(Python 的图形开发环境)的启发,这两者都可以用作专业程序员的生产力工具,或与教程材料结合使用时作为教学辅助工具。我们的新工具将为新手和经验丰富的程序员提供有用的功能。
CNRI 提议与芝加哥大学合作开发一门新的计算机科学课程,将 Python 作为所有编程教学级别的编程语言。Python 是一种特别适合此目的的语言,因为它易于学习、阅读和使用,但功能强大足以说明编程语言和软件工程的基本方面。因此,即使是年幼的学生也可以使用 Python 学习编程基础知识,但他们不会像使用 Logo 那样受到其应用领域的限制。使用 Python 将允许每个学生按照自己的节奏探索和进步。特别令人兴奋的是,有天赋的学生将拥有触手可及的强大编程语言和环境,如果他们有动力学习更多或更快。
芝加哥大学将开发一系列课程,向本科生和高中阶段的非计算机科学专业学生介绍编程和计算机概念。目前,这个级别的课程往往侧重于编程语言(具有浓厚的数学色彩)或网页编程主题,如 HTML 和 JavaScript。不幸的是,这两种方法都存在严重的局限性。如果课程过于正式和数学化,它可能只吸引计算机科学专业的学生和具有技术思维的学生。另一方面,网页编程课程虽然极大地利用了互联网的普及性,但往往狭隘地专注于 HTML、Perl 或 JavaScript 等特定技术。结果是学生对更广阔的计算环境了解甚少,也未能获得解决未来计算问题所需的解决问题技能。
将在芝加哥开发的课程将涵盖我们认为每个人都必须了解的计算方面,才能成为一个知识渊博的计算机用户
- 基本计算机组织。学生将学习计算机如何工作以及它们如何组合在一起的基本知识。主题将包括布尔代数、逻辑和简单的计算机体系结构(例如 CPU、内存、I/O)。简单地说,这就是“引擎盖下”发生的事情——用易于理解的术语来表达。最终,我们希望尽可能地揭开计算机的神秘面纱。
- 编程入门。这将介绍人们编程计算机的不同方式。学生将学习过程式、函数式和面向对象编程,但以非正式的方式。目标不是将学生培养成专业程序员,而是向学生介绍人们尝试简化计算机使用的一些方法。
- 软件架构。在未来,计算机将越来越多地通过组装现有软件组件和编写少量粘合代码来编程。为了实现这一点,理解软件的组合方式至关重要。学生将学习软件设计和软件组织(那些 DLL 到底是什么?)。
- 调试和问题解决。当所有其他方法都失败时如何生存——而无需呼叫客户支持。
我们打算自己进行小规模的教学工作,例如在协作部分列出的当地高中,但我们不期望会做太多教学。如果 Python 的受欢迎程度可以作为任何指标,我们就不必如此:其他人也渴望参与这项实验。
课程将使用下一节中描述的新开发环境。为了激励编程变得更“有趣”,我们打算将开发环境连接到一个现有的可编程 3D 游戏引擎,就像流行电脑游戏中使用的一样。一些这样的引擎已经或很可能将可用于 Python;我们将选择一个并为其创建一个适合我们受众的接口库。
为什么要使用 3D 游戏引擎?Logo 的经验表明,图形是吸引年轻受众注意力的好方法,但其 2D 图形与青少年现在熟悉的视频游戏相比显得有些无聊。Alice 是一个引人入胜的 3D 图形环境的良好范例。
除了使用 3D 游戏作为测试平台,我们还可以使用 CNRI 的 Knowbot 技术 [Knowbots] 作为新手程序员的激励性应用。Knowbot 程序是独立的移动程序,能够在整个互联网上的 Knowbot“服务站”(专门配备的主机)之间迁移。服务站为 Knowbot 程序提供搜索服务、数字对象存储库、拍卖服务等服务。
另一种看待 Knowbot 程序的方式是将其视为在服务站更大框架内工作的小型组件。Knowbot 程序是一个模块化、独立的程序,可以轻松编写以在互联网上移动,但由于其集成到框架中以及对所遇到环境的使用,它具有强大的功能。
我们将探索一些关于如何在教学课程中使用 Knowbot 程序的想法。我们设想合作游戏场景,学生可以创建表现出某些行为的 Knowbot 程序,并且必须共同努力解决一个共同问题。这将是激励来自互联网各地的学生进行协作的好方法。
我们可以设想寻宝游戏,学生必须运用他们刚刚学到的编程技能来发现并迁移到一个服务站,在那里解决一个谜题,并获得宝藏。我们还可以设计分布式虚拟模拟,类似于麻省理工学院的虚拟鱼缸 [Fishtank],学生可以在其中创建复杂系统自己的离散元素(例如,在 Knowbot 程序中实现一条虚拟鱼),并观察他们自己的元素如何与其他元素互动。由于 Knowbot 技术允许在整个互联网上进行高度分布式、非常复杂的互动,它为我们提供了一个独特的平台来实验丰富的合作学习机会。
我们将设计并构建一个编程环境,专门用于支持向没有编程经验的用户教授编程。我们的目标是提供工具,支持用户在学习编程以及在家中和办公室运用这些技能时使用。
我们相信大多数普通用户将利用他们的编程技能来定制和扩展他们的计算环境。大多数人不会从头开始编写新程序,而是将新代码添加到现有程序中。面向这类用户的编程工具必须解决三个重大挑战。
首先,环境必须显著减轻编写、安装和调试新程序的负担。当前的开发工具对于专家用户来说可能很笨重,更不用说新手了。我们必须将细致的设计和可用性研究集中在新编程环境的开发上。
第二个挑战是提供消费者和生产者对软件制品的持续演进和修改。我们将开发工具来帮助用户理解大型程序的结构,以便他们能够确定在哪里进行更改以及这些更改会产生什么影响。我们的工具还将帮助用户管理和配置软件,以便单个组件可以随着时间的推移被替换或升级。这些工具将通过自动跟踪版本和依赖关系来帮助用户分享新的和修改过的程序。
最后的挑战是构建在普适计算环境中仍然有用的工具。桌面计算环境将很快被计算机控制设备和物理系统网络所取代。这种新环境加剧了软件安装、调试和管理的问题。它也给系统设计者带来了新的挑战,即构建允许终端用户定制的软件。
本节围绕这三个挑战展开。第一节讨论提议的编程环境。第二节讨论程序分析和配置管理工具。第三节讨论支持普适计算环境终端用户可编程性的应用程序框架。
我们解决这个问题的方法是研究如何通过更先进的程序分析、检查和理解方法来增强和改进传统编程工具,如编辑器、调试器和类浏览器。
程序员最基本的活动是编辑源代码、运行程序进行测试以及调试程序。(Python 没有单独的编译阶段。)编程环境当然必须支持这些活动。我们一直在为 Python 开发一个名为 IDLE 的可移植编程环境,它允许用户交互式地执行单个语句。它主要面向经验丰富的程序员,但将作为面向绝对初学者环境的起点。
IDLE 只是触及了帮助新手程序员所需的编程环境的皮毛。例如,其源代码着色和缩进功能可以被更强大的程序检查器取代,该检查器将在用户输入时指出所有语法错误、未定义的标识符、类型不匹配等(就像拼写检查器一样)。调试器可以支持回溯执行步骤、编辑运行程序的源代码等。程序编辑器可以支持一种灵活的基于模板的编辑形式(Alice 小组在他们的有限领域内对此有很好的经验)。撤销功能目前只允许撤销源代码更改,可以扩展到撤销对程序运行时状态的更改,甚至是对环境的副作用(在合理范围内——我们不能期望撤销打印或发送电子邮件消息)。例如,Alice 软件为其管理的三维世界中涉及更改的所有操作提供完全撤销功能。
两个具体的工作领域是撤销和扩展类型检查器。
“撤销”对于初学者来说是一个极其重要的工具,因为它是程序员的第一道防线。与版本控制、自动保存和其他功能一起,回滚无限数量的短期更改的能力意味着程序员有更大的实验和学习余地。然而,大多数撤销实现在其范围上都相当有限。我们的方法将研究选择性撤销和全局撤销等概念。在传统的撤销系统中,编辑器只是保留一个文件更改的链表,这些更改可以通过遍历此列表来取消或重新应用(对此主题有各种变体,包括撤销环和撤销/重做)。传统撤销的一个问题是,一些不需要的更改与一些需要的更改重叠;程序员通常不得不放弃需要的更改以消除不需要的更改。
通过选择性撤销,更改可以局部化到更细的粒度。例如,假设程序员对文件顶部的函数 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 字符串参数之间进行转换。
如果用户被赋能修改和定制代码,那么当底层软件升级或系统组件被替换时,他们将面临维护这些修改的挑战。版本控制对于软件开发人员来说已经是一个令人头疼的问题,他们必须确保自己的产品与许多操作系统和共享库兼容。用户还希望与他人——同事或亲戚朋友——分享他们的定制。我们将提供工具来帮助用户维护和共享程序和程序的修改。
我们的编程工具研究将解决的最重要问题之一是用户可定制性将给系统配置管理带来的负担。当用户对应用程序进行更改时,如何确保供应商未来对应用程序的更新与这些更改兼容?用户自己如何跟踪他们对应用程序进行了哪些更改?当产品的未来版本添加了一个以前没有的功能,而用户已经添加了(以不同的形式)该功能时,会发生什么?
我们的工具将帮助用户跟踪他们所做的更改,通过 successive revisions,并在主要应用程序本身已被供应商修改或更新时,帮助用户将他们的更改合并回去。这种方法的关键是识别每个软件版本以及描述其属性和依赖关系的简单语言。例如,我们打算改进版本控制系统,使其跟踪不同抽象级别和粒度的更改,例如根据其实现的功能而不是其修改的源文件(或文件部分)来标记更改。该工具将自动识别对其他库和组件的依赖关系。我们将研究将测试框架集成到配置管理系统中的方法,以便当主要应用程序升级时,用户安装的每个功能更改都将合并并进行测试。
我们还将创建增强社区的工具,使共享、集成和使用同行开发的软件变得更容易。需要解决的问题包括包之间的依赖管理、易于安装(和卸载!)、应对操作系统、应用程序和库的变化、版本控制以及包维护。必须对软件进行描述和分类,并建立讨论、反馈、错误报告和补丁(既提交给维护者,也来自维护者)的论坛。最重要的是,这些社区建设工具必须主要由社区自身管理;它们必须是高度分布式、可复制和安全的。例如,用户可以共享有关各种库之间兼容性问题的信息;结合自动分发工具,这些信息可以防止导致其他应用程序无法工作的软件升级。
有几个现有工具试图解决其中一些或所有问题。Comprehensive Perl Archive Network(CPAN)旨在包含 Perl 程序员所需的所有 Perl 材料 [CPAN]。它是分布式和复制的,它使安装 Perl 模块的工作更容易(尽管并非总是足够容易)。然而,它不太适合其他类型的档案材料。在 Python 社区中,*distribution-utilities* 特别兴趣小组正试图使第三方软件的发布和安装更容易,但它没有解决更广泛的问题,而且它仍然狭隘地专注于 Python 软件 [Distutils]。我们所熟悉的,最雄心勃勃的相关工作是自更新软件 [Liskov] 项目。
我们将研究未来计算和通信变化对用户控制计算机方式的影响,以及诸如近乎无限带宽、更易访问功能更强大的计算机、计算资源的普及以及更高水平的互联网互联(即使在微设备级别)等发展所带来的影响。这些变化影响了用户将编写哪种程序以及这些程序将在哪种计算机上运行。
我们在这一领域的方法是与实验和原型系统合作,以了解应如何公开终端用户可编程性。随着这些技术的成熟,我们可能会将我们的经验融入教学材料中。
许多非程序员开始编写小型程序,这些程序在特定领域和应用程序框架的上下文中被使用。电子表格可能是有限上下文中编程的最佳示例。它提供了一种专门用于处理数值数据表的有限语言。应用程序提供协调框架——管理显示、控制流、I/O 等——并让用户专注于特定问题。宏功能是电子表格编程套件的一部分,它有助于许多应用程序的使用,允许用户自动化重复任务。第二个示例可以在 MS Word 宏中找到,这也是一种常见的用户自定义形式。
互联网使许多非专业人士接触到编程,尤其是在 HTML 等领域特定语言和 JavaScript、PHP 和 CGI 等活动内容语言中。在这些情况下,非程序员通常也在更大的上下文(例如,Web 服务器)中创建小型程序,Web 服务器负责处理诸如管理与客户端的 TCP/IP 连接、设置用户程序运行环境、处理错误情况以及遵守标准协议等细节。
在未来,非程序员将使用大量的智能家电。其中一个例子是这些设备的可编程性将显著提高其有用性的领域是信息流的管理——也许更重要的是,信息流的*限制*。一个人可能通过多种媒体接收消息——文本、语音、视频——并通过多种设备(如 PDA、手机和电脑屏幕)访问它们。我们期望无缝互操作性,例如,手机可以用于通过语音回复跟进电子邮件,而无需查找号码。小型程序可以用于定制这些设备上的接口,并过滤和限制通过它们的消息流。
一些例子包括
- 尝试几个不同的电话号码来联系一个人,这可能取决于一天中的时间或一周中的哪一天。
- 当您不想被打扰时,将打进的电话转接到语音信箱或电子邮件——但仍让重要的电话通过。
- 接电话时降低电视或收音机的音量。
- 录制某些电话的副本,可能通过调用语音转文本转换器。
- 在电子商务交易中,限制传输给商店或公司的个人信息量。
这些示例表明了编程范围的一个重要模式:用户将在系统计算模型和软件框架的背景下定制应用程序和设备。因此,我们的探险将探索模块化应用程序的方法,并组织这些模块,以便用户可以添加他们想要的小部分功能,而无需关注整个系统的运行。
在应用程序框架或嵌入式设备的背景下,赋能非程序员修改和定制软件的一个关键目标是减少理解修改如何适应更大程序所需的认知负担。即使对于不熟悉应用程序代码库的经验丰富的程序员来说也是如此。应用程序必须模块化并提供足够高级别的抽象,以便其组成部分可以快速独立地理解。这使得人们能够主要关注需要更改的部分。在我们的方法中,我们将探索几种旨在改进软件模块化的想法。
我们打算研究现有技术,例如面向对象编程和组件组合作为组织软件的方法。理论上,用不同的功能替换黑盒组件要容易得多,只要接口和输入/输出语义保持不变。实际上,目前编写独立于系统其他部分的类和组件非常困难。我们还将探索新概念,例如面向方面编程 [AOP],这是一种基于交叉关注点模块化软件的新方法。也许这些方法的某种组合,或新的模块化技术将证明有效,例如,通过将每个函数组织为组件的一个方面。
除了与选定的合作伙伴合作,我们还将寻求广大社区的参与。我们将通过网站分享开发的课程和软件原型,并通过新闻组和邮件列表等多种渠道征集对这些材料的反馈。CNRI 在通过网络和其他方式进行社区参与方面拥有丰富的经验。例如,Python 社区的主要关注点是 Python 网站 [Python],该网站也托管了许多与 Python 相关的邮件列表;数字图书馆社区的一个重要关注点是 D-Lib 网站 [D-Lib]。这两个网站都由 CNRI 运营。现有的 Python 社区已经对 CP4E 提案表现出极大的兴趣,我们预计这将是启动 CP4E 项目特定社区活动的理想场所。
这种明确的社区参与设施将极大地有益于我们的研究,并让社区从我们的研究中获得最大收益。早期和大规模社区参与对我们研究的好处将包括:帮助“试驾”我们的课程和软件原型的志愿者;由社区成员开发的新课程,针对特定目标受众或旨在教授特定技能或科目;现有课程的本地化版本、翻译等;新的或修改的示例(永远不会有足够的示例,而且针对特定受众量身定制的示例更有效);学生使用我们的程序开发软件开发的新应用程序;等等。在 Python 社区中,我们收到了许多这样的贡献(包括关键文档的完整外语翻译),完全是未经请求的!
对社区的好处包括早期接触新课程和软件,以及帮助教师进行教学,并说服他们的管理层向所有学生(而不是提前入学人群)教授计算机编程的重要性。我们还预计,提议的社区设施将促进社区成员之间的自给自足。例如,在共同辅导项目中,需要辅导帮助的学生将在网上找到志愿者辅导员(通常是更高级的其他学生),教师将能够直接交流他们的经验。这种辅导活动已经在 Python 社区中发生,并将有助于减轻我们的研究团队因反复要求解决简单问题而造成的负担。
本着“大众计算机素养”和开源运动 [OpenSource] 的精神,我们的网站将广泛免费提供课程和软件。除了网站,我们还将创建并维护一个或多个带有档案的邮件列表,并可能提供面向用户的“聊天”服务。我们将积极参与邮件列表,以促进社区发展,并收集和分析社区通过这些(及其他)渠道提供给我们的反馈。
很明显,我们认为社区参与对于本项目的成功至关重要。因此,我们希望超越典型的网站设置。我们计划为教师、学生和程序员创建一个自动化的存档网站,用于交流课程笔记、示例、有用软件等。我们还计划开发原型软件,帮助用户在一台或多台机器上维护一致的本地开发和下载的软件包集合。扩展、升级、补丁、最终用户修改等频繁的交流,如果使用现有做法,将导致版本控制噩梦。这在上面的“共享和维护”小节中已有详细阐述。
我们将在项目中建立一定程度的与学术和非学术机构的合作,以确保研究的成功。特别是,我们建议将一些活动分包给卡内基梅隆大学和芝加哥大学的团队。CMU的Alice团队已成功将Python用作其流行的虚拟现实软件的最终用户编程语言;芝加哥大学在计算机科学课程开发方面拥有丰富的经验和兴趣。我们还计划与其他学术团队进行非正式合作,并在可行的情况下向其他人开放参与。
由兰迪·鲍施教授领导的Alice团队[Alice][Pausch]开发适用于Windows的经济实惠的3D图形和虚拟现实软件,最初在弗吉尼亚大学,现在在卡内基梅隆大学。他们将Python用于最终用户编程,并用于实现其系统的大部分(几乎除了渲染引擎之外的所有内容)。他们可能是教授Python编程(尽管是在有限领域)给没有编程经验的用户最广泛且记录最好的案例研究,他们对Python的热情极大地鼓励了我们考虑在通用编程课程中使用Python。他们也是将可用性测试应用于编程语言和应用程序编程接口的少数团队之一。
我们计划向Alice团队提供有限资金,以互利的方式继续他们的这项研究。我们希望从他们教授初学者使用Python的经验中受益,从他们内置于Alice系统中的简单而有效的编程工具中受益,以及从他们在用户测试方面的熟练程度中受益——这对于我们计划开发的教程和软件都非常重要。他们将从我们的教程(为Alice用户提供更广泛的软件开发指导)以及我们的软件(更强大的程序构建工具)中受益。
芝加哥大学可以在两个核心领域为CP4E研究工作做出贡献:课程开发和软件开发工具。我们还计划与芝加哥大学实验室学校合作,这是一所由芝加哥大学运营的K-12私立学校。我们在芝加哥大学的联络人是戴维·比兹利教授,他是一位经验丰富的Python用户。我们计划为芝加哥大学提供有限资金用于课程开发。这将对我们有利,因为他们对教学有兴趣和经验;他们的利益将是使用更优秀的编程语言和工具。
最后,我们计划与选定的当地学校直接合作,对开发的材料进行“试驾”。与当地学校合作可以实现与教师和学生定期面对面会面;我们认为这对于评估我们的原型课程和软件至关重要。弗吉尼亚州阿灵顿县的约克镇高中已经对本提案表示了兴趣[Yorktown]。
另一个可能的候选学校可能是弗吉尼亚州费尔法克斯县的托马斯杰斐逊科技高中,这是一所公立重点学校,已经为优秀学生提供计算机科学课程[TJHSST]。本项目进行期间,我们将联系马里兰州、弗吉尼亚州和哥伦比亚特区的其他当地学校进行合作。
我们还计划与正在开发未来个人计算硬件和软件的学术及其他研究小组(“普适计算”项目)进行非正式合作;这些项目都设想了某种形式的最终用户可编程性。此类项目的一些示例包括麻省理工学院的Project Oxygen [Dertouzos]、施乐PARC和华盛顿大学的Portolano/Workscape [Portolano],以及卡内基梅隆大学的Invisible Computing。
我们预计,这种合作对我们的主要好处将是我们的技术能够在先进系统中及早部署,而他们的好处将是他们正在开发的系统的最终用户可编程性得到改进。请注意,时机非常好:个人嵌入式系统的广泛部署(如Project Oxygen所设想的那样)预计将与我们的课程和软件广泛使用的时间大致相同。
ABC。Python的前身ABC在八十年代初被设计成一种教学语言。它的座右铭是“消灭Basic”——承认当时非专家语言的主要竞争对手。ABC的设计者在向初学者教授ALGOL等“经典”编程语言方面拥有丰富的经验。他们发现学生们常常被使用计算机语言的偶然细节(例如运行编译器、处理不同的数字格式、神秘的I/O操作和低级内存管理)所困扰,以至于他们从未能专注于良好程序和算法设计的本质。
为了抵消这种影响,ABC的设计者回归了第一性原理。他们着手设计一种语言及其环境,能够处理所有偶然细节,让学生有更多时间学习编程中独立于当前编程语言的本质,例如清晰的控制流和强大的数据结构,并专注于程序的优雅表达。他们提出了一种新的语言设计和新的术语,这些都与计算机科学家和程序员中流行(并且仍然流行)的做法大相径庭。事实上,ABC未能产生预期影响的最大原因可能就是他们偏离了现有实践太多。那些能够接触到运行ABC所需的硬件的人(最初它只在Unix系统上运行,尽管后来被移植到Mac和PC)往往是经验丰富的计算机用户,他们对ABC没有“与他们其他应用程序说同一种语言”感到沮丧。
大约十年后,Python正是从这种挫折中成长起来的。它与ABC一样,关注表达的优雅、编程的基础和消除偶然性,但增加了面向对象、可扩展性以及强大的模块库,通过多种不同机制与其他应用程序接口:共享文件、程序嵌入、CORBA或COM等RPC接口以及网络协议(支持互联网上通常使用的所有协议)。
Logo。Logo实际上是一个与Lisp相关的语言家族,主要由麻省理工学院开发,当然是儿童最著名的编程语言。它拥有丰富的传统,在学校中根深蒂固,并有许多商业产品。麻省理工学院媒体实验室的认知论与学习小组正在进行持续研究,例如“可编程砖块”(与乐高合作)。
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服务器。我们将使用互联网和万维网进行所有材料的分发。
Guido van Rossum 将在CNRI领导这项工作。他是CNRI的团队负责人,也是Python的创建者,至今仍是其主要开发者。他还是Knowbot移动代理系统的主要设计者。过去,他曾参与为教学目的开发的编程语言ABC和80年代开发的著名分布式操作系统Amoeba的工作。他拥有阿姆斯特丹大学的数学和计算机科学硕士学位。
Jeremy Hylton 是CNRI技术人员的高级成员。他是Knowbot移动代理系统的设计者之一,并设计和实施了多个基于代理的信息管理应用程序。他于1996年获得麻省理工学院电气工程和计算机科学硕士学位以及计算机科学与工程学士学位。
Barry Warsaw 是CNRI技术人员的高级成员。他曾为多个CNRI项目做出贡献,包括应用网关系统、Knowbot操作环境和JPython。他为Python语言的开发和Grail互联网浏览器做出了贡献。他于1984年获得马里兰大学计算机科学学士学位。在加入CNRI之前,他于1980年至1990年在国家标准与技术研究院从事机器人系统操作员界面工作,并于1990年至1994年在国家医学图书馆从事医疗数据库信息技术工作。
CNRI将执行以下工作
- 开发Python原型编程环境,包括适用于初学者的程序分析和管理工具。
- 开发原型教程,使用上述编程环境向非程序员(特别是高中生或大学生)教授Python编程。
- 开发面向上述受众的示例软件;例如,一个允许操作第三方3D游戏环境的Python扩展。
- 建立并维护一个网站和邮件列表,推广上述软件和教程并征集反馈。
- 与选定的高中和大学合作。
- 参与小规模教学和用户测试工作。
- 从用户、学生和教师那里收集关于上述软件和教程的反馈,并利用这些反馈改进软件和教程。也将其用于改进Python语言本身或提出更好的语言。
- 发布一份最终报告,记录研究、经验教训、研究结果和建议的后续研究。
- 将CNRI开发的工具集成到Alice中。
- 对CNRI开发的工具和教程进行用户测试。
- 与CNRI合作,将CNRI开发的教程发展成适合高中的计算机科学课程,并单独发展成适合大学非计算机科学本科生的计算机科学课程。
- 使用开发的课程授课以提供反馈。
我们设想以下工作时间表
- 第1年。CNRI的初步研究:开发初始原型编程环境;设计程序分析和测量工具;开发教程的第一版;与其他研究人员和感兴趣的教师建立联系。
- 第2年:CNRI:初步实施程序分析和测量工具;收集首次软件和教程体验的反馈。CMU:开始将CNRI开发的工具集成到Alice中并开始用户测试。芝加哥大学:开始为高中生和大学生开发课程。
- 第3年:继续上述活动。此外,CNRI:将第一个程序分析和测量工具集成到编程环境中;小规模推广增强型编程环境;开发初始示例应用程序;定义成功评估标准。CMU:程序分析工具的用户测试。芝加哥大学:将程序分析工具的使用集成到课程中。
- 第4年:继续上述活动,完成大部分。此外,CNRI:大规模推广增强型编程环境;完善示例应用程序;开始大规模收集最终用户反馈;开始着手Python语言更改。CMU:完成用户测试,集成到Alice中。芝加哥大学:课程的完成和推广。
- 第5年:项目完成:报告经验,评估成功,向教育界和工业界进行技术转让。
提案中没有可选任务。
[ABC]
载于 欧洲面向对象编程大会 (ECOOP) 会议记录,芬兰。Springer-Verlag LNCS 1241。1997年6月。