Sometimes you know exactly what you want your software to do. You can easily hire an offshore programming team or a freelancer if you have a small project, and direct them to develop what you need.
Other times, you may not be so sure. You need someone to research what is best,or even possible, before software development can begin. Outsourcing of your research before you begin development takes a special type of engineering team.
Woe to the company that outsources to one type of offshore team when they need the other!
I have a couple of clients right now that are in "research-mode" as they use offshore outsourcing to create a software product. One requires some innovative software to run under Windows that communicates with a website. The other needs an efficient screen capture solution also running on Windows.