Recently I was discussing with a friend that was thinking about developing some programming skills.

My go-to advice in these situations is to start building a copy of something that is conceivably useful. This is how I started and grew as a developer, and it seems to have worked quite well.

I like this approach because it keeps me focused on a finite user value. I came to appreciate specifically the “finite” aspect of it because it keeps the work contained and prevents scope creep.

One other reason why I find this approach practical is that it allowed me to touch multiple layers of the software stack: in my case it was an e-commerce website, so I got to dip my toes in:

  • web frontend: HTML, CSS, and JS, HTTP parts relevant to the frontend like caching and asset optimisation, performance on the frontend;
  • backend: Apache, PHP, MySQL, email, image processing, performance on the backend.
  • devops: although at that time it meant SSH, Makefiles, rsync and coreutils, it still exposed enough of the deployment activities to get some understanding of what’s involved there.

Besides giving a wide perspective of what an app is made of, this is also an opportunity to pick one layer to specialise in, both of which I think are important for a beginner which tries to find their way in software development.