DEV Community

钟智强
钟智强

Posted on

Why Programming Lives on a Spectrum and Why Both Sides Matter in the Age of AI

Software today looks deceptively simple. AI spits out entire codebases in minutes. YouTube tutorials show beginners how to “build a clone” of any famous app with 20 minutes of copy-pasting. Frameworks, libraries, and APIs abstract away almost everything under the hood.

It’s easy to walk away from that and think: this is all easy.

But that misses something fundamental: programming has always existed on a spectrum. At one end sits craft, where code is hand-tuned, unforgiving, and intimately tied to hardware and long-term stability. At the other end sits result coding, where the primary goal is getting something working quickly—shipping features, prototyping, or automating.

Both ends matter. Both ends feed each other. But confusing them—treating all code as the same, or claiming that writing glue scripts makes you a systems engineer—creates problems, especially when it comes to reliability and security.


Mapping the Spectrum

Here’s the spectrum I use to explain it:

10                   0                   10
|---------------------------------------|
Craft                                   Result
Enter fullscreen mode Exit fullscreen mode
  • Craft side (left, score ~10)
    Languages and environments that demand rigor: C, C++, Assembly, Erlang, COBOL, Fortran, sometimes even strict enterprise Java. Here, the focus is correctness, determinism, memory efficiency, and long-term maintainability. This is where we build operating systems, compilers, firmware, cryptographic algorithms, and mission-critical software. Bugs here aren’t just “annoying”—they can cost millions, endanger lives, or permanently brick hardware.

  • Result side (right, score ~10)
    High-level, fast-moving ecosystems: Python, JavaScript, TypeScript, modern frontend frameworks like React or Vue, serverless functions. The emphasis is speed and output. If it works today, ship it. If it breaks, patch later. This side powers MVPs, automation scripts, web apps, and hackathon prototypes. It makes software accessible to millions of people who would never write assembly in their lives.

Most developers begin on the Result side. That’s a feature, not a bug. Accessibility fuels innovation. But mastery requires eventually walking across the line and grappling with the Craft side—even if only once—so you understand how the machine actually works.


Embedded Engineering: A Case Study in Craft

One of the clearest examples of craft-side programming is embedded engineering.

Unlike cloud services with unlimited memory and elastic compute, embedded systems are brutally constrained:

  • RAM measured in kilobytes, not gigabytes.
  • Processors clocked in megahertz, not gigahertz.
  • Energy budgets tied to tiny batteries.
  • Real-time deadlines where missing a microsecond can break the system.

This is why C still dominates embedded development after decades. It offers:

  • Direct hardware access: Developers manipulate registers and memory addresses directly.
  • Tight control of resources: Every byte matters.
  • Predictable performance: No garbage collector surprises.

Example: programming a microcontroller to read a sensor. In Python, you’d import a library and call a function. In embedded C, you’re flipping bits in a memory-mapped register to enable the ADC, setting the sampling rate, and ensuring interrupts fire at the exact time.

It’s not glamorous. But if you get it wrong, your drone doesn’t stabilize, or your pacemaker misses a heartbeat.

That’s the difference: in embedded craft, “works on my machine” is not acceptable. It must work deterministically, every time, on the actual hardware.


ABI: The Hidden Contract That Separates Beginners from Engineers

One concept that really illustrates the craft side is the Application Binary Interface (ABI).

Most devs know APIs (Application Programming Interfaces)—functions and classes you call in code. An ABI is lower level: it defines how compiled machine code interacts.

Key ABI rules cover:

  • Calling conventions: Are function arguments passed in registers or pushed onto the stack?
  • Register usage: Which registers must be preserved across calls?
  • Stack frame layout: Where locals and return addresses live.
  • Data representation: Endianness, struct padding, alignment.

Why does this matter? Because if you violate the ABI, your program still compiles, but it silently breaks at runtime.

Example:

  • Compiler A (ARM EABI) passes the first integer argument in register r0.
  • Compiler B (different convention) pushes it to the stack. Now imagine linking object files built with these two compilers. Your function calls will misinterpret arguments, corrupt memory, or crash unpredictably.

These are the ghosts that haunt embedded engineers. You won’t see them in JavaScript or Python. You only meet them when you drop into disassembly and debug at the machine level.

Understanding ABIs separates people who can really engineer systems from people who can only script them.


The Power and Peril of Result Coding

Now, let’s give the Result side its due.

Python, JavaScript, frontend frameworks—these are the engines of modern software culture. They:

  • Empower beginners to create quickly.
  • Accelerate prototyping and MVPs.
  • Fuel the explosion of startups and open-source projects.

This is what I call vibe coding: code with the energy of experimentation, tutorials, and “see if it runs.”

And that’s not an insult. Vibe coding has value. It lowers barriers. It democratizes software. It creates more opportunities than ever before. It’s fun, fast, and often enough for many real-world applications.

But vibe coding also has trade-offs:

  • Shortcuts: Security and stability are often skipped.
  • Technical debt: Quick hacks pile up.
  • Shallow understanding: Beginners may not learn how systems really work.

The mistake is not in vibe coding—it’s in mistaking vibe coding for full craft engineering.


Security: The Double-Edged Sword

Here’s the irony: Result coding is a gift to cybersecurity professionals.

Why? Because speed creates vulnerabilities. And vulnerabilities are doorways.

  • SQL injection because user input wasn’t sanitized.
  • Hard-coded secrets committed to GitHub.
  • Cloud buckets left wide open.
  • Debug APIs accidentally exposed.

In the Craft era, developers were stricter. They worried about buffer overflows, memory safety, and input validation. In today’s Result-first world, it’s common to see security as an afterthought.

For attackers, this is heaven. For penetration testers, it’s job security. Vibe coders, unintentionally, are the world’s greatest data miners for hackers. They open the doors that others walk through.


The Mindset Divide

Ultimately, the difference between Craft and Result is not just languages. It’s mentality.

  • Result mindset: “If it works, ship it.”
  • Craft mindset: “If I don’t know why it works, it’s not ready.”

Result engineers optimize for speed, usability, and market fit. Craft engineers optimize for correctness, stability, and long-term reliability. Both are valid. Both are needed. But they are not interchangeable.


AI’s Role on the Spectrum

AI tilts heavily toward the Result side. It’s excellent at:

  • Scaffolding code quickly.
  • Filling in boilerplate.
  • Suggesting bug fixes or style improvements.

But AI doesn’t reason about ABIs. It doesn’t guarantee determinism in real-time systems. It doesn’t ensure your embedded C will hit deadlines with zero jitter.

AI accelerates Result coding but cannot replace Craft engineering. If anything, it makes Craft engineers more valuable, because the more Result-side code floods the world, the more demand there is for people who understand the hard parts.


Crossing the Spectrum

So what does this mean for developers?

If you live in the Result world:

  • Keep coding, keep shipping, keep creating.
  • But don’t mistake getting something working for understanding the system.
  • Be mindful of security and long-term maintainability.

If you live in the Craft world:

  • Respect the speed and creativity of Result coding.
  • Use it when prototyping or building tooling.
  • But don’t compromise your standards when building mission-critical systems.

And if you want to grow as an engineer:

  • Cross the spectrum at least once.
  • Write C. Debug assembly. Study the ABI. Understand memory alignment and calling conventions.
  • Then return to Python, JavaScript, or Rust with deeper intuition.

Why It Matters

The divide isn’t about “better” or “worse.” It’s about matching the right mindset to the right problem.

  • Building a quick internal dashboard? Result coding is perfect.
  • Writing firmware for a satellite? Craft is non-negotiable.
  • Prototyping a machine-learning model? Result tools will get you far.
  • Implementing the cryptographic routines that secure that model? Craft all the way.

The mistake is when someone only touches Result-side tools and then claims to be an engineer of everything. Engineering requires understanding what’s under the hood.


The Future

As AI spreads, the Result side will only get easier. More people will code. More software will flood the world. And with that flood will come more vulnerabilities, more fragile systems, and more opportunities for those who understand the Craft side.

The most powerful developers of the future will not be those who can just prompt AI to generate React components. It will be those who can:

  • Dive into low-level layers when things break.
  • Guarantee correctness where determinism matters.
  • Design secure, efficient systems when millions of lives or billions of dollars depend on it.

AI will make Result coding cheap. Craft will remain rare and valuable.

Programming is not easy. It’s not one-size-fits-all. It’s a spectrum—Craft to Result.

Vibe coders keep the world moving fast. Craft engineers keep it standing when it matters. Neither side exists without the other.

But if you want to call yourself an engineer, you owe it to yourself to walk the Craft path at least once. To understand what’s really happening beneath the layers of abstraction. To learn why ABIs matter, why embedded systems demand rigor, why stability isn’t optional.

Because one day, your code won’t just be drawing a button. It will be controlling a machine, protecting sensitive data, or holding the line against attackers.

And when that day comes, you’ll be glad you learned the craft.

Top comments (0)