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

Как я пришел к тому, что хочу стать программистом

Изначально я имел примерное представление о программировании. Около полугода писал скрипты на lua, затем, поняв, что данное занятие достаточно интересное и увлекательное (особенно в сравнении с химией, по которой на тот момент я писал олимпиады), твердо решил, что хочу стать программистом.

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

Выбор языка программирования

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

Изучение

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

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

Дальнейшая программа

После прохождения данного курса, мой взгляд пал на лекции ФПМИ, которые проводит Мещерин Илья Семирович, очень приятный и умный преподаватель! Данные лекции использую в качестве источника уже более глубоких знаний о плюсах. Так же читаю хабр, стаковервольф, гугл, чтобы разобраться в некоторых темах. Например: сейчас изучаю аллокаторы, их внутренниим устройством и возможностью реализации своих собственных. И так как наступило лето, то я стараюсь активно практиковаться в написании различных Контейнеров, решении задач. В планах написать свои pool и stack аллокаторы, контейнер tuple, порешать алгоритмические задачи. Заказал себе книгу "Чистый Код", давно хочу ее почитать. Думаю разбирать UE5 или Qt5, или многопоточку(Прошу вашего совета!!!)

Три совета начинающим программистам

  1. Не унывайте, если у вас что-то не получается.

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

  3. Практикуйтесь и учитесь на своих ошибках. Никуда не спешите, старайтесь вдуматься и понять материал (иначе вы закончите ещё не начав).

Что сейчас?

На данный момент меня больше всего тянет к таким сферам как: десктоп разработка, геймдев, автоматизация предприятий, безопасность.

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

Важный вопрос напоследок

Спасибо всем, кто прочитал. Буду крайне благодарен, если поможете мне скорректировать мой дальнейший план действий и дадите свои рекомендации. И напоследок, какой ВУЗ для IT лучше выбрать, думаю насчет СПБГУ, МГТУ им Баумана, ИТМО, ЛЭТИ, РТУ МИРЭА, МИФИ. Заранее благодарю за фидбек, всем хорошего дня!

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


  1. turbolizard
    16.06.2023 07:10
    +3

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


  1. janraks
    16.06.2023 07:10
    +2

    Как выпускник ЛЭТИ, советую поставить его в конце списка (на всякий случай, если в другие не получится).


    1. dalerank
      16.06.2023 07:10
      +6

      как выпускник ИТМО, тоже бы не сказал, что универ дал сильное развитие в плане CS, начал работать на втором курсе и промышленный кодинг показал насколько обучение отстает. Книги, самообучение и реальные проекты, опен сорс сильно помогает. Пиши код!


  1. Sazonov
    16.06.2023 07:10
    +1

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

    Вспоминается поговорка: Кто не писал свои контейнеры - не имеет сердца, а кто тащит их в продакшн не имеет мозга.

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

    Какой ВУЗ выбрать - не имеет особого значения. Я так вообще закончил только Гомельский машиностроительный техникум и три курса БГУИР. Вуз это в первую очередь друзья и связи, и только потом источник знаний. Самообразование и постоянная практика в разы эффективнее.


  1. Aquahawk
    16.06.2023 07:10
    +6

    Независимо от вуза.

    1. Изучай и пробуй разные технологии, максимально разные. Попробуй java, python, typescript, rust, haskell

    2. участвуй во всех мероприятиях и клонкурсах программрования вокруг универа. Там тебя заметят hr корпоратов которые ходят вокруг таких мероприятий. Это хороший старт карьеры.


  1. Dark_Reaper
    16.06.2023 07:10
    +5

    C/C++ сложные для старта, и многие вещи не пригодятся в других языках. Если нет цели связать свою жизнь с ними, то сразу учить другие языки было бы полезнее. Еще, по моему опыту поиска работы в 2021 году, на них мало интересных вакансий(на мой взгляд), много вакансий в гос и окологос. Например, делать embedded системы для военных. С секретностью, и другим геморроем, типа полного отсутствия удаленки. Из-за этого, сам перешел с С++ на С#, и нисколько не жалею об этом.


    1. dyadyaSerezha
      16.06.2023 07:10
      -1

      Голосую за C#. Гораздо более продвинутый язык по сравнению с С++ и не тащит кучу легаси. Хотя не такой популярный на линуксе.

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


      1. MN1R Автор
        16.06.2023 07:10
        +2

        Безусловно, C# или Python будут удобнее, однако C++ позволяет мне лучше разобраться в устройстве всех операторов, устройстве работы ЯП с операционной системой. Никто не помешает мне сменить ЯП в будущем.


  1. slepmog
    16.06.2023 07:10
    -1

    наставления или рекомендации от более опытных программистов

    Не то чтобы наставления или рекомендации, но, скажем так, флэш-форвард: https://habr.com/ru/articles/497114/.


    1. MN1R Автор
      16.06.2023 07:10

      Негативный настрой(((


  1. k61n
    16.06.2023 07:10
    +3

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


  1. Kragius
    16.06.2023 07:10
    +7

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

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

    UE я бы не рекомендовал для начала. Может Qt или веб.


    1. squaremirrow
      16.06.2023 07:10
      +1

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


  1. zabanen2
    16.06.2023 07:10
    +1

    стаковервольф

    Murphy: English grammar in use -> Essential grammar in use -> и будет уровень B1 минимум


  1. domix32
    16.06.2023 07:10

    Думаю разбирать UE5

    В UE слишком много неинтуитивных и специфичных концептов, которые будут скорее тормозить нежели помогать с обучением, плюс цикл удовольствия у него чертовски длиннный - компиляться будет по тысячу лет даже на маленьких проектах. Предложил бы взять движок попроще (cocos2d-x/js/py, LOVE), а то и вовсе собрать собственный на основе какого-нибудь SFML.


  1. Manuna-Marusya
    16.06.2023 07:10
    +6

    Что значит, диплом не очень-то и нужен? Пресловутая ошибка выжившего? Молодой


  1. old2ev
    16.06.2023 07:10
    +3

    Обязательно выучите базовые вещи в программировании: асимптотический анализ и структуры данных - данные темы сильно помогут в оптимизации кода Вашей программы. Плюсом будет хорошее понимание организация памяти процесса в операционных системах, на первых порах точно нужно знать: стэк, куча; В дальнейшем будет полезно (почитайте на досуге): виртуальная память, типы страниц(.text, .data, .bss, .noinit), маппинг страниц памяти / маппинг файлов в виртуальную память. Так же лучше выучить работу с процессами и методы межпроцессного взаимодействия (IPC). Выучите системы сборки: GNU Make, CMake. Что такое статические и динамические библиотеки и как их линковать в Ваш проект. Обязательно выучите средства отладки: GDB и Valgrind - они сильно облегчат жизнь

    По многопоточности можно пробежаться в порядке усложнения темы. Доки по стандартной библиотеки C++ для многопоточности - https://en.cppreference.com/w/cpp/thread

    • Потоки: раздел Threads

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

    • Проблема состояния гонки (race condition) и методы её решения:

      • Критические секции: раздел Mutual exclusion

      • Условные переменные: раздел Condition variables

      • Атомики: раздел Atomic operations

    • Ассинхронные операции: раздел Futures

    • Так же будет полезно знать про корутины (удобно использовать в многопоточных программах): https://en.cppreference.com/w/cpp/language/coroutines

    Обратите внимание на коллекцию библиотек C++ Boost - там есть много удобных вещей. Так же не плохо знать API операционных систем: WinAPI и POSIX API; хоть это и уровень Си, но применим в C++ (лучше изучать после Boost, чтобы не строить велосипедов).

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


    1. MN1R Автор
      16.06.2023 07:10
      +1

      Можешь пожалуйста предложить идею пет-проекта


      1. simenoff
        16.06.2023 07:10
        +3

        Я бы предложил при помощи библиотеки SFML создать какую-нибудь визуализацию/симуляцию/игру


        1. MN1R Автор
          16.06.2023 07:10
          +1

          Я кстати делал игру в консоли, прикольно было. Может тогда лучше плотно сесть на изучение Qt5, как думаешь?


          1. old2ev
            16.06.2023 07:10
            +1

            По личному опыту: На ранних этапах изучения C++ делал шутан с видом сверху на Qt5 + QML. На C++ Qt создавал элементы через QQuickPaintedItem, а через QML размещал на "сцене". Проект торчал в топе таск менеджера по RAM из-за огромных утечек и люто лагал, поскольку главный цикл гонял все обработки событий + коллизию объектов в одном потоке. Понял я это только спустя время уже когда клепал другой пет-проект))

            Совет: почитай про пул потоков (из теории можно почитать про системы массового обслуживания(СМО)), советую его использовать для обработки эвентов в игре ассинхронно. Так же чекай проект Valgrind'ом на утечки памяти. Подучи киллерфичу Qt - сигналы/слоты (не помню, но помоему они по дефолту юзают тред пул). Если хочешь сделать игру сетевой в Qt модуль QNetwork вполне неплохой.

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


  1. MN1R Автор
    16.06.2023 07:10
    +1

    Благодарю вас за развернутые ответы!


  1. 0Bannon
    16.06.2023 07:10
    +1

    Хабаровский ТОГУ.


  1. rotor
    16.06.2023 07:10

    Посмотрите лекции Константина Владимирова на Ютубе. Они действительно потрясающие. Не только, кстати, для начинающих.


    1. MN1R Автор
      16.06.2023 07:10

      Видел его лекции, настоящий профессионал! Когда перейду на следующую ступень изучения обязательно буду смотреть его!


  1. Error1024
    16.06.2023 07:10
    +3

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

    Откуда вы все это берёте то? С чего вдруг бесконечное страдание с исключительно специфичными «приколами» крестов сделает проще понимание другого языка?

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

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

    Кто и зачем поставил перед вами, на первом году изучения программирования, в принципе, написать свой аллокатор?! Не хороший человек какой-то имхо.

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

    Заказал себе книгу "Чистый Код", давно хочу ее почитать.

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

    Смотрю людей продолжают «прогревать» некой «исключительностью» плюсов. Не ведитесь.


    1. MN1R Автор
      16.06.2023 07:10

      Получается, что для хорошей практики нужно начинать разбирать SFML, Qt5 или OpenGL. Это позволит мне оставить консоль и начать разрабатывать полноценные приложения. Что из этого лучше выбрать?


      1. Error1024
        16.06.2023 07:10

        Главное что-то законченное, на любых библиотеках, не пытайтесь писать все «с нуля». Если про пейнт - то самое очевидное тут - Qt.


        1. MN1R Автор
          16.06.2023 07:10

          Насколько я понял, Qt лучше подходит длч создания десктопных приложений, а SFML для создания инди-игр, верно?


          1. Error1024
            16.06.2023 07:10
            +1

            Да, Qt - в целом для сложного UI, SFML - игры.


            1. MN1R Автор
              16.06.2023 07:10

              Благодарю! А можете пожалуйста порекомендовать материалы для изучения Qt(в интернете все советуют Шлее) или SFML? Особенно интересно будет почитать про SFML(теорию, возможно, примеры создания каких-то игр итд), заранее спасибо!


  1. demp
    16.06.2023 07:10
    +1

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

    По шаблонам самая полная информация, на мой взгляд, содержится в томике "Шаблоны C++. Справочник разработчика".


    1. MN1R Автор
      16.06.2023 07:10

      Спасибо, постараюсь прочитать!