> AFAIK this was because under the old system, there had been too many students registering for exams despite being woefully unprepared, and then predictably failing as a result.
True. That's the real Dunning-Kruger problem: incompetent people do not know how much help they need to get competent. It is our job to show them their weaknesses as early as possible so that they can effectively work on them.
(I believe that state-funded universities (as in Germany) have some obligation to not only educate the self-motivated top 1% but also offer a solid education even for less perfect students - at least if there is a societal need for their competences.)
Another, more important, reason is that written exams are not good tests of programming competence - especially as tasks and frameworks get more complex. We want to assign good grades to students who are competent at developing software in realistic settings, not in highly artificial exam settings.