где учиться, зарплата, плюсы и минусы
Бэк-энд разработчик (с англ. back-end (оборотная сторона) developer) — это специалист, который занимается программно-административной частью веб-приложения, внутренним содержанием системы, серверными технологиями — базой данных, архитектурой, программной логикой. Профессия подходит тем, кого интересует информатика (см. выбор профессии по интересу к школьным предметам).
Читайте также:
Бэк-энд разработчик — боец невидимого фронта.
Современные сайты, веб-приложения и игры стали очень сложными, поэтому над ними работает целая команда специалистов. Чтобы создать полноценный, красивый, функциональный и удобный для пользователя сайт, необходима согласованная работа фронт-энд и бэк-энд разработчиков. Это убыстряет работу по созданию сайта или веб-приложения и облегчает его обслуживание.
Говоря образно, бэк-энд разработка — это создание двигателя автомобиля, в то время как фронт-энд разработка — это создание дизайна и функций управления машины. Бэк-энд разработчик работает в тесной связи с фронт-энд разработчиком, получая от него пользовательскую информацию и возвращая ему обработанный результат.
Основные инструменты бэк-енд разработчика — серверные языки программирования: такие как PHP, Python, Ruby, Java, Perl, Node JS (программная платформа). Дополнительно к Node JS полезно изучить Express (библиотека для взаимодействия платформы Node JS с сервером) и Mongo DB (базу данных для получения и хранения информации).
В качестве дополнительных средств применяются фреймворки Symfony, Codeigniter, Yii, Zend Framework, Kohana и др. С целью хранения данных используются MySQL/SQLite.
Особенности профессии
Современным разработчикам недостаточно только писать код для программ. Так работали программисты 10-15 лет назад. В настоящее время такой термин неуместен, потому что в работе часто можно обойтись без написания кода, просто соединяя между собой готовые части в единую конфигурацию. И программистов сейчас называют «разработчик» или «инженер».
С развитием IT-сферы проекты становятся всё более сложными и представляют собой конструктор, который можно собрать, используя готовые решения (фреймворки) практически для любых задач.
Таким образом, функционал бэк-энд разработчика выглядит следующим образом:
- проектирование архитектуры сервиса;
- создание ядра сайта;
- разработка платформы и основного функционала;
- работа с архитектурой кода;
- разработка приложений, поддерживающих пользовательский интерфейс и безопасность;
- контроль за состо
Front-end и Back-end разработка — отличия и проф.стандарты
Разработка веб-ресурсов предусматривает совместную работу дизайнеров и программистов. Большинство интернет-пользователей ошибочно считает, что работа этих специалистов ничем не отличается.
Для того чтобы понять основные отличия между услугами дизайнеров и программистов, следует сравнить особенности Front-end и Back-end разработки. Под этими понятиями подразумевается процедура создания сайта, поделенная на клиентскую и серверную составляющие.
Особенности Front-end и Back-end разработки
Front-end разработка – это клиентская составляющая процесса создания веб-ресурсов, предусматривающая формирование макета сайта, шаблонов, интерфейса и скриптов, которые отвечают за визуализацию. На этом этапе разработки также выполняется CSS-верстка.
Back-end разработка – это серверная составляющая процедуры создания веб-ресурса, предполагающая разработку ядра, платформы, а также административной и функциональной составляющей.
Для понимания особенностей данных частей процедуры создания сайта стоит привести простой пример. Представим ресторан. К «клиентской» части ресторана относятся декорации, музыка и мебель.
«Серверная» часть этого заведения представлена работой поваров, официантов и менеджеров, отвечающих за бесперебойное предоставление основных услуг.
Front-end vs. Back-end разработка
Разобравшись с тем, что такое фронтенд и бэкенд разработка, следует перейти к детальному описанию обоих составляющих процесса создания веб-ресурсов. Фронт-енд разработка предусматривает создание интерфейса и дизайна сайта. За этот процесс обычно отвечают веб-дизайнеры.
А вот ответственность за бэк-енд разработку лежит на плечах программистов, которые создают код, обеспечивающий бесперебойную работу ресурса. Back-end разработчики обеспечивают динамическую поддержку сайтов.
Front-end разработчики в основном используют 3 языка – CSS, HTML и Javascript. А вот бек-энд разработчики в своей деятельности используют Python, Ruby,.NET, Postgre SQL, MySQL и MongoDB.
Среда разработки
Фронтенд разработка предусматривает применение внешнего интерфейса для разработки дизайна. В обязанности Front-end разработчиков входит не только изменения дизайна, но и изучение поведения пользователей.
Бекэнд разработка предполагает работу с кодом, который необходим для создания приложений и поддержки клиентского интерфейса. Разработчики, специализирующиеся на серверной части создания веб-ресурсов, также отвечают за безопасность и возможность управления контентом.
Стоит заметить, что бекэнд может выполняться без клиентской части процесса разработки. А вот фронтэнд разработка зависима от серверной составляющей процесса за исключением тех случаев, когда дизайн сайта продается в качестве шаблонов.
Цели
С чего начать фронтенд разработку? Обычно этот процесс начинается с постановки цели. Разработчики должны постоянно следить за доступностью сайта на любых устройствах. А вот бекэнд разработчики отвечают за создание приложений и поддержку внешнего интерфейса. Именно эти специалисты отвечают за функциональную составляющую сайта.
В завершение необходимо сказать, что бекэнд функционирует на стороне сервера, фронтэнд – на стороне клиента. Подобное разделение «обязанностей» способствует существенному ускорению процедуры разработки и обслуживания сайта. Поэтому Front-end и Back-end разработку можно назвать неделимыми составляющими успешной работы любого веб-ресурса.
Теги:Что нужно знать, чтобы стать бэкенд-разработчиком в 2018
В этой статье речь пойдёт о том, какими языками и инструментами необходимо овладеть, чтобы стать бэкенд-разработчиком в 2018 году.
Фронтенд – это веб-страницы, которые вы просматриваете и взаимодействуете с ними в браузере. Но как веб-страницы вообще попадают в интернет? Каждый раз, когда вы вводите URL в поисковой строке, переходите по ссылке или заполняете форму, браузер подключается к серверу. Когда пользователь запрашивает у сервера какой-либо ресурс, сервер предоставляет его пользователю. Сделать с помощью языка программирования так, чтобы сервер предоставлял пользователю то, что он запрашивает – главная задача бэкендера.
За что конкретно ответственен бэкенд-разработчик?
Бэкенд-разработчики пишут программы, которые обрабатывают:
Пользовательские данные
Большинство веб-приложений позволяют юзерам заполнять различные формы данными, а бэкенд-разработчик ответственен за их хранение и корректное отображение только для тех пользователей, которые имеют к ним доступ.
На серверной стороне веб-приложения также хранятся данные платёжных методов пользователей вроде кредитных карт или интернет-кошельков. Некоторые бэкенд-разработчики несут ответственность за безопасное хранение этих данных и корректное проведение транзакций.
API (Application Programming Interfaces)
С помощью API другие программы и мобильные устройства могут получать доступ к ресурсам веб-приложения. Создание API – это распространённая практика среди разработчиков веб-приложений, так что, чтобы стать бэкенд-разработчиком, нужно уметь создавать API, либо, как минимум, уметь взаимодействовать с API других веб-приложений.
Какими технологиями необходимо овладеть, чтобы стать бэкенд-разработчиком?
Ответ сервера на запрос пользователя требует нескольких шагов, и каждый из них использует свой тип ПО. Комбинация технологий, используемых на определённом веб-сервере, называется стеком технологий. Вообще, выбор веб-серверов, языков, фреймворков и баз данных огромен, но они все довольно похожи. Поэтому, программисту, желающему стать бэкенд-разработчиком, достаточно выучить хотя бы по одной технологии из каждого уровня стека, чтобы претендовать на должность бэкендера, а тонкостям работы со стеком определенного проекта в компаниях обычно обучают на месте. Типичный стек технологий состоит из следующих элементов:
Серверное ПО (обычно говорят просто «веб-сервер»)
Среди популярных веб-серверов можно отметить:
- Apache
- nginx
- Microsoft IIS (Internet Information Services)
Фреймворки, библиотеки и прочие инструменты
Вот некоторые из наиболее популярных:
JavaScript
Java
- Spring
- Hibernate
- JSF (JavaServer Faces)
- Python
- C#
Достаточно овладеть хотя бы одним из языков и перечисленных инструментов, чтобы повысить шансы стать бэкенд-разработчиком и найти работу.
Также не обойтись без:
Чтобы связать код, написанный бэкенд-разработчиком, с базой данных, используется ORM (Object Relational Mapping), – технология, с помощью которой данные из БД конвертируются в объекты. Большинство баз данных используют SQL (Structured Query Language) для доступа к данным. ORM-библиотека автоматически пишет необходимые фреймворку запросы. Однако ORM не может написать за вас какой-либо сложный запрос: это придётся делать вручную. Так что
Наиболее популярными СУБД являются:
- MySQL
- SQL Server
- PostgreSQL
Если вы освоите хотя бы одну из них, то без проблем сможете работать практически с любой СУБД.
HTML (ну куда же без него!)
Как только программа на стороне сервера получает запрашиваемые из БД данные, бэкенд-разработчику необходимо вставить их в страницы, написанные фронтендерами, поэтому знание HTML также обязательно.
Если вы занимаетесь поддержкой API, то вам необходимо также знать JSON или XML, так как данные, предоставляемые для API сервером, конвертируют в один из этих языков. В идеале стоит разбираться и в JSON, и в XML.
Системы контроля версий
Без систем контроля версий сейчас проекты никто не разрабатывает. Даже те, кто разрабатывает приложение в одиночку, зачастую используют их, так что о командных проектах даже говорить не приходится. Поэтому знание Git сейчас обязательно для любого программиста, вне зависимости от того, хотите вы стать бекэнд-разработчиком или писать плагины для Sublime Text.
А ещё обратите внимание на облачные платформы:
- Amazon Web Services
- Heroku
- Google Cloud Platform
- Windows Azure
Облачные платформы сейчас популярны. Они предоставляют веб-приложениям необходимые мощности и значительно облегчают их поддержку. Подобные знания требуется во многих компаниях на должность бэкенд-разработчика.
В заключение
Если вы в этой теме новичок и только планируете стать бэкендером, начните со всё тех же «трёх китов веба» в виде HTML, CSS, JS. Бэкенд-технологии, в отличие от фронтенда, более стабильны поэтому, изучив хотя бы один язык, фреймворк и СУБД, вы будете готовы разрабатывать свои веб-приложения, и ваши навыки не так быстро устареют. Хотя это также не отменяет того факта, что вам предстоит постоянно обучаться и совершенствовать навыки разработки.
Источник
Как достичь успеха в сфере IT: интервью с бэкенд-разработчиком
Любой крупный сайт состоит из трех частей: фронт, бэк и база. Пользователь взаимодействует с фронтом через кнопки интерфейса, фронт отправляет запросы бэку, а тот, в свою очередь, принимает запросы, обрабатывает их, пишет в базу/читает из базы, отправляет ответ обратно. Фронт показывает ответ человеку. Примерно так работает любой интернет-ресурс. Наладить этот механизм призваны IT-разработчики. В этот раз мы совместно с ребятами из SkillFactory решили поговорить с представителем одной из наиболее востребованных сегодня профессий и узнать, как в нее попасть и что это может дать.
В чём заключается работа бэкенд-разработчика?
Работа бэкенд-разработчика заключается в написании логики обработки запросов. Среди «разрабов» есть шутка, что бэкенд нужен, чтобы перекладывать JSONы. JSON — это один из популярных форматов текстового сообщения. То есть рабочий день любого бэкенд-сервиса похож на день клерка: среди горы макулатуры сидит скучный человек, а на него сверху сыпятся всё новые бумаги. И ему нужно каждую из них распределить по отдельным папкам, отделам и прочему.
Разработчик бэкенда — это тот, кто пишет инструкцию для такого клерка. Например, если пришел документ, нужно:
1. Посмотреть на дату исполнения. Если дата истекла — нужно выкинуть документ.
2. Посмотреть на отдел назначения. Если это не твой отдел — поставить печать «Не тот отдел» и отправить документ обратно.
3. Обратить внимание на форму документа.
3.1 Если форма У-0236 — надо отправить в ответ форму З-1348.
И так далее.
После такого объяснения бэкенд-разработка может показаться скучной, но самое интересное начинается, когда запросов становится сотни и тысячи в секунду, а ресурсов мало. Тогда нужно запускать множество сервисов параллельно, синхронизировать их работу между собой, продумывать варианты оптимизации. И максимальное удовольствие наступает в момент, когда находится простое решение, налаживающее такой сложный процесс. Настоящий катарсис.
Где вы учились и с чего начинали свой пусть в бэкенде?
Я учился в Армавирском механико-технологическом институте на специальности «Программное обеспечение вычислительной техники и автоматизированных систем». Это небольшой провинциальный институт, но некоторые преподаватели были очень толковыми, да и в целом там было весело.
Моя первая работа была в небольшом банке, в отделе сопровождения систем интеграции. Там мы писали самодельные сервисы для поддержания консистентности (согласованности) данных в гетерогенной среде. Проще говоря, каждому новому сотруднику банка для работы требовалась учетная запись во множестве систем — в домене, на портале, в трекере задач. Так же и при увольнении, чтобы аккаунт удалялся или блокировался.
Реализовано всё было элементарно: программа запускалась по таймеру раз в 15 минут и сравнивала все записи во всех системах по очереди. То есть никакой параллельности и сложных штук не было. Но за время работы там я «пощупал» много разных баз данных (Oracle, MS SQL, MySql) — каждая со своим синтаксисом. Также научился паре золотых заповедей вроде «работает — не трогай».
Насколько реально самостоятельно научиться разработке и какой уровень будет у такого самоучки?
Если в самом начале пути у него будет опытный наставник — это даст потрясающий фундамент, так гораздо легче воспринимать новые знания. Но база — это 20 % от того, что должен знать опытный специалист.
Практикующий разработчик не может остановиться и сказать: «Я теперь всё знаю». Необходимо постоянно учиться чему-то новому. Льюис Кэрролл когда-то писал: «Чтобы оставаться на месте, нужно бежать со всех ног, а чтобы куда-то попасть — надо бежать как минимум вдвое быстрее!» Это самое точное положение дел работника IT-отрасли.
Чем отличается классическое университетское образование в сфере IT от курсов разработчиков?
На мой взгляд, это взаимодополняющие вещи. Университетское образование дает хорошую базу — курсы показывают множество практических способов применения.
Идеальным вариантом для меня было закончить хороший вуз, с 3–4 курса стажироваться в IT-компании и периодически повышать квалификацию на курсах. Еще один важный момент: с дипломом вуза иногда гораздо легче уехать работать за границу.
Но даже если у тебя нет профильного образования в IT, это не значит, что работать в этой сфере ты не сможешь. Сегодня на курсах дается похожий теоретический базис, но в более сжатом объеме, и студенты, приходящие на них с полным отсутствием знаний, получают все необходимые навыки и впоследствии умеют их применять.
В школе Skillfactory проводятся курсы по Full-stack-веб-разработке, на которых можно не только стать компетентным бэкенд-разработчиком на одном из наиболее популярных языков программирования Python, но также освоить фронтенд, закрепив мощную теоретическую базу на практической плоскости.
Подробнее о курсах
Какие качества и навыки необходимы современному бэкенд-разработчику?
Веб-разработка не rocket science (ракетостроение) — здесь совсем необязательно быть гением. Достаточно обладать аккуратностью и внимательностью.
Какой уровень востребованности у данной профессии и какие условия сейчас предлагает рынок труда для бэкенд-специалистов?
Бэкенд-разработчики могут работать там, где есть сайты и информационные системы, то есть практически везде. Для новичков, правда, всё довольно сложно устроено. Некоторые крупные компании берут студентов-стажеров и при этом даже платят какие-то деньги. Нужно быть в офисе некоторое количество часов в неделю, выполнять какие-то задачи.
Это трудно осуществить, потому что параллельно нужно учиться, но зато такой сценарий дает почти 100% вероятность попасть в штат на полный оклад после окончания учебы. К примеру, в моей компании в прошлом году на место стажера был конкурс около 140 человек.
Представим такой сценарий: ты бэкенд-разработчик на распространенном стеке (PHP, C#, Java, Go, Python), который создавал сайты друзьям, но опыта работы в организации нет. Твоя квалификация — junior (джун).
Чтобы получить должность junior backend developer, тебе может потребоваться 10–15 попыток и 2–3 месяца походов по собеседованиям. После каждого собеседования будет полезно запрашивать у компании обратную связь о результатах интервью. После — подтягивать пробелы в знаниях и идти на следующее собеседование. Зарплаты у джунов небольшие, задачи обычно не особо интересные, но им нужно набраться терпения и ответственности, получить опыт, прокачать скиллы.
Далее, предположим, ты много работал, читал книги, проходил курсы — и спустя 3 года решил сменить работу. Теперь твоя квалификация — крепкий middle (мидл). Тебя не интересует конкретная фирма — ты готов работать в офисе в любом районе города и хочешь среднюю зарплату по рынку. Я думаю, что в Москве ты выйдешь на новую работу уже через 2–3 дня.
На кандидатов с промышленным опытом работы больше пяти лет уровень востребованности очень высок. На рынке всегда дефицит квалифицированных разработчиков. Таким людям компании предлагают огромные зарплаты, жирнейший ДМС, компенсации питания, спортзалов и больничных, психолога и массажиста в штате. Корпоративным ноутбуком и гибким графиком уже никого не удивить. У некоторых ребят в офисе вообще бесплатная еда, бильярд и спальные капсулы.
Курсы в Skillfactory призваны научить качественно выполнять те функции, которые встречаются в 80 % всех задач как на штатной работе, так и на фрилансе. К тому же по окончании курсов лучшие выпускники получают возможность пройти стажировку и устроиться в штат на постоянную работу в компаниях-партнерах.
Записаться на курс веб-разработки
Деньги являются одним из главных критериев успеха, но если не опираться на них — как оценивать успешного разработчика?
С точки зрения бизнеса успешный разработчик — это тот, кто говорит: «Я решу эту задачу за Х часов» — и делает это. При этом всё работает, а то, что работало раньше, не сломалось.
Я же считаю, что успешный коллега-разработчик — тот, кто решает задачу так, что ее решение понятно, красиво, лаконично, гибко. И я могу воспользоваться этим методом для решения своих собственных задач.
Сегодня технологии меняются очень стремительно. Как в таких условиях создать продукт, который будет актуален всегда?
Постоянно его переписывать на всё более новые технологии. Только так.
Какой потолок амбиций/возможностей в самореализации в работе бэкенд-разработчиком?
У кодеров (разработчиков, пишущих код) есть стандартная «лесенка» квалификации: стажер — джун — миддл — сеньор. Больше знаний — больше денег, больше ответственности.
Если у тебя есть лидерские навыки, то можно вырасти в тимлида, если стратегическое мышление — в архитектора. Если есть желание отойти от железа и больше разобраться в бизнесе, можно стать начальником отдела-начальника или техническим директором. Люди на этих должностях уже не пишут кодов.
Многие коллеги на работе, что называется, зарабатывают деньги, а в свободное время делают проекты «для души».
В школе SkillFactory обучение ориентировано непосредственно на практику. Девятимесячные интенсивные курсы разработки направлены на то, чтобы дать студентам возможность получить актуальные знания в программировании и применить их на деле. На курсах учащиеся смогут перенять мастерство веб-разработки у опытного профессионала, получить от него помощь и поддержку и сходу начать зарабатывать деньги на создании сайтов и веб-приложений.
Записаться на курсы программирования
Один стендап в Яндекс.Такси, или Чему нужно научить бэкенд-разработчика
Моё имя Олег Ермаков, я работаю в команде бэкенд-разработки приложения Яндекс.Такси. У нас принято проводить ежедневные стендапы, где каждый из нас рассказывает о сделанных за день задачах. Вот как это бывает…Имена сотрудников может и изменены, а вот задачи вполне себе реальны!
На часах 12:45, вся команда собирается в переговорке. Первым слово берет Иван, стажёр-разработчик.
Иван:
Я работал над задачей отображения всех возможных вариантов сумм, которые пассажир мог дать водителю при известной стоимости поездки. Задача достаточно известная — называется «Размен монет». С учётом специфики добавил в алгоритм несколько оптимизаций. Отдал пул-реквест на ревью еще позавчера, но с тех пор я исправляю замечания.По довольной улыбке Анны стало понятно, чьи замечания исправляет Иван.
В первую очередь произвёл минимальную декомпозицию алгоритма, раcхардкодил получение банкнот. В первой реализации возможные банкноты были прописаны в коде, поэтому вынес их в конфиг по странам.
Добавил комментариев на будущее, чтобы любой читающий мог быстро разобраться в алгоритме:
for exception in self.exceptions[banknote]: exc_value = value + exception.delta if exc_value - cost >= banknote: continue if exc_value > cost >= exception.banknote: banknote_results.append(exc_value) # основные разветвления алгоритма дают некратные купюры for exception in self.exceptions[banknote]: # для таких исключений можно посчитать результат по остатку от # деления таких купюр exc_value = value + exception.delta # но при этом результат не может получиться больше самой банкноты # (corner case) if exc_value - cost >= banknote: continue if exc_value > cost >= exception.banknote: banknote_results.append(exc_value)
Ну и, естественно, остаток времени потратил на покрытие всего кода тестами.RUB = [1, 2, 5, 10, 50, 100, 200, 500, 1000, 2000, 5000] CUSTOM_BANKNOTES = [1, 3, 7, 11] @pytest.mark.parametrize( 'cost, banknotes, expected_changes', [ # no banknotes ( 321, [], [], ), # zero cost ( 0, RUB, [], ), # negative cost ( -13, RUB, [], ), # simple testcase ( 264, RUB, [265, 270, 300, 400, 500, 1000, 2000, 5000], ), # cost bigger than max banknote ( 6120, RUB, [6121, 6150, 6200, 6300, 6500, 7000, 8000, 10000], ), # min cost ( 1, RUB, [2, 5, 10, 50, 100, 200, 500, 1000, 2000, 5000], ), ... ], )
Помимо обычных тестов, которые запускаются при каждом билде проекта, написал тест, использующий алгоритм без оптимизаций (считай — полный перебор). Результат работы этого алгоритма для каждой купюры из первых 10 тысяч случаев положил в файл и прогнал отдельно на алгоритме с оптимизациями, чтобы быть уверенным, что он действительно работает верно.
Давайте на минуту отвлечёмся от стендапа и подведем локальные итоги всего того, о чём говорит Иван. При написании кода основная цель — обеспечить его работоспособность. Чтобы эта цель была достигнута, необходимо выполнить следующие задачи:
- Декомпозировать бизнес-логику на атомарные фрагменты. Читаемость усложняется при просмотре полотна кода, написанного в одной функции.
- Добавить комментарии в «особо сложные» части кода. У нас в команде следующий подход: если на код-ревью задают вопрос по поводу реализации (просят объяснить алгоритм), то необходимо добавить комментарий. А ещё лучше подумать об этом заранее и добавить его самому.
- Написать тесты, покрывающие основные ветви выполнения алгоритмов. Тесты — не только метод проверки работоспособности кода. Они ещё выполняют роль примера использования вашего модуля.
Увы, но даже специалисты с многолетним опытом не всегда используют эти подходы в своей работе. В Школе бэкенд-разработки, которую мы сейчас делаем, студенты получат практические навыки написания архитектурно качественного кода. Ещё одна наша цель — распространение практик покрытия проекта тестами.
Но вернёмся на стендап. После Ивана выступает Анна.
Анна:
Я разрабатываю микросервис отдачи промотирующих изображений. Как вы помните, сервис изначально отдавал статичные данные-стабы. Затем тестировщики попросили кастомизировать их, и я вынесла их в конфиг, а сейчас делаю «честную» реализацию с отдачей данных из базы (PostgreSQL 10.9). Мне очень помогла заложенная изначально декомпозиция, в рамках которой интерфейс получения данных в бизнес-логике не меняется, а каждый новый источник (будь то конфиг, база данных или внешний микросервис) лишь реализует свою логику.Вадим:Я проверила написанную систему под нагрузкой, тестирование показало, что ручка начинает резко тормозить, когда мы ходим в БД. По explain увидела, что индекс не используется. Пока не придумала, как пофиксить.
А что за запрос?Аня:
Два условия под OR:Вадим:SELECT * FROM table_1 JOIN table_2 ON table_1.some_id = table_2.some_id WHERE (table_2.attr1 = 'val' OR table_1.attr2 IN ('val1', 'val2')) AND table_1.deleted_at IS NULL AND table_2.deleted_at IS NULL ORDER BY table_2.created_at
Explain запроса показал, что в нём не используется один из индексов по атрибутам attr1 таблицы table_2 и attr2 таблицы table_1.
Сталкивался с аналогичным поведением в MySQL, проблема как раз в условии по OR, из-за которого используется лишь один индекс, скажем, attr2. А второе условие использует seq scan — полный проход по таблице. Запрос можно разбить на два независимых запроса. Как вариант — разделить и замержить результат запросов на стороне бэкенда. Но тогда нужно подумать над тем, чтобы обернуть эти два запроса в транзакцию, либо объединить их с помощью UNION — по сути, на стороне базы:Аня:SELECT * FROM table_1 JOIN table_2 ON table_1.some_id = table_2.some_id WHERE (table_2.attr1 = 'val') AND table_1.deleted_at IS NULL AND table_2.deleted_at IS NULL ORDER BY table_2.created_at SELECT * FROM table_1 JOIN table_2 ON table_1.some_id = table_2.some_id WHERE (table_1.attr2 IN ('val1' , 'val2')) AND table_1.deleted_at IS NULL AND table_2.deleted_at IS NULL ORDER BY table_2.created_at
Спасибо, попробую ^_^
Снова подведём итоги:
- Почти все задачи продуктовой разработки связаны с получением записей из внешних источников (сервисов или баз данных). Нужно тщательно подойти к вопросу декомпозиции классов, выгружающих данные. Правильно спроектированные классы позволят вам без проблем писать тесты и модифицировать источники данных.
- Чтобы эффективно работать с БД, нужно знать особенности выполнения запросов, например разбираться в explain.
Работа с информацией и организация потоков данных — неотъемлемая часть задач любого бэкенд-разработчика. Школа познакомит с архитектурой взаимодействия сервисов (и источников данных). Студенты научатся работать с базами архитектурно и с точки зрения эксплуатации — миграции данных и тестирования.
Последним на встрече выступает Вадим.
Вадим:
Я на неделе дежурил, разбирал очередь инцидентов. Одна нелепая ошибка в коде заняла ну очень много времени: в проде не было логов по запросу, хотя их создание было прописано в коде.По скорбному молчанию всех присутствующих понятно — все уже так или иначе сталкивались с проблемой.
Для получения всех логов в рамках запроса используется request_id, который прокидывается во все записи в следующем виде:
# запись без request_id logger.info( 'my log msg', ) # запись с request_id logger.info( 'my log msg', extra=log_extra, # здесь передается request_id — связующая информация о запросе )
log_extra — это словарь с метаинформацией запроса, ключи и значения которого будут записаны в лог. Без передачи log_extra в функцию логирования запись не будет связана со всеми другими логами, потому что в ней не будет request_id.Пришлось исправлять ошибку в сервисе, перевыкатывать его и лишь потом разбираться с инцидентом. Такое случается уже не первый раз. Чтобы больше это не повторялось, я постарался исправить проблему глобально и избавиться от log_extra.
Сначала я написал враппер над стандартным исполнением запроса:
async def handle(self, request, handler): log_extra = request['log_extra'] log_extra_manager.set_log_extra(log_extra) return await handler(request)
Нужно было решить, каким образом хранить log_extra в рамках одного запроса. Здесь было два варианта. Первый — изменить task_factory для eventloop из asyncio:class LogExtraManager: __init__(self, context: Any, settings: typing.Optional[Dict[str, dict]], activations_parameters: list) -> None: loop = asyncio.get_event_loop() task_factory = loop.get_task_factory() if task_factory is None: task_factory = _default_task_factory @functools.wraps(task_factory) def log_extrad_factory(ev_loop, coro): child_task = task_factory(ev_loop, coro) parent_task = asyncio.Task.current_task(loop=ev_loop) log_extra = getattr(parent_task, LOG_EXTRA_CONTEXT_KEY, None) setattr(child_task, LOG_EXTRA_CONTEXT_KEY, log_extra) return child_task # updating loop, so any created task will # get the log_extra of its parent loop.set_task_factory(log_extrad_factory) def set_log_extra(log_extra: dict): loop = asyncio.get_event_loop() task = asyncio.Task.current_task(loop=loop) setattr(task, LOG_EXTRA_CONTEXT_KEY, log_extra)
Второй вариант — «протолкнуть» через команду инфраструктуры переход на Python 3.7 для использования contextvars:log_extra_var = contextvars.ContextVar(LOG_EXTRA_CONTEXT_KEY) class LogExtraManager: def set_log_extra(log_extra: dict): log_extra_var.set(log_extra)
Ну и дальше нужно было пробросить сохраненную в контексте log_extra в logger.class LogExtraFactory(logging.LogRecord): # this class allows to create log rows with log_extra in the record def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) task = asyncio.Task.current_task() log_extra = getattr(task, LOG_EXTRA_CONTEXT_KEY, None) if not log_extra: return for key in log_extra: self.__dict__[key] = log_extra[key] logging.setLogRecordFactory(LogExtraFactory)
Итоги:
- В Яндекс.Такси (да и повсеместно в Яндексе) активно используется asyncio. Важно не только уметь его использовать, но и понимать его внутреннее устройство.
- Выработайте в себе привычку читать чейнджлоги всех новых версий языка, думайте, как вы можете облегчить жизнь себе и коллегам с помощью нововведений.
- При работе со стандартными библиотеками не бойтесь залезать в их исходный код и разбираться в их устройстве. Это очень полезный навык, который позволит вам глубже понять работу модуля и откроет новые возможности в реализации фич.
Преподаватели Школы бэкенда съели не один пуд соли и набили уйму шишек в асинхронной работе сервисов. Они расскажут студентам об особенностях асинхронной работы Python — и на уровне применения на практике, и в части разбора внутренностей пакетов.
Книги и ссылки
В изучении Python вам могут помочь:
- Три книги: Python Cookbook, Diving Into Python 3 и Python Tricks.
- Видеолекции таких столпов IT-индустрии, как Реймонд Хеттингер и Дэвид Бизли. Из видеолекций первого можно выделить доклад «Beyond PEP 8 — Best practices for beautiful intelligible code». У Бизли советую посмотреть выступление про asyncio.
Чтобы обрести более высокоуровневое понимание архитектуры, прочтите книги:
- «Высоконагруженные приложения». Здесь подробно расписаны вопросы взаимодействия с данными (кодирование данных, работа с распределёнными данными, репликация, секционирование, транзакции и т. д.).
- «Микросервисы. Паттерны разработки и рефакторинга». В книге показаны основные подходы к микросервисной архитектуре, описаны недостатки и проблемы, с которыми приходится сталкиваться при переходе с монолита на микросервисы. В посте про них почти ничего нет, но всё равно советую прочитать эту книгу. Вы начнёте понимать тенденции в построении архитектур и изучите основные практики декомпозиции кода.
Ещё один из самых важных навыков, который можно до бесконечности развивать в себе, — это чтение чужого кода. Если вдруг вы понимаете, что редко читаете чужой код — советую выработать в себе привычку регулярно смотреть новые популярные репозитории.
Стендап закончился, все разошлись по рабочим местам.