
Why learn Perl, Python, Ruby if the company is using C++, C# or Java as the application language?我想知道为什么C ++,C#,Java开发人员想学习动态语言? 假设公司不会将其主要开发语言从C ++ / C#/ Java转换为动态语言,那么动态语言有什么用? 在学习了几天后,动态语言比使用多年的静态语言可以更快或更更好地完成哪些辅助任务? 更新
看到前几个响应后,很明显有两个问题。 很多时候出现了一些快速任务,这些任务并不是您正在开发的主要软件的一部分。有时任务是一次性完成的,即将该文件与数据库进行比较,然后让我知道它们之间的区别。与在Java或C#中相比,在Perl / Ruby / Python中进行文本解析要容易得多(部分原因是使用正则表达式要容易得多)。使用Perl / Ruby / Python解析文本文件(甚至使用vbscript cre然后将其加载到数据库中)可能要比创建Java / C#程序来完成或通过以下方式花费更少的时间手。 同样,由于大多数动态语言都易于解析文本,因此它们非常适合代码生成。确保您的最终项目必须是C#/ Java / Transact SQL,但是与其剪切和粘贴100次,发现错误以及剪切和粘贴另外100次相比,使用代码生成器通常(但并非总是)更容易。 最近的一个工作示例是,我们需要将数据从一个会计系统导入我们的会计系统。该系统具有导入格式,但是旧系统具有完全不同的格式(固定宽度,尽管必须匹配某些内容)。任务不是创建一个程序来一次又一次地迁移数据。它将数据推送到我们的系统中,然后继续进行维护。因此,即使我们是C#和SQL Server商店,我还是使用Python将数据转换为应用程序可以导入的格式。最终,我使用python没关系,数据在系统中也很重要。我的老板印象深刻。 我经常看到用于测试的动态语言。与创建等效的Java程序相比,创建一个Python / Perl / Ruby程序以链接到Web服务并向它扔一些数据要容易得多。您还可以使用python打击命令行程序,生成大量垃圾(但仍然有效)的测试数据,等等。 动态语言的另一大优势是代码生成。创建C#/ C ++ / Java代码。以下是一些示例: 我经常看到的第一个代码生成任务是人们使用动态语言来维护系统中的常量。可以使用动态语言轻松地解析文本文件,并使用枚举创建Java / C#代码,而无需手动编码一堆枚举。 SQL完全是另外一类游戏,但是通常通过剪切和粘贴100次而不是尝试执行一个函数来获得更好的性能(由于缓存执行计划或在函数中放入复杂的逻辑,导致您逐行而不是逐行执行)一套)。实际上,使用表定义自动创建某些存储过程非常有用。 最好购买代码生成器。但是,即使您不这样做,花时间进行剪切/粘贴还是会更有趣,还是一次创建一个Perl / Python / Ruby脚本然后生成代码会更有趣?如果您花一些时间来编写代码,而创建代码生成器的时间却更少,那么即使您一经使用就可以节省时间,从而节省金钱。如果创建代码生成器花费的时间比处理代码一次要花费的时间长,但是您知道必须多次更新代码,那么这样做仍然有意义。如果要花2个小时的时间来编写代码,那么要花4个小时来完成生成器,但是您知道必须花5到6倍的时间来进行等效的代码生成工作,这显然比创建生成器更好。 动态语言也比Java / C#/ C / C ++容易一些。特别是正则表达式。如果您开始在Perl中使用正则表达式并意识到其价值,那么您可能会突然开始使用Java正则表达式库。如果有的话,可能还有别的东西。 最后,我将为您提供关于动态语言的一项出色的任务示例。我的同事不得不在一个充满文件的目录下将它们刻录到各个客户的各种CD上。有几个客户,但是有很多文件,您必须查看他们才能看到它们是什么。他用手完成了这个任务。...一个Java / C#程序本可以节省时间,但是一次又一次又花了所有开发开销,这是不值得的。但是在Perl / Python / Ruby中将某些东西放在一起可能是值得的。他花了几个小时去做。创建Python脚本来检查每个文件,匹配要访问的客户,然后将文件移动到适当的位置,只需不到一个时间。.....同样,这不是标准作业的一部分。但是这项任务一次完成。最好自己做,花更多的时间使Java / C#完成任务,还是花更少的时间在Python / Perl / Ruby中完成任务呢?如果您使用的是C或C ++,则由于使用C或C ++进行编程时要特别注意(指针,无数组边界检查等),因此问题会更加严重。 好。 让我问您的问题,问美国英语使用者学习另一种语言有什么用? 我们所说的语言(以及我们编程时使用的语言)为我们的思维方式提供了信息。这可以发生在基本级别上,例如c ++,javascript和lisp,或者在实现级别,其中ruby构造为您的"实际工作"提供了一个尤里卡时刻。 说到您的实际工作,如果市场向南,而您的雇主决定"裁员",您如何看待您与一个灵活的人面对面,因为他用数十种语言编写软件,而不是您的有限曝光?万事万物都一样,我认为答案很明确。 最后,您因为喜欢编程而谋生,对吧? 我认为还没有人提到这一点。学习一种新语言会很有趣!当然,这是尝试新事物的足够充分的理由。 我主要使用Java和C#进行编程,但是使用动态语言(ruby / perl)来支持更流畅的部署,启动OS任务,自动报告,一些日志解析等。 经过短暂的学习和使用ruby或perl进行试验后,您应该能够编写一些可改变数据格式或从日志中获取信息的正则表达式操纵脚本。可以快速编写的小型ruby / perl脚本的示例是用于解析非常大的日志文件并仅以人类可读格式或csv格式报告少数感兴趣的事件的脚本。 另外,具有使用各种不同编程语言的经验,还可以帮助您考虑使用新的方法来解决Java,C ++和C#等结构化语言中的问题。 学习Perl或Ruby的一个重要原因是可以帮助您自动化所有需要反复执行的复杂任务。 或者,如果您必须分析日志文件的内容,并且需要比使用grep,sed等可用的方法更多的清理工作。 还使用其他语言,例如Ruby并没有太多的"设置成本",它可以让您在用C ++,Java等实现它们之前快速创建想法的原型。 HTH 干杯, 抢 保罗·格雷厄姆(Paul Graham)几年前发表了一篇文章,内容介绍了Python程序员为什么要成为更好的Java程序员。 (http://www.paulgraham.com/pypar.html) 基本上,不管新语言是否与公司当前的方法相关,学习新语言都意味着学习新思想。愿意学习不被视为"商务舱"语言的人,意味着他不仅对薪水感兴趣,而且对编程感兴趣。 引用保罗的网站:
如果雇主愿意为学习一种新语言付出代价,那么自愿学习的人(假设这不是必修课)很可能与已经走上"快速通道"的人一样。
一个好的曲棍球运动员在冰球所在的地方比赛。一个伟大的曲棍球运动员在冰球将要出现的地方打球。 我们的行业一直在变化。没有语言可以永远成为主流。对我而言,Java,C ++ 、. Net是目前的难题。 python,ruby,perl就是冰球的所在地。自己决定是否要成为好人或伟大! 您希望永远为这家公司工作吗?如果您曾经在工作市场上出差,也许某些潜在的雇主会意识到Python的悖论。 当我第一次学习Python时,我在一家Java商店工作。有时候,我不得不执行严肃的文本处理任务,而使用快速Python脚本要比Java程序容易得多。例如,如果我必须解析一个复杂的CSV文件并弄清楚它的哪一行对应于Oracle数据库中的行,那么使用Python进行操作要比使用Java容易得多。 不仅如此,我发现学习Python使我成为一个更好的Java程序员。用另一种语言学习了许多相同的概念后,我觉得我对这些概念的理解要好得多。至于什么使Python比Java容易,您可能会发现以下问题:Java-> Python? 编辑:我在阅读原始问题的更新之前写了这个。请参阅我的其他答案,以获取对更新问题的更好答案。我将其作为警告,以免成为西方最快的枪支=) 十多年前,当我学习计算机的方法时,有胡子的老智者解释了C和C ++如何成为行业的工具。没有人使用过Pascal,只有笨蛋会冒险用汇编器冒险他们的公司。 当然,没有人会提到可怕而缓慢的丑陋事物Java。它将不是从事严肃业务的工具。 所以。嗯。替换上面故事中的语言,也许您可??以预测未来。也许你做不到。重点是,Java永远不会成为最后的编程语言,而且您很可能也会转换雇主。未来每天24小时为您收费。做好准备 学习新语言对您有好处。另外,在某些情况下,它可以使您长期享有吹牛的权利。我的第一门大学课程是Scheme。因此,当人们与我谈论新的语言时,我的回答就像是"一流的功能?上世纪就是这样"。 当然,您可以使用高级语言完成更多工作。 学习新语言是一个长期的过程。在几天之内,您将学习基础知识,是的。但!您可能知道,任何语言的实际实用性都与标准库和其他可用组件有关。学习如何高效使用需要大量的动手经验。 也许唯一的短期好处就是开发人员学会区分需要使用Python / Perl / Ruby-hammer的钉子。而且,如果他们有什么好处,他们可以进一步学习(也许在网上!),并成为真正的专家。 长期利益更容易想象: 员工成为更好的开发人员。更好的开发人员=>更好的质量。这些天,我们生活在知识经济中。投资那些已经为您服务的大脑是明智的。 当下一种主要语言出现时,更容易适应。 NBL很可能会具有当今脚本语言中提供的许多功能:一流的函数,闭包,流/生成器等。 新的市场潜力和更快响应的能力。即使您未编写Python,其他人也是如此。您的客户?项目中的另一个供应商?也许关键部分是用其他语言编写的?如果您没有可以理解代码并与其交互的人,则将花费金钱和时间。 招聘。如果您的公司享有向人们传授新颖有趣的东西的声誉,那么招募顶尖人才将变得更加容易。每个人都在做Java / C#/ C ++。这不是在就业市场上脱颖而出的非常有效的方法。 为了回答更新的问题,这是一个鸡/蛋问题。证明费用合理的最佳方法是在其他地方展示如何降低成本,因此您可能需要花费一些额外的/个人的时间来学习一些东西,以构建某种功能原型。 向您的老板演示一个示例,例如"嘿,我做了这件事,它为我节省了很多时间(或者更好的是,有这么多的$$),想象一下如果每个人都可以用这笔钱我们可以节省多少钱" 然后,在他们同意后,解释一下这是另一种技术,并且值得接受更多培训,并为其他人培训如何做得更好,这是值得的。 这一切都是为了拓宽您作为开发人员的视野。如果仅将自己限制为强类型语言,则可能无法获得最佳的程序员。 至于任务,Python / Lua / Ruby / Perl非常适合小型简单任务,例如查找某些文件并重命名它们。当与框架(例如Rails,Django,Lua for Windows)配对使用时,它们也可以很好地工作,以快速开发简单的应用程序。地狱,37Signals基于在Ruby on Rails中创建简单但非常有用的应用程序。 它们对于"快速砍杀"很有用??,因为"快速砍杀"用于弥补主要语言中的空白,以进行快速(且可能是肮脏的)修复,而不是使用主要语言进行相同的开发。一个例子:在perl中使用一个简单的脚本来处理一个大型文本文件,并用另一个替换电子邮件地址的所有实例,而这花费的时间在10分钟范围内是微不足道的。一起破解一个控制台应用程序以用您的主要语言来做同样的事情会花费很多。 您还将受益于将自己暴露给其他语言,从而扩展了您的能力,并且从不同语言的角度学习解决问题与语言本身一样有价值。 最后,脚本语言在扩展领域非常有用。以LUA为例。您可以以很少的开销将lua解释器连接到您的应用程序中,并且现在您可以使用一种方法来创建丰富的脚本功能,这些功能可以向最终用户公开或快速更改和分发,而无需重建整个应用程序。在许多游戏中,尤其是在《魔兽世界》中,这种效果非常有用。 我个人是在Java应用程序上工作,但是如果没有perl来支持某些支持脚本,我将无法完成。 我有脚本可以快速翻转我要指向的数据库,可以运行构建脚本的脚本,可以爬取数据和比较内容的脚本。 当然,我可以用Java或shell脚本(我也有一些脚本)来完成所有这些工作,但是当您只需要快速又肮脏的东西时,谁想编译一个类(确保类路径设置正确等)。知道脚本语言可以消除90%的无聊/重复的手动任务。 如果您只有一把锤子,那么每个问题都将看起来像钉子。 有时,使用螺丝刀或钳子会使复杂的问题变得微不足道。 没有人问承包商,木匠等:"如果我已经有锤子,为什么要学习使用螺丝刀?"。真正好的承包商/木匠拥有大量工具,并且知道如何很好地使用它们。所有程序员都应该做同样的事情,学习使用新工具并很好地使用它们。
查看此主题的答案: https://stackoverflow.com/questions/76364/what-is-the-single-most-effective-thing-you-did-to-improve-your-programming-ski#84112 学习新语言是要保持开放的态度并学习新的做事方式。 我经常发现,学习另一种语言,尤其是动态类型的语言,可以教给您其他语言的知识,并使您成为一个总体上更好的程序员。例如,学习红宝石将以Java不会教您如何进行面向对象的编程,反之亦然。总而言之,我认为成为一个全面的程序员比单纯使用一种语言要好。它使您对您所工作的公司/客户更有价值。 我不确定这是否是您要寻找的东西,但是我们在我工作的一家小型公司中使用Java编写了我们的主应用程序,但是已经使用python快速编写了较小的脚本。备份软件,用于处理数据和输出结果的临时脚本。有时候坐下python并编写一个快速脚本似乎比弄乱java中的类和东西似乎更容易。 不需要使用的临时脚本不需要在它们上浪费大量的设计时间。 我很懒惰,但是最好还是学习尽可能多的东西,看看其他语言中存在哪些功能,这是很好的。了解更多信息永远不会伤害您未来的职业发展:) 我发现与Ruby一起玩的次数越多,我对C#的了解就越好。 1)当您在这些语言之间切换时,它们每种都有自己的构造和哲学,以解决它们要解决的问题。这将为您找到适合工作或问题领域的正确工具提供帮助。 2)编译器(或某些语言的解释器)的作用更加突出。为什么Ruby的类型系统与.Net / C#系统不同?这些每个解决什么问题?您会发现自己在较低的层次上了解了编译器的构造及其对语言的影响 3)在Ruby和C#之间切换确实帮助我更好地理解了设计模式。我真的建议使用C#这样的语言,然后再使用Ruby这样的语言来实现常见的设计模式。它常常帮助我通过一些编译器仪式来了解特定模式的哲学。 4)一个不同的社区。 C#,Java,Ruby,Python等都有不同的社区,可以帮助您发挥自己的能力。这是将您的工艺提升到更高水平的好方法。 5)最后但并非最不重要的一点,因为新语言很有趣:) 不要告诉您的雇主您想学习Ruby。告诉他您想了解Web框架技术的最新知识。碰巧最热门的是Django和Ruby on Rails。 我认为动态语言的主要好处可以归结为 短的设计代码测试周期时间使动态语言非常适合原型,工具以及快速且肮脏的一次性脚本。恕我直言,后两者可以对程序员的生产力产生巨大影响。令我惊讶的是,有多少人手动手动完成任务,而不是动手为他们完成任务。我认为这是因为他们的工具箱中没有像Perl这样的东西。 与几乎所有内容(其他程序或语言,数据库等)交互的能力使重用现有工作和自动化需要手动完成的任务变得容易。 通过诸如Lisp或Perl(请参阅Moose)之类的灵活的OOP系统学习一些知识,将使您能够更好地扩展和理解关于软件工程的想法。理想情况下,每种语言都有独特的方面(无论是CLOS还是其他技术),可以增强,扩展和发展您作为程序员的能力。 考虑到越来越多的关注在JVM上运行动态语言(da-vinci vm等)以及在其上运行的动态语言(JRuby,Grrovy,Jython)越来越多,我认为用例正在增加。我发现真正受益的一些场景是 原型制作-使用RoR或Grails构建快速的原型,其优势在于能够在标准应用服务器上运行它,并(可能)重用现有服务等。 测试-使用动态语言进行正确的单元测试要快得多 性能/自动化测试脚本-这些工具中的一些开始允许使用选择的标准动态语言来编写测试脚本,而不是专有脚本语言。附带的好处可能是能够重用您已经编写的某些单元测试代码。 其他人已经解释了为什么学习更多的语言可以使您成为更好的程序员。 说服您的老板值得,这可能只是您公司的文化。有些地方将职业和技能进步作为一项政策(晋升或晋升),一些地方对其予以重视,但取决于员工的主动性,而某些地方则非常关注底线。 如果您必须解释为什么学习一种语言对您的老板来说是一件好事,我的建议是仅在必要的时候待在家里,然后回家独自学习新事物。 不要打扰老板,花40美元买一本书,下载一些软件,每天花一些时间阅读/练习。马上您就会得到培训:) 除了哲学上的问题,我知道我已经从编写快速而肮脏的Ruby脚本中解决Java太大无法解决的暴力问题中获得了价值。去年,我有三个单独的目录结构,它们或多或少都是一样的,但是文件之间有很多差异(客户端没有听说过版本控制,其余的请您想象。) 用Java编写分析器将花费大量的开销,但是在Ruby中,我需要大约40分钟才能完成一个分析器。 通常,动态语言(尤其是python和lua)被嵌入程序中以添加更多类似于插件的功能,并且因为它们是高级语言,可以轻松地添加某些行为,而无需使用低/中级语言。 。 Lua特别缺少所有的低级系统调用,因为它是为了易于使用而在程序中添加功能而不是作为通用编程语言而设计的。 动态语言非常适合原型创意。通常出于性能原因,它们不适用于永久性解决方案或产品。但是,使用Python这样的语言,您可以将标准C / C ++ / Java嵌入其中,反之亦然,您可以加快真正关键的位的运行速度,但可以将其与动态语言的灵活性粘合在一起。 ...因此您将两全其美。如果您需要更多人学习这些语言的理由,请指出这一点,只需指出您可以更快地开发相同的软件,以及解决方案的健壮性(根据我的经验,因为调试/修复动态语言中的问题,相当容易!)。 对于下班后的工作,对于自由职业者... :),最后要编程的人要尽可能地有识字...; 测试。 使用动态语言来测试C#/ Java应用程序通常更快,更容易。您可以在交互式提示下进行探索性测试,并快速创建自动化测试脚本。 雇主可以看到的"实际利益"是一个更好的程序员,可以更快地实施解决方案。但是,您将无法提供任何明确的数字来证明这笔费用的合理性,雇主很可能会让您从事现在能赚钱的工作,而不是让您从事使未来变得更好的事情。 唯一一次可以接受雇主一毛钱培训的时间就是他们认为需要这样做,这比雇用一个已经具备这种技能的新员工要便宜。 了解grep和ruby可以缩小问题并验证解决方案,该问题涉及一些生产服务器上的大量Java异常。因为我将解决方案用红宝石放在一起,所以它在一个下午而不是几天内完成(设计,实施,测试,运行,错误修复,重新运行,增强,分析结果)。我本可以使用全Java解决方案或C#解决方案解决相同的问题,但是很可能会花更长的时间。 拥有动态语言方面的专业知识有时也可以带您以较少动态的语言来提供更简单的解决方案。在ruby,perl或python中,您可以直观地找到最小的东西的关联数组(哈希,字典,任何您想使用的单词),在出现问题时,您可能会倾向于用静态类型的语言创建复杂的类层次结构不一定需要它。 另外,您可以将大多数脚本语言插入大多数运行时。因此,它不必是/或。 您还应该考虑学习像Scala这样的函数式编程语言。它具有Ruby的许多优点,包括简洁的语法和强大的功能(如闭包)。但是它可以编译为Java类文件,然后无缝集成到Java堆栈中,这可能使您的雇主更容易接受。 Scala不是动态类型化的,但是它的"隐式转换"功能提供了动态类型化的许多甚至全部优点,同时保留了静态类型化的许多优点。 动态语言是一种不同的思维方式,有时您从动态或功能性语言中学习的实践可以转换为更多静态类型的语言,但是如果您从不花时间学习不同的语言,您将永远不会从中受益。知道在编码时的思考方式。 |