Indecision Does Not Preserve Options

Product bloat is often blamed on too many ideas or not enough resources to get speed. More often, it comes from too few decisions catching up with you.

A team delays deciding if a feature is required, who it is for, is the value it brings worth it to the overall product and company stage. The team hopes that time is saved by moving on to the next feature or issue will speed them up or “fix it”. The unanswered question feels like a temporary issue that doesn’t deserve time because there is not enough time for it. The work can continue. But nobody has removed the question. They have simply created compounding overhead.

So, “for now”, the feature will; to serve anyone.

It gains settings for one interpretation, exceptions for another, and workarounds for the cases nobody wanted to rule out. What began as an effort to stay flexible becomes a product that asks its users to carry the uncertainty the team did not resolve. The cost is not limited to one vague feature.

Imagine five possible directions: A, B, C, D, and E. None has been decided. It can feel as if the team has preserved five options. In reality, it has created five active futures.

Each future produces its own downstream work. Each has dependencies, edge cases, and failures. If something breaks deep inside E, the question is not only whether to fix it. The team also has to decide whether E is still important, whether it will matter later, and whether that work should take priority over something developing in A or D.

The original decision has been deferred, but the decisions it created have multiplied. This is why indecision becomes so expensive. It divides attention before it divides the product.

A person can be actively working on a branch that should never have existed. A customer can arrive with a real need for D, but the team may not notice it clearly enough because everyone is already carrying the mental load of A, B, C, D, and E. Attention is scattered across possibilities. Problems demand responses. Opportunities arrive without enough clarity to be recognized.

Eventually, the cost becomes visible in the product itself.

The interface gets crowded. Navigation expands. Settings multiply. A straightforward path becomes a collection of tabs, filters, alerts, roles, exceptions, and competing actions. Each piece may have a history. Each may have made sense at the moment it was added. Together, they create a product that feels fat, difficult, and strangely hard to simplify.

By then, teams often describe the problem as technical debt, feature creep, or complexity. Those descriptions are true, but they are incomplete. The product is carrying the consequences of decisions that were never made. This is also why rebuilding can be so valuable.

Starting over is usually treated as a dangerous impulse. There are real things to lose: working behavior, unusual customer needs, knowledge embedded in old systems. The fear is understandable. The first version contains too much history to dismiss casually.

But rebuilding is not about pretending that history did not happen. It is about forcing history to justify itself.

When a product is rebuilt, every feature has to earn its place again. Every workflow has to explain why it exists. The old assumptions no longer receive automatic authority simply because they have been in the product for a long time.

Some things should carry forward. Many will.

But some complexity only survives because nobody has paused long enough to ask what it was protecting. The things that melt away during a rebuild are often the most revealing. They are not necessarily mistakes. They are artifacts of uncertainty that became permanent by accident.

The first version teaches the team what it did not know. The next version has the chance to decide.

This does not mean every unanswered question needs an immediate answer. Uncertainty is real, and sometimes waiting is the right decision. But waiting should be a decision too. It should have an owner, a reason, and a point at which the team comes back to resolve it.

Otherwise, the product will resolve it for you. And it will do so by getting bigger, slowler, and unruley.

Knowing the rules free you from them

Mastery begins when you understand why the rules exist, and when they no longer apply.

There is a moment in learning almost anything when the rules that helped you become competent start getting in your way.

But fighting doesn’t happen inside a doctrine. It happens between two human beings, in circumstances that cannot be entirely anticipated.

In this interview, Bruce Lee discusses how martial arts develop styles, doctrines, and prescribed ways of fighting. Eventually, the doctrine becomes more important than the purpose it was created to serve.

Lee’s philosophy was to move beyond rigid styles and respond naturally to the situation in front of you.

That idea extends far beyond martial arts.

When knowledge becomes a constraint

When we’re inexperienced, rules are incredibly useful. They compress someone else’s experience into something we can follow. A designer learns composition. A musician learns scales. A programmer learns patterns. A manager learns frameworks.

This is how expertise begins.

But there’s a subtle failure mode. We can become so good at following the rules that we forget why they existed in the first place.

A technique is supposed to solve a problem. Eventually, we start treating the technique itself as the solution.

This is particularly obvious in art.

Picasso was an accomplished traditional painter before helping pioneer Cubism. Jackson Pollock studied traditional drawing and painting before developing his famous drip technique. Their departures from convention were informed by an understanding of the conventions themselves.

The distinction matters. Breaking a rule because you don’t understand it is quite different from breaking it because you understand its limitations.

Great artists aren’t necessarily rejecting what they’ve learned. They’re exercising the freedom that comes from having learned it deeply.

The difference between someone who can reproduce a technique and someone who has mastered a craft is often the judgment to know when the technique no longer applies.

The problem with best practices

You see the opposite in workplaces all the time.

Someone learns a management technique, a product framework, a sales methodology, or an engineering practice. It worked somewhere, so they implement it exactly as they were taught.

Then reality gets involved.

The customer is different. The team has different capabilities. The constraints have changed. Yet instead of adapting the technique, we often blame the people for failing to execute it correctly.

We’ve confused adherence to a process with the purpose of the process.

Ed Catmull explores a similar problem in Creativity, Inc., describing how Pixar developed processes to support creativity while recognizing that no process could guarantee a successful film.

The process was there to help people exercise their judgment, not replace it.

That’s a distinction many organizations struggle to maintain. A successful practice becomes a best practice. Best practices become policies. Eventually, people are rewarded for following procedures rather than producing the outcomes those procedures were designed to achieve.

Ironically, the very practices that once helped an organization succeed can become obstacles to its progress.

The freedom of understanding

There’s a philosophical dimension to this as well.

Nietzsche challenged the tendency to inherit established values and conventions without examining their origins or legitimacy. His philosophy encouraged individuals to question received assumptions and develop their own understanding rather than simply accepting what tradition prescribed.

This doesn’t mean that established knowledge is worthless. Quite the opposite. We need accumulated knowledge to avoid rediscovering everything ourselves.

But inherited knowledge is a starting point for judgment, not a substitute for it.

And that may explain why genuine expertise is so difficult to teach.

You can teach someone the mechanics of a craft. You can provide frameworks, examples, and procedures. What is much harder to transfer is the understanding underneath them.

The part that recognizes when circumstances have changed enough that the established approach is no longer appropriate.

This is where experience becomes wisdom.

Experience gives us examples of what has worked. Wisdom gives us the ability to reason about why it worked, and whether it should work again.

Mastery is not obedience

Perhaps the greatest misconception about mastery is that it means knowing all the rules.

In reality, the rules are only approximations of the deeper principles we’re trying to understand. They’re useful because they simplify complex problems, but that simplification inevitably leaves something out.

The beginner needs the rules because they haven’t yet developed the judgment to operate without them. The expert understands that the rules were never the ultimate objective.

This is true whether you’re creating art, building a company, writing software, or practicing martial arts.

The goal of learning is not to become someone who follows every rule perfectly, nor someone who proudly ignores them.

It’s to develop enough understanding that you can respond to the problem itself, rather than merely following the instructions someone else developed for a different problem.

That’s the freedom that comes with mastery. And when you get their true purpose you can finally benefit from the teaching.

Convenience Is the Product

Look in your pantry.

A surprising amount of what we buy is something we could have made ourselves.

Cocktail sauce is a good example. The basic idea is remarkably simple: tomato-based sauce, horseradish, vinegar, seasoning. (Heinz) Worcestershire sauce is a much more elaborate fermented condiment, but even it is ultimately a collection of ingredients and processes that could theoretically be reproduced at home.

Brownie mix makes the point even more clearly. A typical boxed mix is largely sugar, flour, cocoa, and a handful of other ingredients. Betty Crocker’s current mixes make the composition almost comically obvious on the label. (Betty Crocker)

Yet we buy these things and we fill our pantries with them.

The interesting part is that we are not really buying the ingredients. We are buying the time someone else spent assembling, measuring, packaging, testing, preserving, distributing, and explaining them.

That is convenience. And convenience is a much more fundamental concept in business than we usually give it credit for.

A business exists, in most cases, because there is something someone needs to do that they would rather not spend their own time doing. Even if you are buying a skill you don’t have, you are actually buying the time to have to learn that skill yourself.

Sometimes the thing takes skill. Sometimes it takes equipment. Sometimes it takes capital. Sometimes it takes experience. Sometimes it is simply annoying. And sometimes it takes five minutes away from what you would rather do. So you pay.

It doesn’t matter if it is software, AI, consulting, manufacturing, or physical labor. The implementation changes, but the underlying transaction is consistent.

This may sound like a shameless plug but it is truly the basis for why I published this in a kids book called Erec Makes a Fire almost 10 years ago. The story is intentionally simple because the underlying idea is simple and it is better to ingrain it in a child than repeat it to all the adults. Erec needs to accomplish something, but accomplishing it requires time and effort. The people around him each have different capabilities, and things they spend time doing.

Someone has a problem they could solve it themselves. You make it take less time and they pay you.

This is one of the reasons I think we sometimes misunderstand innovation.

We tend to imagine a business as creating something that did not exist before. That is certainly one kind of business. In reality 99.9% of the time, it’s a derivative. And for good reason – but not this post’s point.

A business takes something that already exists and make it easier, faster, cheaper, closer, reliable and/or understandable.

More convenient.

The product may look like software, a bottle of sauce, a box of brownie mix, or a person showing up at your house with a toolbox. Underneath, the value proposition is the same.

I will spend my time on this so you can spend yours on something else.

And that is actually a beautiful feature of an economy. We do not each have to become good at everything. We don’t need to astound the world with something never seen before. We don’t need to “innovate” beyond what customers have or need.

We are all simply and constantly buying back pieces of our own time. And that has scaled in layers for thousands of years.

The strange thing is that we often forget this when we talk about technology. We ask what AI can create, what software can automate, or what a new company has invented.

A more useful question is often much simpler:

What does this allow someone to stop spending their time doing?

That is where most of the value lives. The product is not always the thing in the box. Sometimes the product is the five minutes you just got back.

When Determinism Is Better Than AI

AI’s superpower is creating deterministic products.

We have become fascinated with AI’s “human-like” level of non-determinism. “I’ll just let AI handle it” is quickly becoming a default answer to problems we haven’t fully thought through, because if AI will figure it out, why should I?

One can ask a chatbot almost anything and marvel at what comes back. Give it a problem and it can find a path you did not anticipate. That unpredictability is part of what makes AI amazingly intelligent, and in many situations it is exactly what makes it the revolution in technology we dreamed of for decades.

But in some cases, we are using a sledgehammer to tap in a nail, and it is costing us a chance to provide the right solutions.

When delivering software as a product, the majority of products are not trying to surprise their users to provide value. Creativity sounds universally desirable, but humans require a surprising amount of consistency to be productive. We don’t generally ask our employees, engineers, doctors, lawyers, or PhDs to be randomly creative. We give them a mission, constraints, and some expectation of what a good result looks like. We want coffee on Tuesday morning at 9 AM, even though all the data points otherwise. Random human + informed AI + creative decisions = unhappy people.

AI doesn’t escape our expectations simply because it is intelligent.

A system that generates a different answer every time it is asked and is told to respond in certain ways with generalized prompts can aspire to be remarkably capable, but it can also be remarkably difficult to control, test, explain, package, interpret, and trust.

I don’t say this philosophically. I say it after years of wrangling AI to do things I hoped would create uniquely powerful products that didn’t exist. Why are the products we see so bad at converting this powerful tech into a powerful value prop? “SaaS is dead” encapsulates that problem. Copying and pasting your work into ChatGPT is often better than using a packaged product that tries to leverage the same AI to complete expected tasks efficiently or effectively. Chat is a bit messy, but it leans into that via the chat experience. That messiness is at odds with a packaged product.

I hear it every week from some aspiring entrepreneur: “Give the AI all your data and let it discover and manage [insert problem here].” It is a magical proposition that is within reach now.

Often it can turn into amazing demos and show unbelievable potential. But getting from a controlled demo to a reliable set of actions and outputs, unmonitored and unaudited by a human, is exceptionally hard. Even big companies with big wallets struggle with the transition. Small amounts of drift compound. Mistakes require review. Sometimes understanding what the AI produced takes nearly as much human effort as doing the work yourself, even if the human would have done the work somewhat worse. And don’t get me started on the cost of answering questions with non-deterministic expectations.

Perhaps we solve this. I hope we do. But in building these systems, I came to appreciate another application of AI that I think we’re underestimating.

Allowing the average person to let AI run their business may be a few years away. Building a business or product with AI tooling is already extraordinarily powerful, and not merely because AI lets us build software faster. It lets us afford complexity we previously couldn’t.

Historically, software has been deliberately simplified.

If a problem had a thousand paths, we rarely implemented a thousand paths. Humans had to anticipate the main cases, write the rules, implement them, test the edge cases, and maintain everything afterward. Eventually the economics would win. We scoped down to three possibilities and ignored the rest so that the software would work well for those cases, slowly building up one case at a time as needed.

AI changes the economics of that equation.

We can now use non-deterministic development tools to explore an enormous possibility space, then turn what we learn into deterministic software. A function that would take an immense level of brainpower to create efficiently, effectively, and robustly was expensive to build, let alone maintain as features were added. Now AI not only helps discover the paths, but can create elegant, hardened functions that deterministically handle all the possibilities you give it. Changing that functionality is no harder.

That distinction is more powerful than it initially sounds.

The power is in the fact that humans don’t typically expect to give or get thousands of outcomes from certain problems. Time and time again, we imagine a waterfall of possibilities when reality only requires an eyedropper’s worth of water.

Because of this tendency to overestimate the useful possibility space, 100 possibilities handled deterministically can feel remarkably intelligent. And with static, scalable, deterministic code, you are paying an infinitely smaller cost to solve these problems. It really is the best of both worlds: scalable software, intelligent-seeming computations, and extraordinarily low complexity to build and manage.

We get much of the richness we associate with AI without requiring an AI to improvise every interaction.

This isn’t an argument against live AI. Some problems genuinely benefit from open-ended answers. Chat obviously does. Search, research, documentation, creative work, and assistance are natural places for a system that can respond to questions nobody anticipated when the product was built. I have five bots running all the time to manage my email, calendar, video creation, socials, and more. They need slapping around now and again and require a lot of guidance, but they are far cheaper than hired help and always running 24 hours a day.

The thing I think nine out of ten people miss when the silver-bullet dream of AI is presented is this: infinite possibility isn’t a requirement for every problem.

Often the customer knows what they are trying to accomplish. Most consumers don’t need an infinite number of possible answers for the mountain of information that surrounds them. They need a sufficiently large number of great ones that consistently provide value.

That is the subtle opportunity I missed when I first started building heavily with AI. I was fascinated by AI’s ability to make software non-deterministic. I now think its ability to make deterministic software vastly more expressive may be just as important.

AI has dramatically lowered the cost of deliberate complexity.

Instead of asking AI to decide what our product should do every time it runs, we can use AI to help us consider far more of what it could do while we build it. We can then deliberately decide which of those possibilities it should handle and save ourselves and the customer more money than they thought possible.

The intelligence moves from improvising the product to constructing it.

And sometimes that is exactly where you want it.

Think in Sprites When You Generate Images with GPT

Here is a useful trick if you are generating a lot of small graphics with GPT.

Not every image you need actually needs to be generated as a standalone image.

A small icon, avatar, button state, game asset, UI decoration, or other graphic may only occupy a tiny amount of your final product. But image generation systems often work at resolutions much larger than the thing you actually need. ChatGPT Images now supports different aspect ratios and resolutions, but you are still generating a relatively large image for a relatively small object. Larger image outputs generally consume more image tokens and can take longer to generate. (OpenAI Help Center)

So think like a game developer from the 1990s. Think in sprites.

A sprite sheet is simply one image containing many smaller graphics. Instead of loading 100 individual images, a game could load one image and tell the graphics system which rectangle of that image contained the sprite it wanted. The browser or game engine would then display only that portion.

The same idea works surprisingly well with AI image generation.

1. Generate a grid instead of individual images

Suppose you need 20 tiny cartoon avatars for an application.

You could ask GPT to generate 20 images. That means 20 generation jobs, 20 waits, and potentially 20 times the generation overhead.

Instead, ask it for a grid:

Create a 10×10 grid containing 100 unique cartoon avatars. Each avatar should occupy exactly one cell. Keep the visual style consistent, but make every character distinct. [what you want the images of – in the case below clubhouse dressed, 2d, comic style, animals]

You now have one generated image.

Then split the image into its cells yourself. This is trivial with an image editor, a tiny script, or even a second AI-assisted step in your agentic environment.

The important part is that the generated image is now the container, not the final asset.

You can do the same thing for icons, illustrations, characters, graphics, UI elements, or almost anything where each individual asset is smaller than the generation system’s useful output size.

Here is an example of one I iterated on for a hobby project at http://www.skillbase.club where we made the theme country club based on the domain we could get.

That’s 100 avatars for the same time and token cost as a single oversized image.

2. Use grids for drafts, too

This is arguably the more useful trick.

Maybe you don’t need 20 images. Maybe you are trying to decide which version of one image you actually want. Instead of generating four separate versions, ask GPT for a 2×2 grid:

Create four variations of the same clubhouse in a 2×2 grid. Keep the subject identical, but make each cell explore a different composition. [or name each composition like Lichtenstein-esque or paper cut out]

Now you can compare four directions in a single generation.

Once you pick the winner, generate that one properly.

This changes the economics of experimentation. You are using the expensive, slow part of image generation to explore a space of possibilities, rather than paying the full cost to explore each possibility independently.

And there is a broader lesson here.

We spent decades learning to optimize graphics by separating the asset from the container used to transport it. AI image generation makes it easy to forget that distinction.

If you need something small, generate a sheet. If you need alternatives, generate a grid. Then cut out what you actually need.