Вы проголосовали за текущие собесы, а так как у нас демократия (хоть где-то) - расскажу что по собесам
Сейчас общаюсь с ~10 компаниями: стартапы, аутсорсы.
Большинство пока ограничилось HR-интервью, техсобесы намечены на следующую неделю.
1) Две компании просто загостили
2) Стартап Zerion - литкод-собес(отказ)
Первая задача - отсортировать массив возрастов. Решил через bucket sort, но оказалось, это был counting sort
Вторая задача - Random Pick with Weight - часто даёт Meta. Не решил
В фидбэке сказали про хорошие навыки коммуникации и dry run, но я перепутал сортировки и не решил вторую задачу
3) Аутсорс-проект на Reddit
Собес был довольно лайтовый: немного Go + валидация скобок
Если прошел, дальше должно быть тестовое и ещё один этап
4) Стартап, который мэчит посты по эмоциям
Сказал, что провожу алгомоки
- Какая высота сбалансированных деревьев?
- Логарифмическая
- А какая разница в высоте между поддеревьями?
- Не больше одного
- В красно-черных деревьях не так
Знаете эти собесы из серии умный интервьюер, глупый интервьюемый. Я не против узнать что-то новое, но можно подать это в другой форме. Прислали отказ - нерелевантный опыт
Из интересного:
Сейчас часто HR делают запись на интервью, особенно если в нём есть элемент техскрининга
Большая часть собесов - на русском.
Если компании важен английский - будут и англоблоки.
Здесь неожиданно помогла подготовка к AWS: некоторые кейсы рассказываются на англе уже машинально - про интересные проекты, конфликты, взаимодействие с продактами
Сейчас общаюсь с ~10 компаниями: стартапы, аутсорсы.
Большинство пока ограничилось HR-интервью, техсобесы намечены на следующую неделю.
1) Две компании просто загостили
2) Стартап Zerion - литкод-собес(отказ)
Первая задача - отсортировать массив возрастов. Решил через bucket sort, но оказалось, это был counting sort
Вторая задача - Random Pick with Weight - часто даёт Meta. Не решил
В фидбэке сказали про хорошие навыки коммуникации и dry run, но я перепутал сортировки и не решил вторую задачу
3) Аутсорс-проект на Reddit
Собес был довольно лайтовый: немного Go + валидация скобок
Если прошел, дальше должно быть тестовое и ещё один этап
4) Стартап, который мэчит посты по эмоциям
Сказал, что провожу алгомоки
- Какая высота сбалансированных деревьев?
- Логарифмическая
- А какая разница в высоте между поддеревьями?
- Не больше одного
- В красно-черных деревьях не так
Знаете эти собесы из серии умный интервьюер, глупый интервьюемый. Я не против узнать что-то новое, но можно подать это в другой форме. Прислали отказ - нерелевантный опыт
Из интересного:
Сейчас часто HR делают запись на интервью, особенно если в нём есть элемент техскрининга
Большая часть собесов - на русском.
Если компании важен английский - будут и англоблоки.
Здесь неожиданно помогла подготовка к AWS: некоторые кейсы рассказываются на англе уже машинально - про интересные проекты, конфликты, взаимодействие с продактами
❤4🔥3👏1🌭1
Рекомендации по тг-каналам, в комментах присылайте свои
1) Влад Тен с канала Влад Тен @tenfoundation
Просто goat. У него крутой курс по алгосам, сейчас идет по сис дизу. Работал во многих в бигтехах включая майкрософт
2) Лена @lenka_ne_work работала и проводила алгособесы в гугле, написала пост в твиттере как проходить алгосы. Рассказывает про сис диз, в том числе делает моки по нему
3) @MicroservicesThoughts топ канал по микросервисам, оттуда узнаете про микросервисные паттерны, как работает repeatable read в постгрес и так далее
1) Влад Тен с канала Влад Тен @tenfoundation
Просто goat. У него крутой курс по алгосам, сейчас идет по сис дизу. Работал во многих в бигтехах включая майкрософт
2) Лена @lenka_ne_work работала и проводила алгособесы в гугле, написала пост в твиттере как проходить алгосы. Рассказывает про сис диз, в том числе делает моки по нему
3) @MicroservicesThoughts топ канал по микросервисам, оттуда узнаете про микросервисные паттерны, как работает repeatable read в постгрес и так далее
🔥6❤4✍1👍1😁1
Продолжаю гриндить собесы
1) Было второе интервью в аутсорс-компанию на проект Reddit
Пока это валидация со стороны подрядчика, дальше 2-4 собеса уже с Reddit.
На интервью дали задачу: есть лимит (деньги) и набор монет. Нужно перебирать монеты, пока сумма не превышает лимит. Как только превышаем - это считается одной попыткой "размена", даже если сумма меньше самого лимита. Типичная задача на DP. Разложил top-down решение, на что интервьюер сказал "ай донт андерстенд", попросил после интервью скинуть решение через HR😧 и мы просто перешли к другой задаче.
2) Собес в компанию FYST — они пилят API gateway на Go
Формат стандартный: live coding + вопросы по базам.
Первое интервью которое мне реально понравилось - нормальный темп, адекватные интервьюеры
Узнал что создание индекса через CONCURRENTLY в PostgreSQL не гарантирует что индекс создатся полностью(он может быть помечен как не валидный - не используется, но обновляется)
Потом было финальное интервью - немного странные вайбы, есть шанс что завалил
Отдельно - в LinkedIn начали стучаться рекрутеры из англоязычных стартапов/компаний.
Где-то выдали тестовое, где-то сразу позвали на техраунд.
Буду держать в курсе, что из этого выйдет😘
1) Было второе интервью в аутсорс-компанию на проект Reddit
Пока это валидация со стороны подрядчика, дальше 2-4 собеса уже с Reddit.
На интервью дали задачу: есть лимит (деньги) и набор монет. Нужно перебирать монеты, пока сумма не превышает лимит. Как только превышаем - это считается одной попыткой "размена", даже если сумма меньше самого лимита. Типичная задача на DP. Разложил top-down решение, на что интервьюер сказал "ай донт андерстенд", попросил после интервью скинуть решение через HR
2) Собес в компанию FYST — они пилят API gateway на Go
Формат стандартный: live coding + вопросы по базам.
Первое интервью которое мне реально понравилось - нормальный темп, адекватные интервьюеры
Узнал что создание индекса через CONCURRENTLY в PostgreSQL не гарантирует что индекс создатся полностью(он может быть помечен как не валидный - не используется, но обновляется)
Потом было финальное интервью - немного странные вайбы, есть шанс что завалил
Отдельно - в LinkedIn начали стучаться рекрутеры из англоязычных стартапов/компаний.
Где-то выдали тестовое, где-то сразу позвали на техраунд.
Буду держать в курсе, что из этого выйдет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥6❤4🌭2🤯1
Апдейты по собесам
В прошлом посте писал про интервью в Reddit через аутсорс
Пришёл фидбэк - отказ Причина: нерешённая первая задача и какие-то техвопросы, на которые я не дал ответа🤨
Написал эйчарше про некомпетентность интервьюера и готовность пройти собес еще раз с другим интервьюером. Не думаю что это к чему-то приведет, но хотя бы подсветил непрофессионализм интервьюера
На этой неделе было три собеса: два system design, один Go на английском
Последний по деньгам ~5k, не топ, но радует что такие собесы появляются
System design #1 - Uzum
Есть существующая система (см. картинку), модифицировать нельзя
Задача - прокинуть локацию курьера клиенту через long-polling и вписаться в SLA
Это собес прошел хоть и со сложностями, моей ошибкой было прикручивать PostgreSQL и select for update при скейлинге сервиса предрассчитывающего геолокацию курьера - чтобы не обрабатывать один и тот же order-id в разных инстансах
В результате держались транзакции, пока шли запросы к другим сервисам
Изначально хотел прикрутить Redis-локи, но не знал, как они устроены - поэтому от идеи отказался
System design #2 - крипто-стартап (на англе)
Задизайнить фичу: подписка на изменение цены криптовалюты
Пользователь получает email, если цена превысила/упала ниже заданной
Тут прям зафейлил
Придумал отдельный matcher-сервис, который поллит БД: ищет подписки и пытается смэтчить с текущими ценами
Когда вместо этого можно консьюмить цены по криптовалютам -> подписки хранить в памяти консьюмера и там же мэтчить
В прошлом посте писал про интервью в Reddit через аутсорс
Пришёл фидбэк - отказ Причина: нерешённая первая задача и какие-то техвопросы, на которые я не дал ответа
Написал эйчарше про некомпетентность интервьюера и готовность пройти собес еще раз с другим интервьюером. Не думаю что это к чему-то приведет, но хотя бы подсветил непрофессионализм интервьюера
На этой неделе было три собеса: два system design, один Go на английском
Последний по деньгам ~5k, не топ, но радует что такие собесы появляются
System design #1 - Uzum
Есть существующая система (см. картинку), модифицировать нельзя
Задача - прокинуть локацию курьера клиенту через long-polling и вписаться в SLA
Это собес прошел хоть и со сложностями, моей ошибкой было прикручивать PostgreSQL и select for update при скейлинге сервиса предрассчитывающего геолокацию курьера - чтобы не обрабатывать один и тот же order-id в разных инстансах
В результате держались транзакции, пока шли запросы к другим сервисам
Изначально хотел прикрутить Redis-локи, но не знал, как они устроены - поэтому от идеи отказался
System design #2 - крипто-стартап (на англе)
Задизайнить фичу: подписка на изменение цены криптовалюты
Пользователь получает email, если цена превысила/упала ниже заданной
Тут прям зафейлил
Придумал отдельный matcher-сервис, который поллит БД: ищет подписки и пытается смэтчить с текущими ценами
Когда вместо этого можно консьюмить цены по криптовалютам -> подписки хранить в памяти консьюмера и там же мэтчить
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5🍓2❤1
#leetcode
Апдейты по собесам - на следующей неделе, а пока камбэк в leetcode и захотелось немного нагнать литкодной духоты
Все знают про binary search, а есть такой поц - binary search on answer
Это когда нужно найти мин/макс возможный ответ, и есть функция feasible, которая проверяет, подходит ли кандидат. Главное, чтобы условие было монотонным: если подходит x, то всё большее (или меньшее) тоже подойдёт.
Иногда входной массив нужно отсортировать, иногда нет - зависит от задачи. Если, например, значения возрастают линейно (время), сортировка не нужна.
Нужно определить границы left и right, и паттерн выглядит так:
Классическая задача на такой паттерн:
https://leetcode.com/problems/koko-eating-bananas/description/
Апдейты по собесам - на следующей неделе, а пока камбэк в leetcode и захотелось немного нагнать литкодной духоты
Все знают про binary search, а есть такой поц - binary search on answer
Это когда нужно найти мин/макс возможный ответ, и есть функция feasible, которая проверяет, подходит ли кандидат. Главное, чтобы условие было монотонным: если подходит x, то всё большее (или меньшее) тоже подойдёт.
Иногда входной массив нужно отсортировать, иногда нет - зависит от задачи. Если, например, значения возрастают линейно (время), сортировка не нужна.
Нужно определить границы left и right, и паттерн выглядит так:
L, R = lower_bound, upper_bound
ans = None
while L <= R:
mid = (L + R) // 2
if feasible(mid):
ans = mid
R = mid - 1 # ищем минимум
else:
L = mid + 1
return ans
Классическая задача на такой паттерн:
https://leetcode.com/problems/koko-eating-bananas/description/
🔥7🤓4👍3❤1🍓1
Во-первых спасибо что подписываетесь, всех обнял 👉
Во-вторых я начал делать посты в линкедин, коннектитесь если интересно
В третьих апдейты по собесам
1) Uzum - прошло хорошо, выбрали другого кандидата
2) InDrive - ответил на все вопросы, но по ощущениям занизили грейд до мидла. Процесс на этом я закончил
3) Criteo - ворвался чисто по фану. У них нет привязки к языку - два литкод-собеса, один систем дизайн
- Первый литкод собес - sliding window
- Второй как эта задача только с бизнесовым контекстом
- Третий систем дизайн - tinyUrl
По ощущениям было изи, только в первом алгособесе интервьюер прерывал меня и не дал довести оптимальное решение. Задачку приложу в коммент, если интересно
Продолжаю дальше бежать по собесам, написали из plata и еще из пары аутсорсов
Во-вторых я начал делать посты в линкедин, коннектитесь если интересно
В третьих апдейты по собесам
1) Uzum - прошло хорошо, выбрали другого кандидата
2) InDrive - ответил на все вопросы, но по ощущениям занизили грейд до мидла. Процесс на этом я закончил
3) Criteo - ворвался чисто по фану. У них нет привязки к языку - два литкод-собеса, один систем дизайн
- Первый литкод собес - sliding window
- Второй как эта задача только с бизнесовым контекстом
- Третий систем дизайн - tinyUrl
По ощущениям было изи, только в первом алгособесе интервьюер прерывал меня и не дал довести оптимальное решение. Задачку приложу в коммент, если интересно
Продолжаю дальше бежать по собесам, написали из plata и еще из пары аутсорсов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍6❤4🍓2🌭1
Апдейты по собесам
1) Финал в Criteo. Общался с двумя русскоязычными продактами.
Проект - система реального аукциона для показа рекламы. Показывается реклама с большим bid_id. Нагрузка - 1k rps, бэк на Lua и движок на плюсах.
Сделали предоффер, в понедельник выложу сам оффер и цифры. Финал был чиловым, один из лидов заценил мои посты в LinkedIn
2) Plata. На следующей неделе систем дизайн. Готовлюсь. Хочу закрыть неделю двумя офферами
Как приму офер, выложу табличку со статистикой, веду ее с начала лета.
Недавно общался с эйчаршей. Рассказывала, что у них в компании очень умные разработчики, потому что у всех есть вышка💀 . После, попросила рекомендацию с прошлого места работы, очень странно, переписку приложу в коммент. Это ред флаг или нет, что думаете?
1) Финал в Criteo. Общался с двумя русскоязычными продактами.
Проект - система реального аукциона для показа рекламы. Показывается реклама с большим bid_id. Нагрузка - 1k rps, бэк на Lua и движок на плюсах.
Сделали предоффер, в понедельник выложу сам оффер и цифры. Финал был чиловым, один из лидов заценил мои посты в LinkedIn
2) Plata. На следующей неделе систем дизайн. Готовлюсь. Хочу закрыть неделю двумя офферами
Как приму офер, выложу табличку со статистикой, веду ее с начала лета.
Недавно общался с эйчаршей. Рассказывала, что у них в компании очень умные разработчики, потому что у всех есть вышка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤4👏2🍓1
Оффер от Criteo
Я пока живу в Ереване, поэтому сумма в драмах (AMD). На руки выходит около $4k😢
Плюс отсыпали акции на $15600(Скрины в комментах)
В мае ещё будет бонус.
По классике - компания делает всё, чтобы удерживать сотрудников
Просчитался, но где😔
Я пока живу в Ереване, поэтому сумма в драмах (AMD). На руки выходит около $4k
Плюс отсыпали акции на $15600(Скрины в комментах)
В мае ещё будет бонус.
По классике - компания делает всё, чтобы удерживать сотрудников
Просчитался, но где
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥9🎉7🍓2😁1
Систем-дизайн в Plata
Есть вендорское API для проверки клиента по санкционным спискам.
Input: фото клиента (base64) -> Output: true/false
SLA: 5 минут, History: 1 месяц
Задача - сделать backend api для проверки клиента(апи вызывают другие бэкенды)
Подсвечу основные моменты:
1) API
Сначала думал про две ручки: POST - check (загрузить фото) и GET - check/{id} (поллинг результата).
Свелось все к отправке в кафку (клиенты - бэкенды), ключ - user_id для маршрутизации
GET оставили как фолбэк
2) Большие фото через Kafka
Вопрос - как передавать фото 2 GB через кафку(есть лимиты)
Сначала предложил использовать presigned url, а в кафку кидать ссылку, но ссылка может протухнуть, дали подсказку - решил на стороне продьюсера сохранять в s3 вместе с uuid и в кафку отправлять сгенеренный uuid
3) Доставка и идемпотентность
Producer - idempotency key + transactional outbox
Косяк - при проверки дублей только по user_id - если первый запрос зафейлился, второй можно случайно скипнуть. Решение - idempotency_key на стороне клиента(бэкенда)
На стороне check-service джоба которая ретраит записи со статусом failed
P.S
Фидбэк положительный, завтра финал
Есть вендорское API для проверки клиента по санкционным спискам.
Input: фото клиента (base64) -> Output: true/false
SLA: 5 минут, History: 1 месяц
Задача - сделать backend api для проверки клиента(апи вызывают другие бэкенды)
Подсвечу основные моменты:
1) API
Сначала думал про две ручки: POST - check (загрузить фото) и GET - check/{id} (поллинг результата).
Свелось все к отправке в кафку (клиенты - бэкенды), ключ - user_id для маршрутизации
GET оставили как фолбэк
2) Большие фото через Kafka
Вопрос - как передавать фото 2 GB через кафку(есть лимиты)
Сначала предложил использовать presigned url, а в кафку кидать ссылку, но ссылка может протухнуть, дали подсказку - решил на стороне продьюсера сохранять в s3 вместе с uuid и в кафку отправлять сгенеренный uuid
3) Доставка и идемпотентность
Producer - idempotency key + transactional outbox
Косяк - при проверки дублей только по user_id - если первый запрос зафейлился, второй можно случайно скипнуть. Решение - idempotency_key на стороне клиента(бэкенда)
На стороне check-service джоба которая ретраит записи со статусом failed
P.S
Фидбэк положительный, завтра финал
🔥28👍11❤4🍓2
Оффер в plata(принял)
По бабкам - 4850 евро гросс(ип армении), после релокации в Барсу - 5335 евро гросс, годовой бонус 1,5 оклада(скрины в комментах). Есть компенсация рело, дмс, курсов
Проект банкоматы, делается с нуля, команда только сформировалась
По бабкам - 4850 евро гросс(ип армении), после релокации в Барсу - 5335 евро гросс, годовой бонус 1,5 оклада(скрины в комментах). Есть компенсация рело, дмс, курсов
Проект банкоматы, делается с нуля, команда только сформировалась
🔥43👍10❤5👏3🎉1🤡1🍓1
Как и обещал моя стата по собесам (с начала лета)
Сперва думал, что дело только в конкуренции, но потом понял - я просто лоу-скилл.
Первая ошибка - не возвращался к вопросам на которые не смог ответить - либо забывал их, либо вспоминал сильно позже. Мастхэв - записывать собесы или хотя бы фиксировать вопросы прямо во время интервью.
Вторая ошибка - неуверенность. Было пару ситуаций, когда интервьюер ошибался, но я сомневался и просто соглашался с ним и только потом что был прав. Будто это все равно влияет на представление о тебе, интервьемый который смог переубедить интервьюера, но это довольно скользкая дорожка
Это не отменяет того что рынок действительно сложный, на собесах спрашивают всё подряд, готовиться приходится ко всему, важно и другое - отсеивать дерьмовые собесы и не париться о них
Сперва думал, что дело только в конкуренции, но потом понял - я просто лоу-скилл.
Первая ошибка - не возвращался к вопросам на которые не смог ответить - либо забывал их, либо вспоминал сильно позже. Мастхэв - записывать собесы или хотя бы фиксировать вопросы прямо во время интервью.
Вторая ошибка - неуверенность. Было пару ситуаций, когда интервьюер ошибался, но я сомневался и просто соглашался с ним и только потом что был прав. Будто это все равно влияет на представление о тебе, интервьемый который смог переубедить интервьюера, но это довольно скользкая дорожка
Это не отменяет того что рынок действительно сложный, на собесах спрашивают всё подряд, готовиться приходится ко всему, важно и другое - отсеивать дерьмовые собесы и не париться о них
❤28🔥15🍓2
Спасибо за тёплые слова и поздравления - всех обнял 😘
Мой забег по собесам пока закончился. Иногда буду ходить, но уже на суммы от $10k+ (если такие вакансии вообще существуют💸 )
Сейчас пробую зачилиться как мой кот на картинке, но у меня шило в одном месте, поэтому хочется двигаться и чем-то заниматься. Начал решать дейлики на литкоде, также думаю взять подписку на csprimer и закрыть пробелы по "базе", плюс подтянуть матан через mathacademy
Мой забег по собесам пока закончился. Иногда буду ходить, но уже на суммы от $10k+ (если такие вакансии вообще существуют
Сейчас пробую зачилиться как мой кот на картинке, но у меня шило в одном месте, поэтому хочется двигаться и чем-то заниматься. Начал решать дейлики на литкоде, также думаю взять подписку на csprimer и закрыть пробелы по "базе", плюс подтянуть матан через mathacademy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24🔥11👍1🤩1🍓1
Я тут весь в делах - с кайфом залетел в мини-стартап(парт-тайм). Постараюсь писать стабильно, чтобы не было больших пауз🤑
В прошлом посте забыл упомянуть полезный ресурс - codecrafters. Позволяет разобраться как работают бд, редис и другие штуки через реализацию с нуля, язык можно выбрать любой
В прошлом посте забыл упомянуть полезный ресурс - codecrafters. Позволяет разобраться как работают бд, редис и другие штуки через реализацию с нуля, язык можно выбрать любой
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3🍓2
Решил составить список моих личных ошибок на систем дизайне, делаю это исходя исключительно из своего опыта
1) Забывать возвращаться к функциональным требованиям. У меня такое часто было что я определил функ.требования -> сделал api и дальше забыл про них, хотя они могут натолкнуть, дать подсказку касательно метрик, ttl, sla и так далее. В общем главное держать это в голове, либо вообще выделить красным чтобы было на виду
2) Как только ворвался в сис диз - старался уделять большое внимание расчетам. Хотя глобально это штуку можно скипнуть, если сервис с большим кол-вом пользователей типа твиттера, ютуба, то очевидно что будет большая нагрузка. Для себя расчёты оставил только как инструмент, чтобы понять тип нагрузки - read/write, и уже от этого строить дизайн
Пишите в комменты свои ошибки(не только по сис дизу)
1) Забывать возвращаться к функциональным требованиям. У меня такое часто было что я определил функ.требования -> сделал api и дальше забыл про них, хотя они могут натолкнуть, дать подсказку касательно метрик, ttl, sla и так далее. В общем главное держать это в голове, либо вообще выделить красным чтобы было на виду
2) Как только ворвался в сис диз - старался уделять большое внимание расчетам. Хотя глобально это штуку можно скипнуть, если сервис с большим кол-вом пользователей типа твиттера, ютуба, то очевидно что будет большая нагрузка. Для себя расчёты оставил только как инструмент, чтобы понять тип нагрузки - read/write, и уже от этого строить дизайн
Пишите в комменты свои ошибки(не только по сис дизу)
🔥8❤4🍓1
У меня начались флэшбэки с собесов и задач которые мне давали, буду по-тихоньку их разбирать. На интервью по гошке часто просят реализовать кэш. Звучит несложно, hashmap + mutex/rwmutex
И тут всплывает главное отличие между data race и race condition.
Data race - это непредсказуемое поведение при одновременном доступе к памяти без синхронизации. У нас используется mutex, всё безопасно.
Race condition - это логическая гонка.
Даже если синхронизация есть, результат может зависеть от порядка выполнения горутин. Что если 1000 горутин будут обновлять значение по одному и тому же ключу(cache stampede). Сжигаем cpu и создаём лишнюю нагрузку - все конкурируют за один и тот же mutex, хотя данные у всех одинаковые. Важно, нижеперечисленные оптимизации работают только если значения одинаковые и важен первый write, который затирает остальные.
Если же бизнесу важен последний апдейт - эти оптимизации не помогут, нужен совсем другой подход
1) Double checking
Просто и понятно, в put мы добавляем две проверки на наличие ключа. Тем самым горутина внутри мьютекса не будет перезаписывать значение если оно уже есть. Но все равно есть конкурентный доступ к мапе
2) Сын маминой подруги - single-flight😎 . Реализуется через киллер-фичу гошки - каналы. Вкратце - создается еще одна мапа calls, ключ любой key и value - канал, через который другие горутины будут ждать результат. Первая горутина, которая успела захватить мьютекс, создаёт канал и кладёт его в calls. Все остальные, кто пришел с этим ключом, ждут значение через канал
P.S
Эта задача была в индрайв - я разложил эту задачу до атомов, упомянув все перечисленные выше оптимизации, на сеньора не прошел😧
get(key)
mx.RLock()
defer mx.RUnlock()
val, ok := data[key]
return val, ok
put(key, val)
mx.Lock()
defer mx.Unlock()
data[key] = val
И тут всплывает главное отличие между data race и race condition.
Data race - это непредсказуемое поведение при одновременном доступе к памяти без синхронизации. У нас используется mutex, всё безопасно.
Race condition - это логическая гонка.
Даже если синхронизация есть, результат может зависеть от порядка выполнения горутин. Что если 1000 горутин будут обновлять значение по одному и тому же ключу(cache stampede). Сжигаем cpu и создаём лишнюю нагрузку - все конкурируют за один и тот же mutex, хотя данные у всех одинаковые. Важно, нижеперечисленные оптимизации работают только если значения одинаковые и важен первый write, который затирает остальные.
Если же бизнесу важен последний апдейт - эти оптимизации не помогут, нужен совсем другой подход
1) Double checking
Просто и понятно, в put мы добавляем две проверки на наличие ключа. Тем самым горутина внутри мьютекса не будет перезаписывать значение если оно уже есть. Но все равно есть конкурентный доступ к мапе
put(key, val)
mx.RLock()
val, ok := data[key]
mx.RUnlock()
if ok {
return
}
mx.Lock()
defer mx.Unlock()
_, ok := data[key] // second check
if ok {
return
}
data[key] = val
2) Сын маминой подруги - single-flight
getOrput(key, val)
mx.RLock()
val, ok := data[key]
mx.RUnlock()
if ok {
return
}
mx.Lock()
if _, ok = calls[key]; ok {
mx.Unlock()
return <- calls[key] // читаем из канала
}
ch := make(chan value, 1) // буф. канал чтобы не блокировать писателя
calls[key] = ch
data[key] = val
delete(calls, key) // удаляем чтобы горутины не блокировались вечно на чтение и не читали старое значение
mx.Unlock()
ch <- val
close(ch)
return val
P.S
Эта задача была в индрайв - я разложил эту задачу до атомов, упомянув все перечисленные выше оптимизации, на сеньора не прошел
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤6🍓2
Собес в яндекс
Наверно после этого поста меня занесут в черный список яндекса, пу-пу-пу😧 . Мое отношение к этой компании больше негативное чем позитивное, я считаю они требуют на собесе очень много и платят меньше рынка. Также я сталкивался с сильной нехваткой софт скиллов у интервьюеров.
С начала года яндекс изменили процесс интервью(не везде), теперь у них есть секция по коду, для Go обычно это имплементация load balancer. Два раза я ходил на собес и два раза мне попалась эта задача. Накидываем слайс бэкендов и атомик для round robin.
Далее идет follow up, нужно отправлять запросы только на живые backend, health check никто не гарантирует.
Я не нашел ничего лучше как в Invoke маркировать живые бэкенды и в GetBackend это учитывать. Но я переусложнил потому что неживым бэкендам нужно давать "второй шанс" и пытаться отправлять на них запросы. Будет мапа которая маркирует живые, неживые и спустя какое-то окно мы будем давать неживым "второй шанс".
В общем самое простое решение - отправлять запрос до тех пор пока не получим ok от бэкенда
Задачка я бы сказал слишком дрочная, еще есть плюс баллы за код и минус за подсказки
Наверно после этого поста меня занесут в черный список яндекса, пу-пу-пу
С начала года яндекс изменили процесс интервью(не везде), теперь у них есть секция по коду, для Go обычно это имплементация load balancer. Два раза я ходил на собес и два раза мне попалась эта задача. Накидываем слайс бэкендов и атомик для round robin.
type Request interface {
}
type Response interface{}
type Backend interface {
Invoke(req Request) (Response, error)
}
type LoadBalancer struct {
backends []Backend
index int64
}
func (lb *LoadBalancer) GetBackend() Backend {
idx := atomic.AddInt64(&lb.index, 1)
return lb.backends[(idx - 1) % int64(len(lb.backends))]
}
func (lb *LoadBalancer) Invoke(req Request) (Response, error) {
backend := lb.GetBackend()
return backend.Invoke(req)
}
Далее идет follow up, нужно отправлять запросы только на живые backend, health check никто не гарантирует.
Я не нашел ничего лучше как в Invoke маркировать живые бэкенды и в GetBackend это учитывать. Но я переусложнил потому что неживым бэкендам нужно давать "второй шанс" и пытаться отправлять на них запросы. Будет мапа которая маркирует живые, неживые и спустя какое-то окно мы будем давать неживым "второй шанс".
В общем самое простое решение - отправлять запрос до тех пор пока не получим ok от бэкенда
func (lb *LoadBalancer) Invoke(req Request) (Response, error) {
for i := 0; i < len(lb.backends); i++ {
backend := lb.GetBackend()
response, err := backend.Invoke(req)
if err == nil {
return response, nil
}
}
return nil, fmt.Errorf("no live backend available")
}
Задачка я бы сказал слишком дрочная, еще есть плюс баллы за код и минус за подсказки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13😁4❤2🤯1🍓1
Недавно готовил своего менти к интервью в Плату. Впервые увидел насколько стресс может отключать приобретенные знания. На моке та же задача была решена идеально, а на интервью нет. Под стрессом человек начинает сомневаться в себе, за что цепляется интервьюер. Какой вывод можно сделать - стрессоустойчивость это не менее важный навык.
Лучше сходить на реальное интервью чем не сходить. Даже если интервью прошло плохо, стрессоустойчивость будет расти - каждый собес +1 к стрессоустойчивости. Также важно преодолеть боязнь идти на интервью, потому что в будущем это окупится и собачка справа станет накаченной
Лучше сходить на реальное интервью чем не сходить. Даже если интервью прошло плохо, стрессоустойчивость будет расти - каждый собес +1 к стрессоустойчивости. Также важно преодолеть боязнь идти на интервью, потому что в будущем это окупится и собачка справа станет накаченной
🔥20😁9❤5🍓1
Собес в QIC(катарская страховая компания)
Это было после офера в Плату - решил залететь ради интереса и опыта. Задача звучит просто - написать worker pool с приоритетом за 30 мин💀
Я смог написать семафор с ограничением кол-ва одновременно запущенных горутин, дальше начал рассказывать про сортировку и heap, но время закончилось (до этой задачи была задача на reverse строки)
В моей голове решение выглядит вот так
Возникают вопросы о целесообразности такой задачи - и о том, что именно хотят проверить. Как говорил Kanye West - I Guess We'll Never Know
Это было после офера в Плату - решил залететь ради интереса и опыта. Задача звучит просто - написать worker pool с приоритетом за 30 мин💀
Я смог написать семафор с ограничением кол-ва одновременно запущенных горутин, дальше начал рассказывать про сортировку и heap, но время закончилось (до этой задачи была задача на reverse строки)
В моей голове решение выглядит вот так
type Task struct {
ID int
Priority int
}
func processTasks(tasks []Task, workersCount int) {
semaphore := make(chan struct{}, workersCount)
wg := sync.WaitGroup{}
sort.Slice(tasks, func(i, j int) bool {
return tasks[i].Priority > tasks[j].Priority
})
for _, task := range tasks {
semaphore <- struct{}{}
wg.Add(1)
go func() {
defer func() {
<-semaphore
wg.Done()
}()
doWork(task)
}()
}
wg.Wait()
}
func doWork(task Task) {
fmt.Println(task.ID)
}
Возникают вопросы о целесообразности такой задачи - и о том, что именно хотят проверить. Как говорил Kanye West - I Guess We'll Never Know
P.S. Если среди подписчиков есть авторы каналов с опытом, пожалуйста, отпишитесь в комментах - задам пару вопросов про прокачку писательского навыка❤7🔥3👍1🍓1
Выглядит так что мне фортануло получить отказ от aws после прочтения этой статьи. Считаю нужно добавить 17-ым лидершип принципом work life balance, а то все customer, да customer
💯13🔥2❤1
Отключение AWS, из-за которого легла часть пользовательских сервисов - Snapchat, Fortnite, Duolingo, Signal, в Plata часть hr-сервисов тоже не работали, произошло из-за race condition в DynamoDB.
Коротко - два инстанса применяли DNS план, отправляя DNS записи в DNS Service(Route53).
Перед этим они проверяли версию плана, чтобы убедиться в применении только новой версии. Один инстанс сделал проверку и начал применять план, из-за задержки этот план успел устареть.
За это время второй инстанс применил новый план, обновил DNS Service и удалил старые версии, включая предыдущую. Когда первый инстанс закончил, он перезаписал новый план старым, уже удалённым, в итоге все ip адреса были удалены.
Далее всё каскадно упало из-за DynamoDB
Concurrency - база получается🗒
Ссылка на оригинал
Коротко - два инстанса применяли DNS план, отправляя DNS записи в DNS Service(Route53).
Перед этим они проверяли версию плана, чтобы убедиться в применении только новой версии. Один инстанс сделал проверку и начал применять план, из-за задержки этот план успел устареть.
За это время второй инстанс применил новый план, обновил DNS Service и удалил старые версии, включая предыдущую. Когда первый инстанс закончил, он перезаписал новый план старым, уже удалённым, в итоге все ip адреса были удалены.
Далее всё каскадно упало из-за DynamoDB
Concurrency - база получается
Ссылка на оригинал
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4👾2
Менти из этого поста получил офер в плату😬 . Хотел поделиться своей радостью, я видел как ему было тяжело и стрессово. В плате был его первый систем дизайн который он успешно прошел, хоть он и сам в этом сомневался. Теперь для него собачка справа станет чуть подкаченной 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤8🎉7