# :ghost: Легенды и мифы про C++ ## :question: Язык C++ умер, на нем невозможно что-либо писать Живее всех живых. На сегодняшний день находится в топах различных рейтингов языков программирования и даже набирает очки популярности, например: индекс [Tiobe](https://www.tiobe.com/tiobe-index/). Дурную славу "мертвого языка" он сыскал в 2000-е годы, когда его развитие временно застыло, а комитет по стандартизации приостановил свою активность. Но начиная со стандарта C++11, язык пережил ренессанс. Сегодня он активно обновляется и пополняется новым функционалом, в среднем, каждые три года. Многие проблемы, о которых заявляют свидетели "мертвого" C++ уже решены. Но в силу того, что такие специалисты скорее всего перестали работать с C++, либо по верхам изучили в ВУЗе/на курсах, то и продолжают порождать и сеять различные мифы о том, насколько C++ ужасен. ## :question: Настоящие программисты начинают изучать C++ сразу под Linux/Vim/gcc Если вышеперечисленная связка инструментов выглядит для вас малознакомой, то на таком этапе обучения стоит сконцентрироваться только на изучении основ языка C++. Рекомендуем вам попробовать написать свои первые приложения в Microsoft Visual Studio IDE (подробнее см. [PreJunior Books](Books/PreJunior.md)). Пойти по наиболее трудному пути выглядит благородно. Но есть высокая доля вероятности, что объем информации, который придется изучить для сборки "Hello World" в связке Linux + Vim + gcc будет чрезмерно большим. Это чревато быстрой демотивацией и разочарованием в программировании. Старайтесь идти по пути: от простого к сложному. В спортзале новички не пытаются поднять самую тяжелую штангу на первой тренировке, т.к. понимают, чем это может быть чревато. Это же правило работает и при обучении. Когда более-менее освоитесь с языком, то можете попробовать поиграться с написанием кода в любом ином IDE, операционной системе и т.д.. Но это уже совершенно другая история... ## :question: Прежде чем учить C++ необходимо хорошо изучить C/Assembler/etc. Нет, нет и ещё раз нет! Такое утверждение живо из-за двух распространенных ситуаций: так учили в ВУЗе (Assembler -> C -> C++), либо от "старой гвардии" разработчиков, т.к. многие из таких специалистов проходили подобный карьерный путь. Современный C++ не требует подобного подхода к изучению. Этот язык полностью автономен. Гораздо вероятнее, у вас возникнет путаница в голове, а также устойчивое желание писать на C++ в стиле "Си с классами". А ассемблер потребуется только в особых ситуациях. ## :question: Изучайте C++ по книге Страуструпа Крайне спорный тезис. Вероятнее всего что этот совет предлагают те, кто уже имел большой опыт разработки на других языках (C, Fortran, Delphi, и т.д.) и переходил с них на C++. Книга Страуструпа написана больше как справочник: ([Язык программирования C++](https://www.ozon.ru/product/yazyk-programmirovaniya-c-spetsialnoe-izdanie-straustrup-bern-straustrup-bern-210215691)). Потому и работать с ней требуется соответственно, что уже требует наличие знаний о C++ и практики использования. Рекомендуем заглянуть в раздел [Книги](Books/Overview.md), где вы найдете материал для любого уровня владения языком программирования. ## :question: Изучайте C++ только по стандарту Тоже крайне опасный тезис. Во-первых, современный стандарт C++ уже превысил объем в 2000 страниц. Во-вторых, доступ к актуальной версии стандарта платный. В-третьих, стандарт написан не самым "дружелюбным" способом. Тем кто изучил язык по стандарту можно пожать руку, но мы не рекомендуем такой путь, ибо он долог и тернист. Лучше загляните в раздел [Книги](Books/Overview.md), там вы найдете материал для любого уровня владения языком. ## :question: Undefined Behavior преследует разработчика повсюду Скорее нет, чем да. Современный C++, а также имеющийся инструментарий, позволяют избежать львиную долю проблем, связанных с неопределенным поведением. Здесь можно дать совет: если сомневаетесь, что делает та или иная конструкция, то попробуйте поискать информацию на [CppReference](https://en.cppreference.com), [StackOverflow](https://stackoverflow.com/) или иных профильных порталах. Если же после прочтения конструкция остается непонятной, то попробуйте переписать блок кода альтернативным и более простым способом, чтобы избежать неопредленного поведения. В простоте кроется великая сила! ## :question: Нужно вручную управлять памятью, в языке нет сборщика мусора Это утверждение также идет от представителей "старой гвардии", которые перестали писать на языке до появления стандарта C++11, или же от тех, кто слабо знаком с последними стандартами языка. Современный C++ имеет в своей библиотеке набор примитивов, который отвечает за автоматическое выделение и освобождение памяти. Контроль за выделением памяти все больше и больше отходит на второй план. Во многих компаниях вы также встретите внутреннее правило: "не использовать сырых указателей". И напоследок, не пренебрегайте современным инструментарием и санитайзерами. Они способны отыскать потенциальную утечку памяти ещё на этапе анализа исходного кода. ## :question: C++ - это сплошной легаси-код Отчасти правдивый миф, но стоит отметить, что это применимо и к другим языкам. На самом современном стеке может производиться "легаси". Качество кода зависит от технической культуры внутри компании и команд разработки и их визионеров, т.к. легаcи-код порождается человеческим фактором: уровень разработчиков и компетенций, отношение к работе, горящие сроки, практики в команде и т.п. На C++ разработано огромное количество систем, которые не первый год работают в режиме 24/7. Такие системы могли быть написаны в прошлом без соблюдения всевозможных практик разработки. Они часто являются основой бизнеса, которые приносят значительную часть прибыли. Потому проводить в таких системах масштабные изменения очень рискованно. Разработчики работают с таким кодом предельно осторожно. Но не стоит думать, что с этим ничего невозможно поделать. Постепенно такие системы тоже переписываются с использованием современных практик и технологий. Такого рода задачи могут стать для вас не менее интересным вызовом, т.к. предоставляют отличную возможность освоить широкий спектр компетенций: чтение кода, реверс-инжениринг, написание тестов, проектирование архитектуры ПО, автоматизация, сбор требований и т.д. --- [**На главную страницу**](README.md)