应该根据您的要求,在大学里为每位计算机科学专业的学生教授什么语言(或类的语言(如范式),再加上该类的推荐语言)?激励你的答案;为什么用这种语言?一个人将有什么用?它教什么概念(比X语言更好)?
注意/说明:这个问题是关于计算机科学的,重点是软件工程,而不是纯粹的计算机科学。重点仍然是计算机科学教育,而不是软件工程教育。
应该根据您的要求,在大学里为每位计算机科学专业的学生教授什么语言(或类的语言(如范式),再加上该类的推荐语言)?激励你的答案;为什么用这种语言?一个人将有什么用?它教什么概念(比X语言更好)?
注意/说明:这个问题是关于计算机科学的,重点是软件工程,而不是纯粹的计算机科学。重点仍然是计算机科学教育,而不是软件工程教育。
Answers:
我要列出一个清单:
学生应该至少接触所有这些范例。不只是一两个。
我想很多人会建议Python涵盖程序风格,OOP风格,也许还有其他方面,但是我对Python的经验不足,无法自信地推荐它。
我个人感到有些遗憾的是,功能语言没有像以前那样占主导地位。我认为,至少理科生应该接触所有主要范例的语言:程序,面向对象,功能和动态。
我认为应该为均衡的CS学生提供4种编程语言类型的每种语言的教授:
功能 -Lisp / Haskell / PostScript。我没有Haskell的丰富经验,但是我听说过其他对此赞不绝口的程序员。了解函数式编程的结构以及它们在许多情况下的用处,将有助于程序员更好地组织其他语言的算法。
面向对象 -选择。C#/ Java / Python / Ruby / yadda yadda yadda。只需简单地教这种类型,因为这就是现代企业想要的。
命令式 -C / Fortran / Pascal。这些天这些日子很少见,但仍应从实际/历史的角度来学习它们。他们采用的方法仍然具有实用性,因为在每种语言中,所有这些都归结为一条指令。命令式语言非常擅长列出和遵循说明。
逻辑 -ProLog。我从来没有发现任何一种语言有很好的实际用途,但是当试图弄清楚如何用更多面向对象的语言编写我的一些方法时,我发现了逻辑语言背后的一些概念很方便。在大学期间,我并没有专注于逻辑语言,所以我认为在那里集中精力可能会给我带来一些好处。
每个应届CS专业学生都应该知道的第一语言是最大程度地发挥其获得出色工作潜力的语言。这将随着时间的推移而改变,它将根据个人对出色工作的定义而改变,并且会因地理区域而异。
目前,我会说英语是每个CS专业人士都应该知道的第一语言(当然,这会因地区而异。)
我认为它会随着时间而变化,但理想情况下-从3个非常不同的角度来看3种语言。在我这一天,它是程序,面向对象和功能的-Pascal,C ++和LISP。我不是很喜欢这三个产品。但是当我面试的时候我会寻找:
作为另一项交易-我认为CS程序确实需要在市场上以突出的语言培训学生。在任何给定的时间,我认为2-3种语言在大多数工作中都占有重要地位。我认为学校应该为学生提供机会,使他们有机会学习至少三种语言中的三分之二。
对于CS学生,寻找与所讨论的CS概念紧密对应的编程语言。我建议:
清单可以以这种方式进行下去,但基本思想很简单:向学生教授最适合您要教授概念的编程语言。
Lisp(带有面向对象的CLOS)和Haskell。这个问题不仅限于学生。新的高级编程语言从这两种语言中借鉴了很多功能(复制,被盗?……不,还不错)。您可以为未来做好准备。在今天,函数式编程(样式)变得越来越重要,并以命令式编程语言(如C#(LINQ)或C ++(lambda)等)引入。有些学生仅学习Java是很糟糕的。
真的有关系吗 ?
通常,这个问题的根源是“我可以在简历中加上哪些流行语来使我获得最有利可图/最有趣/最具挑战性/最轻松的工作?”。尽管这个问题有其优点,因为大多数简历首先是由人力资源人员筛选的,这些人力资源人员不了解所要寻找的内容。但是它很浅,因为一旦您通过了大门,就需要交付货物。
并不是让您成为优秀或不良程序员的语言,而是如何使用它。为此,基本上有两类程序员:
那些专注于学习核心语言的人。最重要的是语言以及如何使用它。在极端情况下,它们往往会超级优化每一个小小的代码斑点,并且往往会因为它们可以使用而使用晦涩的功能。
还有一些人想学习技术和范例。他们使用什么语言并不重要,只要它可以优雅地表达他们的心理印象即可。在极端情况下,这些将倾向于使用UML或其他此类系统,以希望其他人能完成编码工作。
我认为你们都需要。#1将提供短期技能,如果选择得当,将使您轻松通过人事管理,但#2将在您的整个职业生涯中陪伴您,并将您定义为程序员。
#2将提供指导并组织您的思路,以找到解决当前问题的可行方法,但如果没有第一个问题,它仍然是一个主意,永远漂浮在蒸发器天堂(或地狱,取决于您从何处看)的边缘。
#1将为您提供将思想实施到实际工作系统中的方法,但如果没有2,您的系统将趋向于癌变无形的怪物。
从不同的范例中选择3种或更多种语言并不难,已经给出了许多好的答案。但是,如果我只选择一种语言,我会选择Scala,因为它既是功能性的又是面向对象的。您可以用相同的语言解释和比较不同的方法。
尽管缺乏主流性,但我发现D(特别是版本2)提供了一些有趣的课程,这些课程在其他地方不容易学习。它比我能想到的任何其他语言都要进行更认真的尝试,以使命令式/过程式,面向对象和函数式编程相互配合,并允许以较低级别进行编程(指针,手动内存管理,内联)汇编语言)和使用同一语言的高级语言(泛型和泛型编程)。
这很有价值,因为您不必像看到各种范例那样将它们单独存在,而是可以通过树木看到森林。当您将它们混合到程序中时,可以细粒度地看到每个范例的优点和缺点。您将看到如何在底层代码方面在库中实现范例的主要方面。标准库模块std.algorithm实现了重要的函数式编程原语,但它是直接的,简单的D代码,没有魔术。同样,std.range实现惰性求值,但同样是相当简单的D代码。您将了解每个范式的原语所涉及的成本,因为D的最接近金属的特征使引擎盖下的实际操作变得相对透明。您甚至可以编写类似于C的底层代码,然后使用相同的语言为其创建漂亮的高层接口,而不会遇到魔术胶层。
伪代码。
本领域的人们应该能够以连贯,结构化的方式解释他们的想法,而无需使用框架或语法专用的术语。为了理解算法,我不必知道方括号和花括号之间的区别。我不需要知道什么??
意思,或者什么是grep
开关。
用通俗易懂的语言编写,但像代码一样对其进行结构和格式化。任何人都可以用他们喜欢的任何语言来实现它。
编辑:这个答案部分是由于某些程序员不能编写伪代码而引起的。
“只需用伪代码编写算法”
“那是什么?”
伪代码的好处是非编程利益相关者可以理解它。我并不是建议您让BA和用户来验证您的代码,但是当非程序员了解所需的算法时,它可以提供帮助。Psuedocode消除了解释的必要,for (int i = 0; i < j; i++)
本质上是样板术语。
C。
当然,一个人应该不止一种语言,而不仅是一种古老的程序语言。但是,如果我只能在一个只有一个编译器的荒岛上工作,那我会选择我的旧版gcc。如果您了解低级编程,则可以了解高级编程。我认为这是不正确的。