Amazon Leadership Principles

Плейлист, в котором высшее руководство Amazon рассказывает про Leadership Principles. На них базируется не только вся работа внутри компании, но и поведенческое собеседование в Amazon. Их нужно знать и подготовить примеры из своей карьеры, где вы их проявили:
https://www.youtube.com/playlist?list=PL9JNmYfQa0bgT_eJKk2uflwtiBIpbImdB

Также видео, где о них в разных интервью рассказывает Jeff Bezos: https://www.youtube.com/watch?v=B-xdfQv3I1k
👍4
Вопрос с собеседования программиста: в чем плюсы и минусы использования индексов в базе данных?

Если очень коротко отвечать на этот вопрос в режиме блица на собеседовании, то:

Плюсы:

1) Поиск строк в базе ускорится в некоторых случаях. Если у вас есть индекс на колонке таблицы и вы делаете SELECT с точным значением, которые вы хотите найти или с диапазоном значений, то такой запрос будет работать быстрее. Особенно если значение уникальное или очень редкое. Если же у вас у всех строк в этой колонке одинаковое значение, то ускорения работы можно не ожидать. Ускорение поиска может также отразится не только на ускорении некоторых SELECT запросов, но и DELETE и UPDATE, если в них есть фильтры на проиндексированные колонки. Т.к. прежде, чем изменить строку, ее надо сначала найти.
2) SELECT с ORDER BY и GROUP BY в некоторых случаях будет работать быстрее .
3) Поддержание уникальных значений в колонке. Если вы хотите, чтобы в какой-то колонке было уникальное значение, то unique index для этого подойдет идеально. Например, это может быть необходимо для primary key (в этом случае для него автоматически будет создан unique index).

Минусы:
1) Для non-clustered индексов потребуется больше места на диске для хранения индекса. Кроме самой таблицы нам нужно также хранить еще и индекс. Про разницу clustered и non-clustered индексов можно тут посмотреть: Difference between Clustered and Non-clustered index
2) INSERT, UPDATE, DELETE будут работать медленнее для проиндексированных колонок, т.к. кроме изменения самой таблицы нужно изменить и индекс.
3) При использовании clustered индексов UPDATE будет работать медленно, если вы делаете UPDATE проиндексированного поля. Т.к. для этого нужно строку удалить и заинсертить в новое место. Но на практике это встречается редко. Т.к. они в основном используются для primary ключей, которые не меняются.
👍6
Online сервисы для практики по SQL

SQL я начал изучать в 2006 и тогда мне порекомендовали ресурс: https://www.sql-ex.ru/ Тогда он помог мне освоить азы SQL и помог найти мою первую работу программистом, т.к. часть вопросов была по SQL. С удивлением я узнал, что этот сервис все еще работает 17 лет спустя. Поэтому хочу его порекомендовать тем, кто начинает изучать SQL и хочет получить немного практики написания запросов.

Кроме sql-ex есть еще много англоязычных платформ для практики SQL:

1) HackerRank: https://www.hackerrank.com/domains/sql
2) LeetCode: https://leetcode.com/problemset/database/

3) https://www.stratascratch.com/
4) https://sqlpad.io/
5) https://datalemur.com/sql-interview-questions
6) https://sqlzoo.net/wiki/SQL_Tutorial
7) https://mode.com/sql-tutorial/

Если вы знаете еще другие платформы для практики по SQL пишите в комментариях.
👍152🔥2
Какой подход в самообразовании я использую?

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

Когда ты работаешь, у тебя не остается много времени и сил, чтобы что-то еще изучать. Поэтому, чтобы это делать, во-первых, нужна сильная мотивация и способ, который позволит закрепить это как привычку. Одной из возможных мотиваций могут служить деньги. Но когда, ты уже программист и зарабатываешь условные 2-4 тысячи долларов в месяц, мотивация деньгами уже работает хуже. Иногда работает мотивация попасть в определенную компанию, особенно, если это не просто и более того, у вас с первого раза это не получилось. Как преодоление преграды, самолюбие, эго. Или же вам искренне хочется в чем-то разобраться, что-то изучить, потому что вам это интересно из любопытства. Или ради повышения из условного Junior до Senior. Каждый может найти то, что его мотивирует.
Но одной мотивации не достаточно. Для достижения цели, нужно регулярно что-то делать. Для этого я разбиваю изучение на очень маленькие кусочки, каждый из которых у меня будет вызывать чувство того, что я что-то сделал, чего-то достиг. Иначе учить что-то в течении нескольких лет, чтобы через несколько лет увидеть результат очень сложно психологически. Поэтому, например, я могу стараться решить или разобраться с одной задачкой на leetcode в день. Когда ты сабмитишь решение и оно проходит все тесты, это создает положительную обратную связь в мозге, и хочется это повторить снова. Или если я читаю книгу, я могу запланировать прочитать скажем главу или подглаву, и потом пересказать ее словами самому себе или выписать это на бумаге, или рассказать другу или коллеге. Это помогает и лучше усвоить, запомнить материал, и дает чувство, что ты что-то знаешь. Если просто читаешь книгу, это может быть очень скучно и после прочтения без повторения ты забудешь 99% прочитанного. Когда я активно что-то изучаю параллельно с работой, то я выделяю 1-3 часа в день каждый будний день за самообразование. Например, 1 час утром до работы, если есть такая возможность, когда ты еще не уставший, или вечером после работы могу, например, решить одну задачу. И на выходных прочитать и пересказать пару глав из книги.

Пишите, как вы занимаетесь самообразованием.
🔥25👍6
Задача с собеседования: Первая плохая версия

Может использоваться на собеседовании в FAANG как разогревочная.

Задача. Есть некий программный продукт. У него есть версии от 1, 2, ...n.
Известно, что начиная с некой версии все последующие версии плохие. Например, если у нас версии 1, 2, 3, 4, ...10, и начиная с версии 6 все версии плохие. Т.е. версии 6, 7, 8, 9, 10 - плохие. Также у нас есть функция boolean isBadVersion(int version), которая возвращает версия плохая или нет.
Нужно написать функцию, которая вернет первую плохую версию. Нужно минимизировать число вызовов функции isBadVersion.

Решение
. Первое решение, которое приходит в голову - линейный поиск. Пройтись циклом по всем версиям , начиная с первой, и вызвать функцию isBadVersion. Как только она вернет true - мы нашли нашу первую плохую версию. Такое решение работает за O(n).
Код решения:
public int firstBadVersion(int n) {
for (int version = 1; version <= n; version++) {
if (isBadVersion(version)) {
return version;
}
}
return -1;
}
Можно ли улучшить это решение? - Да. Можно применить бинарный поиск.
Вначале инициализируем левый указатель 1, а правый n. Найдем среднюю версию. Проверим, является ли она плохой. Если она плохая, то первая плохая версия или эта версия или она слева. Если она хорошая, то первая плохая точно справа. Если версия плохая, то надо или правый указатель двигать влево или мы нашли нашу первую плохую версию. Как отличить эти два случая? Можно проверить еще одну версию слева на единицу меньше. Если она хорошая, то мы нашли нашу первую плохую версию. Если она тоже плохая, то решение слева и нужно двигать правый указатель влево. Также тут может быть еще один edge-case - все версии плохие. Поэтому прежде чем проверять еще одну версию слева, проверим, что наша текущая версия это первая версия. Если она первая и плохая - то мы нашли ответ. Если мы не нашли еще первую плохую версию, то двигаем левый и правый указатель, сокращая тем самым область поиска в два раза. И проделываем тоже самое еще раз. Решение будет работать быстрее предыдущего - за O(log(n)).
Код решения:
public int firstBadVersion(int n) {
int left = 1;
int right = n;
while (left <= right) {
int mid = left + (right - left) / 2;
boolean isBad = isBadVersion(mid);
if (isBad && (mid == 1 || !isBadVersion(mid - 1))) {
return mid;
}
if (isBad) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
👍9
Используете ли вы сложные алгоритмы на работе?

Типичный код, который пишет backend разработчик на Java, это:
1) boiler plate код связанный с каким-то фреймворком или библиотекой. Например, код для создания REST, RPC или какого-либо еще сервиса. Код для взаимодействия с базой, кэшом, очередью или потоком. Всяческие конфигурационные файлы и код.
2) Тривиальная бизнес логика. Это, обычно, прочитать из базы, кэша, потока, очереди или взять пришедший реквест, как-то его преобразовать (отфильтровать, трансформировать и т.д.) и положить снова в базу, очередь, поток или отправить назад реквест.

Обычно, для 1) знания каких-то алгоритмов и структур данных не требуется. Да и вообще, запоминать как это делается особого смысла нет. Все технологии и тулы быстро меняются и все эти вещи быстро гуглятся. Надо уметь гуглить и копипастить. А с появлением LLM, это вообще можно автоматизировать.
Для 2) уже нужны какие-то базовые знания структур данных и алгоритмов. Вам, скорее всего придется работать со списками, массивами, хэш-таблицами, писать циклы и if-else. Очень редко, что-то сложнее этого.

Но во многие компании спрашивают знания алгоритмов и структур данных (не только в FAANG, но и компании поменьше). Это, в основном, связано с тем, что им надо каким-то стандартным образом отсеять много кандидатов. И данные исследований показывают, что люди, которые прошли такое собеседование, показывают более хорошие результаты на работе.

Но иногда все же нужно не только теоретическое знание этих алгоритмов, но и их приходится применять на работе. Чаще это делают разработчики, которые разрабатывают инфраструктуру. Это те базовые блоки и кирпичики, которые уже могут использовать backend разработчики. Это разработчики, которые разрабатывают базы данных, языки программирования, виртуальные машины, лоад балансеры, библиотеки, фреймворки, распределенные сервисы типа Elastic Search, Kafka, Cassandra и т.д.
Но иногда это приходится делать и backend разработчикам.

Лично мне приходилось писать алгоритмы для работы в графами и деревьями в FAANG. Это и поиск циклов в графе и обход дерева кода (AST Tree) с его модификацией. Несколько раз, в разных компаниях писал топологическую сортировку. Часто нужна, когда у вас есть граф зависимостей чего-либо. Также в одной компании я разрабатывал алгоритм под CUDA, который мог делать очень быстрые манипуляции с разреженными матрицами и использовал алгоритмы параллельной сортировки на тысячах ядер видеокарты. При этом я ни разу не использовал сложное динамическое программирование на работе, только на собеседованиях.
Приходилось ли вам писать или использовать сложные алгоритмы на работе на практике?
👍84🔥2
Подборка вопросов и ответов для подготовки к собеседованию на Java программиста
#java #interview #собеседование

Обновление подборки.

Подборку составил из постов, которые я уже публиковал ранее в этом канале. Часть опубликована на medium (возможно потребуется vpn).

Общие вопросы:
1) Методы класса Object
2) Иерархия и типы исключений
3) GC
4) Сравнение строк в Java

Коллекции:
5) HashMap
6) ArrayList vs LinkedList
7) Иерархия коллекций в Java
8) Иерархия Map
9) Maximum ArraySize

Многопоточность:
10) Перевод между банковскими аккаунтами (dead-lock).
11) Ping-Pong (wait-notify).
12) Приостанавливаемый поток.
13) Подборка вопросов по многопоточности
14) Напечатать последовательность чисел при помощи нескольких потоков на Java.
15) ConcurrentModificationException
16) Thread Safe Singleton
17) Обедающие философы
18) Реализовать потокобезопасную блокирующую очередь на Java ограниченного размера
19) Реализовать потокобезопасный неблокирующий стек на Java
20) Daemon потоки
21) Является ли immutable class в Java Thread safe?
22) Implicit Lock Reentrancy

SQL:
23) Типы SQL joins
24) Плюсы и минусы индексов
👍114
Подборка алгоритмических задач с решениями и описание алгоритмов уже опубликованных в этом канале
#interview #собеседование #алгоритмы #подборка

Обновление подборки. Часть опубликована на medium (возможно потребуется vpn).

Two Pointers:
1) Проверка на палиндром.
2) Усложненная версия проверки на палиндром.
3) Merge Two Sorted Arrays
4) Самая длинная палиндромная подстрока
5) Удалить дубликаты в отсортированном массиве
HashTable:
6) Two Sum
Stack:
7) Проверить скобочное выражение.
LinkedList:
8) Удалить n-й элемент с конца в односвязном списке
9) Deep Copy списка со ссылкой на случайный элемент.
BinarySearch:
Описание алгоритма BinarySearch.
10) Пропущенный элемент в отсортированном массиве.
11) Пиковый элемент.
12) Число итераций в бинарном поиске.
13) Первая плохая версия
DFS:
Описание алгоритма DFS.
14) Flood Fill.
BFS:
Описание алгоритма BFS.
15) Проверить полноту дерева.
16) Обход дерева по уровням.
Binary Tree:
Алгоритмы обхода двоичного дерева
17) Invert Binary Tree
18) BranchSums
19) Максимальная высота дерева
21) Максимальная сумма пути в бинарном дереве
22) Сумма элементов бинарного дерева поиска в диапазоне значение
Dynamic Programming:
Основные этапы решения задач на динамическое программирование Top-Down методом
23) Top Down подход на примере задачи про ступеньки
24) Задача на динамическое программирование. Разделение на слова.
25) Количество дождевой воды
26) Bottom-up подход: разменять деньги
👍95
Задача на system design: Задизайнить мессенджер по типу Telegram или WhatsApp.
#systemdesign
Задача. Задизайнить мессенджер по типу Telegram или WhatsApp.
Решение. Описал тут: Дизайн мессенджера Telegram
👍91👏1
Что такое CDN?
#systemdesign

Хорошая и короткая статья на сайте AWS о том, что такое CDN(content delivery network): Content Delivery Network

Эта технология незаменима для быстрого доступа, например, к медиа контенту. Картинкам, видео и аудио. Такие сервисы как Netflix, youtube, instagram опираются на CDN для быстрого доступа к медиа контенту.
👍6
Обработка ошибок при вызове другой компоненты
#systemdesign

Допустим у вас есть две компоненты, и одна компонента вызывает другую. Например, у вас есть сервис Users Service (сервис пользователей) и он вызывает сервис Orders Service (сервис заказов) для получения списка заказов для конкретного пользователя. Или ваша компонента читает/пишет сообщения из очереди типа AWS SQS или Rabbit MQ, или вы читаете/пишите из стрима типа Kafka или AWS Kinesis. Если вторая компонента не отвечает или бросает ошибки, то нужно соответствующим образом реагировать на такие ситуации.

Какие могут возникнуть проблемы?
1) Не удается установить соединение. Проблемы сети или компонента лежит.
2) Соединение удалось установить, но вызываемая компонента не возвращает никакого результата длительное время.
3) Соединение удалось установить, но вызываемая компонента возвращает ошибку.
4) Соединение удалось установить, но в процессе выполнения операции соединение прервалось.
5) Установление соединения занимает очень длительный период времени, но не возвращается ошибка о том, что сервер не доступен, т.к. сервер постоянно занят.
6) Сервер доступен, но он бросает ошибку по типу Throttling Exception, если для компоненты настроен Throttling (например, максимальное число вызовов в единицу времени или максимальное число соединений и т.д.)

Как можно реагировать в подобных случаях для достижения low latency, fault tolerance, resilience и availability?

Описал тут: https://telegra.ph/Obrabotka-oshibok-pri-vyzove-drugoj-komponenty-10-24

Все эти подходы широко используются во многих компаниях, особенно, в FAANG. Почти каждый вызов другой компоненты обернут во все эти подходы.
👍7
Global Talent Visa UK

Если вы программист и хотите переехать в UK для работы и жизни, то в большинстве случаев вам вначале нужно найти работодателя, который может предоставить вам визу. Тип этой визы будет Skilled Worker Visa. Она позволяет вам прожить в UK 5 лет, через 5 лет получить ILR (вид на жительство). Прожить еще один год по ILR и получить гражданство UK.
Минус такой визы в том, что вы привязаны к работодателю. Если вы захотите сменить работодателя, вам нужно найти другого работодателя, кто может быть спонсором такой визы. Далеко не все работодатели в UK могут предоставить такое спонсорство. Более того, если вас уволят (например, в результате сокращений (layoffs)), у вас будет 60 дней, чтобы найти новую работу. Иначе вам нужно выехать из страны. Вы также не можете заниматься бизнесом или консультированием имея эту визу или жить в UK не работая.

Но в UK есть другой тип визы: Global Talent Visa. Она позволяет приехать и жить в UK не имея работодателя. Вы можете работать, заниматься бизнесом и консалтингом в UK. При этом вы не привязаны к работодателю. Она также сокращает время для получения ILR c 5 до 3 лет. Через 3 года жизни в UK вы можете получить вид на жительство и еще через 2 - гражданство.

Вначале я переехал в UK по Skilled Worker Visa. Но после я подался и получил Global Talent. Для Global Talent нужно подготовить много документов, но это стоит того. Основные документы: отзывы от высокоуровневых менеджеров (уровни CEO, CTO, VP, Director) с ваших прошлых мест работы о ваших достижениях в этих компаниях, какие-то подтверждения этого + подтверждения ваших контрибьюшенов вне работы в Digital Sector. В качестве таких контрибьюшенов можно предоставим ваши выступления на IT конференциях, публикации на известных IT форумах, видео на youtube с вашими выступлениями на IT темы, контрибьюшены в open source и т.д. Если у вас это все есть, то я сильно рекомендую вам получить именно такую визу.
Если вы скажем можете получить отзывы от работодателей, но контрибьюшенов вне работы у вас нет, то вы можете воспользоваться услугами сторонних компаний, которые помогут вам это организовать. Например, есть компания https://www.immigram.io/ У них есть связи с разными площадками, которые помогут вам где-то выступить, где-то написать статью и т.д. И в целом подготовить пакет документов для Global Talent Visa.
🔥6👍2
Число вакансий в tech индустрии медленно, но растет

В соответствии с https://www.trueup.io/job-trend число вакансий достигло дна в марте 2023 года и начало медленно расти.

У нас в компании тоже появилось много новых вакансий и я снова начал проводить 1-2 собеседования в неделю. Тоже касается других FAANG и не FAANG компаний.
🔥8👍3
Googleyness interview

В Google поведенческое собеседование называется Googleyness interview. Оно частично похоже по поведенческое собеседование в Amazon, где нужно привести примеры из карьеры, где вы демонстрировали те или иные Amazon Leadership Principles. В Google принципы частично пересекаются, но есть различия. Вот хороший канал, где hr из Google рассказывает про это собеседование, что такое Googleyness и как к нему подготовиться. Пригодится и для подготовки к поведенческому собеседованию в другие компании https://youtu.be/TWFs3dxfiOc?si=ctE_Zx5FI5Dv53pM
👍8🔥21
Задача с собеседования: сгруппировать анаграммы

Завел youtube канал, записал видео разбора задачи с leetcode. Т.к. это мое первое видео, качество может храмать: https://youtu.be/QvhS-8qScvo?si=LJxEHy1tRrceavo5

Пишите свой фидбек на видео в комментариях.
👍11🔥5
Где я был предыдущие пару недель

Учил историю, культуру и государственное устройство UK. Это было нужно для сдачи экзамена Live in UK Test. Я его наконец вчера сдал и теперь знаю всех жен Генриха 8, их порядок, его детей и причины развода. Этот экзамен нужно сдавать всем, кто хочет получить ILR (ВНЖ) в Великобритании. ВНЖ в UK можно получить после 5 лет жизни в UK или после 3 лет, если вы обладатель Global Talent визы (мой случай).
🔥16😁6👍2👎2👏1
Случай на собеседовании в FAANG

Компания, в которой я работаю, возобновила активный набор сотрудников, после практически годовой паузы. Я снова сейчас активно собеседую кандидатов.
Собеседования все также проходят online, как и в ковид. Я недавно собеседовал кандидата, на позицию E6 (Staff Software Engineer, с зп от $ 500 000 в USA). И мне кажется, что я первый раз серьезно заподозрил кандидата в читерстве. Во-первых, он периодически переводил глаза, во время написания кода. Но это еще ничего не значит, т.к. я не вижу его сетап рабочего стола и не могу точно сказать, куда он смотрел. А во-вторых, Он ничего не уточнял в условии задачи. А обычно, задачи формулируются так, чтобы там была какая-то неопределенность в формулировке, чтобы посмотреть как кандидат коммуницирует и работает с неопределенностью (ambiguity). Он же вообще мало говорил, ничего не уточнял. Словно зависал на время и потом словно ниоткуда писал оптимальное решение, но не обязательно на те условия задачи, которые я имел ввиду. При этом не поясняя решение до того, как его написать и обсудить его, проанализировать плюсы и минусы решения. А просто его писал, периодически поглядывая в другой экран. А потом с трудом пытался его объяснить.
Кандидат, конечно же, был зареджекчен. Но не потому, что читерил. Доказательств этого у меня нет. А по communication. На алгоритмическом собеседовании основное это не "решил или не решил" задачу. На нем кандидат оценивается по 4 осям: communication, problem solving, coding, testing. А задача используется как способ получить сигналы от кандидата по этим осям. Если вы ничего не объясняете, не уточняете, не реагируете на вопросы и подсказки, но при этом вывалили откуда-то правильный код, то вы не пройдете ни по одной из осей.
👍183😁2🤔2💘21
Задача с собеседования в Google: Слияние интервалов

Записал разбор еще одной задачи с собеседовая: https://www.youtube.com/watch?v=b7UuqAIrpgM

Ссылка на leetcode: https://leetcode.com/problems/merge-intervals/
👍7🔥1
Incident management в Amazon

В любых софтверных сервисах и продуктах случаются outages, полные или частичные. Когда сервис падает и становится недоступным или часть функционала перестает работать.
Как в Amazon реагируют на такие ситуации, как обнаруживают, что делают во время инцидента и после него?
В Amazon все разработчики без исключения участвуют в так называемом oncall. Т.е. по очереди дежурят в поддержке работы сервисов, которые они разрабатывают. Обычно это длится одну неделю раз в в 1.5 - 2 месяца. В течении этого времени они реагируют на тикеты и таски связанные с саппортом продукта и участвуют в их митигации (именно митигации, а не починке root cause). Все сервисы производят огромное число метрик, на которые созданы alarms, которые в случае проблем автоматически создают таски. Например, это может быть AWS Cloudwatch. Тикеты и таски имеют свой severity. Самые важные автоматически приходят на рабочий телефон и очень громко звенят(paging). В том числе это может произойти ночью. В таком случае нужно принять этот paging в течении короткого промежутка времени и надо начать смотреть тикет. Если это не сделать, то такой alarm начнет будить вашего менеджера, потом менеджера его менеджера. Вплоть до CEO если это очень серьезный инцидент и никто не реагирует.
Далее oncall смотрит тикет и принимает шаги по митигации (stop the bleeding, не починки). Например, делает rollback до последней стабильной версии, восстановление из backup, перезагрузку кластера и тому подобное.
При этом активно комментирует все свои действия в тикеты, т.к. часто это может повлиять на другие компоненты и сервисы, которые активно пишут, что они тоже заафекчены. Иногда перебои в Amazon приводят к outage в других продуктах. Например, однажды outage в AWS S3 привел к недоступности видео в Netflix. Иногда происходит мониторинг медиа типа twitter, на предмет жалоб на outage. Как только инцидент был замитигирован(stop bleeding) начинается формирование документа COE ревью, который призван помочь в предотвращении таких инцидентов в будущем. Одна из особенностей как митигации так и COE ревью - no blame culture. Т.е. не заниматься поиском виноватых людей, а поиском дыр в системе, процессах, которые позволили этому случиться. Про COE ревью детально напишу в следующих постах.
👍193
Будут ли вам интересны видосы для начинающих по Java? Условно с полного нуля.
Final Results
46%
Да
54%
Нет