Поради сеньйорів: як прокачати знання junior C++

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

Олексій Цой, Senior Developer в Luxoft Ukraine

14 років досвіду

Починаючому програмісту необхідно якомога більше часу присвячувати вивченню нових технологій, бібліотек, в тому числі і класичних, таких як Boost, які використовують багато програмісти. Дуже важливо приділяти самоосвіти достатньо часу, тому що кількість нетехнічних завдань, мітингів і комунікації різних видів, буде збільшуватися, але без технічних знань молодий фахівець просто не буде зростати.

Тому в цілях самоосвіти дуже знадобиться свій «домашній» проект. На цій тестової майданчику ви зможете приймати абсолютно всі рішення. Починаючи з вимог, процесів та планування і закінчуючи стеком технологій, імплантацією функціоналу і його тестуванням. Експериментуйте, створюйте нові підходи, технології, патерни проектування — робіть все, що вважаєте потрібним і цікавим. Адже в реальних проектах така свобода дій у новачків зустрічається вкрай рідко.

Щодо якості зробленої роботи. Прагнете давати грамотні оцінки, вирішуйте завдання мінімальною кількістю коду і не допускайте в ньому помилок. Сприймайте кожен конкретний баг як свою особисту поразку.

Природно, в цьому вам допоможуть книги, що стали класикою. Це Герб Саттер і його «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), і це закріпиться першим досвідом, тоді можна поглиблювати свої знання в обраному напрямку.

Не буду оригінальним і пораджу почитати в першу чергу класичний працю Б. Страуструпа . І лише потім, маючи за плечима кілька кілобайт написаного коду, можна приступати до більш спеціалізованим матеріалами, наприклад книг Скотта Мэйерса або Герба Саттера . Вони написані у вигляді окремих уроків, дуже легко засвоюються. При певному досвіді і розумінні це буде гарною підмогою у подальшому становленні професіонала.

Але, на жаль, лише прочитавши книги або документацію, неможливо стати 25-річним сеньйором, тому дуже важливо набити собі гулі і отримати безцінний досвід. Чим більше — тим краще. Цей досвід потрібно переймати у своїх старших тиммейтов. Я б навіть замінив слово «переймати» на «вигризати». Треба отримувати якомога більше рад, конструктивної критики, майстер-класів від тих, хто може поділитися своїми знаннями. Потрібно задавати багато питань, навіть якщо навскидку питання здається дурним.

Зрозуміло, що навряд чи хтось виявить власне бажання менторить тебе, тому тут слід бути дуже наполегливим і не соромитися просити старших хлопців зробити код-рев'ю або допомогти правильно імплементувати патерн. Оптимально, якщо у тебе буде офіційний ментор, в обов'язки якого входитиме допомога в твоєму навчанні. Тоді всі сторони будуть зацікавлені в кінцевому результаті. Але все ж вкрай важливо розуміти, що це твій особистий шлях і тільки ти відповідаєш за його напрямок і результат. Організація навчання, швидкість просування, його напрямок — це те, що тільки ти вирішуєш. Не чекай — дій! Час безцінний.

Обов'язково паралельно необхідно освоювати останні стандарти і технології — C++11/14/17, бібліотека Boost, Gtest, Git. Знайди впевненість у використанні хоча б одного IDE (пошук, дебаг, рефакторинг). Це все значно підвищить твою цінність на ринку праці.

І кілька маленьких порад, які мені допомогли на початку кар'єри:

Головне — пам'ятати, що ніхто не став експертом відразу. Всі пройшли через певні етапи розвитку, хоч і в індивідуальному руслі. І ще — це все має бути в кайф!

Володимир Корнійчук , 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-індустрії йому немає місця. Витісняється він і з міжплатформового програмування. Якщо вам цікавий цей мова — залишилося всього кілька напрямків, у яких С++ (і З) ще утримують позиції:

  1. Підтримка легасі проектів під Windows — мова про проекти, яким не один рік, а може бути і не один десяток років. Можливо, декому не до душі цей напрямок, але саппорт важливий і потрібний. Нові проекти з'являються рідко, в них GUI пишеться в основному з використанням бібліотеки Qt.
  2. Game Development — тут C++ актуальне, бо важливо швидкодію в поєднанні з певною безпекою.
  3. С++ під Linux — тут С++, як і раніше затребуваний зважаючи розвиненості екосистеми. GUI цілком можна писати на Qt, драйвера і деякі мережеві додатки пишуться навіть на С.
  4. Embedded — тут утримує тверді позиції, особливо якщо мова заходить про системах, що працюють в реальному часі і на обмежених потужностях. C++ також цілком використовується (як правило, в урізаному вигляді).

Кому варто її вивчати

Перед тим як приступати до вивчення С++, розумно запитати себе, що саме ви збираєтеся робити, дійсно плануєте розвиватися в одному з напрямків зі списку вище.

Я б порекомендував цю мову тим, хто має тягу до написання програм на Linux, прагне в GameDev або хоче стати Embedded Engineer. Мова підійде тим новачкам в IT-індустрії, які вважають себе перфекціоністами і шукають якомога більшого контролю над тим, що вони роблять.

Якщо ж людина прагне швидше конструювати, ніж програмувати, чекає швидкої реалізації своїх ідей — тоді краще дивитися в бік web і скриптових мов. Та й вивчити той же JavaScript набагато простіше.

Як вивчити З++

Освоювати C++ я пропоную від простого до складного, почавши з С. вважається низькорівневим і підтримує в основному процедурну парадигму. Але на його прикладі можна отримати уявлення про покажчиках і прямий роботі з пам'яттю. Ви також навчитеся мислити бітами і тактами, а не лише абстракціями мови програмування і кроками алгоритмів. Крім того, операційні системи досі мають API, написаний на С, і з ним треба вчитися взаємодіяти.
С++ підтримує і процедурну, і об'єктно-орієнтовану парадигму (ООП).

Основним при переході до ООП є поворот мислення від «пасивних» даних і набору процедур для їх обробки до «активним» даними, які надають набір операцій для роботи з ними і приховує деталі своєї реалізації. Також важлива частина С++ — шаблони, за допомогою яких реалізуються в тому числі «розумні» покажчики, що дозволяють істотно підвищити безпеку С++ коду. В цілому З++ є складною мовою й вимагає істотних зусиль на вивчення.

Корисна література

Базової книгою для вивчення вважається книга Брайана Кернигана і Денніса Рітчі «Мова програмування С» . З неї можна почерпнути інформацію про стилі написання коду, основних контейнерах і обробці помилок. Книга також привчить до ясності викладу думки, тому що автори завжди пропонують спочатку писати коментарі, а потім вже під ними блоки коду. Це досить корисний навик незалежно від мови.

Для вивчення С++ бажано прочитати більше літератури. С++ я вивчав з наступних книг:

Поради новачкам

Поради стандартні і практично не залежать від мови: вивчайте класичні алгоритми і структури даних, патерни проектування. Асинхронне програмування і багатопоточність краще освоювати не відразу, а дещо пізніше — після набуття певного досвіду. Ясно викладайте думки у вигляді коду, не забувайте про коротких коментарях, мінімізуйте вміст лямбд і уникайте копипасты. Акуратність написання коду, строгість обробки помилок і логування також дуже важливі — написаний код потрібно буде саппортить.

Пам'ятайте, що коли потрапляєте в IT, як би не готувалися заздалегідь — починаєте відчувати прогалини в знаннях і досвіді, які навіть не стосуються технічної кваліфікації. Soft skills дійсно грають роль, і багато з них ви освоїте, лише приєднавшись до реального проекту. Тут є процеси, тестування, проджект-менеджер, який тримає руку на пульсі, стежить за термінами та пріоритетами. Іноді це важко прийняти, але остаточне рішення не за тим, хто пише код, а за тим, хто несе за нього відповідальність.

Приєднавшись до команди, вчіться на прикладі того коду, який вже існує на проекті. Працюючий код, яким би він не був, — це найкращий спосіб вивчення С++ і будь-якого іншого мови програмування. Кам мінімум зрозумієте, як робити не потрібно. Сподіваюся, у вас все вийде.

Михайло Рудий , Senior Software Developer в Vakoms

6 років досвіду

Оскільки ти вже ставши на цей шлях, то, мабуть, розумієш, що обрав одну з кращих мов, на якій можна писати все, починаючи від hardware, закінчуючи web.

Я б хотів поділитися кількома порадами.

Вказівник — твій найкращий друг. Вказівники, вказівники, вказівники і ще раз вказівники, бо це наше все і вони повсюди. Чим більше ти знаєш про них, тім краще.

Memory management. Навчись правильно працювати з пам " яттю. В C++ за пам'ять відповідаєш ти сам. Поки ти не скажеш «видалити» — ніхто за тебе це не зробить. Не хочеш сам керувати пам яттю — тоді вчи smart pointers.

Класи і три страшні букви (ООП). Робота з класами — це дуже круто, тому намагайся знати і вміти використовувати всі можливості класів і ООП.

Не вигадуй велосипед. У стандартній бібліотеці є вже багато готових алгоритмів, особливо для роботи з контейнерами. Тому перед тим, як писати свій метод, спочатку перевір, — можливо, він вже готовий.

В ногу з часом. C++, як і всі інші мови, розвивається, тому не забувай слідкувати за змінами у нових стандартах. Там з'єднання являється багато цікавого і потрібного.

Design patterns. Це мегакрута річ. Почни своє знайомство з ними із простого і рухайся до складніших, закінчуй архітектурними. Головне, навчись їх правильно застосовувати.

Просто, як двері. Реалізуй задачі якомога простіше. Це буде зручно для всіх: і для тебе, і для твої колег по проекту, і для тих, хто продовжуватиме після тебе.

Запозичуй. Хочеш покращити свій код, спробуй знайті хоча б 2 рішення схожої задачі. Можливо, ти знайдеш там щось корисне для себе.

Команда. Навчися працювати в команді. Без гарних відносин робота менш якісна. Вчись розуміти інших членів команди, незалежно від їх досвіду.

Ментор. Це твій помічник, який підкаже, дасть пораду або насварить, якщо ти робиш щось дуже неправильно. Він потрібен.

Не бійся. Не бійся важких тасків (інколи вони тільки здаються важкими). Не бійся спитати поради. Не бійся сказати: «Я вже все спробував і не знаю, як це зробити. Підкажіть, куди рухатись».

Будь упевнений. Вмій відстоювати свою точку зору. Інколи твоя ідея чі варіант реалізації може бути кращий, ніж в інших, але це потрібно довести і пояснити.

Критика — це не зло. Вчися сприймати критику, якщо вона доречна. Будь стіким до неї. Вмій взяти з неї якомога більше корисного для себе.

І наостанок головне. Практика — запорука успіху. Чим більше практики, тим краще, тим більший досвід, тим швидше твої пальці самі «знатимуть», що писати. Практикуйся якомога більше. Прочитавши щось цікаве в книжці або статті чи почув від когось — спробуй реалізувати, поекспериментувати. Так ти швидше все є ятаєш.

І знай, C++ неможливо вивчити повністю :) Завжди буде щось нове, що ти не знатимеш, тому не лякайся. Просто читай і постійно практикуйся.

Ресурси, які допоможуть:

Опубліковано: 11/07/18 @ 11:05
Розділ Різне

Рекомендуємо:

В ІТ без диплома: історії Technical Architect, Front-end Dev, Product Manager та інших
Centers of Excellence – майбутнє аутсорсингу?
Ruby/Rails дайджест #19: нові версії фреймворку Sinatra, реліз Ruby 2.6.0-preview2, матеріали з RubyKaigi 2018
C++ дайджест #5: огляд С++ 17 та 20, реліз Visual Studio 15.8 Preview 3
4 важливих ради для команди бізнес-аналітиків