the most efficiet approach to building systems today, lies within reuse. as open source software grows, and we get better and better open source applications like ( all the php(s) in the web application world) . so now you are faced with requirements to build a new system, you could easily see that most of the functionalities were already implemented in open source, maybe not all but most . now if you are smart enough you will think of reuse. which will make the task easier. and the developement time shrinks. but we are still afraid of such endeavor , and most developers rather rebuild the system from scratch ! And i am wondering about why this is the case?
my conclusion is that : in order to reuse any "component" in software, you need an API for it, a very good API, that is well documented! and in general building a component with mindset that is targeted on reuse ! it's like design for testability really, if you dont think about it early on its hard to achieve !
there was a vey nice google talk about designing good APIs and why it matters to do so : you can find it here: http://youtube.com/watch?v=aAb7hSCtvGw