I've given a lot of interviews (>100) and while I totally accept it's a best guest and imperfect, I find that you get more out of fizzbuzz and the like than meets the eye.
Firstly, I certainly agree unnecessary algo questions for a job that doesn't involve algorithmic problem solving on a day-to-day is silly and leads to false negatives.
But the simpler problems give you more than just the basic 'can you code' test - it gives you an insight their into thought process.
For example, seeing how somebody progresses from:-
for(var i = 1; i <= 100; i++) {
if (i % 3 == 0)
console.log('fizz');
else if (i % 5 == 0)
console.log('buzz');
// ah hm both % 3 and %5...
}
To:-
for(var i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0)
console.log('fizzbuzz');
else if (i % 3 == 0)
console.log('fizz');
else if (i % 5 == 0)
console.log('buzz');
...
}
And dealing with the fact they have a mistake that needs fixing is always interesting to observe, and gives you insight into how they approach problems.
It seems so incredibly trivial and irrelevant at first hand but shows you a lot (assuming they've not seen it before.) I've been really surprised by this.
I suspect the idea of there being a science of this is a bit of a mistake - there's plenty of stuff that involves so many factors that it's really hard to know the really ideal approach. A quick look at the actual state of software engineering studies (30 undergrad students != all programmers) or e.g. macroeconomics should give you pause.
Certainly loads of scope for improvement though, I agree wholeheartedly!