Меня зовут Ренат Тазиев. Мне 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 — внутренней системы для деплоя и хостинга .NET-приложений, похожей на Kubernetes. Награду за «лучший рассказ о rocket science своими словами» получил стажёр-датасаентист, который с помощью машинного обучения выделял из текстов новостей названия и связывал их с известными компаниями. Награду за «реальное улучшение производительности на боевой площадке» получил стажёр, который изменил одну строчку кода и ускорил приложение в 30 раз.


Итоги стажировки


Я чувствовал себя не стажером, а полноценным разработчиком, который приносит пользу команде и компании наравне со всеми. Была дружеская атмосфера, и никто не сомневался в наших способностях.


За два месяца я поработал над 8 задачами, сделал 180 коммитов, два раза выложил релиз. Прочитал 35 технических статей, две книги, посмотрел больше 30 часов видео с конференций. А в середине августа, ещё до финальной конференции, я поговорил с наставником и решил, что остаюсь в команде Биллинга.


Теперь вы знаете, какой была моя стажировка. Если есть вопросы — задавайте в комментариях :)

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


  1. hamnsk
    11.10.2017 13:42
    -2

    Без обид, парни вам бы:
    1. Покушать (страшно смотреть, ручки спички)
    2. Заняться спортом, это прям не обходимо для тонуса мышц


  1. Cobolorum
    11.10.2017 16:51

    Когда мне было 22 я тоже считал себя разработчиком.
    В 30 понял что я еще мало знаю и разработчиком я не могу считаться.
    В 35 я понял что ни черта не знаю и какой я к черту программист!
    В 40 я осознал что надо узнать что бы стать программистом.


    1. theaklair
      11.10.2017 23:43
      +1

      Не у всех дела обстоят так плохо.


      1. zloddey
        12.10.2017 07:21

        Просто не все ещё добрались до второй стадии


    1. Orenleto Автор
      12.10.2017 12:07

      В своём комментарии вы делаете перескок с разработчика на программиста. В моём понимании разработчик — это ученик; человек, который учится писать код и пишет его. Программист занят более важными вещами и обладает куда более фундаментальными и глубокими знаниями: эти люди соответствуют званию программиста в этой статье Куда деваются программисты после 40.


  1. viru0
    11.10.2017 18:13
    +3

    Тут я сделал удивительное открытие: сообщения в исключениях и комментариях можно и нужно писать на русском языке.

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


    1. Danik-ik
      12.10.2017 00:02
      +3

      Лучше применять стандарты, соответствующие целям. В частности, целевой аудитории.


    1. hdfan2
      12.10.2017 06:52
      +1

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


      1. Danik-ik
        12.10.2017 13:39
        +1

        Целесообразность — ничто, главное — принцип?
        Представьте, себе, бывает, что нет выбора. Стандарт де-юре важнее де-факто, не?
        Бывает, что ты всю жизнь пилишь махровую проприетарщину, и о выкладывании в open source даже думать не моги.
        Бывает, что и выбор есть, да времени нету. Чем-то жертвуешь, иногда это практика в английском.


        Нет, я не против английского, сам балуюсь с удовольствием. Но безапелляционное "лучше так" отношу к религиозному экстазу. Пишите на английском, ради Бога, но не пренебрегайте родным языком. Во многих случаях это намного более эффективно. Попробуйте лучше с тёщей поговорить по английски — для практики и ради стандарта де-факто.


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


        1. Danik-ik
          12.10.2017 13:42

          P.s. таки стандартом де-факто в некоторых вопросах давно старается стать локализация...


        1. green_hippo
          12.10.2017 18:18

          Работаю в Контуре, могу рассказать про ситуацию с «языками» изнутри. Команд больше 50 и каждая, понятно, решает «языковой вопрос», как считает правильным.


          Если команда делает проект с открытым кодом, то есть большая вероятность, что с первого дня всё будет на английском. Вот, например, gremit, Мойра, Восток. А если команда делает продукт с закрытым кодом, общается между собой на русском, пишет «аналитику», таски и документацию на русском, то решение писать названия коммитов и сообщения об ошибках тоже на русском вполне можно понять :)


  1. gary_cho
    12.10.2017 11:57
    +1

    Награду за «реальное улучшение производительности на боевой площадке» получил стажёр, который изменил одну строчку кода и ускорил приложение в 30 раз.

    что же там за код был такой ???


    1. green_hippo
      12.10.2017 19:10

      Был на том докладе и пересмотрел сейчас запись, могу рассказать :)


      Сергей Рябинин (не знаю, есть ли на Хабре) решал задачу, что-то оптимизировал. Обнаружил, что на его компьютере производительность нового кода относительно старого выросла в ~3 раза. На сервере с тестовой площадки производительность тоже выросла в 3 раза, но по абсолютным показателям всё работало в ~10 раз медленнее, чем на локальной машине.


      Оказалось, что на машине разработчика была Windows 10 Pro, а на тестовой виртуалке в облаке — Windows Server 2016. При запуске приложения 40 % ресурсов процессора съедает процесс «Antimalware Service Executable». Наверно, защищает от чего-то неприятного. Спасибо, Microsoft!


      Оказалось, что есть PowerShell-команда, которая добавляет исключения. После неё всё начинает работать в 10 раз быстрее:


      Set-MpPreference -ExclusionProcess "App.exe"


      Вот откуда взялась цифра «30 раз». Ну и понятно, что Сергей вместе с коллегами добился, чтобы все машины с Server 2016 «ускорились» за счёт магической команды. В основном, наверно, на тестовой, потому что на боевой должны преобладать Server 2012. Вот такая история :)


      1. green_hippo
        12.10.2017 19:13

        Несколько скриншотов со слайдами







  1. rinatGimaldinov
    12.10.2017 11:58
    +1

    Отличная статья. Интересно было читать.
    Не знал что в Контуре существует такая модель работы со стажерами, очень по взрослому.


  1. neomichi
    12.10.2017 11:59

    Я тоже иногда бывал в шире:) Если тебе нравиться спортивное программирование, моё мнение, иди выше, не останавливайся, а то затянет и слезть с этой иглы будет трудно.


  1. decomeron
    12.10.2017 14:50
    +2

    Очень интересно написано, а теперь вопросы


    1. Много ли было девушек и какие они?
    2. Были ли блатники, ну, кто туда попал по блату. Конечно, сомневаюсь, но мало ли?


    1. revz
      12.10.2017 17:15
      +2

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

      Ну, тут вопрос, как определить слово «блат». Мы, например, иногда определяем «студента, которого мы берём по блату» как «студента, продемонстрировавшего такой высокий уровень в одной из наших образовательных программ, что его можно брать на стажировку без тестового задания». Такие есть.
      Бывает «по блату» значит «наставник познакомился со студентом на одной из наших программ, между ними проскочила искра, и теперь наставник берёт его без тестового и собеседования». Такие тоже есть.
      Ещё можно перевести как «некто позвонил генеральному и попросил взять его сына на стажировку». Такого, к счастью, пока не случалось.


      1. decomeron
        13.10.2017 00:25

        Спасибо.
        Тема девушек мне очень интересна.
        А насчет того, что блатников нет, это наверное единственное место, где их нет;-))это радует