Let's start with the most basic of questions when it comes to programming a computer: What is a computer? It seems a silly question for a device we take for granted but it's important to understand what it is if you want to program for one.
To put simply, a computer is a calculating machine. That's it. Its sole purpose is to compute things. A computer need not be electronic either, as there were mechanical calculating machines such as Charles Babbage's Analytical Engine, with even programmable machines around as early as the 19th century. Before the advent of fast calculating machines that we're used to, there were actually teams of people called computers to produce math tables. And much like electronic computers of today, human computers were simply given a set of instructions and were not allowed to deviate from them.
While I won't go into a deep dive into the history of machine computers, even with the advent of fully electronic, then fully digital computers (analog computers were a thing!), the computer's job for a while was primarily to handle computation. Everything from military artillery tables, accounting information, to even predicting who would win the 1952 US presidential election. Eventually this evolved into allowing computers to control machines, instead of showing a value to a human and having them control the machine itself. This was mostly useful in aerospace where many minute inputs in a small period time could often correct either an airplane or spacecraft better than a human could based on feel. But as computers became more powerful, eventually it grew to controlling more things, until finally we have our modern, electronic, digital computer.
After stewing on it for a while, I decided to start a blog of guides for the budding programmer. This will be covering the basics and some intermediate topics, and if I feel like sharing something more advanced then that may crop up once in a while. This series is intended more to give a crash course on programming and concepts in general and while I may use a programming language for examples, I must emphasize the language does not matter here. The programming language is the means with which to get things done.
Please note that this blog isn't purely for software based topics. This will include some hardware based topics as well because understanding hardware influences how you should design software at times, even if you have an OS that theoretically takes care of everything for you.
As some background of myself:
My educational background is in Computer Engineering. For those that don't know, the simplified explanation is Computer Engineering is a combined discipline of both Computer Science and Electrical Engineering. Where the Computer Scientist focuses mostly on software and Electrical Engineer focuses mostly on hardware, the Computer Engineer looks at both in a way to develop computer systems.
So basically that means I have at least a basic background in electrical engineering on top of my software development skills. And while I haven't had a need for it to hash out circuit designs, just knowing the basics of electronics helped me understand computer systems better.
I'm entering the 10th year of my career as a software engineer/developer/whatever they call it these days.
My development experience is in embedded systems (or from a high level view, simple computer systems, often not running an OS) and application software.
While I do have a list of topics in mind, feel free to suggest something in this post as a comment and I'll see what I can do.