为什么要学习Perl、Python、Ruby,而公司用的是C++、C#或Java?
我想知道,为什么一个C++、C#或Java的开发者会想要学习一种动态语言呢?
假设公司不会把主要的开发语言从C++、C#或Java换成动态语言,那学习动态语言有什么用呢?
在学习了几天动态语言之后,有哪些辅助任务能比你用静态语言做得更快或更好,尽管你已经用静态语言工作了好几年?
更新
在看到前几条回复后,明显有两个问题。我的主要关注点是,如何让雇主觉得学习动态语言的费用是合理的。也就是说,我在寻找一些理由,让雇主愿意为学习动态语言提供资金支持。除了员工能有更广阔的视野之外,雇主通常还希望看到一些“真实”的好处。
35 个回答
我觉得还没有人提到过这个。学习一门新语言其实很有趣!这肯定是尝试新事物的一个好理由。
让我换个角度来问你,作为一个说美式英语的人,学另一种语言有什么用呢?
我们说的语言(还有我们编程用的语言)会影响我们的思维方式。这种影响可以很根本,比如说c++、javascript和lisp之间的区别;也可以是在具体实现上,比如说用ruby的某个结构让你在“真实工作”中突然灵光一现,找到了解决方案。
说到你的真实工作,如果市场不景气,你的雇主决定裁员,你觉得你和一个会用十种语言写软件的人比起来,谁更有竞争力呢?在其他条件相同的情况下,我想答案是显而易见的。
最后,你是因为热爱编程才选择这个职业的,对吧?
很多时候,我们会遇到一些临时的小任务,这些任务并不是我们正在开发的主要软件的一部分。有时候这些任务是一次性的,比如比较一个文件和数据库的差异。用Perl、Ruby或Python来处理文本要比用Java或C#简单得多(部分原因是正则表达式的使用更方便)。用Perl、Ruby或Python(甚至可能是vbscript 呃)来解析文本文件并将其加载到数据库中,通常会比写一个Java或C#程序或者手动处理要快得多。
另外,由于大多数动态语言在解析文本方面非常简单,它们非常适合用来生成代码。虽然你的最终项目必须用C#/Java/Transact SQL来完成,但与其反复复制粘贴100次、找错误再复制粘贴100次,通常(但并不总是)使用代码生成器会更简单。
最近在工作中,我们需要将一个会计系统的数据导入到我们的会计系统中。虽然旧系统有一个导入格式,但格式完全不同(是固定宽度的,虽然有些内容需要匹配)。这个任务并不是要创建一个程序来重复迁移数据,而是把数据放进我们的系统,并在未来维护它。因此,尽管我们主要使用C#和SQL Server,我还是用Python将数据转换成可以被我们的应用程序导入的格式。最终,使用Python并不重要,重要的是数据已经在系统中。我老板对此非常满意。
我经常看到动态语言被用来做测试。用Python、Perl或Ruby编写一个程序来连接到网络服务并发送一些数据,比用Java编写相应的程序要简单得多。你还可以用Python来调用命令行程序,轻松生成大量有效的测试数据等等。
动态语言还有一个很大的优势就是代码生成。创建C#/C++/Java代码。以下是一些例子:
我经常看到的第一个代码生成任务是人们使用动态语言来维护系统中的常量。与其手动编写一堆枚举,不如用动态语言轻松解析一个文本文件,然后生成包含枚举的Java/C#代码。
SQL是另一个完全不同的领域,但通常通过复制粘贴100次来获得更好的性能,比尝试做一个函数要好(因为执行计划的缓存或将复杂逻辑放在函数中导致你逐行处理而不是批量处理)。实际上,利用表定义自动创建某些存储过程是非常有用的。
最好能让大家都支持使用代码生成器。但即使没有,花时间去复制粘贴和创建一个Perl/Python/Ruby脚本来生成代码,哪个更有趣呢?如果手动编码需要几个小时,但创建一个代码生成器所需的时间更少,那么即使只用一次,你也节省了时间和金钱。如果创建代码生成器所需的时间超过了手动编码一次的时间,但你知道需要多次更新代码,那么这样做可能仍然是有意义的。如果手动编码需要2小时,创建生成器需要4小时,但你知道还要手动编码相同的工作5或6次,那么显然创建生成器更好。
还有一些事情用动态语言比用Java/C#/C/C++更简单。特别是正则表达式。如果你开始在Perl中使用正则表达式并意识到它们的价值,你可能会突然开始使用Java的正则表达式库。如果你已经使用过,那么可能会有其他的东西。
最后,我给你一个例子,这个任务用动态语言会非常合适。我的同事需要把一个文件夹里的文件烧录到不同客户的光盘上。虽然客户不多,但文件很多,而且需要查看文件内容。他是手动完成这个任务的……如果用Java/C#程序来做会节省时间,但由于是一次性任务,加上开发的开销,其实不值得。然而,用Perl/Python/Ruby快速搞定可能就值得了。他花了几个小时来完成这个任务,而用Python脚本检查每个文件、匹配客户并将文件移动到合适的位置,可能只需要不到一个小时……这又不是标准工作,但这个任务出现了,是一次性的。自己做、花更多时间让Java/C#完成这个任务,还是花更少的时间用Python/Perl/Ruby来做,哪个更好呢?如果你用C或C++,这个问题就更明显了,因为编程时需要考虑更多的因素(指针、没有数组边界检查等)。