In designing a new system (or sub-system) or an entire architecture, there is a fundamental and constant tension between building components yourself versus purchasing and/or adapting existing components from outside parties, whether commercial or open-source.
In making this type of evaluation on a candidate component, I use these key factors:
- Is the functionality a core competence of the business or application? If so, then that favors building it myself.
- How complex is the candidate external package? A well-designed, easy-to-learn package will favor using it. A complex package with a steep learning curve will favor building something light and simple myself.
- How much of the functionality will I be using? If I will only use a thin slice of the full functionality then that favors just building a small simple utility myself. However, if I envision using more or most of the package’s functions, that favors incorporating it.
- How much do I trust the source? How long has the vendor been around and how is their business doing? What do the forums for the product/vendor look like — lots of satisfied or dissatisfied customers?
This establishes a pretty high bar for incorporating components from outside vendors. But I don’t believe it is a result of the Not-Invented-Here syndrome. Each of the criteria I use is based on the importance of both the simplicity of each component and how much control over it the application domain requires. None of the criteria are based on how trendy the package or technology is.
Which brings me to open-source…
Open source has an advantage over commercial components in that I can access the source and make any modifications or bug fixes I might need. But to me this is not an argument in its favor. The whole point of incorporating external components is to avoid spending time implementing, fixing, or modifying them! (A similar argument applies to the notion of always encapsulating all external components behind your own interface — all the work involved in doing that directly eats away at the cost savings you reap by using it in the first place.)
And, I’m sorry to say, I just don’t trust open-source projects very much. This isn’t really based on any hard information, but neither is the much-vaunted “many sets of eyes make a problem simple” theory that open-source quality claims are based on.
All those caveats aside though, you simply can’t do everything yourself so you will have to use external components in some capacity, even if it is just the .Net framework (or whatever framework forms your computing substrate). But be careful — you’ll be living with your decision for a long time to come.