I’ve observed a few levels of modeling (i.e. thinking about a problem and describing it in concepts plus data structures) that software developers do in the wild:
- structural modeling, describe structure of the problem domain and represent that directly in code, probably using the concepts that your ORM or data layer provide
- operational modeling, evolving a structural model to include models of the operations and workflows that interact with the structural models
- deep modeling, evolving an operational model to include language that describes how the model, problem domain, and solution domain interact and describe each other
A structural model is what happens in a “just ship it” culture. If you’re lucky, you might start thinking about an operational model as you convert that just-ship-it app into an ecosystem of services connected by APIs and messaging.
Any of these models could poof into existence at a higher level. That is, a team could pop out an operational or deep model of a system on their first try. This is even more likely if it’s their second or third take on a problem domain.
Some ideas for kinds of even-higher level modeling that high-functioning teams perform: error-case modeling, coordinated system modeling, social modeling, migration modeling.
And, let’s not even speak of metamodeling :P