Forwarded from Эмоции успеха | Елена Логачева
13 апреля в 18:00 ч. (Мск)
Уже завтра — новый эфир на тему «Профессиональная устойчивость в IT: как не потерять опору в эпоху автоматизации»
У меня в гостях:
IT стремительно меняется: автоматизация, AI и ускорение рынка заставляют специалистов и управленцев сомневаться в своей ценности и усложняют принятие решений.
Разберем подробно:
Пройдите РЕГИСТРАЦИЮ, чтобы быть с нами онлайн. Вам придет ссылка на почту и так вы сможете задать свои вопросы в прямом эфире. И до встречи уже завтра!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥5
💭 Есть интересный момент, который часто всплывает, когда разработчики переходят в Go с других языков. Во многих языках есть тернарный оператор - короткий и удобный способ записать условие в одну строку, к нему быстро привыкаешь. А потом приходишь в Go - и его там нет...
И дальше начинается: кому-то его сильно не хватает, кто-то спокойно живет без него, а кто-то даже начинает считать, что без него код становится чище и понятнее.
Если вам эта тема откликается, есть очень подробная и при этом действительно занимательное статья, где разобрано, почему тернарного оператора до сих пор нет в Go, какие есть альтернативы и что об этом думает сообщество.
Почитать можно здесь: https://dburov.com/ru/research/go-ternary
А вам не хватает тернарного оператора или нет?
Кто я | Навигация | Спасибо
И дальше начинается: кому-то его сильно не хватает, кто-то спокойно живет без него, а кто-то даже начинает считать, что без него код становится чище и понятнее.
Если вам эта тема откликается, есть очень подробная и при этом действительно занимательное статья, где разобрано, почему тернарного оператора до сих пор нет в Go, какие есть альтернативы и что об этом думает сообщество.
Почитать можно здесь: https://dburov.com/ru/research/go-ternary
А вам не хватает тернарного оператора или нет?
Кто я | Навигация | Спасибо
👍17❤7🔥7👨💻1
Как мигрировать приложение в облако
• 20 апреля, ПН
• 19:00 по мск
Открытый урок для разработчиков. Лучшие практики по миграции монолита в облако, настройке виртуальной инфраструктуры и развертыванию приложения. Запись для всех зарегистрировавшихся
Что будет на уроке:
1️⃣ Создание виртуальной инфраструктуры
2️⃣ Миграция монолитного приложения подходом Lift and Shift
3️⃣ Безопасная настройка публичного доступа к приложению в облаке
4️⃣ Оценка затрат на инфраструктуру, и как их оптимизировать
В итоге научитесь правильно мигрировать приложение в облако. Узнаете антипаттерны, которые приводят к «дырам» в безопасности и «раздутию» бюджета на поддержку
Рассказывает Илья Смирнов, архитектор решений Cloud.ru.
➡️ Записаться на урок по ссылке: https://clck.ru/3T8drG
Кто я | Навигация | Спасибо
• 20 апреля, ПН
• 19:00 по мск
Открытый урок для разработчиков. Лучшие практики по миграции монолита в облако, настройке виртуальной инфраструктуры и развертыванию приложения. Запись для всех зарегистрировавшихся
Что будет на уроке:
В итоге научитесь правильно мигрировать приложение в облако. Узнаете антипаттерны, которые приводят к «дырам» в безопасности и «раздутию» бюджета на поддержку
Что еще важно знать:
1) Применимо к любому ЯП. Примеры будут на Python, но язык простой и много программировать не придется. Неважно, написан код на Go или C++ — принципы миграции везде одинаковы
2) Применимо к любому облаку. Мигрируем на примере Cloud.ru, но знания применимы к Yandex Cloud или любому другому облаку — паттерны и антипаттерны одинаковы везде
Рассказывает Илья Смирнов, архитектор решений Cloud.ru.
Кто я | Навигация | Спасибо
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍5🔥3
🔊 Делаем митап в Ростове-на-Дону для разработчиков - без формализма, с реальными кейсами и приятным общением
В программе - несколько докладов: поговорим про практику разработки, карьерный рост и подходы, которые реально работают, а не только выглядят красиво на бумаге. Плюс оставим время для нетворкинга, общения и вопросов.
На странице митапа можно посмотреть, как прошла наша встреча в Ростове-на-Дону в прошлом году - там есть фотографии и атмосфера, чтобы понять, чего ожидать: https://vladimir-balun.timepad.ru/event/3922777/ (количество билетов ограничено, записаться уже можно сейчас)
Кто я | Навигация | Спасибо
В программе - несколько докладов: поговорим про практику разработки, карьерный рост и подходы, которые реально работают, а не только выглядят красиво на бумаге. Плюс оставим время для нетворкинга, общения и вопросов.
На странице митапа можно посмотреть, как прошла наша встреча в Ростове-на-Дону в прошлом году - там есть фотографии и атмосфера, чтобы понять, чего ожидать: https://vladimir-balun.timepad.ru/event/3922777/ (количество билетов ограничено, записаться уже можно сейчас)
Митап платный - у нас нет спонсоров, поэтому стоимость билетов покрывает организацию, площадку, кейтеринг и администрирование
Кто я | Навигация | Спасибо
👍14🔥7❤4🎉3
Как выбрать лучшую LLM для агента или приложения и не переплачивать
• 27 апреля, ПН
• 19:00 по мск
Открытый урок: как выбрать модель не по хайпу и узнаваемости, а по цене, скорости и реальной пользе для вашей задачи. И платить меньше за то же качество. Запись для всех зарегистрировавшихся
Что будет на уроке:
1️⃣ Типы LLM и по каким критериям делать выбор под свою задачу
2️⃣ Почему «самая умная модель» – не всегда самый умный выбор
3️⃣ Как инженерно подойти к выбору LLM и на какие метрики смотреть
4️⃣ Каскады и повышение эффективности — что это такое и как помогает экономить деньги без потери качества
Рассказывает Антипов Дмитрий: руководитель разработки AI-продуктов в Группе Сбер (АБТ).
Записать на урок можно по ссылке: https://clck.ru/3TDiwA
Кто я | Навигация | Спасибо
• 27 апреля, ПН
• 19:00 по мск
Открытый урок: как выбрать модель не по хайпу и узнаваемости, а по цене, скорости и реальной пользе для вашей задачи. И платить меньше за то же качество. Запись для всех зарегистрировавшихся
Разработчики, лиды и продакты часто выбирают модели как «самые лучшие». При этом задача - определить тональность отзыва или сделать RAG.
Модель справляется блестяще, и все довольны. А потом нужно масштабироваться, и радость заканчивается. Множество задач можно делать быстрее, эффективнее, дешевле и даже без целого кластера H100.
Что будет на уроке:
Рассказывает Антипов Дмитрий: руководитель разработки AI-продуктов в Группе Сбер (АБТ).
Записать на урок можно по ссылке: https://clck.ru/3TDiwA
Кто я | Навигация | Спасибо
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8❤5
🧩 Lock contention - вещь, о которой почти никто не думает… пока все не начинает тормозить
По сути это ситуация, когда несколько горутин одновременно пытаются захватить один и тот же мьютекс и начинают стоять в очереди. И вроде бы ты хотел распараллелить вычисления… но по факту - одна большая пробка.
Почему чаще всего мы об этом не думаем? Очень просто: на маленькой нагрузке все работает отлично, код выглядит "правильно синхронизированным", но а сама проблема приходит сильно позже, когда становится больше пользователей и трафика.
Простой пример на Go:
Выглядит корректно! Но если у тебя 500-1000+ горутин дергают Inc() - начинаются проблемы: все ждут мьютекс, а также растут задержки и падает пропускная способность.
Из личного опыта: один раз уперлись в интересный деградационный кейс - сервис начинал сильно тормозить при росте нагрузки, хотя CPU был далеко не на 100% и проблема никак не была связана с внешними источниками данных. Долго копали, а в итоге оказалось, что все упирается в один мьютекс при агрегации метрик. После того как структуру данных пошардировали с разными мьютексами - проблема была решена.
В целом, не нужно сразу в каждом месте бояться lock contention и усложнять код "на будущее". На старте это почти всегда преждевременная оптимизация. Но если вы понимаете, что впереди рост нагрузки - лучше хотя бы держать это в голове или иметь в виду, где потенциально могут быть узкие места.
А решаются такие проблемы довольно часто следующими способами:
- сокращаете время удержания блокировок
- шардируете данные, разделяя примитивы синхронизации
- меняете подход к синхронизации там, где это возможно
Кто я | Навигация | Спасибо
По сути это ситуация, когда несколько горутин одновременно пытаются захватить один и тот же мьютекс и начинают стоять в очереди. И вроде бы ты хотел распараллелить вычисления… но по факту - одна большая пробка.
Почему чаще всего мы об этом не думаем? Очень просто: на маленькой нагрузке все работает отлично, код выглядит "правильно синхронизированным", но а сама проблема приходит сильно позже, когда становится больше пользователей и трафика.
Простой пример на Go:
type Counter struct {
mtx sync.Mutex
value int
}
func (c *Counter) Inc() {
c.mtx.Lock()
defer c.mtx.Unlock()
c.value++
}
Выглядит корректно! Но если у тебя 500-1000+ горутин дергают Inc() - начинаются проблемы: все ждут мьютекс, а также растут задержки и падает пропускная способность.
Из личного опыта: один раз уперлись в интересный деградационный кейс - сервис начинал сильно тормозить при росте нагрузки, хотя CPU был далеко не на 100% и проблема никак не была связана с внешними источниками данных. Долго копали, а в итоге оказалось, что все упирается в один мьютекс при агрегации метрик. После того как структуру данных пошардировали с разными мьютексами - проблема была решена.
В целом, не нужно сразу в каждом месте бояться lock contention и усложнять код "на будущее". На старте это почти всегда преждевременная оптимизация. Но если вы понимаете, что впереди рост нагрузки - лучше хотя бы держать это в голове или иметь в виду, где потенциально могут быть узкие места.
А решаются такие проблемы довольно часто следующими способами:
- сокращаете время удержания блокировок
- шардируете данные, разделяя примитивы синхронизации
- меняете подход к синхронизации там, где это возможно
Кто я | Навигация | Спасибо
❤23👍14🔥9🏆2🤩1
💭 Есть довольно популярное мнение в разработке: system design нужен только сеньорам и архитекторам, а мидлу он, по сути, не нужен - достаточно хорошо писать код
Давайте разбираться, насколько это соответствует реальности. System Design - это про то, как устроена система целиком. Как взаимодействуют ее части, где и как хранятся данные, как система масштабируется, выдерживает нагрузку и переживает сбои. Это не про конкретный язык или фреймворк, а про мышление на уровне архитектуры и последствий решений.
И действительно, middle-разработчик редко проектирует систему с нуля. Но это не означает, что он не сталкивается с архитектурой в работе. На практике почти каждый день мидл: добавляет новые фичи в существующую систему, меняет поведение сервисов и работает с базами данных, кешем, очередями, API.
Здесь начинаются реальные последствия отсутствия системного взгляда. Код может быть корректным локально, но создавать проблемы на уровне системы. Например, появляются лишние запросы в базу, неправильное использование кеша, неожиданные блокировки, рост связности между компонентами. Все это редко видно в рамках одной задачи, но становится проблемой при росте нагрузки и усложнении системы.
Базовое понимание System Design для мидлов помогает писать код, который не создает будущих проблем. Ты начинаешь учитывать не только то, что задача решена, но и то, как это повлияет на систему дальше.
Еще один важный момент - коммуникация. На технических обсуждениях часто звучат вопросы вроде: это синхронный или асинхронный процесс, что будет при пиковой нагрузке, где потенциальная точка отказа, лучше ли решать это на уровне сервиса или базы данных. Без понимания System Design в таких обсуждениях ты чаще просто слушаешь. С пониманием - можешь задавать осмысленные вопросы, подсвечивать риски, предлагать альтернативы. Даже если финальное решение принимает кто-то другой, ты уже участвуешь в проектировании, а не просто выполняешь задачи.
📌 У меня был похожий опыт, когда я работал в Тинькофф на позиции middle-разработчика. Я ходил на командные архитектурные встречи, где обсуждали изменения в системе. И в какой-то момент поймал себя на ощущении, что мне нечего добавить. Я понимал отдельные куски, но не видел общей картины, из-за чего разговоры про архитектуру проходили мимо меня как наблюдателя.
Это довольно типичная ситуация для мидлов: код пишется уверенно, но при обсуждении системы возникает непонимание. Разница между middle и senior часто не в качестве кода, а в уровне мышления. Middle думает задачей и реализацией. Senior думает системой и последствиями решений. И даже если цель не стать сеньором прямо сейчас, оставаться только на уровне реализации задач - это ограничение роста.
Если резюмировать, то System Design для middle-разработчика - это не про обязанность проектировать сложные системы с нуля. Это про более осознанный код, понимание устройства системы, уверенность в технических обсуждениях и фундамент для дальнейшего роста. И эффект от этого обычно заметен довольно быстро - как в работе, так и в том, как меняется само восприятие разработки.
Кто я | Навигация | Спасибо
Давайте разбираться, насколько это соответствует реальности. System Design - это про то, как устроена система целиком. Как взаимодействуют ее части, где и как хранятся данные, как система масштабируется, выдерживает нагрузку и переживает сбои. Это не про конкретный язык или фреймворк, а про мышление на уровне архитектуры и последствий решений.
И действительно, middle-разработчик редко проектирует систему с нуля. Но это не означает, что он не сталкивается с архитектурой в работе. На практике почти каждый день мидл: добавляет новые фичи в существующую систему, меняет поведение сервисов и работает с базами данных, кешем, очередями, API.
Здесь начинаются реальные последствия отсутствия системного взгляда. Код может быть корректным локально, но создавать проблемы на уровне системы. Например, появляются лишние запросы в базу, неправильное использование кеша, неожиданные блокировки, рост связности между компонентами. Все это редко видно в рамках одной задачи, но становится проблемой при росте нагрузки и усложнении системы.
Базовое понимание System Design для мидлов помогает писать код, который не создает будущих проблем. Ты начинаешь учитывать не только то, что задача решена, но и то, как это повлияет на систему дальше.
Еще один важный момент - коммуникация. На технических обсуждениях часто звучат вопросы вроде: это синхронный или асинхронный процесс, что будет при пиковой нагрузке, где потенциальная точка отказа, лучше ли решать это на уровне сервиса или базы данных. Без понимания System Design в таких обсуждениях ты чаще просто слушаешь. С пониманием - можешь задавать осмысленные вопросы, подсвечивать риски, предлагать альтернативы. Даже если финальное решение принимает кто-то другой, ты уже участвуешь в проектировании, а не просто выполняешь задачи.
📌 У меня был похожий опыт, когда я работал в Тинькофф на позиции middle-разработчика. Я ходил на командные архитектурные встречи, где обсуждали изменения в системе. И в какой-то момент поймал себя на ощущении, что мне нечего добавить. Я понимал отдельные куски, но не видел общей картины, из-за чего разговоры про архитектуру проходили мимо меня как наблюдателя.
Это довольно типичная ситуация для мидлов: код пишется уверенно, но при обсуждении системы возникает непонимание. Разница между middle и senior часто не в качестве кода, а в уровне мышления. Middle думает задачей и реализацией. Senior думает системой и последствиями решений. И даже если цель не стать сеньором прямо сейчас, оставаться только на уровне реализации задач - это ограничение роста.
Если резюмировать, то System Design для middle-разработчика - это не про обязанность проектировать сложные системы с нуля. Это про более осознанный код, понимание устройства системы, уверенность в технических обсуждениях и фундамент для дальнейшего роста. И эффект от этого обычно заметен довольно быстро - как в работе, так и в том, как меняется само восприятие разработки.
Кто я | Навигация | Спасибо
❤27👍15🔥8
В преддверии майских праздников мы разыгрываем три приза для развития ваших профессиональных навыков.
Призы:
• Один курс на выбор.
• Один интенсив на выбор.
• Одно mock-собеседование от it-interview.io с обратной связью.
Все подробности в посте по ссылке: https://xn--r1a.website/balun_courses/369
Кто я | Навигация | Спасибо
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥7👍3🎉1
🧩 В Go select устроен так, что при одновременной готовности нескольких каналов он не пытается как-то честно распределять выполнение.
Там нет ни очереди, ни учета того, кто дольше ждал - просто выбирается один из готовых кейсов. Из-за этого иногда можно наблюдать странное поведение, когда одна ветка как будто получает больше внимания, чем другая, хотя формально они равнозначны.
Например, в простом цикле с двумя каналами это может выглядеть так:
Даже если оба канала активно шлют данные, на практике может получиться перекос в сторону одного из них. Это не баг, а просто особенность того, как сделан выбор внутри select.
Если появляется задача сделать один канал важнее другого, обычно начинают с самого прямого подхода - сначала проверяют приоритетный канал, и только если там пусто, идут дальше.
Здесь логика простая: если есть highPriority - берем его сразу, если нет - работаем с lowPriority, но перед обработкой ему дают второй шанс проверить highPriority (при это сообщение из lowPriority будет получено). Это уже дает довольно жесткий приоритет, но ценой того, что нижний уровень может иногда простаивать дольше.
Есть вариант чуть мягче, когда приоритет не фиксируется настолько строго, а скорее “подсвечивается” через вероятность. Например, можно повторять ветку несколько раз:
Тут highPriority просто статистически будет выигрывать чаще, но без полного подавления lowPriority.
Третий способ - использовать дополнительный select с default перед основным. Сначала делается неблокирующая проверка приоритетного канала.
Но важно понимать, что это всt не обязательные паттерны. В большинстве реальных систем select нормально работает без таких усложнений, и дополнительные схемы приоритизации нужны только тогда, когда действительно есть разный уровень критичности сообщений или нагрузка распределяется неравномерно.
Если такой необходимости нет - лучше не усложнять. В остальном выбор подхода зависит от конкретной задачи, и каждый может подобрать вариант, который ему кажется более уместным.
Кто я | Навигация | Спасибо
Там нет ни очереди, ни учета того, кто дольше ждал - просто выбирается один из готовых кейсов. Из-за этого иногда можно наблюдать странное поведение, когда одна ветка как будто получает больше внимания, чем другая, хотя формально они равнозначны.
Например, в простом цикле с двумя каналами это может выглядеть так:
for {
select {
case msg := <-ch1:
fmt.Println(msg)
case msg := <-ch2:
fmt.Println(msg)
}
}
Даже если оба канала активно шлют данные, на практике может получиться перекос в сторону одного из них. Это не баг, а просто особенность того, как сделан выбор внутри select.
Если появляется задача сделать один канал важнее другого, обычно начинают с самого прямого подхода - сначала проверяют приоритетный канал, и только если там пусто, идут дальше.
for {
select {
case msg := <-highPriority:
handleHigh(msg)
case msg := <-lowPriority:
select {
case msg := <-highPriority:
handleHigh(msg)
default:
handleLow(msg)
}
}
}
Здесь логика простая: если есть highPriority - берем его сразу, если нет - работаем с lowPriority, но перед обработкой ему дают второй шанс проверить highPriority (при это сообщение из lowPriority будет получено). Это уже дает довольно жесткий приоритет, но ценой того, что нижний уровень может иногда простаивать дольше.
Есть вариант чуть мягче, когда приоритет не фиксируется настолько строго, а скорее “подсвечивается” через вероятность. Например, можно повторять ветку несколько раз:
for {
select {
case msg := <-highPriority:
handleHigh(msg)
case msg := <-highPriority:
handleHigh(msg)
case msg := <-lowPriority:
handleLow(msg)
}
}
Тут highPriority просто статистически будет выигрывать чаще, но без полного подавления lowPriority.
Третий способ - использовать дополнительный select с default перед основным. Сначала делается неблокирующая проверка приоритетного канала.
for {
select {
case msg := <-highPriority:
handleHigh(msg)
default:
}
select {
case msg := <-highPriority:
handleHigh(msg)
case msg := <-lowPriority:
handleLow(msg)
}
}
Но важно понимать, что это всt не обязательные паттерны. В большинстве реальных систем select нормально работает без таких усложнений, и дополнительные схемы приоритизации нужны только тогда, когда действительно есть разный уровень критичности сообщений или нагрузка распределяется неравномерно.
Если такой необходимости нет - лучше не усложнять. В остальном выбор подхода зависит от конкретной задачи, и каждый может подобрать вариант, который ему кажется более уместным.
Кто я | Навигация | Спасибо
👍60🔥14❤13🏆1
💭 Написал подробную статью про подготовку к алгоритмическим собеседованиям - там собрал все, что обычно вызывает больше всего вопросов у разработчиков: как вообще устроена алгосекция, что именно спрашивают, какие темы нужно знать, и как к этому системно готовиться, чтобы не "зазубривать задачи", а понимать их суть.
Разобрал в статье:
- базовые алгоритмы и структуры данных, которые реально встречаются на интервью
- как подходить к решению задач, а не просто решать их по шаблону
- типовые ошибки кандидатов на алгоритмических собеседованиях
- как готовиться так, чтобы уверенно проходить интервью в BigTech
🔗 Ссылка на статью: https://balun.courses/blog/algorithmic_interview/
Ещё в ближайшее время буду рассказывать про алгоритмы и подготовку к собеседованиям на конференциях:
- 13 мая, Москва - конференция Mobius
- 16 мая, Чебоксары - конференция IT-Link
- 30 мая, Ростов-на-Дону - митап по программированию
Если будете на этих мероприятиях - приходите на доклады, буду рад пообщаться вживую!
Кто я | Навигация | Спасибо
Разобрал в статье:
- базовые алгоритмы и структуры данных, которые реально встречаются на интервью
- как подходить к решению задач, а не просто решать их по шаблону
- типовые ошибки кандидатов на алгоритмических собеседованиях
- как готовиться так, чтобы уверенно проходить интервью в BigTech
🔗 Ссылка на статью: https://balun.courses/blog/algorithmic_interview/
Ещё в ближайшее время буду рассказывать про алгоритмы и подготовку к собеседованиям на конференциях:
- 13 мая, Москва - конференция Mobius
- 16 мая, Чебоксары - конференция IT-Link
- 30 мая, Ростов-на-Дону - митап по программированию
Если будете на этих мероприятиях - приходите на доклады, буду рад пообщаться вживую!
Кто я | Навигация | Спасибо
👍38🔥13❤12
ИИ уже стал частью нашей жизни и работы. И именно поэтому о нем стоит говорить и говорить
В мае совместно с Центральным Университетом пройдет митап, посвященный разработке, внутреннему устройству ИИ и работе с ним!
В программе 3 доклада и один круглый стол, на которых:
• подумаем над разворачиванием LLM-моделей на своих телефонах для приватных ассистентов
• узнаем про Agent Client Protocol, который помогает интегрировать модели прямо в плагины для IDE
• поговорим о том, как заставить агентов выдавать качественный код
• и конечно поспорим о том, какую дорогу стоит выбирать компаниям: покупать готовые модели или разворачивать open source решения
Спикеры из Ozon, OpenIDE, H3llo Cloud и BlackHub Games! Митап пройдет в кампусе Центрального Университета 21 мая в 18:30 🚀
Зарегистрироватсья можно по ссылке: https://cu.ru/career/events/good-bad-ai?utm_source=partners&utm_campaign=allo_ada
Кто я | Навигация | Спасибо
В мае совместно с Центральным Университетом пройдет митап, посвященный разработке, внутреннему устройству ИИ и работе с ним!
В программе 3 доклада и один круглый стол, на которых:
• подумаем над разворачиванием LLM-моделей на своих телефонах для приватных ассистентов
• узнаем про Agent Client Protocol, который помогает интегрировать модели прямо в плагины для IDE
• поговорим о том, как заставить агентов выдавать качественный код
• и конечно поспорим о том, какую дорогу стоит выбирать компаниям: покупать готовые модели или разворачивать open source решения
Спикеры из Ozon, OpenIDE, H3llo Cloud и BlackHub Games! Митап пройдет в кампусе Центрального Университета 21 мая в 18:30 🚀
Зарегистрироватсья можно по ссылке: https://cu.ru/career/events/good-bad-ai?utm_source=partners&utm_campaign=allo_ada
Кто я | Навигация | Спасибо
🔥13❤5👍5🎉1💯1👨💻1
💭 Есть известная шутка: "There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors"
И сначала кажется, что насчет кеша это просто мем. Ну реально - что сложного? Обновил данные в БД, очистил кеш и все. А потом появляется баг: данные уже обновились, но пользователь все еще видит старое значение. Проблема в том, что кеш - это почти всегда еще одна копия данных. Есть оригинал в БД, а есть копия, например в Redis, локальном кеше, CDN или браузере. И теперь все это нужно держать синхронным.
И вот тут начинается веселье, так как нужно понять: когда удалять кеш, кто должен его удалять, какой именно ключ инвалидировать и что делать, если несколько инстансов одновременно обновляют данные.
Причем даже такой простой код уже может создавать проблемы:
Потому что БД могла обновиться успешно, а сервис упал до удаления ключа. И устаревшие данные останутся жить дальше. Если сделать наоборот - тоже можно поймать баг. Удалили данные в кеше, но БД еще не обновилась, а другой запрос сходил в базу, прочитал старые данные и снова положил их в кеш (то есть сами восстановили устаревшие данные).
Именно поэтому вокруг кеширования столько паттернов: например cache aside, write through, write behind и так далее. Но ни один из них не решает проблему полностью. Они просто по-разному влияют на задержки, консистентность или сложность системы.
Отдельная боль - многоуровневый кеш. Когда у вас одновременно: in-memory cache, Redis, CDN, кеш браузера или кеш на фронте. И теперь инвалидировать нужно не один слой, а сразу всю цепочку. Особенно весело, когда в одном месте данные уже обновились, а в другом еще нет. И система начинает сама себе противоречить.
Поэтому инвалидация кеша - это не просто старый мем разработчиков. Это реально одна из самых неприятных задач в программировании, которая на словах выглядит элементарно, а на практике постоянно приводит к очень странным проблемам.
Кто я | Навигация | Спасибо
И сначала кажется, что насчет кеша это просто мем. Ну реально - что сложного? Обновил данные в БД, очистил кеш и все. А потом появляется баг: данные уже обновились, но пользователь все еще видит старое значение. Проблема в том, что кеш - это почти всегда еще одна копия данных. Есть оригинал в БД, а есть копия, например в Redis, локальном кеше, CDN или браузере. И теперь все это нужно держать синхронным.
И вот тут начинается веселье, так как нужно понять: когда удалять кеш, кто должен его удалять, какой именно ключ инвалидировать и что делать, если несколько инстансов одновременно обновляют данные.
Причем даже такой простой код уже может создавать проблемы:
db.UpdateUser(user)
redis.Del("user:123")
Потому что БД могла обновиться успешно, а сервис упал до удаления ключа. И устаревшие данные останутся жить дальше. Если сделать наоборот - тоже можно поймать баг. Удалили данные в кеше, но БД еще не обновилась, а другой запрос сходил в базу, прочитал старые данные и снова положил их в кеш (то есть сами восстановили устаревшие данные).
Именно поэтому вокруг кеширования столько паттернов: например cache aside, write through, write behind и так далее. Но ни один из них не решает проблему полностью. Они просто по-разному влияют на задержки, консистентность или сложность системы.
Отдельная боль - многоуровневый кеш. Когда у вас одновременно: in-memory cache, Redis, CDN, кеш браузера или кеш на фронте. И теперь инвалидировать нужно не один слой, а сразу всю цепочку. Особенно весело, когда в одном месте данные уже обновились, а в другом еще нет. И система начинает сама себе противоречить.
Поэтому инвалидация кеша - это не просто старый мем разработчиков. Это реально одна из самых неприятных задач в программировании, которая на словах выглядит элементарно, а на практике постоянно приводит к очень странным проблемам.
Кто я | Навигация | Спасибо
👍39❤8🔥7⚡1🤩1
💭 Периодически провожу бесплатные консультации в формате Q&A-встреч, где можно задать вопросы про программирование, карьеру, собеседования, развитие в IT и просто обсудить разные рабочие ситуации
Мы специально разделили встречи на два формата:
- отдельно для новичков и тех, кто только пытается войти в IT
- отдельно для разработчиков с опытом, которые уже с опытом
Обычно на таких встречах обсуждаем:
- как эффективнее учиться и что именно изучать
- как готовиться к собеседованиям
- выбор языка, стека или направления
- архитектуру, backend, Go и смежные темы
- проблемы на текущей работе и карьерные тупики
Следующие встречи пройдут 26 и 28 мая.
Участие бесплатное, но записи не делаем - только онлайн присутствие вживую. Если интересно, можно присоединиться по ссылке: balun.courses/open_lessons/qa
Кто я | Навигация | Спасибо
Мы специально разделили встречи на два формата:
- отдельно для новичков и тех, кто только пытается войти в IT
- отдельно для разработчиков с опытом, которые уже с опытом
Обычно на таких встречах обсуждаем:
- как эффективнее учиться и что именно изучать
- как готовиться к собеседованиям
- выбор языка, стека или направления
- архитектуру, backend, Go и смежные темы
- проблемы на текущей работе и карьерные тупики
Следующие встречи пройдут 26 и 28 мая.
Участие бесплатное, но записи не делаем - только онлайн присутствие вживую. Если интересно, можно присоединиться по ссылке: balun.courses/open_lessons/qa
Кто я | Навигация | Спасибо
🔥15❤10👍8🏆1
📹 Сняли новое видео, где разбираем тестовые задания по программированию
Обсуждаем с Женей Айти Красавчиком, как бы мы сами подходили к решению, на что смотрели в первую очередь, какие вопросы задавали бы и где чаще всего допускают ошибки. Если готовитесь к интервью или просто хотите посмотреть на разные тестовые задания - должно быть полезно.
Посмотреть можно по ссылке: https://www.youtube.com/watch?v=gcG_YhYZUWI
Кто я | Навигация | Спасибо
Обсуждаем с Женей Айти Красавчиком, как бы мы сами подходили к решению, на что смотрели в первую очередь, какие вопросы задавали бы и где чаще всего допускают ошибки. Если готовитесь к интервью или просто хотите посмотреть на разные тестовые задания - должно быть полезно.
Посмотреть можно по ссылке: https://www.youtube.com/watch?v=gcG_YhYZUWI
Кто я | Навигация | Спасибо
👍20🔥12❤10
🎤 Сезон докладов для меня официально открыт
Несколько дней назад выступал на конференции Mobius и рассказывал про подготовку к алгоритмическим собеседованиям: как к ним подходить, почему недостаточно просто «нарешивать задачи» и на что на самом деле обращают внимание на интервью.
Кстати, уже завтра расскажу этот доклад в Чебоксарах на конференции IT-Link. Если будете там - приходите на доклад и после пообщаться!
Кто я | Навигация | Спасибо
Несколько дней назад выступал на конференции Mobius и рассказывал про подготовку к алгоритмическим собеседованиям: как к ним подходить, почему недостаточно просто «нарешивать задачи» и на что на самом деле обращают внимание на интервью.
Кстати, уже завтра расскажу этот доклад в Чебоксарах на конференции IT-Link. Если будете там - приходите на доклад и после пообщаться!
Кто я | Навигация | Спасибо
🔥19❤10👍8
Вся база по Kafka для разработки и собеседований
• 20 мая, СР
• 19:00 по мск
Открытый урок по внутреннему устройству Kafka, кейсам ее использования и частым вопросам, которые спрашивают на собеседованиях. Запись для всех зарегистрировавшихся
Что будет на уроке:
1️⃣ Почему появилась Kafka и какие задачи она решает
2️⃣ Как устроена Kafka: топики, партиции, оффсеты, сегменты
3️⃣ Как работает компактификация и зачем она нужна
4️⃣ Чем Kafka отличается от RabbitMQ и когда что выбирать
5️⃣ Как использовать Kafka в популярных сценариях
6️⃣ Какие вопросы задают на собеседованиях в BigTech, и как на них отвечать
Записаться на урок можно по ссылке: https://clck.ru/3Ti4p2
Кто я | Навигация | Спасибо
• 20 мая, СР
• 19:00 по мск
Открытый урок по внутреннему устройству Kafka, кейсам ее использования и частым вопросам, которые спрашивают на собеседованиях. Запись для всех зарегистрировавшихся
Что будет на уроке:
Записаться на урок можно по ссылке: https://clck.ru/3Ti4p2
Кто я | Навигация | Спасибо
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤7🔥6
🎤 На выходных выступал в Чебоксарах на конференции IT-Link с докладом про алгоритмические собеседования
Разбирали, почему алгособесы во многом похожи на RPG-игры: у них тоже есть свои механики, паттерны, боссы и стратегии прохождения. Плюс поделился своими лайфхаками - как со стороны кандидата, так и со стороны интервьюера.
А уже в субботу, 23 мая, выступлю в Ростове-на-Дону на Don Dev Conf с новой темой - про софт скиллы. Будем обсуждать: как разработчикам быть более продуктивными и эффективными и почему мы постоянно ничего не успеваем.
Если будете на конференции - приходите на доклад 🙂
Кто я | Навигация | Спасибо
Разбирали, почему алгособесы во многом похожи на RPG-игры: у них тоже есть свои механики, паттерны, боссы и стратегии прохождения. Плюс поделился своими лайфхаками - как со стороны кандидата, так и со стороны интервьюера.
А уже в субботу, 23 мая, выступлю в Ростове-на-Дону на Don Dev Conf с новой темой - про софт скиллы. Будем обсуждать: как разработчикам быть более продуктивными и эффективными и почему мы постоянно ничего не успеваем.
Если будете на конференции - приходите на доклад 🙂
Кто я | Навигация | Спасибо
🔥27👍11❤10
📹 Записал отдельное видео про lock contention - проблему, которая может незаметно съедать производительность даже в хорошо написанном многопоточном коде
В видео разобрал: что такое lock contention и почему он возникает и какие подходы помогают снизить contention и улучшить производительность.
Посмотреть можно по ссылке: https://youtu.be/ANQJPn6WAZA
Кто я | Навигация | Спасибо
В видео разобрал: что такое lock contention и почему он возникает и какие подходы помогают снизить contention и улучшить производительность.
Посмотреть можно по ссылке: https://youtu.be/ANQJPn6WAZA
Кто я | Навигация | Спасибо
❤24👍15🔥9👏1