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