Any department, particularly the engineering department, must recognize that they must have a set of core competencies that are strategically essential for their company to succeed. Providers of software are in a highly competitive environment where differentiation is critical. Not surprisingly, these core competencies are the areas that must be focused on, cultivated and maintained from an engineering standpoint. Some examples of core competencies are the ability to:
- produce particularly high performance, highly scalable transaction systems
- add relevant features quickly to be first to market
- consistently deliver the most reliable systems
- deliver the most elegantly designed and easy to use systems
Where are your levers? Where should you focus your team's efforts? What competencies should you build and what should you outsource? Where should you invest and by how much? Should your team be experts at building features that matter or having expertise in software development infrastructure?
In the most extreme case, one could argue that you should outsource everything that is not within your core competence. The benefit is that you can focus on being best of breed in the areas that matter to your business while getting best of breed from outside providers in the areas that matter less. In the other extreme, you can do everything in-house, the "not invented here" syndrome. The benefit is that you have control but the downside is that your focus is diluted and your costs greatly increase as your needs change. Culturally, engineers have tended towards the "build it in-house" approach because they can.
With regards to static analysis, how much of software development infrastructure is truly strategic to your company? How much can and should be outsourced to some outside help? Where can you get the most leverage from your team's resources to focus on the areas that will make your software development organization a leader in the industry?