The Two Abstractions of System Design: Hide or Reduce
muratbuffalo.blogspot.com
muratbuffalo.blogspot.com
Abstraction hides unnecessary detail. Generalization finds/surfaces commonality among items.
> oop - What's the difference between abstraction and generalization? - Stack Overflow - https://stackoverflow.com/questions/19291776/whats-the-diffe...
Creating a procedure/method is a form of abstraction. Allowing it to accept parameters is a form of generalization (by allowing it to be used for a number of similar inputs).
Simply creating an integer data type is a very simple form of generalization. Allowing operations to work against generically against any integer.
vs
> Abstraction hides unnecessary detail.
Sounds like these ways of describing abstraction are in agreement with one another to me.
If you hide what’s unnecessary you’re left only with the things you think should leak. And you think they should be left unhidden so that you can use them for something, so to leverage them.
So it's kind of bottom-up/"data" driven as opposed to abstraction being more "engineered into" the system.
That is, to me abstraction is building things such that they look the same. Generalization is discovering things are almost the same if tweaked a little to look the same under a certain lens.
Does that make any sense? In this view I guess the generalizing lens can be become the basis for an abstraction. I would assume the loop is closed between the two somehow but I can't quite see it.
> In stark contrast, the modeling abstraction is about identifying what should leak and leveraging it! It exposes the fine-grained actions and orderings, and proves that invariants hold despite the interleavings. The payoff for this work is to harvest the maximum safe concurrency from the system.
I guess I don't understand the argument here because those just sound like two different flavours of the same custard to me; the difference is just the balance of work you're doing on each side of the interface, and that decision depends on use cases specific to the project.
This feels more like it's making a point about system design? Abstraction is abstraction - you can apply it at different levels within a project, and a big part of building skills in software development is in learning to zoom in and out and nail the abstraction at each stage, but ultimately you're doing the same thing over and over. I don't personally think we need categories of it.
It is two different flavours. One is about interconnecting things, and the other is what you interconnect. What TFA called modelling abstraction seems to be the primitive ideas that goes in building more complex systems (which it calls Modularity Abstraction). Something like a String is not a primitive, but rather a combination of the idea of Character and List are. Just like you can go from a disk (a pure array of bytes) to a file system (in the unix world, a tree with nodes of metadata). The primitive here are Array (existing) and Tree (target) and with them you build a modular system (The file systems) that transform ones into another.
So yes, both are abstractions, one is about identifying primitives, and the other is about combining them.
It is a tower of abstraction as it's recursive. It's just that at every layer you will be dealing with two types, the primitive from the previous layer and the new system that you're building in this layer. Something like Character is a composition of symbols (bit) and encoding (ASCII, Unicode), in a specific form of Data.
DDD is kinda a meta on that where the emphasis is to simultaneously build a glossary (primitives) while also trying to define subdomains to restrict their semantic. But that's an approach for software architecture, not general system modeling.
I wouldn't go with that. Most of the listed abstraction here is about building a new model on top of the old for new capabilities. They don't bother to hide them, merely use them for new purposes.
Like TCP using IP for interconnection, but adding transport stability on top. IP is still fairly visible, but in an axiomatic way. Same with string libraries which mostly add new operations but the nature of being a list of characters is still present.
A better example of abstraction for hiding are libraries where the public interface hide the nature of implementation (things like POSIX). This aligns more with the modeling abstraction, where you extract a minimalistic version of the system. Incomplete for implementation, but enough for interfacing.
https://muratbuffalo.blogspot.com/2026/08/composition-and-mo... The rely-guarantee reasoning we used in this post is where the two abstractions meet and become a joint constraint. The modularity abstraction is the boundary: we split the specs into private versus interface variables, hiding produced from the consumer and consumed from the producer. The modeling abstraction is the Env actions. E.g., EnvPut is not an API for the producer, it is a reduction of the producer: the minimal behavioral skeleton of the entire producer relevant to the consumer's property.
Modeling abstraction = drawing lines between the boxes