Why Good Systems Resist Hierarchies Until They Can Think in Real Time

Malcolm Mason Rodriguez

Hatched by Malcolm Mason Rodriguez

Jul 19, 2026

10 min read

87%

0

The hidden fight between names and structure

What if the most elegant system is not the one that lets you organize everything, but the one that knows which things should never be organized the same way? That sounds like a limitation, until you realize that many software frustrations come from forcing one model of meaning onto two very different kinds of information.

A tag is not a category. A category is not a tag. And yet digital systems constantly tempt us to blur them together. We want the freedom of tags, the order of categories, and the convenience of making one behave like the other. That desire is understandable, but it often creates brittle systems, confusing interfaces, and hidden complexity.

The deeper question is not whether tags can have hierarchy. It is this: when should a system represent meaning through structure, and when should it let meaning emerge through relationships? The answer points to a broader design principle that reaches far beyond content management. It shows up in databases, operating systems, user interfaces, and even how we think about building software itself.


Tags are signals. Categories are commitments.

The easiest way to see the difference is through a simple example. Suppose you run a recipe site. A recipe for chili might be tagged with spicy, dinner, one-pot, beans, winter, and high-protein. Those tags are flexible, overlapping, and numerous. They are labels of association. They help people discover the recipe from many different angles.

Now compare that with a category such as Main Course. That choice implies a decision. It puts the recipe in one place in a broader map. It says, in effect, “This is where it belongs in the system’s primary logic.” Categories are structural. They impose a hierarchy that helps the system answer bigger questions, such as where this content lives, how it is grouped, and what it sits beneath.

This distinction matters because hierarchical organization is not just a feature, it is a statement of authority. A hierarchy says one thing is subordinate to another. Tags, by contrast, say multiple truths can coexist without forcing a single order. When you try to make tags hierarchical, you are often smuggling structure into a form meant for association.

That is why many systems work better when they keep the two separate. Tags are for rich, many-to-many meaning. Categories are for navigation and control. Confusing them is a little like trying to use sticky notes as filing cabinets.

The moment you force a flat label system to act like a tree, you often create a bureaucracy of meaning.

The problem is not that hierarchy is bad. The problem is that hierarchy is expensive. It asks for decisions, maintenance, and consistency. If the underlying items are volatile or multiply relevant, hierarchy can become a cage.


The real cost of hierarchy is not complexity, it is frozen assumptions

Hierarchies feel tidy because they reduce ambiguity. But they do so by locking in assumptions about how the world is supposed to be divided. Once you decide that something belongs under one branch, you have made that branch more important than the others. That can be useful, but it can also distort reality.

Think of a library. A book can live in one shelf location, even if it belongs to several themes. It might be a political memoir, a war story, and a study of leadership. A hierarchical catalog can choose one primary shelf. That makes retrieval easier, but it also hides the book’s multi-dimensional nature.

Tags are a way of preserving that dimensionality. They are not meant to answer, “Where does this belong in the tree?” They answer, “What else is it connected to?” In other words, tags model the world as a network of affinities, while categories model it as a path of containment.

This is why a tag hierarchy is often a contradiction in practice. The more you organize tags like categories, the more you inherit the problems of categories without fully gaining their benefits. You create nested labels, but the labels remain semantically loose. The result is often a pseudo-structure that users have to decode.

There is a deeper lesson here for system design: not all organization should be represented as structure. Some things should be discovered through search, filtering, or suggestion, rather than pre-baked into a tree. A good system knows when to classify and when to connect.


Tiny apps succeed when they stop pretending everything must live inside the app

This same tension appears in software architecture. One vision of simpler software assumes that if the database is always available and the right abstractions exist, then the app itself can become tiny. That idea is powerful because it flips a common instinct. Instead of stuffing every bit of logic into the application, the app can become a thin layer over live, responsive data.

Why does that matter? Because a smaller app is not just faster. It is less interpretive. It does less translation between user intent and stored reality. The less code there is, the fewer places there are for bugs to hide. Maintenance becomes easier because the system is no longer duplicating meaning in many layers.

Now connect this to the tag versus category problem. Hierarchical tagging often appears when an application tries to precompute meaning that should remain fluid. The app wants to know too much in advance. It wants to impose its own structure on a domain that changes constantly. But if the data layer is accessible and reactive, the interface can stay simpler, more direct, and less opinionated.

Imagine a ListView that knows about smart objects and redraws automatically when deep properties change. That is not just a rendering convenience. It is a philosophy. The UI does not need to own the organization of reality. It can observe reality and respond to it.

This suggests a broad principle: the best systems often move intelligence downward into the data model and upward into the interface, while keeping the middle thin. The middle is where complexity multiplies. It is where you are tempted to create redundant hierarchies, duplicate classifications, and hard-coded assumptions about relationships.

A tiny app, then, is not merely a small codebase. It is a system that refuses to over-encode structure where live relationships would do better.


A mental model: choose the right shape for the job

A useful way to think about this is to distinguish between three shapes of information.

1. Trees for containment

A tree is best when items belong in one place, or when one path should dominate the others. Examples include folders, product categories, and permissions. Trees are efficient for navigation and governance.

2. Sets for association

A set is best when items can be described by multiple labels without a single required parent. Examples include tags, interests, ingredients, or behaviors. Sets are flexible and search-friendly.

3. Live objects for change

A live object is best when the meaning of the item is not fixed at compile time, but updates in response to use, context, or state. Examples include a shopping cart, a message thread, or a dashboard widget that reflects current conditions.

The mistake many systems make is treating every information problem as if it were a tree. That makes the interface look neat, but it often degrades the user’s ability to express nuance. On the other hand, making everything a tag set can destroy navigability. And making everything a live object can lead to a swamp of reactive complexity.

The art is in matching the shape to the job. A category system is a map of major roads. A tag system is a field of signposts. A live object model is the city itself, changing as people move through it.

Good design does not maximize order. It maximizes the right kind of order.

This is why some interfaces feel intuitive even when they are complicated. They separate what must be decided once from what should remain open-ended. They use hierarchy where there is genuine containment, and they use tags where there is multiplicity. The result is not less meaning, but more trustworthy meaning.


Why small code and non-hierarchical meaning belong together

There is a subtle but important connection between small apps and non-hierarchical labeling. Both are about resisting unnecessary centralization of meaning.

When code grows large, it often becomes the place where everything gets decided. Business rules, rendering logic, state transitions, content relationships, and navigation all get tangled together. The codebase starts to behave like an artificial hierarchy, with one part of the system trying to explain all the others. That creates rigidity. Once the logic is embedded, every change becomes expensive.

By contrast, a smaller app with stronger abstractions can delegate more meaning to the data itself. A smart object knows how to present itself. A list knows how to react to changes. The UI no longer has to invent a secondary model of the world. It listens instead of dictating.

This matters for tags because tag systems often fail when the application becomes the place where tags are over-interpreted. A tag should remain lightweight unless there is a real reason to promote it into structure. If a tag starts behaving like a category, ask whether you are solving a genuine navigation problem or merely papering over a data-model problem.

For example, a news site might tag articles with AI, policy, Europe, regulation, and startup. If editors later want AI to have sub-tags such as machine learning and generative models, the system should ask a hard question: are these really tags, or have they become topical sections that deserve their own navigational role? If they are sections, treat them as such. If they are still associative labels, keep them flat and rely on search and filtering.

The same discipline applies to code architecture. If a feature requires deep nested logic, the answer may not be more layers of abstraction. It may be better domain modeling. Maybe the system needs live data structures rather than hierarchical glue code. Maybe the right move is to simplify the app until it can reflect reality rather than impersonate it.


Key Takeaways

  1. Use categories for containment, tags for association. If something must belong to one place in a system, hierarchy is appropriate. If it can belong to many, prefer flat labels.

  2. Do not force tags to become pseudo-categories. Nested tags often create the appearance of structure without the benefits of true hierarchy.

  3. Keep applications thin when possible. The more logic the app owns, the more it duplicates and distorts meaning that could live in the data model.

  4. Choose the right information shape. Trees are for navigation, sets are for nuance, and live objects are for change.

  5. When in doubt, ask what the system is trying to optimize. If the goal is discovery, use flexible associations. If the goal is governance, use hierarchy. If the goal is responsiveness, use reactive objects.


The deepest design principle: let structure serve meaning, not replace it

The temptation in software design is to believe that if we can just organize things well enough, the system will become understandable. But organization is not understanding. A hierarchy can make things look tidy while hiding the richer web of relationships that actually gives them meaning.

The most durable systems do something subtler. They distinguish between the parts of reality that should be ordered, the parts that should be related, and the parts that should simply stay live. That is why tags should not always become trees, and why apps should not always become giant brains. Some information deserves structure. Some deserves flexibility. Some deserves real-time awareness.

When a system gets this right, it feels almost invisible. The user does not have to fight the model. The code does not have to simulate the world in layers of increasing guesswork. The interface becomes a conversation with reality instead of a ceremony of classification.

In the end, the question is not whether hierarchy is useful. It is whether hierarchy is helping the system think, or merely making it feel like it is thinking. That distinction is where good design begins.

Sources

← Back to Library

Hatch New Ideas with Glasp AI 🐣

Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)

Start Hatching 🐣