Привет!

Представляем вашему вниманию дорожную карту для изучения языка программирования C++. Идея дорожной карты возникла после проведения десятков собеседований молодых разработчиков, которые претендовали на роль Junior Developer C++, но обладали довольно слабой подготовкой. Часто можно наблюдать, что у молодых разработчиков формируется некорректное представление о языке по нижеперечисленным причинам:

  • поверхностное изучение в ВУЗе, мнимое представление о том, что C++ - это просто "Си с классами"

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

  • параллельное изучение C++ с иным более простым языком, например Python, и попытки натянуть практики других языков в обход философии C++

TL;DR

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

Вот ссылка.

Если вам интересна история создания, то читайте данную статью дальше.

Предыстория

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

Я изучил текущее состояние и количество доступных материалов как по C++, так и по другим языкам (Java, C#, JavaScript и т.д.). Результаты поиска для других языков привели к следующим наблюдениям:

  • Наличие актуальной книжной библиотеки, в особенности обилие материалов для новичков

  • Обилие различных видеокурсов в свободном доступе

  • Наличие дорожных карт, которые помогают сориентироваться новичкам при обучении

По всем вышеперечисленным пунктам у C++ оказались сплошные провалы:

  • Много литературы, которая потеряла свою актуальность или написана сложным языком, отпугивающим новичков. Я не сторонник жевания кактуса, потому начал копаться в этом направлении: какие источники могут стать полезными в 2021 по C++.

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

  • Дорожная карта. А что это вообще такое? Лучшее, что я смог найти - довольно вялые попытки братских народов из азиатских и индийской республик. Большая часть попыток умерла, так и оставшись в зародыше

Создание видеокурса требует колоссальных ресурсов, к тому же на СНГ рынке представлены пара достойных онлайн курсов/видеокурсов, потому в эту сторону было решено не идти. А вот собрать литературу, отрисовать дорожную карту и сопроводить материалы различными комментариями выглядели вполне посильными задачами. На том и было решено остановиться.

Для чего это всё?

Можно бесконечно долго спорить, что язык C++ — это умирающий язык, что его победит %yet_another_brilliant_language%. Для этих обсуждений мы приглашаем вас в комментарии. Тем временем рынок и желание кандидатов говорят совершенно об обратном: специалисты, владеющие языком, по-прежнему требуются на рынке, а также ощущается их острая нехватка не только в России, но и на международном рынке. Данной дорожной картой мы хотим попытаться хоть немного заполнить имеющуюся брешь. Опять же, каким-то образом надо переписывать миллионы строк кода с C++ на %yet_another_brilliant_language% ;)

Первые шаги

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

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

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

Основная стадия

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

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

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

К концу Сентября наши силы и мотивация стали иссякать. Потому было решено сделать последний рывок, и выкатить в свет MVP версию карты. Навалившись на последние крупные пробелы, мы дописали необходимые статьи и комментарии к дорожной карте.

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

Мы решили попробовать пустить инфошум в какой-нибудь социальной сети. В качестве стартовой площадки выбрали твиттер, т.к. обитаем в местном айтишном окружении. Был опубликован твит-анонс со ссылкой на репозиторий. Чтобы придать больше огласки, мы попросили поретвитить сообщение твиттерян-тысячников, за что им неземная благодарность!

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

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

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

В заключение

Спустя ~6 месяцев работ над картой и её публикацией в разных источниках мы видим устойчивый спрос на информацию, представленную в дорожной карте и в репозитории. Суточная посещаемость репозитория составляет ~100 уникальных пользователей в день. Это отличный результат, на который не было никакого расчета, когда затевался весь этот проект.

Какие преимущества данного проекта хочется выделить:

  • Графическая дорожная карта, которая с недавнего времени стала доступна для модификации/доработки любым желающим при помощи GraphML

  • Сформированный список литературы, под конкретный грейд разработчика

  • Наличие списка пет-проектов, которые могут быть взяты за основу для наработки практического опыта в применении языка или библиотек/фреймворков

  • Проект выполнен на русском и английском языках, что расширяет границы целевой аудитории

Финальным аккордом данного проекта мы поставили для себя публикацию на Хабре, про что вы любезно читали на протяжении всей статьи. За это вам огромное спасибо!

Обратная связь

Мы открыты для обратной связи, потому любые идеи и предложения вы можете описать в комментариях статьи, в разделе "Issues" репозитория, или же самолично поучаствовать в развитии ресурса, присылая Pull Requests.

Ссылки:

P.S. Отдельная благодарность @LuggerMan за детальное вычитывание статьи, а также за помощь в исправлении ошибок!

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


  1. Emelian
    05.12.2021 16:24
    -2

    Хорошая работа, интересная информация. Надо будет вникнуть глубже. Но пока вопрос на вскидку, как там насчет программирования пользовательского графического интерфейса средствами WinAPI / C++? Проблема в том, что почти все контролы WinAPI отставляют желать лучшего, для собственных задач. Можно конечно делать сабклассинг, но иногда проще наваять собственный контрол, несмотря на наличие разного рода фрейморков, начиная от mCtrl / WTL / Win32xx и заканчивая wxWidgets и Qt. А вот по идеологии программирования пользовательских контролов есть некоторые вопросы.


    1. allcreater
      05.12.2021 18:46
      +6

      Программирование UI и хорошие практики в нём - отдельная тема, не очень связанная с языком программирования. Хотя, безусловно, интересная, и очень важная для тех разработчиков, кому приходится этим самым UI заниматься.


      1. salmer Автор
        06.12.2021 10:21
        +3

        Как с языка сняли! Мы с коллегами долго думали над этим вопросом, стоит ли как-то акцентироваться на тех же UI фреймворках более подробно и т.д.

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


        1. DrMefistO
          06.12.2021 20:25
          +1

          Не согласен с вами. Тащить другой язык в проект на Плюсах, только ради того, чтобы гуй отрисовать - бредятина полная. Я, как программист на языке L, хочу юзать только язык L.

          Если коробочной возможности их рисовать нет, а приходится юзать всратую стотонную хрень типа кьюта - то так и скажите. Молодцы разрабы Java, которые изобрели идущий из коробки swing. Молодцы авторы python, которые внедрили tkinter в дистр. А что сделали плюсовики, кроме ещё одного стандарта и способа выстрелить себе в ногу?

          Да даже у сишников (правда линуксовых), есть чуть ли не де-факто gtk. У дельфистов - vcl, который также из коробки.

          Вот сделают плюсовики возможность гуй из коробки или хотя бы чем-то универсальным пилить - будет неимеоверно круто. А сейчас плюсы - для библиотек, для консольных приложений. Всё остальное (фреймворки по 400 МБ) - из пушки по воробьям, да.

          Наболело.


        1. Emelian
          06.12.2021 21:23
          +1

          делать UI на плюсах, все равно что из пушки по воробьям стрелять

          Если посмотреть исходники Виндоуз, которые утекли в сеть, то интерфейс там написан на Си. M$ выложила в опенсорс и исходники MFC, которые тоже написаны на Си / С++. Интерфейсные библиотеки mCtrl / WTL / Win32xx тоже написаны на Си, не говоря уже об интерфейсных монстрах wxWidgets и Qt.

          Поэтому я бы не торопился давать оценку Си/С++ для целей создания GUI. Даже если кто-то хочет писать интерфейс на ассемблере, пусть пишет. Можно подумать, что народ не знает, что низкоуровневые языки весьма трудоемкие. Знает! Но интересы у всех разные. Если что-то не нужно одному, то это не значит, что оно не нужно другому. Вопрос не в этом, а в том, как это делать технически грамотно.

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


    1. loginsin
      06.12.2021 02:54

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


      1. salmer Автор
        06.12.2021 10:24
        +1

        Технически возможно все, но стоит ли стрелять "из пушки по воробьям"?

        Для UI есть более доступные инструменты, на которых можно построить графический интерфейс, но гораздо быстрее/проще/качественнее. Лучше стоять на принципе - каждому инструменты - надлежащее применение. Зачем строить звездолет, когда требуется перетащить пару мешков цемента?


        1. flx0
          06.12.2021 11:42
          +6

          Боюсь даже предположить, что это за более доступные инструменты. Электрон, поди? Тащить браузерный движок для того чтобы нарисовать несколько кнопок — это даже не из пушки, это из ядерной гаубицы. Зато доступно...


          1. salmer Автор
            06.12.2021 12:04

            Ради нескольких кнопок может быть и не стоит, тогда в рамках дискуссии стоит провести четкую границу: какой UI собираемся строить? Для какого проекта и какого размера?

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

            Если это какое-то крупное коммерческое решение - то пилить UI на C++ - очень уж опрометчивое решение. За исключение можно взять легаси-наследие, которое приходится тащить, просто потому что это уже есть, а переписывать никто не берется (тот же UI на MFC и чем-то аналогичном).

            В противном случае, определенно стоит смотреть в сторону других стеков, т.к. и специалистов больше, и экспертиза лучше. Все-таки большая часть IT-продуктов живет нынче не на десктопе, а в вебе/мобилках. Отрисовать json-молотилку или очередной crud на C++? Очень и очень спорное решение. Пусть все-таки язык занимается ровно тем, под что он заточен, а не "кнопки двигает" :)

            Возможно в этом поле только Automotive стоит особняком, т.к. UI на Qt там прочно занял нишу. Или же Gamedev, т.к. многие вещи, либо на готовых движках пилится, либо свои кастомные велосипеды.

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


    1. PsihXMak
      06.12.2021 11:13

      Берём Rad Studio, 5 минут и интерфейс готов.

      Проектирование простых интерфейсов в современных реалиях, по моему, совсем не проблема.


      1. salmer Автор
        06.12.2021 12:15
        -1

        Тогда возникает закономерный вопрос: для чего во многих компаниях сидят десятки UI/UX специалистов, которые пытаются построить удобные и дружелюбные интерфейсы?

        Я вдоволь насмотрелся на эти "5 минутные" интерфейсы, прямиком из нулевых, где представлены тысячи вкладок в одном окне, а в каждой вкладке десятки и сотни кнопок/выпадающих списков/селекторов и т.д.

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

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


        1. PsihXMak
          06.12.2021 12:25
          +2

          Разве эти десятки UI/UX специалистов будут использовать C++ для написания интерфейсов? Очень сомневаюсь.


          1. salmer Автор
            06.12.2021 12:30

            Вот и я ровно о том же :)


  1. embden
    05.12.2021 17:07
    +12

    А вот наша roadmap по изучению python: https://docs.google.com/document/d/1N-SxSRbe5eaV3z4BEknNVB1G7EKgtfdgVmTyy-q95fY/edit

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

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

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

    В-третьих, вы указываете часто, что сделали свой проект для новичков. Но при этом там есть материалы и для мидлов, и для синьоров.

    В-четвертых, роадмапа по C++ содержит много материалов по мотивации и коммуникации. Если вы начинаете раздел "Книги для Pre-Junior" с книжки про мотивацию, то тут вы часть людей и потеряете - они скачают книжку, начнут её читать и разочаруются, что до сих пор не учатся программировать.

    Просуммирую. Мне кажется, что от роадмапы людям нужна простая последовательность. Прошёл курс - переходишь к следующему. И так движешься из точки А в точку Б. Если у вас до списка материалов для обучения нужно дочитать до седьмого пункта, а потом еще перейти по паре ссылок, то мне кажется, это свидетельствует о неком переусложнении роадмапы.

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


    1. salmer Автор
      06.12.2021 10:54

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

      2. К сожалению задать супер четкую последовательность для C++ - довольно сложная задача. Мы начали строить что-то подобное, но в ходе работы поняли, что впихнуть "невпихуемое", не представляется возможным. Такова цена компромисса, за возможность получить обзорную информацию, что нынче ожидается от среднестатистического плюсовика (в отрыве от конкретных специализаций)

      3. Все верно. Секции для миддлов и синьоров предназначены для того, чтобы показать дальнейший вектор развития, когда планка джуниора достигнута. Вопрос роста заботит многих джунов не меньше, чем просто "вкатиться". Так что данные ресурсы - примерный вектор направления их движения.

      4. К сожалению мы не можем удовлетворить всех и вся. Если человек отвалится на мотивационной книге, которая призвана замотивировать, то такому человеку стоит искренне задать самому себе вопрос: "А это действительно то, чем я хочу заниматься и положить на это месяцы своей жизни? Не будет ли разочарования в конце пути?" Наш проект - не инфоцыганство, и не курсы, чтобы заманивать кого-то к себе. Мы лишь "даем удочку", а брать её или нет - решать читателю.

      5. Увы, по плюсам к сожалению нет и не будет "серебрянной пули" (единственной книги), по которой можно будет раз и навсегда преисполниться познанием языка. Да и в других языках ситуациях идет ровно к тому же. Языки растут и развиваются, добавляются новые фичи и возможности, которые не уместить в одну книгу.


      1. domix32
        06.12.2021 14:15
        +2

        Да вы б ваше дерев миро хотя бы в виде текста бы хоть как-то оформили. Навигация по этому делу дико неудобная. Заходишь на сайт и ожидаешь, что вот тут basics, тут вот для тех кто побородатее, а видишь какие-то левые статьи про почему и куда плюсы, легенды и мифы и примерно 0 роадмапа кроме ссылки на Миро.
        Надо чтобы было хотя бы какое-то оглавление, хотя бы в таком виде.


        ├─???? Step 1
        │  ├──???? Basic operations
        │  │   ├──???? Arithmetic operations
        │  │   ├──???? Log operations
        │  │   ├──???? Bitwise operations
        │  │   └──???? Flow control
        │  │         ├──???? Loops
        │  │         └──???? Conditions
        │  ├──???? Functions
        │  │   ├──???? operators
        │  │   └──???? lambdas
        │  ├──???? Data types
        │  │   └──...
        │  └── ...
        └── ...


        1. salmer Автор
          06.12.2021 16:26

          Мы готовы принять любую помощь от коммьюнити, чтобы дорожная карта приняла иной облик, отличный от текущего. Вы можете помочь нам с переформатированием дорожной карты в текстовом виде, так что с радостью ждем PR'ов.


          1. domix32
            06.12.2021 17:13

            Тут сначала надо подумать будет ли это просто табличка-список вроде моей или может имеет смысл сделать что-то вроде Rust Book или OS Blog только для C++? Вас устроит PR с оверхолом всей репы c переездом генерации на какой-нибудь mdbook или zola?


            1. salmer Автор
              06.12.2021 20:07

              Изначально было в планах создать дорожную карту, а затем её каждый листик сопроводить дополнительными комментариями/ссылкой на мини-статью в репозитории. В какой-то момент стало понятно, что эта задача для нас слишком масштабная, потому было решено от нее отказаться.

              Базовую структуру для подобной организации комментариев мы создали в репозитории, но затем забросили. На тот момент считалось достаточным просто приложить ссылку на страничку гитхаба к каждому листику: https://github.com/salmer/CppDeveloperRoadmap/tree/main/Russian/Notes

              Вы хотите сделать примерно тоже самое, или же дополнительно заняться описанием каждого листа?


              1. domix32
                07.12.2021 11:58
                +1

                По-хорошему — было бы неплохо иметь детализацию по каждому из листьев. Но самое основное — Roadmap подразумевает некоторое направление и древо в Miro его не очень-то отражает и было бы неплохо сделать из этого действительно дорожную карту как вырасти в программиста C++ за 21 день.
                Плюс часть листьев определенно есть смысл детализировать, тк в вашем миро есть PIMPL, но нет RAII и SFINAE, да и STL, есть Core guidlines, но нет gsl. Фичи разных стандартов тоже в дереве никак не отображены. Есть ветка про сборочные системы, но нет ничего про компиляторы и компилирование без cmake, инфы хотя бы про gcc/llvm/msvc.
                К выходным может быть в отдельной ветке намострякую какой-нибудь прототип на zola.


                1. salmer Автор
                  07.12.2021 12:42
                  +2

                  • RAII есть - см. ветку "Идиомы", находится рядом с pimpl (Этап 4)

                  • SFINAE есть - см ветку "Шаблоны (Этап 4, предшествует идиомам)

                  • STL есть, названа как "Стандартная библиотека" (не очень удачное название получилось). В ней перечислены основные части STL (Этап 3)

                  • Компиляция представлена в ветке "Компиляторы" (Этап 3 - часть 2)

                  • Про gsl - хорошая ремарка, думаю, что стоит это добавить в карту

                  Соорудить иерархию - несложно, а вот детализировать листья - уже другой вопрос, да и стоит ли? Информацию по листьям уже можно поискать в книгах/интернете.

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


                  1. domix32
                    07.12.2021 14:10

                    Не следил за апдейтами карты, так что если появилось — отлично. Можно еще Passkey добавить к идиомам.
                    Базовые вещи наверное придется расписать. Да и список ссылок рекомендованных к прочтению вроде тоже не нулевой размер имеют.
                    Библиотеки/фреймворки тоже имеет смысл разделить по типам.


  1. JaroslavTavgen
    05.12.2021 19:16
    +4

    Можно бесконечно долго спорить, что язык C++ — это умирающий язык, что его победит %yet_another_brilliant_language%. Для этих обсуждений мы приглашаем вас в комментарии. Тем временем рынок и желание кандидатов говорят совершенно об обратном: специалисты, владеющие языком, по-прежнему требуются на рынке, а также ощущается их острая нехватка не только в России, но и на международном рынке

    Потому что кандидаты хотят денег, а это не вписывается в философию компании?


    1. salmer Автор
      06.12.2021 10:18

      На рынке представлена масса компаний, которые платят в диапазоне рыночных вилкок и выше. Беда тем компаниям, у которых нет возможностей/желания платить достойно. Вывод напрашивается сам собой: профессионалы сами перетекут туда, где платят хорошо, а где не платят - утекут :)


      1. JaroslavTavgen
        06.12.2021 12:21
        -1

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


        1. salmer Автор
          06.12.2021 12:28
          +2

          Предлагаю остановить обсуждение этого вопроса, т.к. данная статья ровно о другом.

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

          Продолжать же полемику не вижу никакого смысла, все равно никто никому ничего не докажет :)

          Мы никого никуда не привлекаем, и никого никуда не пытаемся заманить подешевле. Данный проект - исключительно альтруизм нескольких человек, которые увидели проблему и решили объединиться вокруг нее (и решали её в рамках ограниченного ресурса).


          1. JaroslavTavgen
            06.12.2021 12:34
            +1

            Окей. Прошу прощения за резкость.


            1. salmer Автор
              06.12.2021 12:47

              Спасибо за понимание!


  1. OlegZH
    05.12.2021 19:54

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


    1. salmer Автор
      06.12.2021 10:15

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


      1. OlegZH
        06.12.2021 14:03

        Пояс?


        1. salmer Автор
          06.12.2021 14:10
          +1

          Искусство разработки на современном C++. Курс поделен на этапы. Каждому этапу создатели присвоили "цвет пояса" (по аналогии из боевых искусств), который описывает уровень сложности. Многим этот курс известен, потому его частенько называют коротким названием "Пояса C++".

          https://ru.coursera.org/specializations/c-plus-plus-modern-development


          1. OlegZH
            06.12.2021 18:46

            Теперь ясно.


  1. mrbald
    05.12.2021 20:36
    -2

    "C++ is still ..." - ну-ну, хорошее начало.


  1. akaAzazello
    05.12.2021 22:50
    +16

    Только мне кажется, что вы переборщили с картинками в статье? Да и не техническими англицизмами тоже.


    1. gatoazul
      06.12.2021 10:45
      +1

      Роадмапа, май эсс!


  1. Daddy_Cool
    05.12.2021 23:10
    +6

    Мне реально интересно.
    Я давно хочу научиться ++, потому что пишу на самом деле на Си с минимальными плюш-плюшками. Основная проблема с которой я сталкиваюсь — зачем мне всё это в зоопарке, т.е. язык более низкого уровня позволяет написать всё то же самое, хотя и более громоздко.
    Походил по ссылкам и посмотрел. В статьях — полезные пункты 10 и 11, там где сами карты — всё ужасно монструозно и взглядом не охватывается. На моем 24" мониторе приходится всё уменьшать… и становится нечитаемо. Если распечатать на А0 и повесить на стенку только.
    По моим ощущениям, базовые навыки программирования есть почти у всех — Бейсик в школе, Паскаль в институте. Дальше хочется С++. А каждая возможность С++ она ж не просто так — она зачем-то нужна, вот и хочется описание возможностей с объяснением зачем они нужны и жизненными примерами причем из разных областей. Но это большая работа и непонятно зачем её кому-то делать.
    А пока… выглядит так — свалили в кучу общедоступную информацию и переструктурировали оглавления нескольких книжек по С++.


    1. elektroschwein
      06.12.2021 02:18
      +4

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

      Вы сказали, что вы пишите на Си. Задайте себе вопрос: зачем люди пишут на Си, если все то же самое можно написать на ассемблере, хотя и более громоздко? Ответ на этот вопрос целиком и полностью будет ответом на вопрос "Зачем есть те или иные вещи в C++". Меньше действий и кода который нужно делать руками с нуля, лучше переносимость, лучше защита от ошибок и человеческого фактора при кодировании - благодаря к написанию и структурированию кода (ООП, шаблоны, неймспейсы, и т.д.), гораздо более богатой стандартной библиотеке, фичам самого языка (типобезопасность, RAII, и т.д.)


    1. loginsin
      06.12.2021 03:01
      +2

      Абстракционизм, паттерны и всякое такое. В плюсах это делается чуть дешевле, но за счёт б0льшего количества "плюшек" выглядит дороже. Нужно (хотя бы вкратце) ознакомиться с историей языка, чтобы понять цель введения той или иной возможности.


    1. le2
      06.12.2021 09:37
      -1

      для меня ни C++, ни любой другой язык самостоятельной ценности не представляет. Представляют библиотеки написанные на этих языках. Не всегда удается работать через интерфейсы к своему любимому языку.
      Если нужен бульдозер — идешь учится на бульдозериста, а не прикручиваешь моторчик к своей лопате.
      Некоторые вещи, например Bluetooth-стек просто написаны под объектную модель. Матрешка непрерывно разворачивается, а потом разрушается при каждом соединении. Также все работает когда соединений несколько. Теоретически можно написать всё на большинстве языков, но проблема в том что таких библиотек в твоем проекте могут быть десятки и каждая потребовала человеко-десятилетий разработки.
      То есть проблема что это «не более громоздко», а то что ты это не напишешь никогда — не хватит жизни.
      Верно и обратное. Когда кто-то в одиночку грозится переписать большой проект на Rust и С++ то что было написано на Си мне тоже очень смешно. Соревнование с человеко-тысячелетиями труда также окончится ничем, если за тобой не стоит корпорация.


    1. salmer Автор
      06.12.2021 10:33

      валили в кучу общедоступную информацию и переструктурировали оглавления нескольких книжек по С++

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

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

      Так что "свалить в кучу" - тоже нужно приложить массу усилий: отфильтровать и отобрать то, что в эту кучу стоит поместить, а что отбросить :)

      Опять же, есть добротные курсы по C++, но конкурировать с ними - непосильная задача. Наша работа больше для тех, кто предпочитает самостоятельное обучение.


      1. domix32
        06.12.2021 14:29
        +1

        вектор движения.

        Только вектор выглядит как в том анекдоте


         - Командир, нас окружили!
         - Отлично, теперь мы можем атаковать в любом направлении!


  1. G1ROG
    06.12.2021 03:57
    +20

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

    Поверхностное изучение в ВУЗе, мнимое представление о том, что C++, это просто "Си с классами"

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

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

    На вопросы моих однокурсников о том, почему вы плюётесь от чистой Сишки и плюсов, ответы были примерно такие:

    1. Уродливый и сложный синтаксис по сравнению с другими языками.

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

    3. Борьба с языком, управление памятью, сырые указатели...

    Как по мне, синтаксис многословный, но терпимый, мне нравится. К сожалению, STL почти не ковыряют и не знают о существовании умных указателей, как и о том, что в прикладных программах new/delete - моветон.

    Лично мне C++ очень нравится и я его выбрал не потому что там в универе он идёт по стандарту, а поскольку я понимаю зачем и для чего он мне нужен. Сейчас ковыряю Unreal и в дальнейшем планирую стать рендерщиком.

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

    1. Для большинства джунов дорога с C++ видится либо в Qt, либо в Unreal Engine. (В геймдеве открыт вопрос о ЗП ниже, чем по рынку и возможно кранчи)

    2. Порог входа выше, чем в остальные языки, учиться также придётся дольше. Процитирую одного дядьку из варгейминга - "Если хотите денег, человек за 6-8 мес. может более менее научиться Java, пойдёт в банк и будет получать неплохие деньги. При изучении c++ за такой же срок ты станешь только чуть-чуть джуном. Разница в подготовке программиста год-полтора." Лично пока я изучал этот язык, я забухал на две недели... Хороших и доступных материалов также меньше, как отметили в статье.

    3. Нежелание учиться работать с указателями и памятью на первых порах. Сейчас мейнстрим таков, что GC подтирает за тобой пятую точку.

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

    5. Скорее всего потребуется знание университетской математики, поскольку плюсы - это про хайлоад и производительность. Линейная алгебра для геймдевелопера, оптика для рендер-программиста, для HTF какая-нибудь мат. оптимизация...

    6. Для большинства, какой смысл так париться, когда можно пойти клепать формочки для мобилок или сайтов, и зарабатывать не сильно меньше.

    7. Необходимо хотя бы базово понимать как работает железо и операционная система и вообще всем этим интересоваться, большинству это не нужно.

    8. Иногда подобные https://habr.com/ru/post/497114/ статьи от @0xd34df00dговорят тебе в ухо шепотом - "Не лезь туда, оно тебя сожрёт"

    9. Ну и конечно отборнейший мем, который как нельзя кстати, подходит к отладке шаблонов


    1. salmer Автор
      06.12.2021 10:10

      Спасибо за столь развернутый ответ, что поделились своими впечатлениями про обучение и язык. Вы гораздо лучше передали то, что мы в несколько строчек упаковали в самом начале статьи!


    1. FloorZ
      06.12.2021 10:15
      +7

      1. Уродливый и сложный синтаксис по сравнению с другими языками.

      Посмотрите на Objective-C и ужаснитесь)


      1. domix32
        06.12.2021 14:31

        А вы думаете его просто так в экосистеме яблок оставили? Это ж прямая иллюстрация "Лазарево Лазарю"


    1. DistortNeo
      06.12.2021 12:31

      Я бы ещё в минусы C++ добавил: медленная, очень медленная сборка приложений. Отбивает всякое желание писать что-нибудь действительно серьёзное.


      1. salmer Автор
        06.12.2021 13:00

        Есть такая беда, согласен.

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

        Вечная борьба, которую пока никто так и не смог возглавить и одержать полноценную победу.


      1. allcreater
        06.12.2021 18:44
        +1

        Это не бага, это фича! :)

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

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

        общеизвестный пример про стандартные алгоритмы
        В то время как сишная функция qsort вынуждена принимать указатель на функцию сравнения, std::sort может заинлайнить компаратор, избавившись от лишних переходов по указателю. Но да, ценой инстанциирования шаблонов на этапе компиляции, инлайнинга, вычислений constexpr… Всё это небыстро.


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


        1. salmer Автор
          06.12.2021 19:53

          Все так, извечная борьба, от которой пока не придумали как уйти: скорость vs удобство.


  1. rostislaved
    06.12.2021 04:14
    +3

    Хотел написать про книги.

    1.

    Томас Кормен - Алгоритмы. Вводный курс максимально бы не советовал эту. Она сложная. Об этом говорят и комментарии на амазоне\quora и самому мне так показалось.

    Есть великолепная книга про алгоритмы для новичков, но к сожалению только на англ:

    A Common-Sense Guide to Data Structures and Algorithms ( https://www.amazon.com/Common-Sense-Guide-Structures-Algorithms-Second/dp/1680507222 ).

    Автор пишет, что она oversimplified, но она правда крута. Также у автора где-то есть статья про то, как проводить алгособесы, всем советую найти и почитать :)

    2.

    Андрей Созыкин - Компьютерные сети. Базовый курс

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

    Таненбаума джунам тем более нельзя читать для базового понимания)

    Мне сложно тут говорить, ибо сам в поисках, но пока, есть подозрения, что будут лучше:

    2.1 Книга Олиферов по сетям (не та, которая большая, как Таненбаум, а короткая в 300 стр).

    2.2. Курс ссна

    3.

    Эндрю Таненбаум - Современные операционные системы

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

    По операционкам есть просто великолепная (опять же без перевода на русский):

    Operating Systems: Three Easy Pieces ( https://pages.cs.wisc.edu/~remzi/OSTEP/ ) - ее читать было сплошным удовольствием.

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


    1. salmer Автор
      06.12.2021 09:53

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

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

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


    1. k-morozov
      06.12.2021 12:33

      Читал архитектуру Таненбаума и очень не зашла. Прямо максимально. Но прочитав половину Современные операционные системы, был в восторге. Лучшая книга наверное про ОС.


  1. siroga_ua
    06.12.2021 09:44
    +1

    Очень интересная идея с roadmap. Также понравилось, что єсть список рекомендованной литературы для каждого уровня скила разработчиков. Нужно будет детально изучить всё из списка, чтобы понять, насколько всё это соответствует, но думаю из вашего опыта должно быть актуально! Включение в список не техническую литературу (книги об мотивации и подобное) решение, которое достойное похвалы.


    1. salmer Автор
      06.12.2021 10:36

      Спасибо! Надеюсь, что вы найдете для себя что-то полезное и интересное!


  1. Prostranny
    06.12.2021 09:44
    +1

    Класс! Какие же вы молодцы, ребята. Ваша работа поможет многим


    1. salmer Автор
      06.12.2021 10:37

      Спасибо! Мы искренне верим, что кого-то данный материал вдохновит и поможет пройти через тернистый путь изучения языка.


  1. Gordon01
    06.12.2021 10:51

    Cmake, Conan и Ninja?

    Зачем над людьми издеваться?

    Есть premake, есть xmake (который вообще заменяет сразу несколько инструментов)? Зачем мучить людей тридцатилетним легаси?

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


    1. salmer Автор
      06.12.2021 11:02
      +3

      Собственно я и начну с ответа, что "они популярны", и представлены практически повсеместно во многих крупных проектах.

      Я понимаю, что модное/стильное/молодежное всегда вкуснее и приятнее, нежели чем "проклятое" легаси. Никто не запрещает изучать модные штучки, но придя на проект, скорее всего придется столкнуться с богоугодными Cmake/Conan/Ninja. Если о них не упомянуть, то может случится большое разочарование у новоиспеченного плюсовика.

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


  1. igrishaev
    06.12.2021 11:05
    +7

    У вас вышла дорожная карта по изучению мемов.


  1. etozhesano
    06.12.2021 15:35
    +6

    50 комментов и никто не скинул это? Исправляю.


    1. salmer Автор
      06.12.2021 16:14

      И правда странно :D


    1. MTonly
      06.12.2021 16:40
      +2

      PNG с JPEG-артефактами — это всегда впечатляюще.


  1. Amomum
    06.12.2021 18:44

    На мой взгляд, есть еще очень большая проблема вот какого плана: если гуглить по-английски любые вопросы по С и С++ - попадаешь на stackoverflow и cppreference, а если гуглить по-русски, то оказывается, что ресурсов-то особо и нет!

    И в выдаче будет либо машинный перевод того же stackoverflow, либо какой-нибудь простите cyberforum, где точно такие же джуны обмениваются кодом даже не обернутым в теги.

    Учебники вроде как есть, но их много и они большие, а вот на короткий простой вопрос ответ хрен найдешь.

    И видеокурсов тоже как-то не густо русскоязычных.

    Соответственно за эту дорожную карту вам большое спасибо :)


    1. salmer Автор
      06.12.2021 19:51

      Все верно говорите! И вам спасибо за обратную связь!


  1. Ents
    07.12.2021 14:49

    Вот есть сайт как раз для формирования подобных роадмапов с привязыванием обучающих материалов: https://infinite.education/skillset/linux_administrator

    Из крутого: там можно отмечать что ты уже знаешь, а что не знаешь. Круто было бы оформить роадмап в этом формате


  1. TimurBaldin
    08.12.2021 12:23

    Спасибо за статью !

    Мне кажется, что хорошая дорога в C++ лежит через другие языки (Java, C#…может быть Python или Go)…

    Мне как разработчику чьи основные инструменты это Java и Python очень интересен С++ для высокопроизводительных бэкендов)