How to git gud

Revised 2022-09-23.

This is a document I’ve been thinking about writing for quite a while. A lot of people that want to learn about programming or computer science today tend to take a certain path through it and I would like to provide some framing that a lot of people might find useful. It’s important to understand that computers are not magical and everything is simple if you look at it long enough from the right direction. So what I’m sharing here is many of the topics I’ve had experience with when learning to git gud, so that you can too.

This article is pretty opinionated. It’s not meant to not be. But it’s probably a lot different than other guides/roadmaps/etc you’ve seen before.

This document isn’t meant to teach you, it’s meant to guide you. You can take a different path, especially if it means you’re more engaged in the content and feel more enriched. Learning is always good. You will have to Google many things along the way, half the work is learning how to learn!

These steps aren’t even meant to be taken linearly, if you achieve all of them then I consider you to be “pretty good” and someone I would be happy to hire. But if you specialize in a different direction, that’s great, your skills are still improving and your time is more valuable. This isn’t even exactly what I’ve experienced, it’s just enough to cover all of the skills I think are valuable to have.

I’m saying this prescripively, not descriptively. If your goal is to jump in and get a professional job as quickly as possible, you could take an easier path. But in my opinion you wouldn’t be as broadly enriched.

Foundation

Getting started

People have said that computer science is not about computers. At a certain level, this is true. But I think it’s still very difficult for novices to really talk about algorithms and more abstract concepts without a basic practical understanding of the experience of writing software and at a high level how we manipulate data with computers. So before we can really dig into the interesting topics, you should really have basic programming background.

The two ends of the spectrum are the very practical and the very theoretical. A “very practical” language that everyone should know (and I mean everyone that has to spend a lot of time on their computers for their job, not just software people), is Python. It’s very commonly used in teaching and has very broad applicability so it’s an invaluable tool to have in your belt.

Python’s first-party documentation is decent, but there’s books like this one that might suit your fancy instead.

On the other end of the spectrum is a little weird. People often wonder why we should teach theory to beginners? I ask, why not? So I also suggest learning Racket. It has wonderful documentation and is used at a few schools (including my own alma mater) to teach beginners. In a related vein, there’s also SICP that you can also consider.

Learning skills leaves you with more than the sum of the parts. It isn’t just about how to use the languages, but skills you learn in one language transfer over and improve your skills in general. Every concept you learn makes learning the next one easier, especially if they’re related.

If you want a course-oriented kind of instruction, here’s some links:

Solving problems

The theoretical-vs-practical spectrum is also a bit of fractal. You could be a published cryptographer but know nothing about deploying software.

So a common process that I instruct people to go through to stretch their legs with a non-programming advanced computer task is to deploy a basic website on VPS they rent with proper certificates. It helps to have something like this as a basic branching off point that lightly touches on several different practical topics.

DigitalOcean has some guides that may help with some of these steps. There’s also this website that provides a broader collection of resources on specific Linux topics that you could also consider.

You might want to learn some basic HTML to make something that looks nice, but only if you want to splurge. Doing these steps tries to gives you a good foundation for other projects later where you’d benefit from having a server in the sky to host something for you.

All of these steps can be done more easily and in less time and potentially for cheaper, if you just use some Amazon/Google/Wix/Squarespace/etc tool. But you won’t learn nearly as much that way and you’ll be locked into some special corporate offering that will limit what you’re able to do and make it harder to migrate if you decide to leave later. Doing it quick/cheap here isn’t the goal here, the goal is enrichment.

With some overlap, there’s also The Missing Semester of Your CS Education that covers very many of these points. But these are the big ones I think…

Projects

Not all of these involve actually writing code, some only involve learning some new CLI tools. I mostly avoid discussing use of specific languages, too. This is because knowing the right tool for the job is something that’s useful to learn on your own. You might want to attempt some project multiple times using different languages to get a feel for which languages are better suited for different use-cases.

But these are the main languages you should really be comfortable with:

Other languages that you might consider working with at some point:

If you’ve read other guides, you’ll probably see more focus on the web stack, including JavaScript. It’s useful to know it, but it’s very often overused, and building everything to run in a web browser is limiting.

// TODO finish and link js article

If you’re a beginner then looking at this section might seen intimidating. That’s kinda on purpose, they’re not meant to be all introductory. But at least a couple of these should feel approachable to you if you’ve dipped your toes into programming enough to get a feel for it. You’ll probably have to read some documentation or Wikipedia articles, but once you work through a couple things then read over the list again and see what seems more approachable now with the new skills you’ve learned.

Messing with your computer

// TODO restructure this section

Messing with the internet

The focus of these projects are to work with the internet and really get how computers actually talk to each other. If you focus too strongly on the web you become trapped into the client/server model of HTTP, and will think about everything in those terms. HTTP is a tool, it can be misused.

// TODO restructure this section, maybe split out

Messing with languages and automata

By “languages” here I’m referring to “formal languages”, which includes programming langauges but is more broad. Some of these you might want to consider focusing on the more functional languages due to their strengths.

Messing with game engines and graphics libraries

Messing with home servers

Some of these you could choose to run in Docker. Docker can make service management a lot easier. But some of them (like Nextcloud) don’t make much sense to run in Docker. Consider just using systemd services to manage them more tightly with your system.

Tools

If you’re someone that wants to work with computers every day, then you need to care about your tools. Tools help us get our work done, software tools are just as important as physical tools. And how are tools are designed has a big impact on us and how we do our work, so it’s important we put a lot of thought into them.

Software

Prefer FOSS wherever possible. It’s hard to avoid proprietary software in all cases, especially if you want to play video games, but we can set ourselves up such that we’re not reliant on it.

Operating system

You should make it a goal to switch to using Linux as your daily driver. This isn’t an unreasonable request, it’s 2022, you don’t have to be a technically-minded person to use it anymore. The benefits you get out of it are not only being able to have more direct relationship with your system, but you also take a big step to free yourself from the corporate-owned software world and embrace the community-owned world. It’s more than just about its technical merit, what’s more important are the power relationships and the underlying principles.

You don’t have to start here. You can get pretty far if you’re on Windows. While you don’t have to open a shell to get stuff done anymore, you should expect to to do many of the projects I’ve suggested later in this article, so you might want to familiarize yourself with it on Windows first and then switch. Or not, if you’re enthusiastic you can jump right in immediately.

It’s easier to daily drive it today than it ever has been, in part thanks to work by Valve (one of the few not obviously evil corporations) you even can play lots of “officially-Windows-only” vibeo games on it, in many cases right out the box in Steam.

MacOS is potentially more acceptable, and you could go farther with it without hitting limits to your skills, but in this case you’re still within Apple’s grasp and you’re subject to their corporate agenda.

On mobile, similar thinking applies. Make your next phone be a Pixel and put an Android ROM like CalyxOS, CopperheadOS, GrapheneOS. I’m not an expert on Android so you should do a little of your own research to find the right balance of de-Googling for you, but CalyxOS suits me well enough.

If you’re a high school student, I suggest making the switch over the summer before you start the next school year, especially if your next school year is going to college. Just before college is when I switched over to it as my daily driver and it was a great choice. If you’re already in college, then doing it between semesters like during winter break is probably a good time.

Web browsers

Chrome is owned by Google. That shouldn’t be a surprised. Chromium is an open source software project managed by Google. I say open source, but only in the strictest sense of the word. Google makes unilateral decisions about the direction of the project, to serve their corporate agenda. There’s a few browsers such as Brave that are based on the Chromium codebase, so Google indirectly control these too. Since Google basically controls this much of the web market share, they also basically control web standards and have a large say over the World Wide Web Consortium that, on paper, is supposed to decide things.

Additionally, Chrome phones home to Google everything about your browsing activity and JS heap dumps, even in incognito mode.

Mozilla currently has some troubles, and only really exist due to funding from Google as a tax writeoff and so they can have a defense against antitrust lawsuits. But Firefox is really the only mature web browser that is justifiable to use. There’s a few tweaks you have to make to get it to really respect your privacy, but this is a one-time-setup.

As for browser extensions, the most important single one is uBlock Origin, most of the other adblockers take bribes to not block certain ads. If you want to support creators that seem to rely on advertising revenue, then it’s better for everyone if you just pay them directly through Patreon, Liberapay, OpenCollective, or whatever other system they use. Advertising is parasitic in nature and we should not accept being distracted by it.

The other browser extensions that are useful:

// TODO elaborate

Text editors

Avoid VS Code, for many of the same reasons you should avoid Google Chrome. If you really want that style, then use VS Codium intead to actually be using free software and not the clever bait-and-switch Microsoft pulls.

Personally, I use Emacs, but it’s not right for everyone. Vim is also decent. Both take some setup and getting used to but are more powerful and give you more control than today’s mainstream text editors.

// TODO elaborate

Hardware

Choosing the right hardware can make daily-drivering Linux easier. Some high-end laptops even come with Linux preinstalled! My rough reccomendations are:

The important thing to be aware of is to avoid Nvidia graphics cards. Their driver support is terrible and while they’ve taken steps in the right direction recently, the weird setups you’d find on laptops don’t make configuration easier. You probably don’t need high-end graphics on a laptop, you can get by with the integrated graphics on modern CPUs.

If you really want high-end graphics, I would suggest buying a cheaper laptop and saving your money to build a desktop with an AMD graphics card.

I don’t know of any regular desktop motherboards that support Coreboot or Libreboot such that we can have privacy-respecting firmware, but that’s a whole different battle and kinda hard to try there yet. Obviously it’s more reasonable to use a less freedom-respecting laptop that you already have than pay for a new laptop that does, but not everyone is as purist as I aim to be or you might have more money to spend than I do.

Don’t buy an Apple computer. They’re nice and pretty, and the newer ARM ones are very competitive with Intel/AMD based laptops, but that’s not what matters right now, it’s an issue of ethical consumption. Watch Louis Rossman’s videos on YouTube if you really want to go into the sheer degree of anticompetitive bullshit they’re capable of.

If you already own a Mac then that’s totally okay, but but look into using Asahi Linux when it’s more mature.

If you’re planning on doing anything with cryptocurrencies, you should also buy a hardware wallet to store your funds on if you have more than a couple hundred dollars worth. This is kinda orthogonal to the other stuff, but it’s just way safer and it needs to be said. Plus, some of them also can work a U2F device!

Services

It’s easier to switch the software you rely on that you run locally, but it’s harder to switch out the software you rely on that runs somewhere else. So it might take more of a lifestyle change to reduce your usage of those.

Generally you should look towards using self-hostable services, or at the very least services that have fully free software clients.

Try these replacements:

There’s some more detailed discussion on how to go about this in the Projects section above.

// TODO elaborate

Philosophy

Computers are powerful. If someone uses your software, they’re trusting you in a certain way. That trust can be abused in various ways. If you control the software someone runs, you have some kind of power over them, and power can be abused. One of the better ways to ensure power cannot be misused is to give the user the opportunity to take the power back if needed. This reduces the impact and risk of coercion.

// TODO elaborate

The consequence of this is that all software should be free software and all information should be freely available.

Concerns

Most large corporations are evil and want you to be dependent on them to ensure their continued existence and profitability. You should avoid them and take steps to reduce your dependence on them.

It’s unreasonable to expect to fully divorce ourselves from the surveillance capitalist state without giving up some nice things and alienating ourselves from our friends, but we can reduce the kinds of data we leak and work to establish viable alternatives (kinda like dual power).

It’s difficult to describe how quickly computers have dramatically all of our lifestyles. It’s possible nothing in the history of humankind has caused as dramatic of a shift as computers and modern telecommunications have. For both good and bad. Trillions of dollars of wealth have been accumulated as a result of this shift, and private corporations in control of our infrastructure have power that rivals that of governments. So trying to inoculate ourselves against coercion by these actors I see as a moral imperative.

Background Resources

These are pretty important to read/watch, and heavily informed my own opinion on technology and our relationship to it.

// TODO more


Articles Index