Comments 39
Опыт подсказывает, что от наличия диплома ВУЗа мало что зависит. База обучения везде примерно на одном уровне и очень отстает от текущего положения дел на рынке труда. Наверное, стоит подыскать работёнку джуном-подмастерьем для прокачки дальнейшего навыка. Успехов в карьере!
Как выпускник ЛЭТИ, советую поставить его в конце списка (на всякий случай, если в другие не получится).
На основе собственного опыта могу сказать что для меня одним из самых важных предметов был алгоритмы и структуры данных. Его нужно знать очень хорошо. До самостоятельного изучения, без, так сказать, намёка в вузе, я бы не скоро дошёл.
Вспоминается поговорка: Кто не писал свои контейнеры - не имеет сердца, а кто тащит их в продакшн не имеет мозга.
Самые большие проблемы у вас начнутся когда вы начнёте работать в команде. Это будет работа с системами контроля версий. И самое сложное - чтение и понимание чужого кода (часто не лучшего качества). Всегда старайтесь сначала понять почему что-то написано именно так, и не предлагайте сразу всё переписать с нуля (если просто не поминаете чужой код), пока у вас не будет достаточно весомых аргументов. С опытом это пройдёт.
Какой ВУЗ выбрать - не имеет особого значения. Я так вообще закончил только Гомельский машиностроительный техникум и три курса БГУИР. Вуз это в первую очередь друзья и связи, и только потом источник знаний. Самообразование и постоянная практика в разы эффективнее.
Независимо от вуза.
Изучай и пробуй разные технологии, максимально разные. Попробуй java, python, typescript, rust, haskell
участвуй во всех мероприятиях и клонкурсах программрования вокруг универа. Там тебя заметят hr корпоратов которые ходят вокруг таких мероприятий. Это хороший старт карьеры.
C/C++ сложные для старта, и многие вещи не пригодятся в других языках. Если нет цели связать свою жизнь с ними, то сразу учить другие языки было бы полезнее. Еще, по моему опыту поиска работы в 2021 году, на них мало интересных вакансий(на мой взгляд), много вакансий в гос и окологос. Например, делать embedded системы для военных. С секретностью, и другим геморроем, типа полного отсутствия удаленки. Из-за этого, сам перешел с С++ на С#, и нисколько не жалею об этом.
Голосую за C#. Гораздо более продвинутый язык по сравнению с С++ и не тащит кучу легаси. Хотя не такой популярный на линуксе.
А насчет аллокаторов, писать свои приходится одному из тысячи С++ программистов.
Безусловно, C# или Python будут удобнее, однако C++ позволяет мне лучше разобраться в устройстве всех операторов, устройстве работы ЯП с операционной системой. Никто не помешает мне сменить ЯП в будущем.
Для перечисленного не нужен именно C++, достаточно C, с него и следует начать.
Си прост и понятен, и для низкоуровневого системного программирования это именно то, что нужно.
C++ вышел переусложнённым и с далёкой от идеала стандартной библиотекой. Но при этом C++ существенно облегчает создание сложных прикладных программных комплексов по сравнению с чистым C, сохраняя при этом способность выжать из системы максимум производительности. Другого эквивалентного по мощности и зрелости инструмента до сих пор нет.
Очередной новичок собравшийся изучать "устройство работы ЯП с операционной системой" через C++. Идея достаточно наивная и Вам правильно написали - учите сразу нужный язык, если не хотите быть вечным студентом. А если есть желание погрузиться в низкоуровневые аспекты, то изучение архитектуры ОС и ассемблера вам в помощь.
Чем плох C++? Я же сказал, что хочу заниматься десктоп разработкой, либо гейм девом. В данном случае C++ в связке с Qt или UE5 является отличным решением, не так ли?
Если конечный язык всё же С++, то изучать Qt это очень хорошее решение (с UE5 не знаком). И не только с точки зрения поиска работы. Qt очень грамотно спроектирован и хорошо ставит мозги на место у начинающих разработчиков - приходит понимание как оно всё и должно быть. Плюс, при работе с gui достаточно легко воспринимаются различные аспекты ооп и архитектуры.
наставления или рекомендации от более опытных программистов
Не то чтобы наставления или рекомендации, но, скажем так, флэш-форвард: https://habr.com/ru/articles/497114/.
Рекомендую выбрать некоммерческий опенсорс проект по душе и подключиться к его разработке до тех пор пока не найдёте себе первую настоящую работу.
Вот все пишут что ВУЗ не очень нужен, как и диплом - а я вот не соглашусь. В универе мне рассказали и про алгоритмы, базы данных, сети, базовая математика - да много чего. Опять же диплом не совсем никчемная бумажка - при прочих равных это даст какие никакое преимущество. Есть места, куда до сих пор просят диплом, особенно если ты джун без опыта.
По практике соглашусь с другими комментаторами - свои контейнеры и библиотечные функции писать интересно, но в продакшене нужно использовать готовые вещи из стандартной библиотеки и boost.
UE я бы не рекомендовал для начала. Может Qt или веб.
Думаю разбирать UE5
В UE слишком много неинтуитивных и специфичных концептов, которые будут скорее тормозить нежели помогать с обучением, плюс цикл удовольствия у него чертовски длиннный - компиляться будет по тысячу лет даже на маленьких проектах. Предложил бы взять движок попроще (cocos2d-x/js/py, LOVE), а то и вовсе собрать собственный на основе какого-нибудь SFML.
Что значит, диплом не очень-то и нужен? Пресловутая ошибка выжившего? Молодой
Обязательно выучите базовые вещи в программировании: асимптотический анализ и структуры данных - данные темы сильно помогут в оптимизации кода Вашей программы. Плюсом будет хорошее понимание организация памяти процесса в операционных системах, на первых порах точно нужно знать: стэк, куча; В дальнейшем будет полезно (почитайте на досуге): виртуальная память, типы страниц(.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, чтобы не строить велосипедов).
Совет по набиванию руки: придумайте себе пет-проект(желатнльно посложней), не бойтесь строить велосипеды в учебных целях, чаще работайте с коммандной строкой.
Можешь пожалуйста предложить идею пет-проекта
Я кстати делал игру в консоли, прикольно было. Может тогда лучше плотно сесть на изучение Qt5, как думаешь?
По личному опыту: На ранних этапах изучения C++ делал шутан с видом сверху на Qt5 + QML. На C++ Qt создавал элементы через QQuickPaintedItem, а через QML размещал на "сцене". Проект торчал в топе таск менеджера по RAM из-за огромных утечек и люто лагал, поскольку главный цикл гонял все обработки событий + коллизию объектов в одном потоке. Понял я это только спустя время уже когда клепал другой пет-проект))
Совет: почитай про пул потоков (из теории можно почитать про системы массового обслуживания(СМО)), советую его использовать для обработки эвентов в игре ассинхронно. Так же чекай проект Valgrind'ом на утечки памяти. Подучи киллерфичу Qt - сигналы/слоты (не помню, но помоему они по дефолту юзают тред пул). Если хочешь сделать игру сетевой в Qt модуль QNetwork вполне неплохой.
А так же терпения и нервов тебе, плюсы неплохо умеют калечить. Будет казаться что ошибка где-то в компиляторе или библиотеке, но в процентах 80-ти она перед монитором.
Благодарю вас за развернутые ответы!
Хабаровский ТОГУ.
Посмотрите лекции Константина Владимирова на Ютубе. Они действительно потрясающие. Не только, кстати, для начинающих.
Вторым весомым аргументом в пользу C++ для меня стала его сложность, как бы странно это не звучало, но, по моему мнению, разобравшись в устройстве плюсов, адаптироваться под любой другой язык будет проще.
Откуда вы все это берёте то? С чего вдруг бесконечное страдание с исключительно специфичными «приколами» крестов сделает проще понимание другого языка?
Если речь про «байты» и «указатели», то они неожиданно есть и в си, и в паскале, и в куче других не выжигающих мозг языках.
А вот когда поставлена задача написать тот же аллокатор, которой будет хранить переменные разных типов, или tuple вот тут уже начинаются серьезные проблемы, но я думаю, что потратив еще какое-то время в чтении хабра\гугла или в просмотре лекций, я справлюсь и с этой задачей.
Кто и зачем поставил перед вами, на первом году изучения программирования, в принципе, написать свой аллокатор?! Не хороший человек какой-то имхо.
Я могу посоветовать написать какую-то реальную программу, например «пейнт». На одних консольных тестах самодельных списков не уедешь, а так - хоть что-то законченное, что можно показать друзьям.
Заказал себе книгу "Чистый Код", давно хочу ее почитать.
В первый год изучения программирования надо запрещать людям открывать любые подобные книги, ибо советы из них превращаются в «карго-культ» с бредовыми ритуалами, а код в супер универсальный фарш в абстрактной авоське.
Смотрю людей продолжают «прогревать» некой «исключительностью» плюсов. Не ведитесь.
Получается, что для хорошей практики нужно начинать разбирать SFML, Qt5 или OpenGL. Это позволит мне оставить консоль и начать разрабатывать полноценные приложения. Что из этого лучше выбрать?
Мне в первые годы изучения помогло прочитать книгу "Дизайн и эволюция C++", чтобы понять, почему язык получился такой сложный. Это дало какое-то базовое чувство языка и прибавило уверенности при его использовании.
По шаблонам самая полная информация, на мой взгляд, содержится в томике "Шаблоны C++. Справочник разработчика".
В МГТУ на ИУ-7 как первый выбор. Я закончил ИУ-8 в 2007 — нормально, но спецпредметы на семёрке были явно актуальнее и полезнее. А так на восьмерке где-то с середины четвертого курса я к половине профильных предметов потерял интерес и сосредоточился на самообразовании и собственных проектах, что, оглядываясь назад, было правильно, хоть и сказалось на оценках (до которых впоследствии вообще никому не было дела). Если бы я сейчас подавался и надо было выбрать три кафедры по порядку, то написал бы ИУ-7, ИУ-12, ИУ-9.
Одно большое "но". В списке нет МФТИ и МГУ (ВМК). Наиболее головастые и способные ребята учились именно там. Если бы я мог вернуться на 25 лет назад и дать себе молодому совет, то порекомендовал бы приложить дополнительные усилия, чтобы попробовать пройти на физтех и ВМК.
А так я готовился два года на заочных и очно-заочных курсах в Бауманке, потом с первого раза набрал максимальный балл на их олимпиаде (т.к. задачи были похожи на те, что давались на курсах) и мог выбрать любую кафедру с общагой, что и сделал. А олимпиады на физтехе и ВМК завалил, там были группы задач, которые я впервые видел, например системы на решение в целых числах. Я бы может и разобрался сам, но точно не за отведённое время. Ребята, которые прицельно готовились, потом говорили, что знали, какого типа задачи будут, и натренировались заранее. Это всё было еще до введения ЕГЭ.
[Хабр, посоветуй] Мой опыт за 12 месяцев изучения C++