Programming vs. Coding vs. Software Engineering

3 min read Original article ↗

Programming, coding, and software engineering are often used interchangeably. Here is how I usually think of them.

Programming is solving explicit problems in a verifiable manner.

It is similar to mathematical proofs. "Find an element in a sorted sequence" is a problem. A binary search algorithm is a solution. You can prove it works, and even analyze whether it's optimal in terms of time or memory.

A better word for programming might be computing—a branch of mathematics. At this level, code isn't the focus; algorithms are. Only essential complexity matters. Accidental complexity doesn't exist here.

The goal of programming is to create an algorithm—or prove that one cannot exist.

Coding

Coding is expressing a programming solution in a formal language.

It’s like writing or speaking. Binary search can be coded imperatively in C or JavaScript, or declaratively in Haskell. The implementation details differ, but the algorithm remains the same.

Coding is both easier and harder than programming. Easier, because it assumes the problem is already solved. Harder, because translating an abstract solution into a real system often introduces vague, hard-to-verify constraints (e.g., "make it work on every device").

In a perfect world, coding would be strictly simpler than programming. In reality, it introduces a lot of accidental complexity.

The goal of coding is to produce working code.

Software engineering

Software engineering is building a product for the real world.

Think of “product” not just in commercial terms. A product is anything that solves a real-world problem and can be used by someone other than its creator.

It’s similar to civil engineering. Software engineering includes programming and coding, but also:

  • communication
  • management
  • compliance
  • durability
  • scalability

Depending on the context—cultural, historical, or organizational—software engineering may encompass even more responsibilities. It’s where most accidental complexity shows up.

The goal of software engineering is to solve real-world problems.

Bang, Marry, Kill

For many softwave developers, this is true:

  1. Love programming.
  2. Enjoy coding.
  3. Tolerate software engineering.

Since real-world tech jobs blend all three, many of us return even after burnout. We love programming. Burnout tends to come from engineering, sometimes coding, but rarely from pure programming.

We dream of a world where we craft elegant algorithms in a clean, mathematical space—then implement them in a perfect language, running in a well-designed system. Instead, we deal with inconsistent formats, ambiguous requirements, needless complexity, infrastructure, deployment, deliveries, backups, relationships, communication, politics, finance, etc.

Why differentiate

These distinctions aren’t always useful in daily life—we often lump everything together as “programming.” But in moments of reflection, they help. When I feel energized, I want to understand what drives me. When I feel drained, I want to identify the cause.

They’re also helpful when asking: Which of the three do I enjoy most? There are no wrong answers. Programming isn’t sacred. Engineering isn’t dirty. Coding isn’t trivial.