I was once loosely attached to a team who had been given the job of modeling a particular industry. Lets say it was Insurance.
They were given some money and some offices, and told to go away and create an industry model, which could be used as the basis for customer solutions. One model for all aspects of the industry – think of the time and money it would save in creating solutions, and even more in integrating them together.
The first time I saw the model, it was going OK. They had about 200 domain model classes, with things like Premium and Customer, Policy and Claim, but lots of gaps which they just hadn’t had time to fill.
Second time, a few months later, it was up to 600+. This model was now much more comprehensive, at least in the view of those who knew more about the industry than me. Had all the stuff from the first version, and a whole lot more. They looked to be nearly finished.
The final time, several months later, they had only just finished, and the model was visibly smaller. The pile of paper, which was the printout of the model, was a fraction of the height it had been last time. Back to fewer than 200 classes. What happened?
We looked at the detail. We looked for Policy – the heart of any insurance system.
We looked again, at about where it was the last time we looked. There was something called maybe Entity_Offering_Link. Which if the Entity is a Customer, and the Offering is ‘Insurance’, then maybe is a policy.
So what had they done? They’d started out by modelling the terms they heard the experts used, then, like good modellers do, looked for common abstractions to make things simpler. And went on and on, finding ever more abstract ideas, to ‘simplify’ the model. Until the ‘Insurance-ness’ disappeared altogether. Entity-Offering_Link could equally be an airline ticket, or a order placed at McDonalds. And links between things no longer had real names. All the ‘stuff’ was connected though a generic class, where the purpose of the link was soft-coded as a variable in the link.
Super flexible. Super abstract.
Super hard to understand.