In the design of a single system, the tendency is to combine the "what" with the "where", tailoring a component specification for a particular set of usage needs. In Generic Engineering, we are concerned with separating from the environment that part of the specification that is independent of the environment, i.e., the "what" that is independent of the "where". It can then be used across a variety of environments. The negotiation occurs not at the time that a system is conceived, but at the time when a family of systems, or generic architecture, is conceived.
The 3Cs model derives its name from the terms used for the "what", "how", and "where" of a component:
We refer to the domain of applicability of a concept as its conceptual environment. From the point of view of the concept, this environment is represented by the range of conceptual context that can be provided to instantiate a concept. A particular choice of conceptual context can therefore be viewed as a "narrowing" of the conceptual environment.
Once a concept has been provided with conceptual context and a conceptual environment established, any choices of content or contentual context are design decisions that must keep invariant the properties defined by this environment. The corresponding content environment is thus derived from the conceptual environment and the range of "allowable" design decisions under this conceptual environment.
It is of course possible, and in many cases desirable, to defer the specific choice of conceptual context and to provide content and corresponding contentual context for a "generic" concept. Ada generics provide limited ability to do this.