Моё личное мнение коротко: всё слишком абстрактно.
Попробую объяснить поподробнее, но учтите, что мне как профессиональному разработчику ПО уже довольно сложно ответить на этот вопрос, я-то уже давно его изучил, для меня всё очевидно. 😏
Вспоминая свои университетские годы, где мне фактически "с нуля" читали синтаксис и семантику Object Pascal и, в следующем семестре, C++, я могу сказать, что очень сложно было понять в принципе, о чём идёт речь. Потому что подавляющее большинство вещей, с которыми мы работаем в программировании компьютера — не существуют, не существовали и принципиально нематериальны, невозможно их сравнить с чем-то из жизненного опыта.
Давайте я приведу вам пример. Возьмём одно из самых базовых фундаментальных понятий в программировании, которое существует просто везде, в любой языковой среде и в любой области разработки: понятие переменной. Какое у нас есть определение "переменной", что это такое? Нам читали вот это:
Переменная — это определённого размера область в памяти, расположенная по некоему адресу и обладающая именем.
Для профессионального разработчика ПО это определение самоочевидно, потому что оно вытекает из того, как мы переменными пользуемся каждый день. Я для того чтобы его написать, не открывал никакой учебник, я просто сконструировал его заново по опыту и смутным воспоминаниям о лексиконе, который в универе использовался.
Теперь задайте себе вопрос: вы вообще хоть слово из этого определения понимаете?
Для того, чтобы хотя бы представить, что это такое, "переменная", вам нужно уже заранее понимать, что такое "память" в компьютере, что эта память условно подразумевается разделённой на ячейки определённого размера, что эти ячейки пронумерованы числами, которые мы называем "адресами", что в языках программирования высокого уровня есть такое понятие — "имя", причём в каждом языке программирования это понятие определяется по-своему — и ничто из этого не объяснит вам, а собственно зачем мы вообще эти "переменные" в программировании используем, а тем более — как эти вещи, "память", "адрес" и "имя" выглядят в свою очередь.
И так я могу до посинения приводить примеры вещей, которые в разработке ПО становятся понятны только в процессе их использования. Для того, чтобы понять, что вы вообще делаете, подразумевается, что вы сформируете в своей голове какую-то систему абстракций, свою собственную уникальную систему, которую никто кроме вас вам не сможет объяснить. Любой опытный разработчик ПО вам скажет, что у него однозначно был в жизни момент, когда он бился головой об стену несколько дней, а потом в голове у него "щёлкнуло" и он вдруг понял, как "это" выглядит, и всё сразу стало понятно с этого момента.
Вот эта особенность программирования компьютера, её исключительная абстрактность, причём абстрактность на нескольких уровнях одновременно и необходимость постоянно переключаться в голове между этими уровнями абстракции, декомпозировать и обратно абстрагировать процессы и понятия, и делает его таким сложным для изучения, на мой взгляд.