I will start with one, which however did not work the way I wanted.
In the beginning of the project, we spent some time to do a survey of existing open-source libraries that can be used as building blocks for a larger library. Despite our efforts, there were a number of libraries which we did not come across until several months into the project. Had we found out those missed libraries earlier, we might have made our design decisions differently.
It was understood from the very beginning that no single library could have satisfied all requirements, so several existing libraries are needed, along with some custom implementation to fill the gaps. These libraries would have to be wrapped into a single architecture so that the users will not need to know the internal construction of the library. Efficiency (in multiple aspects; can be summarized as "no CPU time, RAM nor Disk space can be wasted") was the main driving force in the architectural design; so the wrappers need to be equally efficient. In the beginning we did not know which open-source library would be compatible with the design (in the sense that the wrapper does not introduce any inefficiency of its own), as that would have required some pioneering work to find out.
One of the open-source library was about 20 years old. Another library was about 10 years old. In the prevailing thinking of open-source library, the older library is supposed to be more stable and have fewer bugs. Eventually we discovered that the opposite was true, and we ended up having to fix a number of bugs in the older library.
My original hypothesis is that "Does it take a lot of intelligence to not succumb to it? Does it take a lot of experience?" but after reviewing the project, I came to the conclusion that software reuse is like matchmaking - any notion of "missed opportunity" occurs naturally due to chance, and no amount of intentional effort will reduce missed opportunities.
What does it take to not succumb to Not Invented Here syndrome, in order to achieve the highest degree of software reuse and at the same time satisfying the software requirements perfectly?
One of the reason we missed a good candidate library was that it was ruled out very early in the process. When there are more than 10 libraries in the initial list, there is some pressure to find rules that can quickly eliminate some of the candidates, because otherwise we would have spent too much time analyzing (analysis paralysis). However, this fast-track elimination caused the undesirable effect of rejecting one good library. (just like hiring?)