The Hidden Battle Between Frictionless Coding and Intentional Constraints
Hatched by Gleb Sokolov
Apr 25, 2026
9 min read
6 views
68%
What if the smartest productivity move is not more automation, but more restraint?
Most people think speed is the point of better developer tools. If a tab completion model can guess your next line, why would you ever slow down? Yet there is a deeper question hiding underneath that convenience: when does assistance become noise, and when does restriction become design? The answer matters more than it first appears, because the same instinct that leads us to want instant autocomplete also leads us to want to ignore heavy files, noisy folders, and everything else that makes a codebase harder to hold in mind.
That tension reveals something uncomfortable. We do not merely want tools that save time. We want tools that preserve attention. In practice, that means the most valuable development workflow is not the one that removes all friction, but the one that removes the right friction and leaves the rest in place. The trick is learning to tell the difference.
In coding, as in thinking, unlimited access is rarely the goal. Selective ignorance often is.
The seduction of instant answers
Autocomplete feels magical because it compresses a local search problem into a near-instant suggestion. Instead of scanning syntax, recalling naming conventions, and manually finishing a repetitive pattern, the model offers a plausible next move. A well-tuned tab completion system does more than save keystrokes. It changes the rhythm of work. It lowers the activation energy required to begin, which is often the real bottleneck.
That is why autocomplete can feel so transformative in the same way a well-designed power tool transforms woodworking. The point is not that the user becomes less capable. The point is that the user can stay in motion while preserving intent. The best completions are not just correct, they are contextually aware enough to feel like an extension of your own mental model.
But there is a hidden cost to that ease. The more a system tries to guess everything, the more it risks turning every surface into an invitation for distraction. If the model eagerly completes every pattern, the developer must constantly evaluate whether to accept, reject, or mentally ignore the suggestion. That creates a subtle tax on attention. In other words, the real question is not, Can the tool predict my next move? It is, Can it predict the moves that matter without crowding out the rest?
This is where the idea of constraints enters. A good autocomplete model is not just generous. It is disciplined. It should know when not to speak.
The most helpful tool is not the one that answers everything, but the one that knows what not to interrupt.
The case for excluding by size, not just by name
At first glance, ignoring files by size sounds like a crude workaround, almost a hack. Traditional ignore rules are lexical and explicit. You exclude a directory because you know what it is. You exclude a file pattern because you know its role. But size introduces a different criterion entirely: behavioral significance.
A huge file is not merely large. It is often structurally different. It may be generated, binary, derived, vendor supplied, cache like, or simply too expensive to move through the normal channels of inspection and version control. File size becomes a proxy for a deeper truth: some artifacts are not meant to participate in the same workflow as source code. They belong to a different layer of the system.
That idea is more radical than it seems. Most organization systems rely on identity, not cost. We label things by what they are. A size based rule says, instead, that classification can be based on how much cognitive or operational burden something imposes. This is a more adaptive way to manage complexity because it focuses on impact rather than appearance.
Think of a kitchen. You do not store a giant stockpot on the same rack as everyday plates simply because it is technically dishware. You store it separately because it changes the geometry of the space. It is too large to behave like the rest. In the same way, a giant artifact in a repository changes the geometry of version control. It slows operations, clutters history, and often becomes a source of accidental pain.
A size based ignore strategy is therefore not really about files. It is about making the system optimizable around the rare, expensive outliers that otherwise dominate everyone’s experience.
One principle connects them: remove the wrong kind of attention
Autocomplete and size based ignore rules seem unrelated, but they are actually two versions of the same design problem: how do you keep a developer's attention focused on the meaningful layer of the task?
Autocomplete removes micro decisions. Size based exclusion removes macro clutter. One trims local effort, the other trims ambient drag. Together they point to a broader framework:
Good developer tools should reduce attention spent on coordination, not on judgment.
That distinction is crucial. Coordination is the overhead of moving through a system: typing boilerplate, avoiding irrelevant files, waiting on huge diffs, manually filtering the obvious. Judgment is the human activity that should remain central: deciding architecture, evaluating correctness, understanding tradeoffs, naming abstractions, and spotting when a suggestion is elegantly wrong.
When tools are well designed, they shift effort away from coordination and toward judgment. When they are poorly designed, they do the opposite. They make the user spend more time managing the tool's behavior than solving the underlying problem.
This explains why both overbroad autocomplete and overinclusive repositories feel similar. In both cases, the environment becomes noisy. The user is forced into a perpetual act of triage. Every suggestion, every file, every artifact asks for attention. The result is not productivity but fragmentation.
A healthy workflow, by contrast, has what might be called attention hygiene. It protects scarce mental bandwidth from low value demand.
A developer does not need more information. A developer needs a cleaner gradient between signal and noise.
A practical mental model: the three layers of developer friction
To make this more usable, it helps to separate friction into three layers.
1. Productive friction
This is the resistance that protects quality. It forces deliberate thought, review, and verification. Examples include code review, type checking, and design constraints. Productive friction slows you down just enough to prevent costly mistakes.
2. Wasteful friction
This is the overhead that adds no insight. It includes repetitive typing, navigating irrelevant files, reprocessing generated artifacts, and manually maintaining exclusions that could be automated.
3. Ambiguous friction
This is the hardest category. It is the resistance that is sometimes useful and sometimes harmful. Autocomplete lives here. It can accelerate flow when it understands your intent, but it can also distract when it floods the interface with plausible nonsense. File exclusion rules can also live here if they are too coarse or too narrow.
The important move is not to eliminate all friction. It is to classify it correctly. Once you can tell which kind you are facing, you can make better decisions about where automation belongs.
For example, suppose a repository contains a massive generated JSON file. Keeping it tracked may seem harmless until you realize that it bloats diffs, slows clone times, and obscures the actual changes that matter. The waste is not the file itself. The waste is the fact that the file is forcing every workflow step to carry its weight.
Now imagine the opposite problem. A completion model keeps trying to finish your function in a way that is syntactically valid but semantically wrong. That is ambiguous friction. The tool is trying to help, but the help is contaminating your focus. In that situation, the best design is not necessarily more intelligence. It is better boundary setting.
The shared lesson is simple: automation without boundaries creates more work than it removes.
What intentional constraints reveal about good engineering
There is a deeper philosophical point here. Systems become robust not when they maximize inclusion, but when they define the right perimeter. Every good engineering decision is partly a decision about scope.
A codebase that ignores files by size is declaring that not everything belongs in version control. An autocomplete system that is tuned to a specific model is declaring that not every suggestion source is equally trustworthy. Both are acts of governance. They encode a theory of relevance.
This matters because many teams treat workflow problems as purely technical. They are not. They are epistemic. They ask: what deserves the team's attention, and what should be rendered invisible?
That question is especially important in large systems, where the biggest threat is often not failure but overload. Teams rarely collapse because they lack ideas. They collapse because the system presents too many things as equally important. Intentional constraints help restore hierarchy.
Consider a library. If every book were left on the floor, the problem would not be scarcity, it would be indistinguishability. Shelving is a form of compression. It does not remove books. It makes them navigable. In the same way, good tooling does not reduce the richness of a codebase. It reduces the cost of navigating it.
This is why size based ignoring is so revealing. It shows that some repository artifacts are not just large. They are anti navigational. They distort the map. By excluding them, you restore the codebase to a shape that humans can think with.
Key Takeaways
- Optimize for attention, not just speed. The best tools save keystrokes only if they also preserve mental clarity.
- Treat large artifacts as a separate class of problem. If a file changes the cost of every operation, it should be governed differently from normal source code.
- Use automation to remove coordination, not judgment. Let tools handle the repetitive and obvious, but keep humans focused on meaning and tradeoffs.
- Classify friction before trying to eliminate it. Some resistance protects quality, some is pure overhead, and some is context dependent.
- Design boundaries deliberately. Whether in autocomplete or repository management, good systems know what to include, what to exclude, and what to leave alone.
The real lesson: visibility is not the same as value
We often assume that if something exists in the system, it should be visible to the system. That assumption is false. Some things are important precisely because they are excluded from the main flow. Generated files, caches, binaries, and other oversized artifacts may be necessary, but they are not always useful to treat as first class objects in daily work. Likewise, not every plausible code completion deserves equal weight in the developer's mental workspace.
This is the surprising connection between predictive coding and file exclusion: both are questions about where to place the boundary of cognition. Should the tool try to see everything, or should it selectively blind itself in order to become more useful? The answer, more often than not, is selective blindness.
That does not mean ignorance is a virtue. It means relevance is a discipline. The highest function of a good development workflow is not to expose all data, suggestions, and artifacts equally. It is to shape the environment so that the right things become easier to notice and the wrong things quietly recede.
Once you see that, productivity stops looking like a race toward maximum assistance. It starts looking like an editorial practice. You are not trying to let the machine do everything. You are deciding what the machine should be allowed to make visible.
And that may be the most powerful shift of all: the best tools do not merely accelerate work. They help you protect the conditions under which thinking remains possible.
Sources
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 🐣