Как отсутствие статической типизации в Python влияет на удобство обслуживания и расширяемость в больших проектах? - PullRequest
18 голосов
/ 09 сентября 2010

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

Ответы [ 7 ]

14 голосов
/ 09 сентября 2010

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

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

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

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

8 голосов
/ 09 сентября 2010

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

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

5 голосов
/ 09 сентября 2010

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

Без

  • Контроль источника
  • Отслеживание ошибок
  • Юнит-тесты
  • Преданная команда

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

4 голосов
/ 15 октября 2014

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

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

Если тип объекта не задокументирован близко к месту использования (например, с помощью аннотаций типов, а-ля библиотеки Python typeafe) или где-то в стеке, определить, откуда он возник, может быть практически невозможно. Я говорю по опыту, попробовав отладку частей фреймворка BuildBot. Это потребовало огромного количества необработанного текстового поиска в рамках, даже с использованием таких модных IDE, как PyDev, Komodo и Wingware.

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

РЕДАКТИРОВАТЬ: с 2014 года, Гвидо добавил PEP484, MyPy и модуль ввода. Это сделало мой опыт намного лучше в плане поддержки крупных проектов.

4 голосов
/ 09 сентября 2010

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

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

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

1 голос
/ 29 января 2012

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

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

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

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

0 голосов
/ 09 сентября 2010

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

...