How It Is
Unfortunately, in most places I've had experience with salary is not so much based on an individual's skill level, but on company policy, local competition and stinginess. Rules are set, the company in question will have a bunch of people who don't know squat about development come up with a pay grade chart. They'll throw a couple levels (i.e. Developer I - Developer III) of programmer somewhere on to the chart, typically higher than your average clerical worker but usually lower than someone who's position requires domain knowledge, even if these are the people you'll be working most closely with.
There will be criteria to fit you into one of those categories, however, it has less to do with skills and more to do with how much experience you have. In other words, the old guy sitting in the corner who refuses to learn jQuery because that's not how he did it when he wrote the original version of the web application will be paid more than someone who is current in technology, because he has more technical knowledge than you, you know because he has more experience.
Ultimately what decides how much you get paid is whether or not you pass the interview and how well you negotiate your salary. That said, negotiation will only yield a handful of percentage points at best. If you pass the interview you'll simply be slotted into the pay grade system based on how many years of experience you have in the industry. If you're lucky they'll give you vacation time based on this as well.
How It Should Be
Ultimately, the problem I have with companies is not that they setup a pay grade. The problem is they set up a pay grade that rewards just getting by and not getting fired. It doesn't really reward learning new information and this how a companies IT division stagnates and you get Bob sitting over in the corner who is totally and completely useless being paid more than any other programmer.
At some point during an interview process your skills relevant to the company would be assessed. If done correctly, it would be not only your ability to get through an interview that is judged but your ability to solve some real world development problems given recently faced by the company. Based on the speed and accuracy with which you're able to solve a problem should reflect where you lie on the pay scale. Any test given should allow you to demonstrate the following:
- Ability to solve simple to complex programming problems
- Ability to write clear and consistent code
- Ability to understand existing code
- Creativity expressed in solving the problems
- Ability to communicate the solution to others
A college degree is important only so far as it will increase your ability to get a job with no experience. When determining salary, experience and negotiation rules all.
In many situations, unfortunately, the rule is experience. Everything else is an exception to the pay scale. Your skill set only affects your salary in the way that affects who will give you a job. Most salaries, not just for programmers, work this way. It doesn't matter if you go to company with XYZ skills, they'll still only pay you X dollars, which might actually be 1.05 * Y that they offered another guy, but most salary ranges are set in stone and usually your years of experiences tells you which range you'll be in.