Чем занимается разработчик на C++ и как им стать?
Разработчик на C++ занимается разработкой высокопроизводительных и высоконагруженных систем, таких как поисковики, драйверы, игры и приложения. Автор курса «Разработчик C++» в Яндекс.Практикуме Антон Полднев рассказал, как происходит процесс работы над задачами и какие навыки нужны для успешной карьеры разработчика на «плюсах».
Зачем нужен C++
C++ входит в десятку самых часто используемых языков программирования в рейтинге Stack Overflow. Его применяют для создания высоконагруженных сервисов, где важна скорость работы, таких как поисковые и рекламные системы, драйверы и операционные системы, игры и приложения, а также в разработке браузеров, потому что люди любят открывать много вкладок, а потом смотреть на зависающий компьютер. На C++ можно писать программы любой сложности, в том числе модели машинного обучения и программы для автопилотов.
Серверная часть многих классных и сложных приложений и систем написана на C++, среди них Adobe Photoshop & Illustrator, Spotify, YouTube, Amazon, Windows, MySQL. Например, в YouTube на C++ написана обработка видео, а у Amazon — обработка пользовательских запросов.
C++ — довольно старый язык, который существует с 1983 года. За это время появились языки попроще, например, Go. Go дружелюбнее к новичкам, на нём удобно создавать простые скрипты, например, для администрирования или инфраструктуры, такие как веб-серверы и микросервисы. Но на нём тяжело писать сложные вещи, для этого всё еще нужны «плюсы».
Достоинства и недостатки С++
С++ — один из самых популярных языков. У него есть свои достоинства и недостатки, которые на самом деле достаточно субъективны. Понять, нравится ли вам язык, можно не раньше, чем вы начнете его изучать.
Что делает разработчик C++
Писать код на C++ — очень обширное понятие. В одних проектах на этом языке создают сложные алгоритмы, в других — пишут модели машинного обучения, в третьих — инфраструктурные общие базы данных. Программирование на С++ предполагает, что нужно еще написать тесты, проверить при помощи них свой код и убедиться, что он будет работать, а те, кто будут дорабатывать его дальше, ничего не испортят.
К тому же разработчик обладает определенной свободой, ему нужно не только проработать задачу, но и решить, как это сделать лучше всего. Если вы младший разработчик, вам помогут и подскажут. Но чем вы старше, тем больше уровень ответственности. Предположим, к вам приходит менеджер и ставит задачу: «Нужно сделать вот такую фичу». Его желания не всегда реализуемы, в такой ситуации опытный разработчик может ответить: «Нет, это очень сложно. Но мы можем сделать по-другому. Давай мы договоримся о более простом решении, которое тоже будет работать».
Определить, что будет лучше и проще, помогают опыт и понимание того, как работает конкретная система.
Со временем вы узнаете не только, как писать те или иные программы, но также и как на C++ писать не стоит
Приведу пример из моего опыта. Есть некоторый код, формирующий индексы, по которым другой код дальше должен что-то искать в реальном времени. Чтобы этот процесс происходил быстро, индексы нужно расположить определенным образом: один индекс ссылается на второй, второй на третий. С одной стороны, это занудный код и его тяжело писать, а с другой стороны, он повторяется в нескольких местах по единому шаблону. Суть в том, что в одном месте в этот код нужно было что-то дописать, и я грустил, что он повторяется. А есть мантра, что нужно избавляться от дублирования кода. Я придумал, как это сделать, использовал хитрые средства C++: шаблоны, макросы и лямбда-функции. Такое нагромождение помогло избавиться от дублирования, и задачу я решил довольно легко, но код оказался настолько сложным для понимания, что другие разработчики в дальнейшем его не использовали. Мораль в том, что копирование кода не является абсолютным злом и вообще абсолютного зла не бывает. Нужно всегда думать, кто ваш код будет использовать и насколько разработчикам после вас это будет комфортно.
Как строится работа над задачей
Получить задачу от менеджера проекта. Если менеджер понимает, как устроена разработка, то он подскажет, что конкретно надо поправить в той или иной функции, тогда разработчику остается только закодить. Но часто это не так и проработка задачи состоит в следующем:
— понять, что конкретно надо написать в существующем проекте разработчику, который получил задачу
— cостыковаться со смежными командами и сервисами, которые поставляют вам данные или которым данные поставляете вы
Обсудить взаимодействие сервисов со смежными командами. Опыт показывает, что большинство проблем возникают на стыке разных программ. Один человек поставляет данные, другой — принимает, и если эти люди хоть немного не договорились, то там обязательно что-то сломается. Обычно в обсуждении помогает менеджер проекта. Но иногда разработчик достаточно крут и может сделать это сам. В некоторых командах этим занимается еще тимлид или техлид.
Протестировать программу. Сначала нужно запустить собственные тесты, затем — все старые, которые писали предыдущие разработчики, чтобы убедиться, что не сломалась текущая функциональность. Обычно этот процесс автоматизирован и с ним нет проблем.
Провести код-ревью. Попросить коллегу или наставника посмотреть ваш код и убедиться, что там всё хорошо.
Запустить код в продакшн. В некоторых командах, например, в нашей, код по умолчанию не включен и его нужно включать условным рубильником. Иногда нам боязно выкладывать код в продакшн, и мы запускаем эксперимент не сразу для всех пользователей, а только для некоторой части. Например, выбираем 0,1% трафика и проверяем на этой доле пользователей новую версию в течение нескольких часов или дней.
Проверить и убедиться, что всё работает по-новому и правильно. С большой вероятностью даже после публикации придется еще что-то доделывать.
Какие нужны навыки, чтобы начать писать на C++
Для того, чтобы начать обучение, достаточно иметь опыт программирования на любом языке, даже если это Delphi или Pascal. Если такого опыта нет, то перед обучением придется изучить основные понятия: функция, циклы, условные операторы и так далее.
Вот что надо знать джуниор-разработчику для работы.
— Ключевые возможности языка: принципы объектно-ориентированного программирования, реализация алгоритмов, исключение, наследование, полиморфизм, циклы, функции, объявление, указатели, классы и так далее. Нужно понимать, как они работают, и уметь ими пользоваться.
— Базовые компоненты: как создавать итераторы, конструкторы, шаблоны. Изучите не только базовую библиотеку, но и те, которые часто используют другие разработчики, например, STL и Boost.
— Структуры данных и алгоритмы: нужно понимать, где и какие требуются для работы, и научиться выбирать подходящие для конкретной задачи. Например, линейный поиск, двоичный поиск, быстрая сортировка, хеш-таблицы, списки, деревья. Не обязательно уметь их программировать, потому что они есть в стандартной библиотеке, но стоит понимать их принципы работы и свойства.
— Многопоточность: это одна из важных концепций, которые используются в работе. Ее применяют, когда есть несколько задач, которые могут работать параллельно.
— Как писать эффективный код: написание такого кода включает в себя тестирование и проверку на безопасность. Нужно понять, какие проблемы могут возникнуть с производительностью, как их исправить, как оптимизировать поиск, использовать память, настраивать ограничения.
Перед тем как пойти на собеседование в компанию, нужно понять, как оно устроено, чтобы подготовиться. В Яндексе во время собеседования на позицию разработчика предлагают набор задач на использование стандартных компонентов языка, например, контейнеров, но при этом нужно придумать, как их использовать, и не ошибиться в написании кода.
Для того, чтобы потренироваться в решении таких задач, есть разные сайты. Один из самых популярных — LeetCode. Если вы чувствуете, что не справляетесь с этими заданиями, нужно еще поучиться и поработать над собой.
Для карьерного развития учитесь искать баланс между тем, чтобы попросить помощи и совета у коллеги, и самостоятельным решением проблем. На практике сложнее всего приходится джуниор-разработчикам, которые стараются всё сделать сами, закапываются в коде, не пытаются спросить совета и думают, что сами со всем справятся. Тех, у кого это получается, единицы, остальные так и не могут найти хорошие решения. Для поиска этого баланса понадобятся навыки коммуникации и самоанализа.
Обычно мы советуем ограничивать время, отведенное на решение проблемы, но это время зависит от масштаба проблемы. Можно, например, выделять два часа на самостоятельный поиск решения, после чего лучше спросить коллег.