用java重写Perl和shell脚本有意义吗?

2022-09-03 03:10:08

我有一堆脚本 - 一些在perl中,一些在bash中 - 用于:

  • 创建数据库(表、索引、约束、视图)
  • 解析电子表格并将数据加载到数据库中
  • 获取有关一堆文件的信息并将其加载到
    数据库中。

这些脚本与用java编写的更大的应用程序结合使用,我的经理要求我用java重写脚本。他的理由是,如果全部使用一种语言,那么使用,移植,管理,理解和支持会更容易,并且太多单独的部分是一个设计问题。

我最初的反应是,这是一个坏主意。脚本非常简洁和快速,脚本中琐碎的任务 - 例如使用正则表达式查找和替换无效值 - 在java中完成时将更加冗长,并且很可能更慢。

脚本的一个缺点是,当它们在Windows上运行时,它们需要cygwin才能运行。因此,我想给出一个反建议,我将所有的bash脚本移植到perl中,以便它们可以在没有cygwin的情况下在Windows上运行,并且我花时间组织和记录脚本。

问题在于,“直觉反应”类型的反应不足以说服我的经理。我来自Linux背景,他来自Windows,我们在方法上有一些经典的linux与Windows差异。

所以我有两个问题:

  1. 我的“肠道反应”是正确的吗?对于数据库管理、电子表格解析和文件处理任务,Java 是否更慢、更冗长、更难维护?
  2. 如果第一个问题的答案是肯定的,那么展示我的情况的最佳方式是什么?

编辑:感谢大家的见解。我想澄清一点:脚本不是隐藏在混淆脚本中的完整应用程序。在大多数情况下,它们是手动完成的任务,我通过脚本自动执行,后来随着需求的发展而进行修饰。我使用脚本语言而不是java开始的原因是因为这些任务在脚本中更容易完成。例如,一个脚本运行一堆查询,设置结果的格式,然后将其输出到文件中。您认为在java中执行此操作需要多少个LOC?


答案 1

麻烦的是,你的直觉反应可能是对的,但这并不意味着你的经理一定是错的——他可能有很好的理由希望这一切都用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中,但记录它们并培训同事,b.将bash脚本移植到perl,记录它们并培训同事)。

最后,让你的经理权衡所有的信息并做出决定,并遵守他的决定。事實上,不要只是遵守他的決定,接受他可能正確的事實。仅仅因为你比他更了解perl/bash/java,并不意味着你一定比他更了解管理团队/部门。如果他的决定是坚持perl /bash,或者移植到perl,那就高兴了!因为你不仅有自己的方式,而且你已经在经理的估计中上升了,并在此过程中学到了宝贵的一课。


答案 2

这要视情况而定。我发现Java中的文本处理可能需要8或9倍于Perl中的代码量。如果这些脚本需要紧密集成到应用程序中,那么我会同意你的经理的意见,但如果只有后台任务,我会考虑在Windows上使用ActiveState并在Perl中重写bash脚本。


推荐