脚本语言对初级程序员有什么影响?[关闭]


18

前几天,我和一位老师进行了讨论。

我们讨论了更简单的脚本语言(如Python或Ruby)对初级程序员的影响。

他认为脚本语言会带来草率的编码技术,因为初学者不了解“引擎盖下”发生了什么。他还列举了脚本语言通常如何导致程序员忽略效率,内存管理,操作复杂性等问题的其他示例。

我认为低级语言对于某些人来说可能太多了,他们可能会在对编程产生浓厚兴趣之前就放弃了。当我开始学习我的第一门编程语言(C)时,我转向了指针并放弃了,因为概念太难了(以我的辩护,我才14岁)。如果不是Java,那么我可能还没有成为程序员!如果我从简单的语言开始,然后再深入研究,我会感到自己不会放弃,而且我会学到与C一样多的东西。

全班讨论之前,课程结束。


至此,我一直在鼓吹说,初学者应该从脚本语言开始,然后再深入研究。但是在讨论之后,我开始怀疑这是否是错误的想法。

那么,脚本语言对初级程序员有什么影响?



4
我学会了在有自动变速器的汽车上开车。后来,我得到了一个手动变速箱。它花了一些时间来学习,我很幸运,我不必学习离合器和其他所有东西。
David Thornley

2
@Singletoned:是的。我不得不以某种方式想到xkcd.com/326 ...


4
我个人认为学习从低到高的程序是不自然的。我们学习爬行,然后走路,然后跑步,说话,然后写作。不确定大学逆转自然秩序的逻辑是什么。我通常只是听到人们的结论是“因为如果我很难学习,那么就需要为您保持努力”。就连乔尔都这样说。我想周期永远不会结束。
P.Brian.Mackey 2011年

Answers:


26

我不同意。首先,脚本语言处于较高的抽象水平,这没有错。刚开始时,您只是想学习原理。实际上,我想说的是,选择一种较低级别的语言可能会鼓励不好的编码,因为在理解这些细节之前必须先处理一些细节。取而代之,可以使用一种更简单的语言从一开始就编写简洁明了的代码。

其次,用这些语言学习很多东西。至于学习语言,我会说C比Python更容易。一个必须处理指针或处理字符串,但是在Python中还有很多概念需要学习。理解,面向对象,反射,魔术方法,一流的函数,lambda,迭代器和生成器,元类:所有这些都是语言的一部分。

我认为从Python开始可以让您学习更多有关编程的知识,并且学习曲线更柔和。低级语言可能具有较少的抽象性-因此要学习的通用概念也较少-并且使初学者不知所措而使他不知所措。


1
+1,尽管我认为C在任何意义上都不比Python更容易学习。也许总体上学习的概念更少,但是使用Python可以在相同的时间内学到更多。当然,如果C太简单了,总会有C ++教您高级语言和低级语言的复杂性。;)
马丁,

+1,这是我的想法!我希望我会在上课之前读过这篇文章:)
joe_coolish 2011年

22

从哪里开始都没关系。开始去哪里很重要。

BASIC可能不是世界上最优雅的语言,但是它包含了过程编程的基础知识,足以开始使用。

我从BASIC开始。我没有呆在那里。


+1为完美答案-简洁地显示原始问题的位置!(作为绝对的巧合,我开始用BASIC太;-)
彼得Török

5
令我惊讶的是有多少人住在这里。:o /
Gary Willoughby

1
出色的答案。简明扼要,准确无误。我也从BASIC开始。
Michael Riley-AKA Gunny,

11

您的老师是对的,只是他认为自己的后果是坏事。

如果您将学习语言纯粹看作是学习计算机工作原理的学术活动,那么他是正确的。如果您将它们视为完成任务的一种方式,那么您是正确的。


6
要不同意你。结果坏事,因为结果是无知。这意味着最终,某些东西将崩溃,并且问题将处于比您所理解的更低的抽象级别,因此您不知道如何解决它。那总是一件坏事。
梅森惠勒

6
要同意你的观点。不知道引擎盖下发生的事情的后果是表达方式的深刻简单性和直接性,而不必担心硬件的细微差别。较低的抽象级别是针对语言设计人员而非应用程序开发人员的。
S.Lott

1
@梅森:绝对。我曾经赚了很多钱,节省了一群程序员的资产,他们根本不了解引擎盖下的实际情况,因此无法使他们的生产系统运行良好或可靠地工作。(因为那样的工作太烂了。生命太短了!)
William Pietri

1
@梅森-我同意你的意思,如果您要专业编程,拥有这一知识很重要。我发现我对指针,离散结构和lambda演算的了解非常有价值。我被困在团队成员没有这些技能的团队中,而他们最终编写了过于复杂或非常有漏洞的代码。只是因为他们并不了解。似乎有时候大学会给CS学生喂太多牛奶而没有足够的肉,但另一方面,如果他们给刚开始的程序员喂肉,则冒着辍学的风险。
joe_coolish 2011年

1
@Joe:根据Joel所说,让那些无法处理它的人辍学是重点。而且,不仅是计算机程序员,而且还是计算机用户,一个经常不得不处理那些我只能假定是由不称职的编码器创建的可怕程序的人,我真的希望“使他们退出”这一点会更成功!
梅森惠勒

5

我认为“脚本语言”是一个糟糕的词,它已经非常过时,或者最适合特定领域的语言。您的老师只是将他显然没有足够了解的所有内容整合到邪恶的轴心中。

做出明智的区分是,在高级语言和低级语言之间,或者在静态和动态类型的语言之间,它们是真正正交的。

汇编程序是低级动态类型(如果说类型完全没有意义),C是低级静态类型,Ruby是高级别动态类型,Haskell是高级别静态类型。Java既不是高级别静态类型,也不是低级别静态类型,C ++既是高级别静态类型,也是低级别静态类型。等等。

讨论只能是,哪种范例更适合入门级程序员。
我非常相信底层编程可能不是一个。可能是在90年代初期,您实际上可以在合理的时间内产生有趣的结果。
但是编程是由激情推动的。激情被奖励所滋养。因此,入门级程序员应从奖励工具入手。低级工具不再有回报,因为有大量的高级工具可以在很短的时间内获得相同的结果。

人类的思维是抽象的。当我们了解世界时,我们会通过非常粗糙的抽象来做到这一点,并根据需要进行详细介绍。
为了让孩子理解它的环境,您不会教它数学,物理,化学,生物学,历史,社会学和哲学。您为它提供了一个非常简单的世界模型,可以应付这个世界,并且只要它长久就会超越它,它会在年轻时无休止地向您提出问题,并在以后完全否定您的权威。

那就是我们的想法。人脑只能处理有限数量的信息“单位”,但是抽象程度对信息的量化影响不大。例如:对我们来说,读取表达式“ 34 * 75”比计算表达式更简单,而对于计算机,则相反。要将一堆黑色像素识别(从而抽象化)成一条弯曲的线,然后将其识别(从而再次抽象化)为单个数字,是一项艰巨的工作。
我的祖母了解打开文件的想法。但是,她在该级别下不了解。坦率地说,如果她必须先研究硬件和操作系统的内部工作原理以及其他什么方面的知识,那么她永远都不会到达那里。

那里有很多人,他们使事情变得过于复杂,因为他们从未被教导要思考清楚,简洁,优雅的解决方案,而是花了太多时间来困扰于可交换的低级细节并针对这些细节解决问题。教人们像计算机一样思考是最糟糕的编程方法。
编程的价值在于找到问题的解决方案。将其表示为代码实际上实际上是一项枯燥而机械的任务,应使用任何适合的工具简单地完成。

哦,不用担心不了解指针。我在同一年龄时遇到了同样的问题。这里的问题还在于缺乏抽象。通常,您会从一些C书籍中学习指针,并且在努力理解它们的过程中,这与内存分配,堆栈内存和堆内存等等紧密相关。指针背后的抽象概念是间接的。拥有指向特定数组的索引的变量就是这样(实际上,在C中,它确实是相同的,在C中,特定数组是您的地址空间),并且您不需要为此使用指针算术。
这只是为了说明,选择高级别的抽象使事情变得容易掌握。

编辑:和打字时,我更喜欢静态类型的语言。而且我认为入门级程序员应该清楚地理解类型的概念(这是一个抽象的概念)。


3

Python并不简单。看一下Unicode和元编程。


我同意Python可能非常复杂且功能非常强大。但基础(字符串处理,数组操作等)在Python比C.更容易
joe_coolish

1
Python非常容易上手,许多日常任务比系统语言要简单一个数量级。不,从整体上来说,该语言,其血腥细节和高级功能并不简单(这适用于所有非玩具语言)。但这不是问题。

1
那为什么我在filecontent.lower()中的if searchstring.lower()无法工作?由于使用Python2.7在Windows上的tfs中的UTF-16LE sql文件中存在bom。不好玩。使它工作。花了几个小时。string.find()也不起作用...啊!
Christopher Mahan

1
Unicode如何在C中更简单地处理?
dan04 2011年

3

我看到了另一个更深层次的问题。

统一的语言不会强迫人们关注类型,而要思考类型。只要我有一些带有一些字符串和数字的小脚本,这些脚本和数字会在不引起注意的情况下相互转换,那就很好了。但是,这一天将打破。突然,程序将中断,并且每个快速修复将导致其再次中断。

或者,想成为新手的程序员会发现他将需要一个列表的元组而不是元组的列表,但不会丝毫想法“如何做到这一点”,并且他将在stackoverflow上提问,这显示出绝对的无助。


6
但是Python和Ruby是强类型的。这动态键入正交。字符串和数字不会相互隐式转换。
dsimcha 2011年

3
@dsimcha:是的-那如何反驳@Ingo所说的?
Jim G.

1
因为这个问题主要与Ruby和Python有关。我以为他是在暗示他认为Ruby和Python的类型很弱,这是一个常见的误解。
dsimcha

1
@ davidk01-这就是我的观点:无论我们是否想要,值都有类型。但是在动态类型的语言(如果该术语会让您满意的话)中,变量则没有。而是在运行时进行类型检查,以区分Unitype的许多变体。
Ingo

2
@Ingo:我至少能够找到Common Lisp用户,他们认为缺少静态类型是一种好处(实际上是可选的静态类型,可用于错误检查或性能目的),因为它加快了开发速度,并且静态类型可以避免的错误在实践中并不难发现和解决。我只看到过一种或另一种看法。
David Thornley

2

我仍然认为,对于初学者而言,正式的指导和指导比语言选择要重要得多。但是,如果我必须为初学者选择第一语言,那么我将为自学成才的程序员选择python,为大学教学选择C ++。

原因是有了正式的指导,您就可以从小的琐碎的程序开始,以在需要做任何有用的事情之前奠定坚实的理论基础。我认为,如果您有时间的话,顺序是理想的选择,并且C ++为您提供有关编译器错误和讲座之间的分段错误的大量帮助,以使您知道自己是否掌握了基础知识。

如果您是自学成才,其中的一些基础知识真的很难学习,直到您掌握了一些经验。同样,您通常需要尽快做出一些有用的事情,并且可以根据需要获得理论上的支持,尽管您可能冒险使用这种方法所学的知识不会超过最低限度。这就是为什么我在这种情况下推荐像python这样的语言的原因。


2

在大学里,我们以另一种方式看到了它,我认为它很有用。*我们从低水平开始。指针,内存管理,字符数组...所以是的,我们从C开始。算法也是如此:首先实现一个链表,一个哈希表,一棵树...然后才使用标准库。

之后,我们使用了更强大的语言,例如Java,C#或perl。但是它的优点是知道发生了什么。

虽然这可行,但我认为从脚本语言过渡到较低级别的语言也很好。既了解高级语言又了解低级语言,可确保您易于使用高级语言,同时仍能了解正在发生的事情。学习它们的顺序不太重要。


1

脚本语言不会使程序员草率。造成问题的原因是缺乏对问题域(例如程序所服务的业务)的理解。

俗话说“您可以用任何语言编写COBOL。”,尽管我怀疑当每种数据类型看起来都一样时,却很难看清程序的实质内容,这是COBOL的主要功能-化。


1
怀疑之前尝试一下。主要的区别是,你不给一个关于它是一个该死的Foo还是Bar,长完全不同的东西,你可以.frobnicate()这两种方式。没有显式接口。

我非常熟悉动态语言,因为我的日常工作是使用Ruby on Rails。是的,这是动态语言社区中的主要约定。通常,这被称为“鸭子打字”。在研究文献中,它们称为结构类型,并且有一些语法约定可以向您显示“易碎类型”的外观。不仅如此,有些类型系统可以识别它们,并验证您的程序是否善待鸭子。
法利·奈特

我了解结构类型,并认为它们是一个很好的主意。但是,由于没有一种使用它们的成熟,可广泛使用的语言(O'Caml级用户群将是一个不错的开始),因此我认为它们不是动态键入的一种实用替代方法。伤心,但事实。

不会使用广泛使用的语言,但这不会阻止您将自己的类型系统引导到广泛使用的类型系统上。我相信您已经看过关于动态语言的类型推断之类的论文。
法利·奈特

同样,我不认为我和隔壁的人使用的东西是可行的选择。程序员需要像图书馆,稳定的语法,工具等东西

1

我认为脚本语言确实鼓励草率的技术。(请注意,这并不是说这些语言是不好的,只是很难用所述语言维护大型代码库。)但是,我认为这是出于与此处其他答案不同的原因。

我认为使用任何一种语言,程序员都需要对整个编程有一些基本的了解。如果他们不了解向量,树和哈希表之类的概念,它们将不会在任何地方发挥作用。他们不一定需要能够实现这些东西,但是他们需要知道其特征。

我认为草率发挥的不是编程技巧,而是当需要创建可重用组件时。这些语言不需要您在代码单元之间定义良好的接口,也不需要使库对它们的客户端施加约束的机制。用这样的语言制作好的可重用组件不是不可能的,但是困难得多

脚本语言之所以吸引新手程序员,是因为它允许他们在更少的时间内完成更多的“一次性”工作,但是当那些相同的程序员开始进行维护编程时,他们通常会很快遇到这些语言的问题。

我并不是说脚本语言很糟糕-远非如此。但是它们确实使维护庞大的代码库(数百万行)变得很困难(这是为什么您看不到任何用脚本语言完成的代码库的原因之一)。当您需要相对较小或一次性的解决方案时,它们使您可以用更少的时间和更少的代码来完成更多的工作(更少的代码几乎总会更好)。

请记住,没有工具适合每个工作。选择最适合这种情况的工具。编程语言和任何工具一样。


0

我和你的老师在一起,当@Singletoned说你的老师认为后果很糟糕(例如,不了解绩效)时,我也和他在一起。

我认为以C开头比以脚本语言开头要好。作为一名老师,我将专注于整个von Neumann体系结构(ALU,寄存器,内存,I / O端口等),直接使用指针(很抱歉,这确实是一个关键概念[未发布VM语言中的引用(即指针)是内存泄漏的主要来源]),命中某些数据结构(树,链表,哈希表1),然后将其抽象化为其他层次(OO,函数式编程,-强的静态键入规则,\ m /,所以没有“脚本语言”> :()。

1嗯,毕竟我可能会和您的老师就绩效考量达成一致。


马虎的编程是内存泄漏的根源,不需要花太多的钱就可以教人们跟踪诸如文件句柄之类的资源。有无数的C程序存在内存泄漏,所以我不确定您如何尽快与人们一起学习指针。
davidk01 2011年

是的,但是...(a)不了解基础知识会导致一些错误的代码(通过正确的hacking-til-it或草率的编程),并且(b)我试图激发为什么指针仍然有意义的原因,而不是断言,就内存泄漏而言,C比垃圾收集语言更好。得到的指针尽快的目的是为了让那么赶快离开C的
JohnL4

0

我认为最好的方法是从模块化语言开始,然后再介绍更复杂的东西,在我的时代,我们从Pascal和COBOL开始,试图理解子程序,控制流变量等的含义。只是在对Pascal感到满意之后,我什至才渴望切换到C / C ++之类的语言,并学习所有其他技术,这对初级程序员是一个附加。


0

你们都是对的

脚本语言无疑使新手开发人员更难理解实际情况。(数据库,框架和库也是如此。哦,浏览器,服务器,网络和文件系统也是如此。)当我采访年轻的开发人员时,我常常感到they目结舌,他们对计算机的实际工作方式以及如何装货的了解很少。邪教编程。

另一方面,我在面试中寻找的第一件事并不是完美的理解,这是因为他们喜欢做事。回到我刚开始的时候,一台计算机可以做任何事情都给人留下了深刻的印象,所以我的Apple Basic和6502汇编程序对我来说真的很棒。但是如今,计算机可以做很多令人惊奇的事情,所以我认为,如果这是使他们着迷的人们,那么从一个很高的水平入手是很好的。

基本上,我认为只要您最终冲向更深的水域,就可以从水池的浅端开始。


0

首先,我肯定会从更高抽象级别的语言开始。目前,我会推荐Python。选择脚本语言作为第一语言的最重要原因是,您可以轻松地组合一些有用的东西。正如Joe在他的问题中提到的那样,成为一名程序员时的第一件事是您有动力继续深入研究。当您能够创建有效且有用的软件时,就会获得这种动力。

除了理解抽象(高级)和理解底层实现(低级)的要点外,还有第三点被遗漏了。为了当今成为一名优秀的程序员,您必须一定要同时掌握以上两个方面。此外,不断研究新技术和观点对于您的能力至关重要。不管您从哪个抽象级别开始,都必须不断进行改进,并对当前的方法提出疑问。

从一开始就应该清楚地表明,编程语言仅仅是完成任务的工具。为特定任务选择正确的工具非常重要。我认为对于初学者来说,高级脚本语言将有助于强调这一点。高级语言将提供更广阔的视野,并激发程序员进行更深入的研究。

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.