Нужно ли выносить решения на командное голосование — спорный вопрос и предмет большого холивара. Многие методологи считают, что менеджер должен все решения принимать самостоятельно. Хотите что-то внедрить — внедряйте. Но предположим, вы придерживаетесь другого мнения, либо у вас действительно есть вопросы, которые лучше выставить на командное голосование.
Проблема в том, что обычно голосуют с бинарными вариантами ответов — либо за, либо против. Такой вариант не учитывает, что есть колеблющиеся люди. Можно для них ввести вариант ответа «воздержался», но я хочу рассказать о способе, который лучше и нагляднее.
Вы озвучиваете предмет голосования, участники задают вопросы, после чего приступают к голосованию. Участники демонстрируют своё мнение, показывая руку, от кулака до пяти открытых пальцев на камеру или отправляя соответствующий эмодзи в чат, если вы без камер. В частности:
👊 Закрытый кулак означает сильное несогласие или полное «нет».
👆 Один палец указывает на огромные сомнения по поводу предложенного решения.
✌️ Два пальца означают, что по решению есть сомнения, которые необходимо обсудить, прежде чем принять решение.
🤟 Три пальца свидетельствуют о том, что вы не против попробовать, но есть пара моментов, которые нужно учесть после принятия решения.
🤘🤘 Четыре пальца означают согласие, но с некоторыми мелкими сомнениями.
🖐️ Пять пальцев демонстрируют полное согласие, энтузиазм по поводу решения, отчётливое «да».
Если мнения, преимущественно от трёх до пяти, решение можно считать принятым. Если много троек — обсуждаем сомнения. Если преобладают двойки, единицы и кулаки, решение отклоняется.
Методика позволяет быстро понять отношение группы к вопросу, без необходимости тратить время, давая традиционно высказаться каждому члену команды. Она стимулирует участие каждого члена команды, повышая вовлечённость в принятие решений. Она провоцирует диалог по обсуждаемому вопросу.
Я всё же противник голосований, но если голосовать — то методом Fist to Five.
Если вы, как и 3,95 млрд человек, пользуетесь смартфоном, не можете не столкнуться с пушами. Сообщение, иногда с картинкой, прилетает в шторку уведомлений и отвлекает на себя внимание. Самая большая засада, когда у приложения нет опций, какие именно пуши слать, а какие не надо и вы не можете отписаться от них полностью, чтобы не пропускать важные уведомления. Простыми словами — вы хотите получать от банка пуши о транзакциях, но не хотите рекламу, но отключить можно только сразу всё. Приходится мириться. Пожалуйста, разрешайте в своих приложениях отключать рекламные пуши. А пока давайте разберёмся, что это такое и как работает с точки зрения пиэма.
Изначально эта технология не имела отношения к мобильным устройствам и использовалась для рассылки уведомлений о судебных событиях подписчикам этих событий. Ещё с её помощью слали новости фондового рынка биржевым торговцам. Чуть позже, во время войны браузеров, Майкрософт и Нетскейп внедрили пуши в свои браузеры, но по ряду причин тогда взлетела технология RSS. Ещё чуть позже её внедрили Гугл и Эппл в свои мобильные операционки и вот тогда она уже заработала нормально.
Дальше немного технических деталей.
APNS
На устройствах Apple для работы с пушами используется сервис APNS. Через него пуши отправляются как на iOS, так и на OS X (через Центр уведомлений) и OS X Server (отправка почты, календаря и контактов на устройства пользователей сети).
Схема работы APNS, картинка с Хабра.
Важный момент — для получения сообщения APNS, приложение-адресат необязательно должно быть запущено, пуш придёт в любом случае.
GCM
А на Android-устройства пуши отправляются при помощи гуглового сервиса GCM. Кроме того, через GCM пуши могут отправляться в приложения и расширения для Chrome.
Схема работы GCM, картинка с mavink.com
Важный момент — одно устройство с одним идентификатором регистрации может получать уведомления сразу с нескольких серверов. Уведомления живут долго, до 4 недель. GCM будет хранить их, пока не доставит или не истечёт этот срок.
Пуши с точки зрения юзабилити
Форма подписки. Пожалуйста, не требуйте от пользователя подписку на пуши сразу после установки и первого открытия приложения, конверсия будет низкой, так как значимость пушей именно от вас ещё предстоит доказать. Лучше сделайте возможность подписки на пуши в виде опции в настройках, а предлагайте, когда пользователь задействует внутреннюю подписку на что-нибудь.
Форма уведомления. У сервисов пушей есть ограничения по размеру сообщения (2 килобайта для APNS и 4 килобайта для GCM) и по времени, которое пользователь готов потратить на его прочтение. Размещайте в тексте пуша значимое сообщение, например, как Яндекс Еде: «В честь вашего дня рождения, дарим промокод EDA24 на бесплатную доставку заказа от 800 руб.»
Гибкая настройка. Я в начале статьи упомянул, что невозможность отключить рекламные пуши, сохранив информационные, очень раздражает. Дайте пользователю возможность гибко настроить, какие пуши он будет получать, это даст дополнительную лояльность.
Интерес пользователя. Используйте аналитику и привязку к координатам, чтобы сделать пуши ещё более специализированными. Например, появление нового ресторана вашей сети на другом конце Москвы пользователя вряд ли заинтересует, в отличие от появления такого же заведения в его районе. Пуш о новогодних скидках 2 января не заинтересует вообще никого. Используйте сегментирование, например промокод на первый заказ нет смысла слать давним пользователям. Собирайте также статистику пушей, какие пуши чаще открывали, в какое время и всё такое. Помните о часовых поясах.
Звук уведомлений. Настройте свой, неповторимый. Чтобы пользователь знал, что новое сообщение пришло именно от вашего приложения. Такой звук есть, например, у приложения ВТБ, его пуш не перепутаешь ни с каким другим. Это тоже может стать преимуществом.
Оптимальной работы push-уведомлений можно добиться, объединив их на единой платформе с другими каналами связи, такими как электронная почта, SMS и голосовые звонки. Комплексный подход к коммуникации с клиентом сделает этот процесс бесшовным и эффективным.
Метод появился в компании «Toyota» в 1959 году. К айти имеет косвенное отношение, почитать про него можете в Википедии.
Канбан, как инструмент в IT-менеджменте был представлен Дэвидом Дж. Андерсоном в компаниях Microsoft (2005) и Corbis. А широкое распространение и название, как метод, получил в 2007 году.
В отличие от Скрама, Канбан не слишком строг. Скрам не может применяться частично, если вы используете не все практики, это уже не Скрам. В случае с Канбаном, нет правильного и неправильного Канбана, вы можете использовать те практики, которые вам лучше подходят.
Канбан может применяться не только в айти, но и везде, где есть регулярное производство с повторяемыми этапами, через которые должна проходить каждая задача.
Канбан-доска
Главный принцип Канбана — визуализация при помощи канбан-доски. Рассмотрим её подробно.
Левая колонка — очередь. По-хорошему, надо раз в пару недель проводить встречу по наполнению её задачами, но на практике обычно заинтересованные лица закидывают туда задачи по мере поступления. Можно установить ограничение на максимальный размер очереди.
Правее очереди следует расположить колонки допроизводственных этапов, на которых происходит сбор требований, оценка и утверждение задачи. Дальше идёт черта — точка принятия обязательств. Если задача пересекает эту черту, это означает, что она передана в производство и совершенно точно должна быть сделана и влита в продукт.
Перед последней колонкой вторая черта — точка отдачи обязательств, переход задачи через неё означает, что команда ручается, что с задачей всё в порядке.
Пример канбан-доски с scrumtrek.ru
Количество карточек в каждой колонке, кроме первой (это на ваше усмотрение) и последней, должно быть ограничено реальной максимальной пропускной способностью команды, она определяется экспериментально.
Канбан-доска — не только инструмент визуализации процесса, но и рефлексии. Внимательно рассмотрев доску, можно выявить производственные этапы, которые на самом деле не нужны, и наоборот недостающие этапы. По размеру очереди задач и накалу страстей на битве заказчиков за места в этой очереди, можно определить, насколько «жив» продукт.
Также при помощи этой доски вы можете выявить узкие места, «бутылочные горлышки», в которых скапливаются задачи и замедляют цикл производства.
WIP-лимиты
WIP (work in progress) — это количество элементов, находящихся в работе в настоящий момент. Его не надо путать с WIP-лимитом, ограничением на количество элементов в работе на настоящий момент времени, введённым для достижения некой цели.
Единой формулы для расчёта этого лимита не существует, он подбирается экспериментально. Одно можно сказать определённо — этот лимит вовсе не должен быть маленьким.
Использование WIP-лимита повышает определённость в работе. Потому что чем больше элементов в разных состояниях, тем тяжелее ими управлять и контролировать.
Для того, чтобы посмотреть максимальный WIP-лимит по команде, потребуется отчёт CFD (cumulative flow diagram) или накопительная диаграмма потока.
Пример накопительной диаграммы потока с darvindigital.ru
Каденции
Каденциями называются регулярные встречи при помощи которых вы можете поддерживать и улучшать канбан-процесс в команде.
Канбан-митинг
Пятнадцатиминутная ежедневная встреча. Команда собирается и обсуждает:
Что нам мешает?
Как осуществляется поток работы?
Что мы можем улучшить?
Очень важно обсудить все заторы и затруднения в работе над задачами. Возможно, кому-то из участников нужно оказать помощь.
Встреча по пополнению
Получасовая встреча, проводится раз в неделю. Обсуждаем с заинтересованными лицами, какие новые задачи имеет смысл взять в работу и как переприоритизировать существующие, у них могла поменяться актуальность. Если получаса не хватает, можно общаться и дольше.
Обзор сервиса поставки
Получасовая встреча, раз в две недели. В этой встрече должны участвовать ключевые заказчики, менеджер и представители команды разработки. Обсуждаем удовлетворённость заказчика, показываем метрики, думаем, как же нам улучшить работу команды.
Встреча по планированию поставки
Эта встреча нужна, если у вас есть выделенные релизы. В современных айти-проектах всё чаще используется непрерывная интеграция, когда фичи вливаются в продукт по мере готовности, но всё становится сложно, если у вас есть несколько соседних продуктов и нужно обеспечить синхронность релизов.
Если это так, имеет смысл перед поставкой провести планирование списка фич, которые должны войти в поставку и обсудить, что для этого нужно сделать. Обязательно нужно спланировать мероприятия по обучению пользователей работе с вливаемой функциональностью.
Обзор рисков
Часовая ежемесячная встреча. Имеет смысл собраться со всей командой и обсудить, какие риски появились на горизонте, какие могут сработать, а какие уже сработали и влияют на поставку.
Обзор операций
Это кросспродуктовая встреча, на которой обсуждается межкомандное взаимодействие. Собраться с менеджерами соседних продуктов и обсудить, что мешает делать кросспродуктовые доработки. Раз в месяц достаточно.
Обзор стратегии
Самая редкая встреча, её достаточно проводить раз в квартал. Собираемся с руководством компании, обсуждаем рынок, среду, глобальные вопросы. Ставим цели для команды на квартал. Выявляем стратегические проблемы, корректируем тактику команды.
Метрики в Канбане
Важнейшая метрика в Канбане называется Lead Time — время прохождения задачи от точки принятия обязательств до точки отдачи обязательств. Чем быстрее задача проходит от одной точки до другой, тем команда эффективнее. Кроме того, есть ещё такие метрики:
Cycle Time – время, которое задача находилась в разработке от момента, когда ей начали заниматься, до момента, когда она прошла фазу конечной поставки.
WIP – количество задач одновременно находящихся в работе. Разделяется по разным стадиям работы над задачей.
Wasted Time – время, которое задача проводит в различных очередях, а не непосредственно в работе.
Effectiveness – процент времени, которое тратится непосредственно на работу с задачей, а не на ожидания в различных очередях.
Throughput – количество задач, которое может выполнять команда в единицу времени (день, неделя, месяц).
Делаем правила явными
Нужно проговорить с командой и зафиксировать в виде документа все канбан-правила, которые будут применяться в вашей команде. Особенно важно описать критерии, по которым карточка перемещается из одной колонки в другую и при каких условиях она может быть перенесена обратно.
Хорошо и правильно проговорить с заказчиками правила приоритизации задач. Надо также надо обсудить протоколы, по которым будет проводиться работа со более и менее срочными задачами. Когда людям понятны правила, они готовы и хотят играть работать самостоятельно.
Кейс внедрения канбана в реальной практике
Когда я только начинал практику руководителя разработки, столкнулся с проблемой. Есть внутренний заказчик в виде группы внедрения, есть исполнитель в виде SQL-отдела. От заказчика к исполнителю постоянно поступает поток запросов на SQL-доработки — всевозможные отчёты, скрипты, кастомные импорты. И существует постоянно высказываемая претензия — совершенно невозможно понять, когда та или иная доработка будет сдана.
Оказалось, что отдел использует TFS (сейчас Azure DevOps Server), однако совершенно бессистемно. Кто-нибудь из руководства заводит запрос на доработку, вешает его на рандомного разраба и заказчики ждут у моря погоды. Если какой-то запрос нужен срочно, ответственный внедренец прибегает к руководству департамента и начинает орать. CIO транслирует ор в программиста, он в приоритетном порядке запиливает доработку. Тестировать её некогда, поэтому она сразу накатывается на базу заказчика. Если возникают проблемы, они никак не регистрируются, внедренец просто приходит в отдел SQL, подсаживается к программисту и просит поправить.
Частично этот кейс был рассмотрен в статье «Единая точка входа», но там больше про унификацию входящих обращений, в этой же статье мы поговорим про визуализацию и контроль при помощи канбана.
В первую очередь было принято решение визуализировать очередь. Хотелось использовать веб-приложение, потому что внедренцы крайне не любят ставить сторонние приложения (лол) и вообще, большую часть времени проводят в аутлуке. Выбор пал на trello. Первоочередной задачей стало завести на трелло-доске все открытые запросы на доработку из TFS. Trello тогда умел создавать карточки на основании писем, отправленных на специальную почту, а TFS умел экспортировать воркайтемы в эксель. Мой разраб минут за сорок накидал VBA-скрипт, импортировали запросы.
А вот дальше мы пошли вразрез с классическим канбаном. Вместо столбцов, отражающих этапы работы, мы завели по столбцу на каждого разраба и добавили в эти столбцы карточки запросов, над которыми они работали в данный момент.
Ситуация улучшилась, вместо: «Я не знаю, когда мы сделаем эту задачу», появилась возможность говорить: «Перед этой задачей в очереди ещё шесть задач, сможем взять её в работу после них». Удалось достигнуть договорённости — мы объявляем срок по задаче только после того, как она поступает в работу разрабу, но за этот срок уже отвечаем по полной программе.
Мы стали встречаться со старшим внедренцем два раза в неделю и обсуждать сроки по задачам, взятым в работу, а также положение разных задач в очереди. Так как 80 % задач были от одного и того же заказчика, мы разрешили внедренцу менять очерёдность задач этого заказчика. Если было нужно подвинуть задачи другого заказчика, внедренцы договаривались между собой.
Порядка стало больше, но возникла проблема с приёмкой задач. Так как внедренцы не торопились принимать задачи, их карточки намертво повисали в колонках разрабов, стали копиться внушительные хвосты. Так как решить проблему на организационном уровне не удалось, мы сменили инструмент.
kanbanize.com, в отличие от trello на тот момент поддерживал свимлайны. То есть, можно было завести для каждого разраба дорожку, а колонками сделать уже актуальные статусы, что сильно ближе к нормальному канбану. Кроме того, этот сервис позволял добавить кастомные поля к каждой карточке, что было для нас очень важно, так как кроме TFS-идентифкатора, каждый запрос имел CRM-идентификатор, которыми оперировали внедренцы.
В целом, сочетание организационных мер с правильно подобранным инструментом и методологией, позволили преодолеть кризис и сделать разработку предсказуемой. Негатив от внедренцев закончился.
Описанные ниже практики могут показаться самими собой разумеющимися для опытных тимлидов и пиэмов, давно и плотно занимающихся профессиональной разработкой ПО. Однако, попав в стартап, можно обнаружить, что горе-фаундеры забыли их внедрить. Давайте о них поговорим.
Гит
На проекте я тимлид,
В мастер пушу свой коммит,
У меня на это есть
Полный доступ в гит.
Если команда проекта состоит из вас одного, да, можно заливать код по FTP и вносить правки прямо на прод. Но уже когда вас становится двое, начинаются проблемы. Вы будете затирать код друг друга, откат из серверной резервной копии будет занимать массу времени и проч. Кроме того, в процессе залития файлов через FTP, прод будет работать нестабильно. Гит решает все эти проблемы, у вас появляется нормальная версионность, нормальный мерджинг, нормальное залитие кода в прод. Первым делом в стартапе надо внедрить гит, если его ещё не внедрили.
Код ревью
Как и в предыдущем случае, если команда из вас одного, вы сами за всё отвечаете и качество кода только на вашей ответственности. Но как только появляется второй разработчик, начинаются риски, что он будет вливать говнокод с очень странными и неочевидными программными решениями. Код ревью надо внедрять вторым делом и никогда на него не забивать, даже в экстренных случаях, когда какая-то важная функция работает неправильно, иначе вы рискуете положить прод вообще.
CI/CD
Эту загадочную аббревиатуру нужно внедрять в третью очередь, когда гит и код ревью уже заработали. Даёт великое множество профитов — возможность гибко управлять правами доступа, автоматизировать ручные действия и самое главное, возможность нормально масштабироваться. Без CI/CD в случае резкого всплеска нагрузки вам останется только развести руками.
Прозрачный процесс постановки задач
В прошлом команды зачастую проживали несколько стадий — устная постановка задач, запись на листочках, запись на физической доске, обвешивание досками всего кабинета, депрессия, переход на таск-трекер.
В других компаниях руководство грешит тем, что кидается задачами прямо в почте или в чатах, потом удивляется, почему ничего не сделано и ничего невозможно отследить. В четвёртую очередь ставим таск-трекер и принуждаем всех пользоваться им. Если руководство слишком нежное, обязываем кого-нибудь наиболее ответственного из тестирования или, в крайнем случае, тимлида, преобразовывать эти потоки сознания в тикеты.
Руководитель изрыгнул в чат баг или очередную светлую идею — ответственный сотрудник заводит тикет в таск-трекере и скидывает в чат номер. Исключений нет.
Одна задача = одна ветка в гите.
Крупные задачи нужно дробить на мелкие. А для мелких заводить отдельные ветки. Причина проста. Если вы решите вести в одной ветке 10 задач и срочно потребуется релизиться, вы не сможете это сделать, если хотя бы в одной будет критичный баг. Если вести задачи в отдельных ветках, вы совершенно спокойно зальёте 9 рабочих веток с 9 рабочими задачами и обрадуете стейкхолдеров и пользователей.
Автотесты
Вам может показаться, что продукт слишком мал и прост для автотестов. Но проблема роста потому и проблема, потому что момент роста сложности трудно заметить. А без автотестов вы постоянно будете сталкиваться с тем, что вливаемые функции ломают существующие. А когда вы станете совсем большими, можете завести выделенный отдел автотестирования.
Мониторинг ошибок
Последний, но не по важности пункт, который надо внедрять в стартапе в обязательном порядке. Ставить систему мониторинга ошибок и настраивать этот самый мониторинг. Потому что иначе вы будете узнавать об ошибках от пользователей, как правило, с очень ограниченной информацией, вроде мутного скриншота и ещё более мутного описания последовательности действий. Ещё хуже, если к вам с ошибками будет прибегать кто-нибудь из топ-менеджмента, на этом ваша карьера в этом стартапе может быстро закончиться.
Мониторинг ошибок позволяет узнавать о багах по мере появления, надо только выстроить процесс так, чтобы на этот мониторинг ответственные лица не забивали.
Вот, в целом, и все полезные практики, которые вам нужно завести в свежем стартапе чем раньше, тем лучше.
Когда-то давно разработчики писали софт с нуля. Нужна тебе, к примеру, функция, делающая текст капслоком, берёшь и пишешь. Надо решение квадратного уравнения — берёшь и пишешь модуль для решения квадратного уравнения руками. Наиболее сообразительные программисты достаточно быстро поняли, что часто используемый код можно стандартизировать и стали писать библиотеки готовых модулей. Появилась возможность импортировать в свой проект чужую библиотеку и обращаться к уже написанным и отлаженным методам.
Приложение, использующее библиотеки, состоит из основного кода разработчика, который обращается к библиотекам, вызывая методы из них.
Однако через некоторое время выяснилось, что можно ещё сильнее ускорить разработку. Например, в огромном количестве веб-проектов нужно писать веб-админку с более-менее стандартными гридами. Ну или часто пишутся сайты с более-менее стандартизированной вёрсткой. Выделение таких программистских потребностей привело к появлению первых фреймворков. Слово «фреймворк» переводится как «каркас».
Приложение на фреймворке содержит код фреймворка в своей основе, каркасе, и вызывает код разработчика, который выполняет специфические для этого приложения функции, в этом его архитектурное отличие от приложения с вызовами библиотек. Впрочем, никто не мешает комбинировать эти подходы и использовать в приложениях на фреймворке подключение библиотек и вызовы методов из них.
Классификация фреймворков
Бэкенд-фреймворки
Эти фреймворки предназначены для реализации серверных функций приложения. Веб-страницы с их помощью делать можно, но только самые просты.
Например, при помощи Django вы можете сделать админку с гридами, о которой я писал выше. Это фреймворк на питоне.
Ещё можно выделить:
Symfony, Laravel — PHP;
Express.js — JavaScript;
Ruby on Rails — Ruby.
Все эти фреймворки имеют на борту функции формирования выходных данных, с их помощью можно релизовывать безопасность серверной части от попыток взлома.
Фронтенд-фреймворки
При помощи фронтенд-фреймворков вы напротив, можете реализовывать веб страницы с богатым содержанием, различными элементами интерфейса, кастомными и стандартизированными контролами. Различные анимации тоже можно делать с их помощью. Как правило, речь идёт о JS-фреймворках, например:
Angular;
Vue.js;
Svelte;
React — формально это не фреймворк, а библиотека, но значение этого инструмента так велико, что его постоянно сравнивают с другими веб-фреймворками.
Фуллстек-фреймворки
Сюда относятся фреймворки, реализующие как клиентскую, так и серверную часть. Например, JS Meteor.
Возможности фреймворков
Веб-кеширование
Позволяет снизить нагрузку на сервер, отдавая самые популярные пользовательские данные из кэша.
Скаффолдинг
Позволяет автоматически сгенерировать наиболее важные части приложения или вообще, всю его структуру. Сильно повышает скорость разработки, очень полезно для новичков.
Шаблонизация
Отвечает за веб-публикацию. Основная задача шаблонизатора — отделить код от представления (например, HTML-разметки). Веб-шаблоны применяются для создания сайтов и страниц любого типа, так как шаблон выполняет роль незаполненного бланка документа, одинакового для любых представлений до заполнения данными.
Безопасность
Противостояние кулхацерам. Стандартизованные функции для идентификации пользовательских действий. Распознавание профилей, используемых для кликджекинга — механизма обмана, при котором злоумышленник получает доступ к конфиденциальной информации пользователя и даже его устройствам.
Сопоставление URL
Вообще, это механизм интерпретации URL-адресов. Нужно для упрощения индексации с сохранением красивого названия для сайта. Например, URL-адрес, который заканчивается на «/page.cgi?cat=science&topic=physics», можно изменить на просто «/page/science/physics», удобно и красиво же.
Приложения
Возможность разрабатывать стандартизованные приложения — форумы, блоги, CMS.
Важное для менеджера
На любом фреймворке можно реализовать как «летающий» продукт, так и медленно ползающее нечто, всё зависит от квалификации ваших разрабов и навыков архитектора. Поэтому фреймворк нужно выбирать не согласно веяниям моды, а исходя из того, каким лучше владеет ваш тимлид или CTO, это минимизирует риски.
Кроме того, специалисты, владеющие разными фреймворками, по-разному оплачиваются, есть более и менее оплачиваемые специализации. Эти цифры постоянно колеблются, никакой системы выделить нельзя, надо анализировать рынок в каждый момент времени.
В целом, это всё, что пиэму нужно знать о фреймворках.
В изрядной доле проектов нужно интегрировать два или больше приложений. В самом тривиальном случае — фронтенд с бэкендом. В более сложном — мобильное приложение с бэкендом. В случае со звёздочкой — два бэкенда и другие извращения. Стандартом де-факто для таких задач в наше время считается API.
Кроме того, в вашем продукте может потребоваться реализовать дорогостоящую функцию, которая уже сделана в стороннем сервисе на отличненько. Например, если вам нужны карты, целесообразно использовать API Open Street Map или Яндекс.Карт, это сильно дешевле, чем пилить собственные карты.
Также вам пригодится API платёжных шлюзов, если нужно реализовать на сайте оплату чего-нибудь, неважно, физических товаров или виртуальных.
В наше время считается дурным тоном делать регистрацию и авторизацию на сайте логином и паролем, это делают через API социальных сетей, гугловский, фейсбучий, вконтактовский, телеграмовский.
Если у вас сайт с большим количеством контента, например, маркетплейс, имеет смысл реализовать API для использования ваших данных в сторонних сервисах (возможно, платно), это проще, чем постоянно банить десятки ботов, которые будут ваши данные парсить, создавая нагрузку на сервера.
Самая прозрачная аналогия с реальным миром — ресторан. Кухня — бэк, зал ресторана — фронт, официанты — API. Посетитель через зал посетителей стучится в API-официанта, даёт ему заказ. Официант доставляет заказ кухне-бэкенду, там его готовят и отдают официанту, который доставляет результат клиенту в зал ресторана. Если всё сильно упростить, реальное API работает именно так.
Различия REST и SOAP
Чаще всего в современной разработке встречаются REST и SOAP API. Давайте разберём, в чём разница.
REST
REST(от англ. Representational State Transfer — «передача репрезентативного состояния» или «передача „самоописываемого“ состояния») — архитектурный стиль взаимодействия компонентов распределённого приложения в сети.
Предполагает использование протокола HTTP для передачи данных.
Применяется преимущественно в вебе и в мобильных приложениях.
Ещё используется в облачных вычислениях.
Через REST API могут передаваться разные форматы данных, но обычно используется JSON.
Предполагает кэширование передаваемых данных.
Хорошо масштабируется.
SOAP
SOAP(от англ. Simple Object Access Protocol — простой протокол доступа к объектам) — протокол обмена структурированными сообщениями в распределённой вычислительной среде. Первоначально SOAP предназначался в основном для реализации удалённого вызова процедур (RPC).
При помощи SOAP данные могут передаваться не только через HTTP, но и, например, MQ.
Применяется, преимущественно, в Enterprise, для интеграции нескольких отдельно стоящих систем.
Данные передаются только в формате XML.
Данные не кэшируются.
Типы запросов
Метод обозначает тип производимого запроса, де-факто он является спецификацией операции, которую должен произвести сервер. Всего существует пять типов запросов:
GET
POST
PUT
PATCH
DELETE
GET – используется для получения со стороны севера определенного ресурса. Если вы производите этот запрос, сервер ищет информацию и отправляет ее вам назад. По сути, он производит операцию чтения на сервере. Дефолтный тип запросов.
POST – нужен для создания определенного ресурса на сервере. Сервер создает в базе данных новую сущность и оповещает вас, был ли процесс создания успешным. По сути, это операция создания.
PUT и PATCH – используются для обновления определенной информации на сервере. В таком случае сервер просто изменяет информацию существующих сущностей в базе данных и оповещает об успехе выполнения операции.
DELETE – как и следует из названия, удаляет указанную сущность из базы или сигнализирует об ошибке, если такой сущности в базе не было.
Postman
Для тестирования API применяется инструмент Postman. Раньше он был плагином для Хрома, но сейчас это автономное приложение для любых платформ. Штуковина достаточно понятная интуитивно, разработчики чаще всего передают данные об API тестировщикам именно в виде коллекций Постман.
Эндпоинт принимает только один строковый параметр text. Отправим Постманом GET запрос на этот эндпоинт:
Интерфейс Postman с простым GET-запросом к API
Как видите, API возвращает такой ответ:
{
"success": {
"total": 1
},
"contents": {
"translated": "Force be with you yoda,Polovec helloy you",
"text": "Hello Yoda, Polovec helloy you",
"translation": "yoda"
}
}
Как нетрудно понять, эндоинт возвратил код успеха, а в поле контента передал три значения:
translated — переведённый текст.
text — исходный текст.
translation — тип переводчика.
По такому же принципу работают любые REST API, только в реальных запросах параметров больше и они сложнее.
Применение в реальной разработке
Проектирует API обычно архитектор. Бэкенд-разработчики реализуют эндпоинты и пишут документацию. Фронтендеры или мобильные разработчики интегрируются с этим API, реализуют получение данных из него и отправку данных в него. Тестеры всё это проверяют.
Может сложиться так, что проект будет совсем маленьким и проектирование API поручат вам. Для такого случая предлагаю вам пример API спроектированного мной для мобильного приложения для операций с топливом.
Очень часто для использования API требуется авторизация. Для этого необходимо реализовать механизм выдачи токенов доступа каждому пользователю API, чтобы клиентское приложение добавляло эти токены к запросам. Посмотрите приложенный пример и поймёте, как это делается.
Если вы интегрируетесь со сторонней системой и успех проекта сильно зависит от её корректной работы, попросите QA реализовать пинговалку стороннего API, они умеют это делать, в том числе с помощью Постмана. Система будет с определённой периодичностью слать запросы на внешнее API и если ответы перестанут поступать, будет записывать такие события в лог, с помощью которого вы потом сможете доказать, что разработка тормозила из-за отваливающегося стороннего API.
Написанное в этой статье будет очевидно для большинства читателей, я пишу её для тех, кто как и я, впервые собрался полететь уже в зрелом возрасте. Надеюсь, инфа вам поможет.
Про ручную кладь
Я ни разу не летал с багажом, только с ручной кладью. Обычно брал небольшую наплечную сумку с зарядками и зубной щёткой, а в руках нёс чехол с ноутбуком и файликом с документами. Такую кладь вас не заставят засовывать в калибратор, но сотрудник авиакомпании может сказать, что ноутбук разрешается перевозить только без чехла. Вытаскиваете ноутбук, кладёте чехол в калибратор вместе с сумкой и ситуация разруливается.
Если хотите лететь с рюкзаком, будьте готовы, что его могут потребовать засунуть в калибратор, поэтому не набивайте его туго.
Что можно везти, а что нельзя
Ваш любимый швейцарский нож или лезерман можно везти только в багаже. В салон ничего колюще-режущее проносить нельзя. Поперечный рассказывал о личной трагедии — авиакомпания конфисковала его любимые маникюрные ножнички и он теперь не знает, где купить такие же. Обрежьте ногти перед поездкой.
Баллончик с CS нельзя везти вообще.
В большинство стран вы можете везти тактическую ручку, только рядом положите одну обычную. В Голландию и Германию тактическую ручку нельзя, но я пишу о внутренних перелётах.
В правилах авиакомпаний обычно пишут, что психотропные таблетки можно везти только с рецептом. Полный идиотизм, потому что этот рецепт при покупке таблеток аптека изымает. На деле, четыре-шесть таблеток антидепрессантов вполне можно провезти, положив на дно сумки.
Зубную пасту можно. В большинстве бюджетных гостиниц пастой вас снабдят только платно, поэтому можете взять свою в тюбике не больше 100 грамм, на всякий случай упакуйте в зип-пакет.
Антисептик в виде геля везти можно. В тот же пакет его положите.
Маленькую пустую пластиковую бутылку можете взять. Потом напишу, зачем.
Можете взять электрический тройник. Потом напишу, зачем.
Первичный досмотр
На входе в общий зал аэропорта нужно пройти досмотр. Берёте пластиковую лоханку и складываете в неё весь металл. Часы и ремень можно не снимать, просто покажете их сотруднику. Я, так как таскаю в карманах много предметов, просто снимаю куртку и пиджак, туда же кидаю кошелёк и ключи, после чего прохожу. В Шереметьево требуют снять шапку.
Общий зал аэропорта
В общем зале, в кафехах нормальные цены, вполне можете там перекусить, но лучше поесть дома.
Регистрация
О времени начала регистрации мы можете узнать на электронном табло вашего аэропорта. На компе или смартфоне загуглите и посмотрите. Иногда она начинается за два часа, иногда за три. Если летите впервые, прибудьте в аэропорт за три часа, потом можете за два.
На электронном табло будут написаны номера стоек регистрации. Если не хотите искать электронное, просто идите к стойкам и ищите на экранах свой номер рейса (он написан в квитанции от авиакомпании, которую вам пошлют на имейл после оплаты).
Сотруднику предъявляете паспорт, называете номер рейса или, если память отшибло, хотя бы куда летите, он разберётся. Сотрудник посмотрит на вашу ручную кладь и скажет, надо ли засовывать её в калибратор. Если вам не повезёт и она туда не влезет, придётся доплатить за дополнительное место ручной клади. Это дороже, чем при покупке билетов онлайн. Если у вас есть багаж, он его примет и отправит по ленте в недра аэропорта.
После всего, сотрудник выдаст вам посадочный талон. На нём будет написан номер выхода на посадку и номер места в самолёте. Если не знаете, куда идти дальше, спросите сотрудника, он покажет направление.
Полноценный досмотр
Проследовав в направлении, которое укажет вам сотрудник, вы найдёте другого сотрудника, которому нужно показать паспорт и посадочный, он поставит туда штамп и вы пройдёте на досмотр.
Этот досмотр уже более серьёзный. Кладёте в лоханку верхнюю одежду, весь металл, снимаете ремень и часы. Могут потребовать снять ботинки (особенно если вы мамкин неформал и они у вас окованы металлом), в этом случае где-то рядом должен быть ящик с бахилами. Кладёте лоханку на ленту, она ползёт на рентген. Вы проходите через рамку и если ничего не пискнет, вас пропустят. Если пискнет, досмотрят ручной пикалкой и заставят выложить невыложенное.
Если не везёте ничего запрещённого, вам отдадут лоханку и вы сможете одеться. Если везёте, вас отправят на подробный досмотр. Меня ни разу не отправляли.
Внимание. Если вы через Шереметьево провозите ноутбук, вас заставят его включить, видимо, чтобы вы не провезли под видом компьютера бомбу. Логиниться не надо, достаточно открыть экран и показать окно ввода пароля. Поэтому имейте в виду, что ноутбук должен быть заряжен, хотя бы чуть-чуть.
Зал ожидания
В зале ожидания куча всяких торговых лавок и кафех с конскими ценами. В хорошем аэропорту можете найти фонтанчик с питьевой водой, тут-то вам и пригодится маленькая пустая пластиковая бутылка. Иначе воду придётся покупать в автомате задорого.
В зале ожидания есть стойки с розетками. Они бесплатные, можете запитать от них ноутбук или зарядить смартфон. Продвинутые путешественники берут с собой тройник на случай, если свободных розеток не будет.
Если вы в этом зале ожидания впервые, рекомендую прогуляться по нему и найти ваш выход на посадку, чтобы при старте посадки не метаться, а сразу идти, куда нужно.
На электронном или обычном табло смотрите, когда начинается посадка. Посадка точно не начнётся раньше этого времени. Я обычно чилю, пока не останется десять минут до старта посадки, после чего иду в очередь. Рекомендую до посадки сходить в туалет, так как в самолёте, если вы не сядете у прохода, придётся беспокоить соседей.
Посадка
После того, как встанете в очередь на посадку, приготовьте паспорт и посадочный. «Победа» смотрит и то, и другое, «Смартавиа» смотрит только посадочный. Очередь после начала посадки движется довольно быстро. Сотрудник заберёт ваш посадочный, вернёт от него корешок, который имеет смысл сохранить до конца поездки.
Есть три варианта посадки. Через рукав, через автобус и колхозный. Первый самый комфортный. Проходите по коридору, сразу попадаете в самолёт, стюардесса на входе поздоровается, посмотрит корешок от посадочного и скажет, с какой стороны от прохода ваше место. Сноровисто проходите, доходите до своего места, снимаете куртку и сумку, забрасываете на полку, садитесь. Чехол с ноутбуком советую держать в руках.
Через автобус всё несколько сложнее. Всю толпу посадят в автобус, иногда в один, иногда в два и повезут через весь аэродром к самолёту. Недалеко от самолёта высадят и вы пешком подниметесь по трапу в салон.
Колхозный вариант применяется в маленьких аэропортах. Вы стоите на морозе в небольшом загончике, по сигналу пешком идёте до самолёта и поднимаетесь в салон.
Если ваше место возле аварийного выхода, вас ждёт сюрприз. Вам выдадут дополнительную инструкцию и попросят на время посадки и взлёта всю ручную кладь положить на полку. Мне ни разу так не везло. Во время горизонтального полёта доставать ручную кладь и пользоваться ей можно.
Ремень безопасности интуитивно понятен.
Стюардессы покажут, как пользоваться аварийной техникой, вроде спасательных жилетов.
Полёт
После того, как все усядутся и двери закроют, вас поприветствует командир судна, после чего начнётся взлёт. На время взлёта просят спинки кресел привести в вертикальное положение. На лоукостерах, которыми летаю я, они вообще, не откидываются. Также просят открыть шторку иллюминатора. Если вы сидете у окна, открываете. Зачем, не знаю.
Через некоторое время после взлёта вам объявят, что самолёт перешёл в горизонтальный полёт и можно немного расслабиться. Можно расстегнуть ремни, опустить откидной столик, если очень повезёт, будет достаточно места, чтобы поработать за ноутом. Потом будут развозить нямку тем, кто её заказал при покупке билетов. Обычно можно купить какой-нибудь напиток или сэндвич. Вода чаще всего бесплатная.
На подлёте командир сообщит, что самолёт начал снижение. Нужно обратно застегнуть ремень, поднять откидной столик. Самолёт снизят и посадят. При посадке может тряхнуть, поэтому ноутбук к этому моменту лучше убрать в чехол.
После того, как самолёт затормозит, вскакивать не надо, двери будут ещё минут десять закрыты. Спокойно встаёте, забираете вещи с полки, ничего не забываете, выходите.
Высадка
Иногда высадка производится в рукав, иногда в автобус. Колхозного варианта в крупных аэропортах ещё ни разу не встречал.
Просто идите вместе со всеми пассажирами. Часть из них проследует на выдачу багажа, но я ни разу не летал с багажом и особенностей не знаю. Когда полетаю с багажом, дополню этот раздел.
На выходе из Шереметьево, если хотите ехать как человек, найдите столбы с номерами и укажите в приложении для заказа такси номер столба, чтобы таксист знал, куда ему подъезжать, потому что там стопицот людей и машин.
В международные рейсы я не летал ни разу, поэтому о них рассказать пока не могу.
На собеседовании на менеджера проектов вас могут спросить, что такое Kubernetes или просто Кубер. Если вы претендуете на место технического менеджера проектов, придётся рассказать ещё, зачем он нужен и как используется в современной разработке. Давайте разбираться.
Для того, чтобы понять, зачем нужен Кубер, сначала нужно понять, зачем нужен Докер.
Docker
Позволяет «упаковать» приложение со всем его окружением[en] и зависимостями в контейнер, который может быть развёрнут на любой Linux-системе с поддержкой контрольных групп в ядре, а также предоставляет набор команд для управления этими контейнерами.
Иными словами, при помощи Докера вы можете упаковать приложение в изолированный контейнер, а потом разместить этот контейнер, где хотите, и где бы вы его ни развернули, везде у этого приложения будет одинаковое окружение. Подход сильно облегчает развёртывание и тестирование.
У вас может возникнуть вопрос, в чём разница докера и самой обычной виртуальной машины?
Контейнеры и виртуальные машины — это разные способы виртуализации. Только виртуалка реализует её на уровне железа, а Docker — на уровне операционной системы.
Виртуальная машина функционирует как отдельный компьютер с собственным оборудованием и операционной системой. Распространённая практика — купить большой сервер и установить на него гипервизор, базу для виртуалок. Сервер «нарезается» на много виртуальных компьютеров, что избавляет нас от необходимости покупать их отдельно.
Виртуальные компьютеры вполне полноценны. На них можно установить операционную систему любого семейства и работать в ней, например, через графический интерфейс в многопользовательском режиме, устанавливая и запуская множество приложений и сервисов.
Если цель виртуалки — полностью воспроизвести устройство компьютера, то основная цель Docker — создать среду для одного приложения. Виртуальная среда контейнера запускается внутри операционной системы. Ей не нужно виртуализировать оборудование — она использует его через ОС. Поэтому контейнеры Docker потребляют меньше ресурсов, быстрее развёртываются, проще масштабируются и меньше весят.
Если кратко перечислить преимущества контейнеризации, то это:
быстрое создание и развертывание приложений;
непрерывные разработка, интеграция и развертывание;
разграничение ответственности разработчиков и администраторов;
однородность сред разработки, тестирования и промышленного использования;
переносимость между разными облачными провайдерами и ОС;
сосредоточение управления непосредственно на приложении;
слабо связанные, распределенные, эластичные, независимые микросервисы;
изоляция ресурсов;
утилизация ресурсов.
Все основные облачные провайдеры, такие как Amazon AWS, Google’s GCE, Microsoft’s Azure и даже Alibaba Cloud, предоставляют услуги по размещению контейнеров.
Докер работает на линухе. Чтобы использовать его на винде или макоси, нужно ставить виртуальную машину с линуксом. Теперь несколько слов о том, из каких компонентов состоит Докер:
Docker host — это операционная система, на которую устанавливают Docker и на которой он работает.
Docker daemon — служба, которая управляет Docker-объектами: сетями, хранилищами, образами и контейнерами.
Docker client — консольный клиент, при помощи которого пользователи взаимодействуют с Docker daemon и отправляют ему команды, создают контейнеры и управляют ими.
Docker image — это неизменяемый образ, из которого разворачивается контейнер.
Docker container — развёрнутое и запущенное приложение.
Docker Registry — репозиторий, в котором хранятся образы.
Dockerfile — файл-инструкция для сборки образа.
Docker Compose — инструмент для управления несколькими контейнерами. Он позволяет создавать контейнеры и задавать их конфигурацию.
Docker Desktop — GUI-клиент, который распространяется по GPL. Бесплатная версия работает на Windows, macOS, а с недавних пор и на Linux. Это очень удобный клиент, который отображает все сущности Docker и позволяет запустить однонодовый Kubernetes для компьютера.
Основных сущностей для работы с докером три:
Докер образ — неизменяемая штуковина, на основании которой потом будут создаваться контейнеры. В него ставятся приложение, конфигурации и зависимости. От мастер-образа можно наследовать другие образы, например, с другой файловой системой.
Докерфайл — в этой штуковине находятся рецепты по получению контейнеризированного приложения из образа.
Контейнер — собственно, ради этой сущности весь сыр-бор.
Ещё есть специальный репозиторий для хранения докер-образов.
Вы вполне можете использовать Докер без Кубера, но Кубер даст дополнительные возможности.
Kubernetes
Если кратко, то Kubernetes – это ПО, позволяющее гибко управлять контейнеризированными приложениями. Штука целиком гугловая, опережает все аналоги очень сильно. В общем, если вам надо строить инфраструктуру под сколько-нибудь сложное и высоконагруженное приложение, Кубер ваш выбор. А если вы используете микросервисную архитектуру, сама наука велела изучить и использовать этот софт.
Сущностей в этой предметной области много, рассмотрим основные, чтобы более-менее понять размещённую выше схему.
Кластер
Кластер — это набор компьютеров, хранилищ данных и сетевых ресурсов, с помощью которых Kubernetes выполняет различные задачи в вашей системе. Система может состоять из нескольких кластеров.
Узел
Узел — это отдельный компьютер (физический или виртуальный). Его задача состоит в запуске подов. Каждый узел в Kubernetes содержит несколько компонентов, таких как kubelet и прокси kube. Все они находятся под управлением ведущего узла. Узлы — это нечто наподобие рабочих пчел, которые занимаются выполнением всех основных задач. Устаревшее название узла — миньон.
Под
Под (pod) — это единица работы в Kubernetes. Каждый под содержит один или несколько контейнеров. Поды всегда работают совместно, то есть на одном компьютере. Все контейнеры внутри пода имеют одни и те же IP-адрес и пространство портов, они могут общаться между собой через локальный сервер или посредством межпроцессного взаимодействия. Кроме того, все контейнеры имеют доступ к общему локальному хранилищу данных узла, на котором находится под. Такое хранилище может быть подключено к каждому контейнеру.
Что же можно сделать при помощи Кубера?
Если совсем кратко, то с помощью Кубера вы можете создать полноценную, отказоустойчивую инфраструктуру на основе контейнеров и положиться на неё. Используя шаблоны Кубера, разработчики могут конструировать нативные облачные приложения, которые также будут обладать устойчивостью к высоким нагрузкам.
Несколько слов о возможностях Кубера:
Мониторинг. Кубер позволяет в реальном времени мониторить множество параметров вашего кластера или отдельного приложения. Есть веб-интерфейс, инфа представляется в наглядном и удобном виде.
Балансировка сетевой нагрузки. Дело в том, что трафик для разных контейнеров может сильно разниться, где густо, где пусто. Кубер умеет автоматически его балансировать, но также имеет инструменты, при помощи которых разрабы или девопсы могут написать правила балансировки.
Оркестрация хранилища. С помощью Kubernetes разработчик может выбрать систему хранения: локальное хранилище, облако и т.д. Платформа автоматически создаст ее и настроит под потребности проекта.
Автоматизированное развёртывание. Кубер умеет автоматически и вручную делать раскатку изменений. Есть возможность раскатать доработку на ограниченное количество контейнеров и протестировать работоспособность, если что-то сломается, изменения будет легко откатить.
Самоконтроль. Кубер умеет автоматически останавливать или перезапускать засбоивший контейнер. Девопс может задать критерии для качества работы контейнеров и Кубер будет скрывать от пользователей контейнеры, которые перестали им соответствовать. Ну и уведомлять девопса о таких событиях.
Безопасность и конфиденциальность. Kubernetes может сохранять и контролировать конфиденциальные данные (пароли, ключи SSH, OAuth-токены), распределять права доступа к системе. Обновление и развертывание приложений не затрагивает образы контейнеров и не раскрывает секретные сведения в конфигурации стека.
В Кубере много автоматики, но эта система не является полностью автоматической и требует определённого уровня знаний для её конфигурирования.
В целом, это всё, что пиэму нужно знать про Докер и Кубер.
Получить проект в свои руки с самого начала — большая удача. Намного чаще случается, что вы устраиваетесь в новую компанию и вам проект передаёт один из штатных менеджеров. Либо вы увольняетесь и передаёте проект коллеге.
Я решил собрать в одной ментальной карте все аспекты и вопросы, которые нужно учесть при такой передаче. Вот вам pdf: