Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Без

  • Контроль источника
  • Отслеживание ошибок
  • Тестирование устройств
  • Командная команда

вы можете выйти из строя с любым типом языка.

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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