Software Planning 101: Part 7/7
Tangibles in Software Development
So far we have described what software decisions and trade-offs need to be made as part of creating a software solution. To make things more tangible, we will now focus on the tangibles involved in realizing a product.
Putting the Theory TogetherWe will also link the different topics we have discussed earlier together in this article: solution abstraction levels, code structure, execution localities and implementation technologies.
ProductThe product is defined by business. A product defines the need for software and describes what functionality the software should provide. The product is defined in Business Product and Functional Product abstractions.
SoftwareSoftware represents what technology - read software solution - needs to be developed to provide the functionality of the product. This is described in Conceptual Architecture abstraction.
SystemAt next step the software is broken down into systems and systems into components. Each system has its own code repository and release cycle. How the breakdown happens is defined at Logical Architecture abstraction.
ModuleA module is a unit used for implementing software. Modules are designed and implemented independently while remaining aligned with the logical architecture. How to implement a module is described at Technical Design abstraction.
Within a the design of a module the decisions are made about the finer code granularity scales: packages, files, classes and methods.
Code ArchiveModules are not directly exposed but assembled into useable code archives. If not done, we would hardwire our module structure of a system to external systems. Not only want we to remove the complexity of the module structuring, as they have no use of knowing, also it would prevent us to restructure a system.
A code archive makes the functionality of a system available for others to use. Therefore a code archive can include code archives of other systems to make the consumption easier. A module can be many times assembled in different code archives.
Distribution PackageA distribution package is used to leverage an existing technology to manage dependencies and track the versions of code archives present on a host. Examples are pip, apt and yum. Thus a distribution package adds extra metadata for deployment around code archives.
A distribution package contains a service definition that needs to be deployed into a service provider.
Service ProviderA service provider can host logic to perform a specific service. Examples are Apache Tomcat for which logic of a service is defined in war format, or Apache HTTPD with a PHP engine that gets the logic in php files to perform a specific service.
The operating system itself is also a service provider, you can provide your code as binary and it will provide a separate process to host a service that is described in the binary. Service provider is a broader concept and not only applicable on the application tier.
The service provider must be hosted according to the execution locality as defined by the software plan to achieve the desired performance, reliability and security. What service providers to use are part of the implementation technology dimension and needs careful weighing of multiple factors: maturity, resources, license, knowledge, control and runway.