Имейте в виду, что я не блогер, поэтому мне очень жаль, если он не соответствует стандартам «блога».

Прежде чем я начну, вот ссылки на мой профиль программирования, если вам нужно больше контекста при просмотре блога:

Как все начиналось:

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

Раунд 1: Отладка, с которой мы неплохо справились (думаю, помощь моим товарищам по партии во время практических занятий окупилась).

Раунд 2: Решая проблему в Codechef, нам повезло с этой, Мехул уже решил ту же проблему несколько дней назад, поэтому мы смогли решить эту задачу быстро.

Раунд 3: Это был конкурс на Codechef, именно здесь мы познакомились с нашим «Авкадом», люди смогли решить первую проблему в течение 10 минут, в то время как нам потребовалось более часа с множеством неправильных материалов. Это была единственная проблема, которую нам предстояло решить, и в результате мы оказались последними в рейтинге!

Затем я начал решать некоторые задачи начального уровня в Codechef в течение нескольких месяцев, и это стало моим хобби.

Попадание в конкурсы:

Мне потребовалось 3 месяца, чтобы понять, что Codechef также проводит онлайн-конкурсы. В январе 2017 года я впервые принял участие в длинном конкурсе, и мне удалось решить всего 2 задачи. Длинные конкурсы (которые длились более 10 дней) казались более увлекательными, поскольку у меня не было возможности взглянуть на решение, когда мне захотелось отказаться от него. Я бы потратил дни на решение одной проблемы, но, в конце концов, эта зеленая галочка всегда окупалась. Хотя я тогда тоже участвовал в коротких конкурсах, я не особо в них преуспел (мой рейтинг-график может это подтвердить!). Чтение редакционных статей и решение проблемы после конкурса (также известное как решение проблемы) было действительно полезным для постепенного улучшения результатов на конкурсах.

Hackerrank был еще одним сайтом, на котором я соревновался на начальных этапах, но тогда не воспринимал его так серьезно, как Codechef.

Быть программистом 5 * и другие хорошие вещи:

Я продолжил использовать тот же подход «Провести конкурсы, улучшить, промыть, повторить» и смог достичь 5 * в рейтинге в июле 2017 года, что было большим событием для меня, поскольку в Мумбаи было всего несколько таких людей, которые также означало, что я смог выиграть большинство соревнований по программированию между колледжами, в которых я участвовал в Мумбаи. Это было также время (ноябрь 2017 г.), когда мне предложили стипендию для прохождения CCDSAP Advanced, и я смог ее очистить!

Региональные соревнования ICPC 2018:

Все шло хорошо, и я решил принять участие в крупнейшем в мире соревновании по программированию ICPC с моими товарищами по команде Мехулом (mehul_dholiya) и Адитьей (программистом Adiprogram). Мы довольно спокойно относились к этому и не делали для этого никаких специальных упражнений. Что происходит, когда вы вступаете в большое соревнование с небольшими приготовлениями? вы облажались! Мы застряли в геометрической задаче и получили 60-е место. Не так уж и плохо, но определенно не чем гордиться.

Ориентация на короткие конкурсы:

ICPC заставил меня понять, что, хотя у меня был приличный профиль кодирования, это было в основном из-за длительных проблем, и я медленно решал проблемы, но был полон решимости найти решение (вот почему я использую дескриптор «Slow_But_Determined» в нескольких местах), поэтому я решил провести более короткие конкурсы. Но поскольку я был действительно близок к тому, чтобы стать кодером 6 * в Codechef (рейтинги много значили для меня, XD), я дал последний долгий вызов (январь 2018), прежде чем отдохнуть от долгих испытаний. Я начал участвовать во многих коротких конкурсах и проявлять большую активность на других сайтах, посвященных конкурентному программированию, таких как Codeforces, Hackerearth и Topcoder. Частое участие в коротких соревнованиях постепенно делало меня быстрее. В мае-июне я был менее активен, так как сосредоточился на развитии и стажировке. Это было не так интересно, как соревновательное программирование.

Региональные соревнования ICPC 2019:

После почти года проведения множества коротких конкурсов, снова пришло время для ICPC! Мы не собирались повторять ту же ошибку снова, поэтому на этот раз мы провели много командных виртуальных конкурсов и индивидуальных гибридных приложений (спасибо Ашишгупу) на Codeforces, во время которых я также стал кандидатом в мастера (или, как я люблю это называть «Кандидат в гребаные мастера» XD) на Codeforces. (Мое любимое достижение). Мы участвовали в двух региональных отборочных соревнованиях, Пуне и Калькутте, и получили 36 и 16 места соответственно. Всегда есть ощущение: «Мы могли бы добиться большего успеха», но меня это вполне устраивало.

Мой опыт собеседований:

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

Codechef Intern (май 2018 г.):

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

Sharechat Intern (август 2018 г.):

Sharechat раньше спонсировал конкурсы на Codechef, и через одно из них меня вызвали на собеседование. Раунд 1 был алгоритмическим раундом продолжительностью около часа, в нем было 4 задачи, я смог решить 3 полностью и смог решить 4-ю для какого-то конкретного случая. Мне сказали, что я прошел раунд, но они больше не ищут стажеров (не повезло, а?).

CodeNation FTE (сентябрь 2018 г.):

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

Media.net Intern (декабрь 2018 г.):

Я прошел продвинутый уровень CCDSAP, что позволило мне сразу пройти во второй раунд собеседований. Раунд был основан на DSA продолжительностью около часа, в течение которого мне задали графическую задачу с DSU, это заняло у меня все время собеседования, но я смог ее решить. Итак, я прошел интервью и дошел до последнего интервью. Мое счастье было недолгим, так как в финальном раунде меня жарили 2 часа подряд. Он охватывал СУБД (прошло хорошо), проект (было хорошо), Системный дизайн (облажался). И снова меня отвергли.

Google UK (ноябрь 2018 г. - март 2019 г.):

Вероятно, для этого вы читаете блог. Собеседование в Google было долгим процессом. Я занимал 36-е место в глобальном рейтинге Google в кикстарте E (август 2018 г.) и ожидал, что через него позвонят, но этого не произошло. В один случайный ноябрьский день я получил письмо от рекрутера Google EU, который наткнулся на мой профиль на Hackerrank. У нас был короткий разговор, и я был назначен на онлайн-собеседование по программированию на середину декабря. Так как это было также, когда я готовился к ICPC (я много практиковался для этого в соревнованиях по кодированию), мне захотелось убить двух зайцев одним выстрелом!

Примечание. Мне не разрешено делиться проблемами, поэтому я буду ссылаться только на категории, к которым они относятся.

Онлайн-тур 1 (Кодирование):

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

Онлайн-раунд 2 (Кодирование):

Я подготовился к этому раунду, используя обычную стратегию «Участие в соревнованиях по программированию», но также дал несколько пробных интервью по Pramp и немного больше сосредоточился на написании более структурированного кода. На собеседовании мне задали 2 задачи, первая была основана на связанных списках, а вторая была более интересной математической задачей. Я смог решить обе проблемы с помощью приличных реализаций и очистить раунд. Меня вызвали на собеседование (4 кодирования + 1 дизайн системы), и мне дали еще месяц на подготовку.

Я подготовился к собеседованию на месте, прочитав и просмотрев множество видеороликов о проектировании системы (после моего опыта работы в Media.net я не собирался относиться к этому легкомысленно). Я также решил множество проблем с собеседованием в Google на Interviewbit, после чего провел несколько фиктивных собеседований.

Выездные туры:

Я не очень пунктуальный человек, но определенно не из тех, кто опаздывает на такое важное мероприятие. Я был в офисе Google в нужное время, НО не в том офисе Google. Я не знал, что у Google есть 2 офиса в Лондоне, всего в паре миль друг от друга, а это означало, что мне пришлось спешить в нужный офис, в результате я опоздал, что меня очень беспокоило, но интервьюер был очень вежлив и перенесен на другой день. первое собеседование после последнего (очевидно, он совершил ту же ошибку, что и я, во время его интервью).

Раунд 1 (кодирование):

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

Раунд 2 (проектирование системы):

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

Раунд 3 (кодирование):

Проблема, заданная в этом раунде, была связана с двоичным поиском, хотя я смог решить эту проблему, но меня спросили о распараллеливании кода для устранения узкого места, что я действительно не знал, как это сделать. Этот раунд, наверное, был моим худшим раундом.

Раунд 4 (кодирование):

Это был мой любимый раунд. У него была хорошая проблема DP с некоторыми умными оптимизациями. В отличие от других раундов, меня попросили реализовать действительно наивное решение, а затем спросили об оптимизации отдельных компонентов. Это было довольно весело, и в какой-то момент интервьюер даже сказал: «Не многие люди могут получить такую ​​оптимизацию», что было действительно приятно услышать.

Раунд 5 (кодирование):

Это был последний раунд, мне задали задачу с деревом, у которой было довольно интуитивно понятное решение, за которым последовали некоторые дополнительные вопросы с небольшими изменениями.

На оценку у них ушла пара недель, и мне предложили работу SWE-SRE в Google UK.

Предложения по соревновательному программированию

Честно говоря, в Интернете доступно множество ресурсов, и мне действительно нечего добавить. Просто продолжайте практиковаться, решайте проблемы и получайте удовольствие! Не беспокойтесь о неудачах и отказах, они только сделают вас сильнее. Вот несколько хороших блогов о соревновательном программировании:

Начало работы в спорте соревновательного программирования

Как подготовиться к соревновательному программированию?

Как я могу научиться соревновательному программированию?

Прежде чем закончить блог, я хотел бы поблагодарить нескольких программистов:

Mehul_Dholiya: за то, что я начал заниматься соревновательным программированием.

Ашишгуп: за размещение гибридных приложений и помощь в тренировках.

Vivek_1998299: за то, что был отличным товарищем по команде и соперником.

SwetankModi: За то, что всегда делится своим гьяаном (особенно перед интервью).

Sinus_070: за его поддержку и помощь на протяжении всего собеседования в Google.

А также всех, кто помогал на протяжении всего путешествия! :)

📝 Прочтите этот рассказ позже в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории из области технологий, ожидающие вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .