I'll contribute another two cents to this...
First off, I'll just say that I really don't know the answer as we've had similar circumstances. But it seems at the root, the issue is communications. Anything you can do to help the team communicate better and more efficiently will help. As people start talking more and more with each other, they will not be nearly as reluctant about popping off a quick instant message just to ping someone else and see if they know what the solution is. On the other hand, when your team feels like they are a bunch of strangers thrown into the same team, their communications will be very limited and some would feel that if they ask a lead or anyone else for help, they'd be "bothering" them.
And I know it can be even more difficult with distributed teams. I'm kinda stranded across two different teams. In each team, we have an out of state developer. The interesting part is that the two teams feel very different when I interact with others team members. What I noticed is that in a "better" (don't know if that's a good word, they are all good guys) team, we have a lot more random conversations. We'll talk about snow, snakes, burgers.... On the other team, everything is way too non-personal and effects of that seem to spill over into professional communications as well. We don't have as many random meetings, or chat sessions and when we do talk, everyone tries to steer clear and be careful and reserved.
As I do believe alcohol is a solution to many problems, one of my short term goals is to hop on a plane with some of the other team members and just go have a beer with the two out-of-state guys. Maybe it'll work or maybe I'll be posting a different answer on SE in the future.
The bottom line is do whatever you can to improve communications:
- Try to get people to socialize in non-work setting (i.e. what I already said above)
- Promote pair programming or at least collaboration whenever it makes sense. I know some will balk at the idea of always being tied to another developer so this may not be for everyone.
- Co-location, if possible, definitely helps but is it always possible?
- As S.Lott pointed out, stand-ups will definitely promote team communications
- Random check ins -- sometimes even in daily stand-ups people will report their task is going "fine", but when you just pop into their cube, you might find out they are stuck on something for the last 3 hours.
- Invest in better communications software. We have instant messaging and I still feel even that makes people too detached. We've been throwing around ideas of giving everyone web cams.
- Informal, no management, meetings to talk about what's on peoples minds. How they feel the project is going, where are you lacking, potential problem areas to watch out for. This is kind of like Agile retrospective, but at least the way we've been doing those, it seems it is too formal and often people are told to stop talking because there's an agenda. While that type of meeting helps to move things forward and we do make progress in terms of retrospective, it seems to squash some of the desire to communicate.
- Lastly, code reviews definitely help and you should introduce them and ensure that they are done regularly. They are another communications point for your team. However, you will recognize many similar problems in code reviews that you see now. A lot of times, there would be a better solution but by the time code review rolls around it's already been coded and you don't feel like making people rework what was done. Would be nice to get them to talk before they go down some path in the first place.