Недавно у нас на GeekBrains стартовал свежий курс "Профессия: разработчик C++". Программа позволит всего за 9 месяцев освоить этот непростой язык и стать специалистом уровня junior. А это непростая задача. К примеру, в школах и ВУЗах на изучение С++ уходит минимум 2 года, чаще 4-5. Чтобы показать из чего состоит этот нелегкий путь, мы схематично описали для вас основные этапы.

Этап 1. Алгоритмическое программирование


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

Несмотря на универсальность подобного метода, его редко встретишь даже на первых занятиях по Java или C#, хотя там он тоже был бы полезен. Чаще всего алгоритмическое и блочное программирование проходят, когда студенты уже знакомы с синтаксисом. А вот в С++ это фундамент.


Этап 2. Pascal, Basic и C


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

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

Этап 3. Среда для разработки — наипростейшая


В любом языке программирования надо начинать писать программы не в сложных IDE, а в простых универсальных редакторах. Notepad++ для этого отлично подойдёт, тем более, что название намекает на правильность выбора. Всё, что вам нужно сейчас, это подсветка синтаксиса и функция проверки. В студенческом образовании также практикуется написание кода на бумаге. Причина проста: экзамены по программированию в 21 веке всё ещё иногда сдаются без компьютеров.

Если у вас есть Linux (а если вы планируете стать программистом, то лучше установите его немедленно), то вопроса с выбором среды может вообще не стоять — просто откройте командую строку.

Любители олдскула могут попробовать установить себе на компьютер Borland C++, благо многие нынешние «крестоносцы» с теплотой и любовью относятся к этой серии (работать в ней реально удобно). Но для нормальной работы у вас есть незначительный выбор между Visual Studio и Qt Creator, в зависимости от задач.

На данном этапе остановим свой выбор на блокноте.


Этап 4. Начинаем с консолей


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

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

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

Этап 5. ООП


ООП — лестница от примитивной возни с кодом к комплексным структурам, лежащих в основе
таких продуктов, как Chrome, World of Warcraft и Linux. Также ООП является ключевой разницей между C и C++. В классическом образовании уделяется много времени изучению принципов ООП, ведь без досконального понимания, что это и зачем, вы будете создавать тонны лишнего и неправильного кода, пытаясь оправдать это личным удобством.

Так что на этом этапе придётся вернуться к процедурному и алгоритмическому программированию при помощи бумаги и ручки, потренировавшись чётко описывать объекты пути наследования и инкапсуляции. Совсем скоро это понадобится.

Этап 6. ООП в С++


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

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

Этап 7. Qt и начало графического программирования


«Классическое» образование на этом этапе сразу мигрирует в сторону Visual Studio – к созданию простых GUI-приложений в самой популярной IDE. Однако в качестве промежуточного варианта полезно будет использовать Qt благодаря его встроенным графическим библиотекам, позволяющим полноценно задействовать все ваши свежеиспечённые познания в C++ и ООП.

Эту остановку полезно будет сделать любому изучающему C++ ради будущих профессиональных перспектив и общего развития навыков. Благо, в Qt есть отличный встроенный помощник и много руководств по созданию разных типов приложений, так что проблем с освоением быть не должно. Даже если дело касается продвинутых навыков.



Этап 8. Visual Studio


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

Этап 9. Выбор специализации


Так как C++ невероятно востребованный язык почти во всех областях программирования, на этом этапе вы можете подумать, чем бы вы хотели заниматься в будущем. К примеру, если вы планируете работать с железом, то есть с микроконтроллерами, то придётся изучить библиотеки для работы с конкретными устройствами и средства отладки. Захотите работать в гейм-дизайне — путь лежит в Unity и схожие программы.

Эти 9 этапов не сделают из вас профессионала, но позволят более-менее осознать возможности языка и то, чем занимаются «крестоносцы». Вы можете попробовать преодолеть этот путь самостоятельно, а можете присоединиться к нам. Обещаем, это будет эффективнее и куда интереснее.

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


  1. domix32
    07.12.2018 13:12

    окончательно закрепляют в сознании правильную структуру приложения и файлов

    если с приложением более-менее понятно, то про файлы не понятно совсем. Где про это можно хоть в каком-то виде почитать? Максимум, что в этом случае всплывает в памяти — разброс на include и src для библиотек.


    1. c0f04
      07.12.2018 19:19

      Не уверен, что Visual Studio — это подходящая среда для обучения структуризации исходных текстов. Например, после работы с ОС Linux структурирование файлов в пакетах NuGet у меня вызывает жуткое отвращение.

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

      Из вариантов можно устроиться на работу туда, где есть большие сложные проекты, желательно молодые и быстро развивающиеся, поскольку, главное — не попасть на legacy-проект.

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


      1. domix32
        07.12.2018 23:41

        Собственно я о том же. Тут даже разные проекты с одинаковыми языками и системами сборки разный лейаут используют, о какой правильности речь в статье идет мне совершенно непонятно. Оно практически целиком и полностью зависит от использующей системы: nuget, launchpad/ppa, luarocks, chrome extensions или ещё какие — все имеют определенные ограничения на структуру, но никто не может быть «правильным». Поэтому и задал автору вопрос в тему. Мало ли я чего мог упустить.


  1. nikbond
    07.12.2018 14:34
    +6

    Мне кажется хороший и небанальный подход к обучению с++ изложен в курсах серии «Основы разработки на С++: Белый пояс» на курсере, а здесь перечисление банальностей вперемешку со вредностями.
    И зачем в курсе о С++ блок-схемы, паскаль и бейсик?

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

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

    Также ООП является ключевой разницей между C и C++

    А это вообще неправда.


    1. shfghjsdgfh
      07.12.2018 15:34

      Сложно представить более вредный подход, чем заучивать код и переписывать его в новом синтаксисе. Или чем учить С++ начиная с Си.
      Мне всегда казалось, что это единственный правильный путь. В C++ не принято открыто работать с сырыми указателями, «вручную» управлять памятью и еще много всего, но оно есть под капотом в STL и всех остальных библиотеках. Должен же человек понимать как написать свой аллокатор.


      1. nikbond
        07.12.2018 16:07
        +1

        Должен же человек понимать как написать свой аллокатор.

        Может программист уровня мидла или крепкого джуна и должен, но вот новичек в С++ — вряд ли.


      1. Antervis
        07.12.2018 21:46
        +1

        в этом плане современные плюсы — палка о двух концах: их изучение можно начать и с ооп, и с жонглирования битами/байтами/адресами. Лично мне подход «давайте сделаем вот это просто а потом я вам объясню как это работает внутри» кажется весьма логичным.


        1. domix32
          07.12.2018 23:44

          Из этого можно целых несколько уроков состряпать после — рефакторинг, оптимизация и всякий байтовый тюнинг, а там уже и детальная организация памяти, выравнивание и нюансы компилятора и заверте…


        1. kovserg
          07.12.2018 23:46

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

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


          1. CKOPOCTb
            08.12.2018 02:27

            Кстати, а есть годные источники где аспект организации когда нормально объясняют? Потому что тоже столкнуляся с такой проблемой. А еще было бы интересно про покадровое исполнение кода (с заданой переодичностью как в микроконтроллерах).


          1. Antervis
            08.12.2018 06:19

            Скорость и объём новых знаний которые пытаются засунуть за ограниченное время упираются в ограничения мозга и тех знаний и ассоциаций которые уже есть у студента.

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

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

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


      1. Whuthering
        07.12.2018 22:14

        Все больше и больше говорят о том, что этот путь неправильный, и я с этим утверждением полностью согласен. Даже более того, обучение сначала основам C, а потом перепрыгивания на C++ может привести к тому, что новоиспеченный разработчик будет писать не на C++, а на "C с классами". И ладно если рядом найдутся хорошие менторы и объяснят ему, что так нельзя…
        Посмотрите доклад Кейт Грэгори "Stopbteaching C", она как раз об этом говорит: https://youtube.com/watch?v=YnWhqhNdYyk


        1. Sazonov
          08.12.2018 13:52

          Я прошёл схему Pascal -> C -> WinApi (имхо, паскаль лишний в этой цепочке, но он был полезен более слабым ученикам). Плюсы изучал самостоятельно и первые года 2-3 реальной работы писал на си с классами, пока не познакомился с Qt. Не могу сказать, что это было плохо, но и не сказать что было хорошо. Минусы в таком подходе очевидны — мне было очень сложно приучиться к ООП мышлению и было сложно понять назначение паттернов проектирования. Много времени я был где-то между сильным джуном и слабым мидлом.
          Считаю, что в этой цепочке просто не хватило следующего звена — а именно хорошего жёсткого курса по ООП с изобилием практики. Да, в универе у нас читали ООП (на примере консольных приложений в Делфи, никаких формочек) и читали хорошо. Но на лабах это не закреплялось. К тому же на тот момент я уже работал и мне было не до универа.


    1. Alhymik
      08.12.2018 19:02

      а здесь перечисление банальностей вперемешку со вредностями.
      И зачем в курсе о С++ блок-схемы, паскаль и бейсик?
      На счет паскаля и бейсика согласен — это смешно и грустно одновременно. Один мой знакомый недавно пошел на курсы по вэбу, говорит, крутые, хорошую сумму отстегнул. Я говорю — красавец! И что вы там учите? А он — ну вот флэш начали… Дело в том, что всегда есть фактор выпавшего из струи преподователя, как правило, предпенсионного возраста, который всю жизнь пользовался тем, что уже нахер никому не надо, но что он знает досконально, а новое уже не тянет. Ну и впихивает это наивным нюбасам под тем или иным соусом. В ИТ сейчас реально столько технологий, которые маст кноу, что забирать у людей драгоценное время, забивая их головы непотребом — это просто, чисто по человечески, некрасиво.
      Захотите работать в гейм-дизайне — путь лежит в Unity и схожие программы.
      Вот я, например, к своему стыду, только сейчас узнал, что С++ каким-то боком имеет отношение к Unity. Иди ты?! А в википедии написано, что только C#, JavaScript и раньше Boo.


  1. loginsin
    07.12.2018 15:36

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


    1. mapron
      07.12.2018 17:27
      +2

      Так и подмывает меня скинуть ссылку на видео Kate Gregory «stop teaching C» в таких случаях)


    1. QtRoS
      07.12.2018 19:09

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


      1. domix32
        07.12.2018 23:53

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


  1. terrier
    07.12.2018 15:38

    Этап 4. Начинаем с консолей

    Согласен, программирование для XBOX и Playstation — это настолько важная ниша для C++, что можно к ней примериваться в самом начале обучения.


  1. LAutour
    07.12.2018 16:35
    +4

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

    Угу — а потом при запуске вчитываться в номера строк с ошибками в консоли и искать соответствующие участки кода в блокноте.
    В свое время турбо-паскаль стал популярным в то-числе из-за удобной IDE.


    1. technic93
      07.12.2018 17:49
      +3

      Там опечатка в статье, прямо в заголовке! Должно быть: "Краткий гид по обучению С++: что, когда и на чём НЕ создавать"


  1. Ryppka
    07.12.2018 18:56
    +1

    Как-то однобоко звучит, мне кажется, так разработчиком на C++ не станешь(


    1. RussDragon
      08.12.2018 16:01

      Я бы на самом деле задумался, так ли нужно становиться C++ разработчиком ;)


      1. Ryppka
        08.12.2018 21:49

        Вы об этом лет 20 назад тоже задумались бы?


        1. RussDragon
          09.12.2018 02:03

          Ну так вроде и на дворе немножко не 98-й.


  1. ianzag
    07.12.2018 20:48

    > К примеру, в школах и ВУЗах на изучение С++ уходит минимум 2 года, чаще 4-5.

    Я наверное отстал от жизни, но разве в ВУЗах тем более школах «учат C++»?


    1. Artifeks
      07.12.2018 20:51

      мы учили пару семестров 5 лет назад


    1. NordicEnergy
      07.12.2018 21:58

      Учат, по крайней мере у «электронщиков» был семестр паскаля, 2 семестра С и 2 семестра С++. Про школы не знаю, может в каких-то профильных лицеях? А так в далеком 2003-м в школе у меня был паскаль + html))


  1. Artifeks
    07.12.2018 20:50
    +1

    Схемы -> C -> Qt -> Visual Studio, да еще и линукс приплели, это все сложные слова которые вы вспомнили в своих ассоциациях с С++?


  1. 3axap4eHko
    07.12.2018 22:21
    +6

    Очень странно предлагать пользоваться линуксом и notepad++ вместе