Почему Python?

Python programming
Python programming

С некоторого времени в голове крутилась мысль о том, а не написать ли мне небольшую заметку на тему почему язык программирования Python стоит изучать, и более того, создавать на нём программные проекты.

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

Что такое Python?

Python это язык программирования общего назначения, нацеленный в первую очередь на повышение продуктивности самого программиста, нежели кода, который он пишет. Говоря простым человеческим языком, на Python можно написать практически что угодно (веб-/настольные приложения, игры, скрипты по автоматизации, комплексные системы расчёта, системы управления жизнеобеспечением и многое многое другое) без ощутимых проблем. Более того, порог вхождения низкий, а код во многом лаконичный и понятный даже тому, кто никогда на нём не писал. За счёт простоты кода, дальнейшее сопровождение программ, написанных на Python, становится легче и приятнее по сравнению с Java или C++. А с точки зрения бизнеса это влечёт за собой сокращение расходов и увеличение производительности труда сотрудников.

Для демонстрации лаконичности рассмотрим код на Python и Java, который открывает файл и сохраняет его содержимое в переменную:

Python:

file = open('file.txt')
content = file.read()

Java:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public static void main(String[] args) throws IOException {
    String content = new String(Files.readAllBytes(Paths.get("file.txt")));
}

Код на Java использует обновлённый интерфейс для работы с системой ввода-вывода. Старый способ выглядел бы ещё ужаснее 🙂

Кто использует Python?

Грош цена даже самому продвинутому языку программирования, если до него никому нет дела. Одним из составляющих успеха любой технологии является сообщество, созданное вокруг неё. Именно оно предопределяет будущий вектор развития путём совместных усилий. Сообщество вокруг Python одно из самых сильных в мире IT. Это сложный хорошо организованный и постоянно развивающийся организм. Помимо сотни тысяч индивидуальных разработчиков и небольших софтверных компаний, Python поддерживают такие гиганты IT как:

  • Google
  • Dropbox
  • Mozilla
  • Facebook
  • Yandex
  • Red Hat
  • Microsoft (с недавних пор очень активно, в частности с Visual Studio)
  • Intel (активно ведёт исследовательскую работу в области параллельных вычислений на Python)

… и многие многие другие. Впечатляет, не правда ли? Что же касается крупных и популярных проектов, написанных на Python то это такие монстры как:

  • YouTube (большая часть кодовой базы полностью на Python)
  • Первая версия поискового паука Google была написана на Python, а позже, из-за чрезвычайно высокой нагрузки и требований к скорости, была переписана на C++.
  • Десктопный клиент Dropbox
  • Reddit
  • Instagram (500M юзеров на Python)
  • Bitbucket (Python 2.7 и Django 1.7.11)
  • EVE Online MMOPG
  • Quora
  • Spotify
  • Критические сервисы PayPal, обрабатывающие до 2 миллиардов запросов в сутки. Подробнее можно узнать в подкасте от TalkPython, выпуск #54
  • Сервисы Mozilla
  • Популярный сервис идей Pinterest
  • Сервис комментариев Disqus (использую в этом блоге, сервис реализован на Django)
  • Внутренние сервисы Facebook (см. постер в моей заметке о PyCon)
  • Система контроля версий Mercurial (до некоторых пор разработчики Python использовали её в своей работе)
  • Сервисы Wargaming

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

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

В заметке про книгу «Структура и Интерпретация Компьютерных Программ«, я писал о том, что она была взята за основу в качестве учебного материала для вводного курса по программированию в MIT, компьютерным языком на тот момент выступал диалект Lisp — Scheme. Времена меняются, сейчас в качестве цифрового lingua franca лидирует что…? Правильно, Python. Именно его используют в качестве надёжного инструмента в столь удивительном ремесле.

Недостатки Python

Удивительный мир программирования
Удивительный мир программирования

У читателя незнакомого с Python может сложиться впечатление, что он панацея от всех бед, серебряная пуля и лекарство от рака. Но не всё так радужно и прекрасно. Как и у всего, у Python есть ряд своих недостатков, которые порой могут быть критическими и влиять на выбор не в пользу змеи.

Скорость

Одним из главных недостатков является его относительно низкая скорость выполнения. Python является языком с полной динамической типизацией, автоматическим управлением памятью. Если на первый взгляд это может казаться преимуществом, то при разработке программ с повышенным требованием к эффективности, Python может значительно проигрывать по скорости своим статическим братьям (C/C++, Java, Go). Что касается динамических собратьев (PHP, Ruby, JavaScript), то здесь дела обстоят намного лучше, Python в большинстве случаев выполняет код быстрее за счет предварительной компиляции в байт-код и значительной части стандартной библиотеки, написанной на Си. На конференциях мне довелось пообщаться с ребятами из крупных компаний вроде Wargaming, у многих из них наблюдается тренд перехода в сторону статики, и чаще всего это Go, Rust.

Интересный доклад про скорость и оптимизацию CPython (родная реализация языка на Си) был прочитан на PiterPy 2015 в Санкт-Петербурге:

Динамическая типизация

Для начинающих программистов, язык программирования с динамической типизацией на первый взгляд (и на второй и даже на третий) может казаться отдушиной, райским наслаждением, особенно для тех, кто ранее имел дело со «статикой». Но есть и обратная сторона луны. С ростом кодовой базы (а это часто неизбежный процесс в успешных проектах), следить за типом передаваемых друг другу данных бывает очень сложно (а при отсутствии внятных доков и тестов практически невозможно), отсюда появляются проблемы, когда, например, у None пытаются вызвать метод или обратиться к атрибуту в процессе выполнения кода. Для решения такого рода проблем динамические языки обрастают всевозможными костылями, свистелками и перделками в виде type annotations, проектов mypy по статическому анализу кода и так далее. Это же в свою очередь накладывает негативный оттенок на эстетическую сторону кода.

В связи с ограничениями языка, появляются альтернативные реализации интерпретаторов: PyPy, Pyston, Jython, Cython и многие другие. Сейчас тренд хорошо заметен именно в эту сторону, например Pyston разрабатывается в стенах т.н. Мекки Python программистов — компании Dropbox 🙂

Заключение

Несмотря на ряд проблем исторически присущих Python, он продолжает оставаться лидирующим инструментом в ряде ниш:

  • Разработка веб-приложений (тут у нас бесусловный лидер в виде Django).
  • Анализ данных и машинное обучение (пакеты scipy, scikit-learn, pandas, numpy признанные мировым ученым сообществом).
  • Введение в программирование (pygame, turtle хорошо помогают мотивировать детей начинать кодить).
  • Быстрое прототипирование идей в бизнесе за счёт обилия готовых библиотек, низкого порога вхождения в язык и высокой продуктивности программистов, пишущих на Python.
  • Написание скриптов (сценариев) для автоматизации задач. Python по-умолчанию поставляется со всеми дистрибутивами unix-like систем и является отличной заменой Bash во всех смыслах.

Наверняка я ещё что-то забыл. В общем, Python рулит!

UPDATE: Не так давно я открыл Telegram канал для разработчиков, где стараюсь делиться с подписчиками интересным материалом из мира разработки ПО и смежных тем. Конечно я и не забываю транслировать туда обновления на блоге 😉

Ссылки

  • Виталик

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

    • Спасибо за комментарий. Я сам начинал погружение в программирование с языка Си, постепенно перешел на Object Pascal с Delphi. Именно обратная связь в виде лёгкости создания визуальных приложений (GUI) зажгла интерес продолжать самообучение дальше. Считаю что обратку необходимо получить как можно раньше, .т.к одними «Hello world» сыт не будешь и Python в этом плане очень даже хороший вариант.

      А в чем у вас конкретно были трудности с динамической типизацией?

      • Виталик

        Практических затруднений никаких, просто было трудно привыкнуть и понять как без задания определенного типа среда может оперировать с переменной. Даже на данный момент я бы хотел чтоб в таких языках как Python и JS ввели хотя бы возможность определять тип переменной. Мне кажется это может избавить от ошибок на большом обьеме кода. Когда я изучал Java думал, что принцип полиморфизма это главный козырь ООП, а при динамической типизации он теряет свою «силу».

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

        • AlexeyR

          Думаю, что для вас может быть решением TypeScript. Он определенно с типизацией, хотя не исключает и использование подхода JS. Я полагаю, начиная с СС++, что при сложной архитектуре приложения и его развитии типизация необходима. Иначе разработка новых версий становится больше поиском ошибок по времени и трудозатратам, чем улучшение.

          • в Python тоже есть т.н. псевдотипизация, погуглите в сторону python type annotations.

  • Даурен Шалабаев

    Интересная статья!)

    • Спасибо за оценку =)

  • А вот это циата Адиля: (истина истин, это правда)
    «Для начинающих программистов, язык программирования с динамической типизацией на первый взгляд (и на второй и даже на третий) может казаться отдушиной, райским наслаждением…»

    Видно что разобрались, добавлю свои артгументы, почему Python?
    http://spb-tut.ru/guest/category/3/

    • Leon bezbojnik

      Да ваш Python нафиг никому не нужен. Везде спрос только на PHP и Javascript.

  • Vladimir Sidorov

    Добрый день, Адиль. Спасибо за статью, я бы ещё добавил, что сейчас даже крупные банки себя пробуют на Python-стеке, монополии Java в Enterprise приходит конец… 🙂

    • Добрый день. Спасибо за отзыв) А есть информация по этим банкам?

      • Vladimir Sidorov

        Да, конечно, это в первую очередь Сбербанк и во вторую очередь все остальные вроде ВТБ, Тинькова и т.п. По международным банкам инфы нет. т.к. отслеживаю вакансии по РФ только.

        • Слушал подкаст DevZen, где одним из гостей был разработчик из Тиньков Банка. Удивился их технологичности 🙂 Scala, PostgreSQL, Docker, собственные ДЦ

          • Vladimir Sidorov

            Я думаю, в какой-то момент они поняли, что Java это слишком дорого.

  • Cemifux

    Спасибо за статью. Я так и не понял, а почему адепты Wargaming переходят в сторону статики, Go, Rust? В чём их преимещества?

    • Пожалуйста. Основное преимущество компилируемых языков в скорости выполнения кода. С нагрузками того же Wargaming, скорость играет ключевую роль.

      • Cemifux

        А как ты оцениваешь зрелость этих язычков, и вообще сообщество которое крутятся вокруг них? Ты тоже собираешься перейти на Go, Rust ?

        • За Go уже достаточное количество адептов, чтобы рассматривать его серьёзно (Dropbox, Google, Docker и другие). Я сам пока нормально его не изучал, но в планах на этот год такой манёвр имеется. Что касается Rust, то после первого финального релиза я проходил туториал и читал официальную документацию по нему.. Честно, мне не понравился язык 🙂 Возможно я просто не найду для него применений конкретно для меня.

  • AlexeyR

    Спасибо за статью. Хочу посмотреть пригодится ли мне в Веб Python и Django, например в дополнение к Ангулар 2 + Ionic 2 на TypeScript. То есть мобильные приложения и веб приложения. Скорее средне-сложные управленческие задачи, чем большие математические и статистические.
    Мне не ясно насколько эти языки возможно связать в приложениях при средней и низкой нагрузке пользователем приложения.
    Если можно пару ссылок на хорошие вводные матчасти языка и туториалы?
    Можете подсказать что-то из преимуществ Питона против JS в областях — сложный фронтенд, визуализация статичной 2D графики, анимация, работа с базами данных SQL+NoSQL ?
    Заранее спасибо!

  • Сергей

    Ну вообще в первом примере нужно сравнивать именно две строки из тела main в Java варианте. То, что в питоне не надо подключать основные библиотеки (правда не надо?) и то что, скрипт вне какой-либо функции является main-ом — это вообще не преимущество. А так то — те же 2 строки кода.

  • Leon bezbojnik

    Не вижу никаких преимуществ у Питона. Он крайне непопулярен, на фриланс биржах нет заказов для питонистов и для создания сайтов на Джанго. Изучать Питон — это пустая трата времени.