我想知道为什么 C++、C#、Java 开发人员想要学习动态语言?
假设公司不会将其主要开发语言从 C++/C#/Java 切换到动态语言,那么动态语言有什么用?
与使用了几年的静态语言相比,动态语言在学习几天后可以更快或更好地完成哪些辅助任务?
更新
在看到最初的几个回复后,很明显有两个问题。我的主要兴趣是对雇主来说是合理的费用。也就是说,我正在寻找雇主资助学习动态语言的理由。除了员工将有更广阔的视野之外,雇主通常在寻找一些“真正的”好处。
很多时候会出现一些不属于您正在开发的主要软件的快速任务。有时任务是一次性的,即将此文件与数据库进行比较,然后让我知道其中的差异。在 Perl/Ruby/Python 中进行文本解析比在 Java 或 C# 中要容易得多(部分原因是使用正则表达式要容易得多)。使用 Perl/Ruby/Python 解析文本文件(甚至可能是 vbscript cringe然后将其加载到数据库中,这可能比创建 Java/C# 程序来完成它或通过它来完成它所花费的时间要少得多手。
此外,由于大多数动态语言解析文本很容易,它们非常适合代码生成。当然,您的最终项目必须使用 C#/Java/Transact SQL,但不是剪切和粘贴 100 次、查找错误,然后再剪切和粘贴 100 次,通常(但并非总是)使用代码生成器更容易。
最近工作中的一个例子是我们需要从一个会计系统中获取数据到我们的会计系统中。该系统有一个导入格式,但旧系统有一个完全不同的格式(固定宽度,虽然有些东西必须匹配)。任务不是创建一个程序来一遍又一遍地迁移数据。就是将数据推送到我们的系统中,然后继续保持下去。因此,即使我们是一家 C# 和 SQL Server 商店,我还是使用 Python 将数据转换为我们的应用程序可以导入的格式。最终,我使用 python 并不重要,重要的是数据在系统中。我的老板很感动。
我经常看到用于测试的动态语言。创建 Python/Perl/Ruby 程序以链接到 Web 服务并向其抛出一些数据比创建等效的 Java 程序要容易得多。您还可以使用 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)来支持更流畅的部署、启动操作系统任务、自动报告、一些日志解析等。
经过短暂的 ruby 或 perl 学习和试验后,您应该能够编写一些正则表达式操作脚本,这些脚本可以改变数据格式或从日志中获取信息。一个可以快速编写的小型 ruby/perl 脚本的示例是解析一个非常大的日志文件并仅以人类可读格式或 csv 格式报告少数感兴趣的事件的脚本。
此外,拥有各种不同编程语言的经验应该可以帮助您想出新的方法来解决更多结构化语言(如 Java、C++ 和 C#)中的问题。
学习 Perl 或 Ruby 的一个重要原因是帮助您自动执行必须一遍又一遍地完成的任何复杂任务。
或者,如果您必须分析日志文件的内容,并且您需要比使用 grep、sed 等更多的 mungeing。
同样使用其他语言,例如 Ruby,没有太多“设置成本”,可以让您在用 C++、Java 等实现它们之前快速原型化想法。
高温高压
干杯,
抢
你希望永远为这家公司工作吗?如果你曾经在就业市场上出现过,也许一些潜在的雇主会意识到Python 悖论。
一个好的曲棍球运动员在冰球所在的地方打球。一个伟大的曲棍球运动员会在冰球所在的地方打球。- 韦恩·格雷茨基
我们的行业总是在变化。没有一种语言可以永远成为主流。对我来说,Java、C++、.Net 是现在的重点。而 python、ruby、perl 将成为 puck 的所在。自己决定是要优秀还是优秀!
Paul Graham 几年前发表了一篇关于 Python 程序员为何成为更好的 Java 程序员的文章。( http://www.paulgraham.com/pypar.html )
基本上,无论新语言是否与公司当前的方法论相关,学习一门新语言就意味着学习新思想。愿意学习不被视为“商务舱”的语言的人意味着他对编程感兴趣,而不仅仅是赚取薪水。
引用保罗的网站:
人们不学习 Python 是因为它可以让他们找到工作;他们学习它是因为他们真正喜欢编程并且对他们已经知道的语言不满意。
这使得他们正是公司应该想要雇用的那种程序员。因此,由于没有更好的名称,我将称之为 Python 悖论:如果一家公司选择用相对深奥的语言编写软件,他们将能够雇用更好的程序员,因为他们只会吸引那些足够关心学习它。而对于程序员来说,悖论更加明显:如果你想找到一份好工作,要学习的语言是一种人们不只是为了找到工作而学习的语言。
如果雇主愿意支付学习一门新语言的费用,那么自愿学习的人(假设这不是强制性课程)很可能是已经走上“快车道”的人。
当我第一次学习 Python 时,我在一家 Java 商店工作。有时我不得不做一些严肃的文本处理任务,这些任务用 Python 脚本比 Java 程序更容易完成。例如,如果我必须解析一个复杂的 CSV 文件并找出其中的哪些行对应于我们的 Oracle 数据库中的行,那么使用 Python 比使用 Java 更容易做到这一点。
不仅如此,我发现学习 Python 让我成为了一个更好的 Java 程序员;用另一种语言学习了许多相同的概念后,我觉得我对这些概念的理解要好得多。至于是什么让 Python 比 Java 更容易,你可以看看这个问题:Java -> Python?
编辑:我在阅读原始问题的更新之前写了这个。有关更新问题的更好答案,请参阅我的其他答案。我将保持原样,以警告不要成为西方最快的枪=)
十多年前,当我学习计算机的方式时,胡须老智者解释了 C 和 C++ 如何成为该行业的工具。没有人使用 Pascal,只有鲁莽的人才会用汇编程序来冒险他们的公司。
当然,甚至没有人会提到一种叫做 Java 的可怕的缓慢丑陋的东西。它不会成为严肃业务的工具。
所以。嗯。替换上面故事中的语言,也许你可以预测未来。也许你不能。关键是,Java 永远不会是最后一种编程语言,而且你也很可能会换雇主。未来每天 24 小时向您收费。做好准备。
学习新语言对你有好处。此外,在某些情况下,它可以让你长时间吹牛。我的第一门大学课程是Scheme。因此,当人们与我谈论新的语言 du jour时,我的回答类似于“一流的功能?那是上个世纪的事了。”
当然,您可以使用高级语言完成更多工作。
学习一门新语言是一个长期的过程。过几天你就会学到基础知识,是的。但!您可能知道,任何语言的真正实用性都与标准库和其他可用组件相关联。学习如何有效地使用需要大量的实践经验。
也许唯一直接的短期好处是开发人员学会区分需要 Python/Perl/Ruby 锤子的钉子。而且,如果他们有任何好处,他们就可以进一步学习(也许是在线学习!)并成为真正的专家。
长期的好处更容易想象:
员工成为更好的开发人员。更好的开发人员 => 更好的质量。这些天,我们生活在知识经济中。投资于那些已经为你工作的大脑会更明智。
当下一个大语言出现时更容易适应。NBL 很可能具有当今脚本语言中存在的许多特性:一流的函数、闭包、流/生成器等。
新的市场可能性和更快响应的能力。即使你不写 Python,其他人也是. 你的客户?项目中的另一个供应商?也许一个关键组件是用其他语言编写的?如果您没有可以理解代码并与之交互的人,那将花费金钱和时间。
招聘。如果您的公司以向人们传授新奇有趣的东西而闻名,那么招聘顶尖人才会更容易。每个人都在做 Java/C#/C++。这不是在就业市场上区分自己的一种非常有效的方式。
为了回答更新的问题,这是一个鸡/蛋问题。证明费用合理的最佳方法是展示它如何在其他地方降低成本,因此您可能需要花费一些额外/个人时间来首先学习一些东西以构建某种功能原型。
给你的老板看一个演示,比如“嘿,我做了这件事,它节省了我这么多时间[或者更好的是,这么多美元],想象一下如果每个人都可以使用这个,我们会节省多少钱”
然后在他们同意后,解释它是如何成为其他技术的,并且值得花费更多的培训,并培训其他人如何做得更好。
我经常发现学习另一种语言,尤其是动态类型语言,可以教会你其他语言的知识,让你成为一个整体上更好的程序员。例如,学习 ruby 将以 Java 不会的方式教你面向对象编程,反之亦然。总而言之,我相信做一个全面的程序员比拘泥于单一语言要好。它使您对您工作的公司/客户更有价值。
查看此主题的答案:
学习新语言就是保持开放的心态和学习新的做事方式。
我不确定这是否是您正在寻找的东西,但我们在我工作的小公司中使用 Java 编写了我们的主要应用程序,但使用 python 快速编写了较小的脚本。备份软件,用于操作数据和推出结果的临时脚本。有时坐下来用 python 写一个快速的脚本似乎比在 java 中搞乱类和东西更容易。
不会保留的临时脚本不需要在它们上浪费大量的设计时间。
而且我很懒,但是当然,尽可能多地学习并看看其他语言中存在哪些功能是件好事。了解更多永远不会在未来的职业变化中伤害您:)
这一切都是为了拓宽您作为开发人员的视野。如果您将自己限制在只使用强类型语言,那么您最终可能不会成为最好的程序员。
至于任务,Python/Lua/Ruby/Perl 非常适合小型简单任务,例如查找一些文件并重命名它们。当与用于快速开发简单应用程序的框架(例如 Rails、Django、Lua for Windows)搭配使用时,它们也能很好地工作。地狱,37Signals 是基于在 Ruby on Rails 中创建简单但非常有用的应用程序。
它们对于“快速破解”很有用,该方法用于填补您的主要语言中的空白,以便快速(并且可能是肮脏)修复,而不是用您的主要语言开发相同的东西。一个例子:perl 中的一个简单脚本通过一个大文本文件并用另一个电子邮件地址替换所有实例是微不足道的,花费的时间在 10 分钟范围内。将控制台应用程序一起破解以使用您的主要语言执行相同的操作将需要数倍的时间。
您还有一个好处是,让自己接触其他语言可以拓宽您的能力,并且学习从不同语言的角度解决问题可能与语言本身一样有价值。
最后,脚本语言在扩展领域非常有用。以 LUA 为例。您可以用很少的开销将 lua 解释器固定到您的应用程序中,并且您现在可以创建丰富的脚本功能,这些功能可以向最终用户公开或快速更改和分发,而无需重新构建整个应用程序。这在许多游戏中都有很好的效果,尤其是魔兽世界。
就我个人而言,我在一个 Java 应用程序上工作,但如果没有 perl 的一些支持脚本,我就无法忍受。
我有脚本可以快速翻转我指向的数据库、运行构建脚本的脚本、抓取数据和比较内容的脚本。
当然,我可以使用 java 或 shell 脚本(我也有其中的一些)来完成所有这些,但是当您只需要快速而肮脏的东西时,谁想要编译一个类(确保类路径设置正确等)。了解脚本语言可以消除 90% 的那些无聊/重复的手动任务。
使用灵活的 OOP 系统学习一些东西,比如 Lisp 或 Perl(参见 Moose),可以让你更好地扩展和理解你对软件工程的想法。理想情况下,每种语言都有一些独特的方面(无论是 CLOS 还是其他一些技术),可以增强、扩展和发展你作为程序员的能力。
如果你只有一把锤子,那么每个问题都开始看起来像钉子。
有时,拥有一把螺丝刀或一把钳子会使复杂的问题变得微不足道。
没有人问承包商、木匠等,“如果我已经有一把锤子,为什么还要学习使用螺丝刀?”。真正优秀的承包商/木匠拥有大量工具,并且知道如何很好地使用它们。所有程序员都应该做同样的事情,学习使用新工具并很好地使用它们。
但在我们使用任何电动工具之前,让我们花点时间谈谈商店安全。请务必阅读、理解并遵守电动工具随附的所有安全规则。这样做将大大降低人身伤害的风险。记住这一点:没有比佩戴这些更重要的规则:安全眼镜——规范
我认为动态语言的主要好处可以归结为
较短的设计-代码-测试周期使动态语言成为原型设计、工具和快速而肮脏的一次性脚本的理想选择。恕我直言,后两者会对程序员的生产力产生巨大影响。令我惊讶的是,有多少人是手动艰难地完成工作,而不是为他们准备一个工具。我认为这是因为他们的工具箱中没有 Perl 之类的东西。
与几乎任何东西(其他程序或语言、数据库等)交互的能力使得重用现有工作和自动化原本需要手动完成的任务变得容易。
鉴于越来越关注在 JVM 上运行动态语言(da-vinci vm 等)以及在其上运行的动态语言(JRuby、Grrovy、Jython)的数量不断增加,我认为用例正在增加。我发现真正受益的一些场景是
原型设计 - 使用 RoR 或 Grails 构建快速原型,优势在于能够在标准应用服务器上运行它并(可能)重用现有服务等。
测试——在动态语言中正确的单元测试要快得多
性能/自动化测试脚本——其中一些工具开始允许使用选择的标准动态语言来编写测试脚本,而不是专有的脚本语言。附带的好处可能是能够重用您已经编写的一些单元测试代码。
不要告诉你的雇主你想学习 Ruby。告诉他您想了解最新的 Web 框架技术。碰巧最热门的是 Django 和 Ruby on Rails。
我发现我玩 Ruby 的次数越多,我对 C# 的理解就越好。
1)当你在这些语言之间切换时,它们每个人在他们试图解决的问题背后都有自己的结构和哲学。这将帮助您找到适合工作或问题领域的正确工具。
2)编译器(或某些语言的解释器)的作用变得更加突出。为什么 Ruby 的类型系统与 .Net/C# 系统不同?这些解决了哪些问题?您会发现自己对编译器的结构及其对语言的影响有了较低层次的理解
3) 在 Ruby 和 C# 之间切换确实帮助我更好地理解设计模式。我真的建议用 C# 之类的语言实现通用设计模式,然后再用 Ruby 之类的语言实现。它经常帮助我看穿一些编译器仪式到某种特定模式的哲学。
4) 不同的社区。C#、Java、Ruby、Python 等都有不同的社区,可以帮助你发挥能力。这是将您的手艺提升到新水平的好方法。
5) 最后但同样重要的是,因为新语言很有趣 :)
撇开哲学问题不谈,我知道我从编写快速而肮脏的 Ruby 脚本来解决 Java 无法解决的蛮力问题中获得了价值。去年我有三个独立的目录结构,它们或多或少都相同,但文件之间有很多差异(客户没有听说过版本控制,剩下的就留给你想象吧)。
用 Java 编写分析器会花费大量开销,但在 Ruby 中,我在大约 40 分钟内完成了一个分析器。
通常,动态语言(尤其是 python 和 lua)嵌入在程序中以添加更多类似插件的功能,并且因为它们是高级语言,可以轻松添加某些行为,不需要低/中级语言.
Lua 特别缺少所有低级系统调用,因为它是为易于使用而设计的,可以在程序中添加功能,而不是作为通用编程语言。
您还应该考虑学习像 Scala 这样的函数式编程语言。它具有 Ruby 的许多优点,包括简洁的语法和强大的功能(如闭包)。但它会编译成 Java 类文件并无缝集成到 Java 堆栈中,这可能会让您的雇主更容易接受。
Scala 不是动态类型的,但它的“隐式转换”特性提供了动态类型的许多,甚至可能是所有的优点,同时保留了静态类型的许多优点。
动态语言非常适合制作原型。通常出于性能原因,它们不适用于永久性解决方案或产品。但是,对于像 Python 这样的语言,它允许您在其中嵌入标准 C/C++/Java,反之亦然,您可以加速真正关键的部分,但将其与动态语言的灵活性粘合在一起。
...这样你就可以两全其美了。如果您需要根据为什么更多人应该学习这些语言来证明这一点,只需指出您可以更快地开发相同的软件以及解决方案的强大程度(因为我的经验是在动态语言中调试/修复问题,相当容易!)。
了解 grep 和 ruby 可以缩小问题范围,并验证解决方案,该问题涉及某些生产服务器上的大量 java 异常。因为我将解决方案放在 ruby 中,所以它在一个下午而不是几天内完成(设计、实现、测试、运行、错误修复、重新运行、增强、结果分析)。我本可以使用全 Java 解决方案或 C# 解决方案解决相同的问题,但很可能会花费我更长的时间。
拥有动态语言专业知识有时也会让您使用动态较少的语言找到更简单的解决方案。在 ruby、perl 或 python 中,您只需直观地使用关联数组(哈希、字典、您想使用的任何单词)来处理最小的事情,当出现问题时,您可能会想在静态类型语言中创建复杂的类层次结构不一定要求它。
另外,您可以将大多数脚本语言插入到大多数运行时中。所以它不必是非此即彼。
雇主可以看到的“真正好处”是更好的程序员,可以更快地实施解决方案;但是,您将无法提供任何确切的数字来证明费用的合理性,并且雇主很可能会让您从事现在赚钱的工作,而不是让您从事使未来变得更好的事情。
唯一一次你可以得到雇主的一毛钱培训,是当他们认为有必要时,它比雇用一个已经具备这种技能的新人便宜。
测试。
使用动态语言测试 C#/Java 应用程序通常更快更容易。您可以在交互式提示下进行探索性测试,并快速创建自动化测试脚本。
其他人已经解释了为什么学习更多的语言会让你成为更好的程序员。
至于说服你的老板这是值得的,这可能只是你公司的文化。有些地方将职业和技能进步作为一项政策(向上或退出),有些地方重视它,但将其留给员工的主动性,有些地方非常关注底线。
如果你必须向你的老板解释为什么学习一门语言是一件好事,我的建议是只在必要时继续工作,然后回家自己学习新事物。
对于下班后的工作,对于自由职业...... :) 并最终尽可能地有编程知识......
动态语言是一种不同的思考方式,有时您从动态或函数式语言中学习的实践可以转移到更静态类型的语言,但是如果您从不花时间学习不同的语言,您将永远无法从拥有知道编码时的思考方式。
不要打扰你的雇主,花 40 美元买一本书,下载一些软件,每天花一些时间阅读/做练习。很快你就会接受培训:)