At work I currently function as a team leader/developer.
Last week we delivered iteration one of a large project. It was two days late, but I think we did pretty well; we knew from the iteration planning this would be a tough one. It required an exhausting sprint the last four days and nights, something I'd rather not do again.
What went wrong?
* C++ is fragile. Getting everything to work properly with everything else is difficult. It bit us several times, some things taking calendar days to get working. If it wasn't the compiler support in third party libraries, it was the memory allocation or version of STL that didn't want to play nicely.
This was a complete surprise to me, and in the future we will have to do a lot more spike solutions a lot earilier.
* Cooperation with a consultant developer broke down completely due to (I guess) diverging expectations and communication problems. In the future, people being part of the team must work on-site. People peripheral to the team must be given much clearer instructions and more frequent updates.
What went right?
* The team members complemented each other in an excellent way. Among us we had good C++ programmers, good database skills, intimate knowledge about the system, and good toolmakers. And lots of go.
* One team. Having all five of us within ear shot helped a lot to keep everyone in sync. Daily short meetings at 3-4PM kept us focused on the short term.
* Risk management worked. Except for one part of the system that we didn't know much about, I think we managed to keep track of the unknowns and adapt to them. Some things, mostly getting-things-to-work related, were up on the whiteboard a long time before we solved them, and since it took time it was good we started with them early.