每个计算机科学专业的学生应该教什么编程语言?


13

应该根据您的要求,在大学里为每位计算机科学专业的学生教授什么语言(或类的语言(如范式),再加上该类的推荐语言)?激励你的答案;为什么用这种语言?一个人将有什么用?它教什么概念(比X语言更好)?

注意/说明:这个问题是关于计算机科学的,重点是软件工程,而不是纯粹的计算机科学。重点仍然是计算机科学教育,而不是软件工程教育。


13
伪代码对于CS应该足够了。
JE队列

12
@Xepoch-不同意。用伪代码表达渴望与懒惰的评估语义,类型签名中的协方差/矛盾,类别理论等并不是很自然。伪代码非常适合描述算法和数据结构,但是CS的功能远不止这些。
艾丹·库利(Aidan Cully)

6
此外,绝大多数的CS学生都希望毕业后能获得一份非学术性的工作。在竞争激烈的就业市场上,伪代码不会有太大价值。我不认为CS学位主要应该是工作培训,但必须在这个方向上有所适应。
亚当·克罗斯兰

2
全部。如果时间有限,请以字母开头。A +,B,C,C#,D,E,F#,J,K,Q,R,T ...实际上,这不是一个坏列表。
杰西·米利坎

6
祝贺您发现了另一种“哪种语言?” 题。我等不及要阅读所有意见。不要忘记对SICP的引用。哦,等等,那里。
科尔宾2011年

Answers:


21

我要列出一个清单:

  • 汇编(一种相对简单的方言):至少要了解一些基础知识很重要
  • C:程序语言,在许多地方都使用。不会一次给新生带来全新的概念,例如OOD。
  • Java / C#/ Eiffel / C ++:某种面向对象的东西很好,其中任何一种都可以实现教给学生OOD的目标,一旦他们理解了其中一种语言,他们就应该能够学习其他语言。很好的语言,我列出了Eiffel,因为它还具有按合同设计的功能。
  • LISP和Prolog:即使他们从未在“真实世界”中使用过这两种方法,也可以教给学生一种全新的思维方式,这很重要。
  • SQL和XML:介绍了思考数据以及如何检索和管理数据的新方法。

学生应该至少接触所有这些范例。不只是一两个。

我想很多人会建议Python涵盖程序风格,OOP风格,也许还有其他方面,但是我对Python的经验不足,无法自信地推荐它。


我真的希望我的学校对XML和SQL进行更多的详细介绍,我们有一个课程同时进入了这两个领域,这真是太糟糕了。

我会添加现代动态语言,例如Lua,Python,Javascript等
Javier

4
嗯,还有一些核心功能,例如haskell和erlang 很有教育意义
Javier

1
+1用于列出SQL。至少您正在考虑关系代数。
JE队列

1
我也将托管对象与非托管对象(C ++ Java)分开。自从uni以来我从未使用过C ++,而没有学习malloc,堆和堆栈,但是您对OO的了解永远不会那么好。
markmnl 2011年

45

我个人感到有些遗憾的是,功能语言没有像以前那样占主导地位。我认为,至少理科生应该接触所有主要范例的语言:程序,面向对象,功能和动态。


2
+1我的编程语言课很容易成为我上的最有价值的课。
2011年

1
作为一名IT学生,我绝对同意。我上初中级Web应用程序开发人员时可以在现实世界中全职工作,但我感觉即使我获得了完整的CS学位,我也会错过很多不同的知识范例。

1
有点相关:youtube.com/watch?v=Ps8jOj7diA0斯坦福大学在YouTube上有完整的2008年编程范例讲座。
Inaimathi 2011年

4
将声明式添加到列表(Prolog)。另外,某些语言是显式并行的(Occam)。教学生并行性是如何工作的(没有人正确)。
马丁·约克

1
@马丁·约克:Prolog是一种逻辑编程语言,是一种声明性语言。(我说这是函数式编程语言,一般来说也是声明性的。)
mipadi

33

我认为应该为均衡的CS学生提供4种编程语言类型的每种语言的教授:

功能 -Lisp / Haskell / PostScript。我没有Haskell的丰富经验,但是我听说过其他对此赞不绝口的程序员。了解函数式编程的结构以及它们在许多情况下的用处,将有助于程序员更好地组织其他语言的算法。

面向对象 -选择。C#/ Java / Python / Ruby / yadda yadda yadda。只需简单地教这种类型,因为这就是现代企业想要的。

命令式 -C / Fortran / Pascal。这些天这些日子很少见,但仍应从实际/历史的角度来学习它们。他们采用的方法仍然具有实用性,因为在每种语言中,所有这些都归结为一条指令。命令式语言非常擅长列出和遵循说明。

逻辑 -ProLog。我从来没有发现任何一种语言有很好的实际用途,但是当试图弄清楚如何用更多面向对象的语言编写我的一些方法时,我发现了逻辑语言背后的一些概念很方便。在大学期间,我并没有专注于逻辑语言,所以我认为在那里集中精力可能会给我带来一些好处。


6
您可能希望将原型添加到该列表中,例如JavaScript。
stusmith

@stusmith-值得一提的是原型,但它实际上是面向对象语言的子集,而javascript最多是一个有限的示例。我认为这可能是编程语言课程中的一项家庭作业,但不是重点。
乔尔·埃瑟顿

1
+1为序言。我已经看到了它的实际用途,并且经常使用它来原型化算法。
Fred Foo

@larsmans-我很想听听您的用法。几年来我都没有碰过它,所以我对它的良好实际应用感到困惑。您是否有指向白皮书或类似文章的链接?
乔尔·埃瑟顿

查看ECLiPSe(eclipseclp.org),这是一种开源的Prolog方言,已被多家大型欧洲公司(在法国铁路公司SNCF,如果我没记错的话,在工业上使用过;我会尝试查找参考)。
Fred Foo

6

每个应届CS专业学生都应该知道的第一语言是最大程度地发挥其获得出色工作潜力的语言。这将随着时间的推移而改变,它将根据个人对出色工作的定义而改变,并且会因地理区域而异。

目前,我会说英语是每个CS专业人士都应该知道的第一语言(当然,这会因地区而异。)


一项出色的工作是CS学位的副作用。因此,CS学位就是计算理论的知识。这些年来,我本可以轻松地在职业教育中找到更好的工作,而不必在数学和CS上全神贯注。
JE队列

2
+1(英语)。计算机语言是实现细节。
Wyatt Barnett

+1。如果某人可以很好地学习英语,那么他也可以很好地学习手册。我英语说得很好。我学习任何语言都没有问题。
Shiplu Mokaddim 2012年

4

我认为它会随着时间而变化,但理想情况下-从3个非常不同的角度来看3种语言。在我这一天,它是程序,面向对象和功能的-Pascal,C ++和LISP。我不是很喜欢这三个产品。但是当我面试的时候我会寻找:

  • 在某种语言上必须要注意内存管理的经验(C / C ++等)
  • 对面向对象的语言有一定程度的经验,对API的使用和各种可用的抽象有期望(C ++ / Java)
  • 一种“拉伸”语言-一种奇怪,困难和挑战性的语言。我不打算雇用人,因为有人知道LISP,汇编语言或其他具有挑战性的语言,但是我想看到工程师面临某种挑战,其中包括解决严重的问题和很多“这到底是什么?” 片刻。

作为另一项交易-我认为CS程序确实需要在市场上以突出的语言培训学生。在任何给定的时间,我认为2-3种语言在大多数工作中都占有重要地位。我认为学校应该为学生提供机会,使他们有机会学习至少三种语言中的三分之二。


4

对于CS学生,寻找与所讨论的CS概念紧密对应的编程语言。我建议:

  • 方案,以更好地了解lambda演算
  • Erlang,了解演员模型
  • Prolog,用于谓词逻辑和证明系统
  • Haskell,用于类型/类别理论,并且因为懒惰的评估是如此充分地用语言表达
  • 至少一种汇编语言-如果您想在此旗帜下算一算,我还会使用字节码语言,例如Java或CLR字节码,以及LLVM IR
  • 可能是硬件定义语言,例如Verilog或VHDL
  • Bison用于编译器构造类
  • 具有动态类型系统的东西(会想到Ruby)...

清单可以以这种方式进行下去,但基本思想很简单:向学生教授最适合您要教授概念的编程语言。


3

yacc

为了了解幕后发生的事情,无论您使用哪种编程语言。它有助于掌握基本概念,例如无效代码,以及(好的)编译器可以为您完成的各种优化。


2

Lisp(带有面向对象的CLOS)和Haskell。这个问题不仅限于学生。新的高级编程语言从这两种语言中借鉴了很多功能(复制,被盗?……不,还不错)。您可以为未来做好准备。在今天,函数式编程(样式)变得越来越重要,并以命令式编程语言(如C#(LINQ)或C ++(lambda)等)引入。有些学生仅学习Java是很糟糕的。


1
虽然我同意这两种语言,但您可能需要放下一些推理(我还要注意,将它们作为唯一的语言知道不是特别有用)。
Inaimathi 2011年

2

我认为这种语言并不像人们所相信的那么重要。

是的,您需要知道如何编程等,但是许多优秀的程序员都是根据他们的实际经验自学的,这些经验对他们的开发有所帮助。

学生可以学习一些有关如何在现实世界中编程的课程,而不仅仅是书本方法,这将使他们更加“全面”,并且我选择更好的开发者/毕业生。

我离开大学并开始工作后,了解了有关编程和软件开发的更多信息!


2

真的有关系吗 ?

通常,这个问题的根源是“我可以在简历中加上哪些流行语来使我获得最有利可图/最有趣/最具挑战性/最轻松的工作?”。尽管这个问题有其优点,因为大多数简历首先是由人力资源人员筛选的,这些人力资源人员不了解所要寻找的内容。但是它很浅,因为一旦您通过了大门,就需要交付货物。

并不是让您成为优秀或不良程序员的语言,而是如何使用它。为此,基本上有两类程序员:

  1. 那些专注于学习核心语言的人。最重要的是语言以及如何使用它。在极端情况下,它们往往会超级优化每一个小小的代码斑点,并且往往会因为它们可以使用而使用晦涩的功能。

  2. 还有一些人想学习技术和范例。他们使用什么语言并不重要,只要它可以优雅地表达他们的心理印象即可。在极端情况下,这些将倾向于使用UML或其他此类系统,以希望其他人能完成编码工作。

我认为你们都需要。#1将提供短期技能,如果选择得当,将使您轻松通过人事管理,但#2将在您的整个职业生涯中陪伴您,并将您定义为程序员。

#2将提供指导并组织您的思路,以找到解决当前问题的可行方法,但如果没有第一个问题,它仍然是一个主意,永远漂浮在蒸发器天堂(或地狱,取决于您从何处看)的边缘。

#1将为您提供将思想实施到实际工作系统中的方法,但如果没有2,您的系统将趋向于癌变无形的怪物。


是的,这很重要。您学习的第一门语言会影响您如何看待未来的语言。

1

我相信您部分回答了自己的问题。

真正重要的是让学生有机会接触几种范例,实际的语言无关紧要。

当然,重要的是要首先教给那些提供最多工作机会的范例(目前可能是OOP)。因此,最好为这种范例教授一种广泛使用的语言,因为这比学习您可能永远不会使用的东西更有用。因此,我也讨厌不得不在考试中编写伪代码。伪代码很好,只要它没有“固定”语法即可。您应该只能够提出概念。

因此,具体来说:

OOP:.NET或Java

至少有1个其他编程范例,使学生了解其他方法。

功能性:Lisp?


功能,不,请不要LISP。而是:haskell。
mariotomo

1

汇编语言和微码。CS学生应该了解布尔状态机和最新的高级功能/ OOP /等之间的所有抽象基础层。编程语言范例。

基本或徽标或吱吱声等),如果他们想了解如何教小孩子一些计算机知识的话。

Fortran,Cobol和Lisp,如果他们想了解编程语言的历史以及现代实践解决的实际问题是什么。


和C,因此您了解您可以学习的所有开放源代码中的90%。
2011年

1

从不同的范例中选择3种或更多种语言并不难,已经给出了许多好的答案。但是,如果我只选择一种语言,我会选择Scala,因为它既是功能性的又是面向对象的。您可以用相同的语言解释和比较不同的方法。


1

不要忘记面向堆栈/连接的语言!他们可以是真正的弯腰。他们强调使用小的,易于理解的原语来构建复杂性。您可以使用它们来编写无意义的(或默认的)代码。

最经典的语言是Forth,但是现在我最喜欢的是Factor。另外值得一提的是JoyCat。不要错过连接语言Wiki。比装满铁锤的袋子更有趣!


0

具有功能的Haskell或Lisp是我的首选,但也许是Erlang。函数式语言确实教会您如何以非常强大的方式构建抽象。


但是,应该将学生限制在一种范式吗?像Scala这样的功能性OOP语言呢?
安托

1
当然不是,我假设其他人会为那些人服务!
Zachary K

0

尽管缺乏主流性,但我发现D(特别是版本2)提供了一些有趣的课程,这些课程在其他地方不容易学习。它比我能想到的任何其他语言都要进行更认真的尝试,以使命令式/过程式,面向对象和函数式编程相互配合,并允许以较低级别进行编程(指针,手动内存管理,内联)汇编语言)和使用同一语言的高级语言(泛型和泛型编程)。

这很有价值,因为您不必像看到各种范例那样将它们单独存在,而是可以通过树木看到森林。当您将它们混合到程序中时,可以细粒度地看到每个范例的优点和缺点。您将看到如何在底层代码方面在库中实现范例的主要方面。标准库模块std.algorithm实现了重要的函数式编程原语,但它是直接的,简单的D代码,没有魔术。同样,std.range实现惰性求值,但同样是相当简单的D代码。您将了解每个范式的原语所涉及的成本,因为D的最接近金属的特征使引擎盖下的实际操作变得相对透明。您甚至可以编写类似于C的底层代码,然后使用相同的语言为其创建漂亮的高层接口,而不会遇到魔术胶层。


0

伪代码。

本领域的人们应该能够以连贯,结构化的方式解释他们的想法,而无需使用框架或语法专用的术语。为了理解算法,我不必知道方括号和花括号之间的区别。我不需要知道什么??意思,或者什么是grep开关。

用通俗易懂的语言编写,但像代码一样对其进行结构和格式化。任何人都可以用他们喜欢的任何语言来实现它。

编辑:这个答案部分是由于某些程序员不能编写伪代码而引起的。

“只需用伪代码编写算法”

“那是什么?”

伪代码的好处是非编程利益相关者可以理解它。我并不是建议您让BA和用户来验证您的代码,但是当非程序员了解所需的算法时,它可以提供帮助。Psuedocode消除了解释的必要,for (int i = 0; i < j; i++)本质上是样板术语。


许多编程语言都足够强大,因此实际代码和伪代码之间几乎没有区别。您反对实际编程语言的哪些语法元素?
凯文·克莱恩

@kevin cline-我对所知道的语法元素感到满意-这是我可能会反对的那些我不知道的语法元素。当然,我能够破译它们,但重点是伪代码不应该存在这些问题(我尚未看到一种编程语言,看起来真的像伪代码)
Kirk Broadhurst

0

C。

  • 首先,它仍然被使用(广泛使用!),并且不仅用于内核。我目前正在维护用C编码的业务应用程序。因此,即使使用简单的C语言,您仍然可以找到工作。在大公司,工业界,几乎所有地方(但在Web开发人员中)。
  • 如果您要在Unix / Linux环境中工作,那么至少不了解C有点像逛街购物且无法读取标签上的价格。
  • 指针!每个人都应该理解指针(请参阅Joel Spolsky)。另外,一旦掌握了malloc概念,您就会清楚地知道在OOP语言中不小心键入“ new”会发生什么事情。
  • 大多数“流行语言”语法都源自C。
  • 是的,并不总是很清楚。是的,很难学习。是的,对于初学者来说,弦乐有些噩梦。但是编程并不总是很清楚并且很难学习,当您学习C之后,尝试C ++并发现std :: string时,您将真正理解OOP的优点。

当然,一个人应该不止一种语言,而不仅是一种古老的程序语言。但是,如果我只能在一个只有一个编译器的荒岛上工作,那我会选择我的旧版gcc。如果您了解低级编程,则可以了解高级编程。我认为这是不正确的。


0

用来获得一般问题解决技能的一些编程语言和徽标和Karel等编程概念,应该在C / C ++ / Java / Lisp / PERL / Assembly /任何编程范例之前进行讲授。

学生将获得非常实用的编程入门。


-1

任何物体。只要确保他们学得好。

我会随时为C#雇用一位出色的Java程序员,但是雇用一个从未编写过真正代码的人会产生很多疑问

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.