Programming is something everyone using a computer really should be able to do and in my opinion it's a small crime it's been made so difficult on modern devices. It's also much easier than you're often told it is, I learned when I was about 12 years old. Degrees are more for dealing with HR and getting dragged through ideas you think are unimportant, hopefully this document can be a substitute for the latter. It's based on years of teaching children and adults to program from scratch, helping junior engineers contribute to projects I've been working on, and things I've learned in the course for my own career.

Note on books

If you need a book that isn't available for free online and can't afford it or borrow it I'd recommend going to libgen (the domain changes so you'll have to google it) rather than do without. This is federal crime in the US and it's better to have a hard copy IMO but you can wait until you have a good job for that if you need to. Chances are though I'll have the book your looking for or something similar (if I haven't already lent it out to someone else.) The O'Riely "animal books" are very pricey but they're worth every penny. It's rare one of them is a dud and they're usually the best thing you'll find for learning a new language, tool, or framework.

The Basics

In my experience beginner programmers usually get completely blocked from learning because of a couple of things that seem trivial to people who have been programming for a while. These are:

Some very simple stuff to get you started

I've found that scheme, because of its extreme minimalism, tends to make the first two easy to overcome. The very popular book "Structure and Interpretation of Computer Programs" can help begin with the third one. You don't have to read the whole book, if you make it through chapter 1 or maybe 2 that should be enough to get you going. Scheme (and most Lisps) are very rarely used for anything other than teaching but they're exceptionally good for that in my opinion just because it lets you remove all the distractions more complex languages create.

So to get started:

All of that isn't to say scheme is useless even for back end programming. My two favorite programming forums: Textboard and Hacker News are both written in a scheme dialect. The latter is written in PG's personal scheme-like language: arc which is specifically intended for web development.

Debugging tips

When you inevitably get stuck in scheme or any other language remember these rules

Some slightly more useful stuff

If you're already comfortable with recursion and Turing complete languages you might try Python. Many people erroneously think of this as a beginners language but I would argue it has some of the most complex and confusing syntax so I usually tell people to try scheme first just to internalize the basics of programming. Once you have a good intuition for this though you can write complex software very quickly in it since the language runtime does so much for you. The general culture that's developed around the language is very healthy and people almost every use it for all kinds of things. It's a good language to know and one of the best for experimenting with new ideas.

Another language that's nice when you're starting out is C. It doesn't have many built-in data structures like python but the simplicity can help focus you on the underlying algorithms. It also runs much faster and on more hardware than Python. C used to be one of the more common video game development languages and it's one of the first I learned. If you remember the Wii game I wrote around when I first came to Evergreen and installed on Gabe's Wii that was written in C.

You may also want to have a look at either C# or Java. I did a lot of C# when I was freelancing but don't have a good tutorial to give you. Let me know if you want more info on this.

SQL

No matter which language you pick you'll usually want a database for anything non-trivial. I'm extremely partial to SQLite. Not only is it fast, trivially easy to set up, trivially easy to work with, portable, and popular, many languages have built-in support for it (including python.) This tutorial looks decent. Most people find the SQL basics pretty easy to pick up, let me know if you need more resources for that though.

You'll want to install git This not only gives you a version control and collaboration tool but also provides you with a Unix shell (bash) which is good to get acquainted with.

General Software Engineering Resources

The most common problem decomposition technique used in corporate software is called "Object Oriented" decomposition. When you're designing software this way you try to break down your problem into data structures called "objects" that function by "sending messages" to each other. These objects have a list of internal "fields" that may or may not be visible to each other and "methods" which are functions that operate on object instances via a "receiver." That's a very poor explanation, other people have much better ones.

You'll also want to be able to work with databases.

Here is a short list of what I would consider to be the most important books on software engineering

Extra Academic Stuff

Don't be scared by the math, CS people tend to be crap at it and it's all pretty easy.

Some specifics

Web backend

You can write web backend code in just about any language. Most of the backend code I've written for my personal projects has been in the Unix shell language "bash" or in C but both of these are somewhat unusual. Some people like to use Python either via the "Flask" framework or "WSGI."

Most languages besides go will need a web server to forward requests to your application, here are some useful resources:

A warning about contemporary server side JavaScript (node or npm) and PHP

Abstraction is one of the most powerful tools a programmer has and there's a common tenancy to abuse it. For whatever reason this seems to happen most often among JavaScript and PHP programmers. The results are catastrophic. The large dependency graphs expose projects to "supply chain" attacks where malicious behavior is added to one of the many libraries they're consuming. This is a particular case of a more general problem they face where their dependencies change behavior out from underneath them.

Personally I have a strict rule of not working in PHP (you can see this on my "hire me" page on my main website) and generally I try to avoid large JavaScript projects. Don't let my cynicism turn you off to it if you're feeling brave just be prepared for what you're signing up for. I know people who have been blindsided by this.

Systems Programming

Everything has to sit on top of a machine at some point. The people who deal with the problems this creates are called "systems programmers." It might sound niche but some of the most lucrative contracts I got while freelancing came from this space. I would think of it as two separate but related things: "Embedded systems" where a computer is physically part of some application (such as a controller in an industrial automation) and more traditional systems (such as end user workstations or servers.) As computers get cheaper these two become more and more similar. Modern embedded system firmware is now often generated using the same tools used to generate OS images for servers. Bellow are some resources for understanding these:

Deployment Automation

Now that everyone is moving to hosted ephemeral VMs for services the new hot thing is something called "deployment automation." The idea here is that you can have all of the underlying infrastructure for your application along with installation instructions written out in code. This way if something goes wrong you can just run a program and spin up a new instance, you can even spin up a private instance for testing new features, and you can also easily discuss and approve changes using your normal code review process. You can even set up automatons to automatically rebuild your entire testing environment as your team develops new features. This lets you catch bugs early.

Notes about Computer Hardware, Programming Environments and "soft skills"

Text Editors

Your text editor will become familiar enough that it almost becomes an extension of your body. Because of this most programmers tend to have extremely strong opinions about their editor. I'd recommend trying a few and keeping an open mind and then getting very good at a couple. Keep in mind that the people you work with often force you to use their favorite editor so you may be forced to learn a new one.

In the past tools for auto complete, syntax highlighting, and symbol lookup used to be coupled with particular editors but that era has almost completely ended. Most editors speak common protocols/formats for these via language servers and tags files making it easy to move between editors without having to give up language support.

Here is a list of common text editors:

Hardware and Environments

Via the Church Turing thesis we know any computer can simulate any other computer provided it has enough time and ram. Modern computers are usually even more compatible than this would suggest so in practice computer hardware doesn't really matter. I'm personally using a refurbished "thinkpad 11e" right now that I think I paid maybe $80 for (including shipping.)

Nonetheless there are some things that can make it easier and I'll list bellow what I've found to be most helpful

Some Linux Distros

Here are some Linux distros you can run in Virtual Box or probably install directly on your machine. If you need a thumb drive with an image on it I can probably burn you one or you can use Rufus. I've never used it but I've heard good things from people who have. If you do this make sure you back up Everything on your computer.

There isn't just one "Linux" OS because Linux on its own isn't an OS and so these are really large collaborations between many projects. On most Linux distros both the application and system software is really thought of as a single unit distributed and packaged together by some "maintainers."

Soft skills

Quick list of shortcuts

The things that made the biggest changes for me were:

Don't hesitate to ask Questions!