你怎么看?理想的编程语言学习顺序是什么,它将涵盖当今大多数常用的语言和范例,并有助于掌握通用的编程基础,思想和实践?您甚至可以建议范式而不是语言的学习顺序。
注意:这是我在stackoverflow中提出的问题的端口,由于主观和争论而被关闭。
你怎么看?理想的编程语言学习顺序是什么,它将涵盖当今大多数常用的语言和范例,并有助于掌握通用的编程基础,思想和实践?您甚至可以建议范式而不是语言的学习顺序。
注意:这是我在stackoverflow中提出的问题的端口,由于主观和争论而被关闭。
Answers:
假设问题是关于新手编程的理想学习顺序(由于编程的老手将有自己的(可能是偶然的)学习顺序),我建议您阅读Norvig关于如何在十年内学习编程的论文,然后:
Python:从动态,高级,面向对象和功能性语言开始。因为对于初学者来说,尽快感到富有成效真的很重要,并且不会因外来语法,缺少库,缺乏多平台,缺乏学习资源以及缺乏社区而被关闭。Python具有很高的可读性,具有大量良好的库(尤其是科学库-现代科学家/工程师必须知道如何编程),可以在大多数OS上轻松运行,具有大量的教程和完整的免费书籍,并且通常对用户友好-在您成为处理大型问题的高级程序员的同时,仍然足够强大,可以与您一起成长。加强对于初学者的重要的+有用的约定也很重要:代码的可读性很重要,您应该为自己和他人编写代码以便于理解。
Lisp:尤其是,至少要略过“计算机程序的结构和解释”或观看SICP视频,并且通过了解编程的基础和表达能力可以睁大眼睛-这么少就能做很多事情。了解Lisp如何不仅可以表达功能范例,还可以表达OO,逻辑/声明性等等,例如创建新的领域特定语言。阅读Norvig的PAIP,以了解掌握该语言的知识。然后查看Clojure(一种现代的Lisp方言),它可能是Next Big Things之一。
C:仅因为这是计算机语言。:)如果一个人主要是特定非软件领域的程序员,那么这些天可能是可选的。我觉得它很丑,但是值得了解一下底层硬件。当然,请选择K&R。
Haskell:纯功能功能。当前的Com.Sci。理论和实践表达能力相遇。参见真实世界Haskell。
在完成上述导览之后,您将非常善于解决问题并用代码表达解决方案,并且完全满意此处的范例:
这就是我要做的:
Python(或Ruby或Lua):一种解释型语言,没有类型,您可以用几行代码完成工作。巨大的库(我猜这是Python最好的)。您可以深入研究算法,因为不会分心。无需编译,只需运行。最重要的是,使用Python会隐式地教好样式,因为Python中的缩进是强制性的。您也可以教授“对象定向”(在Lua中更多的是问题)。目的是要有很多乐趣,并向学生展示可以做什么。
C ++(或Java):一种快速的打字语言。如果需要对象定向,那么您已经知道一些概念。主要思想是“翻译”您在Python中所做的工作,并使用新的约束(主要是类型)来完成。现在,如果您有正确的概念,则添加类型不再是问题。下一步是考虑更底层的内容(Java在这里无济于事),并且很好地教人了指针。我的意思是解释一下地址空间,CPU,操作系统,以便您可以开始查看程序下面的内容。编译语言引入了解释和编译之间的区别,对于解释什么是机器语言非常有用,等等。
组装:最后,没有魔力,您只需要和机器对话即可。关于Intel和GAS语法存在争论,这并不重要。如果您有MIPS,我相信它更适合教学,但是我认为x86更加方便,因为它更加普及(x86_64更好,因为它具有更多的寄存器和优点)。您只需要消除一些复杂性,让学生根据需要进行进一步调查。
(这前三个是“深度”。直到现在,我们一直在下降,直到您触及他们所说的“接近金属”的底部。我认为这很重要,编程中的许多问题都是如果对所发生的事情有清晰的了解,则可以解决。知道后,您可以放心地获得更多的知识。)
Scheme(或Common Lisp或Clojure):正如@dukeofgaming所说,Lisp语言使您可以很好地教递归(对于此Scheme来说是最好的,因为它没有显式循环)。但是我会去教另外两件事:闭包和宏。宏是将Lisp语言与其他语言分隔开的地方。我个人不喜欢Scheme宏,但这不是太重要。我认为Clojure宏很好,例如(但是Clojure中的递归不是那么干净,因为JVM没有尾递归)。闭包是一个非常重要的概念,一旦您将其关闭,便会立即“看到” Javascript。在研究了C ++,Python和Lisp之后,Javascript变得“琐碎”。
Haskell:对于功能性语言,我认为您无法击败Haskell。Lisp和Scheme被认为是功能性的,但是要强调功能性编程,您必须强迫学生无状态地思考。Haskell还具有其他非常不错的功能,例如,“ currying”(图形化)和用于“ destructuring”的模式匹配。我不太了解Haskell,但是您可以编写的代码简明扼要。很好地了解Haskell使理解Erlang的道路变得容易得多。
Forth:一种堆栈语言。如果Lisp和Haskell不够用,那将再次破坏您的逻辑。我会去尽可能教琼斯的第四,因为他们知道组装,然后你可以完全理解什么是要去。(例如,Knowing Forth打开了PostScript。)
(所以这最后三个是您所说的广度。对我来说,这些语言非常奇怪,以至于它们改变了您的思维方式。至少它们对我有用。而且我认为,有了这些,您就了解了足够的范例来学习一种新的语言。很快。)
您可以选择研究以下内容:
SmallTalk:纯面向对象的语言。要查看当您认真对待“对象定向”时会发生什么,该语言不需要“ if”,“ for”。一切都是信息:再次实现重大成就。(这将使Objective-C现在变得容易。)
Go:一种(美丽的)语言,强调并发。我发现Go非常适合编程。
Prolog:另一种编程范例。我没有写过任何Prolog,但我知道它是另一种令人折服的语言。
认真地讲,我可能在我那段时间里学过BASIC,COBOL,Fortran,Forth,Pascal和Prolog,但是我从来没有特别需要使用它们,我真的看不到它们对我使用其他方法有什么影响语言,可能是彼此之间误用了范式。我花了很长时间才学会基本的BASIC知识,从而无法真正地编写结构化的Pascal,花了几年时间才停止用C语言编写Pascal代码,而当我开始使用Objective-C和Java时,又花了几年的时间才真正放弃了OOP。另一方面,由于我(几乎)专门使用OO语言进行工作,因此我能够专注于改善对OO语言的使用,而不必试图使它们看起来像Scheme或PostScript。
很难断言任何顺序都是理想的,但是我将提出一个可以证明其合理性的计划:
C
学习C需要耐心和勤奋,并且将向您介绍计算机处理数据的基本方式,并向您展示程序员可以接受的几乎所有最广泛的职责。
佩尔
作为C所要求的严格性的解毒剂,请尝试令人难以置信的Perl。用C编写一周花了一个小时,而用Perl写一个小时。它引入了在编程中可以找到的另一种乐趣,并说明了排除某些顾虑和细节如何使程序员可以将精力集中在不同的事情上。
C ++或Java
接下来,了解C如何将注意力集中在编程的低级和原始方面,以此作为提高抽象水平的基础,并指出在抽象上提高效率时所进行的交易。探索如何形成仍然可以保留对您的程序至关重要的效率的抽象。
普通Lisp
这是前面的口号的奖励。您会发现在以前所有语言中学到的东西的回声,并看到当使用Lisp编程时,前面提到的许多让步看起来多么愚蠢。C的预处理器和C ++模板准备了一个欣赏Lisp宏系统的工具。您将重新获得Perl的易于表达,C进行低级优化的机会,C ++或Java的抽象构建功能,并超越它们。前三者(也许除了Perl的调试器之外)都不会为您提供具有功能强大的REPL(“读取,评估,打印循环”)的交互式编程经验。处理图像基于环境的环境将改变您的源代码与“可执行程序”的思想之间的关系,这将改变您对构建程序的含义的整个想法。
除了这四种之外,还可以探索其他样式的编程,例如Haskell中的函数式编程或Prolog中的逻辑编程,从而可以更全面地理解编程的范围(如果愿意,可以广泛地了解知识),但是到那时,您的时间将得到更好的服务通过使用您知道的任何语言来提高自己的手艺(深厚的知识)。
品尝了足够多的独特语言后,您的观点将集中在超越任何一种语言的观念上。这就好比学习驾驶父亲的汽车和知道如何驾驶任何汽车之间的区别:您可能不喜欢在几天之内驾驶这辆小型面包车,充分了解了驾驶一辆喜爱的跑车的乐趣,但您会弄清楚如何操作它,并且一定会比业余爱好者更多地哄骗可怜的野兽。
最初至少部分设计为儿童使用计算机学习的方式。语法很简单,可以在段落中描述。与LOGO一样,它体现了“低进入壁垒,高天花板”的原则。
从“一切都是对象”的意义上讲,Smalltalk是一种纯粹的面向对象语言。
它还讲授了许多功能技术,尤其是在其Collection API中:链接消息,高阶函数,映射,缩小等。
在佳乐社会是充满活力和热情。您还将看到许多有关高级技术的讨论:与Lisp社区一样,邮件列表上有很多经验丰富的Smalltalkers 愿意分享他们的知识。(Squeak社区拥有大量的专业教育人士,这并没有什么坏处。)还有针对初学者的另一种清单。
一种逻辑编程语言,它将给您与任何其他语言完全不同的计算视图。Prolog也是高度声明性的(但不是完全声明性的:!
or或cut运算符可能会对谓词产生重大的语义影响)。
如果您愿意,可以在这里替换方案。Common Lisp支持多种范例,尤其是OO和功能。它也有悠久的历史(Lisp是第二种至今仍在广泛使用的语言:仅FORTRAN的语言更古老)。
(注意:我才刚刚开始学习它。)可能是地球上最纯净的功能语言。它具有非常先进的静态类型系统。方便的入门 书籍存在。
您需要了解计算机的工作方式。您需要知道内存和CPU的实际功能。传统上,这两者都是“接近金属的”,并具有鼓励思考其语言如何汇编的社区。
Smalltalk非常易于学习,因此您可以快速开始专注于解决问题,而不是与编译器抗争(“入门门槛低”)。一旦开始编程,您就可以做什么都没有人为的限制-“上限”。
一旦您对OO的工作原理有了一个公正的认识(并且-对OO的含义有很多不同的理解-可以说OO主导了市场),那么进入Prolog可以确保您不会开始以为OO是唯一的方法。Prolog 与大多数语言完全不同,它会伸展您的智力,因此您不会开始以为自己了解所有知识。
反过来,Common Lisp是一种成年人的语言。它有一个成熟的标准,数十年来(连同Smalltalk一起)一直是领先的语言设计-您最喜欢的语言刚刚拥有的所有这些新颖功能?很有可能是在Lisp或Smalltalk中孵化的想法。Common Lisp也有一些戒心,您随处都可以找到戒心。
Haskell在列表中排在第四位,因为(有人告诉我:我才刚刚开始学习它)它的纯度意味着某些非常普通的事情(例如I / O)比使用不太纯粹的功能语言要难得多。Haskell的人员还使用了一些相当奇特的术语(例如“ catamorphism”之类的词),在解决之前,最好先带点编程经验。(但我必须重申,我才刚刚开始学习它!不opinion多加评论!)
为何C / Delphi会持续?因为除非您在嵌入式系统中工作,否则您实际上不必学习编程知识,而无需进行任何手动内存管理。垃圾收集对于1980年代级别的机器来说效果很好。您的手机功能强大!
最后,尽管我确实应该将Erlang放在上面的列表中。
蟒蛇。出色的编程入门。这也将与以前对编程的任何接触有关。
方案。也是编程的绝佳入门。如果您是编程新手,那么您可能首先要教这些,然后是Python。一个替代方案是先使用Python,然后使用Common Lisp代替Scheme:更多的工作,但是更多的回报。
C.贴近芯片的底层语言。非常适合学习计算机的功能。您可以替换某种形式的汇编语言,但是C非常接近基础知识并且更易于使用。
前言。或者,如果可以找到更喜欢的一种,则替换为任何声明式通用语言。
哈斯克尔。对于类型系统和纯功能,如果没有其他问题。
这里有几种候选人,因为不可能用六种语言涵盖所有概念。如果只针对宏系统和对象系统(与我见过的大多数其他系统不同),Common Lisp值得学习。Forth,Tcl和APL都是奇特的语言,并且都取得了一定的成功,其中一种语言可以防止学生感到自己已经学到了一切。Erlang对于并发将是很好的。
提供了许多很好的答案,但是我没有看到有人提供SQL。它与上面列出的大多数其他动物完全不同,并且对必须处理数据库的任何程序员都非常重要。
您可能还需要考虑某些操作系统级别的脚本“语言”,例如Batch,grep,awk等。“ Make”也可能属于此类。
您可能要考虑的另一种语言是COBOL(如果尚未完全消失)。它与其他程序语言完全不同,值得一提。C,Fortran,Basic等的变体已经非常相似,以至于一旦您熟悉了一个,移到另一个就不是什么大问题,但是COBOL缺少许多其他人理所当然的结构。(自从我对COBOL做任何事情以来已经有20多年了,所以我对这种语言的观察可能不再有效。)
您可能只想从历史角度提及APL,或者让它安息。你的选择。
First>开始编程时要做什么?学习如何成为一名游戏程序员与学习如何成为一家企业的数据库程序员...不同于基于Web的程序员...
第二>一旦开始学习,您是否想从高处开始并逐步走下坡路?或者从低处开始,然后逐步提高。学习C#(高级)与学习Assembly(低级)有很大不同。
一个巨大的选择将取决于您想要做什么。对驱动程序进行编程很可能包括C或程序集...对网站进行编程将是PHP,C#,asp等。
就基础知识而言……一旦您决定要做什么,就更容易选择语言。例如,我已经成为医院的数据分析师。因此,我的语言选择是用于数据访问的SQL / TSQL / DB2,用于Windows客户端的C#WPF,用于Web客户端的Silverlight,用于IBM后端逻辑的一些RPG / CL。
我个人坚持写一本好书+建立自己的程序来练习语言。我喜欢APress,喜欢学习C#时阅读C#2008 Illustrated。他们还有其他书籍,涵盖了初学者和专家的基础知识。
新手只需要一种语言即可开始学习,学习了第二种语言之后,他们已经超越了许多竞争性开发人员。我将按以下顺序学习:
您可能会问:“ C ++在哪里?” X呢?坦率地说,学习多种语言可以做几件事:它丰富了您的经验,并且提供了学习更多语言的动力。我熟知的语言(Java,C#,Ruby,C ++,Javascript)列表都是面向对象的-但这主要是因为这是我每天在工作中要做的事情。我接触过的语言列表(Smalltalk,Python,Erlang,JESS,C,Assembly [Motorola 6502/6510],Go)都教了我很多宝贵的经验。我至少可以理解这些语言的状况。我还没有探索很多东西,但是将来可能会很好。还有一些标记语言:HTML,XSL:FO,XSLT,CSS,XML,SGML,如果人们以任何方式使用网络,都需要使用它们。
在学习了至少两种不同的语言之后,我真的不认为您应该约束一个渴望学习的人决定下一步学习。学习应该是一种有机的经验,过程中过多的结构会导致一群人以完全相同的方式思考。可以说是单一文化。
这些答案中的大多数似乎大致相同,因此我将提出不同的意见。我一直认为最好的第一语言是Tcl。
为什么?首先,它很容易学习。语言没有太多的语法,因此学生可以将更多的精力放在编程的概念上,而不必在意特定语言的语法特性。在撰写本文时,Tcl刚好有12条规则来控制整个语言(过去几十年中只有11条规则)。
另外,Tcl带有出色的内置GUI语言,因此您可以获得相对即时的满足感,并且可以学习事件驱动编程的基础知识。
第三,它是可扩展的。想教一个重复循环吗?您可以编写一个执行重复循环的命令,这样您不仅可以学习如何使用重复...,直到您可以了解它与while循环的不同之处,因为它实际上是您自己编写的。
另外,因为它是可扩展的,所以可以很容易地进入C语言。您可以学习C的基础知识,并学习如何a)用另一种语言编写的新命令扩展Tcl,或b)学习如何向用C语言编写的程序添加脚本语言C。
一旦您学习了Tcl和C,大多数其他语言都介于这两种极端之间,应该相对容易掌握。我的完整清单,以及在Tcl和C之后我要教的四个是:
我知道,无聊又老套。整个问题都忽略了编程中真正困难的部分,即问题解决,领域建模和算法构建。但这是为什么:
您不能通过汇编语言来伪造自己的方式;你要么得到要么就没有。编译器不会节省您的精力,没有框架或库的开销,并且您无法从机器体系结构中隐藏起来;它是纯编程的(在初学者加两个数字的级别)
在编写了几百行以上的汇编语言程序之后,指针和内存管理不再是神秘事物,并且您应该已经开始注意到代码中的模式(if,switch,array,loop等)。 )。C将这些图案带到阳光下,让它们发光。标准库很有用,但又不占优势,但是不必理会宏/模板/等。在这个阶段。
现在使用SQL跳入数据库。不要过度使用存储过程,只需了解表和查询的基础知识即可。
在编写了几百行代码的C程序之后,指针,结构和内存管理是第二天性,而程序结构是老朋友。您将开始注意到高阶模式:这些函数总是与该数据结构一起使用,这部分代码与方法的X,Y和Z等一样,与代码的这一部分相同。此外,您还可以掌握关系数据,现在就可以使用面向对象的语言了。具有庞大的框架和通常晦涩的文档。欢迎来到真实的世界!探索GUI,编写桌面应用程序,编写网站,编写Web服务,编写任何您喜欢的东西。如果您愿意,去找工作。
您现在是编程绝地武士吗?代码忍者?不,现在您仅能胜任。但是,您有坚实的基础可以继续探索闪亮的新乐趣。
好,这是赏金的最后一天。我正在添加我的答案。我建议的顺序-
C,C ++,JAVA / C#,Python / Ruby,其他任何语言(汇编语言/ Lisp / Prolog等)
我会有偏见,并会使用我的大学目前在其核心计算机科学课程中使用的模型。我在第一年就反对它,但在后来的几年中,我对此表示感谢。该模型基于不需要任何编程经验,但需要学习的能力。
方案
我们是您第一次学习编程,魔术越少越好。Scheme的教学语言为语言提供了清晰合理的定义,这是可以建立和扩展的非常小的公理集(“魔术”)。任何能理解数学功能的人都可以跟踪和推理Scheme程序。从Scheme开头提供了一种干净而有效的方式来考虑计算,而无需担心语言的特定细节。
C
从Scheme迁移到C是一项艰巨的任务,但可以使您了解高级语言到低级语言的非常重要的映射。学习内存模型(指针,堆,堆栈等)以及如何编译和运行程序,指针,堆栈和堆的工作方式是必不可少的技能。通过这种低级的了解,您可以开始分析更高级别的程序(大O)。您可以开始滚动自己的抽象数据类型,并使用不同的实现方式(例如,简单的哈希表或集合的二叉树)。
C ++
通过学习C和Scheme,我们开始看到编程语言的不同范例,以及它们如何适用于不同的问题。现在您可以进行编程中最可怕的方面:选择和权衡。编程语言的选择会影响性能,可读性,可维护性,健壮性等。对于解决比您想像中的事情更大的问题,这种选择既好,又很危险。C ++试图为程序员做出尽可能少的选择。通过学习C ++,您将学习如何进行权衡和选择解决问题的方法。
您可能不会在行业中使用任何一种语言,也不会再次接触它们,但是学习它们的过程可帮助您了解将要使用的其他语言。另一个方面是您学习围绕特定语言的工具。通过命令行运行gcc,学习Vim,使用GDB逐步执行程序,创建Make文件,使用SVN检入代码,编写Shell脚本以自动化测试等。
请注意,核心课程还包含其他课程(计算机体系结构,数据结构和算法,编译器,操作系统等)。因此,仅学习这些语言不足以精通编程。
蟒蛇。要完成任务,请执行普通编程。程序上的,OO和(在一定程度上)功能。
常用表达。它们在Python库中,但这是一个单独的DSL。
Shell(BASH或其他)。“&”,“ |”,“;” 在Python中,用于合并进程的运算符非常关键且令人不快。
SQL。到目前为止,这是用于数据访问的通用语言。
XHTML。到目前为止,这是用于数据表示的通用语言。
CSS。
如果有必要,也许C。
开始接近金属:
现在,采用这种广泛方法的问题在于,如果没有多年的学习,就没有人能够使用这些语言获得远程支持。
除非您打算教他们“ Hello world”,否则所有6人都将花费大约一个月的时间。
为什么不直接学习VB或C#。我认为这两种语言都是从初学者到高级的完整语言,恕我直言。