May 15, 2026
14 min read
Stefan Knoch

Why Good Software Engineering Is Expensive

Software EngineeringAITechnical LeadershipUXStartupsProduct DevelopmentVibe CodingTechnical DebtEngineering Culture
AI can generate code, but it cannot replace engineering judgment. Good software is expensive because bad software becomes even more expensive later — through bugs, rewrites, frustrated users, and technical debt.
Why Good Software Engineering Is Expensive

Why Good Software Engineering Is Expensive

There’s a strange belief spreading through the tech industry right now:

“AI can already build apps, so software engineering should be cheap now.”

I understand where this idea comes from.

AI can generate code incredibly fast. It can create prototypes, write components, suggest architectures, fix bugs, and help experienced developers move much faster than before.

But there is a massive difference between generating code and engineering software.

And that difference is exactly why so much modern software feels broken, frustrating, unreliable, and exhausting to use.


The Problem With Modern Software

A lot of software today feels half-finished.

Apps crash. Buttons stop working. Interfaces freeze. File uploads fail. Notifications appear twice. Forms behave inconsistently. Features feel disconnected from each other. Workflows become confusing. Updates break things that worked yesterday.

Even many products from large, well-funded companies feel worse than they used to.

The strange thing is that many of these products are built by technically smart people.

But somewhere along the way, parts of the software industry became obsessed with the wrong things:

  • abstract technical cleverness

  • trendy architectures

  • over-engineering

  • algorithm puzzles in interviews

  • endless process

  • shipping fast at all costs

  • creating impressive demos instead of reliable products

Meanwhile, the actual user experience gets neglected.

The user does not care how clever the internal implementation is if the product feels slow, confusing, unstable, or stressful.

Users care whether the software helps them do what they came to do.

They care whether:

  • the app is stable

  • the interface feels intuitive

  • workflows make sense

  • actions behave predictably

  • the software feels reliable

  • the experience feels calm instead of frustrating

Good software should reduce friction.

Bad software creates it.


Software Should Feel Calm

I care deeply about creating software that feels stable, intuitive, and effortless to use.

That may sound simple, but it is one of the hardest parts of building good software.

Great software reduces cognitive load.

Users stop thinking about the interface and can focus on their actual goal.

They do not have to wonder:

  • “Did the button work?”

  • “Why did this page reload?”

  • “Where did my data go?”

  • “Why is this so slow?”

  • “Can I trust this system?”

  • “Will this break if I click it?”

Most users cannot explain software quality in technical terms.

But they feel it immediately.

They feel whether a product is polished or fragile.

They feel whether the flow makes sense.

They feel whether the team behind it cared.

Stability, clarity, and reliability are not just technical qualities.

They are UX features.

A product that is technically impressive but frustrating to use is still a failure.


Coding Is Not the Hard Part Anymore

AI has changed software development permanently.

Today, almost anyone can generate code snippets, build a landing page, clone a SaaS interface, or create a basic prototype with AI tools.

That does not make them a software engineer.

AI is a tool.

A powerful tool, yes — but still a tool.

Just like frameworks, libraries, IDEs, cloud platforms, and deployment pipelines made developers more productive, AI makes developers more productive too.

But it does not magically replace the judgment, experience, and responsibility of a real engineer.

Non-developers cannot suddenly become professional software engineers just because AI writes code for them.

Maybe that changes one day.

At this moment, we are still far away from that.

Because writing syntax was never the hardest part of software engineering.

The hard part is:

  • understanding the business

  • understanding the user

  • choosing the right architecture

  • making trade-offs

  • keeping the system maintainable

  • avoiding technical debt

  • designing workflows that make sense

  • building stable foundations

  • making the product evolve without collapsing

AI can generate code.

But AI does not automatically understand:

  • your long-term product vision

  • your business model

  • your users’ frustrations

  • your future scaling problems

  • your security risks

  • your maintenance costs

  • your team’s ability to work with the code later

AI amplifies both good and bad engineering.

A weak process with AI creates bigger chaos faster.

A strong engineer with AI becomes dramatically more productive.


The Last 20% Is Where Software Gets Expensive

One of the biggest illusions in AI-assisted development is how fast the first 80% looks.

You can generate a UI in minutes.

You can create a working demo in hours.

You can get something that looks almost finished very quickly.

But “almost finished” is not finished.

The last 20% is where real software engineering begins.

That is where you deal with:

  • edge cases

  • permissions

  • loading states

  • empty states

  • error handling

  • mobile responsiveness

  • performance issues

  • broken user flows

  • data consistency

  • security concerns

  • deployment problems

  • accessibility

  • real-world usage patterns

This is also where many AI-generated projects start falling apart.

You might get 80% in one hour, then spend a week trying to fix the remaining 20%.

And often, fixing uncontrolled AI-generated code is harder than building it properly from the beginning.

That is why I do not use AI blindly.

I use AI inside controlled workflows, coding standards, review processes, and architectural rules.

The goal is not to generate as much code as possible.

The goal is to build high-quality software faster without sacrificing long-term maintainability.


Building Software Is Like Building a High-Rise

Non-technical founders often underestimate how much invisible engineering exists underneath software.

A prototype can look finished while the foundation underneath is already unstable.

Building software is much closer to constructing a high-rise than most people realize.

If you throw materials together without proper structural planning, the building may look like progress for a while.

But eventually:

  • future floors become difficult to add

  • cracks start appearing

  • maintenance becomes expensive

  • safety becomes questionable

  • small changes require major reconstruction

  • the structure becomes harder and harder to trust

Software works the same way.

The difference is that software problems are often invisible in the beginning.

Cheap software often looks fine during the first demo.

The real problems appear later.

Bugs multiply.

New features become harder to add.

Developers become afraid to touch certain parts of the codebase.

Performance gets worse.

Security risks appear.

Every small request starts taking longer than expected.

Eventually someone says:

“We may need to rewrite everything.”

That rewrite is usually far more expensive than building things properly from the beginning.


A Common Failure Pattern

I have seen versions of this pattern many times.

A company wants to build an entire app quickly and cheaply.

After three months, there is something that looks like an app.

There are screens. There are features. There is a demo.

But almost nothing works well.

The UI is unreliable.

The performance is poor.

Bugs appear everywhere.

Security is questionable.

The code is difficult to understand.

The architecture cannot support the next phase.

Then the company spends several more months trying to hire a better developer.

After interviews, screening, and onboarding, the new developer finally looks into the codebase and gives the painful answer:

“There is not much to save here. This needs a rewrite.”

That is the moment cheap software becomes expensive.

Because now the company has lost:

  • the original development budget

  • several months of time

  • user trust

  • team momentum

  • hiring time

  • opportunity cost

  • confidence in the product

And even if they try to continue with the existing system, every small feature now takes significantly longer than it should.

The bugs do not magically disappear.

The performance problems remain.

The security risks stay hidden until they become serious.

The system becomes harder to extend every month.

This is why good engineering matters.

Not because engineers enjoy making things complicated.

But because bad foundations create long-term business damage.


The Real Cost of Cheap Development

Cheap software is rarely actually cheap.

It often means saving money at the beginning and paying much more later through:

  • rewrites

  • missed deadlines

  • unstable releases

  • frustrated users

  • lost customers

  • security problems

  • performance issues

  • developer turnover

  • slow feature development

  • damaged product reputation

The most expensive software is not always the software with the highest initial quote.

Often, the most expensive software is the software that has to be built twice.


How I Typically Build Projects

A good software project does not start with every tiny detail fully specified.

It starts with a clear vision.

The vision matters more than nitty-gritty details at the beginning because the smaller details often become clear through the process of building.

From there, I usually prefer to work in phases and major feature cycles instead of trying to define the entire application perfectly upfront.

A healthy project flow looks more like this:

  1. Understand the business vision

  2. Define the main product goals

  3. Break the product into major features or phases

  4. Discuss requirements and ideas for each feature

  5. Make technical and product decisions together

  6. Build a first version

  7. Review it with stakeholders

  8. Improve through iteration

  9. Test and stabilize

  10. Move to the next feature or phase

This is not a one-way process where the client disappears, writes requirements in isolation, and then waits for magic.

It is also not a process where the developer disappears for weeks and returns with something nobody expected.

Good software requires two-way collaboration.

The client brings business knowledge, user knowledge, and product vision.

I bring technical judgment, architecture, UX thinking, implementation experience, and the ability to challenge ideas when they do not make technical or product sense.

If a designer is involved, the same principle applies.

Design and development cannot happen as isolated worlds.

To use the building analogy again:

If we want a window in the building, the architect, builder, and designer need to make sure the structure actually supports that window.

Software is no different.

Design decisions affect implementation.

Technical constraints affect UX.

Business goals affect architecture.

Architecture affects what becomes easy or hard later.

That is why collaboration matters.


Iteration Is Not Failure

When I build a first version of a feature, it should not always be treated as the final version.

It is often the first meaningful step in the iteration process.

Stakeholders can look at it, test it, react to it, and provide feedback.

That feedback is valuable.

It helps shape the next version.

This does not mean stakeholders need to review every tiny change. Some clients prefer to be more hands-off. Others want to see regular progress and be involved more closely.

Both can work.

But the mindset should be clear:

A first version is not always “wrong” because it needs refinement.

It is part of the process.

Designers work this way all the time.

They create a first version, review it, adjust it, polish it, and improve it.

Software development works the same way when it is done well.

The difference is that in software, every detail also needs to function correctly underneath.

That takes time.


Pressure Does Not Create Quality

Many companies believe that more pressure creates better output.

Tighter deadlines.

More meetings.

More status updates.

More micromanagement.

More planning.

More urgency.

In reality, pressure often creates worse software.

It leads to:

  • rushed decisions

  • fragile code

  • missed edge cases

  • burned-out developers

  • shallow testing

  • more bugs

  • worse UX

  • technical debt

This does not mean projects should be slow or unstructured.

It means quality work needs focus.

Good software requires sustainable execution, clear priorities, and enough space to think through difficult decisions properly.

Speed matters.

But speed without judgment creates chaos.


What I Actually Sell

I am not selling “hours of coding.”

I am selling:

  • thoughtful architecture

  • maintainable systems

  • stable deployments

  • scalable foundations

  • clean developer workflows

  • technical leadership

  • product thinking

  • UX judgment

  • reduced business risk

  • long-term maintainability

  • and most importantly: happy user experiences

Happy users come from software that works reliably, feels intuitive, and does not constantly create frustration.

That requires care.

It requires engineering discipline.

It requires product thinking.

And it requires respect for the people who will actually use the software.


My Approach to AI-Assisted Development

I use AI heavily in my own work.

But I use it as an engineering tool, not as a replacement for engineering.

Over time, I have built my own workflows, coding standards, architectural guidelines, and review processes around AI tools so the final output still feels like software I would have written myself.

AI helps me:

  • prototype faster

  • explore ideas quickly

  • automate repetitive work

  • accelerate implementation

  • compare possible approaches

  • improve development speed

But I still control the direction.

I review the code.

I shape the architecture.

I decide what belongs in the system and what does not.

I make sure the result remains maintainable.

The biggest mistake with AI-assisted development is letting the AI drive the project.

That often creates code that looks impressive at first, but becomes harder and harder to fix later.

It is much better to guide AI from the beginning with clear standards, architecture, and workflows than to clean up uncontrolled output afterwards.


Why Algorithm Interviews Miss the Point

One of the strangest habits in the software industry is evaluating developers through abstract algorithm puzzles.

Things like:

  • reversing linked lists

  • memorizing sorting algorithms

  • solving academic brainteasers

There is a place for deep computer science knowledge.

But most real-world product development is not about implementing sorting algorithms from scratch.

Modern software usually depends on shared libraries, frameworks, databases, and battle-tested infrastructure.

The hard part is not proving that you can solve an isolated puzzle under interview pressure.

The hard part is building a real product that people can actually use.

Real software engineering is about:

  • understanding user needs

  • solving business problems

  • designing good workflows

  • creating stable architecture

  • managing complexity

  • making trade-offs

  • communicating clearly

  • improving maintainability

  • reducing bugs

  • shipping useful product experiences

A team can be full of clever people and still build frustrating software.

Cleverness is not enough.

The product has to work.

The user has to feel understood.

The system has to survive real-world use.


The Clients I Work Best With

I work best with founders and companies who:

  • care about quality

  • think long-term

  • value user experience

  • want thoughtful technical leadership

  • understand that software is infrastructure for their business

  • prefer stable systems over rushed chaos

  • want a technical partner, not just a code producer

I am probably not the right fit for:

  • “cheapest possible” projects

  • unrealistic timelines

  • clients who want to micromanage implementation details

  • projects where quality and maintainability do not matter

  • teams that treat software as disposable

And that is okay.

Not every project should be built the same way.

If someone only wants the cheapest possible implementation, there are many places to find that.

But if the goal is to build something stable, thoughtful, maintainable, and pleasant to use, then the process has to respect that goal.


Final Thoughts

Good software engineering is expensive because bad software engineering becomes even more expensive later.

The goal is not to write the most clever code.

The goal is to build software that:

  • supports the business

  • survives growth

  • remains maintainable

  • feels reliable

  • creates happy users

  • and can evolve without collapsing under its own weight

AI is changing software development dramatically.

But it has not removed the need for experienced engineers.

If anything, it has made engineering judgment even more important.

Because now bad software can be generated faster than ever.

The best software rarely feels impressive because of one flashy feature.

It feels impressive because it works.

It feels stable.

It feels intuitive.

It feels calm.

It helps users do what they came to do.

And achieving that consistently is still difficult engineering work.