如果公司使用C ++,C#或Java作为应用程序语言,为什么要学习Perl,Python,Ruby呢?

我想知道为什么C ++,C#,Java开发人员想要学习一种dynamic语言?

假设公司不会将其主要开发语言从C ++ / C#/ Java切换到dynamic语言,那么dynamic语言的用途是什么?

只有几天的学习,dynamic语言能够比使用多年的静态语言更快,更好地完成哪些辅助任务呢?

更新

在看到第一个答复后,显然有两个问题。 我的主要兴趣是对雇主来说合理的一笔费用。 也就是说,我正在寻找雇主为学习dynamic语言提供资金的理由。 除了显而易见的是雇员会有更广泛的观点,雇主通常都在寻找一些“真正的”好处。

很多时候,一些快速的任务出现,而不是你正在开发的主要软件的一部分。 有时候,这个任务是一个closures,即比较这个文件到数据库,让我知道的差异。 在Perl / Ruby / Python中进行文本parsing比在Java或C#中执行文本parsing要容易得多(部分是因为使用正则expression式要容易得多)。 使用Perl / Ruby / Pythonparsing文本文件可能花费很less的时间(甚至可能是vbscript 压缩 ,然后将其加载到数据库中,而不是创build一个Java / C#程序来做到这一点,或通过手。

而且,由于大多数dynamic语言都很容易parsing文本,所以对于代码生成来说非常有用。 当然,你的最终项目必须在C#/ Java / Transact SQL中,而不是剪切和粘贴100次,发现错误,剪切和粘贴另外100次,而使用代码生成器通常(但并不总是)更容易。

最近的一个例子是我们需要从一个会计系统中获取数据到我们的会计系统。 该系统有一个导入格式,但旧系统有一个完全不同的格式(固定宽度,但有些事情必须匹配)。 任务不是创build一个程序来重复迁移数据。 这是把数据推入我们的系统,然后在那里继续保持下去。 所以即使我们是一个C#和SQL Server商店,我也使用Python将数据转换为可以由我们的应用程序导入的格式。 最后,我用python并不重要,重要的是数据在系统中。 我的老板印象深刻。

我经常看到用于testing的dynamic语言。 创build一个Python / Perl / Ruby程序来链接到一个Web服务,并抛出一些数据比创build等价的Java程序要容易得多。 你也可以使用python命令行程序,产生大量的垃圾(但仍然有效)的testing数据等等。很容易。

dynamic语言最重要的是代码生成。 创buildC#/ C ++ / Java代码。 一些例子如下:

我经常看到的第一个代码生成任务是使用dynamic语言来维护系统中的常量。 可以使用dynamic语言来相当容易地parsing文本文件,并使用枚举创buildJava / C#代码,而不是手动编写一堆枚举。

SQL是一个完整的其他球类游戏,但是通常你可以通过剪切和粘贴100次来获得更好的性能,而不是试图做一个函数(由于执行计划的caching或者将复杂的逻辑放在函数中导致你逐行而不是一套)。 事实上,使用表定义自动创build某些存储过程是非常有用的。

买代码生成器总是比较好的。 但是,即使你不这样做,花费时间剪切/粘贴是否更有趣,或者创build一个Perl / Python / Ruby脚本,然后生成代码更有趣? 如果需要花几个小时手工编写代码,但创build代码生成器的时间更less,那么即使您节省了时间和金钱,也可以使用它。 如果创build代码生成器所需的时间比手动编写代码所需的时间更长,但是您知道必须不止一次更新代码,则可能还是有意义的。 如果需要2个小时的手工代码,4个小时的时间来做发电机,但是你知道你将不得不手工编码等效的工作5到6次,这比创build发电机显然更好。

dynamic语言比Java / C#/ C / C ++还要容易一些。 特别的正则expression式让人想起。 如果你开始在Perl中使用正则expression式并实现它们的价值,那么你可能会突然开始使用Java正则expression式库,如果没有的话。 如果你有,那么可能有别的东西。

我会给你留下一个对于dynamic语言来说很好的任务的最后一个例子。 我的同事不得不把文件夹放在一个目录中,然后把它们刻录到不同的用户的光盘上。 有几个客户,但有很多文件,你必须看看他们是什么。 他手工完成了这项任务….一个Java / C#程序本来可以节省时间,但是一次又一次,所有的开发费用都是不值得的。 然而,在Perl / Python / Ruby中敲打东西可能是值得的。 他花了几个小时做这件事。 创buildPython脚本来检查每个文件,匹配到哪个客户,然后将文件移动到合适的位置,这将需要less于一个的时间。同样,这不是标准作业的一部分。 但是这个任务是一个一个的。 自己动手,花费大量的时间让Java / C#完成任务,或者花费更less的时间在Python / Perl / Ruby上完成任务。 如果您使用的是C或C ++,则由于C或C ++(指针,数组边界检查等)的额外担心,这一点更为显着。

让我转过头来问一个美国英语使用者学习另一种语言的用途是什么?

我们所说的语言(以及我们所编程的语言)通知我们的想法。 这可能发生在一个基本的层面上,比如c ++与javascript和lisp,或者在实现层面上,ruby结构为你的“真正的工作”提供了一个解决scheme。

说到你真正的工作,如果市场南下,你的雇主决定“适当规模”你,你怎么看你会对付一个灵活的人,因为他用几十种语言编写的软件,而不是你有限的曝光? 所有的事情都是平等的,我想答案很清楚。

最后,你为节目谋生,因为你喜欢编程…对吗?

我不认为有人提到过。 学习一种新的语言可以很有趣! 当然,这是一个很好的理由尝试新的东西。

我主要使用Java和C#编程,但使用dynamic语言(ruby / perl)来支持更平滑的部署,启动操作系统任务,自动报告,日志parsing等。

经过短时间的学习和使用ruby或perl的实验,你应该能够编写一些正则expression式操作脚本,这些脚本可以改变数据格式或者从日志中获取信息。 可以快速编写的小ruby / perl脚本的示例将是一个脚本来parsing一个非常大的日志文件,并只报告一些人们可读的格式或csv格式的感兴趣的事件。

此外,拥有各种不同编程语言的经验应该可以帮助您思考采用更多结构化语言(如Java,C ++和C#)解决问题的新方法。

学习Perl或Ruby的一个重要原因是帮助你自动完成任何你需要做的复杂任务。

或者,如果您必须分析日志文件的内容,并且需要使用grep,sed等可用的更多内容

另外使用其他语言,比如Ruby,没有太多的“设置成本”,可以让你在C ++,Java等实现它们之前快速地构build原型。

HTH

干杯,

你期望永远为这家公司工作吗? 如果你曾经在职场上工作过,那么一些潜在的雇主会意识到Python的悖论 。

当我第一次学习Python时,我曾在一家Java商店工作过。 有时候我不得不做严肃的文本处理任务,这比使用Java程序更容易处理快速的Python脚本。 例如,如果我必须parsing一个复杂的CSV文件,并确定哪一行与我们的Oracle数据库中的行相对应,那么使用Python比使用Java更容易。

不仅如此,我发现学习Python使我成为一个更好的Java程序员; 用另一种语言学习了许多相同的概念,我觉得我更好地理解这些概念。 至于什么使得Python比Java更容易,你可以看看这个问题: Java – > Python?

一个好的曲棍球运动员可以踢冰球。 一个伟大的曲棍球运动员在冰球将要去的地方。 – 韦恩Gretzky

我们的行业总是在变化。 没有一种语言永远是主stream的。 对我来说,Java,C ++,.Net是现在冰球的地方。 而python,ruby,perl就是冰球所在的地方。 决定自己,如果你想成为好或伟大的!

几年前,Paul Graham发表了一篇关于为什么Python程序员创造出更好的Java程序员的文章。 ( http://www.paulgraham.com/pypar.html

基本上,不pipe新语言是否与公司当前的方法相关,学习一种新语言意味着学习新的想法。 有人愿意学习一种不被认为是“商业类”的语言,这意味着他对程序devise感兴趣,而不仅仅是获得薪水。

引用Paul的网站:

而且人们不学习Python,因为它可以帮助他们find工作。 他们学习它,因为他们真的喜欢编程,不满意他们已经知道的语言。

这使得他们正是那些程序员公司应该聘用的。 因此,由于缺乏一个更好的名字,我会称之为Python悖论:如果一家公司select用相对深奥的语言编写软件,他们将能够雇佣更好的程序员,因为他们只会吸引那些照顾足够了解它。 对于程序员来说,这个悖论更加明显:如果你想find一份好工作,学习语言是一种人们不会学习的语言。

如果一个雇主愿意为学习一门新语言付出代价,自愿学习的人(假设不是一个强制性class级)有可能是已经走上“快车道”的人。

编辑:我在阅读原始问题的更新之前写了这个。 看到我的其他答案更好的答案更新的问题。 我会留下这个作为警告,作为西部最快的枪=)

十多年前,当我学习计算机的方法时,“胡须老手”解释了C和C ++是如何成为这个行业的工具。 没有人使用Pascal,只有蛮干的人才会用汇编来冒险。

当然, 没有人会提到称为Java的可怕的缓慢丑陋的东西 。 这不会是一个严重的业务工具。

所以。 嗯。 replace上述故事中的语言,也许你可以预测未来。 也许你不能。 问题是,Java不会成为最后的编程语言,你也很可能会转换雇主。 未来每天24小时都在收费。 做好准备。

学习新的语言对你有好处。 此外,在某些情况下,它可以给你长时间吹牛的权利。 我的第一个大学课程是在计划。 所以当人们和我谈论新语言的时候 ,我的回答就是“一stream的function,那是上个世纪的事情”。

当然,用高级语言可以完成更多的工作

学习一门新的语言是一个长期的过程。 几天后,你会学到基本知识,是的。 但! 如您所知,任何语言的实际应用都与标准库和其他可用组件相关联。 学习如何高效地使用需要大量的实践经验。

也许短期的唯一好处是开发人员要学会区分需要Python / Perl / Ruby-Hammer的指甲。 而且,如果他们有什么好处的话,他们可以再学习一些(也许在线),成为真正的专家。

长远的好处很容易想象:

  1. 该员工成为一个更好的开发者。 更好的开发者=>更好的质量。 我们现在生活在知识经济时代。 投资那些已经为你工作的大脑更聪明了。

  2. 下一个大的语言出现时,更容易适应。 NBL很有可能在今天的脚本语言中具有许多特性:一stream的函数,闭包,stream/发生器等等。

  3. 新的市场可能性和更快的反应能力。 即使你不是在写Python, 其他人也是如此 。 你的客户? 项目中的另一个供应商? 也许关键的组成部分是用其他语言写的? 如果没有人能够理解代码并与之交互,这将花费金钱和时间。

  4. 招聘。 如果你的公司有一个向人们传授新奇有趣的东西的名声,那么招聘最优秀的人才会更容易。 每个人都在做Java / C#/ C ++。 在就业市场中区分自己并不是一个非常有效的方法。

朝着回答更新的问题,它是一个鸡/蛋问题。 certificate费用合理化的最好方法是说明如何降低其他地方的成本,所以您可能需要花费一些额外/个人时间来首先学习某些东西来构build某种function原型。

向你的老板展示一个演示,例如“嘿,我做了这件事情,并为我节省了这么多时间(或者更好的是,这么多的$$),想象一下,如果每个人都可以用这个钱,我们可以节省多less钱”

然后在他们同意之后,解释一下其他技术是怎样的,花费更多的培训和培训他人如何做得更好。

我经常发现,学习另一种语言,特别是dynamictypes的语言,可以教你关于其他语言的东西,使你成为一个整体上更好的程序员。 例如,学习ruby会教你面向对象的Java编程方式,反之亦然。 总而言之,我认为做一个全面的程序员比单一的语言更好。 它使你对你工作的公司/客户更有价值。

看看这个答案:

https://stackoverflow.com/questions/76364/what-is-the-single-most-effective-thing-you-did-to-improve-your-programming-ski#84112

学习新语言是要保持开放的心态,学习新的方式。

我不知道这是你在找什么,但我们在我工作的小公司用Java编写我们的主应用程序,但是用python来快速编写小脚本。 备份软件,临时脚本来操纵数据并推出结果。 有时候用python坐下来写一个快速的脚本,而不是用java中的类和东西搞砸似乎更容易。

临时脚本不会停留在周围,不需要浪费大量的devise时间。

而且我很懒,但是,当然,尽可能多地学习,看看其他语言中存在哪些function是很好的。 了解更多从未伤害你未来的职业生涯变化:)

这就是扩大开发者的视野。 如果你只限于强types语言,你可能不会成为最好的程序员。

至于任务,Python / Lua / Ruby / Perl对于简单的小任务来说很不错,比如寻找一些文件并重命名它们。 当与一个框架(例如Rails,Django,Lua for Windows)搭配使用,它们也可以很快地开发出简单的应用程序。 地狱,37Signals是基于在Ruby on Rails创build简单而非常有用的应用程序。

它们对于“快速入门”非常有用,它可以快速(也可能是肮脏)的修复速度比在主要语言中开发相同的速度更快地填补主要语言的空白。 举个例子:perl中的一个简单的脚本可以通过一个大的文本文件,并且用一个简单的脚本代替另一个电子邮件地址的实例,而且在10分钟范围内所花费的时间是微不足道的。 黑客控制台应用程序一起做你的主要语言相同,将采取的倍数。

你也有这样的好处,即让自己暴露于其他语言,从而扩大了你的能力,学习从不同语言的angular度来攻击问题可以像语言本身一样有价值。

最后,脚本语言在扩展领域是非常有用的。 以LUA为例。 你可以用很less的开销将一个lua解释器插入你的应用程序,现在你可以创build丰富的脚本function,这些脚本function可以暴露给最终用户,或者快速修改和分发,而不需要重build整个应用程序。 这在许多游戏中最为显着,特别是“魔兽世界”。

就我个人而言,我工作在一个Java应用程序,但是我不能没有perl的一些支持脚本。

我有脚本来快速翻转我指向的数据库,脚本来运行构build脚本,脚本来抓取数据和比较的东西。

当然,我可以用java 完成所有的工作,也可以使用shell脚本(我也有一些),但是当你只需要一些快速和肮脏的东西的时候,谁想编译一个类(确保类path设置正确等)。 了解脚本语言可以消除90%的无聊/重复手动任务。

学习灵活的OOP系统,比如Lisp或Perl(请参阅Moose),将使您能够更好地扩展和理解您对软件工程的想法。 理想情况下,每种语言都有一些独特的方面(不pipe是CLOS还是其他一些技术),可以提升,扩展和提高程序员的能力。

如果你只有一把锤子,每一个问题都会像钉子一样。

有时候有一把螺丝刀或一把钳子使一个复杂的问题变得微不足道。

没有人要求承包商,木匠等,“如果我已经有锤子,为什么要学习使用螺丝刀?”。 真的很好的承包商/木匠有很多工具,并知道如何使用它们。 所有的程序员都应该做同样的事情,学习使用新的工具并使用它们。

但是在我们使用任何电动工具之前,让我们花点时间谈一谈商店的安全。 请务必阅读,理解并遵守电动工具附带的所有安全规则。 这样做会大大降低人身伤害的风险。 请记住:没有比佩戴这些安全眼镜更重要的规则 – 规范了

我认为dynamic语言的主要好处可以归结为

  1. 快速发展

短的devise代码testing循环时间使得dynamic语言成为原型,工具和快速肮脏的一次性脚本的理想select。 恕我直言,后两者可以对程序员的生产力产生巨大的影响。 令我惊讶的是,有多less人通过手动跋涉,而不是掀起一个工具来为他们做事。 我想这是因为他们的工具箱里没有像Perl这样的东西。

能够与任何东西(其他程序或语言,数据库等)进行交互的能力使得重复使用现有工作和自动执行本来需要手动完成的任务变得容易。

不要告诉你的雇主你想学习Ruby。 告诉他你想了解在web框架技术方面的最新技术。 只是最热门的是Django和Ruby on Rails。

我发现我玩Ruby的越多,我越了解C#。

1)当你在这些语言之间切换时,他们每个人都有自己的构想和哲学背后的问题,他们试图解决。 这将帮助您find正确的工具问题领域

2) 编译器 (或某些语言的解释 )的作用变得更加突出。 为什么Ruby的types系统与.Net / C#系统有所不同? 这些解决了哪些问题? 你会发现自己在较低层次上理解编译器的结构及其对语言的影响

3)在Ruby和C#之间切换确实帮助我更好地理解了devise模式 。 我真的build议用像C#这样的语言来实现通用的devise模式,然后用像Ruby这样的语言。 它通常帮助我通过编译器的一些典型来看待特定模式的哲学。

4)不同的社区 。 C#,Java,Ruby,Python等都有不同的社区可以帮助你的能力。 这是一个很好的方式来把你的技术提高到一个新的水平。

5)最后但并非最不重要的,因为新的语言是有趣的:)

鉴于越来越多的关注在JVM上运行dynamic语言(da-vinci vm等)以及在其上运行的dynamic语言(JRuby,Grrovy,Jython)的数量越来越多,我认为这些用例正在增加。 我发现真正有用的一些场景是

  1. 原型 – 使用RoR或Grails来构build快速原型,并能够在标准应用程序服务器上运行,并且(可能)重用现有服务等。

  2. testing – 在dynamic语言中,正确的unit testing要快得多

  3. 性能/自动化testing脚本 – 其中一些工具已经开始允许使用标准的dynamic语言来编写testing脚本,而不是专有的脚本语言。 可以重复使用已经写好的unit testing代码。

除了哲学问题之外,我知道通过编写快捷的Ruby脚本来解决Java对于Java来说过于庞大的暴力问题已经变得有价值了。 去年,我有三个独立的目录结构,虽然都差不多,但在文件之间有很多不同(客户端没有听说过版本控制,我将其余的留给了你的想象)。

用Java编写一个分析器会花费很多的开销,但是在Ruby中我有一个工作大概40分钟。

通常情况下,dynamc语言(特别是python和lua)被embedded到程序中,以添加更多类似于插件的function,并且因为它们是高级语言,所以很容易添加某些行为,而不需要中低级语言。

Lua特别缺乏所有低级别的系统调用,因为它是为了在程序中增加function的简便性而devise的,而不是一般的编程语言。

你还应该考虑学习像Scala这样的函数式编程语言。 它具有许多Ruby的优点,包括简洁的语法和强大的function,如闭包。 但它编译为Java类文件,并无缝集成到Java堆栈中,这可能会让您的雇主容易吞下。

Scala并不是dynamictypes的,但是它的“隐式转换”特性赋予了dynamictypes的许多甚至是所有的好处,同时保留了静态types的许多优点。

dynamic语言对原型创意非常有用。 通常出于性能原因,他们不能用于永久性解决scheme或产品。 但是 ,像Python这样的语言允许你在其中embedded标准的C / C ++ / Java,或者反过来,你可以加速真正关键的部分,但是把它与dynamic语言的灵活性结合在一起。

…所以你得到了两全其美。 如果你需要certificate这一点,为什么更多的人应该学习这些语言,只要指出更快的开发相同的软件和更强大的解决scheme(因为在我的经验dynamic语言debugging/修复问题,相当容易!)。

知道grep和ruby使得缩小问题成为可能,并validation了一些问题,包括在某些生产服务器上涉及大量Javaexception的问题。 因为我把这个解决scheme一起扔进了ruby,所以在一个下午而不是几天的时间里完成了(devise,实现,testing,运行,修复bug,重新运行,增强,结果分析)。 我可以使用全Java解决scheme或C#解决scheme解决同样的问题,但最有可能会花费我更长的时间。

拥有dynamic语言专业知识有时也会使您在较不dynamic的语言中使用更简单的解决方 在ruby,perl或python中,你可以直观地find关联数组(散列,字典,任何你想使用的单词)的最小的东西,当你遇到问题的时候你可能会试图用静态types的语言创build一个复杂的类层次结构不一定要求。

另外,大多数运行时可以插入大多数脚本语言。 所以它不一定是/或者。

雇主可以看到的“真正的好处”是能够更快实施解决scheme的更好的程序员。 但是,你将无法提供任何硬性数字来certificate这笔费用的合理性,雇主很可能会在现在赚钱的东西上工作,而不是让你工作在使未来更好的事情上。

唯一一次你可以在雇主的硬币上得到培训的时候,是他们觉得有需要的时候,比雇用一个已经拥有这个技能的新人要便宜。