When you’re starting out in Software Engineering, or IT in general, there’s a big pressure to learn a lot of technologies. Just take a look at the flood of articles in the manner of ‘X Roadmap – from Zero to Hero’. A couple of popular examples:
- Web Developer Roadmap on Github
- Frontend Web Developer Roadmap: Everything you need to know to get started on Reddit
- There’s even a whole website dedicated for engineering roadmaps!
They’re really cool, and all of the courses in the manner of “Learn Docker in X Days” are cool as well, but there is one problem for intermediate-advanced developers. For the purpose of this article, I’ll assume you’re either a Backend-focused engineer or a Fullstack engineer who knows a bit about Backend and would like to learn new, popular cloud-related technologies like Docker or Kubernetes.
And what’s the mentioned problem? Let’s dig into it.
Typical path of learning for Backend/Fullstack engineer
I imagine when you’re trying to learn to code nowadays, you use a wealth of courses available everywhere over the internet today. You watched a course and followed along, or used some interactive platform like FreeCodeCamp.
That’s good, you learned what is software engineering, programming patterns, all of those things. You get your first or second job as a Software Engineer and start doing it commercially.
If your company belongs to SMB (small/medium business) and the product you’re working on is relatively new, there is a high probability that you’re using one of those:
- Docker, for containerization, your local development environment
- Kubernetes, for containers orchestration
- Some cloud IaaS (Infrastructure as a Service) like AWS, GCP or Azure
If so, there is also a high probability that your architecture at least somewhat reminds microservices.
You know now how to move through it, add new functionalities, how everything works on a higher level.
But the question is, have you ever wondered how does it work on a lower level?
Especially when you move higher up the software engineering ladder and start designing architectures, it’s important to understand how low-level things impact your higher-level design.
What do you do when setting up a completely new service in your cluster?
Let’s imagine you’ve got a brand new product to build. You choose the microservices architecture and start with some sort of Docker, Kubernetes, and AWS infrastructure.
How do you start setting it up?
Do you use some boilerplate where everything is already abstracted and you don’t have to worry about too many distracting things? Things that are not that important to care about them in the beginning?
You should ask yourself a question now, is it a good or a bad thing to use a boilerplate?
And the answer is, as usual, it depends.
Good and bad things about boilerplates
Boilerplates are great to start off things much faster than setting everything up from the scratch. I use them with my side projects a lot, and I cannot count the time I saved thanks to them.
But more often than not, assuming that your project is something more than just a simple to-do app, you have to customize some things in your setup.
And, if you ask yourself this question, you know if you’re good to use boilerplates or not:
Can you easily change your configuration, because you understand how does it work; or do you frantically search Google and StackOverflow to find answers for your problems?
If the latter one is your answer, you’re in trouble. Even if you found the working solution and copy-pasted it from StackOverflow, you still don’t know how does it work.
Is it a correct way to do things? No idea, because you can’t validate it and compare it to other solutions.
Does it imply any risks, like a specific security breach, or access to your server from the whole world?
Learn fundamentals first, before you learn a technology that relies on them
I started this article with Docker in mind, but it applies to anything you use. There is always a big stack of knowledge and discoveries, trials and failures, that leads to the creation of specific technologies.
Docker itself relies on a knowledge of operating systems, networking, and a lot of other things.
If something happens and you need to debug things, but you lack OS knowledge, do you know what to do?
When you want to set up a new ElasticSearch cluster on non-default ports, do you know how to start?
I myself was lacking fundamental networking knowledge when I started using Docker and cloud services like AWS. I can’t even count the hours I wasted trying to solve my problems. Problems that appeared to be so simple once I understood how does it work under the hood, that I’m still ashamed of myself.
And that’s exactly why I recommend everyone to spend some time learning about Computer Science fundamentals (networking, operating systems, algorithms, data structures, databases) when trying to level up their career. Once you understand the basics, it’s so much easier to learn new stuff, make informed decisions and be a reliable engineer.