There is always one big obstacle in software development. Developers themselves.

First you will realize that your team is not composed of top programmers. You will find out that there are numerous programmers with hard-coded way of doing things and OOP is for them new way of doing their job. And they are not used to it. They are smart, they love statics and they love them very much. And if you are not careful and you listen to them too much your code will turn to one monolithic rock that is pain to maintain, because everything is bound to everything via static references. Every change is harder and harder and it will inevitably come time when its heaviness will crush your project to abyss.

Secondly, when you work with someone, it is important to have some code conventions. Now come the hard part. Programmers are really selfish people and it is hard to persuade them to use same coding standards. They do not like it. They will argue that they will make it much faster their way. This problem is similar to building dog-kennel:

When politics are approving nuclear plant, it is decided in minutes. Nobody really knows how that complicated atom-splitting force works, so the plan will be approved without objections. But then they have to make judgement on dog-kennel placed in front of it. They will not agree in decades. Because everyone have different option about the proper colour.

Before introduction of any new technology you have to have overall agreement, to prevent two or multiple coding standards. At least try it :)

Third. Developers are messy and make a tons of crap code. Every time I see this, the reason is most of the time the same. Then I always remember one story from Bob Martin's speach at QCon.

When we were young, 9 years old, we had a system for our bedroom: “somewhere on the floor”. Underwear was somewhere on the floor. Then we easily found it. Socks were somewhere on the floor, under the bed. We found them because we had good system. We knew where thinks were - somewhere on the floor. Then our mum came in. She started to clean the room out of cheer frustration because there was no way to know for 9 years old what the concept of order means. This does not change till you get 30 and get married. And then you realize when 2 people are using the same space, the system does not work so perfectly.

I personally consider people relations the hardest part of programming. To make your project done you have to be sometimes loving and caring mother or sometimes ruthless dad when there are no other options. You have to find way to all members of your team. Find problem that blocks them from doing their task and solve it. Otherwise it harms your project, your goals your business.