Имеет ли смысл переписывать Perl и shell-скрипты в Java? - PullRequest
16 голосов
/ 27 января 2009

У меня есть несколько скриптов - некоторые на Perl, а некоторые на Bash - которые используются для:

  • Создание базы данных (таблицы, индексы, ограничения, взгляды)
  • Анализ электронных таблиц и загрузка данных в базу данных
  • Получение информации о куче файлов и загрузка их в
    базы данных.

Эти сценарии используются вместе с гораздо более крупным приложением, написанным на Java, и мой менеджер попросил меня переписать сценарии на Java. Его аргументация заключается в том, что с ним проще работать, портировать, управлять, понимать и поддерживать, если все это на одном языке, а слишком большое количество отдельных частей является проблемой проектирования.

Моя первоначальная реакция заключается в том, что это плохая идея. Сценарии очень лаконичны и быстры, а задачи, тривиальные в сценариях, такие как использование регулярных выражений для поиска и замены недопустимых значений, будут намного более многословными и, скорее всего, будут медленнее, когда выполняются в Java.

Единственный недостаток сценариев заключается в том, что при запуске в окнах для запуска требуется Cygwin. Поэтому я хотел бы дать встречное предложение, чтобы я переносил все сценарии bash на perl, чтобы они могли работать на окнах без Cygwin, и чтобы я тратил время на организацию и документирование сценариев.

Проблема в том, что ответа типа «внутренняя реакция» будет недостаточно, чтобы убедить моего менеджера. Я пришел из Linux, он из Windows, и у нас есть некоторые классические различия между Linux и Windows в подходах.

Итак, у меня два вопроса:

  1. Правильна ли моя "реакция кишечника"? Является ли Java медленнее, более подробным и сложным в обслуживании для управления базами данных, анализа электронных таблиц и задач обработки файлов?
  2. Если ответ на первый вопрос положительный, как лучше представить мой случай?

РЕДАКТИРОВАТЬ: Спасибо всем за идеи. Я хотел бы сделать одно уточнение: сценарии не являются полноценными приложениями, скрытыми в запутанных сценариях. По большей части это задачи, которые были выполнены вручную, которые я автоматизировал с помощью сценариев, а затем украсил по мере развития требований. И причина, по которой я начал использовать язык сценариев вместо java, заключается в том, что эти задачи были , поэтому намного проще выполнять в сценариях. Например, один скрипт запускает несколько запросов, форматирует результаты и выводит их в файл. Как вы думаете, сколько LOC потребуется, чтобы сделать это в Java?

Ответы [ 20 ]

27 голосов
/ 27 января 2009

Проблема в том, что ваша реакция на кишечник может быть правильной, но это не значит, что ваш менеджер обязательно ошибается - у него, вероятно, есть очень веские причины для того, чтобы все это делать в Java. Не в последнюю очередь, если вы попадете под автобус, найти замену, который знает java, perl и bash, будет намного сложнее, чем найти кого-то, кто знает java. И это оставляет в стороне проблему «их можно запускать только на ПК с установленным Cygwin». И, по всей вероятности, производительность не так важна, как вы думаете.

Сказав это, вам лучше всего потратить немного времени на оценку времени, которое потребуется для переноса их всех на 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, чтобы делать те же самые умные вещи, которые вы делаете в ваш перл. Документируйте это в соответствии со стандартом, что документированы другие внутренние утилиты Java. Если производительность действительно является фактором, измерьте его производительность относительно сценария perl / bash.

В-третьих, пройдя это упражнение, будьте честны с собой относительно их относительной ремонтопригодности. Спросите парня, которого вы обучили, что он думает. Если вы все еще думаете, что сценарии perl / bash более или менее удобны в обслуживании, как и версии Java, оцените работу, связанную с переносом оставшихся сценариев в Java, как можно точнее (вы сможете сделать это довольно точно сейчас, потому что вы на самом деле перенесли один). Затем отнесите сравнительные сценарии, документацию и сметы (и, если необходимо, показатели эффективности) своему менеджеру и просмотрите их вместе с ним. Представьте ваши встречные предложения (а. Оставьте их в perl и bash, но задокументируйте их и обучите коллегу, и б. Перенесите сценарии bash в perl, задокументируйте их и обучите коллегу).

Наконец, пусть ваш менеджер взвесит всю информацию, примет решение и будет придерживаться его решения. На самом деле, не просто соблюдать его решение, принять тот факт, что он может быть прав. То, что вы знаете больше о perl / bash / java, чем о нем, не означает, что вы обязательно знаете больше об управлении командой / отделом, чем он. И если его решение - придерживаться perl / bash или портировать на perl, радуйтесь! Поскольку у вас есть не только свой собственный путь, вы повысили оценку своего менеджера и получили ценный урок на этом пути.

14 голосов
/ 27 января 2009

Это зависит. Я обнаружил, что обработка текста в Java может занимать в 8 или 9 раз больше кода, чем в Perl. Если эти сценарии необходимо тесно интегрировать в приложение, я бы согласился с вашим менеджером, но если бы существовали только фоновые задачи, я бы рассмотрел использование ActiveState для окон и переписал сценарии bash на Perl.

7 голосов
/ 27 января 2009

Я думаю, ваша первая реакция правильная. Один аргумент Если это работает, не «исправляйте» это. Другой аргумент в том, что один разработчик может написать почти одинаковое количество SLOC независимо от используемого языка. Это звучит странно, если вы знаете, как обстоят дела с Java, но подумайте о том, как тщательно вы должны разработать свой Java-код, чтобы получить тот же результат, используя такие возможности perl, как замыкания, динамически генерируемый код, мгновенные регулярные выражения и другие. И теперь, когда соотношение Java к Perl SLOC к тому же результату превышает 10: 1. Каждую строку кода вы должны прочитать, понять и поддерживать. Java быстрее. Да. Некоторые считают, что Java быстрее, чем сокращение чисел и какая-то обработка текста. Perl быстрее для регулярных выражений и некоторой другой обработки текста и гораздо более производительный, чем Java в целом. Perl хуже в обслуживании, если сравнивать по SLOC, но такой же или лучше, чем Java, если сравнивать по функциональности. Если Perl написан с использованием передового опыта и придерживается стиля кодирования, то он превосходит Java по удобству сопровождения, особенно если используется для коротких сценариев.

7 голосов
/ 27 января 2009

Лично я считаю, что db, управление файлами сложнее делать с java, но, возможно, будет проще поддерживать их после написания.

Но стоит ли это того? Если это работает, не «исправляйте» это.

Лично мне все равно - если я получаю работу, я обсуждаю плюсы и минусы с моим менеджером, и если она настаивает, я делаю это и мне платят. Обычно она приходит в себя и дает мне более важную работу.

6 голосов
/ 27 января 2009

Я, безусловно, согласен с тем, что всем будет легче, если вы будете работать с набором инструментов, который большинство из вас знает. Однако, поскольку у вас есть и Java, и Perl-код, я предполагаю, что, по крайней мере, некоторые из вас знают оба, и поэтому я, честно говоря, не вижу большой проблемы с наличием как Java, так и Perl-кода.

Если сценарии Perl работают должным образом и их можно поддерживать, я бы не стал тратить время на их переписывание на Java. Сценарии в Perl намного проще, чем в Java imo, поэтому, если вам действительно не нужно конвертировать, я не вижу в этом смысла. Я бы предпочел потратить часы на то, что на самом деле повышает ценность того, что вы делаете.

Вы говорите, что для запуска сценариев нужен Cygwin. Я много работал на Perl как для Unix / Linux, так и для Windows, и, если вы не делаете много специфических вещей для Unix, мой опыт заключается в том, что скрипты могут быть легко преобразованы для запуска под Windows Perl, например ActiveState. Может быть, это может быть вариантом в вашем случае.

5 голосов
/ 28 января 2009

Конвертировать во все Perl

Ваше право думать, что Java Regexp медленнее. Perl вариант Regexp претерпел множество изменений, чтобы обеспечить максимальную скорость.

Преобразование из BASH в Perl должно быть легко осуществимым, Perl может легко сделать то, что вы делаете в BASH.

Избавившись от файлов BASH, вы также можете избавиться от Cygwin.

5 голосов
/ 27 января 2009

Исходя из собственного опыта (который включает в себя смешение Java и Perl в одной системе), я бы предложил следующее:

1) «Java медленнее» не обязательно является верным, но также не имеет значения (даже если оно истинно), если дополнительное время выполнения не мешает некоторому срочному рабочему процессу.

2) Долгосрочная ремонтопригодность является законной проблемой. Имея, например, один слой DAO, который не нужно поддерживать на двух языках, может окупиться в долгосрочной перспективе. Какую часть вашего Java-кода и текущего сценария нужно было бы изменить (дважды), чтобы покрыть рефакторинг в базе данных?

3) Если вы действительно предпочитаете более легкие нотации, но ваш менеджер хочет Java, не могли бы вы пойти на компромисс с библиотеками Java (из предыдущего пункта) в сочетании с одним из совместимых скриптовых языков, который работает на JVM и может поделиться использованием стандартных библиотек, которые вы пишете, например, для доступ к базе данных? Я думаю о чем-то из спектра JRuby-Groovy-Scala-Jython.

5 голосов
/ 27 января 2009

В целом, я понимаю желание вашего менеджера свести к минимуму и стандартизировать различные языки / платформы, используемые в вашей среде.

Однако, - это определенные задачи, для которых язык сценариев гораздо лучше подходит, чем язык, подобный Java. Если вы чувствуете, что так обстоит дело со сценариями, которые вас просят переписать, возможно, вместо того, чтобы предлагать использовать Perl в качестве разового языка для этой конкретной задачи, вы можете предложить принять Perl (или другой язык сценариев, если вы считаете, что получить лучший бай-ин) как «поддерживаемый» язык для задач сценариев.

Тем не менее, в зависимости от того, что вы подразумеваете под словом «используется в сочетании с» (то есть насколько тесно связаны различные биты), может быть просто так, что эти задачи будут иметь больше смысла в виде библиотек Java для вызывается остальной частью приложения.

4 голосов
/ 27 января 2009

Должны ли они быть переписаны? Это зависит от. Самый сильный аргумент, который выдвигает ваш начальник, заключается в том, что остальная часть приложения написана на Java, и похоже, что именно так и движется организация. Сокращение количества различных языков, которые должна поддерживать организация, на самом деле является довольно разумным долгосрочным решением. Я знаю, я знаю, правильный инструмент для правильной работы, но с точки зрения затрат вполне возможно, что организация будет стоить больше денег, чтобы нанять человека, который знает и PERL, и JAVA, а не только Java. Даже если сценарии прекрасны, их все равно нужно поддерживать, а это значит, что он должен держать в штате хотя бы одного человека, который знает, как это сделать. Это еще одна вещь, о которой он (и организация) должны беспокоиться в конце дня.

3 голосов
/ 27 января 2009

Я понимаю, что вы говорите, но краткость и лаконичность не всегда легко обслуживаемы - иногда подробны и понятны.

Кроме того, после того, как все это на Java, у вас будет больше шансов почувствовать UI / Control Console, что может быть улучшением.

Если вам действительно нравится чувство языка сценариев, возможно, вы могли бы противопоставить Groovy. Его синтаксис очень прост для программистов на Java и он на 100% совместим с Java (включая расширение классов Java в Groovy и т. это подразумевает.

Кстати, Java прекрасно обрабатывает регулярные выражения.

Кстати, если вы написали все эти сценарии и знакомы только с ними, вы можете начать искать новую работу. Извините, что говорю это, но просьба сделать ваши «Особые маленькие уловки» документированными и обслуживаемыми - это часто то, о чем они не задумываются до того, как увольняют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...