Вопросы по бд🤑
Составил общие вопросы которые мне задавали
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. Тут всегда помогает литкод чтобы вспомнить как писать такие запросы
Составил общие вопросы которые мне задавали
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👍10❤5👏2🍓1
Вопросы по Кафке 🗒
1) Гарантии доставки(Самый популярный вопрос)
- Transactional inbox/outbox
- Auto commit vs ручной коммит
- Флаг идемпотентности
2) Устройство брокера
- Партиции, топики, оффсеты
3) Продьюсеры и консьюмеры
- Consumer group
- Consumer lag
- Ребалансировка
- Балансировка сообщений на стороне продьюсера
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 в прод😂
Всем советую вкладку 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). Сделаю отдельный пост про него
Некоторые задачи были специфичны - алгоритм вхождения прямоугольника в многоугольник, линейная алгебра.
Если есть желание, а главное время советую порешать, есть приватные лидерборды для подогрева интереса к задачам😓
Сначала решал на расте потом перешел на питон 🐍, слишком хорошо он подходит для быстрого написания алгоритмов. Удивляюсь машинам которые решили все без подсказок, я решил все кроме последнего дня с подсказками
Что нового я узнал
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👍6❤2🍓1
На этой неделе закончился испытательный срок в плату, проект банкоматы, фидбэк - положительный
Впечатления
По стэку стильно, модно, молодежно - свежая версия гошки, postgres, redis, mongo, кубер, aws. Из-за духа стартапа приходится доставать социальные навыки, чтобы выяснить как/что нужно сделать, если раньше этого не делали. Также происходит много дискуссий на архитектурных встречах, убеждать людей/себя не так просто.
По деньгам - зп я упоминал здесь, доки в Барсу почти все собрал. Из приятного - капнул годовой бонус, дается тем кто пришел до 1 октября, полтора оклада * на кол-во отработанных месяцев за год в процентах.
Понял что мне надоело писать код, сейчас вошел в стадиюкризиса 30 поиска себя⌛️
Впечатления
По стэку стильно, модно, молодежно - свежая версия гошки, postgres, redis, mongo, кубер, aws. Из-за духа стартапа приходится доставать социальные навыки, чтобы выяснить как/что нужно сделать, если раньше этого не делали. Также происходит много дискуссий на архитектурных встречах, убеждать людей/себя не так просто.
По деньгам - зп я упоминал здесь, доки в Барсу почти все собрал. Из приятного - капнул годовой бонус, дается тем кто пришел до 1 октября, полтора оклада * на кол-во отработанных месяцев за год в процентах.
Понял что мне надоело писать код, сейчас вошел в стадию
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍9❤8🍓1👾1
В adventofcode была задача на dsu. О нем я узнал решая литкод, по началу обходил его стороной, потому что почти все задачи на dsu решаются через dfs/bfs, но на некоторые задачи он хорошо ложится и, зная реализацию, задача решается за пару строк
Disjoint Set Union(DSU) - структура данных которая поддерживает разбиение элементов на непересекающиеся множества.
Под капотом dsu - массив и имеет следующие методы
DSU на 3 элемента
Возьмем для примера ребра - [[0,1],[0,2],[1,2]], вызовем union для каждого ребра
получим arr - [1, 2, 2]
Получилась связь 0 -> 1 -> 2, все точки принадлежат одному множеству, можно заметить что ребро [1,2] лишнее. В этой задаче как раз это нужно сделать
Реализация dsu которую я привел не оптимальна из-за рекурсии, есть union find быстрее - size и rank реализации
Забавный факт - я проводил интервью по алгоритмам еще в тиньке на студенческую стипендию где была задача на dsu, пришел олимпиадник и закрытыми глазами написал оптимальную реализацию через rank🤨
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
Сделал пост в линкедин о когнитивных искажениях мешающим разработчику на интервью и работе. Сюда выкладывать не стал, хочу продолжить делать посты про алгоритмы
👍13❤8🔥6❤🔥1🍓1
Каждый знает, слышал, переворачивал, вертел BST(Binary Search Tree).
Поиск и вставка работают несложно цикл - while True внутри которого двигаемся в нужном направлении
А удаление работает довольно хитровыебанно - задача уровня медиум на литкоде
Алгоритм
1) Нода - лист, её просто удаляем.
2) Ноды имеет одного потомка - заменяем ноду этим потомком.
3) Остается самый сложный вариант - нода это поддерево
Удаляем корень - 50
Ищем максимальную ноду в левом поддереве или минимальную ноду в правом поддереве
Получаем 40 и 55
Копируем значение этой ноды в удаляемую и избавляемся от дубликата через вызов этой же функции для удаления потомка
Может показаться, что здесь возникает бесконечная рекурсия, но при удалении дубликата она гарантированно завершится: выбранный потомок всегда будет либо листом, либо нодой с одним ребёнком - иначе его нельзя было бы использовать для замены удаляемой ноды
В комментарий приложу код
Поиск и вставка работают несложно цикл - while True внутри которого двигаемся в нужном направлении
А удаление работает довольно хитро
Алгоритм
1) Нода - лист, её просто удаляем.
2) Ноды имеет одного потомка - заменяем ноду этим потомком.
3) Остается самый сложный вариант - нода это поддерево
50
/ \
30 70
/ \ / \
20 40 60 80
/ \
55 65
\
57
Удаляем корень - 50
Ищем максимальную ноду в левом поддереве или минимальную ноду в правом поддереве
Получаем 40 и 55
Копируем значение этой ноды в удаляемую и избавляемся от дубликата через вызов этой же функции для удаления потомка
Может показаться, что здесь возникает бесконечная рекурсия, но при удалении дубликата она гарантированно завершится: выбранный потомок всегда будет либо листом, либо нодой с одним ребёнком - иначе его нельзя было бы использовать для замены удаляемой ноды
В комментарий приложу код
🔥13❤5🍓4
Все кто пытался решить task-scheduler или meeting-rooms два и три знают про бинарную кучу(binary heap), одну из реализаций priority queue. Рассмотрим ее свойства и реализуем min heap
1) Хип - полное бинарное дерево, все уровни должны быть заполнены слева направо, за исключением последнего
2) Поддерживаемый приоритет зависит от типа кучи, мин хип - родитель <= потомков, макс наоборот
Исходя из первого свойства по индексу элемента получаем его потомков и родителя
Для реализации стандартных операций push, pop, heapify нам нужны две дополнительные для просеивания мин элемента
• bubble_up(index) - двигаем мин элемент вверх
• bubble_down(index) - двигаем мин элемент вниз
Если вам на собесе нужно реализовать хип, во-первых почему вы до сих пор не ушли с этого собеса, во вторых чтобы не обрабатывать нулевый индекс, вставим ноль как dummy чтобы обработка чисел начиналась с 1 индекса
Используя функции выше реализуем push, pop, heapify
С heapify довольно хитро, деля пополам мы отсекаем последний уровень и дальше восстанавливаем min_heap снизу вверх, просеивая большие элементы вниз. Засчет пропуска листьев heapify работает за O(n), несмотря O(log n) от self.bubble_down в худшем случае, так как просеивание будет применяться на нодах с маленькой высотой
Мем по хипу в комментах
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🔥7❤5🍓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 пункт
Поделитесь также в комментах, как и где вы потребляете технологический контент💻
В заголовке caching есть оптимизация singleflight - гошную реализацию которой я объяснял здесь - 2 пункт
Поделитесь также в комментах, как и где вы потребляете технологический контент
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤6👍5🍓1
Алго-интервью в эпоху AI
Посмотрел видео ниткода про интервью в бигтехи в 2026 году.
- Anthropic. Их CEO говорит о полной замене программистов нейронками, на интервью в компанию спрашивают алгоритмы.
- Open AI. Тоже самое, скрин вопроса это подтвердил.
- Подготовка. Кандидаты, получившие офферы в эти компании, все так же готовятся по базе Neetcode и благодарят за cтруктурированный контент.
- Meta и AI-assisted interview. DSA-интервью, где AI опционален, даже если попросить ai написать код, нужно доказать что он оптимален, корректен и сделать dry run, reddit - пост в об этом.
Посмотрел видео ниткода про интервью в бигтехи в 2026 году.
- Anthropic. Их CEO говорит о полной замене программистов нейронками, на интервью в компанию спрашивают алгоритмы.
- Open AI. Тоже самое, скрин вопроса это подтвердил.
- Подготовка. Кандидаты, получившие офферы в эти компании, все так же готовятся по базе Neetcode и благодарят за cтруктурированный контент.
- Meta и AI-assisted interview. DSA-интервью, где AI опционален, даже если попросить ai написать код, нужно доказать что он оптимален, корректен и сделать dry run, reddit - пост в об этом.
👍16🔥7❤5🍓1
X(Twitter) выложили на гитхаб рекомендательный алгоритм формирования ленты пользователя. Вкратце - сервис Thunder отдает посты подписок, фильтрует и объединяет с Phoenix - ML система рекомендаций. На выходе - ранжированный Top K
Пара интересных технических нюансов:
1) Thunder - Ingestion pipeline.
Внутри работают два консьюмера. Первый берет сырые данные - TweetEventData - скелет поста, превращает в LightPost и перекладывает в топик второму консьюмеру
- Обработка данных. Убираем self.retweet, разделяем оригинальные твиты и реплаи через is_reply, is_retweet
- Хранение. Второй консьюмер складывает данные в PostStore - структура на базе потокобезопасных мап
- Отказоустойчивость. В проекте нет персистентного хранилища и второй консьюмер не коммитит офсеты. Если он упал, сервису не поставится readness проба, пока все сообщения не прочитаются
2) Фильтрация просмотренного.
В сервисе Home Mixer применяются доп фильтры в том числе - Bloom filter чтобы отсеить просмотренные твиты.
Пара интересных технических нюансов:
1) Thunder - Ingestion pipeline.
Внутри работают два консьюмера. Первый берет сырые данные - TweetEventData - скелет поста, превращает в LightPost и перекладывает в топик второму консьюмеру
- Обработка данных. Убираем self.retweet, разделяем оригинальные твиты и реплаи через is_reply, is_retweet
- Хранение. Второй консьюмер складывает данные в PostStore - структура на базе потокобезопасных мап
- Отказоустойчивость. В проекте нет персистентного хранилища и второй консьюмер не коммитит офсеты. Если он упал, сервису не поставится readness проба, пока все сообщения не прочитаются
2) Фильтрация просмотренного.
В сервисе Home Mixer применяются доп фильтры в том числе - Bloom filter чтобы отсеить просмотренные твиты.
🔥21👍9🍓3
Говорят у ии проблемы с матаном, поэтому пока нас не заменили - врываемся в смежные области
https://www.youtube.com/watch?v=ARxtLv7kgEk
https://www.youtube.com/watch?v=ARxtLv7kgEk
YouTube
как выучить математику с 0 бесплатно | Влад Тен
❤🔥17😁12❤7👎3🔥3🤮1💩1
В плате провожу интервью по гошке - много вакансий прилетело, и рекрутеры попросили помощи.
Попался кандидат который списывает с AI😐 .
То чувство когда шел на интервью с нормальными пацанами, чтобы поспрашивать про B-tree и LSM-tree, а кандидат отводит взгляд на другой экран и копирует текст💀 .
Пообщаюсь об изменении процесса. В текущее время собесы по языку должны сильно измениться или вообще исчезнуть. Ну а литкод и систем дизайн - база as always
Попался кандидат который списывает с AI
То чувство когда шел на интервью с нормальными пацанами, чтобы поспрашивать про B-tree и LSM-tree, а кандидат отводит взгляд на другой экран и копирует текст
Пообщаюсь об изменении процесса. В текущее время собесы по языку должны сильно измениться или вообще исчезнуть. Ну а литкод и систем дизайн - база as always
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16❤8🔥8👎1🤮1🤡1🍓1
Skip List
В рамках реализации Redis CodeCrafters есть глава sorted set, который применяется в дизайне рейтинговых систем(Leaderboards). Sorted set как и некоторые LSM-tree: Cassandra, LevelDB, RocksDB используют под капотом skip list.
Давайте решим design skip list на литкоде. Имейджин твое лицо когда на собесе дали эту задачу😂
Из интересного, skip list вероятностная(probabilistic) структура данных. Я постарался дать небольшое введение для удобного переключения на скрины
Структура skip list - уровни, каждый уровень - отсортированный связный список.
Node - содержит val и массив nexts, через nexts[i] мы выбираем уровень, len(nexts) говорит о высоте текущей Node.
Килер-фича skip list - поиск, вставка, удаление за log(n), все потому что высота ноды выбирается случайно через
Search
Вкратце алгоритм - пока следующий элемент меньше
Insert
Используется доп массив update для сохранения потенциальных ссылок после которых добавится новое значение. Функция -
Erase
С массивом update работаем как и в insert. Уточнение - дубликаты в skip list могут быть и выглядеть как несколько башен, здесь мы решаем удалить самую первую -
В рамках реализации Redis CodeCrafters есть глава sorted set, который применяется в дизайне рейтинговых систем(Leaderboards). Sorted set как и некоторые LSM-tree: Cassandra, LevelDB, RocksDB используют под капотом skip list.
Давайте решим design skip list на литкоде. Имейджин твое лицо когда на собесе дали эту задачу
Из интересного, skip list вероятностная(probabilistic) структура данных. Я постарался дать небольшое введение для удобного переключения на скрины
Структура skip list - уровни, каждый уровень - отсортированный связный список.
Node - содержит val и массив nexts, через nexts[i] мы выбираем уровень, len(nexts) говорит о высоте текущей Node.
Килер-фича skip list - поиск, вставка, удаление за log(n), все потому что высота ноды выбирается случайно через
probability(обычно это 0.5)Search
Вкратце алгоритм - пока следующий элемент меньше
target двигаемся вправо, если значения равны элемент найден. Иначе спускаемся внизInsert
Используется доп массив update для сохранения потенциальных ссылок после которых добавится новое значение. Функция -
get_random_level вычисляет уровень по который мы добавим новый элемент. Описание функции не влезло на скрин поэтому вставлю сюда
def get_random_level(self) -> int:
level = 1
while random.random() < self.probability and level < self.max_level:
level += 1
return level
Erase
С массивом update работаем как и в insert. Уточнение - дубликаты в skip list могут быть и выглядеть как несколько башен, здесь мы решаем удалить самую первую -
candidate = update[0].nexts[0]Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24❤4❤🔥3💩2🤡2👎1🍓1