By this I mean: you are a developer doing a device driver for windows. You hit some snag. The windows kernel does something in a way that really complicates your work. What are you going to do? Well, you have to code around it. And at the end you hopefully have a working driver and submit it for validation to microsoft, and if they didn't like the hack, they throw that crap back onto you and you'll have even more costs for the re-validation.
Now with android/linux you have full access to the source. You hit some snag. Well you could put in some work to solve it... or you could hack whatever you're working on. You know you aren't going to bother submitting code upstream. You know you won't have to maintain the hack because LOL maintaining old android devices who are we kidding. So you hack hack hack the kernel, and then you hack your code and all is well. Then you ship the kernel and your crappy code.
And you do this for all the drivers in the system.
Then comes the end user, and he gets stuck with whatever kernel you chose, because it needs to have the right hacks to match your binary drivers. Otherwise, no drivers lolol.
So this is mainly the manufacturers not giving a f###. But yeah, agree completely: why is not my phone like a computer? Why do I have to buy a new phone to access new software, and not new *hardware*. Of course with an older phone you might not be able to use some software that needs a hardware feature, or some other software may be slow. But "you can't run this because you don't have android X.Y", and then "you can't have android X.Y because your manufacturer doesn't give a crap" are lame excuses.