Чем занимается разработчик на C++ и как им стать?

C++ используется в создании сложных современных IT-продуктов: от беспилотных автомобилей и робототехники до веб-браузеров, микроконтроллеров, серверов и видеоигр.

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

Зачем нужен C++

C++ входит в десятку самых часто используемых языков программирования в рейтинге Stack Overflow. Его применяют для создания высоконагруженных сервисов, где важна скорость работы, таких как поисковые и рекламные системы, драйверы и операционные системы, игры и приложения, а также в разработке браузеров, потому что люди любят открывать много вкладок, а потом смотреть на зависающий компьютер. На C++ можно писать программы любой сложности, в том числе модели машинного обучения и программы для автопилотов.

Серверная часть многих классных и сложных приложений и систем написана на C++, среди них Adobe Photoshop & Illustrator, Spotify, YouTube, Amazon, Windows, MySQL. Например, в YouTube на C++ написана обработка видео, а у Amazon — обработка пользовательских запросов.

C++ — довольно старый язык, который существует с 1983 года. За это время появились языки попроще, например, Go. Go дружелюбнее к новичкам, на нём удобно создавать простые скрипты, например, для администрирования или инфраструктуры, такие как веб-серверы и микросервисы. Но на нём тяжело писать сложные вещи, для этого всё еще нужны «плюсы».

Достоинства и недостатки С++

С++ — один из самых популярных языков. У него есть свои достоинства и недостатки, которые на самом деле достаточно субъективны. Понять, нравится ли вам язык, можно не раньше, чем вы начнете его изучать.

105

Что делает разработчик C++

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

К тому же разработчик обладает определенной свободой, ему нужно не только проработать задачу, но и решить, как это сделать лучше всего. Если вы младший разработчик, вам помогут и подскажут. Но чем вы старше, тем больше уровень ответственности. Предположим, к вам приходит менеджер и ставит задачу: «Нужно сделать вот такую фичу». Его желания не всегда реализуемы, в такой ситуации опытный разработчик может ответить: «Нет, это очень сложно. Но мы можем сделать по-другому. Давай мы договоримся о более простом решении, которое тоже будет работать».

Определить, что будет лучше и проще, помогают опыт и понимание того, как работает конкретная система.

Со временем вы узнаете не только, как писать те или иные программы, но также и как на C++ писать не стоит

Приведу пример из моего опыта. Есть некоторый код, формирующий индексы, по которым другой код дальше должен что-то искать в реальном времени. Чтобы этот процесс происходил быстро, индексы нужно расположить определенным образом: один индекс ссылается на второй, второй на третий. С одной стороны, это занудный код и его тяжело писать, а с другой стороны, он повторяется в нескольких местах по единому шаблону. Суть в том, что в одном месте в этот код нужно было что-то дописать, и я грустил, что он повторяется. А есть мантра, что нужно избавляться от дублирования кода. Я придумал, как это сделать, использовал хитрые средства C++: шаблоны, макросы и лямбда-функции. Такое нагромождение помогло избавиться от дублирования, и задачу я решил довольно легко, но код оказался настолько сложным для понимания, что другие разработчики в дальнейшем его не использовали. Мораль в том, что копирование кода не является абсолютным злом и вообще абсолютного зла не бывает. Нужно всегда думать, кто ваш код будет использовать и насколько разработчикам после вас это будет комфортно.

Как строится работа над задачей

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

— понять, что конкретно надо написать в существующем проекте разработчику, который получил задачу

— cостыковаться со смежными командами и сервисами, которые поставляют вам данные или которым данные поставляете вы

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

Протестировать программу. Сначала нужно запустить собственные тесты, затем — все старые, которые писали предыдущие разработчики, чтобы убедиться, что не сломалась текущая функциональность. Обычно этот процесс автоматизирован и с ним нет проблем.

Провести код-ревью. Попросить коллегу или наставника посмотреть ваш код и убедиться, что там всё хорошо.

Запустить код в продакшн. В некоторых командах, например, в нашей, код по умолчанию не включен и его нужно включать условным рубильником. Иногда нам боязно выкладывать код в продакшн, и мы запускаем эксперимент не сразу для всех пользователей, а только для некоторой части. Например, выбираем 0,1% трафика и проверяем на этой доле пользователей новую версию в течение нескольких часов или дней.

Проверить и убедиться, что всё работает по-новому и правильно. С большой вероятностью даже после публикации придется еще что-то доделывать.

Какие нужны навыки, чтобы начать писать на C++

Для того, чтобы начать обучение, достаточно иметь опыт программирования на любом языке, даже если это Delphi или Pascal. Если такого опыта нет, то перед обучением придется изучить основные понятия: функция, циклы, условные операторы и так далее.

Вот что надо знать джуниор-разработчику для работы.

Ключевые возможности языка: принципы объектно-ориентированного программирования, реализация алгоритмов, исключение, наследование, полиморфизм, циклы, функции, объявление, указатели, классы и так далее. Нужно понимать, как они работают, и уметь ими пользоваться.

Базовые компоненты: как создавать итераторы, конструкторы, шаблоны. Изучите не только базовую библиотеку, но и те, которые часто используют другие разработчики, например, STL и Boost.

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

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

Как писать эффективный код: написание такого кода включает в себя тестирование и проверку на безопасность. Нужно понять, какие проблемы могут возникнуть с производительностью, как их исправить, как оптимизировать поиск, использовать память, настраивать ограничения.

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

Для того, чтобы потренироваться в решении таких задач, есть разные сайты. Один из самых популярных — LeetCode. Если вы чувствуете, что не справляетесь с этими заданиями, нужно еще поучиться и поработать над собой.

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

Обычно мы советуем ограничивать время, отведенное на решение проблемы, но это время зависит от масштаба проблемы. Можно, например, выделять два часа на самостоятельный поиск решения, после чего лучше спросить коллег.

Краткий пересказ от YandexGPT