Actually, I don't think it impedes progress at all. People don't put enough time to research what current solutions can do before putting time and effort into a solution of their own that does the exact same thing, possibly less. There can be some good side effects of this:
1) Competition. Developers feel the need to step it up when their competitor is doing better.
2) Bad Management. Projects sometimes get stuck in politics, impeding progress. Or sometimes the code base is a mess and hard to contribute to, impeding progress.
3) Educational Purposes. Jumping into a code base isn't easy, especially when you're surrounded by concepts that are difficult to understand at first. Building things from scratch makes you realize the choices made in another project (or sometimes even improving upon them).
The least you can do is look into what makes the code you're wanting to succeed poor. A lot of people think, "This library is complicated.... I can do better!" but in reality, things don't tend to be that simple. Sometimes #3 from above kicks in here to determine the reasons for a complicated library.
Also, honorable mention to #1 that sometimes joining the competing project instead of you making your own is often more useful. However, I feel #2 and #1 somewhat go hand in hand. Reality is that there's always something that can be improved upon. Projects have a tendency to reject ideas that they're not familiar with unless it's forced upon them and people start realizing the purpose of that idea.
Especially in this area, nothing is black and white. People fork and make other projects simply out of spite for the developers of a given project... and it sometimes turns out okay ( see
http://juku.it/en/comment-why-end-users-and-i-hate-oracle/ )