Заслуживают ли динамические языки напечатанных языков всю критику? [закрыто

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/16

Вопрос

Я прочитал несколько статей в Интернете о выборе языка программирования на предприятии. В последнее время было популярно много динамичных языков, то есть Ruby, Python, PHP и Erlang. Но многие предприятия по -прежнему остаются со статическими напечатанными языками, такими как C, C ++, C# и Java.

И да, одно из преимуществ статических напечатанных языков заключается в том, что ошибки программирования пойманы ранее, во время компиляции, а не во время выполнения. Но есть также преимущества с динамическими типичными языками. (Подробнее о Википедии)

Основная причина, по которой предприятия не начинают использовать такие языки, как Erlang, Ruby и Python, кажется, заключается в том, что они динамические напечатаны. Это также, похоже, является главной причиной, по которой люди в Stackoverflow решают против Эрлана. Видеть Почему вы решили «против» Эрланга.

Тем не менее, кажется, что на предприятиях существует сильная критика в отношении динамической печати, но на самом деле я не понимаю, почему это что сильный.

Действительно, почему на предприятиях столько критики против динамического набора печати? Действительно ли это влияет на стоимость проектов, или что? Но, может быть, я ошибаюсь.

Это было полезно?

Решение

Да, я считаю, что они это делают.

Есть несколько причин, которые необходимо учитывать при выборе языка для нового проекта:

  • Скорость времени выполнения. По сравнению с C/C ++/Fortran, Perl и Python настолько медленные, что это смешно.
  • Скорость инициализации. По сравнению с вышеупомянутыми быстрыми языками, Ява падает и плачет, когда JVM продолжает загрузку и загрузку, и ...while(1)....
  • Способность прототипа. Исчерпывающий прохождение и выполнение работы/определения, необходимых для C ++ или Java, увеличивает LOC, которая является Только известная метрика, которая надежно коррелирует с Bugcounts. Это также занимает много времени. Это также требует немного больше размышлений о типах и соединениях.
  • Внутренняя скрипка. Динамически возиться с внутренними внутренними Самомодирующий код. Анкет (Python, Lisp, Perl)
  • Правильность проверки. Компилятор может обеспечить быстрый перерыв полукорректности вашего кода в C ++, и это может быть В самом деле отлично.
  • Статический анализ детали. C и Java имеют довольно хороший статический анализ. Perl не полностью статически анализируется в теоретический Уровень (возможно, Python тоже). Я достаточно уверен, что ЛИСП тоже не так.
  • Странные платформы принимают только C, в целом.
  • Цепочка поддержки. Если у вас может быть контракт, который вы будут Посмотрите на свои ошибки и работали, это огромный.

Если вы можете предположить, что у организации, с которой вы работаете, есть принцип «продвижения вперед» (для этого есть бухгалтерский термин) и не будет Просто случайно решайте не работать над программным обеспечением, тогда у вас есть гораздо лучший случай для использования программного обеспечения. Так как нет крупного бизнеса продажа (Следует за ним нести ответственность за его поддержание) Python/perl/$ dynamic_language, он значительно снижает риск.

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

Конечно, я не говорю о мире WebApp/Startup, который имеет тенденцию играть по правилам высокого риска/высокого вознаграждения и быть очень Открыт для пребывания на пенецении технологий.

Другие советы

Вы даете слишком много технических кредитов, принимающих решения предприятия. Есть старая поговорка: «Никто не был уволен за покупку IBM». Если вы идете по другому маршруту, и все станет скалистым (они всегда делают), никто не хочет рисковать, когда его обвиняют. Придерживайтесь стандартов и обвините кого -то еще.

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

И давайте не будем забывать о строках кода Buggillion, написанные в VBA!

Причина, по которой предприятия используют C, C ++, C#, а Java не потому, что они статически напечатаны (по крайней мере, не напрямую). Уверяю вас, лица, принимающие решения, не делают такого рода выбора на основе объективного сравнения типовых систем.

Предприятия делать заботиться о:

  • Долгосрочные затраты на техническое обслуживание: Можете ли вы разумно ожидать, что все будет хорошо работать за 10 лет? На самом деле это хорошо, если эволюция языка консервативна и обратно совместима (как с Java). Статическое набор обращений здесь полезно, потому что он улавливает основные ошибки в сфере компиляции, прежде чем они попадут в ваши производственные системы .....
  • Доступность таланта - Сможете ли вы найти разработчиков, чтобы сохранить свою блестящую новую систему? Что, если исходный разработчик уйдет, все остальные поймут код? Это уделяет высокое препятствие для введения любого «нового» языка (особенно, если он также создает новые требования для развертывания, систем сборки, операционной поддержки и т. Д.). Это дает огромные преимущества для языков, которые широко используются (C, C ++, C# и Java)
  • Затраты на интеграцию: Легко ли подключить / интегрировать с другими технологиями, которые у вас уже есть или, вероятно, приобрести? Если у вас уже есть стопка устаревших систем J2EE, вам нужно интегрироваться с ними. Новое решение Java EE, вероятно, будет гораздо более практичным для этого, чем например Python.
  • Прогнозирование / Низкий риск: Платформа / язык доказана, и могу ли я быть уверен, что она будет работать? Это обычно более Важно, чем простая производительность. Менеджеру гораздо проще убедить своего босса дать ему большой бюджет для рабочей силы построить новую систему, чем для него, чтобы вернуться позже и сказать, что она не сработала .....
  • Предприятие / поддержка предприятия - Привержены ли крупные международные организации поддержать язык и платформу? Будут ли они подписать контракт, чтобы поддержать меня, чтобы у меня был кто -то, на кого можно было бы позвонить, если что -то пойдет не так?
  • Нейтралитет поставщика / независимость платформы - Собираюсь ли я заблокировать одного поставщика? Или у меня есть широкий спектр будущих вариантов поставщиков / пути перехода? Вы не хотите застрять в архитектурном тупике, неспособном добиться прогресса, пока ваши конкуренты едят ваш обед. Если вы выполняете свою работу должным образом в качестве корпоративного архитектора, вам нужно думать, по крайней мере, на 5-10 лет вперед.

Лично я думаю, что если вы хотите использовать динамические языки на предприятии, то ваш лучший шанс на безусловно-использовать что-то, что подчиняется в существующей экосистеме предприятия. Наиболее заметными являются новые динамические языки JVM: например, Jruby, Groovy, Clojure. Что касается ИТ -управления, это «безопасный» динамический выбор языка, потому что они работают внутри и хорошо играют с остальной частью экосистемы Java Enterprise.

Основная причина, по которой предприятия не начинают использовать такие языки, как Erlang, Ruby и Python, кажется, заключается в том, что они динамические напечатаны.

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

К сожалению, существует практически нет языка статически, который близок, так же популярный, как и названия крупных предприятий. Почему среды программирования с открытым исходным кодом/свободным программным обеспечением почти всегда динамически напечатаны? Это может указывать на то, что язык статически не так легко сделать, и что динамическая набор печати-это «взлом ленивого человека». Если это так, то предприятия, которые решают против динамических языков, на самом деле могут иметь смысл.

  • Динамически напечатанные языки, как правило, медленнее, чем их статически напечатанные кузены.
  • Ошибки труднее поймать, и отладки могут быть труднее отладки
  • Компилятор/интерпретатор имеет тенденцию быть намного менее привередливым в отношении того, что вы можете и не можете сделать. т.е. вы в значительной степени только ошибки синтаксиса на стадии компиляции
  • Если вы не очень осторожны с дизайном динамически напечатанного языка, вы получите JavaScript, который а Язык кодовых смель

РЕДАКТИРОВАТЬ: Я должен упомянуть, что мой основной язык программирования на данный момент - Python, который динамически напечатан. Лично мне нравится свобода, которая приходит с необходимостью предварительной декларной переменной, но иногда это бы Приятно указать (например), какие параметры требуют функции, чтобы улавливать ошибки на раннем этапе, а не поздно.

Динамически напечатанные языки воспринимаются (некоторыми программистами/боссами) для создания кода, который также не работает. Тот факт, что динамически напечатанная программа компилирует, говорит вам очень мало о ее правильности. Тот факт, что статически напечатанный языковой компилирование говорит вам намного больше. (С другой стороны, между компиляциями все еще есть долгий путь, и это правильно, так что это может быть менее значимым, то кажется, что это кажется)

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

Динамически напечатанные языки медленнее, чем статически напечатанные языки. (Но мы посмотрим, насколько хорошо работает над JIT, это меняет)

Примечание: это в основном субъективно и основано на моем опыте и впечатлениях.

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

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

Динамически напечатанные языки, с другой стороны, очень прагматичны. Конверсии типа часто происходят неявно, функции могут даже играть, если вы предоставляете неправильный тип ввода, если он ведет себя достаточно схож. На таких языках, как Python, даже уровни доступа будут основываться на контракте, а не на технических ограничениях (т.е. это только private Потому что вам сказали не использовать его, и у него есть забавное имя).

Многие программисты предпочитают динамические языки, потому что они (возможно) позволяют быстро быстро прототипировать. Код часто оказывается короче (хотя бы из -за отсутствия объявлений типа), и если вы хотите нарушить надлежащий протокол, потому что вам нужно быстрое и грязное решение или хотите что -то проверить, это легко.

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

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

Другая причина, по которой корпорации предприятия не используют динамически напечатанные языки, - это устаревший кодекс. Как бы глупо это ни казалось нам для ботаников, крупные корпорации часто будут придерживаться решения, которые работают, даже если они хорошо прошли свою жизнь. Вот почему так много крупных компаний обеспечивают соблюдение Internet Explorer 6 и так медленно обновлять свои OSES. Вот почему они часто пишут новый код на «старых» языках (например, древние версии Java): гораздо проще добавить несколько строк кода в неожиданное программное обеспечение, чем получить разрешение на полное переписывание в новом язык.

TL; DR: Статические языки больше похожи на бюрократию, поэтому предпринимаемые менеджеры нравятся им лучше.

Нет, я не думаю, что динамически напечатанные языки заслуживают всей критики. (Или, если вы предпочитаете, они заслуживают столько же критики, сколько статически напечатанные языки.)

По моему опыту (и я не пытаюсь пытаться обобщить это утверждение), программисты, которые критикуют динамические языки, их не использовали. Разговор обычно идет «Но со статическим набором компилятора улавливает так много ошибок!» И я говорю: «Ну, это просто не проблема, по моему опыту». (Обычно другой программист из Java, Delphi или аналогичного фона; я не знаю никаких программистов Haskell или ML.)

Единственное, что действительно мешает мне, это когда кто -то утверждает, что техника Фу не может возможно быть сделанным (или может быть очень трудно сделать) на динамически напечатанном языке ... когда эта техника была изобретена на динамически напечатанном языке и для. Иды? Болтовня. Автоматический рефакторинг? Болтовня. Callers-of/uelliors-of? Болтовня.

Предприятия просто недостаточно быстро применяют новые языки и инструменты, и для этого есть веские причины. Но когда один из основных инструментов, таких как C#, реализует некоторые из этих функций, они попадут в основные предприятия ....

Лицензировано под: CC-BY-SA с атрибуция
scroll top