Algorithmics: хакаем алгоритмические собесы
1.59K subscribers
17 photos
76 links
Канал для людей, жаждущих совершенствования в мире программирования.

Здесь вы найдете глубокие знания об алгоритмах, структурах данных и подготовке к собеседованиям в IT.

Авторы: @avivasyuta и @tifongod

Наш блог: https://algorithmics-blog.github.io/
Download Telegram
Не можешь победить - возглавь!

Всем привет!

Вас не раздражают алгоритмические секции на интервью в любой современной it-компании? Лично меня - безумно. Я считаю, что в большинстве случаев такие секции абсолютно бесполезные - чаще всего они показывают лишь то, как кандидат умеет проходить подобные секции с live-коддингом, а не его профессиональные навыки. Но, к сожалению, на данный момент они стали де-факто стандартом для индустрии, а значит, придется учиться их проходить.

Несмотря на то, что алгоритмические секции я не люблю всем сердцем, сам раздел computer science «Алгоритмы и структуры данных» считаю как минимум не лишним (а, на самом деле, очень полезным) для любого участника процесса разработки. Эти знания и навыки позволяют вам эффективнее решать рабочие задачи, лучше и глубже понимать как работают различные инструменты, в чем их слабые и сильные стороны.
Например, небольшая «насмотренность» алгоритмических задач помогла нам недавно «придумать» алгоритм быстрой фильтрации модификаций в каталоге (подробнее)

О чем этот канал?

Самая корыстная цель - научиться (и помочь всем желающим) решать задачи, которые могут попасться на различных технических интервью в разных компаниях. Отличный источник таких задач — Leetcode.

Более «возвышенная» цель - через разбор подобных задач погрузиться в основы базовых алгоритмов и структур данных (да-да, канал не претендует на звание академического курса - во всяком случаем, на данный момент).

Кто участвует в ведении канала?

Сейчас каналом занимаются 2 человека:
- Денис Колпаков - go разработчик, 8 лет в IT. Последние 3 года работает в Авито (в юните Core Services). Занимается разработкой и поддержкой каталогов.
- Ивасюта Алексей - Team Lead (ex-frontend), 9 лет в IT. Последние 3 года работает в Авито. Недавно возглавил команду Bricks - конструктор разметки.

Мы оба активно участвовали в процессе найма и провели на двоих несколько сотен технических интервью в последние годы (в том числе и алгоритмических секций) - и как ведущие и как собеседуемые. То есть у нас есть представление о том, как должно строиться хорошее интервью и чего ожидают от собеседуемых интервьюеры (подробнее читайте в одном из следующих постов).

Несмотря на это, мы не претендуем (и не являемся) экспертами в алгоритмах. Как показывает практика, сами можем часами сидеть над незнакомой medium задачкой, пытаясь найти оптимальное решение и/или продебажить все корнер кейсы. Нарабатывать навык решения любых задачек «сходу и вслепую» мы планируем вместе с вами, ведя этот канал.
🔥9👍4
Как готовиться?

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

Что нужно, чтобы начать прорабатывать этот навык?

🔘 Базовое знание любого языка программирования

Можно, конечно, использовать псевдокод или рисовать блок-схемы, но, раз вы готовитесь к прохождению этой секции, скорее всего от вас так или иначе потребуется знание какого-нибудь языка :). Обычно, для решения базовых алгоритмических задачек достаточно уметь работать с условными конструкциями и циклами, уметь отличить указатель от экземпляра и знать несколько дефолтных функций (отсортировать массив, извлечь/добавить элемент в массив, проверить наличие элемента в хеш-мапе и т.д.)

🔘 Минимальное количество теории

Вам точно не обойтись без понимания таких структур данных, как строка, массив и хеш-мапа. Иногда вам может потребоваться понимание очереди и стека. Чуть реже вам потребуются связанные списки и деревья (а также понимание рекурсии, чтобы можно было их обходить) и кучи. Также, вам придется оценивать и сравнивать алгоритмы между собой - тут вам понадобится зверь по имени «асимптотическая сложность». Не пугайтесь названия, это не так сложно, но точно нужно уметь ее посчитать.

🔘 Много практики

Чем больше, тем лучше. Знатоки говорят, что вам в среднем потребуется прорешать 500-800 задач, чтобы окончательно перевести этот навык в разряд мастерски освоенных.

🔘 Читать наш канал 🙂

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

Стоит оговориться, что тут речь идет о базовом наборе для старта. Естественно, сами алгоритмы и структуры данных являются одним из основополагающих кирпичиков в computer science. Теория же практически необъятна. Начав с десятка базовых алгоритмов и структур, спустя тысячи часов изучения и практики можно прийти к академическому уровню познания. Обычно, люди, идущие этим путем занимаются разработкой уникальных систем, например, алгоритмов для работы распределенных систем, которые впоследствии используются повсеместно.

НО, сейчас перед нами не стоит подобных грандиозных задач. Наша цель куда ближе и проще - научиться решать простые локальные задачки и понимать как строятся и работают базовые структуры. Поэтому, я точно не советую вам закапываться в теорию. Вам точно не нужно читать все 7 томов «Искусства программирования» Кнута перед тем как приступать к практике.
5👍1🔥1
Как вести себя на интервью? 🤔

Давайте поговорим немного о самом процессе собеседования.

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

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

🔘 Уточните сколько времени отводится на решение задачи

Если вы в итоге поймете, что не справляетесь с задачей в запланированное время, можно будет попросить дать следующую задачу. Смена контекста может вам помочь, а решенная задача лучше нерешенной 🙂 Но, не спешите сдаваться и прибегайте к этому совету в крайнем случае.

🔘 Не бойтесь спрашивать у интервьюера вопросы

Если вам что-то непонятно в задаче — спросите. Или попросите интервьюера прокомментировать ваши идеи.

🔘 Не бегите сразу писать код

Даже если точно знаете что нужно делать, сперва расскажите идею, порассуждайте вслух. Попробуйте проанализировать ваше решение на простеньком примере.

🔘 Подумайте о корнер кейсах

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

🔘 Не стоит сразу пытаться придумать оптимальное решение

Задача решенная неоптимально «в лоб» обычно ценится больше, чем супер-оптимальное, но нерабочее решение. Во всяком случае, если интервьюер не попросит вас сразу перейти к оптимальному решению.

🔘 Оцените асимптотическую сложность алгоритма и количество выделенной дополнительной памяти

Умение оценивать алгоритмы — одно из основных в данной дисциплине. Обычно именно по этим оценкам сравниваются 2 алгоритма между собой.

🔘 Просите совета у интервьюера

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

И самое главное. Помните, что любое собеседование это диалог. Софт скилы тут не менее важны, чем харды. Худшее, что вы можете сделать — уйти в молчаливое длительное размышление и в конце выдать готовое решение. Чтобы оценить вас, интервьюеру важно слышать и понимать ход ваших размышлений.
🔥3👀1