Learning by building

6 min read

The very first project I built was a very simple html and css personal website. It build off a theme and was just a resume in online form. It felt silly next to some of the fancy websites around the web, but it was mine. In setting it up, I actually learned a lot, such as how to buy a domain, how to host a site somewhere, and how to track changes using git. We often learn so many small things by doing. Now many years later, I can setup a new domain in a few minutes, but there are still many things that are at the frontier, and there always will be. Checking for broken links through a CI pipeline may seem to some to be a waste of time (after all, who really cares) but it isn’t about the result, it is about the process. It is precisely because it is so low stakes that makes it such a great learning opportunity. The worst thing that can happen is that the CI pipeline doesn’t run and I go back to the drawing board. This post goes over some of the broader lessons learned throughout the process of learning by building.

Evaluating the consequences

I always ask myself two questions when building to learn.

  1. What is my confidence that there are no unknown unknowns?

If I were to begin mucking around in my computer’s file system formatting, there is not only a lot that I don’t know, but definitely a lot that I don’t know I don’t know. This increases the blast radius of mistakes because I can’t accurately answer the question “what is the absolute worst that can happen?”. When first beginning learning something, all learning should be done on a machine that if you brick it, you can hit reset on the whole thing. If possible, a really cheap computer with linux is a great place to start. No cost for subscriptions or licenses, and only as much interaction with your other accounts as you would like. It also removes some of the hand-holding that Windows or Mac may have, allowing you to make mistakes, and learn from them!

  1. Who will be affected by a mistake, and how will they be affected?

When I was just starting out, the answer was almost always “just me”. Now, there are various systems that I use or maintain that have an impact on others. The question of who would be affected and by how much should always be front and center, and it takes a blend of humility and confidence to know when you should proceed with something and when you should not. For example, I am not at a stage where I would like to host my own email server, however I am confident in data backups and running low complexity production systems.

The consequences matrix

If we think of the above in a matrix, we can see the four different possible states. Learning happens best in the bottom right, with uncertainty because you are learning something new, but low consequences if things go completely sideways.

uncertainty-matrix

A 2 by 2 grid. In the top left, the text "Low Uncertainty, High Consequences" in orange. In the top right, "High Uncertainty, High Consequences" in red. In the bottom right, "High Uncertainty, Low Consequences" in orange. In the bottom left "Low Uncertainty, Low Consequences" in green.

Gradually, there will be movement from the bottom left to the top left as you take on projects with more responsibility. You want to spend enough time in the bottom right so that you can take on tasks of high consequence with less uncertainty later. High consequences aren’t something to be scared of, it just requires more experience and care. Existing in the top right should be rare, this is usually when you should ask for guidance or help from someone else. Or, if the only person affected by the consequences is you, then it is up to you to decide whether it is a risk you are willing to take.

Learning institutions (universities, colleges, apprenticeships) all use this approach too. You begin in low-stakes environments for things that are new, and then move into situations where your actions actually matter. By taking trivial things like an exam question seriously, we are actually preparing ourselves for the moment when our answer to a similar question has real consequences.

Great projects to start with to learn by building

Personal Website

A personal website is a great place to start, both because of where it sits on the matrix and also because it is actually useful! Through a personal website you can learn about

  • Web hosting
  • Domains
  • Git
  • Whatever language you choose to use to build your site!

Your site is yours, so experiment away! The worst that will happen is that your website goes offline; nobody is relying on your website for a paycheck. Add a CI pipeline to do something trivial, connect a Content Management System, build an API endpoint, the possibilities are endless.

Self-host an application on a VPS

I would strongly recommend picking a provider with fixed costs, so that you don’t have any risk if your program accidentally uses way more resources than you anticipated (most likely because someone hacks into it for crypto, but it could also be a particular program that explodes in resource usage).

There are some applications that have a lot of moving parts (such as email, SSO etc), start with something that is really simple and then build up from there. Below are some simple projects that are fun and practical

Setup a CDN

This was unexpected for me, but a CDN can be dirt cheap and very simple to integrate with other personal projects. Even if it seems like overkill, you can learn a lot about caching and how pricing varies for different regions and bandwidth!

Overall, spend time in the bottom right corner - learning with uncertainty in an environment with low consequences - so that you can move from the bottom left to the top left for other projects. Playing around with things in a low-stakes environment is how you can gain valuable experience for projects that have higher consequences. Approach problems with enough humility to recognize when you are dangerously in the top right corner, and don’t be afraid to ask a mentor for guidance!