бегущий по собесам
980 subscribers
22 photos
2 videos
32 links
Download Telegram
Собес в яндекс
Наверно после этого поста меня занесут в черный список яндекса, пу-пу-пу😧. Мое отношение к этой компании больше негативное чем позитивное, я считаю они требуют на собесе очень много и платят меньше рынка. Также я сталкивался с сильной нехваткой софт скиллов у интервьюеров.

С начала года яндекс изменили процесс интервью(не везде), теперь у них есть секция по коду, для 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
Менти из этого поста получил офер в плату😬. Хотел поделиться своей радостью, я видел как ему было тяжело и стрессово. В плате был его первый систем дизайн который он успешно прошел, хоть он и сам в этом сомневался. Теперь для него собачка справа станет чуть подкаченной 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥188🎉7
Перекат с Java на Go

При переходе в WB +1.5x к зарплате, спустя полгода оффер на 6500 usdt в беттинг компанию(не принял), а сейчас работаю в Plata, делаю бэк для банкоматов.

Как выглядел мой переход
1) Около трёх месяцев привыкания к языку
2) Изучение популярных вопросов по Go и подготовка к ним. Язык сейчас довольно популярный, поэтому мок интервью легко найти на ютубе
3) Выход на рынок, прохождение интервью

Большая часть собесов в этой статистике была по Go

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

Сейчас изучаю Rust - купил подписку на Codecrafters и пишу свой мини-Redis🗒, буду делиться апдейтами
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥15🍓4🤬1
Из мини-стартапа меня уволили, везде лейоффы🤣. На самом деле мирно разошлись - было набрано много людей плюс залетел большой конкурент на рынок.

По написанию redis на rust(codecrafters), закончил первый stage - чтение и обработка запросов. Идет хорошо, хоть и местами тяжело. В комменты скину ссылки для вкатывания, велком кому интересно.

Есть идея сделать пост по вопросам бд и кафки на собесах, но есть ощущение что это никому не нужно. Ставь 👍 если интересно
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥73😁3🍓1
Вопросы по бд🤑
Составил общие вопросы которые мне задавали

1) Индексы
- Кластеризованные vs некластеризованные (за всю жизнь спросили 1 раз)
- B-Tree vs B+ Tree. Почему B-Tree лучше, чем hash
- Плюсы/минусы индексов
- Составные, покрывающие, частичные индексы
- Селективность индекса
- В чем подвох Create index concurrently?
- Explain vs explain analyze

2) Уровни изоляции
- Какие бывают, чем отличаются, как работают(mvcc)

3) Локи
- Оптимистик/пессимистик и как их реализовать

4) Sql vs NoSql (вопрос больше на кругозор)
- Строковые vs колоночные
- Реляционная модель vs документо-ориентированная

5) Скейлинг бд
- Партиционирование, шардинг, репликации

6) Задача на написание join + group by и having. Тут всегда помогает литкод чтобы вспомнить как писать такие запросы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍105👏2🍓1
Вопросы по Кафке 🗒

1) Гарантии доставки(Самый популярный вопрос)
- Transactional inbox/outbox
- Auto commit vs ручной коммит
- Флаг идемпотентности

2) Устройство брокера
- Партиции, топики, оффсеты

3) Продьюсеры и консьюмеры
- Consumer group
- Consumer lag
- Ребалансировка
- Балансировка сообщений на стороне продьюсера
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥7🍓3
Камбэкую по-тихоньку в алгосы, обмазался подписками на литкод и ниткод.
Всем советую вкладку core skills у ниткода, если хочется написать базовые структуры с нуля, также есть задачи сортировки и популярные алгоритмы - dfs,bfs, Dijkstra и т.д


P.S по фану решаю adventofcode на расте, главное не лить unwrap в прод 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥5😁1🍓1
Завершился adventofcode
Сначала решал на расте потом перешел на питон 🐍, слишком хорошо он подходит для быстрого написания алгоритмов. Удивляюсь машинам которые решили все без подсказок, я решил все кроме последнего дня с подсказками

Что нового я узнал

1. Чтобы узнать о наличии повторяющегося шаблона в строке, например s = abab, нужно проверить содержится ли эта строка в (s+s) без первого и последнего символов

2. Самая интересная задача на граф - DAG, сначала нужно найти кол-во путей от start до end. Далее усложнение - найти кол-во путей которые еще содержат точки А и E
start -> A -> E -> B -> end (1)
start -> A -> E -> D -> end (1)
start -> C -> F -> G -> end
start -> C -> F -> B -> end

В примере таких путей 2
Разбиваем задачу на поиск кол-ва путей start -> A, A -> E, E -> end и после перемножим эти результаты. Остается понять порядок точек А и E через топологическую сортировку. Код

3. Была задача на DSU(Disjoint Set Union или Union Find). Сделаю отдельный пост про него

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

Если есть желание, а главное время советую порешать, есть приватные лидерборды для подогрева интереса к задачам 😓
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍62🍓1
На этой неделе закончился испытательный срок в плату, проект банкоматы, фидбэк - положительный

Впечатления

По стэку стильно, модно, молодежно - свежая версия гошки, postgres, redis, mongo, кубер, aws. Из-за духа стартапа приходится доставать социальные навыки, чтобы выяснить как/что нужно сделать, если раньше этого не делали. Также происходит много дискуссий на архитектурных встречах, убеждать людей/себя не так просто.

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

Понял что мне надоело писать код, сейчас вошел в стадию кризиса 30 поиска себя⌛️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍98🍓1👾1
В adventofcode была задача на dsu. О нем я узнал решая литкод, по началу обходил его стороной, потому что почти все задачи на dsu решаются через dfs/bfs, но на некоторые задачи он хорошо ложится и, зная реализацию, задача решается за пару строк

Disjoint Set Union(DSU) - структура данных которая поддерживает разбиение элементов на непересекающиеся множества.

Под капотом dsu - массив и имеет следующие методы

DSU на 3 элемента

arr - [0, 1, 2] # изначально каждый элемент - корень своего множества.

# Поиск родителя элемента
def find(x):
if self.arr[x] == x:
return self.arr[x]

return self.find(self.arr[x])

# Объединение элементов и их родителей в одно множество
def union(x, y):
real_x = self.find(x)
real_y = self.find(y)

self.arr[real_x] = real_y

# Принадлежность элементов к одному и тому же множеству
def is_same(x, y):
return self.find(x) == self.find(y)

Возьмем для примера ребра - [[0,1],[0,2],[1,2]], вызовем union для каждого ребра
получим arr - [1, 2, 2]

Получилась связь 0 -> 1 -> 2, все точки принадлежат одному множеству, можно заметить что ребро [1,2] лишнее. В этой задаче как раз это нужно сделать

Реализация dsu которую я привел не оптимальна из-за рекурсии, есть union find быстрее - size и rank реализации

Забавный факт - я проводил интервью по алгоритмам еще в тиньке на студенческую стипендию где была задача на dsu, пришел олимпиадник и закрытыми глазами написал оптимальную реализацию через rank🤨
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥8💅5👍1🍓1
Поздравляю всех с Новым Годом⛄️⛄️⛄️. Желаю легких алго/систем дизайн собесов, жирных оферов, меньше стресса, больше радости

Спасибо за поддержку и подписку 💗💗💗
Please open Telegram to view this post
VIEW IN TELEGRAM
32🎉9🎄5❤‍🔥3
Сделал пост в линкедин о когнитивных искажениях мешающим разработчику на интервью и работе. Сюда выкладывать не стал, хочу продолжить делать посты про алгоритмы
👍138🔥6❤‍🔥1🍓1
Каждый знает, слышал, переворачивал, вертел BST(Binary Search Tree).
Поиск и вставка работают несложно цикл - while True внутри которого двигаемся в нужном направлении

А удаление работает довольно хитровыебанно - задача уровня медиум на литкоде

Алгоритм
1) Нода - лист, её просто удаляем.
2) Ноды имеет одного потомка - заменяем ноду этим потомком.
3) Остается самый сложный вариант - нода это поддерево


50
/ \
30 70
/ \ / \
20 40 60 80
/ \
55 65
\
57

Удаляем корень - 50

Ищем максимальную ноду в левом поддереве или минимальную ноду в правом поддереве

Получаем 40 и 55

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

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

В комментарий приложу код
🔥135🍓4
Все кто пытался решить task-scheduler или meeting-rooms два и три знают про бинарную кучу(binary heap), одну из реализаций priority queue. Рассмотрим ее свойства и реализуем min heap

1) Хип - полное бинарное дерево, все уровни должны быть заполнены слева направо, за исключением последнего
2) Поддерживаемый приоритет зависит от типа кучи, мин хип - родитель <= потомков, макс наоборот

Исходя из первого свойства по индексу элемента получаем его потомков и родителя

left_child = 2 * i
right_child = 2 * i + 1
parent = i // 2

Для реализации стандартных операций push, pop, heapify нам нужны две дополнительные для просеивания мин элемента

• bubble_up(index) - двигаем мин элемент вверх
• bubble_down(index) - двигаем мин элемент вниз

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


def __init__(self):
self.heap = [0] # для индексации с 1

# пока родитель больше ребенка меняем местами для восстановления min_heap
def bubble_up(self, index:int):
while index > 1:
parent_index = index // 2
if self.heap[parent_index] > self.heap[index]:
self.heap[parent_index], self.heap[index] = self.heap[index], self.heap[parent_index]
index = parent_index
else:
return

# меняем родителя с наименьшим ребенком при условии parent > min(left_child, right_child)
def bubble_down(self, index:int):
while index * 2 < len(self.heap):
child_idx = 2 * index

if child_idx + 1 < len(self.heap) and self.heap[child_idx] > self.heap[child_idx + 1]:
child_idx += 1

if self.heap[child_idx] >= self.heap[index]:
break

self.heap[child_idx], self.heap[index] = self.heap[index], self.heap[child_idx]
index = child_idx


Используя функции выше реализуем push, pop, heapify

def push(self, val: int) -> None:
self.heap.append(val)
self.bubble_up(len(self.heap) - 1)

# ставим на место рута последний элемент, мы не можем на место рута поставить min(left,right), появляется gap нарушающий 1 свойство хипа
def pop(self) -> int:
min_val = self.heap[1]
self.heap[1] = self.heap.pop()

self.bubble_down(1) #
return min_val

def heapify(self, nums):
self.heap = [0] + nums
n = len(self.heap)
for i in range((n - 2) // 2, -1, -1):
self.bubble_down(i)


С heapify довольно хитро, деля пополам мы отсекаем последний уровень и дальше восстанавливаем min_heap снизу вверх, просеивая большие элементы вниз. Засчет пропуска листьев heapify работает за O(n), несмотря O(log n) от self.bubble_down в худшем случае, так как просеивание будет применяться на нодах с маленькой высотой

Мем по хипу в комментах
👍12🔥75🍓2
Всем спасибо за подписку👉. Здесь стараюсь писать вкусно и интересно о разных вещах. Сейчас изучаю rust через написание редиса на codecrafters, также скоро буду, надеюсь, переезжать в Барселону, после пробоваться в бигтехи для опыта и контента😐
Please open Telegram to view this post
VIEW IN TELEGRAM
29🔥9🍓5👍2🤩1
Советую интересную статью, если не видели - https://openai.com/index/scaling-postgresql. Разрабы openai рассказывают про челленджи и способы их решения при масштабировании постгреса

В заголовке caching есть оптимизация singleflight - гошную реализацию которой я объяснял здесь - 2 пункт

Поделитесь также в комментах, как и где вы потребляете технологический контент💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥136👍5🍓1