И что Ваше предложение состоит в том, чтобы переместить в следующий уровень программирования на C++ для кого-то, кого можно назвать, ну, в общем, промежуточным программистом на C++?
Промежуточный Программист: Понимает ISO C++ обоснованно хорошо, может прочитать и изменить код других с некоторой удачей, хорошей со структурами данных и алгоритмами, но не большой
Теперь, очевидно, никто не может сделать все в этом списке без приоритизации, таким образом, нам нужно некоторое предложение на том, что могло бы быть наилучшим путем вперед.
Примечание: Спасибо всем за очень полезные ответы.
Чтобы ответить на ваши конкретные вопросы:
Изучите C ++ 0x
Вам определенно нужно это сделать.Так что, возможно, у вас есть ответ прямо здесь ...
Узнайте, какой ассемблерный код создается для различных конструкций типы, возможно, для x86
Я бы сказал, научитесь понимать язык ассемблера, который генерирует компилятор, в общих чертах, если не в деталях. Однако вам, конечно, не следует пытаться предсказать, что сделает компилятор.
Забудьте о языковых нюансах и получите основы - теория автоматов из где-нибудь вроде Сипсера или Пападимитриу
Если это вас заводит, я полагаю ...
Если вы знаете ООП или, по крайней мере, думаете, что знаете, подумайте, как включить навыки функционального программирования на C ++
Из всех поддерживаемых C ++ парадигм функциональное программирование, вероятно, поддерживается хуже всего - если вы хотите изучить FP, изучите Haskell (или что-то еще), а не C ++.
Работайте над чем-нибудь в духе компилятора и с открытым исходным кодом, например, LLVM или GNU Toolchain
GNU написан на C, так что вряд ли он улучшит ваши навыки C ++ - я мало знаю о LLVM.
Вся идея рушится - следующий уровень означает более сложный структуры данных. Итак, если вы знаете AVL, подумайте о том, чтобы учиться левому наклону черные деревья и др.
RB-деревья не намного сложнее, чем AVL-деревья - та же основная концепция. Если вы понимаете основные структуры, описанные в учебнике по структурам данных, я не вижу необходимости копать дальше, если только эта тема вас особенно не интересует.
Я бы сказал, что вы можете делать все из списка, но не все сразу. По крайней мере, ИМО, вы смотрите на вещи немного назад. Изучение C ++ (или любого другого языка) - это средство для достижения цели, а не самоцель.
Изучение более продвинутых языковых методов, более продвинутых структур данных и т. Д. В основном должно происходить тогда и по мере необходимости для выполнения чего-либо. Вам определенно нужна разумная начальная «база», чтобы делать много, но помимо довольно небольшого набора основ, наиболее продвинутые методы, структуры данных и т. Д. Также относительно специализированы.
Вместо того, чтобы пытаться научиться чему-то самому, напишите код. Когда что-то кажется неуклюжим, излишне сложным, негибким и т. Д., Найдите лучший способ справиться с этим. Таким образом, вы не только познакомитесь с более продвинутой техникой, структурой данных и т. Д., Но и получите хорошее представление о том, чего они действительно достигают, чтобы иметь хорошее представление о том, когда, как и зачем их использовать (а также не менее важно, по крайней мере, некоторое представление о его ограничениях и о том, когда он, вероятно, не применим или полезен).
Я был бы решительным сторонником пункта 4. Изучение функционального программирования очень ценно. Я не очень много делал этого на C ++, поэтому не знаю, насколько это естественно, но мне нравится, как Ruby и Scala делают функциональное программирование.
Я бы сказал, что следующим шагом будет чтение Структура и интерпретация компьютерных программ от корки до корки и выполнение упражнений.
Изучите, как другие люди элегантно решают сложные проблемы. Очень важно: просто тренируйтесь, не забывая оценивать. Пересмотрите свой код или методы решения проблем.
Да (относится к пункту 4), изучите другие языки программирования, особенно те, которые имеют определенные преимущества перед C ++, вместо того, чтобы применять их методы непосредственно в C ++. Сосредоточьтесь на поиске методов для себя, чтобы кодировать как можно меньше ошибок, нарушающих ваш рабочий процесс, найдите откалиброванный систематический и абстрактный подход, который вы всегда можете применить к решению проблем и реализации.
Соберите / создайте набор инструментов / библиотек и методов кодирования, которые позволят вам перестать изобретать колесо, но при этом справятся со всеми наиболее распространенными задачами наилучшим образом. Потому что, если вы думаете об этом, помимо ошибок, удобочитаемости, масштабируемости и расширяемости и, в гораздо меньшей степени, производительности, если вы пишете код, который выполняет свою работу, вы на самом деле показали себя хорошим программистом.
Я стремлюсь к продуктивности здесь. Если вы больше разбираетесь в теории, вы можете просто заняться небольшими фрагментами и малоизвестными языковыми функциями.
Все, что вы упомянули выше, поможет вам стать лучшим программистом на C ++. Выбирать нужно исходя из своего карьерного плана. Например, если вы хотите разработать драйвер оборудования на C ++, вам следует изучить сгенерированный код сборки.
Я бы узнал о BOOST .
Вы можете начать постепенно, просто используя его, и по мере того, как вы углубитесь в библиотеки, вы обнаружите, что думаете: «Как это работает?».
Если вы знаете базовый язык:
Тогда в таком порядке (хотя будет некоторое обратное отслеживание)
На этом этапе вы начнете изучать, как использовать C ++
Предлагаю вам перейти к дизайнерской части программирования. Научитесь разрабатывать, писать хороший код, изучать передовые методы программирования. Сюда относятся шаблоны проектирования, UML, модульные тесты.
Поскольку вряд ли все время делают одно и то же, я также рекомендую, как вы сказали, язык ассемблера. Изучение сборки - это весело, и это действительно помогает вам лучше разбираться в компьютерах. Ничто не может сравниться с ощущением знания того, как работают компьютеры на самом низком уровне.
Знание программирования как низкого, так и высокого уровня превосходит все остальное.
Не беспокойтесь сейчас о C ++ 0x слишком сильно ... сначала убедитесь, что вы действительно действительно понимаете основы. Это означает, что вы должны понимать ссылки, указатели, L-значения, R-значения, шаблоны, наследование, управление памятью и т.д. модель и что означает каждое выражение.
Мне очень нравятся №4 и №6. Что касается пункта 6, попробуйте кодировать некоторые действительно продвинутые структуры данных на C ++. Ничто не заставит вас выучить язык быстрее, чем попытка решить некоторые проблемы, связанные с расширенными структурами данных.
Для другой точки зрения: 7. Изучите другие языки программирования, настолько отличные от C ++, насколько это возможно. Обязательно узнайте о функциональном программировании и пока не беспокойтесь о том, как это применимо к C ++. Некоторые языки для рассмотрения: Scheme, Common Lisp, Haskell, Prolog, Forth, Smalltalk. Вам не обязательно овладевать ими, но вы должны попытаться понять, как они работают и какой хороший код на этих языках.
Если все, что вы знаете, - это один язык, ваше мышление будет ограничено тем, что естественно для этого языка. Если вы знаете больше одного, вы сможете думать по-разному. Вы будете более гибкими в подходе к проблемам.
Изучение сборки (например, для написания сборки) может быть хорошей идеей, но я настоятельно рекомендую вам не привязываться к деталям того, что генерирует ваш компилятор, так как это будет меняться от версии к версии от уровня оптимизации до уровня оптимизации.