Меня зовут Ренат Тазиев. Мне 22 года, и я разработчик.
(Пишу код на Чемпионате Урала по спортивному программированию.)
В июне я собрал вещи, сел на поезд из Оренбурга в Екатеринбург и поехал на летнюю стажировку. До этого я ни разу не проходил стажировок, не уезжал работать в другие города и не сталкивался с многотысячными компаниями. Сейчас расскажу, как решился на это, как прошёл отбор, что делал всё лето и что интересного запомнил.
Если вы студент и не знаете, нужна ли вам стажировка — добро пожаловать под кат. Год назад я тоже не знал. Поэтому мой опыт будет полезен.
Решение
Я учился на «компьютерной безопасности» в ОГУ. За пять лет я много раз слышал, что можно начать карьеру через стажировку. И даже не сомневался, что это правильный путь. Оставалось самое простое — выбрать компанию, где можно расти, а не стагнировать.
В первый раз я услышал о Контуре ещё на первом курсе. Я участвовал в Чемпионате Урала по спортивному программированию, а Контур был его спонсором. (Передаю привет всем айти-компаниям, которые сомневаются, стоит ли вкладывать деньги в мероприятия для студентов.)
А в декабре 2016 года я наткнулся на вебинар про летнюю стажировку в Контуре. Девушка с экрана обещала компенсацию переезда и проживания иногородним стажёрам, которые пройдут отбор. Я решил попробовать.
Отборная весна
25 января в ВК-сообществе Образовательных программ Контура появилась необычная новость. Искали бета-тестеров для тестового задания для backend-разработчиков. Я откликнулся и получил тестовое задание на неделю раньше, чем другие стажёры.
В отличие от несложной задачи 2016 года, в 2017 надо было спроектировать сервис статистики для многопользовательского шутера. Были высокие требования к быстродействию и ограничения на используемые технологии. Их хватило, чтобы я перечитал кучу форумов и справочников ещё до того, как начал писать код.
Отбор на стажировку проходил в две волны. У первой было меньше времени, но больше свободы в выборе технологий. Вторая волна могла работать дольше и видела разбор типичных ошибок, но у неё было больше ограничений по технологиям. Я был во второй волне, и по студенческой привычке отправил решение за несколько часов до дедлайна.
Через четыре дня пришло «письмо счастья»:
Школа юного программиста
КрешКурс начался в начале апреля. 22 участника и два преподавателя собрались на загородной базе под Екатеринбургом. Три дня нам рассказывали о чистом коде, TDD, DI-контейнерах и обработке исключений.
(Добрый и злой преподаватель КрешКурса.)
В последний день мы разбились на команды по 4–5 человек и попробовали командную разработку. Вместе с участниками в команде был один наставник, который не касался клавиатуры, а только консультировал.
Команды решали одинаковые задачи и соревновались между собой. Задача состояла из нескольких заданий, которые открывались каждые 90 минут. Каждые 15 минут мы релизили наш модуль. Задания были не столько на добавление новых функций, сколько на создание правильной архитектуры.
У каждой команды был рейтинг. Он оценивался по количеству тестов, объёму покрытия кода тестами, чистоте кода. Если код в релизной ветке не компилировался, команда теряла баллы.
(Я был в команде «Света», мы пришли в финишу третьими).
Задание закрепило все знания и навыки, полученные в предыдущие дни, и познакомило с работой в команде «в боевых условиях». КрешКурс был глотком свежего воздуха по сравнению с учёбой.
Собеседование-телемост
Двухнедельное молчание после креш-курса прервал внезапный звонок. Чтобы попасть на следующий этап, мне предложили пройти онлайн-собеседование. В нужный час по ту сторону Скайпа меня ждали три разработчика и HR. Был удивлён, когда увидел среди разработчиков знакомого человека — финалиста ACM ICPC Никиту Бурлакова, который выступал за команду ИжГТУ.
Сначала HR поинтересовалась моим опытом работы, интересами и планами на будущее. Разработчики спросили, какую последнюю книгу прочитал. Потом дали задачу: написать метод, который определяет, присутствует ли слово в файле. Я понял, что нужно показать навыки проектирования, написания чистого кода и предвидения мест для будущего расширения. После задачи мы побеседовали об алгоритмах, структурах данных и шаблонах проектирования.
Добро пожаловать в Шир
Мне сказали, что я прошёл собеседование и стал стажёром. Вы уже знаете, что после этого я сел на поезд и поехал в Екатеринбург. 3 июля попал в самый большой офис разработки.
Этот офис находится на краю города в районе, который называется «Широкая речка» или, сокращенно, ШР. Когда-нибудь он станет кремниевой долиной Урала (но это не точно), а пока тут только здания Контура, частные коттеджи, лес и пруд.
(На стройплощадке уже построили 5 этажей второго здания.)
В первый день в конференц-зале собрались все 90 стажеров. Четыре часа нас знакомили друг с другом, учили выживать в офисе, рассказывали про культуру и команды разработки. Потом был обед, экскурсия по офису и развлечения. В конце дня мы пошли в свои команды.
Я с другом попал в команду Биллинга. Мы познакомились с наставником, распаковали новую технику и запустили систему, чтобы на следующий день настроить рабочее окружение.
Команда
На первой неделе я знакомился с командой. В ней около 50 человек из трёх городов: Ижевск, Санкт-Петербург и Екатеринбург. В команду пришло восемь стажеров: четыре backend-разработчика (два в Екатеринбурге, по одному в Ижевске и Питере), два frontend-разработчика, тестировщик и аналитик.
Для нас приготовили статьи на внутренней вики и упражнения для знакомства с продуктом, который будем разрабатывать. Он автоматизирует продажи продуктов Контура. В нём работают контуровцы, компании-партнёры и пользователи продуктов.
Рассказали о целях команды, используемых технологиях и инженерных практиках. Это парное программирование (даже с разработчиками из других городов), обязательное покрытие кода тестами, непрерывное ревью кода и регулярные скрамы. Объяснили, что практики нужны, чтобы поддерживать качество, распространять знания о продукте и синхронизировать подкоманды.
(Скрам одной из подкоманд Биллинга. На телевизоре таски в Трелло.)
Я был полноправным членом команды и решал бизнес-задачи. Много времени мы с наставником знакомились с кодовой базой, рефакторили и делали ревью кода. Почти каждый день по часу просматривали код другой пары разработчиков. Тут я сделал удивительное открытие: сообщения в исключениях и комментариях можно и нужно писать на русском языке. Так они будут предельно понятны, и по сообщению в логах будет проще понять, в каком месте ошибка. А ещё я почувствовал, как ускоряет разработку ReSharper.
Другие стажёры
Со стажёрами в других командах я общался на встречах раз в две недели и на Экваторе — выездном празднике, отмечающем середину стажировки.
(Все стажёры на Экваторе в верёвочном парке.)
Мы рассказывали о своих задачах и делились опытом. Там я узнал, что не во всех командах стажеры решали боевые задачи. Некоторые занимались инфраструктурными проектами, которые используются во многих командах Контура. У некоторых были исследовательские задачи: нужно было прочитать много статей и сделать несколько прототипов для проверки технологий.
Большая задача
В августе я сделал большую фичу от начала до конца.
Некоторые пользователи Биллинга работают со списком компаний, куда можно позвонить и совершить продажу. Он очень большой, генерируется и сортируется автоматически по нетривиальным алгоритмам. С текущей реализацией была проблема: после обновления страницы со списком мог поменяться порядок сортировки, и пользователь видел совсем другие элементы списка.
Мы решили вынести код для работы со списками в отдельный микросервис. Я обсудил с наставником, какими возможностями и интерфейсами должен обладать сервис. Наставник показал мне, как проектировать, а узнал, что документацией может быть не пачка UML-диаграмм и сценариев, а наброски на стикерах.
Мы добавили в микросервис троттлинг запросов. Это была новая технология, поэтому презентовали её команде. Рассказали, как можно использовать троттлинг в других микросервисах.
В команде принято сначала писать код, а потом тесты. Причина такая: в enterprise-разработке часто нельзя сразу выбрать правильную архитектуру и детали реализации. Можно написать код и потом сразу покрыть его тестами. Так можно сэкономить время, потому что не придётся поддерживать тесты в актуальном состоянии во время рефакторинга. Когда пришло время писать тесты, наставник показал мне доклад xoposhiy о вреде моков и рассказал о достоинствах интеграционного тестирования.
Ещё нам было важно понимать, насколько мы улучшили жизнь пользователей. Поэтому мы добавили сбор метрик: например, количества запросов к спискам и времени их загрузки. Микросервис отправляет метрики в Graphite, а мы смотрим на красивые графики в Grafana и анализируем поведение кода.
Финальная конференция
К конце все стажёры участвуют в Финальной конференции: рассказывают, какие задачи решали и чего достигли. Пришли послушать не только стажёры и их наставники, но и другие разработчики.
Было жюри, оно выбрало три лучших доклада. Награду за «лучший пиар проекта» получил стажёр, который рассказал о способах использования Houston — внутренней системы для деплоя и
Итоги стажировки
Я чувствовал себя не стажером, а полноценным разработчиком, который приносит пользу команде и компании наравне со всеми. Была дружеская атмосфера, и никто не сомневался в наших способностях.
За два месяца я поработал над 8 задачами, сделал 180 коммитов, два раза выложил релиз. Прочитал 35 технических статей, две книги, посмотрел больше 30 часов видео с конференций. А в середине августа, ещё до финальной конференции, я поговорил с наставником и решил, что остаюсь в команде Биллинга.
Теперь вы знаете, какой была моя стажировка. Если есть вопросы — задавайте в комментариях :)
Автор: Тазиев Ренат