Мы продолжаем рассказывать истории выпускников 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.

Награждение чемпионов ACM ICPC 2014. Егор в красной футболке слева.
Награждение чемпионов ACM ICPC 2014. Егор в красной футболке слева.

На этом моя история с олимпиадным программированием почти закончилась: мы выиграли финал ICPC, дальше стремиться было некуда. Я ещё периодически писал какие-то контесты года до 2019, но скорее в качестве хобби.   

Computer Science Center

Параллельно разворачивалась вторая история — с промышленной разработкой. Когда я поступал в университет, среди моих знакомых было распространено такое мнение: математике учат везде, программированию не учат нигде. Если ты хочешь стать приличным программистом, есть две опции. Первая — поступаешь в университет, во время учёбы идёшь работать и получаешь нормальный промышленный опыт там. Вторая — поступаешь в университет, а курсе на втором-третьем —  в CS центр, и именно там тебя учат программировать, а не решать интегралы. Для себя я выбрал вторую опцию.

Я поступил в Computer Science Center летом после первого курса. Университет и центр были двумя параллельными историями: в СПбГУ я учился для того, чтобы с ребятами участвовать в олимпиадах, а в CS центре для того, чтобы получать реальные знания. Совмещать мне всегда было довольно комфортно, я не помню, чтобы центр отнимал безумное количество времени. Все курсы, которые я брал, были классными. 

Постфактум могу сказать, что большое влияние на меня оказали два курса. Первый — по С++, — вёл Валерий Лесин. Весной 2019 я с удовольствием прошёл обновлённую версию этого курса ещё раз. Сейчас я сам преподаю плюсы в Питерской Вышке, и о многом, что рассказываю студентам, впервые узнал как раз от Валеры. 

Второй курс — программирование на Python от Сергея Лебедева. Он был просто потрясающе организован с точки зрения домашек, лекций и презентаций. Преподаватели очень активно смотрели на код и рассказывали, что с ним так или не так. Наверное, этот курс вообще один из самых лучших, что я когда-либо видел. К сожалению, насколько я знаю, Серёжа переехал и больше в CS центре не ведет.

На мой взгляд, CS центр — это не место обучения программированию с нуля. Чтобы туда поступить, нужно уже что-то знать и уметь. Если ваша цель — чуть-чуть позаниматься, чтобы взяли на хорошую работу, то центр вам не нужен. А вот если хочется впрягаться ради программирования, то рекомендую. Главное, подумайте заранее, как вы будете совмещать учёбу с университетом, работой или семьёй.

Перепоступление в Академический университет

После двух курсов я отчислился из СПбГУ, потому что разочаровался в происходящем, и перепоступил на только что открывшуюся бакалаврскую программу в Академический университет. Я слышал, что её делает довольно близкая к CS центру команда. Кажется, даже чуть-чуть подумал, а нужно ли продолжать обучение в центре, но остался — и правильно сделал. Мне даже перезачли несколько курсов центра: тот самый по плюсам (хотя в АУ их вёл другой преподаватель), часть восхитительного курса по функциональному программированию от Дениса Москвина (он вёл его и в CSC, и в АУ с небольшими отличиями) и, кажется, по алгоритмам. Ещё я совмещал некоторые проекты: делал один НИР и защищал его и там, и там. Было удобно.

Я ничуть не жалею, что решил перепоступить спустя два года. Так у меня получилось два прекрасных места с реальными знаниями и ноль с ненужной бюрократией, ещё и красный диплом впридачу. Вообще идеально: сначала два года на ICPC, а потом четыре года на нормальное обучение в отличной компании, ничего лишнего, никакой тоски и уныния, прекрасная атмосфера.

Куда поступать в 2022:

На мой взгляд сейчас в России есть пять топовых программ бакалавриата. Три из них в Петербурге, две — в Москве.

  1. «Прикладная математика и информатика» в НИУ ВШЭ — Санкт-Петербург;

  2. «Современное программирование» на Факультете математики и компьютерных наук СПбГУ;

    * обе эти программы являются преемницами кафедры математики и информационных технологий в Академическом университете, но отличий между собой уже накопили.

  3. «Информатика и программирование» в Университете ИТМО (раньше была известна как кафедра КТ);

  4. «Прикладная математика и информатика» на ФКН НИУ ВШЭ;

  5. «Прикладная математика и компьютерные науки» ФПМИ МФТИ

Все эти программы лютые по нагрузке: везде грузят, везде фигачат. На них бешеные конкурсы и подходят они не всем. Если у вас есть возможность попасть на одну из этих программ — по олимпиадам, по баллам, по деньгам — очень советую внимательно изучить их особенности и выбрать ту, которая подходит вам по концепции. Например, в Вышке есть две программы — в Петербурге и Москве — но общего у них только название направления.

С удовольствием хочу отметить, что сейчас выбор стал гораздо богаче. Когда я поступал в 2012 году, общее ощущение было такое: не важно, куда ты идешь, потому что программировать не научат нигде, для этого надо идти в CS центр или ШАД в зависимости от города. А сейчас у ребят действительно есть и выбор, и главное — этот выбор сделать правильно.

После окончания «олимпиадной карьеры» у меня появилось свободное время летом: я перестал ездить на сборы, а значит, можно было заняться чем-то приятным и полезным. Например, стажировками. 

Стажировки

На первую полноценную стажировку я поехал летом 2015 года, после первого курса АУ. Любопытно, что подкинул идею и помог с рефералом случайный знакомый с Codeforces. Я подавался в несколько компаний: Asana, Google, Facebook, Dropbox — на олимпиадном опыте прошел отбор и получил все четыре оффера. Самым сложным оказалось выбрать. Я ещё несколько раз созванивался с сотрудниками компаний, чтобы узнать побольше про стажировку, мою потенциальную команду и задачи.

Для первого раза выбрал Asana в Сан-Франциско. Помню, что мне очень понравилось происходящее на стажировке (вот тут есть милый блог-пост с отзывами того года). Всё было по-настоящему: есть офис, куда я хожу, есть рабочие задачи, которые я решаю, есть команда, с которой я что-то обсуждаю. Есть рояль и молочный шоколад, а после запроса (разумеется, через Asana) появился ещё и яблочный сок. Я ощущал себя программистом-программистом, и это ощущение мне очень понравилось. 

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

Что у меня в итоге получилось? Как уже сказал выше, я начал с Asana в СФ, в следующем году поехал в Google в Кембридж — это на другом побережье США. Ещё через год планировал стажировку в Facebook в Лондоне, но мой оффер отозвали из-за, скажем так, некоторого недопонимания с договором (сейчас бы я, конечно, действовал по-другому). Примерно на такой случай у меня снова был оффер в Google, но уже в штаб-квартиру в Маунтин-Вью. В целом, я не расстроился, потому что опыт всё равно получился разносторонний: если в первый раз я работал над проектом с открытым исходным кодом, то во второй год был уже чисто внутригугловский движ.

Стажировка в Google в Кембридже, США
Стажировка в Google в Кембридже, США

Дальше был 2018 год — год выпуска. Весь последний курс мне написывали рекрутёры, отмазка «я же ещё учусь и не могу к вам на full-time» перестала действовать. К февралю у меня на руках было несколько офферов в разные компании из Лондона и Берлина. Я думал, выбирал и в конце концов понял, что это не то, чем я хочу заниматься. В итоге решил пойти в магистратуру, а один из офферов удачно конвертировался в летнюю стажировку. Так мои стажировки продлились ещё на два года. Кстати, это была идея одного из рекрутёров: «Не хочешь на full-time? А что ты там про стажировки говорил?»

В итоге в 2018 я поехал в Лондон в компанию GSA Capital. В 2019 — в Берлин в think-cell. С ними вообще получилось интересно. Где-то зимой 2018 знакомый прислал мне ссылку на вакансию этой компании, где в описании висело следующее: «Любите алгоритмы? Любите красивый код? Любите C++?» Я подумал: «Да, три из трех, это про меня». Написал им, мне ответили. Кстати, это была единственная компания, с которой я связывался самостоятельно, а не через реферала, и мне после этого ответили. Вообще вакансия была на фултайм, и я раздумывал, не поехать ли в Берлин вместо второго года магистратуры. Но удалось провернуть тот же трюк, что и в прошлом году: после мыслей: «Где бы постажироваться, чтобы было вот как в think-cell, но у них же нет стажировок», — снизошло озарение. Я попросился на стажировку — и они согласились. Поездка оказалась очень удачной, потому что я занимался проектом, который потом превратился в мою магистерскую диссертацию.

В общем, за время учёбы я успел съездить на пять стажировок (на самом деле была ещё одна, в Южной Корее в Samsung, но такая странная, что я предпочитаю о ней лишний раз не вспоминать). Это был реально классный опыт, и я советую всем подаваться на такие программы.

Вот десять советов, как готовиться к отбору на стажировки:
  1. Перестаньте думать, что это только для медалистов ICPC и IOI или для студентов Лиги плюща. Один Google каждый год набирает тысячи стажёров по всему миру. Да, процесс рандомизирован, но попробовать стоит.

  2. Мысленно примите правила игры. Отбор на стажировку длинный, с алгоритмическими собеседованиями, да ещё и в разных компаниях разные процессы. Например, раньше в Google ты принимал оффер на конкретный проект в конкретной команде, а в Facebook — в офис без конкретного проекта. Как сейчас — не знаю. Если вам это не по душе, возможно, есть и другие, менее известные компании с другими процессами.

  3. Найдите кого-нибудь, кто недавно стажировался, в идеале со старших курсов вашей же образовательной программы. У вас наверняка есть общий опыт, общие сомнения, общие проблемы и их общие решения. Можно узнать специфику оформления нужных бумаг в вашем университете/городе/стране. Например, налогов: при прогрессивной ставке в США/Германии/Великобритании часть оплаченных там налогов можно вернуть. Правда, до уровня НДФЛ в России всё равно придётся доплатить.

  4. Присоединитесь к сообществу о стажировках в соцсетях, чтобы быть в курсе происходящего. Я — один из модераторов Telegram-чата sns_internships, там почти шесть тысяч человек, но наверняка есть и другие группы.

  5. Поизучайте теорию. Что-то есть в FAQ и ссылках групп, что-то гуглится на Reddit, много у каких бывших и текущих стажёров есть свои блоги с подробностями. Можете начать с рассказа Ирины Карацаповой и её гайда, про доковидные времена можно почитать пост моего однокурсника Юрия Ребрика. Стажировки бывают разные, не все доступны всем. В зарубежные компании отбор идёт в начале осени, то есть уже в разгаре или даже завершается. А если вы в РФ, можно попробоваться в российские компании: JetBrains, Яндекс, Тинькофф и другие — у них обычно отбор весной.

  6. Напишите хорошее резюме под конкретную страну, куда подаётесь. У студентов из РФ очень часто проблемы, чтобы описать, что именно они сделали в определенном проекте. Не «работал работу» и «закрывал баги», а «сделал фичи X, Y, Z, улучшил метрики на 10%». Даже про небольшую игру в крестики-нолики можно и нужно написать красиво. Кстати, в первых резюме я указывал проекты из Computer Science Center.

  7. Подготовьтесь к собеседованиям, даже если у вас всё отлично с решением алгоритмических задач. Собеседование — это не про правильное решение заданий, это некоторая игра с известными неявными правилами. Компания пытается отобрать себе каких-то стажёров. Вы пытаетесь попасть на стажировку и за 40-45 минут у вас принципиально не получится показать себя целиком, поэтому ограничьтесь привычными форматами. А для этого надо эти форматы изучить.

  8. Пройдите как можно больше mock-собеседований. Можно даже не конкретно к стажировкам, а просто алгоритмические секции. Есть бесплатные платформы вроде Pramp, где кандидаты собеседуют друг друга. Как минимум получится потренировать нервы и привыкнуть к формату. Обычно нельзя молча написать идеально корректное решение, важнее пообщаться с собеседующим.

  9. Подавайтесь в несколько компаний и помните, что процесс случайный. Много где просто проигнорируют, где-то закроют позицию перед оффером. Где-то покажется, что вы не решили задачу, но вас пригласят на следующий этап. Где-то покажется, что решили идеально, но придёт отказ. Это может не иметь никакого отношения к вашему реальному уровню. Заявок много, мест мало.

  10. Подумайте, как вы будете совмещать стажировку с университетом. Обычно стажировка длится три месяца, то есть пересекается либо с сессией в июне, либо с учёбой в сентябре. В зависимости от университета может потребоваться сдать какие-то экзамены досрочно и договориться с преподавателями, что в сентябре вас не будет.

Чем я занимаюсь сейчас

В 2020 году я окончил магистратуру. Последний год маги активно помогал с первокурсниками бакалавриата: взял на себя часть административной нагрузки, вёл лекции по плюсам и курс по «Основам программирования». Всё вместе это оказалось очень и очень большой работой, поэтому к концу магистратуры я хотел только в тюлений отпуск на море. Я решил немного передохнуть следующий год: оказался от всех предложений о работе, но остался преподавать. Подумал, что если станет скучно — пойду на фултайм. Но скучно так и не стало. И уже второй год я веду большой курс по C++ у студентов бакалавриата как основной лектор. 

Для меня преподавание — это вклад во что-то хорошее и правильное. Когда мне достался курс по плюсам, я его местами обновил, местами переделал, местами, возможно, зря переделал. Но все равно есть ощущение, что это моё детище, которое вроде как кому-то полезно.

Немного расскажу, каких принципов в преподавании я придерживаюсь

На лекциях и практиках хочется, чтобы студенты задавали как можно больше вопросов, потому что это плюс-минус единственный способ, как я могу отрегулировать понятность своих объяснений. Например, мне какая-то концепция может казаться очевидной, и поэтому я коснуть её вскользь, а ребята не поймут, постесняются уточнить и с большой вероятностью пропустят всё, что будет идти дальше. Поэтому я периодически стараюсь задавать вопросы на понимание и считаю, что откатиться в лекции немного назад — это совершенно нормально. Я очень радуюсь, когда студенты заваливают вопросами. Это значит, что аудитория меня слушает. 

В качестве домашек я даю задания, похожие на те, что им встретятся в реальном мире. Я против написания какого-то абстрактного кода с искусственными ограничениями, когда нельзя объяснить, откуда то или иное ограничение взялось (хотя иногда, к сожалению, приходится). Например, если у нас тема многопоточности, то я рассказываю, зачем она нужна в этой домашке и почему без неё либо никак, либо сложнее. Я никогда не буду объяснять ООП как «наследование, полиморфизм, инкапсуляция» c примером автобуса, машины, двигателя и колёс

Но самое главное — это code review. Проверять домашки и вести практики мне помогают примерно десять человек: студенты старших курсов, выпускники, знакомые (а иногда и незнакомые) взрослые программисты. Они смотрят код и помогают студентам написать то же самое, только в два раза короче и в четыре раза понятнее.  На лекциях и практиках всего не расскажешь, и в программировании вообще много чего передаётся в таком средневековом стиле «от мастера к ученику» как раз в процессе рецензирования кода.

Месяц назад я начал парт-тайм работать в компании Zenith — это калифорнийский стартап на ранней стадии. Их основной продукт — перенос системы управления базами данных PostgreSQL в облако как serverless продукт. Чем-то похоже на Amazon Aurora, но с полной совместимостью с PostgreSQL, потому что используется ровно тот же код. Я пока что погружаюсь в исходный код, добавляю мелкие фичи и пытаюсь понять, почему же на лекциях по распределённым системам алгоритмы консенсуса были чем-то сложным, а тут уже написана своя вариация и предположительно работает. Как вникну, наверняка окажется, что надо либо явно задокументировать какие-то предположения, которые делают задачу проще, либо есть алгоритмические проблемы, которые надо исправить. Очень приятно снова просто писать и отлаживать код, а не отлаживать баг в тулинге C++ при подготовке очередной лекции или по мотивам вопросов студентов.

В качестве заключения: как мне помогло олимпиадное программирование

Споры о (бес)полезности олимпиад ведутся с начала времён. Например, вот отличный пост десятилетней давности от Михаила Мирзаянова. Я считаю, что олимпиады — безумно специфичная штука, но не бессмысленная. На олимпиадах дается чётко сформулированная задача с очень жёсткой автоматизированной системой проверки. И не одна задача, а много, поэтому на олимпиадах можно хорошо отточить умение писать корректный код с первых попыток. Мне кажется, что это крайне полезный навык. Конечно, его можно получить и вне олимпиад, но нужно много практики. 

Есть и другие положительные эффекты. Например, способность в течение пяти часов концентрироваться на одной задаче просто мастхэв на олимпиадах. Это может оказаться полезным, когда до дедлайна как раз пять часов. С другой стороны, они совершенно не дают навыка работать над задачей полгода. Ещё олимпиады учат оценивать время работы и корректность решения задач, проходить собеседования. У меня с собеседованиями всегда получалось немного нечестно: обычно на технических интервью дают решать несложные алгоритмические задачки. А когда ты много участвовал в олимпиадах, смотришь на них — и тебе всё очевидно. Остаётся лишь выучить формат собеседования и нужные фразы.

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

Комментарии (2)


  1. aplatov
    22.10.2021 23:17
    +3

    Автор большой молодец, прочитал вашу мини биографию с удовольствием


  1. yeputons
    23.10.2021 21:09
    +1

    Уточнение к любым моим советам из интервью: они, конечно же, в основном основаны на моём опыте. Мне много где сильно повезло с обстоятельствами. Если у вас другие обстоятельства, какие-то мои рекомендации могут оказаться лично вам даже вредны (sic!)

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