Мои первые впечатления, когда я начал работать в Европе

Впервые в Европе я побывал 13 лет назад в качестве туриста. И как у многих, у меня во время отпуска возникла мысль, что было бы прикольно тут пожить и поработать. Но сильных причин переезжать у меня не было, более того, были причины остаться. В последующие несколько лет я много раз был в Европе в качестве туриста. Более того, меня несколько раз отправляли в командировки по работе в разные Европейские страны. Была даже ситуация, когда я жил целый месяц и работал в офисе клиента. Через 3 года у меня жестких причин оставаться не стало и вскоре я случайно попал на собеседование в Google, которое я завалил, т.к. не знал как к нему готовится (история про тот случай: https://t.me/faangmaster/6). С тех пор я начал изучать тему про собеседования в FAANG и загорелся желанием поработать в Европе (США я тогда исключил, т.к. хотел быстро, дешево и часто летать в Россию). И уже через год я получил offer в компанию в Германии (не FAANG) и решил попробовать. Далее кратко опишу впечатления в первые недели и месяцы работы в компании в Германии.
1) Общая эйфория и ощущение приключения. Первые несколько недель - несколько месяцев возникает чувство какого-то приключения, все кажется новым и интересным. Новая страна, новая компания, новые люди, новые проекты, новый язык. Чувство, что начал новую жизнь с нуля. Бытовые трудности есть, но вначале они сглаживаются чувством эйфории, а кажутся скорее квестом, чем какими-то трудностями.
2) Много английского. В первую неделю у нас был onboarding, на котором мы скорее развлекались, чем работали. При этом приходилось общаться с людьми со всего мира на английском почти непрерывно 8 часов в день. В обычной жизни программиста мы общаемся очень мало, даже на русском. В основном пялимся в экран. Но эта компания придумала очень интерактивный онбординг с большим количеством общения. Из-за этого у меня каждый вечер болела голова и даже сны снились яркие и на английском языке.
3) Сложности с поиском квартиры. В Германии очень непросто найти квартиру, особенно, хорошую квартиру. На хорошие варианты там целый конкурс со стороны потенциальный съемщиков. Все это сочеталось с остальными проблемами, которые нужно было решать параллельно с работой в новой компании в новой стране. Это добавляло стресса и напряжения.
4) Немецкий язык и бытовые проблемы. На работе мы общались на английском, но за пределами работы большая часть населения говорит только на немецком. А по приезду в страну нужно было регистрироваться в разных гос органах (Bürgerbüro, Finanzamt), открывать счет в банке, подключать интернет, искать квартиру, заключать договор и т.д. Очень часто в этих организация или не говорят, или не все говорят на английском. Более того порядок действий другой, часто устаревший и неудобный. Он может в себя включать взаимодействие через почту или телефон, а не через интернет. Я помню одноразовые коды для банковских переводов напечатанных на бумажке и пополнение счета телефона на кассе в магазине через специальный чек-ваучер. И время ожидания исполнения услуг ждать приходится долго. Но сочетание с эйфорией это несколько сглаживает негативное впечатление, но все в целом добавляет общего напряжения.
5) Стресс из-за испытательного срока. Кроме ментального перегруза от всего нового, нужно еще и работать. Более того, вы только начинаете работать и находитесь под наблюдением - на испытательном сроке, который длится 6 месяцев. Поэтому нужно работать и проявлять себя с лучшей стороны и более ярко по сравнению с тем, когда ты уже проработал несколько лет в компании, чтобы хорошо себя зарекомендовать.
6) Выходцев из постсоветского пространства достаточно много. Я очень быстро познакомился с достаточным числом коллег, с которыми мы общались на русском. И через некоторое время работа в плане языка уже не сильно стала отличаться от работы в России в международной компании. На митингах с коллегами - общаешься на английском, но это только часть твоего рабочего времени. Остальное время пялишься в экран или разговариваешь на русском на кухне со знакомыми.
🔥61
7) Сама работа мало чем отличалась от работы в России в международной компании. Только коллеги со всего мира, и больше общения на английском. Но программисты далеко не 100% своего времени проводят в общении с коллегами. Поэтому какого-то космического уровня владения не требуется. Более того, для большинства иностранцев английский тоже не родной и какого-то неудобства ошибки или акцент не вызывают.
8) Очень много общения с иностранными коллегами на тему того, как что устроено в разных странах. Каждый рассказывает как то или иное устроено в их странах, своеобразный культурный обмен. Про еду, про то, как будет то или иное слово на их родных языках(особенно мат😀), про бытовые и бюрократические вещи. Выходцы из постсоветского пространства часто рассказывают как в Германии все неудобно в плане сервиса и услуг и как у них в стране можно все сделать одной кнопкой в приложении.
9) В квартире холодно. Если вы привыкли, чтобы в квартире было 25 градусов, то в Германии типичная температура в квартире это 19-21 градус. Более того, тут ты сам регулируешь батареи и чем большую мощность ты на них выставишь, тем больше придется платить за коммуналку. Этот момент доставлял больше всего дискомфорта и приходилось к этому долго привыкать.
10) Летом, в солнечные дни, в квартире жарко. Кондиционеров в квартирах практически не бывает. Из-за этого, если у вас неудачно выходят окна квартиры - она будет сильно прогреваться и в квартире будет жара, особенно, когда вы уже перестроились и привыкли к 21 градусу в квартире. То 28-30 будет невыносимым испытанием.
11) Сортировка мусора, бутылки. В Германии очень сложная сортировка мусора. Нужно держать много разных мусорных пакетов. Более того, нужно сдавать бутылки обратно в магазин в специальный автомат, который выдаст обратно чек, которым можно заплатить в магазине. Даже есть специальные контейнеры для одежды и обуви.
12) Другая еда, но во многих магазинах есть русский отдел. Приходилось привыкать к другим продуктам, нет гречки, привычной молочки и многих других продуктов. Но благо, во многих магазинах есть русский отдел с русскими или польскими продуктами.
13) Доходы/расходы не особо изменились по сравнению с Москвой. На тот момент это было так (8 лет назад). Сейчас может быть по другому. Я что в Москве получал ~3-3.5 тысячи евро на руки в месяц, что после переезда в Германию получал столько же. Сейчас цифры другие скорее всего. И расходы примерно того же порядка. Что-то дороже, что-то дешевле. Но примерно, в сумме примерно столько же расходов. Сейчас, возможно, ситуация другая.
14) Меньше стресса от мегаполиса. Я жил в не очень большом городе, на работу ходил пешком или на велосипеде. После Москвы город казался очень небольшим и спокойным. При этом даже средние и малые города имеют всю необходимую инфраструктуру. В России, если ты не Москве или Питере, то это вообще другая страна с другими стандартами жизни, а уж про города с населением меньше миллиона и говорить нечего. В Германии вся инфраструктура есть и в маленьких городах и даже деревнях. Хорошие дороги, транспорт, больницы, вокзалы, парки, магазины, рестораны, развлечения, торговые центры, икея, школы и даже международный аэропорт. Красивая архитектура, чистые улицы и т.д. Т.е. ты получаешь стандарты жизни как в Москве или лучше, но в городе с населением в 20 раз меньше.
👍30🔥2
Как быстро адаптироваться в команде и компании?

Я работал в 5 компаниях в 4 разных странах. Онбордился сам и был ментором при онбординге много раз. Первые несколько месяцев в компании очень важны, т.к. вы на испытательном сроке и это время, когда о вас сложится первое впечатление. Я всегда успешно проходил испытательные сроки и никогда не было с этим проблем. Более того на всех перфоманс ревью я получал оценки выше среднего. Я напишу несколько постов на эту тему. Сейчас кратко дам некоторые советы, что делать и чего не делать при онбординге на личном опыте.

Что делать:
1) Сразу познакомьтесь со всеми коллегами и ключевыми сотрудниками, которые могут влиять на вашу работу. Я сразу стараюсь узнать у менеджера team/org map, т.е. какие сотрудники важны для моей работы и чем они занимаются. И сразу назначаю с каждым из них по отдельности встречи на 30 минут (1:1). На таких 1:1 я стараюсь познакомиться с человеком, узнать чем он занимается сейчас и чем занимался раньше, сам рассказываю про себя, про какие-то интересные компетенции, которые у меня есть. Это помогает преодолеть первый барьер и узнать по каким вопросам можно обращаться к человеку и чем будете полезны вы. На встречах нужно быть дружелюбным и открытым. Но не переходить к личным вещам и сразу лезть к человеку, это может отталкивать. Нужно оставаться профессионалом и просто показать себя как хорошего коллегу.
2) Делайте первые задачи, которые вам дают с полной и даже большей отдачей. В первые недели и месяцы вам будут давать (в идеале) задачи, которые помогут вам быстрее адаптироваться к работе в команде. Лучше, если это какие-то типичные задачи на разные части code base, чтобы вы быстрее освоились с кодом и стилем работы. Старайтесь их делать быстрее и лучше, чем вы обычно это делаете. Особенно, в сочетании с тем что вы новичек и от вас мало что ожидают, а вы делаете это быстро и хорошо, это создаст очень хорошее первое впечатление, которое будет длится очень долго и его испортить будет очень сложно.
3) Чтобы быстрее освоится с кодом и произвести хорошее впечатление - пишите документацию. Когда работаете над онбординг задачами, изучайте код, рисуйте диаграммы, пишите документы, если таких документаций еще нет. Это поможет вам, это поможет другим людям в будущем, кто будет онбордится. Обычно документация всегда неактуальна или отсутствует, т.к. ее рассматривают как второстепенную задачу, если вы при своей работе напишите такую документацию, особенно, если вас об этом никто не просил, это произведет хорошее впечатление и поможет вам быстрее освоится с кодом.
4) Изучайте код за свое время. Т.к. вы не знакомы с кодом, то существенная часть времени при работе над задачей уйдет на изучение кода, который другие коллеги уже знают. Обычно, они это время не учитывают, когда оценивают примерное время, которое они бы ожидали, нужно для выполнения задачи. Поэтому по возможности потратьте доп. время на самостоятельное изучение кода, чтобы компенсировать это отставание и начать деливерить как опытные коллеги как можно раньше.
5) Задавайте много вопросов. В первое время это ожидается и чем больше вопросов вы для себя проясните в начале, тем легче вам будет в дальнейшем. Но задавайте вопросы не ради того, чтобы просто задать вопрос, а чтобы прояснить что-то для себя и дополнить вашу картину и сложить пазл в голове. Это также сделает ваши вопросы со временем интересными и глубокими. Но не бойтесь, что в начале ваши вопросы тривиальные или глупые. Со временем они станут глубже, с улучшением вашего понимания. Это также произведет впечатление, как быстро и глубоко вы разобрались в проблеме или проекте.
👍203
6) Узнавайте много всего у ваших коллег напрямую. Обычно у вас 3 источника информации: коллеги, документация и код. Документация, обычно, или отсутствует или неактуальна. Код изучать долго. Поэтому если вы на чем-то застряли и не смогли за пару часов ответить на какой-то свой вопрос читая документацию или код - спросите у коллеги. Это позволит вам быстро разблокировать себя. Но потратьте какое-то время на попытку самостоятельно ответить на этот вопрос. Это позволит глубже погрузится в проблему и спрашивать более конкретные и глубокие вопросы. Тут нужно держать баланс. Если вы будете абсолютно все спрашивать, даже то, на что вам уже отвечали или что вы можете выяснить сами за 5 минут или пару часов, то это скорее начнет производить плохое впечатление.
7) Участвуйте в code review. Это позволит узнать над чем и как работают ваши коллеги, задать уточняющие вопросы, понять стиль кода, тестов и работы ваших коллег. Если вы опытный разработчик, то привнести что-то новое практически с первых дней работы.

Далее опишу, чего делать не стоит при онбординге, как организовать эффективный онбординг в компании, как это делается в разных компаниях, в том числе в FAANG и т.д.
👍33
Что не стоит делать при онбординге в новую компанию?

В предыдущих постах я уже писал, что делать стоит: https://t.me/faangmaster/281, https://t.me/faangmaster/282

Я онбордил много людей, в том числе в FAANG. Также видел много случаев за 17 лет работы, когда сотрудники не проходили испытательный срок.
Вот основные ошибки:
1) Люди застревают подолгу и не просят помощи. Это очень частая ошибка, особенно, среди более опытных программистов. В предыдущей компании, они могли сами быстро что-то раскопать и сделать задачу, проект. Когда они приходят в новую компанию, еще ничего не знают про компанию, проект, code base и т.д. На испытательном сроке им дают не очень сложные задачи, с точки зрения коллег, кто уже долго работают в компании, и подолгу застревают на задаче и не просят помощи. А задачи, которые вы делаете на испытательном сроке создадут о вас первое впечатление и оно в таком случае будет негативным. Поэтому, если вы на чем-то застряли и не смогли сами найти ответ за пару часов - спросите своих коллег, это поможет вам быстро разблокироваться и сделать задачу.
2) Наоборот спрашивают все и даже самые элементарные вещи. Это больше характерно для начинающих программистов. Для них ожидаемо, что они еще не имеют никакого опыта и им нужен больший сапорт со стороны коллег. Но все же предполагается, что вы обучаемый, быстро схватываете и уже имеете представление о программировании и языке программирования, на котором пишите. Если на что-то вам уже отвечали, старайтесь это запомнить, а лучше записать. Чтобы не спрашивать одно и тоже каждый день. Если вы что-то можете загуглить сами за пару часов, найти в коде или документации, то попробуйте сначала это сделать сами. А потом уже спрашивать. Но не застревайте надолго. Потратьте на это 1-2 часа, если не получилось разобраться самим - спросите.
3) Отрицание всего, что и как делается в компании или команде. При переходе в другую компанию, вам, с большой вероятностью, покажется много, что делается в другой компании, непривычным. И первая реакция у вас будет негативной. Вы начнете все и всех критиковать, что может привести к конфликтам или напряженным отношениям. Лучше, если у вас возникает такая реакция - попытаться выяснить причины этого. Обычно, на то есть какие-то практические, исторические или иные причины. Или вы узнаете для себя что-то новое и поймете, что раньше вы делали хуже. Т.е. не сразу начинать с неприятия и критики, а с попытки узнать больше. Если же после этого вы все равно считаете что-то неправильным, то можете переходить к конструктивной критике. Но на практике я рекомендую подождать с этим до конца испытательного срока. На нем просто попытайтесь понять, почему что-то сделано так и не иначе и адаптироваться к новым условиям.
4) Конфликты со всеми, особенно, с менеджером. Переход в новую компанию, это всегда стрессовая ситуация. А т.к. все непривычно, то первая реакция - отрицание. Не стоит на этом эмоциональном фоне создавать конфликты, особенно, с теми, от кого зависит ваше успешное или нет прохождение испытательного срока. Если вам действительно не нравится работа в компании, вы можете просто уволиться.
5) Не соответствие уровню. Ожидания и возможность соответствовать этим ожиданиям может и часто отличается между компаниями. Если вы были Senior в одной компании, не всегда это транслируется в Senior в другой. Возможно, вам будет сложнее или легче этому уровню соответствовать в другой компании. Предотвратить не соответствие уровню должно собеседование. Но собеседования не идеальны и имеют погрешность. Иногда это приводит к тому, что человек просто не имеет еще должных навыков, чтобы соответствовать ожиданиям этого уровня в компании. А чтобы эти навыки получить времени испытательного срока не достаточно, поэтому часто это приводит к увольнениям. Поэтому старайтесь говорить правду на собеседовании про свой опыт или хотя бы не выдумывайте опыт, который сильно выше вашего уровня. Это увеличит шансы на правильное определение вашего текущего уровня и облегчит вам жизнь.
👍224👌1💘1
Подборка вопросов и ответов для подготовки к собеседованию на Java программиста
#java #interview #собеседование

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

Общие вопросы:
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
23) Java Memory Model и happens-before
24) ConcurrentHashMap vs Collections.synchronizedMap vs Hashtable vs HashMap

SQL:
25) Типы SQL joins
26) Плюсы и минусы индексов
👍22🔥32❤‍🔥1
FAANG Master
Задача на динамическое программирование: Longest Increase Subsequence Записал разбор задачи на динамическое программирование: Longest Increasing Subsequence. Задача. Дан массив целых чисел. Нужно найти длину самой длинной строго возрастающей подпоследовательности.…
Подборка алгоритмических задач с решениями и описание алгоритмов уже опубликованных в этом канале
#interview #собеседование #алгоритмы #подборка

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

Общие статьи:
1) Как выбрать язык программирования для алгоритмического собеседования?
2) Как решать алгоритмические задачи на подготовке, чтобы это было эффективно
3) Как не забыть решения задач и алгоритмы
4) Шпаргалка по основным алгоритмам для алгоритмического собеседования
5) Шпаргалка по Java для алгоритмического собеседования
6) Подборка из easy задач для начала подготовки к алгоритмическому собеседованию.
7) Сбалансированная подборка из 100 задач для подготовки к алгоритмическому собеседованию.

Two Pointers:
1) Проверка на палиндром.
2) Усложненная версия проверки на палиндром.
3) Merge Two Sorted Arrays
4) Самая длинная палиндромная подстрока
5) Удалить дубликаты в отсортированном массиве
6) Видео: Merge Intervals
HashTable:
7) Two Sum
8) Видео: Сгруппировать анаграммы
Stack:
9) Проверить скобочное выражение.
10) Удалить минимальное число скобок, чтобы сделать скобочное выражение правильным
Sorting:
11) Первый пропущенный положительный элемент массива
LinkedList:
12) Удалить n-й элемент с конца в односвязном списке
13) Deep Copy списка со ссылкой на случайный элемент.
BinarySearch:
Описание алгоритма BinarySearch.
14) Пропущенный элемент в отсортированном массиве.
15) Пиковый элемент.
16) Число итераций в бинарном поиске.
17) Первая плохая версия
DFS:
Описание алгоритма DFS.
18) Flood Fill.
19) Видео: Число Островов
BFS:
Описание алгоритма BFS.
20) Проверить полноту дерева.
21) Обход дерева по уровням.
22) Remove Invalid Parentheses
Топологическая сортировка:
Топологическая сортировка
23) Видео: Top k elements
Binary Tree:
Алгоритмы обхода двоичного дерева
24) Invert Binary Tree
25) BranchSums
26) Максимальная высота дерева
27) Максимальная сумма пути в бинарном дереве
28) Сумма элементов бинарного дерева поиска в диапазоне значение
Dynamic Programming:
Основные этапы решения задач на динамическое программирование Top-Down методом
29) Top Down подход на примере задачи про ступеньки
30) Задача на динамическое программирование. Разделение на слова.
31) Количество дождевой воды
32) Bottom-up подход: разменять деньги
33) Видео: Longest Increasing Subsequence
👍27🔥42👎1
Как устроен onboarding процесс в Amazon?

В продолжении темы про испытательный срок и onboarding в компаниях.
Ранее я писал про рекомендации того, что делать стоит(https://t.me/faangmaster/281, https://t.me/faangmaster/282) во время испытательного срока и чего делать не стоит (https://t.me/faangmaster/284).

Сейчас расскажу, как устроен процесс onboarding в Amazon. Этот процесс в компании отлажен и многие вещи я считаю правильными и их можно переиспользовать в других компаниях. В Facebook процесс, частично, похож, но имеет отличия, о которых я расскажу отдельно.

1) Каждому новичку назначается onboarding buddy. Это ваш коллега из команды, обладающий значительным опытом работы в компании и, в частности, в вашей команде. Обычно он находится на том же уровне, что и вы. Его задача — помогать вам в период онбординга, отвечать на все ваши вопросы или направлять вас к нужному человеку, который сможет вам помочь. Кроме того, в течение испытательного срока он будет регулярно предоставлять менеджеру отзывы о вашем прогрессе. Это один из ключевых людей, от чьего мнения зависит ваше успешное прохождение испытательного срока.
2) Вам выдадут onboarding plan, в котором будут расписаны все тренинги, которые вам нужно пройти, все действия, которые вам нужно совершить с детальным расписанием. Вам нужно следовать этому плану. На первые дни и недели этот план очень подробный. Там указан детальный план того, что вам нужно делать по дням и неделям.
3) Первые пару недель выделяется на прохождения огромного числа тренингов. Тренинги, в основном, на культуру компании (так или иначе связанных с Leadership Principles, т.к. это очень важно для работы в Amazon), на различные внутренние тулы, т.к. вы больше таких тулов нигде не увидете. Вам нужно их изучать с нуля. Тренинги как online за компьютером, так и offline, с реальным лектором. Нам даже пришлось на несколько дней лететь в другой офис для прохождения части тренингов.
3) В первые пару недель вам нужно засетапить регулярный 1:1 с вашим менеджером, onboarding buddy, а также поговорить со всеми ключевыми сотрудниками и коллегами, с которыми вам нужно будет взаимодействовать. Это позволит с ними познакомиться, узнать кто чем занимается и рассказать о себе. Я в первую же неделю поговорил с 10 разными людьми, и даже с VP нашего орга.
4) В рамках тренингов вы засетапите ваш dev environment, чтобы подготовить все к началу процесса разработки. Сделаете тестовый code change, чтобы пощупать на практике все тулы по изменению кода, написанию тестов, созданию code review и деплоя в продакшен.
5) Когда вы пройдете большую часть общих тренингов для всей компании, вы начнете больше узнавать про работу вашей команды. Тут все зависит от вашей команды и onboarding buddy. В нашей команде мы организовали серию митингов, где коллеги рассказывали про разные части продукта, который наша команда разрабатывала, какие есть компоненты, за что они отвечают и как работают. Очень много всего связанного с бизнес логикой работы, очень много новой терминологии и т.д.
6) Параллельно с изучением того, что делает команда, вы начнете деливерить код для команды. Обычно, это начинается с простых задач, где вам надо поменять одну строчку в коде. Чтобы просто освоиться с новыми тулами. Далее чуть более сложные, где вам надо уже немного подумать над кодом и поменять больше, чем пару строчек. И постепенно, вам начнут давать уже типичные задачи на разные части code base, чтобы вы начали ориентироваться в разных частях того, что у вас есть в команде.
7) После 1-2 месяцев в команде вам дадут уже более сложную задачу, которая будет соответствовать вашему уровню. Вам скорее всего нужно будет провести какой-то research, поговорить с множеством людей, написать дизайн док, пройти его ревью и заимплементить его. Это очень важный этап, т.к. от него будет зависеть, пройдете ли вы испытательный срок или нет и какое о вас сложится первое впечатление.
👍21
8) Также после 1-2 месяцев вас начнут готовить постепенно к oncall. Вначале вы будете shadow, т.е. просто смотреть, что делает уже опытный сотрудник, будучи oncall и учиться. Далее вы будете oncall и вам будет помогать другой опытный сотрудник (reverse shadow). И через некоторое время вы станете самостоятельным в этом смысле и будете по расписанию осуществлять саппорт компонент, которые овнит ваша команда. Это тоже важный этап. Если у вас с этим возникнут проблемы, то могут возникнуть проблемы с прохождением испытательного срока.
9) После 3 месяцев вы уже пройдете все тренинги, станете oncall, разберетесь в основах того, что делает ваша команда, научитесь писать код, ревьюить код, писать и ревьюить дизайн доки. И скорее всего начнете уже работу над более или менее адекватным проектом, соответствующему вашему уровню.
10) После 6 месяцев (столько длится испытательный срок в европейских офисах) ваш менеджер, на основе фидбеков от вашего onboarding buddy и других коллег, а также успешности прохождения всех этапов onboarding примет решение, прошли вы испытательный срок или нет.

Пишите в комментариях, как это устроено у вас. Что из перечисленного вы считаете полезным, что нет. Что вы бы добавили.
👍26🤯2
😁51
Простая задача на динамическое программирование: Лучшее время для покупки и продажи акции

Задача. Дан массив целых чисел prices, где prices[i] - цена на акцию в день i. Вам нужно максимизировать прибыль выбрав один день, когда вы купите одну акцию, а также другой день в будущем, когда вы продадите акцию. В качестве результата нужно вернуть максимальную прибыль, которую можно получить. Если прибыль получить нельзя, то вернуть 0.
Ссылка на leetcode: https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/
Пример:
prices = [7,1,5,3,6,4]
Ответ: 5 (Купить по 1, продать по 6).
Решение.
Решение описал тут: Простая задача на динамическое программирование: Лучшее время для покупки и продажи акции
Код решения:
public int maxProfit(int[] prices) {
int maxProfit = Integer.MIN_VALUE;
int minPriceSoFar = Integer.MAX_VALUE;
for (int i = 0; i < prices.length; i++) {
minPriceSoFar = Math.min(minPriceSoFar, prices[i]);
int currentProfit = prices[i] - minPriceSoFar;
maxProfit = Math.max(maxProfit, currentProfit);
}
return maxProfit;
}

Работает за O(n) по времени и O(1) по памяти.
👍183
Варианты подготовки к собеседованию в FAANG/около FAANG для разных уровней текущей подготовки

Вы решили пройти собеседование в FAANG (Facebook, Apple, Amazon, Netflix, Google), около FAANG компанию (Microsoft, Twitter, Uber, Lyft) или топовый хэдж фонд типа Two Sigma, Jane Street, Citadel.
Как организовать подготовку, что читать, что решать, какие курсы пройти, сколько это все займет времени?
Ответы на эти вопросы зависят от вашего текущего уровня подготовки. Я приведу примеры того, как это можно организовать для разных уровней подготовки.

Advanced уровень. Вы уже работаете в FAANG и хотите попасть в другую компанию (из Amazon или Microsoft в Google или Facebook, например), или, скажем, в Яндексе и уже умеете решать на хорошем уровне алгоритмические задачи. Или вы не работаете в этих компаниях, но вы топовый олимпиадник по программированию (не просто участвовали, но были в призах/победителях крупных соревнований).


1) В таком случае идем на Leetcode, отфильтровуем задачи по компании, в которую вы хотите попасть (скажем Google или Facebook), сортируем по частоте встречаемости и решаем первые 50-100 задач. При вашем уровне подготовки это займет 20-100 часов подготовки. Посмотрите также мои рекомендации: Почему решив 1500 задач на leetcode вы не сможете получить офер в FAANG, Как решать алгоритмические задачи на подготовке, чтобы это было эффективно
2) Аплаитесь, проходите phone screen.
3) Если проходите phone screen, то начинаете подготовку к System Design. Для этого проходим курс: Grokking the System Design Interview на Design Gurus или более расширенный Grokking Modern System Design Interview for Engineers & Managers. Для более эффективной подготовки расскажите каждую главу, тему самому себе/напишите на бумажке/расскажите кому-то еще. Это займет еще ~30-50 часов.
4) Освежите еще раз самые популярные задачи, которые встречаются на собеседовании в эту компанию. Можете также в разделе Discuss на Leetcode мониторить какие вопросы спрашивали вот прям только что в том офисе, в который вы будете собеседоваться. Это займет еще ~30 часов.
5) Подготовтесь к поведенческому собеседованию. Приготовьте примеры из опыта, где вы демонстрировали те или иные качества. Если это Amazon, то это примеры по Leadership Principles(https://t.me/faangmaster/191, https://t.me/faangmaster/145, https://t.me/faangmaster/211). Примеры, как вы резолвили конфликты, challenging проекты. Сложные технически и сложные организационно проекты. Важно, чтобы примеры конфликтов и челенджей соотвествовали вашему уровню. Это займет ~10 часов.

Смотрите также основные ошибки на собеседовании в FAANG:
https://t.me/faangmaster/226
https://t.me/faangmaster/227

В сумме это займет: Подготовка к phone screen 20-100 часов. Подготовка к full loop: ~70-90 часов. Итого ~100-200 часов. В зависимости от того, готовились ли вы ранее к такому собеседованию и как давно это было. Ну и от того, насколько легко это вам дается.

Если эта тема интересна, то напишу, как это делать для всех уровней текущей подготовки, в том числе с полного нуля.
👍42🔥12🤔31
Варианты подготовки к собеседованию в FAANG/около FAANG для разных уровней текущей подготовки. Часть 2.

Предыдущая часть тут Подготовка для Advanced уровня.

В данном посте опишу пример подготовки не для полного новичка, но близко к тому. Назову этот уровень Pre-intermediate.

Pre-intermediate. Вы знаете какой-то язык программирования на уровне достаточном, чтобы решать алгоритмические задачи. Смотри, например, Шпаргалка по Java для алгоритмического собеседования. Вы знаете английский на уровне от Intermediate и выше. Вы представляете, что такое основные структуры данных (массив, строка, список, стек, очередь, хэш таблица, куча, множество, дерево, граф). Например, вы изучали их ранее в виде курса в университете или самостоятельно. Но у вас нет никакого опыта решения алгоритмических задач или он очень маленький.

Подготовка:

1) Берем книгу Cracking the Coding Interview by Gayle Laakmann McDowell. Берем только нужные главы (Какие главы из Cracking the Coding Interview нужно изучить для прохождения алгоритмического собеседования?) Для начала можно даже еще пару глав на сложные темы исключить (Chapter 8. Recursion and Dynamic Programming и Chapter 17. Hard.). Т.е. взять главы:
1) Chapter 1. Arrays and Strings
2) Chapter 2. Linked Lists.
3) Chapter 3. Stacks and Queues.
4) Chapter 4. Trees and Graphs.
5) Chapter 10. Sorting and Searching
6) Chapter 16. Moderate
В начале каждой темы приведены алгоритмы, которые нужно знать наизусть и потом приведены задачи и решения к ним. Стоит начать с запоминания и понимания работы алгоритмов. Попробуйте выписать эти алгоритмы на бумажке без использования подсказок. Делайте это до тех пор, пока у вас это не будет получаться на автомате за пару минут. Далее смотрите задачи. Попробуйте сначала решить задачу сами. Если не смогли решить за 1-2 часа, изучайте решение до тех пор, пока не сможете сами, без подсказок, написать решение. Смотри также мои статьи:
1) Как выбрать язык программирования для алгоритмического собеседования?
2) Как решать алгоритмические задачи на подготовке, чтобы это было эффективно
3) Как не забыть решения задач и алгоритмы
4) Шпаргалка по основным алгоритмам для алгоритмического собеседования

В этих 6 главах, где-то 70-80 задач. На изучение и запоминание теории к каждой главе + самостоятельное решение задач + разбор правильного решения и запоминание уйдет при вашей подготовке где-то ~250 часов. После перейти к изучению Главы 8. На что уйдет еще где-то ~50 часов. В сумме где-то ~300 часов. Я не утверждаю, что этот подход единственный, но лично я им воспользовался. На изучение этой книги до состояния, что я могу за 5 минут написать на бумажке стандартный алгоритм без ошибок и подсказок, а также решить за 15-30 минут задачи из этих глав у меня ушел 1 год (параллельно с работой). Чем хороша эта книга - в теории нет ничего лишнего, только все самое необходимое. А также очень детально разобраны решения, с несколькими вариантами решения и описанием хода мысли, как к этим решениям прийти. Если сразу перейти на Leetcode, то без должной подготовки до этого, вы будете просто терять свое время.

2) Решаем задачи на https://www.algoexpert.io/. На данный момент там ~200 задач с очень подробным разбором решения в формате видео. Я бы сказал, что это Cracking the Coding Interview только в online формате с возможностью сабмита своих решений и их проверки. Вам не обязательно решать все 200 задач. Можно выбрать только конкретные темы, которые вы хотите прокачать. Или решать задачи выборочно, какой-то процент задач по нужным вам темам. Например, мне это помогло прокачать динамическое программирование, задачи на деревья и графы. Если скажем вы решите и разберете 50-100 задач с этой платформы, то у вас это займет ~100-200 часов.
7👍4🔥3
3) Переходим на Leetcode. Нужно начать с easy задач для того, чтобы освоится на платформе. Но я не рекомендую решать очень много таких задач, это будет просто бесполезная трата времени. Решите не более 100 easy задач. Можно воспользоваться моей подборкой (Подборка из easy задач для начала подготовки к алгоритмическому собеседованию.) Далее, переходим уже более предметно на темы, которые вы хотите прокачать и потренировать. Начинайте с easy задач на нужную вам тему и постепенно, переходите на medium задачи. Делайте упор на решении именно medium задач. Смотрите мою подборку (Сбалансированная подборка из 100 задач для подготовки к алгоритмическому собеседованию. ) Можно решить таким образом ~200 задач, из которых около половины или чуть больше это medium задачи. На это уйдет ~200 часов.

Далее процесс не сильно отличается от Advanced уровня, только до того, как аплаится я бы сначала прошел курсы по System Design. Т.к. у вас это займет больше времени и вам не хватит времени на подготовку между phone screen и full loop.

Итого у вас это займет: 600-700 часов до уровня Advanced + 200 часов на финальную подготовку (System Design, поведенческое собеседование, прицельная подготовка в компанию). В сумме вы решите ~500 задач на трех платформах (300 на Leetcode, 100 на algoexpert и 100 из книги Cracking the Coding Interview). Итого: 800-900 часов.
👍16😱7
Варианты подготовки к собеседованию в FAANG/около FAANG для разных уровней текущей подготовки. Часть 3.

Предыдущие части:
Подготовка для Advanced уровня.
Подготовка для Pre-Intermediate уровня(https://t.me/faangmaster/297, https://t.me/faangmaster/298)

Beginner. Вы знаете какой-то язык программирования на уровне достаточном, чтобы решать алгоритмические задачи. Смотри, например, Шпаргалка по Java для алгоритмического собеседования. Вы знаете английский на уровне от Intermediate и выше. Но вы плохо себе представляете, что такое структуры данных и алгоритмы. Никогда их не изучали ни в каком виде.

Тогда перед шагами описанными в части для Pre-Intermediate уровня, вам нужно изучить структуры данных на самом базовом уровне. Тут есть много вариантов. Если вы студент, возможно у вас в Университете есть какой-то курс. Если нет, можете найти курс по структурам данных и алгоритмов для начинающих. Где расскажут, про самые базовые вещи. Без сложных алгоритмов и сложных задач.

Курсы:

1) https://www.designgurus.io/course/grokking-data-structures-for-coding-interviews
Он подходит полным новичкам, но он на английском.

2) Также, если вы в любом случае планируете пользоваться https://www.algoexpert.io/. Там есть краткий курс по структурам данных в виде серии видео: https://www.algoexpert.io/data-structures/

Книги:

1) Для новичков рекомендую: Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (В переводе на русский: Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих | Бхаргава Адитья)

2) Если у вас много времени, то можно почитать Структуры данных и алгоритмы в Java | Лафоре Роберт. Но там будет много лишней информации и сложной для новичка. Я прочитал эту книгу, но далеко не все там полезно. Для новичка я бы только запоминал основы. Что такое массив, строка, список, стек, очередь, хэш таблица, куча, множество, дерево, граф. Как они работают, как их можно реализовать и т.д. В детали можно сильно не уходить.

На овладение основами, вам потребуется еще ~100 часов. Тогда в сумме с уровня, когда вы вообще ничего не знаете про структуры данных, до собеседования в FAANG вам потребуется ~900-1000 часов обучения.

Читать сложные книги, вроде:
1) Алгоритмы: построение и анализ (Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн.)
2) Алгоритмы (Роберт Седжвик)

Я бы не рекомендовал новичкам и тем, кто не планирует начать карьеру в олимпиадном программировании или заниматься наукой в области Computer Science. Они сложны, очень объемны и вы потратите колосальное время на изучение этих книг. Для прохождения собеседования есть и более короткий путь. Если же вы школьник или студент и у вас есть много времени и интереса к программированию, можете их использовать.
👍152
Подборка постов в канале, не связанная с задачами. Часть 1

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

Работа в FAANG:
1) Какие version control практики используют топ компании?
2) Используют ли FAANG компании Scrum или Kanban?
3) Как в Amazon происходит Design Review?
4) Используете ли вы сложные алгоритмы на работе?
5) Incident management в Amazon
6) COE Review в Amazon
7) Наступит ли счастье, если вы пройдете собеседование в FAANG?, Часть 2 , Часть 3.
8) Как проходят Code Review в Amazon и Facebook?, Часть 2
9) Как устроен onboarding процесс в Amazon?, Часть 2
10) Хотите узнать сколько зарабатывают в топ IT компаниях мира?
11) Как выглядит релокация в другую страну, если вы получили offer от FAANG компании?
12) Какие языки программирования используются в крупнейших IT компаниях?
13) Используют ли в FAANG\Big Tech Spring и Spring Boot?
14) Мои первые впечатления, когда я начал работать в FAANG
15) Текущие офферы в некоторые Big Tech/FAANG компании
16) Структура FAANG/Big Tech компании
17) Какие тулы используют Amazon и Facebook для внутренней коммуникации?
18) В чем преимущество получения части компенсации в виде акций публичных компаний?
19) Сколько выходцев из СНГ работает в FAANG/Big Tech компаниях?
20) Распределение по уровням в FAANG

Подготовка к собеседованию:
1) Как я изучал английский язык?
2) Как проходит собеседование в Meta(Facebook)?
3) Варианты подготовки к собеседованию в FAANG/около FAANG для разных уровней текущей подготовки Часть 2 , Часть 3, Часть 4
4) Сколько нужно решить задач на leetcode, чтобы пройти собеседование в FAANG компанию?
5) Какие бывают собеседования программистов и когда они имеют смысл?
7) Основные ошибки на собеседовании в FAANG, Часть 2
8) Почему решив 1500 задач на leetcode вы не сможете получить офер в FAANG
9) Как решать алгоритмические задачи на подготовке, чтобы это было эффективно
10) Как не забыть решения задач и алгоритмы
11) Как выбрать язык программирования для алгоритмического собеседования?
12) Стоит ли использовать https://www.topcoder.com/ или https://codeforces.com/ для подготовки к собеседованию по алгоритмам?
13) На чем проваливаются чаще на собеседовании в FAANG компании?, Часть2
14) Какой подход в самообразовании я использую?
15) Стоит ли учить алгоритмы и структуры данных и готовиться к собеседованиям вообще?
16) Нужно ли вам учить алгоритмы и структуры данных?
17) Когда стоит учить алгоритмы?
18) Сколько времени займет подготовка к собеседованию в FAANG или около FAANG компанию?
19) Как я готовился к собеседованию и попал в FAANG, Часть 2.
20) Как я готовился к собеседованию и попал Facebook?
21) Нужна ли сертификация Java программисту?
22) Нужно ли учить многопоточность в Java?
23) Сколько времени на самообразование вы тратите в неделю?

Случаи с собеседований:
1) Случай на собеседовании в FAANG
2) Еще один подозрительный случай на собеседовании
3) Классический случай на кодинг собеседовании в FAANG
4) Новая галочка про подозрение в читерстве на собеседовании в FAANG
5) Кандидаты из Google
6) Опытный кандидат с претензиями
7) Собеседовал недавно разработчика из Яндекс
7) Стоимость жизни в Лондоне и сколько нужно зарабатывать, чтобы хорошо тут жить
8) Что сейчас происходит на рынке труда программистов США и Европы?
9) Мои первые впечатления, когда я начал работать в Европе, Часть 2
10) Global Talent Visa UK
11) Число вакансий в tech индустрии медленно, но растет
12) Ситуация с хайрингом в Big Tech (и не только) в Европе и США на январь 2024

Онбординг:
1) С какими сложностями я столкнулся на своей первой работе программистом?, Часть 2
2) Как быстро адаптироваться в команде и компании? Часть 2 https://t.me/faangmaster/282
3) Что не стоит делать при онбординге в новую компанию?
👍9🔥3
👍11
Классический случай на кодинг собеседовании в FAANG

Сегодня проводил очередной coding interview. Кандидат собрал, как мне кажется, все основные ошибки на такого рода собеседовании.
Я перечислял ошибки тут: https://t.me/faangmaster/226, https://t.me/faangmaster/227

Благо, в этот раз я не заподозрил кандидата в читерстве как тут (Случай на собеседовании в FAANG, Еще один подозрительный случай на собеседовании). Ничего подозрительного в собеседовании не было.

Но кандидат собрал большинство типичных ошибок:

1) Слабая подготовка. Видно, что кандидат потратил некоторое время на подготовку, но это время было незначительным. Одна из задач была на бинарное дерево. Кандидат правильно подумал, что можно использовать алгоритм обхода дерева. Но применить на практике его не смог. Сам алгоритм - это 5 строчек кода. Для решения задачи, надо было подумать и расширить его до 10 строчек. Применить сложение переменных и нахождение максимума. Видно было, что кандидат потратил пару недель на изучение основных алгоритмов. Но применять их не научился. Такое может прокатить, только если у вас IQ 160 и выше, у одного из миллиона. Или вы этот навык выработали до этого (уже готовились ранее или были топовым олимпиадником). Когда вам достаточно объяснить алгоритм и вы его сможете применить для любой задачи. Для обычных людей, надо вырабатывать навык решения задач. Пролистать 5 стандартных алгоритмов, на которые эти задачи, не достаточно.
2) Не смог проверить свое решение и найти ошибки. Большинство кандидатов не умеют дебажить свой код без запуска автотестов. В упор не видят ошибки, даже если им указываешь конкретный пример или конкретную строчку в их коде и спрашиваешь, какой будет результат работы этой строчки, если туда подставить конкретное значение. Кандидат смог как-то решить одну задачу на массив и Two Pointers с гигантским числом ошибок к коде. И не смог найти ни одной. Даже когда я на них указывал
3) Не реагирует на подсказки. Когда кандидат делает что-то не так или застрял, я пытаюсь ему помочь наводящей мыслью или вопросом. Кандидат просто это игнорировал и даже спорил. Интервью это не соревнование, кто кого переспорит. Если вас просят найти плюсы и минусы решения, дизайна, обсудить трейдофы, то тут надо проводить сравнение. Когда вы застряли и не можете продвинуться далее, интервьюер своими вопросами не пытается с вами спорить, он пытается вам подсказать.
4) Не задает уточняющие вопросы. Тут все по классике, ничего не уточнил, сразу стал думать над решением, потом во время написания кода понял, что возможно он решает другую задачу и начал уточнять потратив куча времени.
5) Тратит куча времени на второстепенные вещи. Собеседование ограниченно по времени. При написании кода кандидат меня пытался впечатлить объявлением не обязательных структур в c++ коде, которые не продвигают решение ни на сколько. Потратил на это 50% времени написания кода, сделав тонну ошибок.
👍18🔥3🤔2💘1