1 n 2 3n 2: Упростите выражение: 1-n+n^2-(3n^2-2n+5)-7n ^2- это n в квадрате

2

Содержание

Дата-инженер Skyeng о Python, Bash-е и своей рабочей практике — Разработка на vc.ru

132 просмотров

Рассказывает Денис Наумов — техлид и дата-инженер Skyeng, автор курса Python для инженеров.

У Дениса за плечами более 5 лет в разработке и анализе данных на Пайтоне. Выстраивает системы реагирования на триггерные события во взаимодействии пользователя с продуктами, а в качестве DataOps развивает аналитические инфраструктуры и управляет потоками данных.

Краткий экскурс в историю

Устроившись на первую работу в 2014 году, Денис сразу стал писать на C и C++. Компания разрабатывала веб-сервисы и приложения, как все. Была своя специфика, но ничего сверхъестественного.

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

Следовательно, на тестирование и отладку уходит больше времени и ресурсов. Все это увеличивает Time to Market.

Компании постоянно нужен был человек с низкоуровневым стеком, который будет согласен (и способен) писать веб-приложения. Найти такого было затруднительно, поэтому начали рассматривать альтернативы, что привело к Пайтону — самому удачному варианту на рынке на тот момент. Сейчас по удобству и производительности большую конкуренцию Пайтону составляет 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *