it-swarm.cn

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

根据您的情况,应该在大学教授每位计算机科学学生使用哪种语言(或类的编程语言课程,再加上该类别的推荐语言)?激励你的答案;为什么用这种语言?一个人将有什么用?它教什么概念(比X语言更好)?

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

13
Anto

我要列出一个清单:

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

学生应至少接触这些范例中的全部。不只是一两个。

我想很多人会建议Python涵盖程序样式,OOP样式,也许还有其他样式,但是我对Python没有足够的个人经验来能够自信地推荐它。

21

我个人觉得功能语言没有像以前那样占主导地位而感到有些可悲。我认为,至少理科生应从所有主要范例中学习语言:程序,面向对象,功能和动态。

45
Michael Brown

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

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

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

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

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

33
Joel Etherton

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

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

6
oosterwal

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

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

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

4
Aidan Cully

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

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

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

4
bethlakshmi

yacc

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

3
mariotomo

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

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

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

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

2
user18041

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

2
knivil

真的很重要吗?

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

并不是您所了解的语言使您成为一个好人或坏人,而是如何使用它。为此,基本上有两类程序员:

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

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

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

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

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

2
Newtopian

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

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

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

1
hotpaw2

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

1
Sean Patrick Floyd

不要忘记面向堆栈/连接的语言!他们可以是真正的弯腰者。他们强调使用小的,易于理解的原语来构建复杂性。您可以使用它们编写 pointfree(或tacit) 感觉很干净的代码。

经典的语言是 Forth ,但是我最近要去的地方是 Factor 。也值得一看的是 JoyCat 。不要错过 连接语言Wiki 。比装满铁锤的袋子更有趣!

1
Scant Roger

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

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

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

因此,具体来说:

OOP:.NET或Java

至少有一种其他的编程范例,使学生了解其他方法。

功能性:Lisp?

1
Steven Jeuris

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

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

0
dsimcha

伪代码。

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

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

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

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

“那是什么?”

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

0
Kirk Broadhurst

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

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

0
umlcat

C。

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

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

0
Raveline

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

0
Zachary K