It's because HR know jack about the field they are recruiting from. They therefore ask for specifics, which means that the people hiring spew out a list of the skills that the current incumbent in the target job has (or a similar job).
And it wouldn't wash with them if you just put down "Must be able to think logically, and learn new stuff quickly", which as far as I know are the only real requirements for programming jobs. They'd have to work out how to assess that, instead of counting bullet points on a CV.
Sometimes I wonder if the dearth of decent programmers that seems to be a fact of life in the current hiring environment is purely down to the HR department filtering all the decent candidates out. Our jobs go out internal to our organization first (we're the largest employer in Europe, so that's not TOO bad), so I guess all the applicants I get have been double-filtered.
And of course, there is no budget for slack. If someone capable of doing the job leaves, why, you should be able to fill his position with someone just as capable almost immediately! Workers are fungible little peons! There is no acknowledgement that you can't replace experience, much of it specific to the work.
The real solution is to have a pro-active policy of hiring inexperienced people, training them up, and promoting their loyalty, but no-one wants to do this, because the standard industry remuneration policies don't promote loyalty, so any kind of investment in people is seen as a waste because the only way that people get a decent raise is by jumping ship to another employer. It's a vicious cycle - you can't hire people to train them because you can't keep them. So the end result is that the only way you forge new capability is by destroying entire development teams and recreating them from scratch, losing man-decades of experience and productive working relationships in the process.