Что сейчас происходит на рынке труда программистов США и Европы?
До и во время пандемии коронавируса большинство компаний США и Европы активно росли и развивались. Их капитализация росла колоссальными темпами, они нанимали все больше и больше людей, чтобы разрабатывать все новые и новые продукты и фичи, которые бы начали приносить еще больше денег, но в отдаленной перспективе.
Как только ковид закончился, спрос на многие IT продукты и сервисы начал падать, началась рецессия во многих странах.
Эта рецессии не привела к большим потерям в объемах выручки, но она перестала расти экспоненциальными темпами. А нанимали людей с расчетом, что выручка будет расти и дальше по экспоненте.
В итоге это привело к тому, что выручка перестала расти, а расходы на новых сотрудников, которые разрабатывают продукты, которые еще не приносят никаких денег увеличились существенно. Поэтому многие IT гиганты прибегли к layoffs (сокращениям).
Только один Facebook уволил 25% сотрудников с ноября 2022 по май 2023. В итоге на рынке труда оказались сотни тысяч высококвалифицированных программистов.
Более того, большинство из них достаточно состоятельные люди + им выплатили большие отступные десятки или сотни тысяч долларов. Поэтому далеко не все сразу бросились искать новую работу, а делают это постепенно и без спешки. Процесс их найма может затянуться на достаточно длительный период.
Кроме того, в силу того, что в Европе нельзя человека просто так уволить одним днем как в США (в США не нужно никаких причин для увольнения и тебя могут уволить просто одним днем), многие люди числились сотрудниками и получали зп еще 4-6 месяцев после сокращений.
Поэтому все эти люди сейчас на рынке труда и конкурируют со всеми остальными программистами, которые сейчас ищут работу.
Это приводит к тому, что менее квалицированным или начинающим программистам сейчас найти работу очень сложно из-за конкуренции. Но demand на программистов сейчас все еще высок и рано или поздно, все эти люди, которых сократили из IT гигантов найдут себе работу. Тогда ситуация на рынке труда станет более благоприятной.
До и во время пандемии коронавируса большинство компаний США и Европы активно росли и развивались. Их капитализация росла колоссальными темпами, они нанимали все больше и больше людей, чтобы разрабатывать все новые и новые продукты и фичи, которые бы начали приносить еще больше денег, но в отдаленной перспективе.
Как только ковид закончился, спрос на многие IT продукты и сервисы начал падать, началась рецессия во многих странах.
Эта рецессии не привела к большим потерям в объемах выручки, но она перестала расти экспоненциальными темпами. А нанимали людей с расчетом, что выручка будет расти и дальше по экспоненте.
В итоге это привело к тому, что выручка перестала расти, а расходы на новых сотрудников, которые разрабатывают продукты, которые еще не приносят никаких денег увеличились существенно. Поэтому многие IT гиганты прибегли к layoffs (сокращениям).
Только один Facebook уволил 25% сотрудников с ноября 2022 по май 2023. В итоге на рынке труда оказались сотни тысяч высококвалифицированных программистов.
Более того, большинство из них достаточно состоятельные люди + им выплатили большие отступные десятки или сотни тысяч долларов. Поэтому далеко не все сразу бросились искать новую работу, а делают это постепенно и без спешки. Процесс их найма может затянуться на достаточно длительный период.
Кроме того, в силу того, что в Европе нельзя человека просто так уволить одним днем как в США (в США не нужно никаких причин для увольнения и тебя могут уволить просто одним днем), многие люди числились сотрудниками и получали зп еще 4-6 месяцев после сокращений.
Поэтому все эти люди сейчас на рынке труда и конкурируют со всеми остальными программистами, которые сейчас ищут работу.
Это приводит к тому, что менее квалицированным или начинающим программистам сейчас найти работу очень сложно из-за конкуренции. Но demand на программистов сейчас все еще высок и рано или поздно, все эти люди, которых сократили из IT гигантов найдут себе работу. Тогда ситуация на рынке труда станет более благоприятной.
👌5👍3🔥1
Задача на Двоичное Дерево Поиска: найти сумму элементов в заданном диапазоне в Двоичном Дереве Поиска
#алгоритмы #interview #bst #treetraversal #binarytree
Задача. Дано бинарное дерево поиска. Нужно найти сумму всех вершин этого дерева, значения которых лежит в диапазоне значений от low до high включительно.
Решение описал тут: Сумма элементов бинарного дерева поиска в диапазоне значение
Код самого решения:
public int rangeSumBST(TreeNode root, int low, int high) {
if (root == null) {
return 0;
}
int sum = 0;
if (root.val >= low && root.val <= high){
sum += root.val;
}
if (low < root.val) {
sum += rangeSumBST(root.left, low, high);
}
if (high > root.val) {
sum += rangeSumBST(root.right, low, high);
}
return sum;
}
#алгоритмы #interview #bst #treetraversal #binarytree
Задача. Дано бинарное дерево поиска. Нужно найти сумму всех вершин этого дерева, значения которых лежит в диапазоне значений от low до high включительно.
Решение описал тут: Сумма элементов бинарного дерева поиска в диапазоне значение
Код самого решения:
public int rangeSumBST(TreeNode root, int low, int high) {
if (root == null) {
return 0;
}
int sum = 0;
if (root.val >= low && root.val <= high){
sum += root.val;
}
if (low < root.val) {
sum += rangeSumBST(root.left, low, high);
}
if (high > root.val) {
sum += rangeSumBST(root.right, low, high);
}
return sum;
}
DEV Community
Сумма элементов бинарного дерева поиска в диапазоне значение
Задача. Дано бинарное дерево поиска. Нужно найти сумму всех вершин этого дерева, значения...
❤5👍1
Какие главы из Cracking the Coding Interview нужно изучить для прохождения алгоритмического собеседования?
Я уже несколько раз рекомендовал книгу Cracking the Coding Interview by Gayle Laakmann Mcdowell тем, кто хочет начать готовиться к алгоритмическому собеседованию в FAANG или около FAANG компании (https://t.me/faangmaster/56).
Но не все главы актуальны на данный момент для именно алгоритмической части собеседования.
Какие же главы стоит изучить?
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 8. Recursion and Dynamic Programming
6) Chapter 10. Sorting and Searching
7) Chapter 16. Moderate
8) Chapter 17. Hard.
Т.е. из 17 глав, только 8 напрямую поможет вам в подготовке к алгоритмической части собеседования.
Сейчас я поясню, почему некоторые главы можно пропустить в такой подготовке:
1) Chapter 5. Bit Manipulation. Задачи на манипуляцию с битами крайне редко встречаются на собеседовании в FAANG или почти не встречаются.
2) Chapter 6. Math and Logic Puzzles. В FAANG головоломки перестали спрашивать много лет назад (хотя в некоторые российские компании типа Яндекса их еще спрашивали лет 7 назад. Сейчас не знаю).
3) Chapter 7. Object-Oriented Design. Эта глава для Junior программистов для подготовки к System Design части.
4) Chapter 9. System Design and Scalability. Эта глава тоже относится к System Design. Но это не самый лучший ресурс для подготовки. Я рекомендовал другие источники. Эту главу можно изучить для начинающих подготовку к System Design если у вас много времени для подготовки. При ограниченном времени, лучше не тратить на нее время.
5) Chapter 10. Testing. Не относится напрямую к алгоритмическому собеседованию.
6) Chapter 12. C и C++. Не относится к алгоритмическому собеседованию. Это на конкретный язык программирования.
7) Chapter 13. Java. Аналогично Chapter 12.
8) Chapter 14. Databases. Аналогично 12 и 13.
9) Chapter 15. Threads and Locks. Аналогично 12-14.
Я уже несколько раз рекомендовал книгу Cracking the Coding Interview by Gayle Laakmann Mcdowell тем, кто хочет начать готовиться к алгоритмическому собеседованию в FAANG или около FAANG компании (https://t.me/faangmaster/56).
Но не все главы актуальны на данный момент для именно алгоритмической части собеседования.
Какие же главы стоит изучить?
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 8. Recursion and Dynamic Programming
6) Chapter 10. Sorting and Searching
7) Chapter 16. Moderate
8) Chapter 17. Hard.
Т.е. из 17 глав, только 8 напрямую поможет вам в подготовке к алгоритмической части собеседования.
Сейчас я поясню, почему некоторые главы можно пропустить в такой подготовке:
1) Chapter 5. Bit Manipulation. Задачи на манипуляцию с битами крайне редко встречаются на собеседовании в FAANG или почти не встречаются.
2) Chapter 6. Math and Logic Puzzles. В FAANG головоломки перестали спрашивать много лет назад (хотя в некоторые российские компании типа Яндекса их еще спрашивали лет 7 назад. Сейчас не знаю).
3) Chapter 7. Object-Oriented Design. Эта глава для Junior программистов для подготовки к System Design части.
4) Chapter 9. System Design and Scalability. Эта глава тоже относится к System Design. Но это не самый лучший ресурс для подготовки. Я рекомендовал другие источники. Эту главу можно изучить для начинающих подготовку к System Design если у вас много времени для подготовки. При ограниченном времени, лучше не тратить на нее время.
5) Chapter 10. Testing. Не относится напрямую к алгоритмическому собеседованию.
6) Chapter 12. C и C++. Не относится к алгоритмическому собеседованию. Это на конкретный язык программирования.
7) Chapter 13. Java. Аналогично Chapter 12.
8) Chapter 14. Databases. Аналогично 12 и 13.
9) Chapter 15. Threads and Locks. Аналогично 12-14.
Telegram
FAANG Master
Готовитесь к собеседованию по алгоритмам или по решению алгоритмических задач? Или просто хотите научиться решать алгоритмические задачи?
Я успешно прошел собеседования в Amazon и Facebook, существенная часть которых это алгоритмические задачи.
Например,…
Я успешно прошел собеседования в Amazon и Facebook, существенная часть которых это алгоритмические задачи.
Например,…
👍9🔥6❤2
Какой у меня процент успешного прохождения технических собеседований?
За свою карьеру я доходил до стадии технического собеседования в ~21 компанию. Большинство из которых это топ компании России или мира.
Я не считаю число раз, когда я подавал резюме и не получал ответа или приходил reject по резюме. В некоторые из этих компаний я собеседовался 2 или 3 раза. В сумме я доходил до стадии технического собеседования ~24 раза.
Из этих 24 раз я 8 раз получил в итоге оффер. Т.е. мой средний процент за карьеру ~33%.
За последние 7 лет я больше сам собеседую. Я провел сотню собеседований как в FAANG так и в другие европейские компании. Сам же я за последние 7 лет проходил собеседование 4 раза и получил 3 оффера. 2 из них в FAANG.
Хождение по собеседованиям помогает понять, что разные компании спрашивают и какие знания у вас на хорошем уровне, а какие следует подтянуть, что нужно почитать и изучить, какие навыки развить.
Сильно повысить мой процент прохождения собеседований помогла подготовка. Т.е. я прихожу на собеседование уже после многомесячной подготовки, как на условный экзамен в универе. Именно подготовку игнорируют большинство кандидатов и поэтому проявляют себя плохо на техническом собеседовании. Без подготовки также иногда стоит ходить, просто для того, чтобы вообще себе представлять свой текущий уровень и то, чего вам не хватает и что спрашивают.
Примеры компаний, в которые я собеседовался: Google, Facebook, Amazon, Booking, Atlassian, Яндекс, Сбертех, Skyscanner, Mail Ru, Zalando, Spotify, Huawei, Criteo, и многие другие.
За свою карьеру я доходил до стадии технического собеседования в ~21 компанию. Большинство из которых это топ компании России или мира.
Я не считаю число раз, когда я подавал резюме и не получал ответа или приходил reject по резюме. В некоторые из этих компаний я собеседовался 2 или 3 раза. В сумме я доходил до стадии технического собеседования ~24 раза.
Из этих 24 раз я 8 раз получил в итоге оффер. Т.е. мой средний процент за карьеру ~33%.
За последние 7 лет я больше сам собеседую. Я провел сотню собеседований как в FAANG так и в другие европейские компании. Сам же я за последние 7 лет проходил собеседование 4 раза и получил 3 оффера. 2 из них в FAANG.
Хождение по собеседованиям помогает понять, что разные компании спрашивают и какие знания у вас на хорошем уровне, а какие следует подтянуть, что нужно почитать и изучить, какие навыки развить.
Сильно повысить мой процент прохождения собеседований помогла подготовка. Т.е. я прихожу на собеседование уже после многомесячной подготовки, как на условный экзамен в универе. Именно подготовку игнорируют большинство кандидатов и поэтому проявляют себя плохо на техническом собеседовании. Без подготовки также иногда стоит ходить, просто для того, чтобы вообще себе представлять свой текущий уровень и то, чего вам не хватает и что спрашивают.
Примеры компаний, в которые я собеседовался: Google, Facebook, Amazon, Booking, Atlassian, Яндекс, Сбертех, Skyscanner, Mail Ru, Zalando, Spotify, Huawei, Criteo, и многие другие.
В какое число компаний вы доходили до технического собеседования?
Final Results
25%
0
13%
1
30%
2-5
16%
5-10
9%
10-20
3%
20-25
2%
25-30
1%
30-40
2%
40+
Стоит ли использовать https://www.topcoder.com/ или https://codeforces.com/ для подготовки к собеседованию по алгоритмам?
https://www.topcoder.com/ и https://codeforces.com/ это самые популярные платформы для соревнований по олимпиадному программированию. Стоит ли их использовать в вашей подготовке к собеседованию по алгоритмам и структурам данных?
Краткий ответ: нет, это не будет эффективно.
Спектр тем, типов задач, которые нужны для собеседования и для того, чтобы стать успешным олимпиадником не совпадают. Для олимпиад нужен более широкий спектр подходов и тем, которые не нужны для собеседования. Более того, вы можете участвовать в олимпиадах и решать там не все задачи, а скажем, только задачи на массивы, и набирать какие-то баллы, при этом не прогрессируя, а просто получая удовольствие от самого соревнования. На собеседовании вам нужно решить все задачи без исключений, которые будут на разные тематики, но по сложности они могут быть сильно проще, чем на олимпиаде. Поэтому если вы целенаправленно готовитесь к собеседованию, для более эффективного использования своего времени лучше использовать другие ресурсы, которые я уже рекомендовал на этом канале.
Но если вы уже топовый олимпиадник, то вы уже инвестировали много времени в подготовку и вам будет намного проще пройти собеседование по алгоритмам. Поэтому заниматься олимпиадами я бы рекомендовал тем, кому это нравится, не надо себя заставлять и у вас очень много времени на это. Чаще это подходит школьникам и студентам. Если у вас очень много свободного времени, которое вы можете и главное хотите тратить на олимпиады, то это очень хорошая инвестиция в свое будущее.
https://www.topcoder.com/ и https://codeforces.com/ это самые популярные платформы для соревнований по олимпиадному программированию. Стоит ли их использовать в вашей подготовке к собеседованию по алгоритмам и структурам данных?
Краткий ответ: нет, это не будет эффективно.
Спектр тем, типов задач, которые нужны для собеседования и для того, чтобы стать успешным олимпиадником не совпадают. Для олимпиад нужен более широкий спектр подходов и тем, которые не нужны для собеседования. Более того, вы можете участвовать в олимпиадах и решать там не все задачи, а скажем, только задачи на массивы, и набирать какие-то баллы, при этом не прогрессируя, а просто получая удовольствие от самого соревнования. На собеседовании вам нужно решить все задачи без исключений, которые будут на разные тематики, но по сложности они могут быть сильно проще, чем на олимпиаде. Поэтому если вы целенаправленно готовитесь к собеседованию, для более эффективного использования своего времени лучше использовать другие ресурсы, которые я уже рекомендовал на этом канале.
Но если вы уже топовый олимпиадник, то вы уже инвестировали много времени в подготовку и вам будет намного проще пройти собеседование по алгоритмам. Поэтому заниматься олимпиадами я бы рекомендовал тем, кому это нравится, не надо себя заставлять и у вас очень много времени на это. Чаще это подходит школьникам и студентам. Если у вас очень много свободного времени, которое вы можете и главное хотите тратить на олимпиады, то это очень хорошая инвестиция в свое будущее.
Topcoder
Home | Topcoder
👍8🔥3
Какие алгоритмы сортировки нужно знать для алгоритмического собеседования?
Наизусть обязательно нужно знать (вы можете написать код этих сортировок без подсказок на листе бумаге минут за 5 без ошибок):
1) Merge Sort
2) Quick Sort
В чистом виде вас не попросят - напишите ту или иную сортировку (в FAANG компании точно не спросят, не в FAANG могут спросить просто написать. Иногда встречал такие вопросы в Российские не FAANG компании типа Яндекса). Но есть много задач на массивы (строки и списки), решением которых является часть известного алгоритма сортировки. Если же вам просто надо отсортировать массив для решения задачи, вам не надо писать сортировку с нуля. Просто в Java можно вызвать Collections.sort или Arrays.sort.
Есть также известный алгоритм QuickSelect, который позволяет найти оптимальным образом k-топ элемент (вместо полной сортировки или использования кучи (PriorityQueue в Java)). Этот алгоритм частично повторяет Quick Sort. QuickSelect также нужно знать наизусть.
Желательно также знать и уметь реализовать самостоятельно:
3) Bucket Sort
4) Radix Sort
Части этих алгоритмов также могут послужить решениями некоторых задач на массивы.
В некоторые Российский компании могут спросить реализовать самый простой алгоритм сортировки пузырьком. Поэтому проверьте, что вы можете его реализовать на листочке без помощи и ошибок.
Кроме самих алгоритмов нужно знать их алгоритмические сложности, что такое устойчивая сортировка, какая сложность той или иной сортировки в наихудшем случае и какой случай является наихудшим.
Наизусть обязательно нужно знать (вы можете написать код этих сортировок без подсказок на листе бумаге минут за 5 без ошибок):
1) Merge Sort
2) Quick Sort
В чистом виде вас не попросят - напишите ту или иную сортировку (в FAANG компании точно не спросят, не в FAANG могут спросить просто написать. Иногда встречал такие вопросы в Российские не FAANG компании типа Яндекса). Но есть много задач на массивы (строки и списки), решением которых является часть известного алгоритма сортировки. Если же вам просто надо отсортировать массив для решения задачи, вам не надо писать сортировку с нуля. Просто в Java можно вызвать Collections.sort или Arrays.sort.
Есть также известный алгоритм QuickSelect, который позволяет найти оптимальным образом k-топ элемент (вместо полной сортировки или использования кучи (PriorityQueue в Java)). Этот алгоритм частично повторяет Quick Sort. QuickSelect также нужно знать наизусть.
Желательно также знать и уметь реализовать самостоятельно:
3) Bucket Sort
4) Radix Sort
Части этих алгоритмов также могут послужить решениями некоторых задач на массивы.
В некоторые Российский компании могут спросить реализовать самый простой алгоритм сортировки пузырьком. Поэтому проверьте, что вы можете его реализовать на листочке без помощи и ошибок.
Кроме самих алгоритмов нужно знать их алгоритмические сложности, что такое устойчивая сортировка, какая сложность той или иной сортировки в наихудшем случае и какой случай является наихудшим.
👍8🔥3
На чем проваливаются чаще на собеседовании в FAANG компании?
Собеседования в FAANG достаточно сложный процесс и состоит из нескольких этапов. На разных этапах это будут разные причины.
Процесс начинается с апликейшена или с контакта рекрутера. Если с вами сконтактировал рекрутер и вы решите пройти собеседование, то вы практически гарантированно попадете на собеседование, если у вас нет жестких проблем с английским. На вас он вышел при помощи поиска на linkedin по ключевым словам или вашим контактам. Обычно, они смотрят на ваше образование и опыт работы. Они смотрят, чтобы там были или серьезные вузы для вашей страны/мира или топ компании вашей страны мира. Например, для России по вузам это может быть МФТИ, ИТМО, МГУ, Бауманка, МИФИ и т.д. По работодателям это может быть Яндекс, OK, VK, Mail, Сбертех, Ozon. Иногда могут пригласить победителя олимпиад или топового олимпиадника. Но тут надо быть в топ 10 в мире или хотя бы в топ 100 или победителем/призером известных олимпиад.
Если у вас этого ничего нет, то вероятность того, что вам напишет рекрутер Google или Facebook сильно уменьшается. Тут лучше самому аплаится. Если делать это напрямую на сайте компании и у вас нет ничего интересного в резюме, то с большой вероятностью там будет 100 других кандидатов, у которых резюме будет интереснее вашего. В таком случае аплаится лучше через кого-то, кто уже работает в этой компании. Тогда вероятность того, что вас пригласят на собеседование кратно повышается. Если у вас таких знакомых нет, можете просто найти кого-то на linkedin и попросить вас зареферить (например у вас с этим человеком есть общие контакты, или вы учились в одном вузе, работали в одной компании ну или просто он из той же страны, что и вы).
Хорошо, вы зааплаились и с вами связался рекрутер. Вам назначат предварительный созвон на 15 минут с рекрутером. Он проверит, что вы говорите на английском, заинтерисованны в вакансии, спросит про ваш опыт и расскажет про дальнейший процесс. Провалится тут можно если вы не знаете английский на минимальном уровне или не будете проявлять никакого интереса или будете постоянно грубить, например.
Далее вам будет назначен Phone Screen. Это предварительное техническое собеседование. В Facebook это обычное кодинг интервью на алгоритмы, где вас попросят решить 2 алгоритмические задачки. Длительность 45 минут. В Amazon это может быть on-line тест также на алгоритмические задачки (тоже самое что в Facebook, просто без человека). Тут проваливается гиганское число людей. Лишь небольшой процент проходит этот этап. Я бы сказал, 10-20%. Зависит от компании и сложности задач. Основная причина - отсутствие какой либо подготовки. Большинство имеют смутное представление о том, что такое кодинг собеседование в FAANG и считают, что задачки на алгоритмы это детский сад и уж они то с 10 летним опытом их решат не задумываясь. Но на деле, большинство не может написать цикл for с условием внутри без интенсивного гугления. А уж про то, как решать задачи при помощи структур данных или алгоритмов я уже молчу.
Собеседования в FAANG достаточно сложный процесс и состоит из нескольких этапов. На разных этапах это будут разные причины.
Процесс начинается с апликейшена или с контакта рекрутера. Если с вами сконтактировал рекрутер и вы решите пройти собеседование, то вы практически гарантированно попадете на собеседование, если у вас нет жестких проблем с английским. На вас он вышел при помощи поиска на linkedin по ключевым словам или вашим контактам. Обычно, они смотрят на ваше образование и опыт работы. Они смотрят, чтобы там были или серьезные вузы для вашей страны/мира или топ компании вашей страны мира. Например, для России по вузам это может быть МФТИ, ИТМО, МГУ, Бауманка, МИФИ и т.д. По работодателям это может быть Яндекс, OK, VK, Mail, Сбертех, Ozon. Иногда могут пригласить победителя олимпиад или топового олимпиадника. Но тут надо быть в топ 10 в мире или хотя бы в топ 100 или победителем/призером известных олимпиад.
Если у вас этого ничего нет, то вероятность того, что вам напишет рекрутер Google или Facebook сильно уменьшается. Тут лучше самому аплаится. Если делать это напрямую на сайте компании и у вас нет ничего интересного в резюме, то с большой вероятностью там будет 100 других кандидатов, у которых резюме будет интереснее вашего. В таком случае аплаится лучше через кого-то, кто уже работает в этой компании. Тогда вероятность того, что вас пригласят на собеседование кратно повышается. Если у вас таких знакомых нет, можете просто найти кого-то на linkedin и попросить вас зареферить (например у вас с этим человеком есть общие контакты, или вы учились в одном вузе, работали в одной компании ну или просто он из той же страны, что и вы).
Хорошо, вы зааплаились и с вами связался рекрутер. Вам назначат предварительный созвон на 15 минут с рекрутером. Он проверит, что вы говорите на английском, заинтерисованны в вакансии, спросит про ваш опыт и расскажет про дальнейший процесс. Провалится тут можно если вы не знаете английский на минимальном уровне или не будете проявлять никакого интереса или будете постоянно грубить, например.
Далее вам будет назначен Phone Screen. Это предварительное техническое собеседование. В Facebook это обычное кодинг интервью на алгоритмы, где вас попросят решить 2 алгоритмические задачки. Длительность 45 минут. В Amazon это может быть on-line тест также на алгоритмические задачки (тоже самое что в Facebook, просто без человека). Тут проваливается гиганское число людей. Лишь небольшой процент проходит этот этап. Я бы сказал, 10-20%. Зависит от компании и сложности задач. Основная причина - отсутствие какой либо подготовки. Большинство имеют смутное представление о том, что такое кодинг собеседование в FAANG и считают, что задачки на алгоритмы это детский сад и уж они то с 10 летним опытом их решат не задумываясь. Но на деле, большинство не может написать цикл for с условием внутри без интенсивного гугления. А уж про то, как решать задачи при помощи структур данных или алгоритмов я уже молчу.
👍14
Если вы прошли Phone Screen, то ваши шансы получить офер уже составляют ~25%. Т.е. примерно один из 4, кто прошел до on-site собеседования получает офер (в среднем конечно). On-site состоит из 4-5 собеседований по 45 минут. Обычно это кодинг, system design и поведенческое собеседование. В разные компании основная причина провалов разная. Т.к. вы уже прошли некий отбор по части кодинга, то провалится на кодинге шансов у вас намного меньше, чем в system design. Особенно это характерно для Facebook. На on-site на моем опыте люди чаще проваливаются на system design. Но опять же, не потому что это очень сложно, а потому что люди мало уделяют времени на подготовку этой части. Как по мне system design это достаточно простое собеседование, если вы несколько месяцев уделили подготовке именно этой части. В Amazon часто проваливаются на поведенческой части и на кодинг собеседовании. Как мне кажется, это связано с тем, что поведенческая часть в Amazon сложнее, чем в другие компании (там все завязано на Leadership Principles). А также с тем, что Phone Screen в Amazon достаточно лайтовый и его пройти легче, чем в Facebook или Google. А на on-site задачи могут быть сильно сложнее, чем были у вас в их онлайн тесте.
👍9❤7
Стоит ли целенаправленно готовиться к собеседованию в FAANG, если у вас нет технического образования и вы учитесь на курсах и хотите стать программистом?
Краткий ответ - нет.
Вам в таком случае лучше сосредоточиться на поиске любой работы программистом для получения хоть какого-то опыта. Компании поменьше не собеседуют как FAANG. Вам следует состедоточится на основах языка программирования, SQL, Linux и получить опыт в создании собственных небольших проектов, чтобы потрогать на практике фреймворки и тулы, которые будут востребованы на работе. Для Java это может быть Spring, MySql, Postgress. Для full-stack это может быть еще JS, React. Также разобраться с основами структур данных, какие они поддерживают основные операции и их алгоритмическая сложность (массив, строка, список, хэш таблица, дерево, граф).
На первой работе вы поймете тяните вы или нет, нравится вам или нет. Если будете прогрессировать, можете изучить более сложные вещи и найти работу в более крутой компании. Изучить паттерны проектирования, многопоточность, начать практиковаться в решении алгоритмических задач, разобраться в более сложных концептах баз данных(транзакции, уровни изоляции, дед локи, индексы). И пройти собеседования в лучшии компании вашей страны/города. Туда обычно собеседования это что-то промежуточное между собеседованиями в маленькие компании и собеседованием в FAANG. Обычно там пол собеседования по языку программирования и технологиям, половину на алгоритмы.
И уже получив опыт в такой компании можно задуматься, если вы хотите в FAANG.
Целенаправленно готовится в FAANG я бы советовал если вы студент топ вуза или олимпиадник и вы можете сразу на стажера/Junior попасть в FAANG еще до окончания или сразу после. Или тем кто уже имеет опыт работы над большими высоконагруженными проектами в хороших компаниях.
Краткий ответ - нет.
Вам в таком случае лучше сосредоточиться на поиске любой работы программистом для получения хоть какого-то опыта. Компании поменьше не собеседуют как FAANG. Вам следует состедоточится на основах языка программирования, SQL, Linux и получить опыт в создании собственных небольших проектов, чтобы потрогать на практике фреймворки и тулы, которые будут востребованы на работе. Для Java это может быть Spring, MySql, Postgress. Для full-stack это может быть еще JS, React. Также разобраться с основами структур данных, какие они поддерживают основные операции и их алгоритмическая сложность (массив, строка, список, хэш таблица, дерево, граф).
На первой работе вы поймете тяните вы или нет, нравится вам или нет. Если будете прогрессировать, можете изучить более сложные вещи и найти работу в более крутой компании. Изучить паттерны проектирования, многопоточность, начать практиковаться в решении алгоритмических задач, разобраться в более сложных концептах баз данных(транзакции, уровни изоляции, дед локи, индексы). И пройти собеседования в лучшии компании вашей страны/города. Туда обычно собеседования это что-то промежуточное между собеседованиями в маленькие компании и собеседованием в FAANG. Обычно там пол собеседования по языку программирования и технологиям, половину на алгоритмы.
И уже получив опыт в такой компании можно задуматься, если вы хотите в FAANG.
Целенаправленно готовится в FAANG я бы советовал если вы студент топ вуза или олимпиадник и вы можете сразу на стажера/Junior попасть в FAANG еще до окончания или сразу после. Или тем кто уже имеет опыт работы над большими высоконагруженными проектами в хороших компаниях.
❤13👍1
Вопрос с собеседования программиста: какие типы джойнов вы знаете?
Очень частый вопрос с собеседования на программиста: Какие типы SQL joins вы знаете и чем они отличаются?
Ответ.
Их 5 типов:
1) INNER JOIN
2) LEFT OUTER JOIN (или просто LEFT JOIN)
3) RIGHT OUTER JOIN (или просто RIGHT JOIN)
4) FULL OUTER JOIN (или просто FULL JOIN)
5) CROSS JOIN
Подробно описал тут: Типы SQL joins
Очень частый вопрос с собеседования на программиста: Какие типы SQL joins вы знаете и чем они отличаются?
Ответ.
Их 5 типов:
1) INNER JOIN
2) LEFT OUTER JOIN (или просто LEFT JOIN)
3) RIGHT OUTER JOIN (или просто RIGHT JOIN)
4) FULL OUTER JOIN (или просто FULL JOIN)
5) CROSS JOIN
Подробно описал тут: Типы SQL joins
DEV Community
Типы SQL joins
Очень частый вопрос с собеседования на программиста: Какие типы SQL joins вы знаете? Ответ. Их 5...
👍10
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
Плейлист, в котором высшее руководство Amazon рассказывает про Leadership Principles. На них базируется не только вся работа внутри компании, но и поведенческое собеседование в Amazon. Их нужно знать и подготовить примеры из своей карьеры, где вы их проявили:
https://www.youtube.com/playlist?list=PL9JNmYfQa0bgT_eJKk2uflwtiBIpbImdB
Также видео, где о них в разных интервью рассказывает Jeff Bezos: https://www.youtube.com/watch?v=B-xdfQv3I1k
YouTube
Amazon's 14 Leadership Principles via Jeff Bezos
Amazon Interview Training Program: https://bestofmany.com/amazon-onsite-interview-training-program-dan-croitor.php
00:00 1. Customer obsession: start with the customer and work backwards; work vigorously to earn and keep customer trust; pay attention to…
00:00 1. Customer obsession: start with the customer and work backwards; work vigorously to earn and keep customer trust; pay attention to…
👍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 ключей, которые не меняются.
Если очень коротко отвечать на этот вопрос в режиме блица на собеседовании, то:
Плюсы:
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 ключей, которые не меняются.
GeeksforGeeks
Clustered and Non-Clustered Indexing - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
👍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 пишите в комментариях.
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 пишите в комментариях.
www.sql-ex.ru
SQL exercises
SQL remote education. Interactive exercises on SQL statements: SELECT,INSERT,UPDATE,DELETE
👍15❤2🔥2
Какой подход в самообразовании я использую?
Большую часть всего, что я знаю в теоретическом плане про алгоритмы, структуры данных, навык быстрого решения алгоритмических задач, многопоточность в Java, паттерны проектирования, концепты и устройство высоконагруженных, расспределенных систем и много всего другого - я изучил это самостоятельно, параллельно с работой программистом.
Когда ты работаешь, у тебя не остается много времени и сил, чтобы что-то еще изучать. Поэтому, чтобы это делать, во-первых, нужна сильная мотивация и способ, который позволит закрепить это как привычку. Одной из возможных мотиваций могут служить деньги. Но когда, ты уже программист и зарабатываешь условные 2-4 тысячи долларов в месяц, мотивация деньгами уже работает хуже. Иногда работает мотивация попасть в определенную компанию, особенно, если это не просто и более того, у вас с первого раза это не получилось. Как преодоление преграды, самолюбие, эго. Или же вам искренне хочется в чем-то разобраться, что-то изучить, потому что вам это интересно из любопытства. Или ради повышения из условного Junior до Senior. Каждый может найти то, что его мотивирует.
Но одной мотивации не достаточно. Для достижения цели, нужно регулярно что-то делать. Для этого я разбиваю изучение на очень маленькие кусочки, каждый из которых у меня будет вызывать чувство того, что я что-то сделал, чего-то достиг. Иначе учить что-то в течении нескольких лет, чтобы через несколько лет увидеть результат очень сложно психологически. Поэтому, например, я могу стараться решить или разобраться с одной задачкой на leetcode в день. Когда ты сабмитишь решение и оно проходит все тесты, это создает положительную обратную связь в мозге, и хочется это повторить снова. Или если я читаю книгу, я могу запланировать прочитать скажем главу или подглаву, и потом пересказать ее словами самому себе или выписать это на бумаге, или рассказать другу или коллеге. Это помогает и лучше усвоить, запомнить материал, и дает чувство, что ты что-то знаешь. Если просто читаешь книгу, это может быть очень скучно и после прочтения без повторения ты забудешь 99% прочитанного. Когда я активно что-то изучаю параллельно с работой, то я выделяю 1-3 часа в день каждый будний день за самообразование. Например, 1 час утром до работы, если есть такая возможность, когда ты еще не уставший, или вечером после работы могу, например, решить одну задачу. И на выходных прочитать и пересказать пару глав из книги.
Пишите, как вы занимаетесь самообразованием.
Большую часть всего, что я знаю в теоретическом плане про алгоритмы, структуры данных, навык быстрого решения алгоритмических задач, многопоточность в 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;
}
Может использоваться на собеседовании в 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, который мог делать очень быстрые манипуляции с разреженными матрицами и использовал алгоритмы параллельной сортировки на тысячах ядер видеокарты. При этом я ни разу не использовал сложное динамическое программирование на работе, только на собеседованиях.
Приходилось ли вам писать или использовать сложные алгоритмы на работе на практике?
Типичный код, который пишет backend разработчик на Java, это:
1) boiler plate код связанный с каким-то фреймворком или библиотекой. Например, код для создания REST, RPC или какого-либо еще сервиса. Код для взаимодействия с базой, кэшом, очередью или потоком. Всяческие конфигурационные файлы и код.
2) Тривиальная бизнес логика. Это, обычно, прочитать из базы, кэша, потока, очереди или взять пришедший реквест, как-то его преобразовать (отфильтровать, трансформировать и т.д.) и положить снова в базу, очередь, поток или отправить назад реквест.
Обычно, для 1) знания каких-то алгоритмов и структур данных не требуется. Да и вообще, запоминать как это делается особого смысла нет. Все технологии и тулы быстро меняются и все эти вещи быстро гуглятся. Надо уметь гуглить и копипастить. А с появлением LLM, это вообще можно автоматизировать.
Для 2) уже нужны какие-то базовые знания структур данных и алгоритмов. Вам, скорее всего придется работать со списками, массивами, хэш-таблицами, писать циклы и if-else. Очень редко, что-то сложнее этого.
Но во многие компании спрашивают знания алгоритмов и структур данных (не только в FAANG, но и компании поменьше). Это, в основном, связано с тем, что им надо каким-то стандартным образом отсеять много кандидатов. И данные исследований показывают, что люди, которые прошли такое собеседование, показывают более хорошие результаты на работе.
Но иногда все же нужно не только теоретическое знание этих алгоритмов, но и их приходится применять на работе. Чаще это делают разработчики, которые разрабатывают инфраструктуру. Это те базовые блоки и кирпичики, которые уже могут использовать backend разработчики. Это разработчики, которые разрабатывают базы данных, языки программирования, виртуальные машины, лоад балансеры, библиотеки, фреймворки, распределенные сервисы типа Elastic Search, Kafka, Cassandra и т.д.
Но иногда это приходится делать и backend разработчикам.
Лично мне приходилось писать алгоритмы для работы в графами и деревьями в FAANG. Это и поиск циклов в графе и обход дерева кода (AST Tree) с его модификацией. Несколько раз, в разных компаниях писал топологическую сортировку. Часто нужна, когда у вас есть граф зависимостей чего-либо. Также в одной компании я разрабатывал алгоритм под CUDA, который мог делать очень быстрые манипуляции с разреженными матрицами и использовал алгоритмы параллельной сортировки на тысячах ядер видеокарты. При этом я ни разу не использовал сложное динамическое программирование на работе, только на собеседованиях.
Приходилось ли вам писать или использовать сложные алгоритмы на работе на практике?
👍8❤4🔥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) Плюсы и минусы индексов
#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) Плюсы и минусы индексов
Telegraph
Какие методы класса Object вы знаете?
Все классы в Java наследуют класс Object. Официальная документация: Object. Его методы: 1) getClass() - получить runtime класс объекта. 2) toString() - возвращает текстовое представление объекта 3) hashCode() - Возвращает hash code объекта. Используется,…
👍11❤4
Подборка алгоритмических задач с решениями и описание алгоритмов уже опубликованных в этом канале
#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 подход: разменять деньги
#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 подход: разменять деньги
Medium
Проверка на палиндром
Задача. Проверить, является ли строка палиндромом. Палиндром — это строка, которая читается одинаково слева направо и справо налево.
👍9❤5
Подборка статей, которые я уже написал и опубликовал в этом канале по system design
#systemdesign
Обновление подборки.
1) Load Balancers 1
2) Load Balancers 2
3) Load Balancers 3
4) Consistent Hashing
5) Data Partitioning/Sharding
6) Design Web Crawler
7) Дизайн Uber/Яндекс Такси
8) Дизайн новостной ленты соцсети типа Twitter или Facebook
9) Availability
10) Consistency
#systemdesign
Обновление подборки.
1) Load Balancers 1
2) Load Balancers 2
3) Load Balancers 3
4) Consistent Hashing
5) Data Partitioning/Sharding
6) Design Web Crawler
7) Дизайн Uber/Яндекс Такси
8) Дизайн новостной ленты соцсети типа Twitter или Facebook
9) Availability
10) Consistency
Telegraph
Load Balancers. Введение. Часть 1 из 3.
Это первая из трех статей, которые я планирую написать про Load Balancers (LB). Данная статья будет посвященна введению в тему. Давайте рассмотрим сайт google.com. Им пользуются миллиарды человек. Чтобы обработать запросы от всех пользователей, нам нужно…
👍10❤2🙏2
Задача на system design: Задизайнить мессенджер по типу Telegram или WhatsApp.
#systemdesign
Задача. Задизайнить мессенджер по типу Telegram или WhatsApp.
Решение. Описал тут: Дизайн мессенджера Telegram
#systemdesign
Задача. Задизайнить мессенджер по типу Telegram или WhatsApp.
Решение. Описал тут: Дизайн мессенджера Telegram
DEV Community
Дизайн мессенджера Telegram
Задача. Задизайнить мессенджер по типу Telegram или WhatsApp. Решение. ...
👍9❤1👏1