it-swarm.cn

理想的编程语言学习顺序?

你怎么看?理想的编程语言学习顺序是什么,它将覆盖当今大多数常用的语言和范例,并有助于掌握通用的编程基础,思想和实践?您甚至可以建议范式而不是语言的学习顺序。

N.B. :这是我在 stackoverflow 中提出的问题的端口,由于主观和争论而被关闭。

17
Gulshan

Python,LISP,C,Haskell

假设问题是关于新手编程的理想学习顺序(因为编程的老手将有自己的(可能是偶然的)学习顺序),我建议阅读 Norvig关于如何学习编程的文章,第10章)年 ,然后:

  1. Python :从动态的高级OO和功能性语言开始。因为对于初学者来说,至关重要) ASAP,并且不会因外来语法,缺少库,缺少多平台,缺少学习资源以及缺乏社区而关闭。Python具有很高的可读性,拥有大量的良好库(尤其是科学库-现代科学家/工程师必须知道如何编程),可以在大多数操作系统上轻松运行,具有大量的教程和完整的免费书籍,并且通常对用户友好-在您成为处理大型问题的高级程序员的同时,仍然足够强大,可以与您一起成长。对于初学者来说,加强重要的+有用的约定也很重要:代码可读性很重要,您应该为自己和他人编写代码容易理解。

  2. LISP:尤其是,至少要略读 计算机程序的结构和解释 或观看 SICP视频 ,并通过了解其基础和表达能力来睁大眼睛编程-事半功倍。了解LISP如何不仅可以表达功能范例,还可以表达OO,逻辑/声明性等等,例如创建新的领域特定语言。阅读 Norvig的PAIP 以了解主语言可以做什么。然后查看 Clojure ,这可能是Next Next Things之一。

  3. C:仅因为这是计算机语言。 :)如果目前主要是特定非软件领域中的程序员,则可能是可选的。我觉得这很丑陋,但值得了解一下有关底层硬件的知识。当然要 K&R

  4. Haskell :纯功能能力。当前的Com.Sci。理论和实践表达能力相遇。参见 真实世界Haskell

在完成上述导览之后,您将非常善于解决问题并用代码表达解决方案,并且对 此处的范例 非常满意:

alt text

26
limist

这就是我要做的:

  1. Python(或Ruby或Lua):一种解释型语言,没有类型,您可以用一些方法完成工作庞大的库(我猜这是Python最好的)。您可以深入研究算法,因为没有干扰。无需编译,只需运行即可。此外,还可以使用Python隐式地教好样式,因为Python是缩进的。是必需的。您也可以教对象定向(在Lua中更多是一个问题)。这里的目的是要有很多乐趣,并且向学生展示可以做什么。

  2. C++(或Java):一种快速的打字语言。如果需要对象定向,那么您已经知道一些概念。主要思想是“翻译”您在Python)中所做的工作,并使用新的约束(主要是类型)来完成。现在,如果您有正确的概念,则添加类型就不成问题了。下一步是考虑更底层的内容(Java在这里无济于事),并教指针well。我的意思是解释地址空间,CPU,OS,一点点的地方,以便您可以开始在程序的下面看。编译语言介绍了解释和编译之间的区别,对解释什么是机器语言非常有用,等等。

  3. 组装:最后,没有什么魔力,您只需要与机器对话即可。关于Intel和GAS语法存在争论,这并不重要。如果您有MIPS,我相信它更适合教学,但是我认为x86更加方便,因为它更加普及(x86_64更好,因为它具有更多的寄存器和优点)。您只需要消除一些复杂性,让学生根据需要进行进一步调查。

(这前三个是“深度”。到目前为止,我们一直在下降,直到您触及他们所说的“接近金属”的底部为止。我认为这非常重要的是,当您清楚地了解正在发生的事情时,就可以解决编程中的许多问题。当您知道这一点时,就可以放心地获得进一步的知识。)

  1. 方案(或Common LISP或Clojure):正如@dukeofgaming所说,LISP语言可以让您很好地教递归(因为这种方案是最好的,因为它不有明确的循环)。但是我会去教另外两件事:闭包和宏。宏是将LISP语言与其他语言分隔开的地方。我个人不喜欢Scheme宏,但这不是太重要。我认为Clojure宏很好,例如(但是Clojure中的递归不是那么干净,因为JVM没有尾递归)。闭包是一个非常重要的概念,一旦您将其关闭,便会立即“看到” Javascript。在研究了C++,Python和LISP之后,Javascript变得“琐碎”。

  2. Haskell:对于功能语言,我认为您无法击败Haskell。 LISP和Scheme被认为是功能性的,但是要强调功能性编程,您必须强迫学生在没有状态的情况下进行思考。 Haskell还具有其他一些非常不错的功能,例如,“ currying”(图形化)和用于“ destructuring”的模式匹配。我不太了解Haskell,但是您可以编写的代码简明扼要。很好地了解Haskell使理解Erlang的道路变得容易得多。

  3. Forth:一种堆栈语言。如果LISP和Haskell不够用,那将再次破坏您的逻辑。我会尽可能地讲授 Jones's Forth ,因为他们知道汇编,然后您可以完全了解发生了什么。 (例如,Knowing Forth打开了PostScript。)

(所以这最后三个是您所说的广度。对我来说,这些语言非常奇怪,以至于它们改变了您的思维方式。至少它们对我有用。而且我认为,有了这些,您就了解了足够的范例来学习一种新的语言。很快。)

您可以选择研究以下内容:

  1. Smalltalk:一种纯粹的面向对象语言。要查看当您认真对待“对象定向”时会发生什么,该语言不需要“ if”,“ for”。一切都是信息:再次实现重大成就。 (这将使Objective-C现在变得容易。)

  2. Go:一种(美丽的)语言,强调并发。我发现Go非常不错,可以轻松编程。

  3. Prolog:另一种编程范例。我没有写过任何Prolog,但我知道它是另一种令人折服的语言。

28
Pau Fernández
  • 您现在需要的那个
  • 接下来需要的那个
  • 之后需要的那个

认真地讲,我可能在我那段时间就学过BASIC,COBOL,Fortran,Forth,Pascal和Prolog,但是我从来没有特别需要使用它们,我真的看不到它们对我使用其他方法有什么影响语言,可能是彼此之间误用了范式。我花了很多年的时间来学习足够的BASIC知识,以实际地编写结构化的Pascal,花了几年时间才停止用C语言编写Pascal代码,又花了几年的时间才真正开始OOP,当我开始使用Objective- C和Java。另一方面,由于我(几乎)一直只用OO语言)工作,所以我能够专注于改善对OO语言,而无需尝试使它们看起来像Scheme或PostScript。

12
user4051

很难断言任何顺序都是理想的,但是我将提出一个可以证明其合理性的计划:

  1. [〜#〜] c [〜#〜]

    学习C需要耐心和勤奋,并且将向您介绍计算机处理数据的基本方式,并向您展示程序员可以接受的几乎所有最广泛的职责。

  2. Perl

    作为C所要求的严格性的解毒剂,请尝试令人难以置信的Perl。用C编写一周花了一个小时,而用Perl写一个小时。它引入了在编程中可以找到的另一种乐趣,并说明了排除某些顾虑和细节如何使程序员可以将精力集中在不同的事情上。

  3. C++,或者Java

    接下来,看看C如何将注意力集中在编程的低级和原始方面,以此作为提高抽象水平的基础,并指出人们在提高抽象性时会提高效率。探索如何形成仍然可以保留对您的程序至关重要的效率的抽象。

  4. 通用LISP

    这是前面的口号的奖励。您会发现在所有以前的语言中学到的东西的回声,并看到在LISP中进行编程时,前面提到的许多让步看起来多么愚蠢。 C的预处理器和C++模板准备了一个欣赏LISP宏系统的模板。您将重新获得Perl的易于表达,C进行低级优化的机会,C++或Java的抽象构建功能,并超越它们。前三者(也许除了Perl的调试器之外)都不会为您提供具备熟练的[〜#〜] repl [〜#〜](“读取,评估,打印循环”)。使用基于图像的环境-会更改源代码和“可执行程序”概念之间的关系-将会改变您的整个想法构建程序意味着什么。

除了这四种之外,还可以探索其他样式的编程,例如Haskell中的函数式编程或Prolog中的逻辑编程,从而可以更全面地理解编程的范围(如果愿意,可以广泛地了解知识),但是到那时,您的时间将得到更好的服务通过使用您知道的任何语言来提高自己的手艺(深厚的知识)。

品尝了足够多的独特语言后,您的观点将集中在超越任何一种语言的观念上。这就好比学习驾驶父亲的汽车和知道如何驾驶任何汽车之间的区别:您可能不喜欢不得不驾驶迷你租用车,范恩(van)呆了几天,充分了解了驾驶一辆最喜欢的跑车的乐趣,但是您会想出如何操作它的,并且肯定会比业余爱好者从可怜的野兽中骗走更多。

8
seh

1.小话

最初至少部分设计为儿童使用计算机学习的方式。语法很简单,可以在段落中描述。与LOGO一样,它体现了“低进入壁垒,高天花板”的原则。

在“一切都是对象”的意义上,Smalltalk是一种纯OO语言

它还讲授了许多功能技术,尤其是在其Collection API中:链接消息,高阶函数,映射,缩小等。

Squeak 社区充满生机和热情。您还将看到许多有关高级技术的讨论:与LISP社区非常相似, 邮件列表 上有很多经验丰富的Smalltalkers,他们愿意分享他们的知识。 (Squeak社区中有大量的专业教育人士子群,这也没有什么坏处。)对于初学者来说,还有 另一个列表

2.序言

一种逻辑编程语言,它将为您提供与几乎任何其他语言完全不同的计算视图。 Prolog也是声明式(但并非完全如此:!或cut运算符可能会对谓词产生重大的语义影响。

3.常见的LISP

如果您愿意,可以在这里替代方案。 Common LISP 支持多种范例,尤其是OO和具有功能。它具有悠久的历史(LISP是第二古老的仍被广泛使用的语言:仅FORTRAN的较老版本)。

4.哈斯克尔

(注意:我才刚刚开始学习它。)可能是地球上最纯净的功能语言。它具有非常先进的静态类型系统。方便 介绍书籍 存在。

5. C或Delphi

您需要了解计算机的工作方式。您需要知道内存和CPU的实际功能。传统上,这两者都是“接近金属的”,并具有鼓励思考其语言如何汇编为汇编语言的社区。

为什么要这个命令?

Smalltalk非常易于学习,因此您可以快速开始专注于解决问题,而不是与编译器抗争(“入门门槛低”)。一旦开始编程,您就可以做什么都没有人为的限制-“上限”。

一旦您对OO)的工作原理有了一个明确的想法(并且-附带条件是对“ OO”的含义有很多不同的理解-可以公平地说OO在市场上占主导地位),进入Prolog可确保您不会开始认为OO是唯一方法。Prolog是非常与大多数语言不同,并且会伸展您的智力,因此您不会开始以为自己了解所有知识。

普通的LISP反过来又是一种成年人的语言。它具有成熟的标准,数十年来一直是领先的语言设计(以及Smalltalk)-您最喜欢的语言刚刚拥有的所有这些新颖功能? LISP或Smalltalk中孕育的想法都有可能。普通的LISP也有些警惕,您随处都可以发现警惕。

Haskell在列表中排在第四位,因为(有人告诉我:我才刚刚开始学习它)它的纯度意味着某些非常普通的事情(例如I/O)比使用不太纯粹的功能语言要难得多。 Haskell的人员还使用了一些相当奇特的术语(例如“ catamorphism”之类的词),在解决之前,最好先带点编程经验。 (但是我必须重申一下,我才刚刚开始学习它!请多加考虑!)

为何C/Delphi会持续?因为除非您在嵌入式系统中工作,否则您实际上不必学习编程知识,而只需手动存储管理就可以了。垃圾收集对于1980年代级别的机器来说效果很好。您的电话如此强大!

最后,尽管我确实应该将Erlang放在上面的列表中。

6
Frank Shearar
  1. 蟒蛇。出色的编程入门。这也将与以前任何编程知识相联系。

  2. 方案。也是编程的绝佳入门。如果您是编程新手,则可能要先教这个,然后Python其次。一个替代方法是先Python然后是Common LISP而不是Scheme:更多)工作,但回报更多。

  3. C.贴近芯片的底层语言。非常适合学习计算机的功能。您可以替换某种形式的汇编语言,但是C非常接近基础知识并且更易于使用。

  4. 前言。或者,如果可以找到更喜欢的一种,则替换为任何声明式通用语言。

  5. 哈斯克尔。对于类型系统和纯功能,如果没有其他问题。

  6. 这里有几种候选人,因为不可能用六种语言涵盖所有概念。如果仅对于宏系统和对象系统(这与我见过的大多数其他系统不同),则常见的LISP值得学习。 Forth,Tcl和APL都是奇特的语言,并且都取得了一定的成功,其中一种语言可以防止学生感到自己已经学到了一切。 Erlang对于并发将是很好的。

5
David Thornley

提供了许多很好的答案,但是我没有看到有人提供SQL。它与上面列出的大多数其他动物完全不同,并且对必须处理数据库的任何程序员都非常重要。

您可能还需要考虑某些操作系统级别的脚本“语言”,例如Batch,grep,awk等。“ Make”也可能属于此类。

您可能要考虑的另一种语言(如果还没有完全消失)是COBOL。它与其他程序语言完全不同,值得一提。 C,Fortran,Basic等的变体已经非常相似,以至于一旦您熟悉了一个,移到另一个就不是什么大问题,但是COBOL缺少许多其他人理所当然的结构。 (自从我用COBOL做任何事情以来已经有20多年了,所以我对这种语言的观察可能不再有效。)

您可能只想从历史角度提及APL,或者让它安息。你的选择。

4
oosterwal

新手只需要一种语言即可开始学习,学习了第二种语言后,他们已经超越了许多竞争性开发人员。我将按以下顺序学习:

  • Smalltalk-这是最好的OO,而且简单的接触会让您眼前一亮。)最好学习OO概念。
  • Java或C#-在引入静态检查类型的同时,为OO提供了更具体系结构和计划性的方法。
  • Ruby或Python-在感觉不到Java或C#
  • Erlang-并发以一种看起来很容易的方式完成。它比您的OO语言或C语言可以做的要好得多)。
  • LISP,Haskell或其他功能语言-这是解决问题的另一种方法。
  • C-通过构建Java的本机扩展或实现较低级别的算法,在有人编写编译器之前,这就像有人需要的那样接近于Assembly。

您可能会问:“ C++在哪里?” X呢?坦率地说,学习多种语言可以做几件事:它丰富了您的经验,并且提供了学习更多语言的动力。我熟知的语言(Java,C#,Ruby,C++,Javascript)列表都是面向对象的-但这主要是因为这是我每天在工作中要做的事情。我接触过的语言列表(Smalltalk,Python,Erlang,JESS,C,Assembly [Motorola 6502/6510],Go)都教了我很多宝贵的经验。我至少可以理解这些语言的状况。我还没有探索很多东西,但是将来可能会很好。还有一些标记语言:HTML,XSL:FO,XSLT,CSS,XML,SGML,如果人们以任何方式使用网络,都需要使用它们。

在学习了至少两种不同的语言之后,我真的不认为您应该约束一个渴望学习的人决定下一步学习。学习应该是一种有机的经验,过程中过多的结构会导致一群人以完全相同的方式思考。可以说是单一文化。

2
Berin Loritsch

这些答案中的大多数似乎大致相同,因此我将提出不同的意见。我一直坚信,最好的第一语言是Tcl。

为什么?首先,它很容易学习。语言没有太多的语法,因此学生可以将更多的精力放在编程的概念上,而不必将精力放在特定语言的语法特性上。在撰写本文时,Tcl刚好有12条规则控制着整个语言(过去几十年来只有11条规则)。

另外,Tcl带有出色的内置GUI语言,因此您可以获得相对即时的满足,并可以学习事件驱动编程的基础知识。

第三,它是可扩展的。想教一个重复循环吗?您可以编写一个执行重复循环的命令,这样您不仅可以学习如何使用重复...,直到您可以了解它与while循环的不同之处,因为它实际上是您自己编写的。

另外,由于它是可扩展的,因此可以很容易地进入C语言。您可以学习C的基础知识,并学习如何a)用另一种语言编写的新命令扩展Tcl,或b)学习如何向用C语言编写的程序添加脚本语言C。

一旦您学习了Tcl和C,大多数其他语言都介于这两种极端之间,应该相对容易掌握。我的完整清单,以及在Tcl和C之后我要教的四个是:

  1. Tcl
  2. C
  3. Python-适用于OO概念,另外,它是按缩进定义块的行为,以与其他语言形成对比。
  4. Ruby-针对OO的不同观点,加上Rails,以了解框架
  5. Java-它无处不在,您需要了解它,并且需要了解JVM
  6. groovy-回到动态语言
2
Bryan Oakley

我建议first阅读Eric Raymonds的“如何成为一名黑客”,因为他对如何入门有一些非常有趣的观点,包括具有“代码就是数据,数据就是代码”概念的LISP。

对于编程,我还建议使用Haskell,Prolog,SQL和汇编语言(仅一部分)。

无论您想学习什么,都要花点时间正确学习它并编写大量的代码。这很像骑自行车-您无法从书中学习。

2
user1249

首先>开始编程时您想做什么?学习如何成为一名游戏程序员与学习如何成为一家企业的数据库程序员...不同于基于Web的程序员...

第二>一旦开始学习,您是否想从高处开始并逐步下降?或者从低处开始,然后逐步提高。学习C#(高级)与学习Assembly(低级)有很大不同。

一个巨大的选择将取决于您想要做什么。对驱动程序进行编程很可能包括C或Assembly ...对网站进行编程的将是PHP,C#,asp等...对于Web编程,您不会碰到Assembly ...等等。

就基础知识而言……一旦您决定要做什么,就更容易选择语言。例如,我已经成为医院的数据分析师。因此,我的语言选择是用于数据访问的SQL/TSQL/DB2,用于Windows客户端的C#WPF,用于Web客户端的Silverlight,用于IBM后端逻辑的一些RPG/CL。

我个人坚持写一本好书,并编写自己的程序来练习语言。我喜欢APress,喜欢在学习C#时阅读C#2008 Illustrated。他们还有其他书籍,涵盖了初学者和专家的基础知识。

2
WernerCD

汇编语言,C,SQL,C#

我知道,无聊又老套。整个问题都忽略了编程中最困难的部分,即问题解决,领域建模和算法构建。但这是为什么:

  1. 您不能通过汇编语言来伪装自己的方式;你要么得到要么就没有。编译器不会节省您的精力,没有框架或库的开销,并且您无法从计算机体系结构中隐藏;它是纯编程的(在初学者加两个数字的级别)

  2. 在编写了几百行以上的汇编语言程序之后,指针和内存管理就不再神秘了,您应该已经开始注意到代码中的模式(if,switch,array,loop等)。 )。 C将这些图案带到阳光下,让它们发光。标准库很有用,无需过多使用,但不必理会宏/模板/等。在这个阶段。

  3. 现在使用SQL跳入数据库。不要过度使用存储过程,只需了解表和查询的基础知识即可。

  4. 在编写了几百行代码的C程序之后,指针,结构和内存管理是第二天性,而程序结构是老朋友。您将开始注意到高阶模式:这些函数始终与该数据结构一起使用,除了方法X,Y和Z等之外,这部分代码与该代码部分相同。此外,您还可以掌握关系数据,现在就可以使用面向对象的语言了。具有庞大的框架和通常晦涩的文档。欢迎来到真实的世界!探索GUI,编写桌面应用程序,编写网站,编写Web服务,编写任何您喜欢的东西。如果您愿意,去找工作。

您现在是编程绝地武士吗?代码忍者? ,现在您才干。但是,您有坚实的基础可以继续探索闪亮的新乐趣。

1
Steven A. Lowe

您需要基本知识:

  1. 机器码
  2. 汇编语言
  3. C
  4. LISP

之后,这可能并不重要。

1
Scott Whitlock

开始接近金属:

  1. 组装工
  2. C
  3. C++
  4. C#
  5. LISP
  6. Python或Ruby

现在,采用这种广泛方法的问题在于,如果没有多年的学习,就没有人能够使用这些语言获得远程支持。

  1. 组装时间:3个月
  2. C:6个月
  3. C++:2年
  4. C#:6个月
  5. LISP:3个月
  6. Python/Ruby:3个月

除非您打算教他们“ Hello world”,否则所有6人都将花费大约一个月的时间。

0
SnoopDougieDoug

方案,C,C++

我会有偏见,并会使用我的大学目前在其核心计算机科学课程中使用的模型。我在第一年就反对它,但在后来的几年中,我对此表示感谢。该模型基于不需要任何编程经验,但需要学习的能力。

  1. 方案
    我们是您首先学习编程,魔术越少越好。 Scheme的教学语言为语言提供了清晰合理的定义,这是可以建立和扩展的非常小的公理集(“魔术”)。任何能理解数学功能的人都可以跟踪和推理Scheme程序。从Scheme开头提供了一种干净而有效的方式来考虑计算,而不必担心特定于语言的细节。

  2. [〜#〜] c [〜#〜]
    从Scheme迁移到C是一项艰巨的任务,但可以使您了解从高级语言到低级语言的非常重要的映射。学习内存模型(指针,堆,堆栈等)以及如何编译和运行程序,指针,堆栈和堆的工作方式是必不可少的技能。通过这种低级的了解,您可以开始分析更高级别的程序(大O)。您可以开始滚动自己的抽象数据类型,使用不同的实现方式(例如,简单的哈希表或集合的二叉树)。

  3. C++
    通过学习C和Scheme,我们开始看到编程语言的不同范例,以及它们如何适用于不同的问题。现在您可以进行编程中最可怕的方面:选择和权衡。编程语言的选择会影响性能,可读性,可维护性,健壮性等。对于解决比您想像中的事情更大的问题,这种选择既好,又很危险。 C++试图为程序员做出尽可能少的选择。通过学习C++,您将学习如何进行权衡和选择自己来解决问题。

您可能不会在行业中使用任何一种语言,也不会再次接触它们,但是学习它们的过程可帮助您理解将要使用的其他语言。另一个方面是您学习围绕特定语言的工具。通过命令行运行gcc,学习Vim,使用GDB逐步执行程序,创建Make文件,使用SVN检入代码,编写Shell脚本以自动化测试等。

请注意,核心课程还包含其他课程(计算机体系结构,数据结构和算法,编译器,操作系统等)。因此,仅学习这些语言不足以精通编程。

0
Kirk Fernandes

从基本语言到高级语言是必经之路。这样,您仍然可以了解背后的情况。

  • C-指针与内存管理
  • C++-OO基础知识,仍然很受欢迎
  • Java/C#-最受欢迎的语言
  • 一些基本的组装
  • 功能语言-例如哈斯克尔
  • 脚本语言-例如蟒蛇
0
Carra

好,这是赏金的最后一天。我正在添加我的答案。我建议的顺序-

C,C++,Java/C#,Python/Ruby,任何其他语言(汇编/ LISP/Prolog等)

  • 我认为第一语言不一定是最简单的语言。相反,我认为它应该给出计算机如何保持抽象的总体思路。
  • 从C到C++的过渡将更加容易。将会出现OOP,这是当今最常用的范例。
  • 从C++过渡到C#/ Java将更加容易。我更喜欢C#,因为它结合了许多范例,例如函数式编程。
  • 现在,当有人使用诸如Python=或Ruby)之类的动态语言时,将会出现“ WoW”。这会更容易感受到动态类型的美。但是学习首先使用动态语言,之后使用静态语言,“ 哦!为什么我必须添加所有这些语言?
  • 现在,最常用的范例和语言即将完成。因此,探索任何您想要的东西。从Assembly到LISP,Prolog或Haskell。并发现各种编程语言的新上下文和功能。
0
Gulshan
  1. 蟒蛇。要完成任务,请执行普通编程。在程序上,OO并且(在一定程度上)起作用。

  2. 常用表达。它们位于Python=库中,但这是一个单独的DSL。

  3. Shell(BASH或其他)。 “&”,“ |”,“;”在Python中,用于合并进程的运算符非常关键且令人不快。

  4. SQL。现在,这是lingua franca用于数据访问。

  5. XHTML。到目前为止,这是lingua franca用于数据显示。

  6. CSS。

如果有必要,也许C。

0
S.Lott