Computer Fundamentals

Summary: Software Fundamentals

You might think that computer fundamentals would be the first things taught and often returned to in Computer Science. To the contrary, some of the most important things about software may be known to programmers if you ask them, but understood and practiced? Not so much.

What do you do with software -- aside from wasting huge amount of time? You automate!

In any field you can think of, there are clear, agreed-upon measures of success. In software? Not so much.

If you have trouble measuring success, how can you measure productivity?

If you have trouble measuring productivity, practices can become widely used that, if you step back from them, you can see obviously reduce productivity.

Programming is taught as though all programming is similar. Nothing could be further from the truth. Is arguing a criminal case in a courtroom the same as acting in a Shakespeare play? They both use English, right? Programming has distinctions that are just as sharp.

One of the most obvious but least examined fundamental is that software is data. The fact that there is a memory that contains a mix of instructions and data … and that the instructions are data … is fundamental, with many implications.

Diving into and understanding the possible relationships between data and instructions is bedrock core to being a real programmer.

Everyone knows about numbers and counting. But how many times do people stand back from their work and apply some appropriate numbers to them? Not often enough.

Closely related to counting is speed. The speed of computing has increased unlike anything else in our existence. If cars got 10X faster, we would change lots of things, including whether to drive or fly. But as computing has gotten 100X or more faster, we too often fail to adapt the way we program.

When we walk or drive, we always look ahead and change details of our walking or driving to adapt to ever-changing conditions. Adapting what you do to what you see and learn is fundamental common sense. All too often, it is not part of programming.

Some fundamental concepts of software aren’t taught and most people, including programmers, have the wrong ideas in their head about them. One of those concepts is that a program is a passive thing that needs to be built, instead of a set of actions that needs to be choreographed.

Flowcharts and workflow express the actions of a program. They have been around since the start of programming. They're still around, but largely ignored as a fundamental.

You think of building a house, after which it’s mostly unchanged. Software is different. Being built is like being born – software spends most of its “life” being changed.

What we call “building” software works much better if we treat as “growing a baby.”

It’s easy to think that most of software has been figured out, and that innovation is possible only at the nether reaches of the field. Kind of like how innovation in math isn’t needed or performed from arithmetic through algebra and calculus and way beyond. Not true in software! Some of the most fundamental things, like quality, are ripe for fundamental innovation.

Speaking of math, computing started as a way to do math and grew as part of math departments. The misconception that math and Computer Science are closely related is widespread. This is deeply harmful.

The usual practice in computing is to dive right into the details. Perspective and putting it in a broader context is tremendously helpful if you aspire to be truly excellent in computer software. Here are some sample books that provide that context.

Computing and software would greatly benefit by establishing the fundamental concepts of the field. Individual programmers can become vastly more productive by understanding the fundamentals and practicing them.