Мы продолжаем рассказывать истории выпускников Computer Science Center. Сегодняшний герой — Егор Суворов — работает в калифорнийском стартапе Zenith и преподает курс по C++ в петербургском кампусе НИУ ВШЭ. Егор — олимпиадник, в 2014 году в составе команды СПбГУ он стал чемпионом ACM ICPC. А вот свои первые существенные шаги в промышленном программировании сделал благодаря CS центру.
Егор рассказал, почему начал участвовать в олимпиадах, где ему пригодился этот опыт и как он ушёл из олимпиад в промышленную разработку. А ещё дал советы, как проходить отборы на стажировки и где сейчас в России стоит учиться программированию.
Примечание: это интервью, но мы оформили его как прямую речь Егора.
Школьные годы: первое место на Всеросе и золото на Межнаре
Я из Петербурга. Программированием увлёкся в первом классе. Где-то прочитал, что за это много платят (да-да, в первом классе), и мне стало интересно. Родители отвели на кружок в Аничков дворец. Помню, сначала я программировал на Logo, позже на Visual Basic и на Pascal. Всё это мне очень нравилось.
В начале пятого класса мне подсказали, что программистам нужна математика, я удачно выступил на открытой олимпиаде матцентра 239 и поступил туда. Параллельно стал заниматься именно олимпиадным программированием. Я неплохо решал задачки, что было довольно необычно для моего возраста. Меня быстро взяли на Санкт-Петербургские сборы, а уже в шестом классе я впервые попал на Всерос.
На Всеросе по информатике я выступал жутко нестабильно. В первый раз мне не хватило буквально пары баллов до диплома 3-й степени. В седьмом классе я взял диплом 2-й степени, в восьмом не взял ничего. В девятом вообще пропустил первый тур регионального этапа олимпиады. Я тогда учился экстерном, и просто не знал, что начался отбор. И за олимпиадами особо в тот год не следил — попробовал заниматься разработкой на PHP для знакомых. Понял, что всё прошляпил, когда вечером стали писать знакомые ребята с вопросом, как сегодняшний тур. Я очень расстроился и решил, что надо начать нормально готовиться к олимпиадам. В десятом классе занял второе место: меня обогнал Дима Егоров, мой будущий сокомандник по ICPC. Дима на тот момент занимался олимпиадным программированием всего год, но был очень мощным математиком. И в одиннадцатом классе я уже занял первое место.
Два раза я участвовал в Межнаре по информатике — The International Olympiad in Informatics. В десятом классе выступил на свой вкус довольно плохо: был 44-м и последним в команде РФ, это серебряная медаль. А в 2012 году, когда оканчивал школу, получилось стать пятым и взять золотую медаль. Первый тур можно было решить лучше, зато второй тур спас — его я закрыл на полный балл.
Учёба в СПбГУ и победа в ACM ICPC-2014
После окончания школы передо мной особо не стоял выбор, куда пойти. Тогда были только ИТМО и матмех СПбГУ, ни о каком Академическом университете или Вышке речи ещё не шло.
Я выбрал СПбГУ, потому что там была команда для ICPC — второкурсники Дима Егоров и Паша Кунявский. Мы тренировались весь год, и летом 2013 поехали на наш первый финал. К большому огорчению, слили его, получив серебряную медаль. Следующий курс тренировались ещё больше — три раза в неделю по пять часов командные тренировки и отдельно — личные. Это дало свои плоды: в 2014 мы стали чемпионами ACM ICPC.
На этом моя история с олимпиадным программированием почти закончилась: мы выиграли финал ICPC, дальше стремиться было некуда. Я ещё периодически писал какие-то контесты года до 2019, но скорее в качестве хобби.
Computer Science Center
Параллельно разворачивалась вторая история — с промышленной разработкой. Когда я поступал в университет, среди моих знакомых было распространено такое мнение: математике учат везде, программированию не учат нигде. Если ты хочешь стать приличным программистом, есть две опции. Первая — поступаешь в университет, во время учёбы идёшь работать и получаешь нормальный промышленный опыт там. Вторая — поступаешь в университет, а курсе на втором-третьем — в CS центр, и именно там тебя учат программировать, а не решать интегралы. Для себя я выбрал вторую опцию.
Я поступил в Computer Science Center летом после первого курса. Университет и центр были двумя параллельными историями: в СПбГУ я учился для того, чтобы с ребятами участвовать в олимпиадах, а в CS центре для того, чтобы получать реальные знания. Совмещать мне всегда было довольно комфортно, я не помню, чтобы центр отнимал безумное количество времени. Все курсы, которые я брал, были классными.
Постфактум могу сказать, что большое влияние на меня оказали два курса. Первый — по С++, — вёл Валерий Лесин. Весной 2019 я с удовольствием прошёл обновлённую версию этого курса ещё раз. Сейчас я сам преподаю плюсы в Питерской Вышке, и о многом, что рассказываю студентам, впервые узнал как раз от Валеры.
Второй курс — программирование на Python от Сергея Лебедева. Он был просто потрясающе организован с точки зрения домашек, лекций и презентаций. Преподаватели очень активно смотрели на код и рассказывали, что с ним так или не так. Наверное, этот курс вообще один из самых лучших, что я когда-либо видел. К сожалению, насколько я знаю, Серёжа переехал и больше в CS центре не ведет.
На мой взгляд, CS центр — это не место обучения программированию с нуля. Чтобы туда поступить, нужно уже что-то знать и уметь. Если ваша цель — чуть-чуть позаниматься, чтобы взяли на хорошую работу, то центр вам не нужен. А вот если хочется впрягаться ради программирования, то рекомендую. Главное, подумайте заранее, как вы будете совмещать учёбу с университетом, работой или семьёй.
Перепоступление в Академический университет
После двух курсов я отчислился из СПбГУ, потому что разочаровался в происходящем, и перепоступил на только что открывшуюся бакалаврскую программу в Академический университет. Я слышал, что её делает довольно близкая к CS центру команда. Кажется, даже чуть-чуть подумал, а нужно ли продолжать обучение в центре, но остался — и правильно сделал. Мне даже перезачли несколько курсов центра: тот самый по плюсам (хотя в АУ их вёл другой преподаватель), часть восхитительного курса по функциональному программированию от Дениса Москвина (он вёл его и в CSC, и в АУ с небольшими отличиями) и, кажется, по алгоритмам. Ещё я совмещал некоторые проекты: делал один НИР и защищал его и там, и там. Было удобно.
Я ничуть не жалею, что решил перепоступить спустя два года. Так у меня получилось два прекрасных места с реальными знаниями и ноль с ненужной бюрократией, ещё и красный диплом впридачу. Вообще идеально: сначала два года на ICPC, а потом четыре года на нормальное обучение в отличной компании, ничего лишнего, никакой тоски и уныния, прекрасная атмосфера.
Куда поступать в 2022:
На мой взгляд сейчас в России есть пять топовых программ бакалавриата. Три из них в Петербурге, две — в Москве.
«Прикладная математика и информатика» в НИУ ВШЭ — Санкт-Петербург;
«Современное программирование» на Факультете математики и компьютерных наук СПбГУ;
* обе эти программы являются преемницами кафедры математики и информационных технологий в Академическом университете, но отличий между собой уже накопили.
«Информатика и программирование» в Университете ИТМО (раньше была известна как кафедра КТ);
«Прикладная математика и информатика» на ФКН НИУ ВШЭ;
«Прикладная математика и компьютерные науки» ФПМИ МФТИ
Все эти программы лютые по нагрузке: везде грузят, везде фигачат. На них бешеные конкурсы и подходят они не всем. Если у вас есть возможность попасть на одну из этих программ — по олимпиадам, по баллам, по деньгам — очень советую внимательно изучить их особенности и выбрать ту, которая подходит вам по концепции. Например, в Вышке есть две программы — в Петербурге и Москве — но общего у них только название направления.
С удовольствием хочу отметить, что сейчас выбор стал гораздо богаче. Когда я поступал в 2012 году, общее ощущение было такое: не важно, куда ты идешь, потому что программировать не научат нигде, для этого надо идти в CS центр или ШАД в зависимости от города. А сейчас у ребят действительно есть и выбор, и главное — этот выбор сделать правильно.
После окончания «олимпиадной карьеры» у меня появилось свободное время летом: я перестал ездить на сборы, а значит, можно было заняться чем-то приятным и полезным. Например, стажировками.
Стажировки
На первую полноценную стажировку я поехал летом 2015 года, после первого курса АУ. Любопытно, что подкинул идею и помог с рефералом случайный знакомый с Codeforces. Я подавался в несколько компаний: Asana, Google, Facebook, Dropbox — на олимпиадном опыте прошел отбор и получил все четыре оффера. Самым сложным оказалось выбрать. Я ещё несколько раз созванивался с сотрудниками компаний, чтобы узнать побольше про стажировку, мою потенциальную команду и задачи.
Для первого раза выбрал Asana в Сан-Франциско. Помню, что мне очень понравилось происходящее на стажировке (вот тут есть милый блог-пост с отзывами того года). Всё было по-настоящему: есть офис, куда я хожу, есть рабочие задачи, которые я решаю, есть команда, с которой я что-то обсуждаю. Есть рояль и молочный шоколад, а после запроса (разумеется, через Asana) появился ещё и яблочный сок. Я ощущал себя программистом-программистом, и это ощущение мне очень понравилось.
Появилось желание за время учёбы постажироваться в разных компаниях, потому что стажировка — это реально уникальная возможность, которая доступна только студентам или свежим выпускникам. Ты можешь три месяца поработать в компании, и вы оба понимаете, что через эти три месяца всё закончится. У тебя нет никаких долгосрочных обязательств. При этом ты можешь куда-то поехать (ну точнее мог в доковидные времена) и попробовать пожить в разных странах, поработать в компаниях разного размера и с разной корпоративной культурой. В общем, я решил по-максимуму использовать эту возможность.
Что у меня в итоге получилось? Как уже сказал выше, я начал с Asana в СФ, в следующем году поехал в Google в Кембридж — это на другом побережье США. Ещё через год планировал стажировку в Facebook в Лондоне, но мой оффер отозвали из-за, скажем так, некоторого недопонимания с договором (сейчас бы я, конечно, действовал по-другому). Примерно на такой случай у меня снова был оффер в Google, но уже в штаб-квартиру в Маунтин-Вью. В целом, я не расстроился, потому что опыт всё равно получился разносторонний: если в первый раз я работал над проектом с открытым исходным кодом, то во второй год был уже чисто внутригугловский движ.
Дальше был 2018 год — год выпуска. Весь последний курс мне написывали рекрутёры, отмазка «я же ещё учусь и не могу к вам на full-time» перестала действовать. К февралю у меня на руках было несколько офферов в разные компании из Лондона и Берлина. Я думал, выбирал и в конце концов понял, что это не то, чем я хочу заниматься. В итоге решил пойти в магистратуру, а один из офферов удачно конвертировался в летнюю стажировку. Так мои стажировки продлились ещё на два года. Кстати, это была идея одного из рекрутёров: «Не хочешь на full-time? А что ты там про стажировки говорил?»
В итоге в 2018 я поехал в Лондон в компанию GSA Capital. В 2019 — в Берлин в think-cell. С ними вообще получилось интересно. Где-то зимой 2018 знакомый прислал мне ссылку на вакансию этой компании, где в описании висело следующее: «Любите алгоритмы? Любите красивый код? Любите C++?» Я подумал: «Да, три из трех, это про меня». Написал им, мне ответили. Кстати, это была единственная компания, с которой я связывался самостоятельно, а не через реферала, и мне после этого ответили. Вообще вакансия была на фултайм, и я раздумывал, не поехать ли в Берлин вместо второго года магистратуры. Но удалось провернуть тот же трюк, что и в прошлом году: после мыслей: «Где бы постажироваться, чтобы было вот как в think-cell, но у них же нет стажировок», — снизошло озарение. Я попросился на стажировку — и они согласились. Поездка оказалась очень удачной, потому что я занимался проектом, который потом превратился в мою магистерскую диссертацию.
В общем, за время учёбы я успел съездить на пять стажировок (на самом деле была ещё одна, в Южной Корее в Samsung, но такая странная, что я предпочитаю о ней лишний раз не вспоминать). Это был реально классный опыт, и я советую всем подаваться на такие программы.
Вот десять советов, как готовиться к отбору на стажировки:
Перестаньте думать, что это только для медалистов ICPC и IOI или для студентов Лиги плюща. Один Google каждый год набирает тысячи стажёров по всему миру. Да, процесс рандомизирован, но попробовать стоит.
Мысленно примите правила игры. Отбор на стажировку длинный, с алгоритмическими собеседованиями, да ещё и в разных компаниях разные процессы. Например, раньше в Google ты принимал оффер на конкретный проект в конкретной команде, а в Facebook — в офис без конкретного проекта. Как сейчас — не знаю. Если вам это не по душе, возможно, есть и другие, менее известные компании с другими процессами.
Найдите кого-нибудь, кто недавно стажировался, в идеале со старших курсов вашей же образовательной программы. У вас наверняка есть общий опыт, общие сомнения, общие проблемы и их общие решения. Можно узнать специфику оформления нужных бумаг в вашем университете/городе/стране. Например, налогов: при прогрессивной ставке в США/Германии/Великобритании часть оплаченных там налогов можно вернуть. Правда, до уровня НДФЛ в России всё равно придётся доплатить.
Присоединитесь к сообществу о стажировках в соцсетях, чтобы быть в курсе происходящего. Я — один из модераторов Telegram-чата sns_internships, там почти шесть тысяч человек, но наверняка есть и другие группы.
Поизучайте теорию. Что-то есть в FAQ и ссылках групп, что-то гуглится на Reddit, много у каких бывших и текущих стажёров есть свои блоги с подробностями. Можете начать с рассказа Ирины Карацаповой и её гайда, про доковидные времена можно почитать пост моего однокурсника Юрия Ребрика. Стажировки бывают разные, не все доступны всем. В зарубежные компании отбор идёт в начале осени, то есть уже в разгаре или даже завершается. А если вы в РФ, можно попробоваться в российские компании: JetBrains, Яндекс, Тинькофф и другие — у них обычно отбор весной.
Напишите хорошее резюме под конкретную страну, куда подаётесь. У студентов из РФ очень часто проблемы, чтобы описать, что именно они сделали в определенном проекте. Не «работал работу» и «закрывал баги», а «сделал фичи X, Y, Z, улучшил метрики на 10%». Даже про небольшую игру в крестики-нолики можно и нужно написать красиво. Кстати, в первых резюме я указывал проекты из Computer Science Center.
Подготовьтесь к собеседованиям, даже если у вас всё отлично с решением алгоритмических задач. Собеседование — это не про правильное решение заданий, это некоторая игра с известными неявными правилами. Компания пытается отобрать себе каких-то стажёров. Вы пытаетесь попасть на стажировку и за 40-45 минут у вас принципиально не получится показать себя целиком, поэтому ограничьтесь привычными форматами. А для этого надо эти форматы изучить.
Пройдите как можно больше mock-собеседований. Можно даже не конкретно к стажировкам, а просто алгоритмические секции. Есть бесплатные платформы вроде Pramp, где кандидаты собеседуют друг друга. Как минимум получится потренировать нервы и привыкнуть к формату. Обычно нельзя молча написать идеально корректное решение, важнее пообщаться с собеседующим.
Подавайтесь в несколько компаний и помните, что процесс случайный. Много где просто проигнорируют, где-то закроют позицию перед оффером. Где-то покажется, что вы не решили задачу, но вас пригласят на следующий этап. Где-то покажется, что решили идеально, но придёт отказ. Это может не иметь никакого отношения к вашему реальному уровню. Заявок много, мест мало.
Подумайте, как вы будете совмещать стажировку с университетом. Обычно стажировка длится три месяца, то есть пересекается либо с сессией в июне, либо с учёбой в сентябре. В зависимости от университета может потребоваться сдать какие-то экзамены досрочно и договориться с преподавателями, что в сентябре вас не будет.
Чем я занимаюсь сейчас
В 2020 году я окончил магистратуру. Последний год маги активно помогал с первокурсниками бакалавриата: взял на себя часть административной нагрузки, вёл лекции по плюсам и курс по «Основам программирования». Всё вместе это оказалось очень и очень большой работой, поэтому к концу магистратуры я хотел только в тюлений отпуск на море. Я решил немного передохнуть следующий год: оказался от всех предложений о работе, но остался преподавать. Подумал, что если станет скучно — пойду на фултайм. Но скучно так и не стало. И уже второй год я веду большой курс по C++ у студентов бакалавриата как основной лектор.
Для меня преподавание — это вклад во что-то хорошее и правильное. Когда мне достался курс по плюсам, я его местами обновил, местами переделал, местами, возможно, зря переделал. Но все равно есть ощущение, что это моё детище, которое вроде как кому-то полезно.
Немного расскажу, каких принципов в преподавании я придерживаюсь
На лекциях и практиках хочется, чтобы студенты задавали как можно больше вопросов, потому что это плюс-минус единственный способ, как я могу отрегулировать понятность своих объяснений. Например, мне какая-то концепция может казаться очевидной, и поэтому я коснуть её вскользь, а ребята не поймут, постесняются уточнить и с большой вероятностью пропустят всё, что будет идти дальше. Поэтому я периодически стараюсь задавать вопросы на понимание и считаю, что откатиться в лекции немного назад — это совершенно нормально. Я очень радуюсь, когда студенты заваливают вопросами. Это значит, что аудитория меня слушает.
В качестве домашек я даю задания, похожие на те, что им встретятся в реальном мире. Я против написания какого-то абстрактного кода с искусственными ограничениями, когда нельзя объяснить, откуда то или иное ограничение взялось (хотя иногда, к сожалению, приходится). Например, если у нас тема многопоточности, то я рассказываю, зачем она нужна в этой домашке и почему без неё либо никак, либо сложнее. Я никогда не буду объяснять ООП как «наследование, полиморфизм, инкапсуляция» c примером автобуса, машины, двигателя и колёс
Но самое главное — это code review. Проверять домашки и вести практики мне помогают примерно десять человек: студенты старших курсов, выпускники, знакомые (а иногда и незнакомые) взрослые программисты. Они смотрят код и помогают студентам написать то же самое, только в два раза короче и в четыре раза понятнее. На лекциях и практиках всего не расскажешь, и в программировании вообще много чего передаётся в таком средневековом стиле «от мастера к ученику» как раз в процессе рецензирования кода.
Месяц назад я начал парт-тайм работать в компании Zenith — это калифорнийский стартап на ранней стадии. Их основной продукт — перенос системы управления базами данных PostgreSQL в облако как serverless продукт. Чем-то похоже на Amazon Aurora, но с полной совместимостью с PostgreSQL, потому что используется ровно тот же код. Я пока что погружаюсь в исходный код, добавляю мелкие фичи и пытаюсь понять, почему же на лекциях по распределённым системам алгоритмы консенсуса были чем-то сложным, а тут уже написана своя вариация и предположительно работает. Как вникну, наверняка окажется, что надо либо явно задокументировать какие-то предположения, которые делают задачу проще, либо есть алгоритмические проблемы, которые надо исправить. Очень приятно снова просто писать и отлаживать код, а не отлаживать баг в тулинге C++ при подготовке очередной лекции или по мотивам вопросов студентов.
В качестве заключения: как мне помогло олимпиадное программирование
Споры о (бес)полезности олимпиад ведутся с начала времён. Например, вот отличный пост десятилетней давности от Михаила Мирзаянова. Я считаю, что олимпиады — безумно специфичная штука, но не бессмысленная. На олимпиадах дается чётко сформулированная задача с очень жёсткой автоматизированной системой проверки. И не одна задача, а много, поэтому на олимпиадах можно хорошо отточить умение писать корректный код с первых попыток. Мне кажется, что это крайне полезный навык. Конечно, его можно получить и вне олимпиад, но нужно много практики.
Есть и другие положительные эффекты. Например, способность в течение пяти часов концентрироваться на одной задаче просто мастхэв на олимпиадах. Это может оказаться полезным, когда до дедлайна как раз пять часов. С другой стороны, они совершенно не дают навыка работать над задачей полгода. Ещё олимпиады учат оценивать время работы и корректность решения задач, проходить собеседования. У меня с собеседованиями всегда получалось немного нечестно: обычно на технических интервью дают решать несложные алгоритмические задачки. А когда ты много участвовал в олимпиадах, смотришь на них — и тебе всё очевидно. Остаётся лишь выучить формат собеседования и нужные фразы.
Мне кажется, что если хочешь быть промышленным программистом, целенаправленно заниматься олимпиадами — плохое вложение сил. В школе это ещё может быть оправдано, потому что олимпиады дают возможность поступить в приличный вуз. В университете это уже точно не нужно. Стажировка в хорошей компании или проектная деятельность точно даст больше, чем участие в олимпиадах. Жизнь гораздо разнообразнее, и лучше вкладывать силы во что-то более приближенное к промышленной разработке, чем в олимпиады.