Итак, прошел год с того момента, как я начал изучать плюсы. Хотелось бы поделиться с Хабром этим событием, и, возможно, получить какие-либо наставления или рекомендации от более опытных программистов.
Как я пришел к тому, что хочу стать программистом
Изначально я имел примерное представление о программировании. Около полугода писал скрипты на lua, затем, поняв, что данное занятие достаточно интересное и увлекательное (особенно в сравнении с химией, по которой на тот момент я писал олимпиады), твердо решил, что хочу стать программистом.
Программирование привлекло меня своим требованием к умению мыслить, находить выход из трудной и совершенно непонятной ситуации, а также переполняющим чувством радости и удовлетворения после того, как ты справился с задачей.
Выбор языка программирования
Передо мной встал сложный выбор (не очень): какой ЯП выбрать для изучения? Рассмотрев основные сферы использования каждого из языков программирования, многофункциональность плюсов, а также возможность написания на них крупных проектов пришлась мне по вкусу. Вторым весомым аргументом в пользу C++ для меня стала его сложность, как бы странно это не звучало, но, по моему мнению, разобравшись в устройстве плюсов, адаптироваться под любой другой язык будет проще.
Изучение
В течение года, я старался хотя бы час в день уделять изучению плюсов, используя для этого адаптированный перевод learncpp на ravesli, за это время я успел разобрать все уроки. Возможно, 9 -10 месяцев достаточно длительный промежуток для прохождения данного курса, однако моей целью было полное осмысление прочитанного, а не погоня за сроками и школа лицей, и другие занятия, как тренировки, создавали некоторые временные трудности.
Если говорить о C++, то сейчас самым сложным для себя я считаю шаблоны. С базовым использование шаблоном проблем у меня не возникает, написание какого-нибудь контейнерного класса в общем-то тоже идёт спокойно, конечно, бывают временные проблемы с реализацией чего-либо, но это все затем разрешается. А вот когда поставлена задача написать тот же аллокатор, которой будет хранить переменные разных типов, или tuple вот тут уже начинаются серьезные проблемы, но я думаю, что потратив еще какое-то время в чтении хабра\гугла или в просмотре лекций, я справлюсь и с этой задачей.
Дальнейшая программа
После прохождения данного курса, мой взгляд пал на лекции ФПМИ, которые проводит Мещерин Илья Семирович, очень приятный и умный преподаватель! Данные лекции использую в качестве источника уже более глубоких знаний о плюсах. Так же читаю хабр, стаковервольф, гугл, чтобы разобраться в некоторых темах. Например: сейчас изучаю аллокаторы, их внутренниим устройством и возможностью реализации своих собственных. И так как наступило лето, то я стараюсь активно практиковаться в написании различных Контейнеров, решении задач. В планах написать свои pool и stack аллокаторы, контейнер tuple, порешать алгоритмические задачи. Заказал себе книгу "Чистый Код", давно хочу ее почитать. Думаю разбирать UE5 или Qt5, или многопоточку(Прошу вашего совета!!!)
Три совета начинающим программистам
Не унывайте, если у вас что-то не получается.
Невозможно стать профессионалом за краткий срок, любой навык требует усилий и времени для своего освоения.
Практикуйтесь и учитесь на своих ошибках. Никуда не спешите, старайтесь вдуматься и понять материал (иначе вы закончите ещё не начав).
Что сейчас?
На данный момент меня больше всего тянет к таким сферам как: десктоп разработка, геймдев, автоматизация предприятий, безопасность.
Планирую поступать в вуз. От высшего образования я желаю получить крепкую базу по всем наукам, будь то математика, физика или информатика. Углубить свои знания в программировании, получив много полезной практики, расширить список языков, на которых можешь писать, возможно, найти тот самый. А также я считаю, что именно высшее учебное заведение формирует твой круг общения, даёт полезные знакомства, помогает с трудоустройством. Ещё очень круто, что многие высшие учебные заведения сейчас сотрудничают с топовыми IT компаниями, которые в свою очередь помогут сделать из тебя отличного специалиста!
Важный вопрос напоследок
Спасибо всем, кто прочитал. Буду крайне благодарен, если поможете мне скорректировать мой дальнейший план действий и дадите свои рекомендации. И напоследок, какой ВУЗ для IT лучше выбрать, думаю насчет СПБГУ, МГТУ им Баумана, ИТМО, ЛЭТИ, РТУ МИРЭА, МИФИ. Заранее благодарю за фидбек, всем хорошего дня!
Комментарии (33)
janraks
16.06.2023 07:10+2Как выпускник ЛЭТИ, советую поставить его в конце списка (на всякий случай, если в другие не получится).
dalerank
16.06.2023 07:10+6как выпускник ИТМО, тоже бы не сказал, что универ дал сильное развитие в плане CS, начал работать на втором курсе и промышленный кодинг показал насколько обучение отстает. Книги, самообучение и реальные проекты, опен сорс сильно помогает. Пиши код!
Sazonov
16.06.2023 07:10+1На основе собственного опыта могу сказать что для меня одним из самых важных предметов был алгоритмы и структуры данных. Его нужно знать очень хорошо. До самостоятельного изучения, без, так сказать, намёка в вузе, я бы не скоро дошёл.
Вспоминается поговорка: Кто не писал свои контейнеры - не имеет сердца, а кто тащит их в продакшн не имеет мозга.
Самые большие проблемы у вас начнутся когда вы начнёте работать в команде. Это будет работа с системами контроля версий. И самое сложное - чтение и понимание чужого кода (часто не лучшего качества). Всегда старайтесь сначала понять почему что-то написано именно так, и не предлагайте сразу всё переписать с нуля (если просто не поминаете чужой код), пока у вас не будет достаточно весомых аргументов. С опытом это пройдёт.
Какой ВУЗ выбрать - не имеет особого значения. Я так вообще закончил только Гомельский машиностроительный техникум и три курса БГУИР. Вуз это в первую очередь друзья и связи, и только потом источник знаний. Самообразование и постоянная практика в разы эффективнее.
Aquahawk
16.06.2023 07:10+6Независимо от вуза.
Изучай и пробуй разные технологии, максимально разные. Попробуй java, python, typescript, rust, haskell
участвуй во всех мероприятиях и клонкурсах программрования вокруг универа. Там тебя заметят hr корпоратов которые ходят вокруг таких мероприятий. Это хороший старт карьеры.
Dark_Reaper
16.06.2023 07:10+5C/C++ сложные для старта, и многие вещи не пригодятся в других языках. Если нет цели связать свою жизнь с ними, то сразу учить другие языки было бы полезнее. Еще, по моему опыту поиска работы в 2021 году, на них мало интересных вакансий(на мой взгляд), много вакансий в гос и окологос. Например, делать embedded системы для военных. С секретностью, и другим геморроем, типа полного отсутствия удаленки. Из-за этого, сам перешел с С++ на С#, и нисколько не жалею об этом.
dyadyaSerezha
16.06.2023 07:10-1Голосую за C#. Гораздо более продвинутый язык по сравнению с С++ и не тащит кучу легаси. Хотя не такой популярный на линуксе.
А насчет аллокаторов, писать свои приходится одному из тысячи С++ программистов.
MN1R Автор
16.06.2023 07:10+2Безусловно, C# или Python будут удобнее, однако C++ позволяет мне лучше разобраться в устройстве всех операторов, устройстве работы ЯП с операционной системой. Никто не помешает мне сменить ЯП в будущем.
slepmog
16.06.2023 07:10-1наставления или рекомендации от более опытных программистов
Не то чтобы наставления или рекомендации, но, скажем так, флэш-форвард: https://habr.com/ru/articles/497114/.
k61n
16.06.2023 07:10+3Рекомендую выбрать некоммерческий опенсорс проект по душе и подключиться к его разработке до тех пор пока не найдёте себе первую настоящую работу.
Kragius
16.06.2023 07:10+7Вот все пишут что ВУЗ не очень нужен, как и диплом - а я вот не соглашусь. В универе мне рассказали и про алгоритмы, базы данных, сети, базовая математика - да много чего. Опять же диплом не совсем никчемная бумажка - при прочих равных это даст какие никакое преимущество. Есть места, куда до сих пор просят диплом, особенно если ты джун без опыта.
По практике соглашусь с другими комментаторами - свои контейнеры и библиотечные функции писать интересно, но в продакшене нужно использовать готовые вещи из стандартной библиотеки и boost.
UE я бы не рекомендовал для начала. Может Qt или веб.
squaremirrow
16.06.2023 07:10+1А ещё диплом может пригодиться при получении рабочей визы в другой стране — это особенно актуально в текущих условиях.
zabanen2
16.06.2023 07:10+1стаковервольф
Murphy: English grammar in use -> Essential grammar in use -> и будет уровень B1 минимум
domix32
16.06.2023 07:10Думаю разбирать UE5
В UE слишком много неинтуитивных и специфичных концептов, которые будут скорее тормозить нежели помогать с обучением, плюс цикл удовольствия у него чертовски длиннный - компиляться будет по тысячу лет даже на маленьких проектах. Предложил бы взять движок попроще (cocos2d-x/js/py, LOVE), а то и вовсе собрать собственный на основе какого-нибудь SFML.
Manuna-Marusya
16.06.2023 07:10+6Что значит, диплом не очень-то и нужен? Пресловутая ошибка выжившего? Молодой
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, чтобы не строить велосипедов).
Совет по набиванию руки: придумайте себе пет-проект(желатнльно посложней), не бойтесь строить велосипеды в учебных целях, чаще работайте с коммандной строкой.
MN1R Автор
16.06.2023 07:10+1Можешь пожалуйста предложить идею пет-проекта
simenoff
16.06.2023 07:10+3Я бы предложил при помощи библиотеки SFML создать какую-нибудь визуализацию/симуляцию/игру
MN1R Автор
16.06.2023 07:10+1Я кстати делал игру в консоли, прикольно было. Может тогда лучше плотно сесть на изучение Qt5, как думаешь?
old2ev
16.06.2023 07:10+1По личному опыту: На ранних этапах изучения C++ делал шутан с видом сверху на Qt5 + QML. На C++ Qt создавал элементы через QQuickPaintedItem, а через QML размещал на "сцене". Проект торчал в топе таск менеджера по RAM из-за огромных утечек и люто лагал, поскольку главный цикл гонял все обработки событий + коллизию объектов в одном потоке. Понял я это только спустя время уже когда клепал другой пет-проект))
Совет: почитай про пул потоков (из теории можно почитать про системы массового обслуживания(СМО)), советую его использовать для обработки эвентов в игре ассинхронно. Так же чекай проект Valgrind'ом на утечки памяти. Подучи киллерфичу Qt - сигналы/слоты (не помню, но помоему они по дефолту юзают тред пул). Если хочешь сделать игру сетевой в Qt модуль QNetwork вполне неплохой.
А так же терпения и нервов тебе, плюсы неплохо умеют калечить. Будет казаться что ошибка где-то в компиляторе или библиотеке, но в процентах 80-ти она перед монитором.
-
Error1024
16.06.2023 07:10+3Вторым весомым аргументом в пользу C++ для меня стала его сложность, как бы странно это не звучало, но, по моему мнению, разобравшись в устройстве плюсов, адаптироваться под любой другой язык будет проще.
Откуда вы все это берёте то? С чего вдруг бесконечное страдание с исключительно специфичными «приколами» крестов сделает проще понимание другого языка?
Если речь про «байты» и «указатели», то они неожиданно есть и в си, и в паскале, и в куче других не выжигающих мозг языках.
А вот когда поставлена задача написать тот же аллокатор, которой будет хранить переменные разных типов, или tuple вот тут уже начинаются серьезные проблемы, но я думаю, что потратив еще какое-то время в чтении хабра\гугла или в просмотре лекций, я справлюсь и с этой задачей.
Кто и зачем поставил перед вами, на первом году изучения программирования, в принципе, написать свой аллокатор?! Не хороший человек какой-то имхо.
Я могу посоветовать написать какую-то реальную программу, например «пейнт». На одних консольных тестах самодельных списков не уедешь, а так - хоть что-то законченное, что можно показать друзьям.
Заказал себе книгу "Чистый Код", давно хочу ее почитать.
В первый год изучения программирования надо запрещать людям открывать любые подобные книги, ибо советы из них превращаются в «карго-культ» с бредовыми ритуалами, а код в супер универсальный фарш в абстрактной авоське.
Смотрю людей продолжают «прогревать» некой «исключительностью» плюсов. Не ведитесь.
MN1R Автор
16.06.2023 07:10Получается, что для хорошей практики нужно начинать разбирать SFML, Qt5 или OpenGL. Это позволит мне оставить консоль и начать разрабатывать полноценные приложения. Что из этого лучше выбрать?
Error1024
16.06.2023 07:10Главное что-то законченное, на любых библиотеках, не пытайтесь писать все «с нуля». Если про пейнт - то самое очевидное тут - Qt.
MN1R Автор
16.06.2023 07:10Насколько я понял, Qt лучше подходит длч создания десктопных приложений, а SFML для создания инди-игр, верно?
Error1024
16.06.2023 07:10+1Да, Qt - в целом для сложного UI, SFML - игры.
MN1R Автор
16.06.2023 07:10Благодарю! А можете пожалуйста порекомендовать материалы для изучения Qt(в интернете все советуют Шлее) или SFML? Особенно интересно будет почитать про SFML(теорию, возможно, примеры создания каких-то игр итд), заранее спасибо!
demp
16.06.2023 07:10+1Мне в первые годы изучения помогло прочитать книгу "Дизайн и эволюция C++", чтобы понять, почему язык получился такой сложный. Это дало какое-то базовое чувство языка и прибавило уверенности при его использовании.
По шаблонам самая полная информация, на мой взгляд, содержится в томике "Шаблоны C++. Справочник разработчика".
turbolizard
Опыт подсказывает, что от наличия диплома ВУЗа мало что зависит. База обучения везде примерно на одном уровне и очень отстает от текущего положения дел на рынке труда. Наверное, стоит подыскать работёнку джуном-подмастерьем для прокачки дальнейшего навыка. Успехов в карьере!