With anything that an organization needs to do, one of the first questions is whether it should be done in-house or outsourced. That is, should you build or should you buy?
Ultimately, this is a question about business priorities. A common rule of thumb is that things that are a core competency or a competitive advantage of your organization should be done in-house, whereas things that are non-core, routine, or commonplace should be left to a vendor. To give an extreme example, most companies do not fabricate their own CPUs, since it is cheaper to buy them from the semiconductor manufacturers.
With software, two important decisions to be made are who builds the software and who deploys it. The spectrum of possibilities is illustrated in Figure 1-2. At one extreme is bespoke software that you write and run in-house; at the other extreme are widely used cloud services or SaaS products that are implemented and operated by an external vendor and that you access only through a web interface or API.
Diagram illustrating the spectrum of software deployment and operation options, ranging from in-house software and operations with more control and investment, to off-the-shelf software with outsourced operations like SaaS, offering less control and investment.
Figure 1-2. The spectrum of decisions on outsourcing software and its operations
The middle ground is off-the-shelf software (open source or commercial) that you self-host, or deploy yourself—for example, if you download MySQL and install it on a server you control. This could be on your own hardware (often called on premises, even if the server is in a rented datacenter rack and not literally on your own premises), or on a virtual machine (VM) in the cloud (infrastructure as a service, or IaaS). There are more points along this spectrum, such as taking open source software and running a modified version of it.
A related question is how you deploy services, either in the cloud or on premises—for example, whether you use an orchestration framework such as Kubernetes. However, choice of deployment tooling is beyond the scope for these notes, since other factors have a greater influence on the architecture of data systems.