选择第一门编程课程的语言的标准


35

作为大学水平的CS教育者,在第一门编程课程中要教授哪种编程语言经常会引起讨论。有成千上万种语言可供选择,许多宗教狂热(或崇拜)支持一种语言阵营高于另一种语言阵营。所有围绕每种编程语言的主观偏见使教育工作者很难选择一种语言。

我的问题是:

教育者可以使用什么客观标准来选择编程语言作为大学一年级编程课程的基础?这些标准的依据是什么?

注意:我不想看到编程语言的列表以及为什么它们是最好的使用语言。问题不是关于最佳语言,而是关于选择语言的标准。但是,答案可能是使用编程语言来说明特定点。


这个问题的灵感来自另一个被认为是题外的问题:https : //cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language


1
打开了有关此问题是主题还是主题外的meta线程:meta.cs.stackexchange.com/questions/362/…–
Dave Clarke

7
<爆米花爆米花>解读奥托·纽格鲍尔(Otto Neugebauer)人类所知的第一门编程语言无法毁灭所有人。
JeffE 2012年

3
@Raphael:我认为Dijkstra的回应可能是“ 人类已知的一种编程语言都有能力毁灭所有人”。
JeffE 2012年

2
@ edA-qamort-ora-y,是的,它们应该暴露于几种编程范例中。不,那是第一个课程无法做到的。
vonbrand

3
我们之所以这么SML简单,是因为不可能有任何学生事先掌握该语言。这使每个学生或多或少地达到了同一水平才能开始课程。
马库斯·马尔库施

Answers:


14

尽管我相信这个问题是无底洞,但我还是投入了两分钱。不要误会我的意思,我认为这是一个令人着迷的问题,但也许不是一个我们可以在这里解决的令人满意的问题。

简而言之,我想说的是,该语言应该以一种简单明确的方式来完成您想要的事情,而不是更多

我自己的经验来自于使用Oberon编程语言辅导几代一年级和二年级学生。知道这种语言的人会在我看来认识到它的影响。请注意,该语言用于教授“算法和数据结构”。当时(当时),从第二年开始,就在单独的课程中教授了函数式编程和面向对象的设计。

重要提示:但是,在介绍任何语言的细节之前,我想强调一点,最重要的是要对自己和对学生来说,绝对清楚课程目标是什么。您本身是在教编程吗?还是算法和数据结构?还是软件工程?在选择语言之前,值得思考一下您的使用方向。我认为,在此级别(目标)上的差异可能导致在此主题上的大多数分歧。

我认为很重要的观点可能与已经说过的几件事重叠,但是我相信大多数最终都是以下四个之一的子集:

  • 简洁性:通常只需要教学生编程,算法和数据结构,而不是任何特定编程语言的功能和复杂性。沃思(Wirth)用爱因斯坦的名言“使它尽可能简单,但不要更简单”作为Oberon设计的指导原则,并且还有其他几种语言也可以做到这一点。您选择的编程语言应该能够实现您的讲座中要求的所有概念,但是应该使用尽可能少的功能/细节来实现。编程语言通常只是工具,而不是目标。

  • 明确性:简单性的紧密兄弟,每个概念应该有一个结构,并且要尽可能减少重叠。认为它是实现每个概念的唯一“正确”方法。在语义上都做相同事情的三种不同类型的循环?还是用十五种不同的方法来增加变量?不好。这也使得批改作业或一般只是了解学生的代码很多容易。您的教学助手将不胜感激。

  • 可移植性:学生将在Linux,Windows和OSX机器上上课,并且在这三个方面,编程环境应尽可能相似(相同)。任何程序的结果也应该相同。这是负责标记作业和处理问题的教学助手的另一点。

  • 行业偏好:认真地讲,只有当“行业”本身决定最喜欢哪种编程语言时,我们才应该开始为此担心。自从计算机发明以来,这一直是一个不断发展的目标。目前,如果您的学生真的学会了编程,那么它就不会依赖于语言。但是,在某些领域中,行业需要设法达成标准,例如,用于电路设计的VHDL或用于数据库查询的SQL,因此这仍然是一个正确的观点。

同样,一种语言适合该列表的方式很大程度上取决于您要教的语言!


4
在VHDL和Verilog之间实际上存在电路设计上的分歧。
2012年

@avakar:噢,胡扯。我会在答案中解决此问题,感谢您指出!
佩德罗(Pedro)

kes,读了此书,并认为这是我的讲师之一。对于Oberon,+ 1,只要使用小写关键字开关自动启用;如此痛苦的写作WHILE expr DO stmts END等等
。–卡勒姆·罗杰斯

3
为“您的课程目标是什么?” + 1 另外要注意的是,即使没有拼写,最常见的目标之一就是提供以编程为前提的其他事物(课程和实习)的基础。
AProgrammer

重要的一点(至少在今天是这样)是,它使学生能够迅速而轻松地构建具有视觉吸引力的程序。他们接触了许多图形密集型应用程序和游戏,因此自然而然地认为计算机应该与人互动。
vonbrand

13
  • 发展算法思维来解决问题是主要目标:在第一门课程中使用面向对象的范例的一件坏事是,使新学习者了解诸如继承,多态等问题,使他们偏离了上述主要目标。实际上,出于上述原因,引入除此核心目标之外的任何次要注意事项,例如软件工程,可移植性,行业实用性等,都会适得其反。

  • 并非面向对象的语言:如今,大多数大学开始使用面向对象的语言来教授编程。我认为这是一个错误。世界上只有相反的事物才可以真正理解。无需暴露于程序的程序范式(数据和函数作为程序的两个独立方面),很多人可能会错过面向对象的基本思想(数据和行为本质上是联系在一起的)。而且,由于面向对象编程是如此重要,因此缺少其基本思想也不是一件容易的事。此外,由于CS学生很可能会在高级课程中主要是面向对象编程,因此他们也需要从程序方面入手。

因此,最后,我会选择一种过程语言,避免使用高级功能,而是着重于开发算法思维。但是,避免高级功能并不意味着避免具有挑战性的问题。我的意思是,即使是具有挑战性的问题,也应要求学生使用首要原理,简单的工具来解决。


您可以很容易地从Java的子集开始,以首先显示过程样式。然后打开Pandora的盒子,并显示OOP中相同内容的外观。
拉斐尔

3
@Raphael:public static void main()在Java中不可避免,它必须在某些类的上下文中。尽管当然障碍并不太大,但这使得Java并不是理想的第一语言。
戴夫·克拉克

一个好的IDE可能会延迟public static void main()很长时间。BlueJ是IDE的一个很好的例子,它使学生main可以在其中没有任何地方的情况下编写程序。
巴里·布朗

2
OOP的问题在于,对于编程第一年左右所涉及的一系列玩具问题,它只是一个障碍,没有任何明显的优势。当您的程序大约在一千行时,OOP就变得很重要(并且受到赞赏)。“没有OOP的Java”太可怕了,“必须以这种方式编写”的许多完全不透明的东西与人们学习而不是模仿无关。
vonbrand

11

既然我们正在谈论计算机科学课程中的第一门编程课程,那么我想说的最重要的方面将是CS的基本概念将教给您的学生。由于没有一种语言可以一次教授所有概念,因此您需要考虑进一步需要哪些概念。

我不同意@Kaveh的观点,即行业相关性很重要。它可能是一个奖金,但在这里没有那么重要。有了CS原理的坚实基础,在以后的课程中学习“工业”语言将相对容易。

附带说明一下,无论选择哪种语言作为第一语言,都必须尽快让学生接受另一种完全不同的语言。


1
行业相关性可以被认为是次要的,但我认为这不是一个小问题。由于这是编程课程的入门课程,所以我不明白为什么要讲授其中的所有概念,因此经常有第二门编程课程和另一门关于编程语言的课程,其中讨论了各种语言,还有许多其他课程课程集中于特定的应用领域,例如网络编程等
Kaveh 2012年

@Kaveh:对我来说,这听起来像是一所技术大学的课程。
拉斐尔

6
“重要的是尽快让学生接受另一种完全不同的语言。” - 完全正确。我们设置了认为可以直接编程的新生,首先引入函数式编程:几乎所有新手都对这种范例不熟悉,而C(++)越多,您面对的难度就越大。
拉斐尔

3
@Kaveh:为在现实世界中完成事情而设计的语言不一定适合教授概念或发展技能。目标是非常不同的。
JeffE 2012年

1
@Kaveh:我从来没有写过关于行业使用语言的知识并不重要。我的意思是,有了坚实的第一门编程语言,以后的课程就可以毫无问题地向学生传授毕业后的实际知识。我曾经自己(作为助教)教授过几门入门课程,我想说的是,您所学的技能没有行业所需的技能(花的时间很少)。如果真是这样,那么我发现为他们提供扎实的概念更好,这样他们才能成为更好的程序员,而不仅仅是$ LANGUAGE程序员。
evilcandybag

8

我主要关心的是普遍性,从某种意义上说,学习这种编程语言应该使学生能够处理大多数编程语言。

令我后悔的是,该标准不包括纯函数式语言。它也适用于不应使用该语言的外来功能的课程。

...但这只是常识。


1
在Haskell中使用monad时,可以争论的是该标准不再适用于纯函数式语言。
戴夫·克拉克

@DaveClarke:monad是处理非功能性内容的一种非常不错的方法。但是首先用monad开销而不是直接学习这些东西不是太冒险吗?(也许不是,我不知道!)
jmad 2012年

2
@jdam:你可能是对的。问题不在于单子本身,而是在于向程序员呈现良好错误消息的普遍性和难度。Haskell变体氦气解决了这些问题,并已成功用于一年级学生。
戴夫·克拉克2012年

@DaveClarke:哇,我没听说过。太酷了!不幸的是,尽管这对于学习Haskell非常有用,但却无法解决可能无法帮助学习其他语言的问题。
jmad 2012年

4
@Ben:我的感觉是,手动内存管理是当今某些语言所特有的(在特定情况下您会学到),而不是编程的基本知识。如果您不同意这一点,那么我想它的确指向C(或C ++)。
jmad 2012年

8

选择第一种编程语言时,有许多问题需要考虑。在上面的答案中已经考虑了其中许多。我再添加3个,因为这些是我对已结束问题的回答(https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language)的一部分。我已根据当前删除已关闭问题的政策在此处复制了我的答案(并对其进行了修改)。

这里以3种编程语言为例,考虑3点。

大型编程与小型编程

初次学习编程时,需要学习如何从小型编程,然后继续学习帮助大型编程的机制。

通过小型编程,我的意思是编写少于100行的程序。这些程序将包含处理简单数据结构,具有简单控制流程并解决简单问题的算法。通常,它们不会被视为应用程序

通过大型编程,我的意思是编写由许多组件/类构建的大型程序,并基于API,GUI和数据库(可能以客户端-服务器配置)构建。

大型编程时,程序员需要考虑的事情与大型编程时需要考虑的事情完全不同。大型编程要求程序员考虑模块化,良好的接口,良好的设计,可重用性以及许多其他问题。现代编程语言提供了许多结构来帮助进行大规模编程。这些构造包括类,模块,接口,信息隐藏等。在小型编程中,这些问题不那么重要。

诸如C ++之类的编程语言具有许多功能,可帮助大型程序设计,但是坐下来开始编写非常简单的程序则更加困难。Java是相似的。

另一方面,Python,Ruby,Scheme或Haskell之类的语言使直接编写程序变得容易得多。

高级与低级

像C ++和C这样的语言是相当底层的语言。它们使程序员能够直接将引用操作到内存中。尽管这允许人们编写非常有效的代码,但对于第一个程序员而言,学习低级细节可能会很困难。有人会认为,这些低级的细节妨碍了编写解决问题的逻辑。

像Python这样的高级语言可以使更轻松地直接根据问题域表达概念。

静态全类型与动态类型

C ++,Haskell,Java和许多其他语言是静态类型的。这意味着编译器会根据代码中每个位置的预期值类型自动查找可能发生错误的位置。关于静态打字是否是一件好事,有一些宗教上的争论,但是我会避免使用静态打字。对于新程序员来说,静态类型化的一个问题是,编译器报告的错误消息通常难以理解。通常,对于C ++模板和Haskell程序尤其如此。

Python,Ruby和Scheme是动态类型的。这意味着在程序运行时会检测到错误。有人可能认为现在检测错误为时已晚(但也可以使用测试来避免此类错误)。再次,避免宗教上的争论,以动态类型的编程语言编写简单程序时遇到的那种错误的优点是该对象不知道如何执行此操作。在小型程序的上下文中,这些错误很容易理解和跟踪。

诸如C之类的语言具有弱类型,这意味着尽管编译器可以解决一些错误,但运行时无法捕获其他发生的错误,例如无效的内存访问。结果,返回到编程器的错误消息类似于“程序崩溃”。动态类型的语言会捕获这些错误,并将它们转换为更易于理解的错误消息。

其他

对于其他语言,可能会考虑各种因素,例如编程环境提供的支持,可用的API,书籍和在线教程的质量等。


衷心同意。
vonbrand

1
对于“静态类型与动态类型”的争用,我也有自己的偏好。但是,在一般的CS程序中,只要一定要同时教授两者,我相信顺序并不重要。但是,如果只展示硬币的一面,那对我来说是个大问题。

8

作为介绍性内容,请考虑一种语言(在一门课程中)提供多种语言的可能性。在我的第一学期中,我们展示了SML和Java。对比有它自己非常重要的信息:为工作选择合适的工具。

但是,现在以任意顺序获取标准。

学习困难是一个主观的问题,但很重要:您不希望您的学生在学习语言上浪费时间,而在用语言事情上。可以说,像Ruby这样的动态语言可能会在这方面取胜:您可以为它们提供任何东西,并且网络上有出色的“虚拟”教程。如果我没记错的话,也有研究表明,以前没有编程的学生使用功能语言会比其他人获得更好的结果。

丰富性:对于您要教授的所有概念,语言必须足够丰富。例如,如果要讨论高阶函数,则需要一种以函数为值的语言,例如函数语言或Scala。

可扩展性:您的学生可能不会比您自己展示的语言学习更多的语言。因此,您希望您选择的语言能够在他们的学习过程中扩展:他们需要立即编写您的宠物练习,但稍后可能还会攻击一个中等规模的项目。Java和具有类似生态圈的语言在这里是不错的选择。

工具支持:这与可伸缩性有关。如果您希望/希望您的学生能熟练使用该语言,则必须存在良好的IDE,构建管理器和库。交互式shell(Ruby,Scala)也很不错,特别是对于初学者而言。工具也必须在所有主要平台上工作。

文档:您可能不想真正地教授该语言,但希望学生在您的(抽象)指导下自学。因此,好的文档很重要。可以争论的是,一种语言越流行和建立起来,文档越好。例如,Scala的文档非常差(但正在改进)。像Hoogle这样的工具是个加号。

可用性:实际上,有些人使用Matlab或Visual C ++进行教学。考虑一下,并非每个人都可能拥有许可证或可以运行必要程序的计算机。您可能应该偏爱在各种平台上运行的免费语言。

清洁:您可能想塑造学生的思维方式。语言使他们更思考,他们将思考的使者变得更语言;我绝不会在课程中提出PHP。动态语言通常在这里有缺点:它们允许甚至有时会养成不良习惯。

其标准是对你更重要的比别人还取决于什么你想教。这实际上是一门编程课程吗?它是算法和数据结构课程吗?这是一门以不同范例介绍编程语言概念的课程吗?它是关于软件开发的一门大课程吗?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ...或者C或Pascal,它们都几乎永远都具有函数指针。实际上,该标准实际拒绝使用的唯一(主流)语言是Java。
梅森·惠勒

试图教给新手各种语法和基本概念,这真是令人费解。
vonbrand

6

令人着迷的问题;我喜欢您强调客观标准。我们希望新生学习:

编程概念:第一种编程语言必须支持:函数调用,迭代,递归

基本思想:第一种编程语言必须支持数组(在关于内存如何真正工作以及指针如何工作的简要介绍中的第一步)

实用的编程技能:如何使用调试器,如何使用事件探查器,如何解决大问题(高级语言),如何将大型系统组合在一起,如何分解问题(问题分解),如何避免编写复杂的代码,如何与人类交流后面的(常常神秘)系列可执行语句的意图。

存在针对sort()之类的东西以及如何使用它们的预先编写的库这一事实-即无需从头开始编写所有内容的事实。

其他母语的其他准则

解释(快速反馈有助于学习过程)。

一个可加快学习,测试和调试速度的交互式环境。

高质量的源代码可供学生以该语言阅读

“易于阅读”,“接近自然语言的语法”(使阅读和评分SourceCode更加容易)

可移植(在Mac OS,Windows和Unix上运行)。至少一种该语言的免费软件实现。

教书的速度很快,“很少遇到麻烦”-例如,“先教初学者使用Python,然后再教Java,而不是将Java作为第一个OOPL,这可能会更快。” - “面向对象的编程语言比较” TelescopeRule

Matthias Felleisen开发了一种编程语言,其中包含针对初学者的错误消息。他强调说,特定的语言选择并不像教一种好的设计方法一样重要。实际上,他将第一门CS课程视为一门通识教育课程,教授批判性思维,解决问题和关注细节的知识。

第二种编程语言的标准

我们希望学生学习的东西,但这也许可以等待第二种编程语言:

一种“不太深奥”的“相关”语言;“在业界很受欢迎”

复杂性理论:如何识别当前技术不可能完成的任务。

更高层次的东西:如何为工作选择合适的工具,如何使用编译器,结构,面向对象的程序设计,函数式程序设计,逻辑程序设计,编译器设计,组成和操作函数(从Lisp / ML的角度来看),并发和分布式编程,

低级的东西:指针算术,计算机体系结构。内存管理,堆栈框架,汇编程序,机器架构,设备驱动程序和操作系统设计(因此,机器不会“看起来像它们无法穿透的可怕的黑匣子”)

编辑:我发现发布与其他人合作撰写的文章摘要“很可能不合法”令人失望。

因此,我在以前的非正式链接中添加了更正式的引用,以尝试遵守合理使用和其他Wiki版权问题。

该答案是波特兰模式存储库中新生的第一语言(Anon 2011)的摘要。

(Anon,2011年)。许多匿名作者和其他作者。“新鲜人的第一语言”。波特兰模式存储库。2011年9月27日。http ://c2.com/cgi/wiki?FreshmansFirstLanguage


您是否与原始作者确认是否允许您复制其内容?来源是公司网站,我找不到内容免费的声明,因此这可能不是合法帖子!
拉斐尔

1
@Raphael来源是Wiki(因此可能有许多不同的作者)。如果该材料的作者(任何共​​同作者)不希望将其包括在此处,则应发送DMCA删除通知至[此页面底部列出的联系地址](mailto:team+cs@stackexchange.com) 。此外,该信息不受版权保护,仅受信息表达方式的保护。稍微重构和删除WordsRunTogetherWikiWikiStyle可以改善此答案,并消除任何侵犯版权的风险。
吉尔斯(Gilles)'所以

1
+好的答案,但我有一个要选的-分析器。它们背后没有理论-只是“常识”。在学者当中,人们普遍认为没有发现很多问题,而另一种技术却没有发现。检查此链接。
Mike Dunlavey 2013年

5

我认为简单和易学是主要标准之一。在编程入门课程中,我们希望避免不必要的编程障碍,并尽可能将重点放在编程和算法问题解决的原理上。一年级的学生通常缺乏对问题进行算法思考的能力,因此本课程也与算法思维教学有关。

另一个标准是该语言在行业中的实用性。我们不想教一种在业界没有用的语言。显然,大多数学生将在行业中工作,因此应该对行业中正在使用(并将在学生毕业时使用的东西)有所了解。

第三个标准是学生以后几年要修的课程。这些课程(尤其是必修课程)不是自己设计的,而是与其他课程协调的。

我现在能想到的最后一个与jmad的答案相同,该语言应使学习其他重要语言变得容易。它应该足够丰富,并且容易掌握后来的重要语言(在这里,重要的手段从学生的角度来说很重要)。

我认为许多大学已将其主要的编程课程介绍从Java / C ++ / C转换为Python,尽管它们可能会不时提供其他语言的编程介绍(通常适用于非计算机科学专业,例如电气工程专业的C)如果教师想偶尔尝试教授另一种语言,则它们可能会显示出灵活性。


3
在入门性编程课程中,我不会对行业的有用性给予很高的评价。一个成功的程序员在其职业生涯中可能必须学习多种语言,其中一些是“在工作中”,因此掌握和学习新语言的能力是需要教授的一项关键技能。因此,我不希望大学毕业课程中教授的第一语言必定是他们毕业时最强的语言。

1
@Ben:如果学生不打算学习CS专业,那么在行业中发挥作用尤为重要。我来自很多人,他们从事生物学或其他科学领域的工作,鉴于他们将没有时间学习多种语言,因此学习其生态系统中常见的东西(如Python)可能比ML,Java或C更有用。
hugomg

1
以行业人士(一个特定行业,不一定是代表人物)的身份发言时,我认为与行业相关性不是影响未来的一级程序员的因素。即使在我的领域(嵌入式编程)中我们大多数使用C,暴露于多种范式也可以使程序员成为更好的程序员。语言的某​​些细节可以在手册中学习,而一般的概念在学校最好教。对于偶然的程序员(例如科学家)来说,优先级是不同的-但是过多地关注Fortran可能会使人们在应该使用Numpy时忽略它们。
吉尔(Gilles)'所以

5

因此,我将立即免除我的下意识反应,这就是每个人都应该通过SICP学习编程,因为Lisp是正确的事情。

选择语言已经提供了许多好的标准…… 简单性可移植性是最重要的。但是,我还认为,对于刚接触编程的学生来说,不要对现代语言的幕后发生错误的想法(或完全不了解)至关重要。

尽管其中一些其他帖子提供了出色的标准,但我想使用一种特定的语言来说明“满足标准”的样子。

这些问题中的一些已经在Joel Spolsky的博客文章JavaSchools的危险中得到了解决(比我能尝试的要好得多)。选择Java或Python之类的语言将结束CS中两个较难(也是最重要的)概念。即指针和递归。

当然,用C讲授入门课程会非常密集,同时也可能缺少许多与递归相关的重要概念。同样,在Lisp语言讲授一门课程将不得不在幕后地址指针,作为carcdr暗示有关链表重要的概念,同时让语言处理细节。

基本上,我要讲的是,学生需要了解数据结构和算法的基础知识以及实际实现。

我也不同意这个建议 不要使用面向对象的语言的建议。我认为面向对象语言在现实世界中建模的实用性对新程序员来说是一项积极的财富,只要可以明确阻抗不匹配,并且面向对象语言是众多编程语言中的一种。

我建议Ruby(另一篇文章也建议使用Ruby)举例说明了在某种语言中寻找用于编程课程入门的许多品质。

我将暂时证明这一主张,但首先,我想对CS入门课程中困扰我的一种趋势发表评论。我在一所大学工作,与许多学校一样,最近又开始使用Python进行入门课程。我坚信Python是新的BASIC,正如我最近在其他地方指出的那样,该语言的趋势是选择对功能和表现力友好的新人。。这是一种损害,我们需要考虑他们将成为的程序员,而不是目前的新手。

无论如何,证明Ruby是一种入门语言...

  • Ruby尽管没有进行尾调用优化,但递归效果很好。就是这样。
  • Ruby是多种范例。尽管它是一种纯粹的面向对象的语言,但它也包含函数式编程,并附带了一些强制性的C派生训练轮。与此相比,Python是一种过程语言,带有一些固定的OO(尽管显示了细节)和一些功能性元素(Python的BDFL 反复尝试删除))。
  • CRuby(又名MRI或“ Ruby Classic”)是用C语言编写和扩展的。您可以malloc()通过教他们扩展C语言来教给学生有关指针,内存管理和恐惧之神的知识。
  • 即使认为它是一种高级的动态语言,您也可以教很多有关数据结构,类型等方面的知识;有许多库(宝石)供您想象,从红黑树到用鸭嘴做怪事。

无论如何,无论您是否专业地使用它们,都无法替代从许多范例中学习许多语言。基本上,我认为每个人都应该理解 C和Lisp (如果不使用的话)。Ruby是我在入门学期中可以想到的最佳折衷方案。

总之...就是我的US $ .02。我并不是要说服您使用Ruby,请注意...只是将其作为一种品质的典范,可以在教学入门课程的语言中找到。


2
“我坚信Python是新的BASIC”-复制它。“ CS中两个最困难(也是最重要)的概念;即指针和递归” –我从未学习过专门处理指针的语言,也从未错过任何东西。当我了解了编译器的工作原理后,便对指针进行了足够迅速的解释。
拉斐尔

我同意多范例语言的魅力(尽管教两到三个“纯”语言可能会更好),但是出于这个原因,我不会选择Ruby。其他语言要更好,恕我直言,特别是在基本库方面。例如,Scala拥有一个完整的不可变集合库。
拉斐尔

3
我也相信Python是新的BASIC。但是,为什么要反对 Python?
JeffE 2012年

1
@Raphael,仅当您以C开头时,指针才很困难,这在有些事情没有解决且它们与数组的关系混乱时,会迫使您暴露于指针。当我自学Pascal时,指针对我来说并不难。对于我班上在Algol 68中教过指针的人来说,指针并不难(它们在此处被称为引用,但是它们是另一个名称的指针,就像在Java中一样;在Algol 68中难于使用的是自动取消引用规则),如果您不从教C子集入手,使用C ++的指针就不难了。
AProgrammer

1
@DaveClarke:它缩进了空格,这足以弥补这些空白。
拉斐尔

5

我的第一种编程语言是玩具汇编语言。第二个是Fortran。在这之间,我被教给了一个“算法”符号,大约是Algol60。结果还不错。实际上,我认为我所教的内容非常完美。

当我第一次研究函数式编程时,虽然没有使用实现的语言,但在研究论文中,我说:“哇,这是完全不同的。这是完全数学的!” 大多数接受过函数式编程培训的人仍然具有相同的“哇”经验。我认为那太好了。

我认为命令式编程和函数式编程是看待世界的两种完全不同的方式。如果我们剥夺他们多样化的经历,将会给学生带来伤害。

最好的第一门编程语言应该是尽可能简单和清晰的语言,以便学生能够专注于如何清晰思考。不幸的是,大多数现代编程语言都无法比拟Fortran和Algol 60的组装简单明了。Haskell是一个很好的例外。但是,Haskell将使我成为理想的第二编程语言,而不是第一。埃菲尔(Eiffel)或奥伯隆(Oberon)也许可以满足要求。


5

北卡罗来纳州科学与数学学院自2004年以来,我们向学生介绍了Python。我们使用它来教授过程编程,因为我们认为编写简短而正确的过程的能力对于以后使用包括OO在内的较重工具进行开发至关重要。编程。

由于这些原因,我们喜欢它。

  1. Python不是自由格式的语言。它迫使学生使用缩进在块中编写代码。(作为技术说明,我们使用vim文本编辑器并将[ set tabstop=4 set et]放在.vimrc中,以消除烦人的问题,并使代码缩进引人注目,但不会引起难看的过度水平偏移)。我们的学生习惯于看到由空格分隔的程序的层次结构。结果,当他们使用其他语言编程时,他们的格式化习惯往往非常好。

  2. Python的语法简单性使其易于初学者使用。可以用最少的奥术关键字和神奇咒语编写简单的程序。我们希望那些通常不会想到编程的学生尝试一下。注意Python的简单性hello.py。很清楚发生了什么事。

  3. Python是动态类型,而鸭子类型是动态类型。这使得引入变量变得容易。我告诉我的学生,变量只是标签。他们指向对象。您使用变量名向对象发送消息,就像有人通过电话呼叫您向您发送消息一样。

  4. Python是一个有抱负的学生不会成长的工具。它具有复杂的库,可以处理许多有用的东西。这是一个功能强大的创意工具,可供初学者使用。

  5. Python是免费的,并且可以在所有主要平台上运行。我们学校是具有各种机器的异构OS环境。我们不必担心诸如兼容性问题之类的麻烦。它几乎可以在任何计算机上运行。

  6. Python具有出色的文档。我们鼓励学生在线外进行探索,修补和着色。他们会及早学习使用Python文档,并经常在课外探索很棒的东西。

我们对Python非常满意。


1
欢迎!这是一个很好的案例研究,但是在选择标准之后,imho并没有回答任何问题。向后阅读您的项目可以做到这一点,但是我不确定您是否打算那样做。
拉斐尔

没有特定的顺序。这是一个“和”。
ncmathsadist 2012年


1

TL; DR:无法客观地回答此问题,因为其背后的标准没有客观依据。试图争论蓝色在客观上是否比红色“更好”,或者在客观上说香草冰淇淋是否比巧克力“更美味”,这就像在争辩。


我认为已经有一些精彩的帖子了,但是我会加我自己的2美分。

什么 教育者可以使用客观标准来选择编程语言作为大学一年级编程课程的基础?

这个问题类似于询问是否有一种方法可以客观地选择其他人首次访问冰淇淋场所时应该尝试的第一种冰淇淋口味。不,没有客观的方法来选择内在的东西主观的

为什么?因为即使我们看佩德罗回答中提到的合理标准,每个人仍然会对每个因素如何“坚持”反对别人的观点有主观的看法。

例如,Ruby在客观上是否比Python“简单”?在什么意义上更简单?关于什么?“简单”对意味着什么?这是否意味着“更少的代码行”?它意味着“更容易阅读和理解”吗?那别人呢 为什么有人要同意这里的任何特定选择?我认为我们不能客观地回答这个问题。

这导致了下一个问题。

这些标准的依据是什么?

尽管某些标准可能是合理的,但我认为这更多地基于主观偏好。例如,我没有理由只接受Pedro的简单性明确性可移植性行业偏好标准-不管有人认为它有多合理。实际上,从定义上看,行业偏好是主观的,只会导致恶性循环。(每个人都接受过培训,因此每个人都在行业中使用它,这就是每个人都接受过培训的原因,...)

例如,为什么不

  • 效率:执行时间和内存占用量可以实际测量。
  • 大小:尽可能少的保留字数将使该语言更易于学习。
  • 功能集:更广泛的受支持功能集(例如lambda,泛型,面向对象,运算符重载等)将使您能够教更多的概念,而不必切换语言并回到正题。
  • 互操作性:可以提出一种易于与其他语言和本机系统一起使用的语言(例如,来自C#或Python的Win32 API),以作为更好的长期投资等。

关键是,尽管我可以提出一套不同的评估标准并且仍然被认为是合理的,但我们不能声称它在客观上优于/劣于他人。

总之,该标准没有客观依据。试图争论蓝色在客观上是比红色“更好”的颜色,或者是否是香草冰淇淋,这是任意的。客观上比巧克力更美味。

这并不是说您没有充分的理由证明自己的偏好,但总而言之,它们只是您的偏好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.