Как отсутствие статической типизации в Python влияет на ремонтопригодность и расширяемость в более крупных проектах?

StackOverflow https://stackoverflow.com/questions/3671827

Вопрос

После прочтения этот очень информативный (хотя и несколько аргументированный) вопрос Я хотел бы узнать ваш опыт программирования крупных проектов на Python.Становятся ли вещи неуправляемыми по мере того, как проект становится крупнее?Эта проблема - одна из причин, по которой я привязан к Java.Поэтому я был бы особенно заинтересован в информированный сравнение ремонтопригодности и расширяемости Java и Python для крупных проектов.

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

Решение

Я работаю над крупномасштабным коммерческим продуктом, сделанным в Python. Я даю очень грубую оценку 5000 файлов х 500 строк каждый. Это около 2,5 миллионов линий Python. Ум на то, что сложность этого проекта, вероятно, эквивалентна 10 миллионным линиям кода на других языках. Я не слышал от одного инженера / архитектуры / менеджера, который жалуется на код Python, будучи неизвестным. От того, что я видел из нашего Bug Tracker, я не вижу системной проблемы, которую можно было избежать по проверке статического типа. На самом деле есть очень мало ошибок, поскольку вообще очень мало ошибок.

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

И о расширяемости. Мы только что добавили базу данных 2 сверху базы данных 1 в нашем продукте, оба из них не SQL. Нет проблем, связанного с проверкой типа. Прежде всего, мы разработали API достаточно гибки, чтобы предвидеть различные основные реализации. Я думаю, что динамический язык - это помогает, а не помехи в этом отношении. Когда мы продолжали тестирование и исправить ошибку фразы, мы работали над такими жуками, работающими на любом языке, придется столкнуться. Например, проблемы использования памяти, согласованность и референтные проблемы с целостностью, проблемы обработки ошибок. Я не вижу, что проверка статического типа имеет большую помощь по любой из этих проблем. С другой стороны, мы очень принесли пользу от динамического языка, имея возможность ввести код Mid-Flex или после простого исправления. И мы можем проверить нашу гипотезу и быстро продемонстрировать наши исправления.

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

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

Из моего опыта статически напечатанные языки могут быть трудными для обслуживания. Например, позволяет сказать, что у вас есть утилита, которая принимает пользовательский класс в качестве параметра. Если по дороге вы принимаете новую конвенцию именования, чем имя этого класса, придется изменить, а затем все ваши коммунальные функции также должны будут измениться. На языке, таким как Python, это не имеет значения, если у класса наследует одинаковые методы.

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

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

Без

  • Управления источником
  • Отслеживание ошибок
  • Агрегатные тесты
  • Совершенная команда

Вы можете потерпеть неудачу с каким-либо языком.

Я помню дни до и после внедрения инновации IntelliJ IDEA.Есть огромные различия.Раньше статическая типизация использовалась только для компиляции, разработка в основном обрабатывала исходный код как текстовые файлы.После того, как исходный код станет структурированной информацией, многие задачи разработки значительно упростятся благодаря статической типизации.

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

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

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

Теперь попробуйте сделать это на статически напечатанном языке.

Если тип объекта не задокументирован рядом с сайтом использования (например, через аннотации типа, библиотеку типографии A-La Python) или где-то на стеке, выводя, где он пришел, может быть практически невозможно. Я говорю из опыта, постаравшись отладки деталей Buildbot Framework. Он включал огромное количество сырья в поисках Framework, даже используя необычные идентификаторы, такие как Pydev, Komodo и Wingware.

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

Редактировать: С 2014 года Guido добавил Pep484, Mypy и модуль печатания. Это сделало мой опыт гораздо лучше с точки зрения поддержания крупных проектов.

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

Ошибки, которые Java поймают во время компиляции, - это только небольшое подмножество ошибок, которые могут возникнуть. Они также почти всегда самые тривиальные для обнаружения путем тестирования; Вы не можете пропустить вызов метода на объекте неправильного класса, если вы тестируете, что ваш код производит правильный ответ! В этом отношении вы могли бы утверждать, что Python на самом деле лучше для обеспечения качества; к принуждение Вы, чтобы проверить хотя бы немного, чтобы ваш код был свободен от простых опечаток, он гарантирует, что вы на самом деле делать Проверьте хотя бы немного немного.

На самом деле Java даже не очень хороший пример языка с сильными статическими чеками для ловли больших ошибок. Попробуйте программирование в Haskell или Mercury, чтобы увидеть, что я имею в виду или лучше попробовать программирование в Scala и взаимодействия с библиотеками Java; Разница в том, сколько «правильность» компилятор может гарантировать вам поражение, когда вы сравниваете обычный идиотический Scala код с помощью SCALA-библиотеки к коду, который должен иметь дело с библиотеками Java (я фактически сделал это, так как я программирую Бит в Scala на Android).

Ваша способность писать хороший ремонтную код в больших кодовых базах, работающих многими разработчиками в течение длительных периодов времени, несмотря на недостатки статического обнаружения ошибок Java по сравнению с такими языками, как Scala, зависит от языков точно такие же методы Python Programmemers использует то же самое в их больших кодовых базах, несмотря на недостатки статического обнаружения ошибок Python по сравнению с Java.

Я использовал Python для многих проектов, от нескольких сотен линий до нескольких тысяч строк. Динамическая печатание - отличное заповедник времени, и она упрощает использование концепций ОО, как проще полиморфизма. Система типа не делает проекты ненаправленными. Если у вас есть проблемы с воображением того, попробуйте написать несколько вещей в Python и посмотрите, как они идут.

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