Советы сеньоров: как прокачать знания junior C++
Советы сеньоров — постоянная рубрика, в которой опытные специалисты делятся практическими советами с джуниорами — общие лайфхаки по обучению, какие книги и ресурсы читать, какие навыки осваивать и многое другое. В этом выпуске говорим о C++.
Алексей Цой, Senior Developer в Luxoft Ukraine
14 лет опыта
Начинающему программисту необходимо как можно больше времени посвящать изучению новых технологий, библиотек, в том числе и классических, таких как Boost, которые используют многие программисты. Очень важно уделять самообразованию достаточно времени, потому что количество нетехнических задач, митингов и коммуникации разных видов, будет увеличиваться, но без технических знаний молодой специалист просто не будет расти.
Поэтому в целях самообразования очень пригодится свой «домашний» проект. На этой тестовой площадке вы сможете принимать абсолютно все решения. Начиная с требований, процессов и планирования и заканчивая стеком технологий, имплантацией функционала и его тестированием. Экспериментируйте, применяйте новые подходы, технологии, паттерны проектирования — делайте все, что считаете нужным и интересным. Ведь в реальных проектах такая свобода действий у новичков встречается крайне редко.
Насчет качества сделанной работы. Стремитесь давать грамотные оценки, решайте задачи минимальным количеством кода и не допускайте в нем багов. Воспринимайте каждый конкретный баг как свое личное поражение.
Естественно, в этом вам помогут книги, ставшие классикой. Это Герб Саттер и его «Exceptional C++», «More Exceptional C++» и «Exceptional C++ Style». Это Андрей Александреску и его «Modern C++ Design: Generic Programming and Design Patterns Applied» и «C++ Coding Standards: 101 Rules, Guidelines, and Best Practices», написанная вместе с Саттером. И, конечно же, книги Скотта Майерса.
А вот чего не следует делать, так это браться за задачи, в которых не понятна их постановка. Это относится не к технической части, каким образом написать код, а именно к требованиям. Задавайте вопросы. Иначе есть риск сделать бессмысленную вещь, потратить проектное время, создать угрозу срыва дедлайнов. Такое не понравится никому.
И напоследок, более философское. Ответственно подходите к поиску места работы. Не стоит тратить свое время и силы на проекты, которые вам не нравятся, не интересны, кажутся неактуальными. Ведь без интереса в работе вероятность профессионального развития очень низка. И не только в IT.
Андрей Каличак, C++ Competence Lead в Perfectial
14 лет опыта
Язык С++ — один из древнейших, и по нему существует бесконечное множество документации, уроков, советов, тренингов и курсов. Несмотря на то, что некоторые могут одолеть этот язык за 21 день, я уверен, что большинство программистов учатся его использовать правильно и эффективно постоянно.
Очевидно, что для изучения С++ необходимы крепкие знания его предшественника — языка С. Именно с него и стоит начать знакомство с языком. С/С++ — это вообще неразлучная пара, и они всегда вместе на многих проектах и собеседованиях.
Для начинающего программиста очень важно как можно быстрее расширить свои знания. Как только будет получен критически минимальный порог знаний по стандарту языка, смежным базовым технологиям его использования (XML, DB, basic patterns/idioms), и это закрепится первым опытом, тогда свои знания можно углублять в выбранном направлении.
Не буду оригинальным и посоветую почитать в первую очередь классический труд Б. Страуструпа. И лишь потом, имея за плечами несколько килобайт написанного кода, можно приступать к более специализированным материалам, к примеру книгам Скотта Мэйерса или Герба Саттера. Они написаны в виде отдельных уроков, очень легко усваиваются. При определённом опыте и понимании это будет хорошим подспорьем в дальнейшем становлении профессионала.
Но, к сожалению, лишь прочитав книги или документацию, невозможно стать
Понятно, что вряд ли кто-то изъявит собственное желание менторить тебя, поэтому тут следует быть очень настойчивым и не стесняться просить старших ребят сделать код-ревью или помочь правильно имплементировать паттерн. Оптимально, если у тебя будет официальный ментор, в обязанности которого будет входить помощь в твоём обучении. Тогда все стороны будут заинтересованы в конечном результате. Но всё же крайне важно понимать, что это твой личный путь и только ты отвечаешь за его направление и результат. Организация обучения, скорость продвижения, его направление — это то, что решаешь только ты. Не жди — действуй! Время бесценно.
Обязательно паралельно необходимо осваивать последние стандарты и технологии — C++11/14/17, библиотека Boost, Gtest, Git. Обрети уверенность в использовании хотя бы одной IDE (поиск, дебаг, рефакторинг). Это всё значительно повысит твою ценность на рынке труда.
И несколько маленьких советов, которые бы мне помогли в начале карьеры:
- Выделяй себе время на обучение: понятно, что проект может занять всё свободное время, и на первых порах действительно все мысли лишь об удачном старте, но потом, когда войдешь в спокойное русло, не забывай постоянно увеличивать свои знания.
- Отдавайся работе чуть больше, чем требуется: изучи часть чужого кода и найди баг, найди не очевидное, а оптимальное решение, углубись в новую библиотеку больше, чем требует этого выполнение задачи.
- Выпрашивай себе всё более сложные задачи, даже на первый взгляд непосильные для тебя: именно так и развивается разработчик. Плюс это хорошая мотивация для тех, у кого повышено чувство собственного достоинства и амбиции.
- Разбирай open-source код: там можно подсмотреть и научиться многим вещам.
- Старайся посещать собрания сообщества разработчиков: тут можно позадавать вопросы на более узкие темы и познакомиться с экспертами в разных сферах.
- Регулярно (не обязательно часто) проходи онлайн-тренинги или уроки: это разнообразит твою подготовку и позволит взглянуть под новым углом на некоторые вещи.
- Держи баланс во всём.
Главное — помнить, что никто не стал экспертом сразу. Все прошли через определённые этапы развития, хоть и в индивидуальном русле. И ещё — это всё должно быть в кайф!
Володимир Корнійчук, Senior Software Engineer в Infopulse
12 років досвіду
Чому?
Перш за все я б порадив новачку відповісти для себе на запитання: «Чому я хочу писати на С++?». Є ціла купа причин обрати інші мови програмування — багато з них легші у вивченні та щоденному використанні. Але в С++ є те, що тримає його серед лідерів. С++ обирають за його швидкодію, ефективність, контроль апаратних ресурсів, кросплатформеність, поширеність. Якщо ці речі відповідають вашим ідеалам — ідіть у бій. Якщо хочеться, щоб «раз-раз і в продакшн» — можливо, варто обрати щось простіше?
Хто і коли?
Для розуміння філософії С++ варто трохи почитати про історію його створення та бачення мови програмування її авторами. Ще не читали книг Страуструпа? Саме час. Банальна порада, але без цього справді ніяк. Тільки беріть останні видання, а не перші.
Чи варто читати стандарт?
Стандарт мови програмування С++ в одній з останніх редакцій, що траплялася мені на очі, налічує 1622 сторінки. Як це все прочитати (з урахуванням стилю документу) і залишитися при здоровому глузді, я особисто не уявляю. Вивчення С++ по стандарту — найгірша ідея у світі. Є багато книжок, що пояснюють С++ простіше і з теоретичної, і з прикладної точки зору. Можна почати зі списку на Isocpp. А стандарт залиште розробникам компіляторів.
IDE
Підберіть зручне середовище розробки. Я використовую Visual Studio з додатково встановленим плагіном Visual Assist X. Ця зв’язка знає про мову С++ більше за все інше, що я перебирав. Знаю людей, що користуються VS + ReSharper, CLion, Qt Creator, Vim. Мені не підійшло, але ви спробуйте і матимете власну думку.
Debugger
Навчіться користуватися дебаггером (як вбудованим у вашу IDE, так і зовнішнім, типу GDB чи WinDbg). Це, на диво, потужні інструменти, що іноді дозволяють робити неймовірні речі. Більшість розробників використовують їх доволі примітивно, у режимі «поставили точку зупинки — зупинилися на ній», навіть не знаючи про можливості віддаленої роботи, time-travel debugging, підтягування зовнішніх символьних файлів та коду, зупинки по модифікації адреси пам’яті тощо.
Профайлер
Ефективність та швидкість — одні з головних причин використання С++ в сучасних проектах. Без профайлера ви ніколи не здогадаєтесь, де саме «вузьке місце» у вашому коді. Для простих випадків підійде та ж Visual Studio, для складніших — Windows Performance Analyzer або інструменти від Intel. Не пробуйте вгадати, що саме у вас працює повільно. Я бачив, як на це марнувалися тижні. Просто зробіть замір профайлером і усвідомте факти. В більшості випадків проблема буде зовсім не там, де ви її очікуєте.
Інструменти статичного аналізу
Зараз є багато інструментів, що дозволяють вказати програмісту на можливу помилку в коді на С++. Є попередження стандартного компілятора, є нові можливості Visual Studio по аналізу С++ коду на відповідність рекомендаціям C++ Core Guidelines, є аналіз коду в Visual Assist X, є Cppcheck та Clang. Багато чого є, он одна тільки Вікіпедія скільки всього знає. Обов’язково оберіть собі щось і використовуйте. Особливо добре ці інструменти працюють у комбінації з системами неперервної інтеграції.
Спеціалізовані інструменти розробки
Яку б галузь програмування ви не обрали — швидше за все ви не будете першим, хто почав e ній працювати. Ваші попередники написали багато корисних утиліт — спробуйте знайти їх та використати. Є гарні програми для допомоги системному програмісту, є корисні утиліти для графіки та геймдеву, є купа бібліотек з алгоритмами. Не пишіть свого велосипеду? доки не витратите принаймні кілька годин на пошуки вже того, що вже існує.
Тримайтеся на вістрі прогресу
Знайдіть собі якесь джерело новин про С++. Мова розвивається, виходять нові стандарти та компілятори, що їх підтримують. Особисто я читаю новини на Isocpp, обговорення — на Reddit, дивлюся відео з конференцій C++Now та CppCon. Це вимагає не так багато часу, як може здатися, але дає можливість планувати як розвиток вашого проекту, так і ваш особистий.
Николай Родин, С++ Developer в Dev-Pro
8 лет опыта
Зачем нужен С++ сегодня
Мой выбор, когда я заканчивал институт 18 лет назад, был невелик. Web-направление только набирало обороты, и у меня фактически был выбор только между Visual C++ и Delphi. Сегодня же вариантов очень много, а применение С++ найти не так легко. В стремительно развивающейся Web-индустрии ему по-прежнему нет места. Вытесняется он и из кроссплатформенного программирования. Если вам интересен этот язык — осталось всего несколько направлений, в которых С++ (и С) еще удерживают позиции (подробнее об этом можно прочитать здесь):
- Поддержка легаси проектов под Windows — речь о проектах, которым не один год, а может быть и не один десяток лет. Возможно, некоторым не по душе это направление, но саппорт важен и нужен. Новые проекты появляются редко, в них GUI пишется в основном с использованием библиотеки Qt.
- Game Development — здесь C++ актуален, ибо важно быстродействие в сочетании с определенной безопасностью.
- С++ под Linux — здесь С++ по-прежнему востребован ввиду развитости экосистемы. GUI вполне можно писать на Qt, драйвера и некоторые сетевые приложения пишутся даже на С.
- А. Embedded — здесь С и С++ удерживают твердые позиции, особенно если речь заходит о системах, работающих в реальном времени и на ограниченных мощностях.
Б. Internet of Things все быстрее набирает популярность, активно использует C++, здесь можно добиться больших успехов.
Важно отметить, что язык C++ продолжает развиваться: от версий C++98, C++03, C++11 (C++0x), C++14 (C++1y), C++17 (C++1z) двигается к C++20 в 2020 году.
Кому стоит его изучать
Перед тем как приступать к изучению С++, разумно спросить себя, что именно вы собираетесь делать, действительно ли планируете развиваться в одном из направлений из списка выше.
Я бы порекомендовал этот язык тем, кто имеет тягу к написанию программ на Linux, стремится в GameDev или хочет стать Embedded Engineer и работать в перспективном IoT. Язык подойдет тем новичкам в IT-индустрии, которые считают себя перфекционистами и ищут как можно большего контроля над тем, что они делают.
Если же человек стремится скорее конструировать, чем программировать, ждет быстрой реализации своих идей — тогда лучше смотреть в сторону web и скриптовых языков. Да и изучить тот же JavaScript гораздо проще.
Как изучить С++
Осваивать C++ я предлагаю от простого к сложному, начав с С. С считается низкоуровневым и поддерживает в основном процедурную парадигму. Но на его примере можно получить представление об указателях и прямой работе с памятью. Вы также научитесь мыслить битами и тактами, а не только абстракциями языка программирования и шагами алгоритмов. Помимо того, операционные системы до сих пор имеют API, написанный на С, и с ним нужно учиться взаимодействовать.
С++ поддерживает и процедурную, и объектно-ориентированную парадигму (ООП).
Основным при переходе к ООП является поворот мышления от «пассивных» данных и набора процедур для их обработки к «активным» данным, предоставляющим набор операций для работы с ними и скрывающим детали своей реализации. Также важная часть С++ — шаблоны, с помощью которых реализуются в том числе «умные» указатели, позволяющие существенно повысить безопасность С++ кода. В целом С++ является сложным языком и требует существенных усилий на изучение.
Полезная литература
Базовой книгой для изучения С считается книга Брайана Кернигана и Денниса Ритчи «Язык программирования С». Из нее можно почерпнуть информацию о стиле написания кода, основных контейнерах и обработке ошибок. Книга также приучит к ясности изложения мысли, потому что авторы всегда предлагают сначала писать комментарии, а потом уже под ними блоки кода. Это достаточно полезный навык независимо от языка.
Для изучения С++ желательно прочитать больше литературы. С++ я изучал по следующим книгам:
- Bjarne Stroustrup «The C++ Programming Language»;
- Джефф Элджер «C++: Библиотека программиста»;
- Скотт Майерс «Эффективное использование C++»;
- Андрей Александреску «Современное проектирование на C++».
Советы новичкам
Советы стандартны и практически не зависят от языка: изучайте классические алгоритмы и структуры данных, паттерны проектирования. Асинхронное программирование и многопоточность лучше осваивать не сразу, а несколько позже — после приобретения определенного опыта. Ясно излагайте мысли в виде кода, не забывайте о кратких комментариях, минимизируйте содержимое лямбд и избегайте копипасты. Аккуратность написания кода, строгость обработки ошибок и логирование также очень важны — написанный код нужно будет саппортить.
Помните, что когда попадаете в IT, как бы не готовились заранее — начинаете чувствовать пробелы в знаниях и опыте, которые даже не касаются технической квалификации. Soft skills действительно играют роль, и многие из них вы освоите, только присоединившись к реальному проекту. Здесь есть процессы, тестирование, проджект-менеджер, который держит руку на пульсе, следит за сроками и приоритетами. Иногда это тяжело принять, но окончательное решение не за тем, кто пишет код, а за тем, кто несет за него ответственность.
Присоединившись к команде, учитесь на примере того кода, который уже существует на проекте. Работающий код, каким бы он не был, — это наилучший способ изучения С++ и любого другого языка программирования. Кам минимум поймете, как делать не нужно. Надеюсь, у вас все получится.
Михайло Рудий, Senior Software Developer в Vakoms
6 років досвіду
Оскільки ти вже став на цей шлях, то, мабуть, розумієш, що обрав одну з кращих мов, на якій можна писати все, починаючи від hardware, закінчуючи web.
Я б хотів поділитися кількома порадами.
Вказівник — твій найкращий друг. Вказівники, вказівники, вказівники і ще раз вказівники, бо це наше все і вони повсюди. Чим більше ти знаєш про них, тим краще.
Memory management. Навчись правильно працювати з пам’яттю. В C++ за пам’ять відповідаєш ти сам. Поки ти не скажеш «видалити» — ніхто за тебе це не зробить. Не хочеш сам керувати пам’яттю — тоді вчи smart pointers.
Класи і три страшні букви (ООП). Робота з класами — це дуже круто, тому старайся знати і вміти використовувати всі можливості класів і ООП.
Не вигадуй велосипед. У стандартній бібліотеці є вже багато готових алгоритмів, особливо для роботи з контейнерами. Тому перед тим, як писати свій метод, спочатку перевір, — можливо, він вже готовий.
В ногу з часом. C++, як і всі інші мови, розвивається, тому не забувай слідкувати за змінами в нових стандартах. Там з’являється багато цікавого і потрібного.
Design patterns. Це мегакрута річ. Почни своє знайомство з ними із простого і рухайся до складніших, закінчуй архітектурними. Головне, навчись їх правильно застосовувати.
Просто, як двері. Реалізуй задачі якомога простіше. Це буде зручно для всіх: і для тебе, і для твої колег по проекту, і для тих, хто продовжуватиме після тебе.
Запозичуй. Хочеш покращити свій код, спробуй знайти хоча б 2 рішення схожої задачі. Можливо, ти знайдеш там щось корисне для себе.
Команда. Навчися працювати в команді. Без гарних відносин робота менш якісна. Вчись розуміти інших членів команди, незалежно від їх досвіду.
Ментор. Це твій помічник, який підкаже, дасть пораду або насварить, якщо ти робиш щось дуже неправильно. Він потрібен.
Не бійся. Не бійся важких тасків (інколи вони тільки здаються важкими). Не бійся спитати поради. Не бійся сказати: «Я вже все спробував і не знаю, як це зробити. Підкажіть, куди рухатись».
Будь упевнений. Вмій відстоювати свою точку зору. Інколи твоя ідея чи варіант реалізації може бути кращий, ніж в інших, але потрібно це довести і пояснити.
Критика — це не зло. Вчися сприймати критику, якщо вона доречна. Будь стіким до неї. Вмій взяти з неї якомога більше корисного для себе.
І наостанок головне. Практика — запорука успіху. Чим більше практики — тим краще, тим більший досвід, тим швидше твої пальці самі «знатимуть», що писати. Практикуйся якомога більше. Прочитав щось цікаве в книжці або статті чи почув від когось — спробуй реалізувати, поекспериментувати. Так ти швидше все запам’ятаєш.
І знай, C++ неможливо вивчити повністю :) Завжди буде щось нове, що ти не знатимеш, тому не лякайся. Просто читай і постійно практикуйся.
Ресурси, які допоможуть:
- Bjarne Stroustrup «The C++ Programming Language», 4th Edition;
- Scott Meyers «Effective C++»;
- Scott Meyers «Effective Modern C++»;
- C++ reference;
- cplusplus.com;
- «Design Patterns: Elements of Reusable Object-Oriented Software», by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Grady Booch;
- Андрій Будай «Дизайн-патерни — просто, як двері».