Systems Engineering (also known as Infrastructure Engineering, Operations Engineering, or DevOps) is a challenging but rewarding career path. Because Systems Engineering draws from a wide variety of smaller topics, it can be hard to know where to start and in what order to begin. This resource is intended to give you a sketch of some of the learning-paths that that can lead you to a career in Systems Engineering.
To start, let's examine a high-level list of topics that established systems engineers should have knowledge of. In each of these topics, the level of depth required to get started as a systems engineer may vary, but it's good to have a general breadth of knowledge on all of these topics.
These lists are not exhaustive, rather a good starting point to gain general knowledge.
- Operating System Fundamentals
- Operating System Virtualization
- Command-Line Shells
- Command-Line Utilities
- General Utilities
- Network Utilities
- Pattern Matching / Batch Processing Utilities
- General Utilities
- Networking Fundamentals
This is somewhat subjective, but the best place to start is the thing you are most interested in learning right now. Inspiration and interest are powerful motivators that will help you stay focused when you dive into a topic.
That said, here is an ordered list that composes a learning-path that may be useful to help guide you:
Since so much of systems engineering deals with manipulation, composition, and management of operating systems, this seems like a great place to start. Having knowledge of process models, filesystems, and permissions are a great foundation to build on top of.
Systems Engineers make frequent use of command-line utilities in their day to day work. Whether it be to query for information, or string a set of commands together to achieve a goal, understanding these command-line utilities is a great next step.
Once you have a solid foundation of operating systems and basic knowledge of command-line utilities, a good next-step would be to learn how to compose those utilities into a shell script that can help you automate tasks. Systems Engineers often spend time building scripts to automate manual processes.
With a firm grasp of operating systems, the command-line, and automation via shell-scripting, your next step is to understand the networking technology that the internet runs on. Systems Engineers often need to monitor, manipulate, and protect traffic that flows into our internet-connected applications. The osi model will give you a conceptual model to understand internet protocols, and learning about dns, tcp/ip and http are great first-steps to understanding how applications talk to each other over the internet.
Once you understand the fundamentals of network protocols on the internet, the next step is to understand how to secure applications that are connected to the internet. Learning about firewalls, administering them through use of command-line tools like iptables, and understanding ports is a great next step.
We've included this towards the end of our list because it builds on top of the understanding in all the previous sections. Understanding how containers work requires knowledge of operating systems, file systems, and networking in addition to command-line utilities and shell scripting. Digging into docker here is a good place to start.
Zooming up another level, orchestration involves the management of multiple applications, their network traffic, security, and potentially virtualized containers that house one or more instances of each application.
The path to learning systems engineering is challenging due to the breadth and number of problem-spaces that require understanding. One of the best things you can do is to find a mentor who can help guide you and answer questions along your journey.
In the absence of a mentor, the following resources will help you with self-study. We've broken these out into free and paid categories with a focus on high-quality resources.
- Julia Evans Questions
- Julia Evans Blog