Что делать если вы застряли на алгоритмическом собеседовании и не знаете как решить задачу?

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

Попробуйте свести задачу к подобной задаче, решение которой вы уже знаете. Если задача похожа на ту, которую вы уже решали, подумайте, в чем их отличие и свести одну задачу у другой. Или просто вначале опишите в слух решение похожей задачи и постепенно модифицируйте это решение под вашу задачу.

Попробуйте полный перебор подходов к решению алгоритмических задач, которые вы знаете.
Если у вас в задаче дерево. Это бинарное дерево? Это бинарное дерево поиска? Можно ли тут применить алгоритм обхода дерева и модифицировать его под задачу?
Если у вас в задаче массив. Это отсортированный массив? Если да, можно ли применить бинарный поиск? Если не отсортированный, можно ли его вначале отсортировать? Можно ли применить two pointers? Поможет ли использование вспомогательной структуры данных (хэш-таблицы, set, stack, queue)? Если в задаче сказано найти наилучший.. число способов.. можно ли применить динамическое программирование?
Если у вас граф. Можно ли применить поиск в глубину или ширину?
Если у вас список. Можно ли применить two pointers? Обычно задачи на списки достаточно прямолинейны, нужно просто аккуратно реализовать работу и изменение указателей в списке.
Можно ли добавить использование дополнительной структуры данных в вашу задачу, чтобы ее решить? Очень часто добавление хэш-таблицы позволяет улучшить решение с O(n^2) до O(n) за счет ухудшение решения за счет памяти (с O(1) до O(n)). Можно ли добавить set, stack или queue? stack помогает в задачах, где надо хранить что-то в обратном порядке.
Если у вас спрашивают найти число способов.. оптимальный... минимальный.. максимальный... Можно ли тут применить динамическое программирование?
Часто в задаче не указана структура данных. Можно ли тут применить массив, дерево, граф, хэш-таблицу и т.д.?
Надо найти top k элементов? Можно ли применить кучу (heap)? На практике в Java это делается через PriorityQueue.
В задаче дана строка? Нужно не забывать, что строки в Java immutable и как правильно с ними работать (s.charAt(i), s.toCharArray() для создания новой StringBuilder и т.д.). Можно ли применить префиксные деревья? Можно ли применить все теже подходы, что и к массивам (сортировка, бинарный поиск, two pointers)?
🔥11👍9👏1
Стоимость жизни в Лондоне и сколько нужно зарабатывать, чтобы хорошо тут жить

Жизнь в Лондоне не дешевая. Поэтому, если вы решите сюда переехать, то нужно примерно представлять стоимость жизни тут.

Начну с аренды недвижимости. Студия ~£1500, 1 bedroom(двушка по нашим понятиям) ~£2000, 2 bedroom(трешка по нашему) ~£2500.
Если вы один, то вам хватит студии или 1 bedroom, если вы с семьей, то лучше 2 bedroom.

Коммуналка. Электричество и тепло на 2 bedroom ~£300, вода ~£25, интернет £60. Итого ~£385 для трешки. Для одного человека соответственно меньше.

Еда без ресторанов, но хорошего качества ~£300-400 на человека.

Общественный транспорт ~£170, если вы ездите каждый день.

Фитнес. Или бесплатно или ~£60. Очень часто в многоквартирных домах есть бесплатный gym, бассейн, сауна и джакузи.

Теперь ориентировочная стоимость жизни для одного, пары и семьи из трех человек и нужная зп. Я разделил их также на 3 категории. Минимум (только жилье, еда, проезд, коммуналка), нормально(можно ездить в отпуск пару раз в год, покупать электронику, хорошую одежду, ходить в рестораны и развлечения), и хорошо(это нормально + 30% у вас останется).

Годовая зп указана до вычета налогов (gross). Т.е. то что вам озвучат как оффер.

Один:
1) Минимум £2500 в месяц. Или £40 000 в год.
2) Нормально. £3200 в месяц, £50 000 в год.
3) Хорошо. £4800 в месяц или £85 000 в год.

Пара:
1) Минимум. £3500 в месяц или £60 000 в год
2) Нормально. £5000 в месяц или £90 000 в год
3) Хорошо. £7500 в месяц или £140 000 в год.

Это все при условии, что вы работаете один. Если есть еще ребенок, то я бы добавил к цифрам для пары £10 000 в год: £70 000, £100 000, £150 000. Если оба работают, то у вас и финансовая ситуация другая. Вам возможно еще нужен частный садик и т.д.
🔥8👍31
Может ли такой код привести к deadlock?
#java #concurrency

class A {
public synchronized void foo() {
...
}
}

class B extends A {
public synchronized void foo() {
...
super.foo();
}
}

Как мы видим, оба метода foo в классе A и классе B synchronized. Синхронизация в данном случае на одном и том же объекте.
Обычно deadlock возникает в многопоточной среде, когда потоки получают локи на хотя бы двух объектах в разном порядке.
Например,
void foo(Object obj1, Object obj2) {
synchronized(obj1) {
synchronized(obj2) {
....
}
}
}
и один поток вызывает foo(obj1, obj2), а второй поток вызывает foo(obj2, obj1), то может возникнуть deadlock. Т.к. один поток получит лок на один объект и будет ждать получения лока на второй объект. А второй поток наоборот. Получит сначала лок на второй и будет ждать получения лока на первый объект, который держит первый поток.
В данном случае ситуация иная. У нас всего один объект.

Давайте посмотрим, что будет если у нас всего один поток.
Например, у нас такой код B b = new B(); b.foo();
Вызывающий поток получит лок на B при вызове foo из класса B. Далее дойдет до кода super.foo(). Этот вызов тоже synchronized на том же объекте.
Лок на этот объект уже получен вызывающим потоком. И если бы в Java synchronized был бы не reentrant, то поток бы ждал пока лок отпустят, чтобы его получить. В таком случае мог бы возникнуть deadlock. Но в силу того, что в Java synchronized в Java Reentrant один и тот же поток может получить лок на один и тот же объект множество раз. Для каждого такого лока (монитора) есть некий счетчик(сколько раз получен монитор на данный объект) и идентификатор потока, который его получил. Лок может получить только один поток, но множество раз. Как только счетчик упадет до нуля, это значит, что другой поток может получить теперь монитор (лок) на данном объекте.

Поэтому deadlock не возникнет благодаря свойству reentrancy локов при помощи synchronized (intrinsic locks).
👍14
Что сейчас происходит на рынке труда программистов США и Европы?

До и во время пандемии коронавируса большинство компаний США и Европы активно росли и развивались. Их капитализация росла колоссальными темпами, они нанимали все больше и больше людей, чтобы разрабатывать все новые и новые продукты и фичи, которые бы начали приносить еще больше денег, но в отдаленной перспективе.
Как только ковид закончился, спрос на многие 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;
}
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.
👍9🔥62
Какой у меня процент успешного прохождения технических собеседований?

За свою карьеру я доходил до стадии технического собеседования в ~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/ это самые популярные платформы для соревнований по олимпиадному программированию. Стоит ли их использовать в вашей подготовке к собеседованию по алгоритмам и структурам данных?

Краткий ответ: нет, это не будет эффективно.

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

Но если вы уже топовый олимпиадник, то вы уже инвестировали много времени в подготовку и вам будет намного проще пройти собеседование по алгоритмам. Поэтому заниматься олимпиадами я бы рекомендовал тем, кому это нравится, не надо себя заставлять и у вас очень много времени на это. Чаще это подходит школьникам и студентам. Если у вас очень много свободного времени, которое вы можете и главное хотите тратить на олимпиады, то это очень хорошая инвестиция в свое будущее.
👍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

Части этих алгоритмов также могут послужить решениями некоторых задач на массивы.

В некоторые Российский компании могут спросить реализовать самый простой алгоритм сортировки пузырьком. Поэтому проверьте, что вы можете его реализовать на листочке без помощи и ошибок.

Кроме самих алгоритмов нужно знать их алгоритмические сложности, что такое устойчивая сортировка, какая сложность той или иной сортировки в наихудшем случае и какой случай является наихудшим.
👍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 с условием внутри без интенсивного гугления. А уж про то, как решать задачи при помощи структур данных или алгоритмов я уже молчу.
👍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 задачи могут быть сильно сложнее, чем были у вас в их онлайн тесте.
👍97
Стоит ли целенаправленно готовиться к собеседованию в 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
👍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
👍4
Вопрос с собеседования программиста: в чем плюсы и минусы использования индексов в базе данных?

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

Плюсы:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SQL:
23) Типы SQL joins
24) Плюсы и минусы индексов
👍114