Дата-инженер Skyeng о Python, Bash-е и своей рабочей практике — Разработка на vc.ru
132 просмотров
Рассказывает Денис Наумов — техлид и дата-инженер Skyeng, автор курса Python для инженеров.
У Дениса за плечами более 5 лет в разработке и анализе данных на Пайтоне. Выстраивает системы реагирования на триггерные события во взаимодействии пользователя с продуктами, а в качестве DataOps развивает аналитические инфраструктуры и управляет потоками данных.
Краткий экскурс в историю
Устроившись на первую работу в 2014 году, Денис сразу стал писать на C и C++. Компания разрабатывала веб-сервисы и приложения, как все. Была своя специфика, но ничего сверхъестественного.
Работать с C++ было не слишком удобно, потому что он имеет достаточно высокий порог вхождения. Этот язык не самый лаконичный, писать на нем надо дольше. Плюс, можно запросто ошибиться, а рассчитывать на то, что он поправит своим синтаксисом и инструментами, не приходится.
Компании постоянно нужен был человек с низкоуровневым стеком, который будет согласен (и способен) писать веб-приложения. Найти такого было затруднительно, поэтому начали рассматривать альтернативы, что привело к Пайтону — самому удачному варианту на рынке на тот момент. Сейчас по удобству и производительности большую конкуренцию Пайтону составляет Go, но тогда его еще не было.
Чем хорош Python
1. Синтаксис языка задизайнен таким образом, что его можно прочесть практически естественным образом — как будто читаешь книгу. Не надо вникать: в какую ячейку памяти что писать; куда показывает указатель; разбираться с тем, чтобы освободить память, если она была занята. В противном случае приложение «потечет», память будет потрачена «в никуда», все упадет, и клиенты будут недовольны. В Пайтоне все читается просто.
2. Очень богатая экосистема. В C++ есть ряд базовых библиотек, которые умеют супербыстро работать с примитивами, но чтобы создать нечто большее, надо самому придумывать кучу абстракций. Если нужно создать веб-фреймворк, то начинать придется с голого веб-сервера. Из абстракций есть только обращения через сокеты и буфер, куда можно отдать байтики и откуда их считать. О том, чтобы положить или принять json (что часто происходит при веб-разработке), нет и речи. В наличии — самый низкий уровень, а нужны еще: соединение HTTP, REST API и веб-фреймворк, который умеет со всем этим обходиться и где можно удобно описать хэндлеры. Требуется нагородить кучу условностей, особенно если нужны промежуточные функции (читай: Middleware), которые агрегируют в себе сквозную функциональность. В Пайтоне с его обширной экосистемой проще: этот язык как будто и был создан, чтобы быстро и удобно писать веб-приложения, а также предостерегать программиста от ошибок, оставаясь при этом читаемым и понятным. При этом всем Пайтон не теряет в гибкости.
Ну и приятный бонус. Самый распространенный интерпретатор для Пайтон написан на C, поэтому для гиперпроизводительности можно делать вставки прямо на C-шном диалекте для Python (т. н. Cython), а можно взять чистый C и скомпилировать библиотеку для Пайтона — с теми же питоновскими интерфейсами, где при использовании не нужно запариваться о куче низкоуровневых вещей.
Минутка философии. Часто задают вопрос: какой язык круче и производительнее? Ответ есть. Стоит копнуть глубже, и становится понятно, что любой язык — просто обертка над C-шной утилитой или веб-сервером. Все меряются тем, насколько правильно они выбрали библиотеку на C и насколько хорошо с ней интегрировались. Поэтому нет особого смысла мучительно думать, какой язык круче. Если нужна мегапроизводительность, то лучше сразу писать на C. Либо на Rust, который появился сравнительно недавно, и с которым тоже можно отлично интегрироваться на Пайтоне.
К слову, о причине популярности Rust. Несмотря на то, что есть обкатанный аж с 70-х годов C, в нем все еще присутствует проблема восприятия кода и большая вероятность допустить ошибку в низкоуровневых вещах. Rust решил обе эти проблемы: его простой относительно C/C++ дизайн завоевал доверие большого количества программистов. В вопросах дизайна этот язык по пошел по пути упрощения так же, как когда-то Python. Да что уж там, даже новые стандарты знаменитого своей консервативностью C++ начинают учитывать положительную реакцию сообщества на подобные изменения. Это значит, что такой дизайн дорогого стоит.
О сравнении Python и Bash
Здесь стоит провести аналогию. Существует Python 2, с которого до сих пор активно пытаются слезть разработчики. Точно так же девопсы пытаются слезть с Bash. Но эти процессы не закончятся примерно никогда, потому что на том и на другом написаны тонны кода.
В СНГ первые девопсы произошли от системных инженеров и администраторов — людей с внушительным количеством опыта, которые по-настоящему шарят. Этим топовым дядькам уже солидное количество лет: они родились в эпоху Bash, и Пайтон в них не влезает. Потому что их голова и так вмещает гигантский объем знаний.
С одной стороны, это печально, потому что без постоянного развития в ИТ никуда. Но у этого есть логичное объяснение: когда становишься экспертом с вагоном навыков (кстати, независимо от возраста), трудно уместить в голове что-то новое. Это занимает много времени и сил, нужно ломать привычную модель мышления и начинать думать по-другому.
С другой стороны, квалификация топовых дядек побеждает стремление компании к прогрессу. Потому что бизнесу нужны результаты — здесь и сейчас. Соответственно, нужен человек, который сделает быстро и качественно, а не тот, кто будет тратить время на изучение новых фич.
Однако если речь идет о разработке новых решений, то Пайтон здесь превалирует. Bash-евское легаси никто поддерживать не хочет, с каждым годом все меньше специалистов понимают его на профессиональном уровне. Многие инструменты выходят с уже готовой обвязкой под Пайтон, поэтому их можно использовать с разбега. А если интегрировать эти инструменты с Bash, то нужно творить определенную уличную Bash-магию, чтобы использовать их через тамошние интерфейсы. Зачем вообще это делать — вопрос открытый.
О сравнении Python и Golang
Сравнивать языки программирования — все равно, что сравнивать глаз и молоток.
Для каждой задачи подходит свой инструмент. Если нужен высоконагруженный проект с жесткими требованиями к скорости обработки данных, то подойдет Go. Он более низкоуровневый и, как минимум, компилируемый. Обладая более высокой производительностью, этот язык обрел популярность в интернете вещей: здесь много устройств, которые генерят или обрабатывают большой поток данных в realtime.
Если нужно создать веб-приложение, которое выдержит 10–20 тысяч RPS, то Пайтон практически ничем не будет уступать тому же Go (под капотом все равно C-шный веб-сервер). Для бизнеса это может быть даже лучше, потому что на Python легче программировать с точки зрения отсутствия низкоуровневых сложностей. Поэтому R&D-подразделения, которым нужно сделать Proof of Concept, быстро проверить гипотезу, предпочитают Пайтон. Вместо того чтобы придумывать классную стабильную архитектуру на Go со всеми его концепциями, им проще написать на Пайтоне, проверить наличие отклика и написать что-то под большую нагрузку, пока приложение на Python держит нагрузку.
А если таковая не предвидится, то просто переписать красиво на том же языке.В каких отраслях нужен Python
Сегодня практически любая отрасль бизнеса делает веб-приложения, перекладывает json-ы из фронтенда в БД, так что Пайтон подойдет везде. Тем более, что его обширнейшая экосистема позволяет подобрать решение под конкретную отрасль. Парсить автомобильные номера по картинке — пожалуйста. Наскрэпить список онлайн-магазинов или подбор фотокарточек из Нельзяграма — как пожелаете. И далее по списку. Нет ничего, что нельзя сделать на Пайтоне быстро и удобно. За исключением низкоуровневого программирования, для которого он слишком медленный. Как и большинство языков, в принципе.
Пайтон быстро распространился среди девопсов благодаря наличию удобных инструментов. То же можно сказать о веб-разработке, потому что Time to Market никто не отменял, а у Пайтона есть обширная экосистема библиотек, которая позволяет разрабатывать быстрее. Но есть область, где Пайтон стал натуральным монополистом — Data Science. Здесь есть большое количество инструментов, которые позволяют с высокой производительностью обрабатывать и сканировать статические объемы данных.
Пайтон подходит разработчикам, девопсам и дата-сайентистам. Другими словами, всем ИТ-специалистам. Но не только им.
Случай из жизни. В одной из компаний работал юрист, которому был нужен Пайтон для работы. Он умел на нем неплохо программировать и применял для того, чтобы автоматически обрабатывать данные из договоров: получать, анализировать и складывать.
Сейчас будет спорное утверждение: любой язык программирования — это всего лишь инструмент для решения задачи, а не нечто, существующее изолированно и самодостаточно. Как и математика, в которой есть внутренние проблемы и противоречия, но в конечном итоге она тоже является абстрактным языком для описания реальных процессов. В этом контексте Пайтон выигрывает у многих языков за счет простоты входа. Его могут использовать практически все для абсолютно любых задач. Нужно раскидать сотни тысяч файлов по папкам? Написал скриптик за 10–15 минут и вполне счастлив.
Как Python помогает бизнесу
Первое — Time to Market. Если получается запрограммировать быстрее и допустить меньше ошибок на строчку, то бизнес быстрее отдает функциональность клиенту. На текущей работе Дениса клиенты — это внутренние подразделения, которые пользуются аналитикой. Аналитики готовят и отдают данные, а инженеры данных собирают информацию для аналитиков. Чем быстрее происходит сбор данных, тем быстрее бизнес может принять решение: увеличить бюджет, изменить стратегию и т. д.
Второе — автодокументируемость. Код читается немногим сложнее текстов на естественном языке. Большинство аналитиков так или иначе знает Пайтон. Когда инженер или разработчик на нем что-либо программирует, многие сотрудники компании могут вникнуть в код. Поэтому не придется писать на каждую строчку комментарий или документацию, человек может сам пойти в реализацию и понять: как лучше ее использовать и какой результат получится на выходе.
Случай в рабочей практике
В текущей компании происходит переход от выполнения рутинных задач по клиентскому ТЗ к созданию инструмента для заказчика, при помощи которого он сможет выполнить эту и все последующие мелкие задачи самостоятельно. Преимущество Пайтона здесь в том, что разработать можно достаточно быстро. Тем более, когда требования меняются во времени, появляются реквесты на добавление новой функциональности. Новые фичи можно удобно встраивать благодаря небольшой кодовой базе, которая дробится на понятные модули абстракциями Пайтона.
Таким образом разработка происходит еще быстрее. Если раньше условный разработчик тратил N времени на решение однотипной задачи несколько раз в месяц, то теперь он стал тратить 3N времени на разработку инструмента — и больше не тратит время на эту задачу вообще.
Бонусом это решает главную проблему всех больших компаний — падающую мотивацию сотрудников. Когда разработчик изо дня в день монотонно решает одну и ту же задачу, то он быстро выгорает. А цена найма может быть слишком высокой и иногда доходит до десятка месячных зарплат.
В итоге сотрудникам интересно запрограммировать что-то новое, а заказчикам не приходится ждать, пока разработчик победит свое нежелание приступать к рутинной задаче и пойдет реализовывать запрошенную аналитику. Теперь клиент может сделать все сам на своей стороне, не ожидая согласования и реализации, а у аналитика/инженера появляются новые классные задачи.
Заказчики в текущей компании — это сотрудники собственных подразделений, поэтому бизнесу выгодно отдавать задачи на сторону «клиентов», потому что это серьезно ускоряет процессы. При реализации той же функциональности для конечного потребителя продукта это еще и выгодно с точки зрения дополнительной монетизации. Клиенты имеют тенденцию покупать готовый инструмент вместо того, чтобы обращаться к компании-разработчику по каждой типовой задачке или искать ее решение самостоятельно, — и готовы за это платить.
С помощью Пайтона компании автоматизируют задачи, которые годами делались вручную. Начиная с доступов через LDAP-системы в сервисы, которые это не поддерживают, заканчивая сбором метрик через кастомные Prometheus-агенты, которые изначально не поддерживали такой интерфейс.
Нужно учесть, что один только Пайтон не станет волшебной таблеткой для бизнеса. Языки в рамках одной компании — особенно крупной — нужно уметь комбинировать между собой. Благо, сейчас есть множество RFC-спецификаций о том, как правильно делать интерфейсы для взаимодействия программ друг с другом. Тот же REST API, где четко регламентируются HTTP-вызовы для взаимного обмена данными между программами и произведением вычислений.
Достаточное число компаний использует программирование на разных языках, чтобы применять конкретный язык там, где он лучше всего себя показывает. Если это Data Science, применяют Пайтон с интерфейсом REST API. Если это программа, которая работает с голым железом или требует производительности, используют C, Rust или Go — и точно так же через интерфейс получают и отдают обработанные запросы потребителю.
Случай в учебной практике
Была интересная защита итогового проекта. Одна девушка долго не могла найти тему для проекта и в итоге не стала решать рабочую задачу, а упростила себе жизнь.
Она любила почитывать ЖЖ и выгружала оттуда статьи с комментариями. Для того чтобы это делать, существовала одна библиотека. Но она была прекомпилирована, и студентке пришлось пройти достаточно сложный технический квест, чтобы де-прекомпилировать библиотеку. В ходе работы она много узнала о внутреннем устройстве самого языка. Человеку пришлось изучить тонкости, известные далеко не всем серьезным веб-разработчикам, чтобы решить простую бытовую задачу.
Пайтон находит применение не только в решении рабочих задач для получения коммерческой выгоды, но и в упрощении повседневной жизни. Круто, что есть такие проекты.
Какие сложности есть у Python
У большой экосистемы языка есть обратная сторона: иногда документация просто не успевает за ее развитием. В C++, например, есть конечный и ограниченный набор библиотек. Для работы с json это, скорее всего, nlohmann/json. Она вообще не меняется из года в год, и программист точно знает: если загрузить это, библиотека отдаст то. Подобный алгоритм остается неизменным, меняется только скорость операций. В Пайтоне же может обновиться версия, даже незначительная ревизионная (с 2.4.0 на 2.4.1), а на поверку поменялось вообще все. При использовании новой версии библиотеки становится ясно, что она стала работать абсолютно иначе. При этом документация есть только на старую версию. Приходится самому разбираться. Возможный затык: другую версию использовать также нельзя, потому что разные библиотеки хотят разную версию одной и той же зависимости, а обратная совместимость потеряна. Можно запросто потерять весь каскад, за счет которого реализована логика в приложении. Такое встречается довольно часто, к сожалению. Поэтому иногда приходится читать сложный внутренний код с метапрограммированием, чтобы разобраться во внутренностях.
Еще одна потенциальная сложность может быть связана с последними событиями в России. Подобное уже произошло с «большой тройкой» облачных провайдеров у Terraform.
Конечно, Пайтон — опенсорсный язык программирования. Запретить опенсорсный продукт сложно, потому что он находится по всему интернету и в любом случае попадает в руки программистов. Плюс, проблемы со сменой лицензии в несколько раз превысят выгоду от того, что кому-то что-то запретят. Единственный риск, который мог сбыться, — запрет платформ версионирования кода. Например, GitHub. К счастью, ничего такого не случилось, владельцы GitHub на подобные меры не пошли.
Мудрость дня: разработка сильнее объединяет людей, а не вносит раздоры среди них.
Заключительная мысль
Как показывает практика, люди допускают ошибки в достаточно простых вещах: начиная от обработки строк и заканчивая работой с числами. Часто случаются непредвиденные ситуации, которые нужно обрабатывать. Если не знать, как использовать встроенную функцию или метод, и писать свое, то можно с большой долей вероятности встретить именно тот исключительный случай, о котором не знал.
Самый простой пример — работа с датой и временем. Люди привыкли сильно упрощать свое представление о физических и математических явлениях: в сутках 24 часа, в каждом часе 60 минут, в каждой минуте 60 секунд. Но мир устроен по-другому. Из-за гравитации солнца, проходящих рядом галактик и других внешних воздействий время не постоянно. Условно: каждые 4 года добавляется дополнительная секунда, каждые 10 лет — еще секунда, каждые 100 лет — 3 секунды. Соответственно, когда нужен точный учет времени, люди на этом спотыкаются и получают баг, который живет с ними всю жизнь.
Другой простой пример — email-адреса. Все привыкли, что это пара букв и цифр. На деле такие адреса могут представлять собой неимоверный объем символов, о котором люди даже не задумываются. Поэтому при написании парсера email-адресов часть из них может быть упущена. Конечно, таких адресов зарегистрировано всего несколько тысяч в мире, но когда программа встретится с таким адресом, в ней произойдет ошибка. И не факт, что когда подобная ошибка произойдет, вы не будете показывать свою программу крутому инвестору, который может спасти ваш бизнес.
Именно поэтому нужно постоянно развивать свой кругозор и навыки даже в базовых вещах. Тем более, в Пайтоне, где постоянно выходят новые версии и функциональность.
Средство поиска оттенков — Estée Lauder Double Wear Stay-in-Place Makeup
Выберите свой диапазон оттенков
Fair
Выберите свой оттенок
Светло-розовый
Select Your Shade
1C1 Cool Bone
холодный розовый оттенок
Купить
1CO Shell
холодный розовый оттенок
Купить
Fair+00Yellow
Выберите свой оттенок
1W0 Теплый фарфор
Очень свет с теплыми персиковыми оттенками (только онлайн)
Shop Now
1W1 Bone
Теплый оттенок золотой
магазин сейчас
1W2 Sand
Теплый подчерк
Выберите свой оттенок
0N1 Alabaster
самый светлый с нейтральным оттенком (только онлайн)
Купить сейчас
1N2 Ecru
нейтральный розовый оттенок & золотой
Купить сейчас
1N0 Porcelain
очень светлый с нейтральным оттенком (только онлайн)
Купить сейчас
1N1 Ivory Nude
нейтральный розовый оттенок & золотой
Купить сейчас
Светлый
Выберите свой оттенок
Светло-розовый
Выберите свой оттенок
2C0 Холодный ванильный
Холодный розовый оттенок
Купить сейчас
2C1 Чистый бежевый
Холодный розовый оттенок
Купить сейчас
2C3 Fresco
холодный розовый оттенок
Купить сейчас
2C4 Ivory Rose
светлый средний с холодным розовым оттенком (только онлайн)
Купить сейчас
Light+YellowВыберите свой оттенок
2W0 Теплая ваниль
Теплый золотистый оттенок & золотистый
Купить сейчас
2W1 Dawn
теплый оттенок золотистого & золотистый
Купить сейчас
2W2 Rattan
теплый оттенок золотистого и золотой
Купить сейчас
Светлый + нейтральный
Выберите свой оттенок
2N1 Пустынный бежевый
нейтральный розовый оттенок & золотистый
Купить сейчас
2N2 Buff
нейтральный розовый оттенок & золотой
Купить сейчас
Средний
Выберите свой оттенок
Средний+розовый
Выберите свой оттенок
3C1 Dusk
холодный розовый оттенок
Купить сейчас
3C2 Pebble
прохладный оттенок розового
Купить сейчас
3C3 Sandbar
средний с холодным, розово-бежевым оттенком (только онлайн)
Купить сейчас
средний+желтый
Выберите свой оттенок
3W1 Tawny
Теплый подставка Golden
Shop Now
3W1,5 FALL
Теплый оттенок золотой (только онлайн)
Shop Now
3W2 CASHTONE
HAPTONE GOLDETON
Купить сейчас
Средний+Нейтральный
Выберите свой оттенок
3N1 Бежевая слоновая кость
нейтральный розовый оттенок & золотистый
Купить сейчас
3N2 Пшеничный
нейтральный розовый оттенок & золотой
Купить сейчас
Средне-темный
Выберите свой оттенок
Средний темный+розовый
Выберите свой оттенок
4C1 Outdoor Beige
средний загар с холодным розовым оттенком (только онлайн)
Купить
4C2 Темно-рыжий
Средне-коричневый с холодным красным подтоном
Купить
4C3 Мягкий загар
Холодный розовый оттенок
Купить
Medium Dark00Yellow
Select Your Shade
4W1 Honey Bronze
warm undertone golden
Shop Now
4W2 Toasty Toffee
warm undertone golden
Shop Now
4W3 Henna
medium tan w/ warm red undertones
Купить сейчас
4W4 Ореховый
средний загар с теплым золотисто-оливковым оттенком
Купить сейчас
Средний темный + нейтральный
Выберите свой оттенок
4N1 Shell Beige
нейтральный розовый оттенок & золотистый
Купить сейчас
4N2 Spiced Sand
нейтральный розовый оттенок & золотистый
Купить сейчас
4N3 Maple Sugar
средне-коричневый с нейтральным красным оттенком
Купить сейчас
Темный
Выберите свой оттенок
Темно-розовый
Выберите свой оттенок
5C1 Насыщенный каштановый
Холодный розовый оттенок
Купить сейчас
5C2 Сепия
Глубокий с холодным красным оттенком
Купить Dark+5
Выберите свой оттенок
5W1 Bronze
Золотистый с теплым оттенком
Купить сейчас
5W2 Rich Caramel
Золотистый с теплым оттенком
Купить сейчас
5W1.
5 Cinnamonтеплый оттенок золотистого (только онлайн)
Купить сейчас
Dark+Neutral
Выберите свой оттенок
5N1 Rich Ginger
Нейтральный оттенок Rosy & Golden
Shop Now
5N1,5 Клен
Глубоко с нейтральным, золотисто-красные оттенки
теперь
5N22 Amber Honey
Newnetone Nelectone Nelectone Nelectone Natural Ride. розовый и золотой
Купить сейчас
Deep
Выберите свой оттенок
глубокий + розовый
Select Your Shade
6C1 Rich Cocoa
cool undertone rosy
Shop Now
6C2 Pecan
cool undertone rosy
Shop Now
7C1 Rich Mahogany
cool undertone rosy
Shop Now
7C2 Sienna
очень темный с холодным насыщенным красным оттенком
Купить сейчас
8C1 Rich Java
самый глубокий с холодным коричневым оттенком
Купить сейчас
глубокий+желтый
Выберите свой оттенок
6W1 Сандаловый дерево
теплый оттенок золотой
магазин сейчас
6W2 Nutmeg
Теплый оттенок Golden
Shop Now
7W1 Deep Spice
Warm Boldetone Golden
7W1 Deep Spice
Hapenoone Golden
7 WOT1
9000.