Don't 'learn' tools. Use them for something.
Intro
I loved The Matrix as a kid, and like every little nerd in the making I thought typing away at a neon green-on-black terminal was peak cool. I happened to be decent with computers too, and eventually stumbled upon a CD of Fedora 7(?). I didn't really have anything to do with it, but it was fun to try just for its own sake. I installed it on my janky desktop, and not really knowing how to do much more than navigate the GUI to whatever frontend there was for the package manager, I installed an IRC client and hung out with some guys called "sysadmins".
Seeing as how they tappity-typed away on keyboards with rad terminals for a living, I thought I might have a go at that too, and asked what it would take to start in their field. The number one response I remember was "Learn Linux".
Maybe that's something you've heard, too. Or you told someone else. Unfortunately, that was poor advice.
Now I'm not saying learning Linux isn't worthwhile -- it certainly is. Linux powers most of the computers on the planet, and holds up the whole internet, so for sure you'll want to be familiar with it if you hope to do anything in computing that isn't somehow confined strictly to the slices that Windows or MacOS occupy.
But as advice, "Learn Linux" isn't very helpful because it doesn't take someone very far. So they start learning "Linux", and what do they find? How to navigate the terminal, install packages, write a simple bash script (with a loop, neat!). Or how permissions work, how to create and configure new users -- maybe how to build some FOSS software from source with the make
commands in its README. Best of all, they get to do it all tippity tappity typing like Tank from The Matrix (this means you're cool).
Alright, what now?
It's a dead-end. It's a map outlining the first 10 feet into your thousand-mile journey. People try it out and, at the end of the day, they're not sure what to do with it.
This applies to more things. How about "learn to code"? Plenty of people throw that advice out there, making just as much of a map for a youngin' as "learn Linux" did. They'll learn the base mechanics of a programming language, and maybe even make a pretty neat toy, but that's only a tiny slice of a requirement when what they likely want to do is become a programmer, who does this either as a profession or a meaningful hobby.
This is equivalent to someone wanting to learn carpentry, and a carpenter telling them "learn circular saw". Yes, the circular saw is one of the most ubiquitous carpentry tools, and there are guidelines for using it effectively and safely, but that's not what carpentry is. Carpentry involves planning and executing whole projects with a suite of tools and techniques for using them. You don't want to use a circular saw. You want to make a table, a bed frame, a handrail, a rocking chair, an art piece. Something purposeful, which someone wants to exist.
Getting into any operations or engineering discipline in the computing world world from scratch works the same way. You need to learn tools, yes, but much more importantly you need to deliver on projects with real-world value to someone. You need to encounter individual problems along the way, and find their solutions. With a real goal in mind, you'll pick up what you need from the tools. You'll have to learn, or else you won't cross the finish line. And compared to how quickly your learning was progressing before, it will feel like you've gained superpowers, because you have real direction instead of witless wandering.
Once you have the context of what's required to reach real goals, revisiting the the functions of your toolset will pay out far more than it did when just exploring. When you have some understanding of what really needs to be achieved, and roughly what's involved in getting there, you're more likely to recognize useful features that made no sense the first time, and never stuck in your brain because you had no true utility to associate it with.
At a really fundamental level -- and this applies to all fields, even outside computing -- to do something useful, you need to learn what other people in the world around you want and need, and you must try to provide it for them. At an entry-level job, this would probably be dictated to you. But you can get a leg up if you can learn this on your own.
I don't expect folks to just go around asking random people "what they need", with no mental context in which to understand the answer... though this may not be the worst idea! I bet you'll get some interesting conversations that way. But you might try finding a friendly pro who works in a field you want to enter, and asking them for some exact problem they have solved, why it needed to be solved, and don't let them go until you grok the explanations. Then see if you can take the project requirements and deliver a solution on your own.
Many such problems may be pretty advanced for a noob, but let me provide a few examples to start.
Projects
Many of these are pulled from my own experiences in the web/cloud computing world, covering both ops and engineering type tasks, but they won't all require access to a cloud computing environment. If you don't see something you like or you have an idea for a good real world challenge, let me know so I can modify the list! If you try your hand at one or more of these and make it past the finish line, show it off to me! Tell me what you learned in the process of building your solution. If you know someone who might benefit from these challenges, pass it along.
These are not hand-holding step-by-step exercises, but real challenges for learners to try. It's not uncommon to find yourself working with a team of folks who know just as much about the solution as you do -- that is to say, "nothing!" It's up to you to figure out how to get it done, and then teach others how you did it. That said, there are innumerable resources all across the web to help you understand any part of this challenge, especially in this day and age. Loads of people would be happy to give their tips as well, including perhaps yours truly (but try to solve it with resources you find first! I bet you can). Searching for knowledge to solve your own problems is a core skill of any discipline, and something you'll do incessantly if you want to go into any field that requires you to "Learn Linux".
A quick note about cloud accounts. As I mentioned, I'll try to include things that can be accomplished at home, but anything in this project list that does involve cloud computing providers will attempt to be platform-agnostic. There are multiple major providers, each with their versions of promotions or free tiers:
- DigitalOcean is the one I'd recommend for folks that don't have cloud experience, and I continue to use it and recommend it for smaller projects that don't need the big feature sets of other providers. The user experience is very straightforward, and their documentation is fabulous. That link is a promo link which will get new signups $200 in credit to spend within 60 days, and nothing in this list will come anywhere near that price.
- Google Cloud Platform (GCP) also has a credit promo, in the form of a $300, 90-day free trial period. On top of that, they have a permanent free tier in pricing for a number of their services. This is one of the big boy cloud providers, and may be a bit more overwhelming jump into if you're new. Additionally, it's easier to accidentally spend money on GCP than DigitalOcean. This would be my second choice, however, because of how well integrated many of the services are. The operational experience is still better than the third on this list:
- Amazon Web Services (AWS) doesn't really have a promotional credit system aimed at individuals, but has an extensive free tier that lets you get your hands on all kinds of products on the platform. This is the most popular cloud provider, and likely to be the most mentioned in job listings. It has an intimidatingly large set of products, but for any of these projects you'd likely just leverage a couple things. I recommend it last because it requires the most learning and piecing together of components to be useful.
The database backup
Scenario: A small team of web developers have deployed a web application directly on a remote virtual machine instance. This application stores data in a relational database called PostgreSQL, which is accessible from that VM. They have a problem, though -- if something happens to this machine instance, or if someone accidentally deletes the database or corrupts the data held there, they have no means of getting it back. They rely on this database to continue serving their customers, and its loss would be very painful, if not catastrophic. They need a way to keep regular backups of its contents somewhere safer. They would like to execute backups at 3AM, when there is least likely to be customer activity on their app, to avoid any potential degradation of performance.
Value: Everyone needs backups, all the time. This is a very common need in any infrastructure environment, from the tiniest office server to great honkin' huge enterprise deployments of mission-critical applications. By solving this scenario, you'll install some software on Linux, get basic exposure to the commands used to manipulate a common relational database, leverage some utility to move or synchronize files between an origin filesystem and a remote destination, learn how to execute multiple commands (or a script) on a schedule automatically, and learn to restore a database backup if you do the bonus.
Requirements:
- This can be done on your favorite flavor of Linux, either on a home machine or in a remote VM (that's a Droplet for DigitalOcean, Google Cloud VM for GCP, or EC2 Instance for AWS).
- You'll also need access to some kind of remote storage (this can be on your own network, just remote from the main machine's perspective).
- Block Storage is the preferred method for this challenge if you're working with one of the cloud providers. Search that term for your preferred provider and you'll come up with the right stuff. You can leverage a CLI utility that makes working with their block storage offerings easier.
- Otherwise, at home, try moving the files to another remote storage destination via SFTP or rsync instead! Just bear in mind that you'll want a solution that can be executed at the command line, so GUI clients for SFTP (like Filezilla) won't work well here.
Steps:
- Install PostgreSQL on your Linux box, and then figure out how to create a database and any amount of data. There are infinite tutorials for this, and the contents aren't important for the rest of the challenge, only the fact that something is in there.
- Figure out some solution to extract (dump) all data from the database to a local file, and then move that file to your remote destination by your chosen means.
- Figure out how to execute this operation once a day, at exactly 3AM. There's more than one way to do this, but one way is nearly universal in the Linux world.
- Bonus: Reverse the operation! The team also wants a way to quickly restore the data from the latest backup from remote storage with only one command. The old saying goes something like "If you don't test your backups, you don't have backups!"