Самая запоминающаяся фича, которую мы сделали в Sendsay в прошлом году – это итоги года для клиентов.
Суть в следующем: в последнюю неделю года в личном кабинете всех наших клиентов появляется новогодний баннер, при клике на который открывается отдельный лендинг с статистикой за год: сколько было добавлено новых подписчиков, сколько было сделано рассылок, какие из них лучшие и т.д.
В качестве референса были взяты «итоги года» у Spotify и VK.
Цель всего этого в том, чтобы клиенты увидели сколько всего они сделали за год благодаря нашему сервису: бизнес растет, увеличивается количество подписчиков и рассылок. Также мы добавили на страницу советы, как увеличить эффективность от использования сервиса в следующем году.
При этом за кажущейся простотой интерфейса, мы провели колоссальную работу.
Во-первых, это работа продуктологов: все клиенты разные, используют разные тарифные планы, пользуются разными фичами и каналами связи со своими подписчиками. Одни клиенты с нами давно, другие – недавно, одни отправляют письма миллионами, другие в разы меньше. Нужно было все это учесть и обработать сотни кейсов, чтобы у всех клиентов эта страница получилась цельной и полезной.
Во-вторых, из-за того что не было возможности выделить отдельного бэкендера для сбора всех необходимых данных, нам нужно было собрать данные на фронте, используя существующие API роуты. При этом нужно было продумать как все это загружать так, чтобы не создать лишнюю нагрузку на сервера, и аккумулировать информацию, чтобы страница итогов открывалась моментально, без задержек.
Мы придумали механизм, который в фоновом режиме прокачивал нужные данные под основным пользователем (чтобы не было конкурирующих запросов между разными пользователями на одном аккаунте). Затем эти данные уже в удобном для нас json формате складывались в отдельное хранилище, и только тогда пользователи видели баннер, открывающий статистику, которая формировалась из загруженных и подготовленных данных.
Также мы добавили в набор данных поле с версией, чтобы все данные перезапрашивались, если мы вносили какие-либо правки в алгоритм их сбора и загрузки. Это помогло при тестировании и отладки.
Дополнительно мы обвесили сбор данных и открытие страницы итогов аналитикой, чтобы контролировать весь процесс, и убедиться, что все прошло штатно.
Все это мы успели сделать всего за неделю, и эта фича очень понравилась как клиентам, так и нашим коллегам. Поэтому я считаю это одним из наших значимых достижений в 2024.
Суть в следующем: в последнюю неделю года в личном кабинете всех наших клиентов появляется новогодний баннер, при клике на который открывается отдельный лендинг с статистикой за год: сколько было добавлено новых подписчиков, сколько было сделано рассылок, какие из них лучшие и т.д.
В качестве референса были взяты «итоги года» у Spotify и VK.
Цель всего этого в том, чтобы клиенты увидели сколько всего они сделали за год благодаря нашему сервису: бизнес растет, увеличивается количество подписчиков и рассылок. Также мы добавили на страницу советы, как увеличить эффективность от использования сервиса в следующем году.
При этом за кажущейся простотой интерфейса, мы провели колоссальную работу.
Во-первых, это работа продуктологов: все клиенты разные, используют разные тарифные планы, пользуются разными фичами и каналами связи со своими подписчиками. Одни клиенты с нами давно, другие – недавно, одни отправляют письма миллионами, другие в разы меньше. Нужно было все это учесть и обработать сотни кейсов, чтобы у всех клиентов эта страница получилась цельной и полезной.
Во-вторых, из-за того что не было возможности выделить отдельного бэкендера для сбора всех необходимых данных, нам нужно было собрать данные на фронте, используя существующие API роуты. При этом нужно было продумать как все это загружать так, чтобы не создать лишнюю нагрузку на сервера, и аккумулировать информацию, чтобы страница итогов открывалась моментально, без задержек.
Мы придумали механизм, который в фоновом режиме прокачивал нужные данные под основным пользователем (чтобы не было конкурирующих запросов между разными пользователями на одном аккаунте). Затем эти данные уже в удобном для нас json формате складывались в отдельное хранилище, и только тогда пользователи видели баннер, открывающий статистику, которая формировалась из загруженных и подготовленных данных.
Также мы добавили в набор данных поле с версией, чтобы все данные перезапрашивались, если мы вносили какие-либо правки в алгоритм их сбора и загрузки. Это помогло при тестировании и отладки.
Дополнительно мы обвесили сбор данных и открытие страницы итогов аналитикой, чтобы контролировать весь процесс, и убедиться, что все прошло штатно.
Все это мы успели сделать всего за неделю, и эта фича очень понравилась как клиентам, так и нашим коллегам. Поэтому я считаю это одним из наших значимых достижений в 2024.
🔥16❤1🥰1
Как я нашел еще один классный инструмент для презентаций
На прошлой неделе в предверии Нового Года все подводили итоги. И мне тоже нужно было подвести итоги года для нашей команды. Раньше я делал это примерно так, как большинство руководителей: собирал команду на созвон и вещал сколько всего мы сделали за год, вспоминал основные достижения, фичи, говорил про планы на будущее и вообще какие мы молодцы, привильной дорогой движемся, товарищи.
Но когда мы сделали «Итоги Года» для клиентов из предыдушего поста, я вдруг осознал как же круто, когда подведение каких-либо итогов и результатов это не сухие цифры и статистика, а некая презентация, упакованная в красивую обертку.
И мне захотелось сделать красивые и классные «итоги» для нашей команды. Сначала я пытался собрать их в google docs, keynote, и даже в нашей внутренней базе знаний, но получалось все не то – не создавался нужный wow-эффект.
Тогда я понял, что то, что я хочу – это красивый лендинг, ссылкой на который все смогут делиться друг с другом. А как очень быстро сделать смотрибельный лендинг? Тильда!
Регаю новый аккаунт в Тильде, получаю бесплатный доступ к платным фичам на 2 недели (больше и не нужно) и начинаю собирать сайт. В тильде много готовых блоков под все случаи жизни, поэтому на создание лендинга ушло всего несколько часов.
Самое крутое, что результат превзошел все ожидания и все коллеги кайфанули – https://sendsay.tilda.ws/
На прошлой неделе в предверии Нового Года все подводили итоги. И мне тоже нужно было подвести итоги года для нашей команды. Раньше я делал это примерно так, как большинство руководителей: собирал команду на созвон и вещал сколько всего мы сделали за год, вспоминал основные достижения, фичи, говорил про планы на будущее и вообще какие мы молодцы, привильной дорогой движемся, товарищи.
Но когда мы сделали «Итоги Года» для клиентов из предыдушего поста, я вдруг осознал как же круто, когда подведение каких-либо итогов и результатов это не сухие цифры и статистика, а некая презентация, упакованная в красивую обертку.
И мне захотелось сделать красивые и классные «итоги» для нашей команды. Сначала я пытался собрать их в google docs, keynote, и даже в нашей внутренней базе знаний, но получалось все не то – не создавался нужный wow-эффект.
Тогда я понял, что то, что я хочу – это красивый лендинг, ссылкой на который все смогут делиться друг с другом. А как очень быстро сделать смотрибельный лендинг? Тильда!
Регаю новый аккаунт в Тильде, получаю бесплатный доступ к платным фичам на 2 недели (больше и не нужно) и начинаю собирать сайт. В тильде много готовых блоков под все случаи жизни, поэтому на создание лендинга ушло всего несколько часов.
Самое крутое, что результат превзошел все ожидания и все коллеги кайфанули – https://sendsay.tilda.ws/
🔥5👍3
Небольшое улучшение, которое упрощает жизнь при веб-разработке
При работе над приложением, часто в браузере открыты сразу несколько вкладок с вашим сервисом: в одной локальный билд, в другой – production версия, в третьей – тестовый деплой. Еще бывает на одной вкладке авторизовался на тестовом аккаунте, на другой зашел что-то посмотреть под клиентом. В дополнении к этому может быть открыто еще с десяток каких-то других вкладок и все они перемешиваются, и начинаешь путаться.
Чтобы больше не тратить время на поиск нужной вкладки и не совершать ошибок, мы взяли иконку нашего сервиса (favicon) и сделали несколько ее копий в разных цветах. Каждый цвет под отдельный кейс. Затем написали простую функцию смены иконки и завернули это в React хук, который определяет в каком окружении сейчас находится приложение и при необходимости меняет иконку.
Получилось простое и быстрое решение, которое делает разработку более удобной. На клиентах это никак не отразилось, т.к. они всегда видят оригинальный favicon.
При работе над приложением, часто в браузере открыты сразу несколько вкладок с вашим сервисом: в одной локальный билд, в другой – production версия, в третьей – тестовый деплой. Еще бывает на одной вкладке авторизовался на тестовом аккаунте, на другой зашел что-то посмотреть под клиентом. В дополнении к этому может быть открыто еще с десяток каких-то других вкладок и все они перемешиваются, и начинаешь путаться.
Чтобы больше не тратить время на поиск нужной вкладки и не совершать ошибок, мы взяли иконку нашего сервиса (favicon) и сделали несколько ее копий в разных цветах. Каждый цвет под отдельный кейс. Затем написали простую функцию смены иконки и завернули это в React хук, который определяет в каком окружении сейчас находится приложение и при необходимости меняет иконку.
Получилось простое и быстрое решение, которое делает разработку более удобной. На клиентах это никак не отразилось, т.к. они всегда видят оригинальный favicon.
👍14
Шоу “Громкий вопрос” одно из немногих, которые мы с женой часто смотрим по вечерам. Помимо развлекательной составляющей, оно интересно тем, что каждую игру формируется новая команда, и их игра очень напоминает как работают современные команды разработки.
Первые минут 15-20 знакомства с новым гостем мы обычно проматываем, но тут есть несколько интересных командообразующих деталей, на которые стоит обратить внимание начинающим тимлидам.
Во-первых, ведущие спрашивают гостя, что сейчас происходит у него в жизни, сдабривая это юмором. И это важно для формирования любой команды – интересоваться что у людей происходит в жизни помимо работы и поддерживать дружескую позитивную атмосферу.
Во-вторых, они придумывают ритуал как будут радоваться успешным ответам. Это интересный ход – появляется нечто, что важно и понятно только внутри команде. Также это дополнительная мотивация – взять вопрос, чтобы исполнить этот ритуал.
В-третьих и самое важное на мой взгляд – обязательно звучит фраза “мы сегодня все вместе или выиграем или проиграем”. Это вообще прямая отсылка к Agile манифесту.
Дальше начинается игра и она очень напоминает работу по Scrum методологии. Есть спринты (в жизни обычно 2 недели, в игре – один раунд). В начале спринта команда проводит планирование, решая какие задачи они возьмут в работу в спринте. У каждой задачи есть своя оценка сложности – в часах или сторипоинтах (попугаях). В игре у них есть зеленые, синие и черные вопросы.
По окончании каждого спринта проводится ретроспектива – работа над ошибками и анализ того, сколько задач (суммарное количество сторипоинтов) можно взять в следующий спринт, чтобы его выполнить. Это очень важно, т.к. позволяет понять сколько задач команда сможет реализовать за квартал, и спрогнозировать когда будут сделаны задачи, которые пока где-то в очереди.
Так и в игре, если посмотрите, они проводят ретроспективу между раундами, чтобы понять с каким количеством заработанных минут они подойдут к финалу, и в случае чего изменить стратегию или переключиться на другие вопросы.
Еще интересно, когда игроки в шоу находят ответ раньше минуты, то в оставшееся время проводят тестирование: Арсений просит гостя еще раз прочитать вопрос, чтобы свериться с ответом. Все как в жизни )
В общем, всегда интересно посмотреть на что-то под другим углом и извлечь для себя что-то полезное.
Первые минут 15-20 знакомства с новым гостем мы обычно проматываем, но тут есть несколько интересных командообразующих деталей, на которые стоит обратить внимание начинающим тимлидам.
Во-первых, ведущие спрашивают гостя, что сейчас происходит у него в жизни, сдабривая это юмором. И это важно для формирования любой команды – интересоваться что у людей происходит в жизни помимо работы и поддерживать дружескую позитивную атмосферу.
Во-вторых, они придумывают ритуал как будут радоваться успешным ответам. Это интересный ход – появляется нечто, что важно и понятно только внутри команде. Также это дополнительная мотивация – взять вопрос, чтобы исполнить этот ритуал.
В-третьих и самое важное на мой взгляд – обязательно звучит фраза “мы сегодня все вместе или выиграем или проиграем”. Это вообще прямая отсылка к Agile манифесту.
Дальше начинается игра и она очень напоминает работу по Scrum методологии. Есть спринты (в жизни обычно 2 недели, в игре – один раунд). В начале спринта команда проводит планирование, решая какие задачи они возьмут в работу в спринте. У каждой задачи есть своя оценка сложности – в часах или сторипоинтах (попугаях). В игре у них есть зеленые, синие и черные вопросы.
По окончании каждого спринта проводится ретроспектива – работа над ошибками и анализ того, сколько задач (суммарное количество сторипоинтов) можно взять в следующий спринт, чтобы его выполнить. Это очень важно, т.к. позволяет понять сколько задач команда сможет реализовать за квартал, и спрогнозировать когда будут сделаны задачи, которые пока где-то в очереди.
Так и в игре, если посмотрите, они проводят ретроспективу между раундами, чтобы понять с каким количеством заработанных минут они подойдут к финалу, и в случае чего изменить стратегию или переключиться на другие вопросы.
Еще интересно, когда игроки в шоу находят ответ раньше минуты, то в оставшееся время проводят тестирование: Арсений просит гостя еще раз прочитать вопрос, чтобы свериться с ответом. Все как в жизни )
В общем, всегда интересно посмотреть на что-то под другим углом и извлечь для себя что-то полезное.
🔥9👍3❤2
В этом году планирую больше внимания уделить ИИ и их внедрению в рабочие процессы. Посмотрел несколько докладов, и пока самым интересным показалось выступление Алексея Раптева: “Оптимизация процесса разработки с помощью LLM”.
Основные идеи: проверять с помощью нейронок, что новые задачи не противоречат существующей бизнес-логике и форматировать описание тикетов по SMARTу. Мне кажется, для нас это актуально и поможет сделать больше порядка в нашем таск-трекере. Можно попробовать применить это в модуле биллинга, где сейчас самая большая концентрация сложной логики, которую сложно целиком удержать в голове.
Также можно попробовать с помощью LLM проанализировать существующие тест-кейсы нашей системы. Возможно, получится найти противоречия или места, которые пока слабо покрыты тестами.
В общем, надо пробовать. Тема кажется перспективной.
Ссылка на доклад: https://www.youtube.com/watch?v=dzB3q3xNsIE
Основные идеи: проверять с помощью нейронок, что новые задачи не противоречат существующей бизнес-логике и форматировать описание тикетов по SMARTу. Мне кажется, для нас это актуально и поможет сделать больше порядка в нашем таск-трекере. Можно попробовать применить это в модуле биллинга, где сейчас самая большая концентрация сложной логики, которую сложно целиком удержать в голове.
Также можно попробовать с помощью LLM проанализировать существующие тест-кейсы нашей системы. Возможно, получится найти противоречия или места, которые пока слабо покрыты тестами.
В общем, надо пробовать. Тема кажется перспективной.
Ссылка на доклад: https://www.youtube.com/watch?v=dzB3q3xNsIE
YouTube
Оптимизация процесса разработки с помощью LLM | Алексей Раптев Т-банк
ChatGPT заменит разработчиков? 🗿Нет, но вполне может им помочь!
Если вы хотите узнать, как большие языковые модели, LLM, ускоряют и упрощают работу программистов, то вам обязательно нужно послушать доклад Алексея Раптева — руководителя группы разработки…
Если вы хотите узнать, как большие языковые модели, LLM, ускоряют и упрощают работу программистов, то вам обязательно нужно послушать доклад Алексея Раптева — руководителя группы разработки…
🔥7👍3
Фича-флаги во фронтенде: плавные релизы и современный подход к разработке 🚀
Фича-флаги (feature flags) — это инструмент, который позволяет безопасно и управляемо внедрять новые фичи. С их помощью можно:
✔️ Запускать фичи на ограниченной аудитории: Например, тестировать новую функциональность на 5-10% пользователей, чтобы проверить её стабильность.
✔️ Постепенно расширять охват: Увеличивать количество пользователей, видящих новую фичу, без стресса для команды.
✔️ Управлять доступом по сегментам: Включать функционал только для бета-тестеров, премиум-аккаунтов или других категорий.
🛠️ Фича-флаги и Base Trunk Development
Фича-флаги идеально работают в связке с подходом Base Trunk Development (разработка в основной ветке репозитория). Этот метод позволяет:
✔️Деплоить "сырой" код в основную ветку без риска — фича остаётся выключенной до готовности.
✔️Избежать конфликтов между ветками, так как все изменения сосредоточены в основной ветке.
✔️Быстро итеративно дорабатывать фичи, активируя их только тогда, когда они полностью готовы.
Пример:
В данном случае флаг enableDarkMode позволяет переключать тему интерфейса, не требуя дополнительных деплоев.
❓ А если флаги — это не только для релизов?
Фича-флаги часто рассматриваются как временный инструмент, но что, если их использовать для постоянного управления функционалом? Например:
✔️Разделение функционала между тарифами (базовый, премиум, корпоративный).
✔️Динамическая настройка доступов для разных групп пользователей.
Это добавляет новые вызовы:
❓Как проектировать архитектуру, чтобы избежать путаницы в коде?
❓Как эффективно управлять большим количеством флагов?
🎥 О том, как нам удалось внедрить это в Sendsay и сделать понятную архитектуру, рассказал наш техлид Артем Герус на MoscowJS в Т-банке:
https://www.youtube.com/live/XIHCtCwF0hk?t=558s (начало 9:20)
Фича-флаги (feature flags) — это инструмент, который позволяет безопасно и управляемо внедрять новые фичи. С их помощью можно:
✔️ Запускать фичи на ограниченной аудитории: Например, тестировать новую функциональность на 5-10% пользователей, чтобы проверить её стабильность.
✔️ Постепенно расширять охват: Увеличивать количество пользователей, видящих новую фичу, без стресса для команды.
✔️ Управлять доступом по сегментам: Включать функционал только для бета-тестеров, премиум-аккаунтов или других категорий.
🛠️ Фича-флаги и Base Trunk Development
Фича-флаги идеально работают в связке с подходом Base Trunk Development (разработка в основной ветке репозитория). Этот метод позволяет:
✔️Деплоить "сырой" код в основную ветку без риска — фича остаётся выключенной до готовности.
✔️Избежать конфликтов между ветками, так как все изменения сосредоточены в основной ветке.
✔️Быстро итеративно дорабатывать фичи, активируя их только тогда, когда они полностью готовы.
Пример:
if (featureFlags.enableDarkMode) {
renderDarkMode();
} else {
renderLightMode();
}
В данном случае флаг enableDarkMode позволяет переключать тему интерфейса, не требуя дополнительных деплоев.
❓ А если флаги — это не только для релизов?
Фича-флаги часто рассматриваются как временный инструмент, но что, если их использовать для постоянного управления функционалом? Например:
✔️Разделение функционала между тарифами (базовый, премиум, корпоративный).
✔️Динамическая настройка доступов для разных групп пользователей.
Это добавляет новые вызовы:
❓Как проектировать архитектуру, чтобы избежать путаницы в коде?
❓Как эффективно управлять большим количеством флагов?
🎥 О том, как нам удалось внедрить это в Sendsay и сделать понятную архитектуру, рассказал наш техлид Артем Герус на MoscowJS в Т-банке:
https://www.youtube.com/live/XIHCtCwF0hk?t=558s (начало 9:20)
YouTube
MoscowJS 59, 6 июня, Т-банк
Ждем ваши вопросы докладчикам: https://moscowjs.org/qna
Чат для обсуждений: https://t.me/moscowjschat
Канал сообщества: https://t.me/moscowjs
Информационная поддержка:
IT Meeting — митапы и конференции о разработке https://t.me/ITMeeting
Митапочная — анонсы…
Чат для обсуждений: https://t.me/moscowjschat
Канал сообщества: https://t.me/moscowjs
Информационная поддержка:
IT Meeting — митапы и конференции о разработке https://t.me/ITMeeting
Митапочная — анонсы…
👍7❤4🔥3
Мокирование API-запросов в runtime: ⚡️ ускоряем проверку специальных сценариев
Мы столкнулись с множеством ситуаций, когда разработчики меняют крошечные детали (например, текст), которые видны только определённым клиентам на специфичных аккаунтах. QA-команде приходилось тратить уйму времени, чтобы найти «особенного» пользователя и получить к нему доступ. Мы решили эту проблему, позволив подменять часть ответа бэкенда «на лету» — так нужное состояние интерфейса можно получить мгновенно.
🔑 Ключевая идея
Единый «коннектор»
Все запросы к API проходят через один модуль (например, обёртку для axios). В нём мы проверяем, есть ли для данного запроса mock в localStorage. Если mock найден, реальный запрос всё равно отправляется, но при получении ответа мы подменяем указанные поля.
Хранение mocks в localStorage
Сохраняем JSON: какие запросы «ловить» и какие поля ответа подменять.
Подмена происходит уже после реального запроса, в «коннекторе».
Чтобы удалить mocks, достаточно очистить localStorage через Dev Tools.
Удобное редактирование прямо в интерфейсе
Обычно можно было бы сделать специальные функции и «вытащить» их в глобальное окружение, чтобы управлять этим через Dev Tools.
Но у нас в интерфейсе Sendsay есть «API-консоль» (аналог Postman). Мы добавили в неё поле mock: всё, что туда записывается, сохраняется в localStorage и применяется при следующих запросах.
✅ Преимущества
Экономия времени: не нужно искать «особенного» клиента.
Гибкость: легко проверять сценарии для специфичных аккаунтов.
Прозрачность: управление мокированием сосредоточено в одном месте, а данные для mock хранятся в localStorage.
✨Итог
Мы реализовали мокирование запросов прямо в интерфейсе, не отказываясь при этом от реальных ответов сервера, а лишь подменяя нужные поля «на лету». Это ускорило работу QA и упростило тестирование редких сценариев. Теперь, чтобы проверить изменения для определённых категорий пользователей, достаточно создать или отредактировать нужный mock в «API-консоли» — и сразу увидеть, как всё будет выглядеть в приложении.
Мы столкнулись с множеством ситуаций, когда разработчики меняют крошечные детали (например, текст), которые видны только определённым клиентам на специфичных аккаунтах. QA-команде приходилось тратить уйму времени, чтобы найти «особенного» пользователя и получить к нему доступ. Мы решили эту проблему, позволив подменять часть ответа бэкенда «на лету» — так нужное состояние интерфейса можно получить мгновенно.
🔑 Ключевая идея
Единый «коннектор»
Все запросы к API проходят через один модуль (например, обёртку для axios). В нём мы проверяем, есть ли для данного запроса mock в localStorage. Если mock найден, реальный запрос всё равно отправляется, но при получении ответа мы подменяем указанные поля.
Хранение mocks в localStorage
Сохраняем JSON: какие запросы «ловить» и какие поля ответа подменять.
Подмена происходит уже после реального запроса, в «коннекторе».
Чтобы удалить mocks, достаточно очистить localStorage через Dev Tools.
Удобное редактирование прямо в интерфейсе
Обычно можно было бы сделать специальные функции и «вытащить» их в глобальное окружение, чтобы управлять этим через Dev Tools.
Но у нас в интерфейсе Sendsay есть «API-консоль» (аналог Postman). Мы добавили в неё поле mock: всё, что туда записывается, сохраняется в localStorage и применяется при следующих запросах.
✅ Преимущества
Экономия времени: не нужно искать «особенного» клиента.
Гибкость: легко проверять сценарии для специфичных аккаунтов.
Прозрачность: управление мокированием сосредоточено в одном месте, а данные для mock хранятся в localStorage.
✨Итог
Мы реализовали мокирование запросов прямо в интерфейсе, не отказываясь при этом от реальных ответов сервера, а лишь подменяя нужные поля «на лету». Это ускорило работу QA и упростило тестирование редких сценариев. Теперь, чтобы проверить изменения для определённых категорий пользователей, достаточно создать или отредактировать нужный mock в «API-консоли» — и сразу увидеть, как всё будет выглядеть в приложении.
🔥13❤2
Почему тестовые работы кандидатов «улетают в трубу»?
Кажется, мы уже привыкли: кандидат выполняет тестовую работу, отправляет её — и в ответ тишина. Это воспринимается как стандарт, хотя на самом деле это не норма и так быть не должно.
На TeamLead Conf я рассказал, почему кандидаты часто не получают обратной связи. Мы разобрали основные причины: отсутствие процессов, нехватку времени у HR и тимлидов, субъективность оценки заданий. Все это создаёт проблемы не только для кандидатов, но и для компаний.
В Sendsay мы смогли выстроить процесс, при котором обрабатываем до сотни выполненных тестовых работ, и каждый кандидат получает обратную связь. Это оказалось проще, чем можно было представить.
Вот ключевые моменты:
✅ Чек-листы для оценки. Прозрачные критерии делают процесс объективным и понятным.
⚙️ Автоматизация. Упрощение рутинных задач помогает сосредоточиться на сути.
✍️ Культура обратной связи. Даже несколько строк об успехах и недостатках задания помогают кандидатам расти.
Команда — это самое важное. А начинается она с найма. Прозрачный и уважительный процесс отбора помогает заложить прочный фундамент для сильной команды.
🎥 Смотрите запись моего выступления, чтобы узнать больше: https://www.youtube.com/watch?v=fh7J93LUZLE.
Кажется, мы уже привыкли: кандидат выполняет тестовую работу, отправляет её — и в ответ тишина. Это воспринимается как стандарт, хотя на самом деле это не норма и так быть не должно.
На TeamLead Conf я рассказал, почему кандидаты часто не получают обратной связи. Мы разобрали основные причины: отсутствие процессов, нехватку времени у HR и тимлидов, субъективность оценки заданий. Все это создаёт проблемы не только для кандидатов, но и для компаний.
В Sendsay мы смогли выстроить процесс, при котором обрабатываем до сотни выполненных тестовых работ, и каждый кандидат получает обратную связь. Это оказалось проще, чем можно было представить.
Вот ключевые моменты:
✅ Чек-листы для оценки. Прозрачные критерии делают процесс объективным и понятным.
⚙️ Автоматизация. Упрощение рутинных задач помогает сосредоточиться на сути.
✍️ Культура обратной связи. Даже несколько строк об успехах и недостатках задания помогают кандидатам расти.
Команда — это самое важное. А начинается она с найма. Прозрачный и уважительный процесс отбора помогает заложить прочный фундамент для сильной команды.
🎥 Смотрите запись моего выступления, чтобы узнать больше: https://www.youtube.com/watch?v=fh7J93LUZLE.
YouTube
Фидбэк по тестовому заданию? Не, не слышал / Алексей Николаев
Приглашаем на самую крупную мультиформатную конференцию для тимлидов и руководителей не только из IT — TeamLead Conf 2025, которая пройдет 10 и 11 ноября 2025 в Москве.
Подробнее о конференции: https://clck.ru/3NUaBv
________
Самая крупная мультиформатная…
Подробнее о конференции: https://clck.ru/3NUaBv
________
Самая крупная мультиформатная…
🔥16❤3
🎨 50 оттенков хаоса: как мы навели порядок в палитре проекта
Работая над дизайн-системой для нашего проекта в Sendsay, мы столкнулись с распространённой проблемой: одни и те же элементы в разных частях приложения имели разные оттенки цветов.
Например, синяя кнопка везде оставалась синей, но оттенки различались: где-то она была светлее, где-то темнее. Особенно это бросалось в глаза на бордерах и тенях. Мы осознали, что у нас в проекте используется множество близких, но разных оттенков одного и того же цвета — своеобразные "50 оттенков серого" (и не только серого, но и синего, зелёного и других).
Эта проблема знакома многим командам, особенно на крупных проектах, где над дизайном работают разные люди. На эту тему есть классный доклад Семена Левенсона про дизайн-систему Яндекс.Дзена, но готового решения там не было. Поэтому мы решили создать свой инструмент.
🛠 Как мы это сделали
Мы разработали CLI-утилиту, которую назвали
1️⃣ Создание палитры
В основе лежит JSON-файл с палитрой всех цветов. Мы взяли палитру Tailwind и добавили в нее наши брендовые цвета.
2️⃣ Анализ проекта
Утилита с помощью регулярных выражений парсит весь код проекта, находит все упоминания цветов (в любом формате: HEX, RGB, HSL) и приводит их к HEX-формату.
Пример запуска для поиска всех цветов в проекте:
3️⃣ Сравнение и подбор
Затем она выводит список всех использованных в проекте цветов, подбирая к каждому ближайший оттенок из палитры по специальному алгоритму. Если найденный оттенок подходит в рамках заданной дельты, он подсвечивается зеленым.
4️⃣ Проверка дизайнером
Мы отдали результат дизайнеру на согласование, чтобы убедиться, что автоматическая замена работает корректно.
5️⃣ Автоматическая замена
После одобрения мы повторно запускаем утилиту с аргументом, который заменяет цвета в коде на выбранные из палитры.
Пример команды для автоматической замены цветов:
✅ Результат
В итоге мы смогли унифицировать большую часть цветов в проекте, ускорить процесс и минимизировать человеческий фактор.
Особняком стояли цвета с прозрачностью. Для них мы создали отдельный алгоритм, который помогает находить ближайшие цвета с учетом альфа-канала. Однако, чтобы избежать ошибок, мы решили приводить такие цвета вручную. Это позволило учесть нюансы и сохранить визуальную согласованность в сложных сценариях.
Это позволило нам не только привести проект в порядок, но и заложить фундамент для дальнейшего развития дизайн-системы.
🌐 Утилита в открытом доступе
Мы опубликовали
🔗 Ссылка на утилиту в npm
Работая над дизайн-системой для нашего проекта в Sendsay, мы столкнулись с распространённой проблемой: одни и те же элементы в разных частях приложения имели разные оттенки цветов.
Например, синяя кнопка везде оставалась синей, но оттенки различались: где-то она была светлее, где-то темнее. Особенно это бросалось в глаза на бордерах и тенях. Мы осознали, что у нас в проекте используется множество близких, но разных оттенков одного и того же цвета — своеобразные "50 оттенков серого" (и не только серого, но и синего, зелёного и других).
Эта проблема знакома многим командам, особенно на крупных проектах, где над дизайном работают разные люди. На эту тему есть классный доклад Семена Левенсона про дизайн-систему Яндекс.Дзена, но готового решения там не было. Поэтому мы решили создать свой инструмент.
🛠 Как мы это сделали
Мы разработали CLI-утилиту, которую назвали
zimablue
(с отсылкой к одноименной короткометражке из "Любовь, смерть и роботы"). Вот как она работает:1️⃣ Создание палитры
В основе лежит JSON-файл с палитрой всех цветов. Мы взяли палитру Tailwind и добавили в нее наши брендовые цвета.
2️⃣ Анализ проекта
Утилита с помощью регулярных выражений парсит весь код проекта, находит все упоминания цветов (в любом формате: HEX, RGB, HSL) и приводит их к HEX-формату.
Пример запуска для поиска всех цветов в проекте:
npx zimablue -f './**/*.css'
3️⃣ Сравнение и подбор
Затем она выводит список всех использованных в проекте цветов, подбирая к каждому ближайший оттенок из палитры по специальному алгоритму. Если найденный оттенок подходит в рамках заданной дельты, он подсвечивается зеленым.
4️⃣ Проверка дизайнером
Мы отдали результат дизайнеру на согласование, чтобы убедиться, что автоматическая замена работает корректно.
5️⃣ Автоматическая замена
После одобрения мы повторно запускаем утилиту с аргументом, который заменяет цвета в коде на выбранные из палитры.
Пример команды для автоматической замены цветов:
npx zimablue -f './**/*.css' --replace
✅ Результат
В итоге мы смогли унифицировать большую часть цветов в проекте, ускорить процесс и минимизировать человеческий фактор.
Особняком стояли цвета с прозрачностью. Для них мы создали отдельный алгоритм, который помогает находить ближайшие цвета с учетом альфа-канала. Однако, чтобы избежать ошибок, мы решили приводить такие цвета вручную. Это позволило учесть нюансы и сохранить визуальную согласованность в сложных сценариях.
Это позволило нам не только привести проект в порядок, но и заложить фундамент для дальнейшего развития дизайн-системы.
🌐 Утилита в открытом доступе
Мы опубликовали
zimablue
в npm как публичный пакет. Если у вас в проекте стоит похожая задача, вы можете воспользоваться нашим решением. Надеемся, оно сэкономит вам время и нервы!🔗 Ссылка на утилиту в npm
npm
npm: zimablue
a CLI utility for matching colors to a palette. Latest version: 1.1.6, last published: a year ago. Start using zimablue in your project by running `npm i zimablue`. There are no other projects in the npm registry using zimablue.
🔥10❤1
Чуть больше года назад я начал выступать, и за это время у меня было 7 выступлений на разных конференциях и митапах. Этот опыт сильно изменил мое восприятие публичных выступлений.
Вокруг меня много талантливых людей, которым есть чем поделиться с широкой аудиторией, но они не решаются выступать — возможно, из-за тех же страхов и предубеждений, что были у меня. Вот несколько выводов, которые помогли мне изменить отношение к публичным выступлениям.
1️⃣ Страх выступления — это нормально
Многие думают, что боятся выступать сильнее, чем остальные. На самом деле страх перед публикой есть у всех. Главное — перебороть себя в первый раз, дальше будет легче, но волнение никогда не уходит полностью. Я знаю одного известного спикера, который после выступления сказал: "Блин, меня всего трясло перед выходом на сцену". Это как прыжок в воду с высоты: страшно только перед первым шагом.
2️⃣ Не нужно быть суперэкспертом
Есть миф, что для выступления нужно обладать какими-то уникальными знаниями. На самом деле, мы все работаем с похожими технологиями, но у каждого свой путь, и ваш опыт может оказаться ценным для других. К тому же на митапах много начинающих специалистов, которым интересны даже базовые вещи. Формула хорошего доклада: 60% знакомого большинству материала, 30% углубления в тему и 10% уникальной информации, которую нашли только вы.
3️⃣ Не вам решать, интересна ли тема
Если у вас есть идея доклада, но кажется, что она неинтересна — доверьте это программному комитету конференции. Они видели сотни заявок и знают, что зайдет аудитории. Просто подайте заявку, и если тема не подходит, вам скажут, как её доработать. В большинстве случаев с вами свяжутся, предложат созвониться и дадут рекомендации.
4️⃣ Не нужно готовить доклад месяцами перед подачей
Лучше сначала отправить заявку с идеей, а уже потом дорабатывать материал вместе с программным комитетом. У меня был опыт, когда я подавался с полностью готовым докладом — и пришлось его переделывать. Гораздо удобнее идти поэтапно: идея → обсуждение → план → слайды → речь → репетиция. Так меньше лишней работы и больше пользы.
5️⃣ На конференции сложно пробиться
Да, на некоторые конференции действительно большой конкурсный отбор, но в большинстве случаев программному комитету не хватает спикеров, и они остро заинтересованы в новых докладах. Пока моя личная статистика такова, что меня брали везде, где я подавался. Начните с бесплатных митапов и двигайтесь дальше, постепенно переходя к более масштабным и дорогим конференциям.
Если вы задумываетесь о выступлениях, но боитесь — попробуйте. Это ценный опыт, новые знакомства и возможность лучше разобраться в теме, о которой рассказываешь. Первый шаг самый сложный, но потом становится проще и интереснее!
Вокруг меня много талантливых людей, которым есть чем поделиться с широкой аудиторией, но они не решаются выступать — возможно, из-за тех же страхов и предубеждений, что были у меня. Вот несколько выводов, которые помогли мне изменить отношение к публичным выступлениям.
1️⃣ Страх выступления — это нормально
Многие думают, что боятся выступать сильнее, чем остальные. На самом деле страх перед публикой есть у всех. Главное — перебороть себя в первый раз, дальше будет легче, но волнение никогда не уходит полностью. Я знаю одного известного спикера, который после выступления сказал: "Блин, меня всего трясло перед выходом на сцену". Это как прыжок в воду с высоты: страшно только перед первым шагом.
2️⃣ Не нужно быть суперэкспертом
Есть миф, что для выступления нужно обладать какими-то уникальными знаниями. На самом деле, мы все работаем с похожими технологиями, но у каждого свой путь, и ваш опыт может оказаться ценным для других. К тому же на митапах много начинающих специалистов, которым интересны даже базовые вещи. Формула хорошего доклада: 60% знакомого большинству материала, 30% углубления в тему и 10% уникальной информации, которую нашли только вы.
3️⃣ Не вам решать, интересна ли тема
Если у вас есть идея доклада, но кажется, что она неинтересна — доверьте это программному комитету конференции. Они видели сотни заявок и знают, что зайдет аудитории. Просто подайте заявку, и если тема не подходит, вам скажут, как её доработать. В большинстве случаев с вами свяжутся, предложат созвониться и дадут рекомендации.
4️⃣ Не нужно готовить доклад месяцами перед подачей
Лучше сначала отправить заявку с идеей, а уже потом дорабатывать материал вместе с программным комитетом. У меня был опыт, когда я подавался с полностью готовым докладом — и пришлось его переделывать. Гораздо удобнее идти поэтапно: идея → обсуждение → план → слайды → речь → репетиция. Так меньше лишней работы и больше пользы.
5️⃣ На конференции сложно пробиться
Да, на некоторые конференции действительно большой конкурсный отбор, но в большинстве случаев программному комитету не хватает спикеров, и они остро заинтересованы в новых докладах. Пока моя личная статистика такова, что меня брали везде, где я подавался. Начните с бесплатных митапов и двигайтесь дальше, постепенно переходя к более масштабным и дорогим конференциям.
Если вы задумываетесь о выступлениях, но боитесь — попробуйте. Это ценный опыт, новые знакомства и возможность лучше разобраться в теме, о которой рассказываешь. Первый шаг самый сложный, но потом становится проще и интереснее!
👍13🔥8
Решил в свободное время потихоньку разбираться в смарт-контрактах и блокчейне. Казалось бы, что может быть дальше от фронтенда? Другая парадигма, строгая типизация, low-level программирование, какие-нибудь сложные языки...
Но на один из первых же вопросов «Как создать свой мем-коин?» получил такой ответ:
Установите Node.js, если его у вас еще нет.
Установите необходимые npm-пакеты:
Создайте новый проект и смарт-контракт на Solidity:
Задеплойте его через Hardhat...
Стоп. Чего?! NPM пакеты?! Вы могли выбрать что угодно, но выбрали JavaScript и npm модули?
Блокчейн, в котором миллионы долларов зависят от безопасности кода, используют npm-пакеты, которые могут удалить, взломать или подменить в любой момент? Теперь понятно, почему в крипте столько скама.
Но на один из первых же вопросов «Как создать свой мем-коин?» получил такой ответ:
Установите Node.js, если его у вас еще нет.
Установите необходимые npm-пакеты:
npm install -g hardhat
npm install @openzeppelin/contracts
Создайте новый проект и смарт-контракт на Solidity:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyMemeCoin is ERC20 {
constructor() ERC20("MyMemeCoin", "MEME") {
_mint(msg.sender, 1000000 * 10 ** decimals());
}
}
Задеплойте его через Hardhat...
Стоп. Чего?! NPM пакеты?! Вы могли выбрать что угодно, но выбрали JavaScript и npm модули?
Блокчейн, в котором миллионы долларов зависят от безопасности кода, используют npm-пакеты, которые могут удалить, взломать или подменить в любой момент? Теперь понятно, почему в крипте столько скама.
🔥1😱1
Мой вчерашний эксперимент в сториз ещё раз показал: количество открытых вакансий реально сократилось. Из 100 человек, которые увидели мой пост о поиске вакансии фронтендера, написали только двое — и оба подумали, что я предлагаю работу, а не ищу её сам.
Я хорошо помню время, когда каждые пару дней кто-то стучался в телегу с предложением. Мы сами стали свидетелями, как всего за несколько лет рынок ИТ перешёл из «HR-ы, просьба не беспокоить» к «эй, HR-ы, ау, вы где?».
Причины у этого понятные и общие для всей экономики: высокая ставка ЦБ, санкции, сокращение инвестиций. Это не только про ИТ — это про весь рынок труда. Вот немного цифр для контекста.
Последние два года я всем говорю одно и то же: пытаться «войти в ИТ» сейчас — всё равно что догонять поезд, где люди уже сидят на крыше, а сам поезд давно отъехал от перрона. Это как в трейдинге: если ваш таксист между делом покупает крипту прямо на светофоре — значит, пора фиксировать прибыль, потому что скоро будет обвал.
Что делать? На мой взгляд, куда разумнее смотреть на ниши, которые только набирают обороты. Например — ИИ. Пока в МФЦ стоят очереди и работают толпы сотрудников, значит, есть огромное поле для автоматизации. Самое время разбираться, как создавать ИИ-агентов и овладевать инструментами вроде Flowise или Motion.
Я хорошо помню время, когда каждые пару дней кто-то стучался в телегу с предложением. Мы сами стали свидетелями, как всего за несколько лет рынок ИТ перешёл из «HR-ы, просьба не беспокоить» к «эй, HR-ы, ау, вы где?».
Причины у этого понятные и общие для всей экономики: высокая ставка ЦБ, санкции, сокращение инвестиций. Это не только про ИТ — это про весь рынок труда. Вот немного цифр для контекста.
Последние два года я всем говорю одно и то же: пытаться «войти в ИТ» сейчас — всё равно что догонять поезд, где люди уже сидят на крыше, а сам поезд давно отъехал от перрона. Это как в трейдинге: если ваш таксист между делом покупает крипту прямо на светофоре — значит, пора фиксировать прибыль, потому что скоро будет обвал.
Что делать? На мой взгляд, куда разумнее смотреть на ниши, которые только набирают обороты. Например — ИИ. Пока в МФЦ стоят очереди и работают толпы сотрудников, значит, есть огромное поле для автоматизации. Самое время разбираться, как создавать ИИ-агентов и овладевать инструментами вроде Flowise или Motion.
Telegram
··• Серёжа печатает
Приехало немного аналитики по рынку, которая наглядно показывает, что именно происходит в ИТ.
Давайте начнём с ключевого. Есть ежемесячный отчёт HH, который показывает число активных вакансий (то есть вакансий, в которых есть активность), число активных…
Давайте начнём с ключевого. Есть ежемесячный отчёт HH, который показывает число активных вакансий (то есть вакансий, в которых есть активность), число активных…
🔥8