The first challenge and probably the most irritating one is 'Marking the territory'. I hate to hear 'its my component', 'I know the best way to deal with it' , ' you worry about your component' and other variants of it. I guess its human behavior to be a bit protective of your work, but at times it goes out of hand. More often than not this curbs the flow of fresh ideas in the team.
The second challenge and an equally irritating one is 'Passing on the buck'. Now if you are working on a complex software, you will definitely be able to solve a particular problem in many ways (meaning in many components). However there is generally a best solution. But people have a tendency to pass on the buck to some other component by saying 'let them deal with this problem'. I hate it when this happens without reason. A problem passed on to other component must always be accompanied by a detailed explanation of why the problem has to be solved by the other component.
Most of these challenges will vanish if only people are open to new ideas, do the right thing and have trust in others to do the right thing. If only if....