One thing which really isn't addressed here is one of communication. Every software Engineering book I've read speaks of how communication is the most important part of a project. I've been involved in plenty of projects where I have seen very "polite"
foreigners do a good job, but because of communication and cultural differences, things just don't work out right. They have the Skillz, but frequently don't understand the business at hand.
I think we'll see a drastic reduction of American programmers, but as time goes on, more and more jobs will come back when the cost savings of outsourced developers is overshadowed by missing project deadlines / delayed shipment / frustration.