Bugs Exist In All Code Bases

June 19, 2026

 

Logo

Bugs Exist In All Code Bases

One of the most common misconceptions among new programmers is that experienced developers write bug-free code. Spend enough time programming, however, and you'll discover an important truth:

Bugs exist in all code bases.

It doesn't matter if the project is a weekend hobby, an indie game, a commercial application, or software used by millions of people. Given enough complexity, enough features, and enough time, bugs will find their way into the code.

Perfection Is an Impossible Target

Programming isn't simply writing instructions for a computer. It's about solving problems, and those problems often change over time. New features are added, old systems are updated, and user expectations evolve.

Every change introduces the possibility of unintended side effects.

A fix for one problem might expose another. An optimisation could create an edge case that nobody anticipated. A new feature might interact with older code in unexpected ways.

This isn't necessarily bad programming. It's simply the nature of software development.

Complexity Is the Real Enemy

A program might start out as a few hundred lines of code. Years later, it could have hundreds of thousands of lines spread across countless functions and modules.

The more moving parts a project has, the more interactions exist between those parts.

Even if each individual function works perfectly, combining them can produce behaviours that weren't expected.

The challenge isn't eliminating every possible bug. It's managing complexity so that bugs are easier to find and fix.

Every Programmer Writes Bugs

Beginners often think they're making mistakes because they aren't good enough.

Professionals know that mistakes are part of the job.

Experienced programmers don't magically avoid bugs. They simply develop better habits:

* Breaking problems into smaller pieces.
* Testing code frequently.
* Writing clear, readable functions.
* Using debugging tools effectively.
* Accepting that the first version probably won't be the final version.

The difference between a beginner and an experienced developer isn't the number of bugs they create.

It's how quickly they can track them down and fix them.

Finding Bugs Is Progress

It's easy to become frustrated when a bug appears after hours of coding.

In reality, discovering a bug is often a success.

You found something that wasn't working correctly before your users did. You learned something about your program. You made the code a little more robust than it was yesterday.

Every bug fixed improves the quality of the project.

Even Famous Software Has Bugs

* Operating systems have bugs.

* Games have bugs.

* Web browsers have bugs.

* Programming languages have bugs.

The tools we use every day receive updates and patches because developers continually discover issues and improve their software.

If some of the largest software projects in the world can't eliminate every bug, it's unrealistic to expect our own projects to be perfect.

The Goal Is Better Software

Good software development isn't about creating bug-free code.

It's about creating code that can be understood, maintained, tested, and improved over time.

A healthy code base isn't one without bugs.

It's one where bugs can be identified, fixed, and prevented from causing bigger problems in the future.

Final Thoughts

Bugs exist in all code bases.

That's not a sign that a project has failed or that a programmer lacks skill. It's a natural consequence of building increasingly complex systems to solve increasingly complex problems.

The next time you encounter a bug, remember that you're participating in a process shared by every programmer, from hobbyists writing their first game to engineers maintaining software used around the world.

The goal isn't perfection.

The goal is to make today's code a little better than yesterday's.


At Least We Got Rid of Line Numbers

February 07, 2026

 

At Least We Got Rid of Line Numbers

Modern programming is stressful.

We’ve got frameworks that change every five minutes, dependencies that break themselves for sport, and build systems that require more configuration than a NBN router in 2011.

Some days it feels like software development is just trying to keep a wobbly house of cards standing in a cyclone.

But at least we got rid of line numbers.


A Stress New Programmers Never Knew

There’s an anxiety older coders remember that modern developers will never experience.

Being asked to write real software in a language that required human-generated line numbers.

  • Not line numbers in an editor.
  • Not line numbers for debugging.
  • Actual:

    10 PRINT "HELLO"
    20 GOTO 10
    

    style line numbers.

    If you never had to live like that, congratulations! You skipped a very specific form of programmer misery.


    Coding With Extra Headaches

    Programming was already hard enough.

    You had to think about logic, bugs, memory limits, and whether the computer was going to throw a tantrum.

    And on top of that, you also had to manage imaginary addresses in your head.

    “Right… I’ll start this routine at 3000. That should be plenty of space.”

    It was never plenty of space.

    Add too much code and suddenly you were out of numbers, half your GOTOs were broken, and your “quick change” had just turned into an all-night renumbering party.

    Good times.


    Refactoring Was Basically a Weekend Plan

    Today, refactoring is normal. Back then it was an event!

  • Coffee was made.
  • Backups were taken.
  • Deep breaths were required.
  • Because moving code around wasn’t just tidying things up, it'ss like trying to renovate a house while it was still on fire.

    You didn’t casually improve programs.

    You stared at them and thought:

    “Is this feature really worth ruining my Saturday?”


    Progress… Sort Of

    Of course, modern development replaced those problems with new ones.

    Now we fight with containers, build pipelines, dependency hell, and error messages that look like they were generated by an angry robot having a bad day.

    In many ways we swapped small simple problems for giant complicated ones.

    But still…


    Small Victories Matter

    Whenever I’m knee-deep in some ridiculous modern tech disaster, I try to remember:

  • At least I can add a line of code without planning its numeric future.
  • At least I can move a function without breaking half the program.
  • At least my editor doesn’t force me to think like an accountant.
  • Programming is still stressful.
  • But thank whatever digital gods look after developers…

    At least we got rid of line numbers.

    Is BASIC Interpreted or Compiled? And Can It Compete With C?

    January 14, 2026

     

    Logo

    Is BASIC Interpreted or Compiled? And Can It Compete With C?

    This question comes up a lot, especially from programmers who cut their teeth on early home computers:

     *Is BASIC interpreted or compiled? And if it’s compiled, can it ever approach the performance of C or C++?*
    

    The short answer is: yes, it can—but the longer answer is far more interesting.


    From BASIC to Native Code

    When people talk about “compiled BASIC,” they often imagine a direct leap from BASIC source code to machine code. In practice, that’s rarely how modern systems work.

    It’s not uncommon—for BASIC or any language—to compile into an intermediate form first. Historically this might be bytecode, but today it could also be an abstract syntax tree or another IR (intermediate representation). From there, many systems transpile into C, LLVM IR, or another mature backend.

    Why does this matter?

    Because those backends are battle-tested. They encapsulate decades of optimization knowledge, and by targeting them, a BASIC compiler can automatically benefit from highly sophisticated optimization passes—without reinventing the wheel.


    Generating Native Code: Several Paths

    There are a few common approaches BASIC compilers have taken over the years:

  • Direct machine code generation
  • Possible, but generally not recommended unless you enjoy pain.

  • Assembly generation
  • A more common approach: translate bytecode into assembly, then feed it through an embedded assembler.

  • C or modern IR backends
  • Increasingly popular, and often the most pragmatic choice.

    The good news is that even a naive bytecode-to-assembly translator can produce code that runs quite well. At its simplest, this is often a near line-for-line mapping of bytecode instructions into native instructions.

    That kind of output tends to hit memory a lot—but even so, it already executes far faster than an interpreter.


    Where Performance Is Really Won (or Lost)

    Here’s where things get interesting.

    Most people think performance comes down to low-level micro-optimizations. Those matter—but they’re not where the biggest gains usually come from.

    The real performance cliff is often created much earlier, by language and runtime design decisions.

    Memory Access Matters

    A naive translation model tends to generate excessive memory loads and stores. Simply removing redundant memory accesses can result in large performance wins.

    Many BASIC compilers already perform instruction-level optimizations at the bytecode stage:

  • Removing redundant loads and stores
  • Eliminating dead code
  • Collapsing simple instruction sequences
  • Even modest cleanup here can produce surprisingly large gains.


    The Hidden Cost of “Convenience”

    One of the classic examples is string handling.

    In the BASIC world, string systems are often built from off-the-shelf components designed for flexibility and safety, not speed. They work—and they work well—but they can absolutely destroy performance if you’re not careful.

    This isn’t a BASIC-only problem. It’s a reminder that:

  • Performance isn’t just about the compiler.
  • It’s about how the language chooses to represent and manage data.

  • Can BASIC Match C or C++?

    The uncomfortable truth for some people is this:

    Yes—BASIC compilers can generate code that rivals (or even beats) the output of some C compilers.

    Remember:

  • Not all C compilers are equal
  • Not all C code is well-written
  • And not all optimizers are created equal
  • That said, most BASIC compilers don’t aim for absolute peak performance. Their goals are often different: approachability, safety, rapid development, or portability.

    But the idea that there’s some enormous, unbridgeable performance chasm between BASIC and C is largely a relic of the interpreter era.

    A lot has changed since then.


    Final Thoughts

    The real takeaway is this:

  • BASIC doesn’t have to be slow
  • Compilation strategies matter
  • Runtime design matters even more
  • Modern compilation techniques have blurred the old lines. Performance today is less about what language you use and more about how that language is implemented.

    And that’s a far more interesting conversation than “interpreted vs compiled” ever was.