бегущий по собесам
980 subscribers
22 photos
2 videos
32 links
Download Telegram
Вы проголосовали за текущие собесы, а так как у нас демократия (хоть где-то) - расскажу что по собесам

Сейчас общаюсь с ~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 в постгрес и так далее
🔥641👍1😁1
Продолжаю гриндить собесы

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🔥64🌭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-сервис, который поллит БД: ищет подписки и пытается смэтчить с текущими ценами
Когда вместо этого можно консьюмить цены по криптовалютам -> подписки хранить в памяти консьюмера и там же мэтчить
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5🍓21
#leetcode
Апдейты по собесам - на следующей неделе, а пока камбэк в 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👍31🍓1
Во-первых спасибо что подписываетесь, всех обнял 👉
Во-вторых я начал делать посты в линкедин, коннектитесь если интересно

В третьих апдейты по собесам

1) Uzum - прошло хорошо, выбрали другого кандидата
2) InDrive - ответил на все вопросы, но по ощущениям занизили грейд до мидла. Процесс на этом я закончил
3) Criteo - ворвался чисто по фану. У них нет привязки к языку - два литкод-собеса, один систем дизайн
- Первый литкод собес - sliding window
- Второй как эта задача только с бизнесовым контекстом
- Третий систем дизайн - tinyUrl

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

Продолжаю дальше бежать по собесам, написали из plata и еще из пары аутсорсов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍64🍓2🌭1
Апдейты по собесам

1) Финал в Criteo. Общался с двумя русскоязычными продактами.
Проект - система реального аукциона для показа рекламы. Показывается реклама с большим bid_id. Нагрузка - 1k rps, бэк на Lua и движок на плюсах.
Сделали предоффер, в понедельник выложу сам оффер и цифры. Финал был чиловым, один из лидов заценил мои посты в LinkedIn

2) Plata. На следующей неделе систем дизайн. Готовлюсь. Хочу закрыть неделю двумя офферами

Как приму офер, выложу табличку со статистикой, веду ее с начала лета.

Недавно общался с эйчаршей. Рассказывала, что у них в компании очень умные разработчики, потому что у всех есть вышка💀. После, попросила рекомендацию с прошлого места работы, очень странно, переписку приложу в коммент. Это ред флаг или нет, что думаете?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥184👏2🍓1
Оффер от Criteo

Я пока живу в Ереване, поэтому сумма в драмах (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
Фидбэк положительный, завтра финал
🔥28👍114🍓2
Оффер в plata(принял)

По бабкам - 4850 евро гросс(ип армении), после релокации в Барсу - 5335 евро гросс, годовой бонус 1,5 оклада(скрины в комментах). Есть компенсация рело, дмс, курсов

Проект банкоматы, делается с нуля, команда только сформировалась
🔥43👍105👏3🎉1🤡1🍓1
Как и обещал моя стата по собесам (с начала лета)
Сперва думал, что дело только в конкуренции, но потом понял - я просто лоу-скилл.

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

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

Это не отменяет того что рынок действительно сложный, на собесах спрашивают всё подряд, готовиться приходится ко всему, важно и другое - отсеивать дерьмовые собесы и не париться о них
28🔥15🍓2
Спасибо за тёплые слова и поздравления - всех обнял 😘

Мой забег по собесам пока закончился. Иногда буду ходить, но уже на суммы от $10k+ (если такие вакансии вообще существуют 💸)

Сейчас пробую зачилиться как мой кот на картинке, но у меня шило в одном месте, поэтому хочется двигаться и чем-то заниматься. Начал решать дейлики на литкоде, также думаю взять подписку на csprimer и закрыть пробелы по "базе", плюс подтянуть матан через mathacademy
Please open Telegram to view this post
VIEW IN TELEGRAM
24🔥11👍1🤩1🍓1
Я тут весь в делах - с кайфом залетел в мини-стартап(парт-тайм). Постараюсь писать стабильно, чтобы не было больших пауз🤑

В прошлом посте забыл упомянуть полезный ресурс - codecrafters. Позволяет разобраться как работают бд, редис и другие штуки через реализацию с нуля, язык можно выбрать любой
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥113🍓2
Решил составить список моих личных ошибок на систем дизайне, делаю это исходя исключительно из своего опыта

1) Забывать возвращаться к функциональным требованиям. У меня такое часто было что я определил функ.требования -> сделал api и дальше забыл про них, хотя они могут натолкнуть, дать подсказку касательно метрик, ttl, sla и так далее. В общем главное держать это в голове, либо вообще выделить красным чтобы было на виду

2) Как только ворвался в сис диз - старался уделять большое внимание расчетам. Хотя глобально это штуку можно скипнуть, если сервис с большим кол-вом пользователей типа твиттера, ютуба, то очевидно что будет большая нагрузка. Для себя расчёты оставил только как инструмент, чтобы понять тип нагрузки - read/write, и уже от этого строить дизайн

Пишите в комменты свои ошибки(не только по сис дизу)
🔥84🍓1
У меня начались флэшбэки с собесов и задач которые мне давали, буду по-тихоньку их разбирать. На интервью по гошке часто просят реализовать кэш. Звучит несложно, hashmap + mutex/rwmutex

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😎. Реализуется через киллер-фичу гошки - каналы. Вкратце - создается еще одна мапа calls, ключ любой key и value - канал, через который другие горутины будут ждать результат. Первая горутина, которая успела захватить мьютекс, создаёт канал и кладёт его в calls. Все остальные, кто пришел с этим ключом, ждут значение через канал

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
🔥186🍓2
Собес в яндекс
Наверно после этого поста меня занесут в черный список яндекса, пу-пу-пу😧. Мое отношение к этой компании больше негативное чем позитивное, я считаю они требуют на собесе очень много и платят меньше рынка. Также я сталкивался с сильной нехваткой софт скиллов у интервьюеров.

С начала года яндекс изменили процесс интервью(не везде), теперь у них есть секция по коду, для 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😁42🤯1🍓1
Недавно готовил своего менти к интервью в Плату. Впервые увидел насколько стресс может отключать приобретенные знания. На моке та же задача была решена идеально, а на интервью нет. Под стрессом человек начинает сомневаться в себе, за что цепляется интервьюер. Какой вывод можно сделать - стрессоустойчивость это не менее важный навык.

Лучше сходить на реальное интервью чем не сходить. Даже если интервью прошло плохо, стрессоустойчивость будет расти - каждый собес +1 к стрессоустойчивости. Также важно преодолеть боязнь идти на интервью, потому что в будущем это окупится и собачка справа станет накаченной
🔥20😁95🍓1
Собес в QIC(катарская страховая компания)

Это было после офера в Плату - решил залететь ради интереса и опыта. Задача звучит просто - написать 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🔥21
Отключение AWS, из-за которого легла часть пользовательских сервисов - Snapchat, Fortnite, Duolingo, Signal, в Plata часть hr-сервисов тоже не работали, произошло из-за race condition в DynamoDB.

Коротко - два инстанса применяли DNS план, отправляя DNS записи в DNS Service(Route53).

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

За это время второй инстанс применил новый план, обновил DNS Service и удалил старые версии, включая предыдущую. Когда первый инстанс закончил, он перезаписал новый план старым, уже удалённым, в итоге все ip адреса были удалены.

Далее всё каскадно упало из-за DynamoDB

Concurrency - база получается 🗒

Ссылка на оригинал
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4👾2