Какой лучший способ перейти на продвинутый C ++? - PullRequest
9 голосов
/ 02 июля 2010

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

Среднестатистический программист: достаточно хорошо понимает ISO C ++, может с некоторой удачей читать и изменять код другого, хорошо работает со структурами данных и алгоритмами, но не великолепно

  1. Learn C ++ 0x
  2. Узнайте, какой код сборки генерируется для различных типов конструкций, может быть, для x86
  3. Забудьте языковые нюансы и получите основы - теорию автоматов откуда-то вроде Sipser или Papadimitriou
  4. Если вы знаете ООП или, по крайней мере, думаете, что знаете, подумайте, как объединить навыки функционального программирования с C ++
  5. Работа над чем-то в строках компилятора и с открытым исходным кодом, например, LLVM или GNU Toolchain
  6. Вся идея разрушена - следующий уровень означает более сложные структуры данных. Так что, если вы знаете AVL, подумайте об изучении левого наклона красно-черных деревьев и др.

Теперь, очевидно, никто не может сделать все в этом списке без расстановки приоритетов, поэтому нам нужно несколько предложений о том, что может быть лучшим способом продвижения вперед.

ПРИМЕЧАНИЕ: Спасибо всем за очень полезные ответы.

Ответы [ 12 ]

14 голосов
/ 02 июля 2010

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

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

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

9 голосов
/ 02 июля 2010

Чтобы ответить на ваши конкретные вопросы:

Learn C ++ 0x

Вам определенно нужно это сделать.Так что, возможно, у вас есть ваш ответ прямо здесь ...

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

Я бы сказал, узнать, какчтобы понять язык ассемблера, который генерирует компилятор, в общих чертах, если не подробно.Однако вам определенно не следует пытаться предсказать, что будет делать компилятор.

Забудьте языковые нюансы и получите основы - теорию автоматов из таких мест, как Sipser или Papadimitriou

Если это вас заводит, я полагаю ...

Если вы знаете ООП или, по крайней мере, думаете, что знаете, подумайте, как объединить навыки функционального программирования с C ++

Из всех парадигм, поддерживаемых C ++, функциональное программирование, вероятно, поддерживается хуже всего - если вы хотите изучать FP, изучать Haskell (или что-то еще), а не C ++.

Работайте над чем-то вроде строккомпилятор и открытый исходный код, такие как LLVM или GNU Toolchain

GNU написан на C, поэтому вряд ли он улучшит ваши навыки C ++ - я мало знаю о LLVM.

Вся идея разрушена - следующий уровень означает более сложные структуры данных.Так что, если вы знаете AVL, подумайте о том, чтобы научиться изучать левые красные черные деревья и т. Д.

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

8 голосов
/ 02 июля 2010

Я бы узнал о BOOST .

Вы можете начать по частям, просто используя его, и, углубившись в библиотеки, вы обнаружите, что думаете: «Как это работает?».

  • Использование этого сделает вас более продуктивный и лучший C ++ программист!
  • Понимание того, как это работает, получится Вы значок "гуру" !!
  • Содействие и расширение обеспечить бессмертие !!!
4 голосов
/ 02 июля 2010

Если вы знаете основной язык:

Тогда в таком порядке (хотя будет некоторое обратное отслеживание)

  • Учитесь изучать и переваривать RAII
    • Узнайте, как использовать RAII во всех контекстах C, чтобы вы никогда не застревали в коде C.
  • Выяснение исключений и их гарантий.
    • Выясните, как реализовать методы, чтобы соблюдался каждый из различных типов гарантий.
  • Узнайте о стандартных контейнерах.
    • Узнайте о требованиях, предъявляемых к каждому контейнеру.
  • Узнайте об итераторах
    • Узнайте об особенностях итераторов и о том, как они работают в сочетании с указателями.
  • Узнайте о библиотеке алгоритмов
  • Узнайте о потоковой библиотеке
    • Вернитесь назад и узнайте, как работают потоки и итераторы
  • Узнайте об указателях методов и о том, как их можно использовать в алгоритмах
    • Выясните, что такое функтор и как его использовать.
  • Узнайте о bind и посмотрите на boost bind
  • Узнайте о буст-контейнерах и их отличиях от стандартных контейнеров.
  • Узнайте об умных указателях.
    • Каковы различные типы и когда эффективно использовать каждый из них.
  • Начните читать о других вещах, доступных в boost.

На этом этапе вы начнете изучать, как использовать C ++

1 голос
/ 02 июля 2010

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

1 голос
/ 02 июля 2010

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

Да (ссылаясь на пункт 4), изучайте другие языки программирования, особенно те, которые имеют определенные преимущества по сравнению с c ++, вместо того, чтобы применять их методы непосредственно в C ++.Сосредоточьтесь на том, чтобы найти для себя методы кодирования с наименьшим количеством ошибок, которые могут нарушить ваш рабочий процесс, найдите откалиброванный систематический и абстрактный подход, который вы всегда можете применить к решению проблем и их реализации.

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

1 голос
/ 02 июля 2010

Не беспокойтесь о C ++ 0x прямо сейчас ... убедитесь, что вы действительно действительно сначала понимаете основы. Это означает, что вы должны понимать ссылки, указатели, L-значения, R-значения, шаблоны, наследование, управление памятью и т. Д. И т. Д. модель и что означает каждое выражение.

Мне очень нравятся # 4 и # 6. Что касается # 6, попробуйте кодировать некоторые действительно продвинутые структуры данных в C ++. Ничто не заставит вас учить язык быстрее, чем пытаться решить некоторые проблемы, которые влекут за собой сложные структуры данных.

1 голос
/ 02 июля 2010

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

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

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

1 голос
/ 02 июля 2010

Я был бы сильным сторонником # 4. Обучение функциональному программированию очень ценно. Я не очень много делал в C ++, поэтому я не знаю, насколько это естественно, но мне нравится, как Ruby и Scala выполняют функциональное программирование.

1 голос
/ 02 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...