TGViewer
Channel Public Channel
Женя Янченко

Женя Янченко

@jane_yanchenko

Блог про архитектуру, работу и карьеру в ИТ. Автор - бэкендер, тимлид, руководитель разработки.
Истории из опыта, инструменты и лайфхаки.

Написать мне: @miralasse
Subscribers
5.51K
Photos
234
Videos
3
Links
119
Recent Posts 20 shown
Post #416 827
Post #415 792
🎞 Готова запись стрима про Кафку:

https://youtu.be/2aRKsD-MWDA

Большое спасибо всем, кто пришел, слушал и задавал вопросы! Благодаря вам получилось очень живое и интересное обсуждение 💖
YouTube Симулятор Apache Kafka Разбираем базовые механики Apache Kafka и нюансы использования в симуляторе https://softwaremill.com/kafka-visualisation Ведущие: Евгения Янченко -- https://t.me/jane_yanchenko Андрей Бураков -- https://t.me/another_sa
  • 🔥 14
  • ❤ 10
  • 🎉 5
  • ❤‍🔥 3
  • 👍 2
Post #414 1.85K
Женя Янченко Любите ли вы Кафку так, как люблю её я? Мы с Андреем из Yet Another Analyst решили сделать коллаб — совместный стрим про Кафку. Поговорим про распределение сообщений, консьюмер-группы, масштабирование, можно ли сломать порядок сообщений, какие гарантии…
Сегодня стрим по Кафке в 19:00

Планируем не в формате доклада, а в формате вопрос-ответ, чтобы было веселее. Андрей будет задавать свои и ваши вопросы, попробуем смоделировать на симуляторе разные ситуации.

Приходите!
🔗 Ссылка на Timepad
tech-analyst-club.timepad.ru Симулятор Apache Kafka / События на TimePad.ru Рубимся в симуляторе Apache Kafka, разбираем принципы работы, ломаем гарантии и порядок доставки, обсуждаем экзотические кейсы, отвечаем на вопросы участников.
  • 👍 19
  • ❤ 13
  • 🔥 13
Post #413 1.74K
  • ❤ 10
Post #412 1.61K
  • ❤ 7
Post #411 1.47K
  • ❤‍🔥 11
Post #410 1.53K
Соотношение чтений к записям (read/write ratio)

На всех собесах, где поднимались архитектурные вопросы (сисдиз или нет), интервьюер никогда не подсвечивал это сам, но обычно одобрительно кивал, когда я озвучивала эту характеристику системы. Давайте посмотрим, для чего это может быть полезно.

➡️ На сисдиз собесе

1️⃣Влияет на выбор подходящей БД

Архитектура хранения зависит в том числе от того, будут ли в системе преобладать чтения или записи, а также от абсолютных значений нагрузки: условно 1000 RPS или 1000000 RPS.

Для систем с преобладанием чтения (read-heavy) стоит выбирать хранилище, оптимизированное для сценариев чтения (поиск, фильтрация). Например, реляционку или подходящую NoSQL БД.

Для write-heavy систем часто хорошо подходят базы данных на основе LSM-деревьев (на мой вкус про них очень хорошо написано в кабанчике), например Cassandra.

К сожалению, я не работала с Кассандрой в проде, но однажды успешно прошла собес предложив и обосновав ее использование для проектируемой системы.

Конечно, и PostgreSQL можно использовать в write-heavy сценариях, особенно если нам важны полноценные ACID-транзакции. Вопрос скорее в масштабе нагрузки и других требованиях системы.

2️⃣Для предложения кэширования или наоборот асинхронной обработки

Для read-heavy систем, если одни и те же данные читаются многократно, часто ставят кэш перед БД, чтобы снизить нагрузку на нее.

Для write-heavy кэш, конечно, не решит проблему высокой нагрузки на запись. Тут, если нужно и система позволяет, может пригодиться асинхронный подход: между приемом данных и их обработкой можно поставить очередь. Она позволит сглаживать пики нагрузки и обрабатывать записи с той скоростью, которую выдерживает downstream-система.

Конечно, если средняя скорость поступления данных постоянно выше скорости обработки, очередь проблему не решит. Обычно на сисдизах тут появляется горизонтальное масштабирование обработчиков.

3️⃣Для обсуждения репликации

Для read-heavy систем может использоваться подход, когда запись производится на мастер (лидер), а часть чтений уходит на реплики.

Для write-heavy систем репликация тоже нужна, в первую очередь для отказоустойчивости (если лидер вышел из строя, переключились на реплику).

➡️ В жизни

На практике мы не часто сталкиваемся с построением с нуля большой системы с выбором всех технологий. Тем не менее оценка соотношения чтений и записей может пригодиться и для локальных доработок.

Например, когда проектируем новую фичу, требующую новых таблиц в БД:

Если будет heavy-read, то можно сразу задуматься об индексах. По каким полям будет частый поиск? Фильтрация? Сортировка?

Если будет heavy-write, то наоборот не стоит перегружать таблицу индексами, чтобы не замедлять запись.

Если нагрузка высокая, и данные при записи сильно отличаются от того, что нам удобно для чтения, можно поддерживать отдельную read-модель: сохранять исходные данные в одной таблице, а асинхронно наполнять другую, оптимизированную под конкретные запросы. Я на практике встречала такой подход.

А что преобладает в вашей части продукта?

🦆 - чтения
🐼 - записи
🦄 - в разных частях по-разному
  • 🦄 18
  • ❤ 10
  • 👍 3
  • 🔥 2
  • ❤‍🔥 1
  • 🎉 1
Post #409 2.37K
Привет!

У тебя уже очень крутая карьера и хороший управленческий опыт. Лидить 10 человек напрямую и 25 косвенно в большом финтехе — это серьезный уровень 🔥

Из вопроса мне не совсем понятно, хочешь ли ты перейти в бэк и сохранить лидскую позицию или хочешь стать бэкенд-разработчиком 🤔

➡️ Если речь про переход в разработчики, то при выборе отталкивайся от того, как тебе будет комфортнее:

🔴при внутреннем переходе ты сможешь освоиться, собрать кейсы и при смене работы будешь чувствовать себя уверенно. Обсуди с руководителем, получится ли не просесть по деньгам, если ты будешь закрывать задачи?

я в свое время выбрала переход с откатом по деньгам, но не готова это рекомендовать, особенно сейчас

🔴последние годы столько людей устраиваются мидлами без опыта работы вообще, так что ты как опытный в разработке человек наверняка сможешь подготовиться и найти работу бэком сразу, если задашься такой целью. Ты еще и истории реальные на собесе расскажешь.

"насколько разумно фактически начинать карьерный трек заново после нескольких лет роста в leadership"


Зависит только от того, чем тебе хочется заниматься.

➡️ Если хочешь расти выше по карьерной лестнице и лидить не только мобильную разработку, но и всю разработку, то тебе нужен не столько опыт бэкенда, сколько опыт выстраивания процессов, работа со стейкхолдерами и возможно архитектурой.

➡️ Если речь про сохранение тимлидской позиции, то я бы предложила не откладывать поход по собесам, а наоборот максимально интенсивно подготовиться и сходить на несколько.

Конечно, не стоит выбирать техлидскую роль, где в команде будет пара джунов, а тебе придется проектировать и писать весь бэк высоконагруженной системы.

Другое дело, если вакансия предполагает управленческую направленность (тимлид). Планирование работ, организация процессов, взаимодействие с бизнесом, работа с командой - эти навыки и опыт у тебя есть. К формальной технической части (алгосы, если таковые будут, сисдиз, языковая секция) ты подготовишься. Управленческих кейсов у тебя наверняка много, архитектурные тоже вытащи из опыта, бэковые надо подсобрать.

Возможно, что ты найдешь подходящую тимлидскую позицию сразу в первый заход по собесам.

Если нет, то у тебя будет точное понимание, чего не хватило и поможет ли с этим переход в бэки на текущем месте.

Если даже ты перейдешь в разрабы, а не в лиды, то добрав технички ты быстро вырастешь снова в лиды, потому что уже обладаешь нужными навыками для этого.

➡️ Еще вариант, над которым можно подумать — это переход в архитекторы. Ты уже работаешь с архитектурой. Архитекторами становятся не только из разработчиков бэка, но и из фронтов, mobile и аналитиков, которые не пишут код, но при этом обладают опытом в проектировании систем.

С точки зрения зарплаты архитекторы не уступают лидам бэка. Тем более у тебя опыт в финтехе.

На мой взгляд переходы на зрелых этапах карьеры не страшны, потому что ты переходишь со всем своим инженерным опытом. Работа с требованиями, декомпозиция, архитектура, структуры данных, проектирование API все эти знания остаются. Освоить придется новый стек, но не разработку как профессию заново ❤️

📍Задать свой вопрос можно здесь: https://forms.gle/SPE6NEALG9vcnF3s7

Случалось ли вам менять направление внутри ИТ? Были ли такие мысли?
  • ❤ 17
  • 👍 10
  • 🔥 7
  • ❤‍🔥 1
Post #408 2.13K
Сегодня новый #женя_есть_вопрос

Женя, привет!

Сейчас я лид мобильной разработки в большом финтехе: у меня 10 прямых и около 25 непрямых репортов — в основном разработчики.

Чем дольше работаю, тем сильнее ощущение, что мобильная разработка для меня становится слишком узким направлением. В текущей роли я постоянно пересекаюсь с backend, архитектурой и другими частями продукта, а иногда сам пишу небольшие backend-фичи. При этом кажется, что рынок для backend-разработчиков существенно шире, чем для mobile.

Из-за этого начал всерьёз рассматривать переход из mobile в backend.

Но здесь есть развилка. Можно попробовать сделать переход внутри текущей компании, однако это, скорее всего, означает заметную потерю в деньгах и достаточно большой риск: на первых квартальных ревью отсутствие production-опыта в backend почти наверняка будет восприниматься как снижение уровня. При этом формального процесса перехода у нас нет — всё достаточно неформально, и позиции T-shaped инженера тоже не существует.

Второй вариант — продолжать развиваться в текущем направлении, а backend постепенно осваивать самостоятельно и уже потом искать внешнюю позицию. Но тогда возникает вопрос, насколько разумно фактически начинать карьерный трек заново после нескольких лет роста в leadership.

Как бы вы смотрели на такую ситуацию? Насколько оправдан переход из mobile в backend на этом этапе карьеры, и какой путь вы бы выбрали: внутренний переход с временным откатом по уровню/деньгам или подготовку к внешнему переходу без потери текущего уровня?

Спасибо
  • ❤ 6
  • ❤‍🔥 1
Post #407 2.29K
Любите ли вы Кафку так, как люблю её я?

Мы с Андреем из Yet Another Analyst решили сделать коллаб — совместный стрим про Кафку.

Поговорим про распределение сообщений, консьюмер-группы, масштабирование, можно ли сломать порядок сообщений, какие гарантии доставки можно реализовать в Кафке.

Посмотрим очень классный симулятор работы Кафки!

Пишите вопросы в комментах к этому посту, постараюсь на стриме на все ответить.

🗓 Когда: в среду 16 сентября в 19:00
🔗 Ссылка на Timepad
  • 🔥 48
  • 👍 19
  • ❤ 7
  • 👀 4
  • ❤‍🔥 2
Post #406 2.15K
➡️ Keyset-пагинация (seek-метод)

Если при OFFSET мы говорим БД:
"пропусти первые 70 000 записей и дай следующие 500",


то при Keyset говорим:
"дай следующие 500 после той записи, на которой мы закончили прошлый раз".


То есть выборка опирается на уникальное поле последнего элемент предыдущей страницы.

Упрощенный пример:

SELECT ...
FROM payments
WHERE id > 70000
ORDER BY id
LIMIT 500;


При таком запросе время обработки не увеличивается пропорционально номеру запрашиваемой страницы, потому что базе не нужно проходить записи предыдущих страниц, она сразу начинает выборку с указанной строки.

Для этого на ключевом поле (в упрощенном примере - это id) должен быть индекс. В примере предполагается, что id упорядочены.


Часто используется сортировка по дате создания и id:

SELECT ...
FROM payments
WHERE (created_at, id) < ('2026-09-08 12:30:00', 70000)
ORDER BY created_at DESC, id DESC
LIMIT 500;


Здесь для эффективной работы нужен составной индекс по (created_at, id).

Также keyset решает проблему с дублирующимися записями в следующем ответе, которая возникает в случае вставки новых записей между запросами.


💭 Что в случае keyset пагинации передает фронт

Для простого случая с сортировкой только по id:

GET /payments?limit=500&lastId=1000


Упрощенный ответ бэка:
{
"items": [...],
"lastId": 1500 //если идем по возрастанию
}


Keyset-пагинация — это способ выбрать следующую страницу.

Cursor-based пагинация — это подход к реализации API, в котором клиент получает некий курсор и возвращает его серверу.

Бэк берет нужные поля, упаковывает их в ДТО, кодирует его (например Base64URL, а при необходимости подписывает или шифрует) и отдает:

{
"items": [...],
"cursor": "eyJpZCI6ODQyMX0"
}


Фронт в следующий запрос прикладывает полученный курсор:
GET /payments?limit=500&cursor=eyJpZCI6ODQyMX0


Бэк его раскодирует и действует согласно своей логике.

Это удобно тем, что бэк может поменять поля в ДТО по своему усмотрению, и это не потребует никаких доработок от фронта, ему как приходила строка, так и приходит. Правда, может понадобиться поддержать обратную совместимость со старым курсором.


С помощью keyset-пагинации нельзя реализовать переход на конкретную страницу, но зато удобно делать бесконечный скролл 📱


Плюсы:

➕ Стабильная производительность даже при миллионах строк при подходящем индексе. Нет замедления по мере продвижения по списку.

➕ Нет проблем со сдвигами, если данные добавляются

➕ Удобно для бесконечного скролла


В случае OFFSET пагинации на UI часто показывают общее количество страниц. Для получения totalElements обычно выполняют дополнительный SELECT COUNT(*).

Если мы реализовали keyset-пагинацию и хотим в ответе бэка сообщить, есть ли еще данные или это конец списка, то это можно реализовать без дополнительных запросов в БД.

Просто делаем исходный запрос с LIMIT на 1 больше:

... LIMIT 501;

Если вернулась 501 строка, то отвечаем:
{
"items": [...], // тут запрошенные 500
"hasNext": true // есть еще записи, запрашивайте
}

Если вернулось меньше 501 строки, то отвечаем:
{
"items": [...], // тут запрошенные 500
"hasNext": false // больше записей нет
}


Но у keyset-пагинации есть и минусы.

При произвольных сортировках преимущество keyset может сильно уменьшиться. Keyset опирается на индекс, а мы не можем создавать индексы на все комбинации полей.

Поэтому для keyset API часто заранее ограничивают допустимые варианты сортировки и создают индексы под несколько востребованных сценариев. Да и NULL в полях сортировки усложняет keyset.

Есть библиотеки, которые поддерживают keyset-пагинацию для разных языков.
Можно написать свою обертку или конкретную функцию для таких случаев.

Подытожим минусы:

➖ сложнее реализация
➖ нельзя сделать переход на конкретную страницу
➖ для эффективной работы ограничивают варианты сортировки

Когда использовать Keyset-пагинацию:

✅ на UI бесконечный скролл

✅ список часто пополняется новыми записями

✅ для API c большими коллекциями, где клиент последовательно выгружает данные и ему не нужен переход сразу на страницу 456
  • 🔥 23
  • 👍 12
  • ❤ 11
  • ❤‍🔥 3
Post #405 1.56K
Пагинация при работе с БД

Хочу рассказать не только базовую теорию, но и про подводные камни и практические подходы к оптимизации.

➡️ OFFSET пагинация

Это самый распространенный вариант.
С фронтенда приходит запрос вида:

GET /orders?page=3&size=20


Если считаем, что страницы нумеруются с 1 (не с 0), то для page = 3 бэк превратит это примерно в такой запрос:

SELECT ...
FROM orders
ORDER BY created_at DESC, id DESC
LIMIT 20
OFFSET 40;


Без ORDER BY порядок строк не гарантирован, а дополнительный уникальный id пригодится на случай одинакового created_at.


Что возвращает бэк:
{
"items": [...],
"page": 3,
"size": 20,
"totalElements": 247,
"totalPages": 13
}



У OFFSET пагинации много плюсов:

➕ просто реализовать, есть встроенная реализация в некоторых фреймворках

➕ легко реализовать переход к любой странице

Например, когда книгу то читаю, то слушаю, мне бывает надо сразу перейти на страницу 134.
Или помнила, что в адмике нужная запись на 78 странице 🤪

Но у такого подхода есть и минусы.

Ключевое слово OFFSET 40 говорит базе, что нужно пропустить первые 40 записей и начать отдавать, начиная с 41-й (для 3-й страницы). Однако база не может сразу прыгнуть на 41-ю строку. Она работает так:

➡️ найти начало упорядоченной выборки
➡️ пройти первые 40 записей
➡️ отбросить их
➡️ вернуть следующие 20 записей

Тут наблюдается лишняя работа с первыми 40 записями. Чем больше номер страницы, тем больше OFFSET и тем больше времени понадобится базе на ответ — это и есть основной минус.

Из-за большего OFFSET записи с последних страниц будут отдаваться дольше, чем с первых, но иногда возможен лайфхак с разворотом сортировки.

Например, если мы показываем на UI сначала самые свежие заказы, то последняя страница заказов будет содержать самые ранние:

SELECT ...
FROM orders
ORDER BY created_at ASC, id ASC
LIMIT 20;

Оговорюсь, что такой запрос подходит для задачи "дай 20 самых ранних записей", но не является способом получить последнюю страницу классической пагинации, потому что возможно следующее несоответствие:

Всего 53 записи, размер страницы 20.
1 стр: 1-20 - 20 строк
2 стр: 21-40 - 20 строк
3 стр: 41-53 - 13 строк

ORDER BY created_at ASC LIMIT 20 вернет 20 самых старых строк вместо 13.


Проблема с OFFSET пагинацией может стать заметной, когда запрашиваются глубокие страницы: чем больше OFFSET, тем больше результатов базе приходится обработать и отбросить. Это может не проявляться на пользовательском UI с 10 страницами по 50 элементов, а вот если мы пишем публичный технический API, которым будут пользоваться соседние команды для получения каких-то больших списков, то там это может стать заметно:

SELECT ...
FROM payments
ORDER BY created_at DESC, id DESC
LIMIT 500
OFFSET 70000;

😱

Еще OFFSET пагинация может быть не очень удобна, когда список часто меняется.

Вообще это довольно редкий кейс, но давайте рассмотрим на всякий случай.

➡️ В БД лежат новости с id = 1 ... 100

➡️ Пользователь запросил 10 самых свежих новостей

➡️ Бэк отдал последние новости с id = 100, 99 ... 92, 91

➡️ Пока пользователь читал новости, модератор добавил две новых записи, они получили id = 101 и id = 102

➡️ Пользователь запросил следующую страницу более старых новостей

➡️ При выполнении OFFSET 10 БД отбросила записи с id = 102 ... 93 и отдала новости с id = 92, 91, 90 ...

➡️ Результат: пользователь дважды увидел новости с id = 92 и 91

Итого минусы:

➖ замедление ответа по мере увеличения номера запрашиваемой страницы
➖ нестабильность ответа, когда список меняется

Когда использовать OFFSET-пагинацию:

✅ пользователи обычно работают с первыми страницами списка, глубокие переходы редки (или количество строк в таблице небольшое, если очень грубо —несколько тысяч строк)

✅ список записей обычно не меняются, пока пользователь их смотрит

✅ на UI нужен блок с привычной пагинацией и переходом на конкретную страницу
  • ❤ 15
  • 👍 14
  • 🔥 8
  • ❤‍🔥 2
Post #404 2.49K
Давайте разбираться.

Мне кажется, проблема тут не столько в системном аналитике, сколько в лиде. Насколько я поняла, лид сейчас не хочет отстаивать ваши интересы и привлекать лида аналитики к решению вопроса.

Возможно, у аналитика действительно не хватает опыта или знания проекта, но специалиста можно вырастить. Лид аналитики может выделить наставника, который будет помогать и ревьюить, может порекомендовать какие-то обучающие материалы, может договориться о помощи от разрабов и QA, если не хватает знаний проекта. Да просто может тактично обозначить человеку, что такая проблема есть. Возможно, ваша СА уделяет много внимания бизнес-части и не подозревает, что есть пробелы в технической части.

Тем не менее, не зная подробностей, не рискну предлагать разговаривать с аналитиком. Люди разные, у тебя накопилось недовольство, как бы это не привело к конфликту. Вместо этого предлагаю зайти через изменение процесса.

Ты не написала, есть ли у вас грумминг, буду исходить из того, что есть. Если нет, предлагай его внедрить.

Нужно на ретро или другой встрече попросить готовить постановку хотя бы за день до грумминга, чтобы разработчики могли ознакомиться заранее.

До грумминга внимательно читай спеку, ищи пропущенные части, а на грумминге обо всем этом спрашивай. Не конфликтуй! Без претензий, просто задавай вопросы. Привлекай других разрабов к обсуждению, правьте связи в БД, добавляйте эндпойты прямо на созвоне. Подробности СА может расписать потом, если требуется, главное сами новые задачи не потерять.

Если у вас разрешены сторонние ИИ, можно отдавать спеку на ревью кодексу или клоду, чтобы он накидал вопросов с опорой на кодовую базу. Он может проверить существующие эндпойнты и найти те, которые затронет новая фича.

Еще привлекай QA к анализу спеки заранее. Если тестировщик читает постановку, когда код уже готов, то даже с пробелами в спеке он составит свое представление о функциональности и пойдет тестить, что там разрабы сделали.
А если тестировщик использует shift-left: проверяет специфицикации и пишет тест-кейсы еще по постановке, то он может задать даже больше вопросов, чем разраб. Ведь QA знают проект лучше всех.
Проси QA посмотреть спеку до грумминга, задавай ему/ей вопросы, пробуй применить его экспертизу по продукту к этой задаче заранее.

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

А еще возможно, что такие обсуждения помогут вашему аналитику прокачаться. Если проблема не в том, что человек просто забивает, а в недостатке опыта, то она может заметить свои частые ошибки, почитать статьи про них и вырасти как специалист.

📍Задать свой вопрос можно здесь: https://forms.gle/SPE6NEALG9vcnF3s7

Ребят, что бы вы рекомендовали в такой ситуации?
  • ❤ 23
  • 👍 11
  • 🔥 5
  • ❤‍🔥 1
Post #403 2.5K
Пятничный привет! Меня не было неделю — навалилось много дел, в том числе связанных с тем, что уже второй год 1 сентября для меня снова День знаний 😄
Вожу в школу своего второклассника.
Сегодня я уже немного выдохнула, надеюсь дальше продолжать в обычном режиме.

В рубрику #женя_есть_вопрос прислали непростой вопрос про ситуацию на работе:

Привет, очень надеюсь на твой совет.

У нас в команде есть бэки, фронты, бизнес-аналитик и два системных. Постановка по задачам зона ответственности системных аналитиков. Я работаю в разработке. Одна из аналитиков всё время недоописывает все входящие в доработку таски. Если нужно доработать больше 2-3 ручек, то наверняка какую-то она в постановке пропустит. Получается DoR есть, но только формально, фактически многие детали не учитываются. По технической части тоже не все гладко, например, путаница в связях one-to-many и many-to-many, но это не так критично.

Системные аналитики декомпозируют свои истории, и задачи раздают разным бэкендерам параллельно. Так как часть задач не описана, они не поступают в разработку. Их приходится потом доделывать тому, кто это обнаружит когда будет заниматься другой задачей, или тому, на кого тестировщик решит завести баг. Столкнувшись с подобными срочными доделками, я начала сама перед разработкой созваниваться с аналитиками и вытягивать из них полную постановку, а потом ещё синхронизироваться с другими разработчиками, которые работают над этой же историей. Но всё это занимает довольно много времени, которого никто дополнительно не даёт.

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

Может ты предложишь, что можно сделать?
  • 😢 14
  • ❤ 7
  • 👀 5
  • ❤‍🔥 3
  • 👍 1
  • 🔥 1
Post #402 3.15K
В комментах под одним из постов развернулось обсуждение того, что считать микросервисом.

Еще в начале карьеры разработчика я услышала и запомнила два забавных определения:

Если над сервисом работает команда, которую можно накормить всего 2 пиццами, то это микросервис

🍕🍕

Логика микросервиса должна полностью умещаться в голове разработчика.


Это сложно назвать определением, хотя про логику замечание валидное 😃

Со временем я сформулировала для себя такие свойства:
🔴сфокусированность на отдельной бизнес-задаче
🔴возможность реализации разных нефункциональных требований
Например, у микросервиса обработки изображений могут отличаться требования к ресурсам по сравнению с сервисом каталога товаров.

Давайте посмотрим, какие определения дают известные авторы:

➡️ Крис Ричардсон (автор книги "Паттерны микросервисов")

Микросервисы — это сервисы, которые:
independently deployable - можно поставлять независимо (без необходимости одновременно выкатывать другие сервисы)
loosely coupled - слабо связаны друг с другом
Обычно они организованы вокруг бизнес-возможностей, а отдельный сервис часто находится в зоне ответственности одной небольшой команды.


➡️ Сэм Ньюман (автор "От монолита к микросервисам", "Создание микросервисов")

Микросервисы — независимо релизящиеся сервисы, смоделированные вокруг бизнес-домена.


➡️ Влад Хононов (автор книги "Изучаем DDD")

У него есть интересная статья про баланс сложности в распределенных системах.

Локальная сложность — сложность внутри отдельного сервиса
Глобальная сложность — сложность связей и зависимостей между сервисами

Если всё поместить в один компонент, глобальная сложность почти исчезает, зато может вырасти локальная. Если нарезать систему слишком мелко, отдельные сервисы могут стать проще, но количество взаимодействий и зависимостей между ними резко вырастет.

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

Хононов предлагает необычный взгляд:

Микросервис — это сервис с маленьким публичным интерфейсом.


Условно, сервис может содержать 100 тысяч строк кода, но наружу выставлять буквально несколько высокоуровневых операций:

- createOrder()
- cancelOrder()
- getOrder()

Поэтому прямой доступ одного сервиса в БД другого сервиса — антипаттерн: база фактически становится огромным публичным интерфейсом.


➡️ Отличия от монолита

Одно из ключевых отличий микросервисной архитектуры от монолита — независимость развертывания, а не размер кодовой базы. Об этом пишут и Ричардсон, и Фаулер, и Ньюман.

Монолит может быть модульным и хорошо спроектированным, но он деплоится всегда целиком. А микросервисы деплоятся отдельно.

При этом если наши микросервисы сильно связаны друг с другом, и релиз выглядит так:

Order v5 требует Payment v7
Payment v7 требует Customer v4,
поэтому вынуждены выкатывать всё вместе

то Ньюман и Фаулер называют это распределенным монолитом.

Кто сталкивался, тот сразу вспомнит такие релизы 😂

Нашла еще несколько статей, и во всех можно проследить повторение нескольких вещей:
🔴независимость изменений и деплоя
🔴слабая связанность
🔴осмысленная бизнес-граница

В итоге, если спросят, что такое микросервис, я бы ответила как-то так:

"Микросервис реализует ограниченную часть бизнес-домена. В идеале он должен быть слабо связан с другими сервисами, развиваться и релизиться независимо от них.
В микросервисной архитектуре нужно следить не только за сложностью каждого отдельного сервиса, но и за сложностью связей между ними".

Забавно, что на собесах мне такой вопрос ни разу не задавали. А вас спрашивали, что такое микросервис?
  • 👍 26
  • ❤ 22
  • 🔥 12
  • ❤‍🔥 2
  • 😁 1
Post #401 2.99K
Прочитала на Хабре интересный анализ рынка труда 2026 года.

Один из основных выводов, который сильно перекликается с моими наблюдениями:

Российский IT‑найм — это несколько гигантов.

1% работодателей публикует 29% всех вакансий. Верхние ~40% компаний закрывают более 80% рынка.


Топ-5 самых активных работодателей:

1️⃣Сбер (с большим отрывом)
2️⃣Яндекс
3️⃣VK
4️⃣Т-Банк
5️⃣Wildberries

Еще из интересного:

Аналитика востребована больше разработки, но при этом найм аналитиков данных монополизирован сильнее остальных профессий (мне кажется, логично: у бигтехов много данных и направлений их анализа, а значит именно им нужно больше аналитиков данных).

Мне не очень привычно, когда "Аналитику" объединяют в одно направление, ведь аналитик данных и системный аналитик это заметно отличающиеся профессии на мой взгляд. Но в статье есть и раздельный анализ по некоторым пунктам.

Про уровень зарплат.

Согласно проведенному исследованию:

Размер работодателя не связан с уровнем зарплат — гиганты платят не больше остальных.


В первой части исследования автор писал, что зарплату довольно часто не указывают, поэтому это вывод только по тем вакансиям, где зарплату указали.

С другой стороны, если 40% компаний закрывают больше 80% вакансий, то уровень зарплаты в этих 80% вакансий — это же и есть «рыночный» уровень?

Про географию.

Зарплаты для аналитиков и менеджмента в Москве существенно выше. Для разработки удаленка все еще неплохо себя чувствует.

У меня было ощущение, что многие вакансии — это гибрид из Москвы, но исследование показывает, что удаленка жива, и зарплаты там даже выше. При этом, удивительный факт:

среди удалённых вакансий 59% живут вне hh против 14% у офисных


То есть ищем удаленку не только на hh, товарищи.

Ссылка на статью

Поделитесь, пожалуйста, вашими впечатлениями от рынка 2026:

🎉 — успешно сменил работу в этом году
👀 — сейчас в поиске или скоро планирую
🦆 — ну его нафиг, пока не планирую менять работу
  • 👀 63
  • 🎉 17
  • 👍 7
  • 🔥 4
  • ❤‍🔥 3
  • ❤ 3
Post #400 3.48K
Недавно многие писали про важную новость в мире REST API: в июне этого года официально появился новый HTTP-метод: QUERY.
Это отдельный метод для сложной фильтрации/поиска с телом, который позволит не использовать для этого POST.

Раньше для фильтрации нам были доступны:

➡️ GET с query-параметрами:

GET /products?priceFrom=1000&priceTo=5000

➕ Правильная семантика - получение данных
➕ Идемпотентный
➕ Ответ может кэшироваться

➖ Если много параметров, URL получается длинный, а на прокси и балансировщиках могут быть ограничения на длину URL
➖ Неудобно для чтения

➡️ POST c телом

POST /orders/search
{
"statuses": ["PAID", "SHIPPED"],
"createdAt": {
"from": "2026-08-01",
"to": "2026-08-18"
},
"customerName": "Иван"
}

➕ Можно передать в теле много параметров, а URL останется коротким
➕ Удобно для чтения и обработки

➖ POST по семантике HTTP не является идемпотентным. Саму операцию на бэке мы можем реализовать идемпотентно, но HTTP-клиенты и промежуточная инфраструктура не могут сделать такой вывод из запроса и поэтому не будут повторять его в случае сбоя

➖ Обычно не кэшируется

Про кэширование хочу развернуть чуть подробнее. Под кэшируемостью в таких сравнениях обычно имеется в виду кэш на API Gateway, прокси, CDN или на клиенте. Не наш условный Redis на бэке. В своем Redis мы можем любое кэширование сделать, если надо, а тут скорее про общие настройки инфраструктуры.

Промежуточный кэш может запоминать ответ GET, например, на 60 секунд и при повторном таком GET не обращаться на бэк, а отдавать ответ из кэша (для снижения нагрузки на бэк).


POST-запросы теоретически можно кэшировать, но следующий такой же POST нельзя просто обслужить этим сохраненным ответом. Он может использоваться для будущего GET, а сам POST считается потенциально изменяющим состояние и должен быть передан на бэк. Поэтому для сценария: один POST /search, потом такой же POST /search обычное HTTP-кэширование не работает.


➡️ С QUERY мы можем передавать то же тело, что в POST, но с явным методом QUERY, так что он комбинирует плюсы обоих подходов:

QUERY /orders
{
"statuses": ["PAID", "SHIPPED"],
"createdAt": {
"from": "2026-08-01",
"to": "2026-08-18"
},
"customerName": "Иван"
}


➕ Правильная семантика
➕ Идемпотентный
➕ Можно передать в теле много параметров, а URL останется коротким
➕ Удобно для чтения и обработки
➕ Может кэшироваться (если инфраструктура знает про новый метод)

Кэширование QUERY должно учитывать не только URL, как обычно у GET, но и содержимое тела и метаданные вроде Content-Type (это прямо предусмотрено RFC 10008)

Условно если cache key:

QUERY + /orders + {"customerName":"Иван"}

Тогда запрос для Егора:

QUERY /orders
{
"customerName": "Егор"
}


не получит из кэша ответ для Ивана.


➖ Пока не везде поддерживается

Если вы не пишете на Go, то скорее всего внедрять QUERY пока рано: на уровне многих фреймворков он еще не поддерживается.

Например, в Spring поддержку QUERY хотят добавить в Spring Framework 7.1, но PR пока в работе: буквально вчера по нему запросили изменения, а полноценную поддержку кэширования QUERY решили пока отложить.


Обходной путь принимать такие запросы есть, но кажется, что пока нет причин торопиться.

Я не гошница, но насколько могу судить в Go ситуация проще: в net/http метод задается просто string, без enum, поэтому можно указать "QUERY" и принимать новые запросы уже сейчас. Но полной поддержки RFC тоже еще нет.


Какой подход к фильтрации вам привычнее: c GET или POST?
Я привыкла к фильтрам в виде POST /search.

Может вы встречали какие-то необычные подходы к фильтрации?
Я встречала один довольно хлопотный для бэка подход, больше похожий на мини-DSL, расскажу в комментах.

Планируете ли внедрять QUERY в апишки, когда его поддержат фреймворки?
  • 🔥 28
  • ❤ 22
  • 👍 13
  • ❤‍🔥 3
Post #399 3.68K
Привет!

Собесы не могут покрыть всё, что требуется в работе, а иногда они нацелены на проверку вообще других вещей.

Мне кажется, что собес в формате разговора об опыте дает лиду больше информации о степени фита. Тут как раз можно обсудить и какие задачи решались, какую степень качества обеспечивали на других проектах и как этого качества достигали.

Если ты проходил такие собесы, и собеседующего устраивал твой опыт, значит ты подходил на вакансию.

Ты пишешь, что есть технические темы, в которых ожидается экспертиза, но они не были покрыты собесами. Мне кажется, это довольно распостраненная ситуация, мы же растем на каждом месте работы с немного отличающимся стеком, новыми задачами.

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

Когда ты сделал свою первую задачу, сходи к своему руководителю и обсуди с ним получившийся результат:

- что ты сделал

- то ли это, что он ожидал

- может он хотел видеть что-то другое/дополнительное


Тут же можно обсудить и перфоманс и то, как они работают с качеством, какие есть quality gates.

Если есть коллеги в других командах, то можно с ними обсудить, как тут принято обеспечивать качество (и заодно поболтать про то, как процессы вообще устроены).

Если разговор с руководителем состоялся условно через 2 недели после начала работы, то еще через 2 недели можно провести следующий по другой задаче, где снова откалиброваться:

- прошлый раз ты сказал, что вот это ок, я это и делал

- тут ты просил доработать, вот я учел в новой задаче

- я нормально продвигаюсь, в соответствии с ожиданиями?


Еще полезно оттолкнуться от того, что уже есть в проекте и в команде.

Пример из бэкенда: если на проекте уже есть высокое покрытие тестами всех уровней, соответственно и свой код стоит так же покрывать.

Другой пример: если коллеги в команде рассказывают на общих встречах, как сами общались с заказчиками из бизнес-подразделения, значит и от тебя могут ждать того же уровня самостоятельности в решении задач.

То есть мне кажется твои ситуации упираются больше в работу с людьми, чем с хардами.

Я проводила курс, как вести себя на работе, чтобы оправдывать ожидания и получать повышения, приласила бы на него, но сейчас нет активного набора.

Как распознать, что на работе будут ждать не то, что на собесе?
С гарантией, конечно, никак, но можно задать такие вопросы:

- какие технологии используете в работе? (стек)

- как устроена команда? кто ставит задачи и определяет нагрузку?

- какая зона ответственности у этой позиции? какие задачи я буду решать в первую очередь?

- как будет оцениваться успешность прохождения испытательного срока?


📍Задать свой анонимный вопрос в рубрику можно тут: https://forms.gle/SPE6NEALG9vcnF3s7

Ребят, очень интересный вопрос, присоединяйтесь к обсуждению!
Вы сталкивались, с тем, что задачи на работе сильно отличались от того, что обсуждали на собесе? Как бы рекомендовали действовать в таких ситуациях?
  • ❤ 21
  • 👍 9
  • 🔥 5
  • ❤‍🔥 3
Post #398 3.19K
Сегодня новый #женя_есть_вопрос

Привет! У многих на твоём канале звучали вопросы о том, что собесы - страшно и можно опозориться, и как их пройти, но у вопрошающих обычно всё в порядке с навыками и компетенциями. У меня же обратная ситуация - я успешно прохожу собеседования на сениора уже практически даже без подготовки (три часа с гпт не считаются). Исключение, когда могу провалиться - hands-on прямо на собеседовании, так как я ИИ-инженер и руками ничего не делаю страшно давно.

Но когда начинается непосредственно работа, то выясняется, что ожидали от меня совершенно иного, причём того, что на собеседованиях не проверялось никак - и по задачам, и перформансу, и качеству (а не только результату). И я от своей работы тоже ожидал другого. Поэтому через пару месяцев расстаёмся. И это разные компании разных размеров и менталитета. При этом говорим мы с ними всегда одними и теми же терминами в их оригинальном значении и на одном языке.

Я всегда относился к собеседованиям как к мерилу уровня - кто не пройдёт, тот не соответствует, и если проходит, значит, есть нужная степень фита, о недостающем же скажут на работе или в фидбэке. А тут как-то почему-то нет.

Вопрос: это со мной что-то не так, или объективно с навыками? ) Или нет каких-то негласных вещей в анамнезе? Или кто я тогда по уровню, если собеседования на сениорные позиции прохожу, причём на основании своих знаний, но в самой работе ожидается множество из того, что не было покрыто в собеседованиях и что обязаны были проверить? И как это распознать, если диалог на собесах не помогает?(Я спрашивал у ИИ и он несет околесицу.)

Отвечаю ниже ⬇️
  • 👀 9
  • 😁 4
  • ❤ 2
  • ❤‍🔥 1
Post #397 2.97K
Давайте обсудим изменение границ микросервисов?
Интересно поговорить не столько о теории (хотя там много подходов и книг), сколько о практике.

Когда мы начинаем проектировать новый продукт, у нас одна картина мира. Продакты и бизнес-аналитики рассказывают нам о продукте и требованиях. Мы выделяем поддомены, проектируем модели, понимаем, где будет логично провести между ними границы, уточняем нефункциональные требования и на основании полученной информации проектируем стартовый набор микросервисов.

Время идет, появляются новые микросервисы для новых фичей, старые микросервисы тоже активно развиваются, и спустя год или два может оказаться, что кто-то из первых микросервисов стал уже больше напоминать отдельный монолит. А некоторые изначально разделенные сервисы сильно связались следующими фичами, и сервис Б практически на каждый пользовательский запрос вынужден ходить по REST/gRPC в сервис А.

Если есть циклическая зависимость, то это признак, что стоит рассмотреть объединение сервисов. Если зависимость не циклическая, то вроде и ничего страшного, а с другой стороны - разные ли это контексты, если сервис Б без сервиса А практически ни одного запроса своего API обработать не может?

Необходимость в рефакторинге можно заметить относительно вовремя, когда стало "немного некомфортно" при реализации новой фичи, но техдолг еще не большой. Но не всегда есть бизнесовая возможность заняться этим сразу, как заметили. Исходя из моего опыта, такие работы лучше аккуратно увязывать вместе с новыми фичами этих сервисов, чтобы и бизнесу польза и техдолг архитектурный не копился.

Пара примеров, с чем сталкивалась:

🩷Отправка уведомлений была реализована в бизнесовом сервисе. Когда уведомления понадобились во втором сервисе, сразу заметили и выделили отдельный сервис уведомлений.

Сейчас кажется это классика, на моках сисдиза вечно рисуют сразу сервис уведомлений отдельный, но тогда столько материалов не было, проходили на практике.

🩷Первый сервис продукта назвали core. В нем был расчет основного отчета, с которого начинался продукт, а вокруг вспомогательные сервисы, которые готовили данные для core. Также в core были справочники и всякие пользовательские настройки. С развитием продукта появлялись новые микросервисы под новые фичи, но все они для некоторых задач ходили в core за пользовательскими настройками. При этом в core оставались и свои фичи вокруг основного отчета. На третьем фичевом микросервисе, который собрался в core, мы разделили первоначальный core на собственно core с пользовательскими настройками и справочниками, а расчет основного отчета вынесли в отдельный фичевый микросервис.

С одной стороны кажется, что тут изначально был просчет, почему пользовательские настройки сразу не вынесли? Потому что при начальном проектировании не было очевидно, что эти настройки будут актуальны не только для фич этого микросервиса, но и для других, новых. Плюс важный момент, что продукт развивался из MVP, который нужно было сделать быстро и качественно под текущие задачи, чтобы запуститься, а затем развивать и улучшать.

Случалось ли, что делая новую фичу, вы ловили себя на мысли: кажется, этот микросервис "набух" и его пора разделять?

Инициировалось ли у вас на проектах изменение границ микросервисов? Если да, то кто выносил такой вопрос на обсуждение: разработчики, системные аналитики или архитекторы?
  • 🔥 16
  • 👍 8
  • ❤‍🔥 7
  • ❤ 4
Older posts →

About this channel

How can I read @jane_yanchenko without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Женя Янченко: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Женя Янченко have?
Женя Янченко (@jane_yanchenko) has 5.51K subscribers on Telegram, refreshed roughly every 30 minutes.
Does Женя Янченко know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →