Тут все опять же от человека зависит, кому-то одно проще, кому-то другое. Прям на сразу нельзя сказать вот на этом языке ты будешь как бог кодить, а на этом будет все сложно. Каждый выбирает язык под себя, под задачи.
Ну смотри начать с питона стоит потому, он легче, изучишь его уже будет какой-то стимул продолжать учиться, а на С++ дойдешь до указателей, шаблонов и отложишь книгу в дальний ящик, на питоне не надо указывать тип для каждой переменной пиши себе и наслаждайся + за 4 вечера можно уже начать что-то писать на много круче, чем получения списка процессов и чтение из памяти. Для сравнения мне понадобилось около 1.5 недель чтобы сделать тоже самое на C++.
C++ тяжелый для изучения и его не стоит изучать по книжке лично мое мнение т.к. в тех что с адекватным описанием по 800+ страниц, это долго и нудно многие на 100 странице забьют и будут писать на VB или C# (имхо в таких языках порог вхождения немного ниже), лучше использовать книгу как справочник, все равно даже если прочтешь её, то все абсолютно не запомнишь, получается трата времени.
Я по гитхабу учился читать код, если что не понятно в коде гуглил и смотрел на msdn функции для понимания что код делает.
Реверсить примерно так же учился, методом тыка обращаться с IDA, т.к. нет для неё никаких уроков для начинающих, оно возможно и не надо, есть writeup'ы с CTF, либо описание реверса какого-нибудь вируса, но для новичка это слишком сложно.
Для себя компилировал программы и после их восстанавливал, и реверсить учишься, и программировать.
Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания.
Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).
https://www.tiobe.com/tiobe-index/
Высокоуровневый
Надеюсь, на все вопросы ответил.