Pull to refresh

Comments 77

В SurveyMonkey решили переписать приложение на Python и разбить основные функции на несколько сервисов, каждый из которых «общался» с остальными через API. Это уменьшило кодовую базу, с которой приходилось работать при тестировании функций, и упростило процесс их реализации.

Так как-бы не понятно что большее влияние оказало — смена языка или смена архитектуры.

Да, наверное, Google создал язык Go, потому что Python был слишком быстр для них

Непонятно, к чему этот комментарий. Статья же не про скорость языка, а про популярность и некоторые причины её объясняющие.
Крупные ИТ-компании: простота и производительность

Проавда производительность чего? — все же разработки наверное. Гвороят что раньше Google применял python для написания прототипов. И, кстати, один из самых первых облачных проектов который не стал правда мега-популярным — это был google app engine с модернизированным Django в качестве движка. Потом эта идея как-то у них затормозиась в развитии. А могли бы стать лидерами.
Термин «производительность» не обязательно относится к программам, написанным на языке, он может означать и производительность разработчиков, использующих этот язык.
Стоит заметить, что Gо, согласно замыслу его создателей, призван решать обе эти проблемы.
UFO just landed and posted this here
Гугл это гугл, это крайний случай, думаю всем остальным производительность питона вполне нормальная.
UFO just landed and posted this here
Другой пример: Никита Соболев, разработчик и основатель стартапа Wemake.services, перевел всю свою команду с Java на Python. Среди причин такого решения он называет скорость разработки. По его словам, производительность программиста, который пишет на Python, в несколько раз выше, чем, например, у того, кто пишет на Java
Видимо, не очень хорошие Java программисты в команде, если при переходе на новый язык их производительность выросла в несколько раз)
Перевести команду на другой язык можно разными способами. Например путем замены.
Java медленнее Python в несколько раз, так что это тоже послужило причиной.

Как java с jit медленнее иетерпетируемого python?

Или 40, не считая потребления ЦПУ.
spectral-norm

source secs mem gz cpu cpu load
Python3 193.86 50,556 443 757.23 98% 98% 99% 99%
Java 4.41 35,028 950 16.79 96% 97% 98% 95%

Я бы хотел поправить вопрос. Вот так звучит афористичнее:


Как java с jit медленнее python с gil?

сколько людей — столько мнений… я крайне доволен .Net стэком. У меня в текущем проекте полный фарш: на бэке webapi, сайт, wpf десктоп клиент админки, xamarin forms мобила. Интеграция и повторное использование кода между этими вещами просто фантастическая: по сути я один раз написал модель данных и натянул на неё разные интерфейсы, а в добавок еще десктоп и мобила вообще почти 1 в 1 совпадают по xaml. Если бы это добро всё было на разных языках и платформах… я б потратил на это раз в 5 больше времени.

UFO just landed and posted this here
Вот интересно, почему если язык такой простой и так на нем быстро писать, разработчики часто пользуются поиском?

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

это все понятно, но бывает и другие случаи. Вот мой пример: я разработчик на платформе 1С, это моя работа, поиском пользуюсь редко. Ещё бывает пишу запросы на SQL, поиск тоже редко нужен. Ещё я пишу на c#, поиск пользуюсь чаще, но в принципе код могу написать без Гугла. А ещё очень редко нужно писать на cpp, но без Гугла я и 50 строк не напишу. Вот и получается, что чем хуже я знаю язык и платформу, тем чаще мне нужен поиск. А судя по такой статистике может оказаться, что у меня самый популярный язык это cpp.

Тут, видимо, трудности перевода.
Популярность = интересуемость. Количество поисковых запросов это показатель интересуемости языка, а не абсолютного количества разрабов или проектов.
Питон, он клевый. Он, зараза, для всего пригоден. от "скриптов" до прилождений для мобильников.
Его любят ученые. И на волне машинного обучения он — огого!
И если вам мил одинэс, то у меня десятки внешних питонячих сервисов работают с базой. некоторые даже еще SOAP. Тут больше ограничений и уродства со стороны 1С — сколько лет уже HTTP-сервисы не поддерживают тупой синтакс-контроль. Нураленышам же пофигу — бабло капает и ладно. А на нас с вами — класть с прибором.

на питоне часто пишут скрипты, а т.к. он может быть не основным языком разработки, то и иногда без Гугла не обойтись, чтоб написать небольшой скрипт.
А 30 лет назад программисты пользовались книгами, чем отличается поиск в интернете от поиска в книге, кроме скорости, разумеется?
1. Книги не получают новой информации в онлайн режиме.
2. В книге не найдешь готовой библиотеки / функции на конкретную узкую задачу.
Это был скорее риторический вопрос-ответ на замечание автора комментария «Пользуются поиском, ай-ай-ай», хотя пользовались поиском всегда, только раньше это были книги, еще раньше статьи и т.д.
По той причине, что язык состоит не только из конечного числа операторов, но и многих сотен модулей/библиотек, API которых могут потребовать время на изучение. Часто, проще и быстрее воспользоваться поиском и подсмотреть уже готовые примеры использования API.
Жаль ruby с рельсами таки стал сливать из-за AI тренда.

"Есть лож, а есть статистика.."
Я то же питон активно пользую. Очень удобно простой скрипт скидать для анализа лога, генерации отчетов (выборок из БД… срочно срочно..) и тому подобных задач.


Но основное языки для разработки все равно остаются Java и С++.
Поскольку "дружелюбность для разработчика" заканчивается на уровне программ в 500..1000 строк кода.
Что то более объемное — лучше Java.

Поскольку «дружелюбность для разработчика» заканчивается на уровне программ в 500..1000 строк кода.

А поподробнее можно?
Т.е. я еще как-то могу понять, если у вас программа в один файл в 500-1000 строк кода, но кто мешает разбивать на модули и писать нормальный, структурированный код?
А интересно, много проектов на питоне, которые больше уровня «скрипт скидать для анализа лога, генерации отчетов»? Для бигдаты и мл вроде тоже достаточно скромные по объёму скрипты.
Если не брать в рассчёт что-то типа matplotlib, в котором порядка 20 мегабайт кода и в основном на питоне, но это всё же библиотека. В ближнем окружении не видел крупных задач, всё в основном — скрипт скидать.
UFO just landed and posted this here

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

UFO just landed and posted this here

Ну если вы пишете тесты на тайпчекинг, вам видимо нужно протестировать тайпчекинг) Обычно тестами тестируют реализованный функционал. Я не один проект на питоне запустил, и мне не пришлось ни разу писать тесты на тайпчекинг. Может конечно я что-то не так делаю) Но сейчас эти проекты прекрасно рефакторятся и расширяются. А тесты функционала помогают ничего не сломать. Ну и делается это все как минимум в 2 раза быстрее, чем было бы на той же Джаве)

UFO just landed and posted this here

Ну наличие где-то в каком то проекте таких тестов совсем не означает, что это common practice. Тесты пишут обычно на функционал, а тесты на поверку типов бессмысленны просто потому, что в питоне обычно используется подход к объектам по "интерфейсу", а не по типу. А тип может быть любой, если он реализует этот интерфейс

UFO just landed and posted this here

Ну хорошо) Простой пример из практики, чтобы вы поняли, что тайпчекинг смысла не имеет. У вас есть утилитарная функция, которая принимает объект, у которого должен быть метод get_value,. к примеру, который не принимает параметров и возвращает число. Функция знает сигнатуру вызываемого метода и знает как с ним работать. Зачем ей тип объекта? Ну и этот метод реализуют 20 классов в проекте, которые никак не связаны друг с другом. Как это будете тестировать? С каким типом?

UFO just landed and posted this here

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

UFO just landed and posted this here
У вас есть утилитарная функция, которая принимает объект, у которого должен быть метод get_value

Значит она принимает интерфейс у которого описан метод get_value.


Функция знает сигнатуру вызываемого метода и знает как с ним работать.

Ну да, сигнатура же описана в интерфейсе


Зачем ей тип объекта?

Чтобы в неё нельзя было передать объект, который не реализует этот интерфейс.


Ну и этот метод реализуют 20 классов в проекте, которые никак не связаны друг с другом.

В джаве они все помечены как реализующие этот интерфейс. В Go они вообще никак не помечены, просто у них есть такой метод.


Как это будете тестировать?

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

В питоне интерфейсы — это номинальный тип, реально такого типа нет.
> Ну да, сигнатура же описана в интерфейсе

А ещё там есть магические методы типа __getattr__, который спокойно может вернуть этот метод, хотя в интерфейсе класса его нет явно. А ещё в питоне есть возможность в рантайме добавить метод в объект. Поэтому увы, но тут никак интерфейсами не поможешь. Да они особо и не нужны. Как я уже писал, все покрывается тестами. А если есть веррятность получения неправильного объекта, ловите эксепшн и обрабатываете соотв. образом, или делаете проверку нужных атрибутов
Поэтому увы, но тут никак интерфейсами не поможешь.

Если статической типизации нет, то конечно не поможешь.


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

И, как уже писали вам в ответ, если типизация статическая, то тесты для проверки того, правильный ли объект вам передали, можно не писать. Это экономит время.


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

И, конечно, пишете тесты, которые проверяют, правильно ли вы ловите и обрабатываете эксепшн. А вероятность получения неправильного объекта в динамически типизируемом языке есть практически всегда.

Ну что поделаешь. Лучше написать один-два лишних теста, чем писать несколько интерфейсов, продумывать правильную цепочку наследования, может даже создавать новые типы для унификации, как-то это все связать вместе и потом поддерживать.
Ну и справедливости ради, ситуация, когда в функцию отправляется объект неправильного типа (кроме None, undefined, null и подобных), когда у функции четко описан интерфейс в той же документации, на моей практике возникает нечасто. Разве что по ошибке в вызываемом коде или по злому умыслу. В обоих случаях ловится функциональными тестами. Ну и если что, IDE подскажет, что тут тип не совсем правильный, а если IDE не подскажет, есть typing (https://docs.python.org/3/library/typing.html) и аннотации, тогда уж хороший линтер неправильный тип не пропустит. В общем, все решаемо в Питоне, на любой вкус и цвет, даже с динамической типизацией.
Лучше написать один-два лишних теста, чем писать несколько интерфейсов

Одним-двумя тестами тут не обойдёшься, тест надо писать для каждой функции, которая принимает объект с get_value. То есть количество тестов, которое нужно написать вместо объявления интерфейсов в лучшем случае будет равно количеству интерфейсов, а обычно будет намного больше.


продумывать правильную цепочку наследования

Для объявление интерфейса продумывать цепочку наследования не нужно. Вообще наследование не нужно.


может даже создавать новые типы для унификации

Тоже не нужно )))


Ну и справедливости ради, ситуация, когда в функцию отправляется объект неправильного типа (кроме None, undefined, null и подобных)… на моей практике возникает нечасто.

Кстати null система статической типизации тоже может отловить. Но в общем приятно, что нечасто возникает.


Разве что по ошибке в вызываемом коде

А как хорошо всё начиналось ))

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

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


Зато разработка и поддержка раза в 2 точно меньше времени занимает.

С чего бы вдруг? Вы же не хотите сказать, что декларация типов занимает столько времени?

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

Нас это мифическое "полным полно ошибок", о котором вы пишете, вполне устраивает.

Охотно верю.


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

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

> Ещё лучше тратить время на исправление действительно значимых проблем

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

Нет, так не лучше, именно поэтому вы не тестируете входные типы. У вас нет времени протестировать и то и другое.


Чтобы сравниться по скорости разработки с разработчиками, использующими языки со статической типизацией, вам приходится сознательно отказываться тестировать значительное количество кейсов.

UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here

В python (и JS) мне не нравится:


  • неявное преобразование типов
  • создание переменных без объявления

Это потенциальная (и наступал на это) "слабое место" для ошибок.


В простых программках, когда нужно быстро быстро решить какую то задачу (на те же 500 строк кода) — это может оказаться преимуществом. А в программах которые потом сопровождать и где исходного кода на пару сотен кбайт, лично я предпочитаю C++ или Java. (Java лучше, поскольку проблемы с версиями Unix/Oracle client задрали..)


При прочих равных, производительность — это то же важно..


В повседневной работе сейчас:


  • в основном, новые проекты на Java.
  • Сопровождаю старый код на C++ (которой частично и сам писал).
  • питон — для анализа логов (нестандартные задачи), не стандартные разовые отчеты, вместо sh/bash (когда его возможностей мало), и т.п.
  • js — web морды для пользователей. Регулярно..
  • PL-SQL + SQL — когда долго ждать когда у разработчика Oracle время появится и нужно срочно..

Для хобби: C++, java и питон.


Все сказанное — мое личное мнение, на моем личном опыте. А не на теоретических рассуждениях.

Все эти споры "какой язык лучше"…
Да пофиг, по большому счету, на чем кодить… У всего есть недостатки и достоинства.

В питоне нет неявного преобразования типов

И неявного объявления переменных в питоне тоже нет. Это вы с JS перепутали.

Полностью с вами согласен. А python пусть продолжает учиться у Tcl/Tk

Все зависит от задач и ресурсов. Разработка на Java как правило затратнее по времени, чем на Python. Но если есть критичные ко времени выполнения требования, тут да, Java может и лучше подойдёт. Но опять же, все зависит от задач и Питон отлично интегрируется с модулями на Си там, где нужна производительность. А если ещё вспомнить, что время разработчиков обходится значительно дороже, чем затраты на железо, тут вопрос может сместиться не в сторону Java. Не все так однозначно)

Для начала следует задать вопросы:
— Что такое Stackoverflow?
— Какова ниша данного продукта?
— Каков уровень активных пользователей в разработке?

И только после этого делать какие-то выводы.
Меня напрягают современные методы изучения языков программирования. Вместо того, чтобы почитать книгу или другие материалы, проще сгонять на форум и задать вопрос. Что-то мне подсказывает, что это и есть основной контингент Stackoverflow и подобных сервисов. Особенно идеально это доказывает Тостер.
Одно дело, когда задают вопрос по конкретной задаче и используют конкретный подробный ответ.
Другое дело, когда задают вопрос и используют ответ в качестве основы «что, как и почему» и уже на этой основе ищут информацию. Если речь про первое — то да, тенденция не очень, если про второе — не вижу в этом ничего крамольного, это так же эффективно и возможно фундаментально, как и книга, и при этом в разы быстрей.
Да вот второго я замечаю всё меньше и меньше, может они учатся пользоваться поисковиками, но мне слабо верится. И именно из-за первых я начал бросать сервисы подобные stackoverflow.

Я знаю кучу «разработчиков», которые реально не хотят изучать, в лучшем случае поищут, в худшем просят, что за них написали готовый код.
Только читать нужно не книги, а доки. Инфа в книгах часто успевает устареть за время выхода в печать. Исключения конечно есть, типа книг по алгоритмам и другим базовым вещам.
В остальном согласен с вами, GDD весьма популярен.
Ну а Тостер к сожалению окупировали те кто хочет чтобы за них сделали работу, а не те кто пытаеться сам научиться.
Новичку надо научиться правильно думать, это могут дать книги, но никак не сухая документация. Опытный программист уже и без stackoverflow сможет решить большинство проблем.
Stackoverflow — замечательный сервис на тот случай, если нужно быстро получить ответ на какой-то конкретный вопрос. Особенно если попался какой-то совершенно нелогичный баг или фича, про который фиг прочтёшь в книжке. А из реальных программистов кто-нибудь с ним да сталкивался. Ну и не только это, бывают и полезные всякие howto там, о которых тоже бывает в книжках не прочесть.

Странно оценивать популярность языка по количеству поисковых запросов связанным с ним. Этот показатель может указывать на наличие проблем на которые пытаются найти ответ в поисковиках.


Может народ кучу старых питоновских скриптов народ переводит под 3ю версию. Или пытатся сделать чтоб они работали на обоих версиях.

Хм, даже не прочитать первую строку статьи и написать комментарий, это конечно сильно. Там написано: провели опрос.

Я об этом:


В прошлом году Python занимал пятое место в рейтинге TIOBE. Это индекс, оценивающий популярность ЯП, на основе количества поисковых запросов на платформах Google, Wikipedia, YouTube, Amazon и др. В 2018 году популярность языка увеличилась до 6% (почти на 3% c 2017 года), и теперь он занимает четвертое место в рейтинге.
Ну это да, тогда я с вами согласен. Тут только на попугаев можно посмотреть и всё.
Оценивать популярность языка по количеству запросов может и не правильно. Но факт то, что на HeadHunter количество вакансий по Python иной раз больше чем вакансий по C#.
ценность языка очень сильно зависит от количества полезных и удобных инструментов для работы и куча хороших библиотек, с питоном не знаком, но может тут есть умельцы раз он так популарен которые смогут подсказать в какую сторону смотреть, чтоб хватило на разработку веб приложений и сервисов. имеется ввиду удобное IDE с необходимыми плагинами и хорошие библиотеки
PyCharm от Jetbrains если нужна полноценная IDE, если же продвинутый редактор, то VSCode/Atom/Brackets/SublimeText с плагинами. Ну а готовые библиотеки есть есть под все что душа пожелает. Самый популярный вебфреймворк Django или более легковестный Flask, для удобной работы с http — requests, для асинхронных приложений asyncio, для тяжелых мат. вычислений NumPy и т.д.

Тут все, что в принципе может понадобиться https://pypi.org. Там и категории есть и поиск по ключевым словам

Из IDE отлично подходит PyCharm или IntellujIdea с плагином Python.

Sign up to leave a comment.