My ideal work environment would be small co-located teams of 3-4 really smart people. The team should be colocated together with easy access to Product people and should consist of design, frontend, and backend developers.
The reality is I have only been in this situation once in a 10 year career and it only lasted 6 months. Most of the time I've had to contend with the following:
1) Not really hiring the best developers you can find.
2) A noisy "open office" environment.
3) Product people are unreachable and don't clearly define work well enough for the team to just go at it.
So these days I've started working with distributed teams. It eliminates many of the problems, but introduces new ones (like communication issues, tendencies for bad situations to seem worse than they are, managers with trust issues, etc).