我有一堆脚本 - 一些在perl中,一些在bash中 - 用于:
创建数据库(表,索引,约束,视图)
解析电子表格并将数据加载到数据库中
获取有关一堆文件的信息并将其加载到
数据库中.
这些脚本与一个用java编写的更大的应用程序一起使用,我的经理要求我用java重写脚本.他的理由是,如果全部使用一种语言,则更容易使用,移植,管理,理解和支持,并且太多单独的部分是设计问题.
我最初的反应是,这是一个坏主意.脚本非常简洁快速,脚本中的任务很简单 - 例如使用正则表达式来查找和替换无效值 - 在java中完成时会更加冗长和极慢.
脚本的一个缺点是,当它们在Windows上运行时,它们需要cygwin才能运行.因此,我想提出一个反建议,即将所有bash脚本移植到perl,以便它们可以在没有cygwin的情况下在Windows上运行,并且我花时间组织和记录脚本.
问题是,"直觉反应"类型的反应不足以说服我的经理.我来自Linux背景,他来自Windows,我们在方法上有一些经典的linux与windows的差异.
所以我有两个问题:
我的"直觉反应"是否正确?对于数据库管理,电子表格解析和文件处理任务,Java是否更慢,更冗长,更难维护?
如果第一个问题的答案是肯定的,那么提出我案件的最佳方式是什么?
编辑:感谢大家的见解.我想澄清一下:脚本不是隐藏在混淆脚本中的完整应用程序.在大多数情况下,它们是手动完成的任务,我通过脚本自动完成,随后根据需求进行修饰.我使用的脚本语言,而不是Java的下手的原因是因为这些任务是如此容易得多脚本来执行.例如,一个脚本运行一堆查询,格式化结果,并将它们输出到文件.您认为在java中需要多少LOC才能做到这一点?
麻烦的是,你的直觉反应可能是对的,但这并不意味着你的经理一定是错的 - 他可能有很好的理由想要在java中完成所有这些.尤其是,如果你在公共汽车下,找到一个知道java,perl和bash的替代者要比找到知道java的人要困难得多.这就是"他们只能在安装了cygwin的PC上运行"的问题.而且很可能,性能并不像您认为的那么大.
话虽如此,最好的办法是花一点时间来估算将它们全部移植到java所需的时间,这样他就可以做出明智的决定.当你在它的时候,估计将bash脚本移植到perl 并记录它们需要多长时间.然后让他决定.记住 - 他没有像你那样花大部分时间编码,所以他做出一些决定是公平的.
如果他决定继续使用java选项,尽可能移植其中一个脚本,然后使用这两个版本报告,如果你对perl/bash脚本的简洁是正确的,你应该能够从并排检查两个版本获得一些里程.
编辑: MCS,说实话,听起来好像这些脚本在perl和/或bash中更好地实现,而不是java,但这不是真正重点 - 关键是你如何向你的经理证明这一点.如果你解决这个问题,你就要解决"直觉反应"问题(顺便说一下,这里有一个提示 - 开始将你的直觉反应称为"基于经验的判断")和"提出我案例的最佳方式"问题.
现在,你必须要意识到的第一件事是你的经理(可能)不会走这条路只是为了让你生气.他几乎肯定对这些剧本有真正的担忧.鉴于他们可能是真正关心的问题(如果他们不这样做也没有意义 - 如果他出于某种政治原因决定做这件事,那么你不会改变主意,无论如何什么,所以只需继续使用它并将其添加到您的简历中,然后您需要向他提供解决他的问题的信息,如果您要去任何地方.如果你能做到这一点,那么你已经超过了自己的方式的一半.
那么,他的担忧是什么?根据你的帖子,以及我的判断和经验:-)我会说他们是:
可维护性
就是这样,只是可维护性
我也猜测他的担忧不是:
性能
当然,我最后一个可能错了; 在我工作的最后一个地方,我们遇到了影响业务提供客户支持能力的复制的SQL Server性能问题,因此性能是一个问题,所以我们解决了这个问题.但总的来说,性能并不像程序员所想的那么重要.如果他实际上告诉你性能是一个问题,那么就把它考虑在内.但是如果他没有提到它,那就别忘了 - 可能只有你认为这些脚本在perl/bash中运行得比他们可能在java很重要.
所以,可维护性.这归结为回答"如果MCS属于公共汽车,谁将维护这些脚本?"的问题.补充问题"会导致我(即你的经理)出现问题吗?" (除此之外:不要挂在整个公共汽车的东西上."在公共汽车下面"是一种有用的外交速记,可以应对各种各样的风险,例如"如果有人用工资引诱他离开我的公司会怎么样?匹配?","如果他决定移民到百慕大会怎么样?","如果我要解雇他会怎么样?","如果我想宣传他会怎样?",当然,"如果发生了什么?只是因为一些未知的,可能与公交有关的原因,他有一天会停止工作吗?")
请记住,考虑并减轻这些风险是您的经理的职责.
那么,该怎么做?
首先,演示这些脚本实际上是如何可维护的.或者至少它们的可维护性如何.记录它们(在适当的文件中,而不是在代码中).培训一位同事来维护他们(挑选一个想要获得/提高他们的perl和bash技能的人,以及你的经理信任的人).重构它们以使它们更具可读性(如果需要,牺牲性能和巧妙的脚本技巧).如果要继续使用bash,请创建一个文档,提供有关安装cygwin和bash的逐步说明.无论如何,请记录安装perl和运行脚本的过程.
其次,选择一个脚本并将其移植到java.随意选择最能说明perl/bash优于java的脚本的脚本,但是尽可能地将其移植到最佳位置.使用java.util.regex做你在perl中做的同样聪明的事情.将其记录为记录其他内部Java实用程序的标准.如果性能实际上是一个因素,请测量其相对于perl/bash脚本的性能.
第三,通过这个练习,对自己的相对可维护性说实话.问你训练他的想法的人.如果您仍然认为perl/bash脚本或多或少与java版本一样可维护,那么估计将剩余脚本尽可能准确地移植到java所涉及的工作(您现在可以非常准确地完成此操作,因为你实际上已经移植了一个).然后将比较脚本,文档和估算(以及性能数据,如果适用)提供给您的经理并与他一起完成.提出你的反建议(a.将它们保留在perl和bash中,但记录它们并培训同事,并将bash脚本移植到perl,记录它们并培训同事).
最后,让你的经理权衡所有信息并决定并遵守他的决定.事实上,不要只是遵守他的决定,接受他可能是正确的事实.仅仅因为你对perl/bash/java的了解比他更多,并不意味着你必须比他更了解管理团队/部门.如果他的决定是坚持使用perl/bash,或者移植到perl,请高兴!因为你不仅有自己的方式,所以你已经按照经理的估计上升,并在此过程中学到了宝贵的一课.
这取决于.我发现Java中的文本处理可能比Perl中的代码量多8到9倍.如果需要将这些脚本紧密集成到应用程序中,那么我会同意您的经理,但如果只有后台任务,我会考虑在Windows上使用ActiveState并重写Perl中的bash脚本.
就个人而言,我发现数据库,文件管理更难用于java,但一旦编写它们可能更容易维护.
但是这值得吗?如果它有效,请不要"修复"它.
就个人而言,我并不在意 - 如果我有工作要做,我会与经理辩论利弊,如果她坚持,我会这样做并获得报酬.通常她会理解她的感官,并给我更重要的工作要做.
我认为你的第一反应是正确的.一个论点是如果它有效,就不要'修复'它.另一个论点是,一个开发人员可以独立于使用的语言编写几乎相同数量的SLOC.如果您知道Java是如何详细的,那么听起来很奇怪,但想想您必须如何谨慎地设计Java代码以使用perl功能作为闭包,动态生成的代码,即时regexp等获得相同的结果.而现在当Java与Perl SLOC的比例相同时,结果大于10:1.您必须阅读,理解和维护的每一行代码.Java更快.是.对于某些人认为数字运算和某种文本处理,Java更快.Perl对于正则表达式和其他一些文本处理来说速度更快,而且远远高于Java.如果通过SLOC进行比较,则Perl的可维护性更差,但如果按功能进行比较,则与Java相同或更好.
我当然同意,如果你使用大多数人都知道的一套工具,对每个人来说都会更容易.但是,由于您同时拥有Java和Perl代码,我假设至少有一些人都知道这两个代码,因此老实说,我没有看到同时拥有Java和Perl代码的大问题.
如果Perl脚本按预期工作并且可以维护,我就不会花时间用Java重写它们.Perl中的脚本比在Java imo中容易得多,所以除非你真的需要转换,否则我不明白这一点.我宁愿把时间花在真正为你正在做的事情增加价值的事情上.
你说脚本需要运行cygwin.我在Unix/Linux和Windows上都做了很多Perl,除非你做了很多特定的Unix工作,否则我的经验是脚本可以很容易地转换成在像ActiveState这样的Windows Perl下运行.也许这可能是你的选择.
根据我自己的经验(包括在单个系统中混合使用Java和Perl),我建议如下:
1)"Java较慢"不一定是真的,但也不相关(即使是真的),除非额外的运行时间干扰某些时间关键的工作流程.
2)长期可维护性是一个合法的问题.具有例如不必以两种语言维护的单个DAO层可以长期回报.您需要修改多少Java代码和当前脚本(两次)来覆盖数据库中的重构?
3)如果你真的喜欢轻量级表示法,但是你的经理想要Java,那么你是否可以在Java库上进行妥协(从前一点开始),结合在JVM上运行的可互操作的类似脚本的语言之一并且可以共享使用您为例如数据库访问编写的标准库?我正在考虑JRuby-Groovy-Scala-Jython谱中的某些东西.
总的来说,我理解您的经理希望最小化和标准化您环境中使用的不同语言/平台.
但是,有是针对脚本语言比Java等语言更适合某些任务.如果您觉得脚本被要求重写,可能而不是建议使用Perl作为此特定任务的一次性语言,您可以建议采用Perl(或者如果您认为自己采用其他脚本语言)获得更好的买入作为脚本任务的"支持"语言.
也就是说,根据你所说的"与...结合使用"的意思(也就是说,不同位的紧密耦合程度),可能只是这些任务更有意义,因为Java库可以被调用.其余的申请.
Perl
你真的认为Java
的Regexp
更慢.Perl
的Regexp
变体经历了很多变化,以确保它尽可能快.
转换BASH
为Perl
应该很容易实现,Perl
可以很容易地做你正在做的事情BASH
.
通过摆脱BASH
文件,你也可以摆脱Cygwin.