NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru

Как восстановить знания по C++ на сегодняшний день?

Сейчас программирую только под .Net C#

Последний раз программировал на С++ лет 6 назад (Visual C++ под VS 2005 + Qt)
Хочу вернуть знания, на сегодняшний день (конец 2014 года).
Помню только синтаксис, общие правила. Базовые знания в общем.

вопросы:
1. какая версия сейчас самая актуальная? не обязательно последняя, а востребованная скорее в производстве.
2. какую среду разработки взять? VS 2013 ? (ОС Windows 7-8)
3. С++ Boost - что это такое и стоит ли сразу переучиваться под него писать?
4. какие еще улучшения появились для разработчика? Может библиотеки какие, без которых не обходиться не один уважающий себя С++ программист ?
5. в каком направлении идти? (планирую в mobile-development мигрировать)

Спасибо.
  • Вопрос задан
  • 8137 просмотров
Решения вопроса 3
@Koss1024
0. Прочитайте Страуструпа последнее издание (англ). Если язык вы знали то это лучшая книга чтобы обновить знания

1. C++11 C++14, в производстве чаще пока еще С++03
2. Лучший компилятор clang++ (поддерживает любой стандарт и любую платформу)
3. boost это набор библиотек на все случаи жизни самый хорошо сынжинереный. Стоит писать не под него а с использованием
4. пункт 3
5. C++ для задач требующих точного понимания стоимости каждой операции, это embedded DSP Server computing
Math много чего еще

Учтите, С++ это инструмент который нужно учить постоянно

Дополню
-----------
С++ мультипарадигменный
А так же много уровней абстракции поддерживает

На нем можно писать как на чистом С - это самый низкий уровень
Можно ООП и абстракции
Можно паттерны
А можно функциональный стиль

С С++ в этом и проблема что знать нужно очень много.

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

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

Потом Страуструп (тогда это было издание по стандарту 03). Здесь я дополнил свои знания деталями которые пропустил при самостоятельном изучении. Тут стоит отметить что Страуструп весьма странная книга и написана тяжело. Секцию же ООП вообще там лучше не читать (самая последняя).

Где-то рядом я прочитал Гради Буч - ООА и ООП с примерами применения. Очень хорошая кика чтобы понять к чему все это придумали вообще. Сильно выправляла мозги

Потом был Керниган и Ричи Язык программирования С. Эту я прочитал просто от безделья, но теперь считаю что это было необходимо. Здесь можно понять зачем придумали именно С. И насколько там все просто, задумано.

Следом пошли техники: Герб Саттер Решение сложных задач на С++ и Новые сложные задачи С++
читать обязательно, разобрано много костылей и проблем языка. Дано очень много дельных советов

С Мейерс - Эффективное использование С++ туда же. Прекрасный разбор.

Макконнел - Совершенный код. Очень крутая книга. Она отшлифует уже почти бриллиант.

Помимо всего прочего я работал над проектами и постоянно читал всяческие форумы, блоги, дискутировал с коллегами. Решал задачки разных собеседований.

Отдельного внимания заслуживает книга Банды четырех (Паттерны).
Я ее с трудом дочитал, читал ее я уже аж после всего перечисленного и после примерно 7-8 лет опыта С++.
Я уже давно был Senior dev. и наконец нашел таки время и для нее. Она мне показалась до ужаса скучной и очевидной, поскольку почти все предложенные решения я придумывал и сам неоднократно. Кроме того, большинство этих решений неоправданно тяжелы, и очень запутывают код. Тема холиварная и спать надо много, но я пожалуй остановлюсь только на том что в моей практике, худшими с точки зрения цены ошибок были разработчики которые учились начиная с этой книги. Их код недодерживаем запутан и очень плохо поддается рефакторингу. Такой код имеет самые долго отлеживаемые ошибки.

Где-то рядом я прочитал Фаулера - Рефакторинг. Вполне себе неплохо. Рекомендую. Но тут стоит к опытному коллеге обратиться. Идея то проста Тесты - Маленькие комиты - YAGNI KISS и SRP но детали лучше познавать на практике.
У меня был хороший лид, который меня в конце концов научил :)

Совсем забыл! Александреску же! Скажем так - не так страшен Александреску как тот кто его начитался :)
Фана доставил много, а так же дал возможность на эти игрища потерять около 3-х месяцев работы. Даже не знаю
стоит ли читать. Наверное стоит, но нужно помнить что на практике лучше не использовать если вы уже не эксперт.

Остальное С++ не касается, но чтобы стать профессионалом Вам потребуются алгоритмы и структуры данных (Кормен, Кнут), многопоточность (Энтони Уильямс), другие языки(питон, JS, java), оптимизация и профилирование.
и много много разных специфических знаний

Удачи Вам в этом нелегком но, безусловно, интереснейшем пути :)
Ответ написан
mmatrosov
@mmatrosov
C++ jedi
По поводу книг добавлю "A tour of C++" от Страуструпа. Подкупает своей компактностью - этакий ликбез для С++-программистов. Из минусов то, что там в кучу С++98 и С++11. Ещё "Overview of the New C++ (C++11/14)" от Мейерса. Это презентационные материалы с его тренинга именно по С++11/14, я там был, отличный тренинг. Из минусов - это всё же слайды презентации, какие-то моменты могут быть не понятны без докладчика. Далее, поскольку у Вас уже есть опыт, вполне подойдёт выделить список тем и разботать каждую в отдельности по статьям, записям с конференций, вопросам на SO (или Тостере :) ).

Что именно читать - не так важно, найдёте сами. Чем мне действительно хотелось бы поделиться, так это мыслями по поводу С++11/14 (будем для краткости называть его С++14, т.к. стандарт уже одобрен). Это не просто "новые фишки в С++". Это качественно новый язык. Разница в стилях кодирования между С++14 и С++98 можно сравнить с разницей между С++98 и С. Не такая радикальная, но сравнимая. Возможности С++14 коснулись практически всех аспектов кода. Я позволю себе выделить наиболее значимые, на мой взгляд, изменения, значимые именно для "рядового" программиста, который не пишет буст и не оптимизирует компиляторы:
  • Семантика перемещения*. Контейнеры STL теперь можно возвращать из функции по значению. Строки можно эффективно конкатенировать оператором сложения. Это прекрасно читается.
  • Лямбда-функции. Алгоритмами STL можно, наконец, спокойно пользоваться и не бояться вызвать демонов описанием очередного внешнего шаблонного класса-функтора. Логика работы алгоритма теперь указывается ровно там, где он используется.
  • auto. Казалось бы, это мелочь. Но теперь имя типов итераторов STL не занимает кучу места в программе (ещё очко в пользу STL). Многие конструкции стали более компактными и ушло ненужное дублирование имени типа (принцип DRY!)
  • STL + стандартная библиотека. В С++ чудовищная скудная стандартная библиотека, особенно по сравнению с C#. Но STL, как одна из основных её частей, шагнула вперёд, и не только за счёт других фишек, благодаря которым стало удобно пользоваться тем, что уже было. В ней появились std::unordered_map (хэш-таблицы), std::array и std::tuple - очень полезные в определённых случаях контейнеры. Также добавился ряд полезных алгоритмов (см. доки к заголовочному файлу <algorithm>). А вы знали, что в С++11 есть класс std::Hash, который позволяет считать хэш от произвольных стандартных типов, включая std::string?
  • std::function. Мало того, что класс предоставляет механизм универсальных колбэков, он позволяет элегантно написать и легко использовать классы типа ScopeGuard (Страуструп называет его finally). Это даёт новый виток развития парадигме RAII, ключевой и уникальной для С++. Ранее для этих целей использовался кривоватый BOOST_SCOPE_EXIT.
  • std::unique_ptr. Благодаря семантике перемещения оказалось возможным создать эффективный умный указатель с монопольным владением объектом. У нас уже был boost::shared_ptr, так что std::shared_ptr не стал таким прорывом.

* Не путать семантику перемещения с r-value references. Последние взрывают мозг. Но это не более чем механизм для реализации семантики перемещения и точной передачи (perfect forwarding). И тем и другим можно прекрасно пользоваться, не заглядывая под капот и не убиваясь в попытках понять, как именно работает эта магия.

По поводу выбора версии Visual Studio. Если есть возможность, лучше использовать VS2013. В ней добавлены такие замечательные и очень полезные возможности С++14, как списки инициализации и инициализация членов класса прямо в месте объявления. В VS2012 этого нет, а по сравнению с VS2010 из интересного в ней появились только range-based циклы, но они не настолько круты. Полный список отличий в MSDN.

В С++14 ещё много, реально МНОГО нового, по сравнению с С++98. Но большая часть либо просто заимствована из boost, так что так или иначе народ этим уже пользовался, либо достаточна специфична. Я постарался выделить именно принципиально новые моменты, которые меняют стиль написания кода. И код на С++14 смотрится гораздо компактнее и понятнее, чем на С++98. Да пребудет с вами С++14. Я кончил. Спасибо.
Ответ написан
Комментировать
onepavel
@onepavel
Консультация и разработка мобильных приложений
Коллега =) Сам недавно задавался вопросом освежением и актуализацией знаний.
Посоветовали почитать вот эту книгу www.ozon.ru/context/detail/id/7979735
Найти в сети не проблема.
Разницу между VS 2013, VS 2012, VS 2010 особо не заметил. На что есть лицензия, то и использую.
Появились фреймворки, которые умеют работать с сетью, парсинг, дополнительные коллекции, работа
со временем и строками, файловой системой.
pocoproject.org
https://github.com/facebook/folly
и тут en.cppreference.com/w/cpp/links/libs
stackoverflow.com/questions/777764/what-modern-c-l...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@coodan
Думаю, слова о множественных парадигмах и есть ключ, к тому, к чему Вы стремитесь. Ведь Вас интересуют новые возможности?

Конечно, Вам стоит изучить подходы, связанные с generic programming. Boost в значительной степени основан на этой парадигме. Действительно, там, как и с паттернами вообще, возможны трудноулавливаемые ошибки. Но этот подход сильно меняет суть и облик С++, поэтому может быть важен для Вас.

Начинать generic programming стоит с его основ - с того, чтобы по-новому взглянуть на STL и контейнеры. Effective STL, по-видимому, самая простая и хорошая книга об этом:
www.amazon.com/Effective-STL-Specific-Standard-Tem...

P.S. На конкретном простом примере. Когда мне понадобилась работа с графами, изучил вопрос и просмотрел библиотеки, которые обеспечивают данную функциональность. Некоторые из них заброшены не поддерживаются. Другие вроде бы и ориентированы на ООП, но их интерфейс производит впечатление какой-то запутанности, недостаточно ясного понимания, что порождает сомнения в цельности и безошибочности их реализации. Лучшим решением в этой области на тот момент, по моему мнению, оказалась библиотека boost::graph. Но это чистое обобщенное программирование, как оно есть. Без понимания того, что это такое, умения это использовать и на этом писать, делать там нечего. С ООП это не стыкуется вовсе. Это другое.

Так, необходимый функционал может подтолкнуть Вас к необходимости использования парадигм, которые Вы мало знаете и не в полной мере разделяете. И так boost будет толкать Вас в этом направлении, и чем дальше, тем больше.
Ответ написан
Комментировать
@asd111
Если планируете в Mobile то либо Swift + ObjectiveC, либо Java, либо PhoneGap т.е. javascript + html. Под мобильники мало пишут на С++.
На C# можно писать под мобильный Windows. Windows 10 вроде будет один на всех платформах.
Не подскажете почему решили развиваться в сторону С++ и mobile после C# ? А то мне сейчас очень интересны C# и Java.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы