Skip to content

Instantly share code, notes, and snippets.

@filipegorges
Last active July 29, 2023 19:33
Show Gist options
  • Save filipegorges/7e91c8662371c7ff0253b4ae320c21d9 to your computer and use it in GitHub Desktop.
Save filipegorges/7e91c8662371c7ff0253b4ae320c21d9 to your computer and use it in GitHub Desktop.
Stepping stones to become a software engineer

Software Engineer Roadmap (WIP)

Hi! This document is meant to be a suggestion/guide on how to learn what I find to be fundamental to a software engineer; this is by no means an academic or exhaustive resource, and is based solely on my own experience as a software engineer and as a technical interviewer.

What is a software engineer?

In order to become a fully-fledged sofware engineer, it's imperative to start from the fundamentals, but what is a software engineer to start with? Or better yet, an engineer? Well, according to Google, engineering is the application of the scientific, economic, social and practical knowledge, with the intent of inventing, designing, building, maintaining and improving structures, machines, devices, systems, materials and processes. A software engineer is therefore someone who applies practical knowledge to invent/design/build/maintain/improve software. This practical knowledge is what I aim to provide guidance on where and how to find.

Who is this guide for?

Anybody who would like to begin their software engineering careers, this isn't targeted to more experienced developers, though some of them might find answers to questions they didn't know they had by reading some quality references :)

How should I go over this guide?

If you're just starting out, I'd suggest you follow it by the order I'm writing, without skipping subjects, and I recommend that you limit yourself to studying for a max of 2h a day (you're free to cover as much as you want on your days off though!), this is important so you don't burn yourself out, keep yourself motivated to keep on going, and build a studying discipline which ought to be part of your life moving forward.

Start here!

Object-oriented programming

  • Learn Ruby The Hard Way

    • This book is a quick introduction to the Ruby language, which we'll initially rely on due to the superb quality of the references we'll cover next. Ruby is easy to learn and has a clear syntax, which will allow you to focus on learning to reason about code before dealing getting headaches with syntax limitations from other languages. Ruby still has a market should you want to continue with it on your career, though I would advise giving a chance to other technologies (which we'll cover) as well, learning multiple programming languages has the same effect of learning multiple spoken languages: the more you learn, the easier they get, specially when they share the same origins! The faster you're able to learn new languages, the more flexible/valuable you become to a company ;)
  • Practical Object-Oriented Design in Ruby

    • This book is the main reason you've learned Ruby! This book will teach you about design following SOLID principles, which will carry over to any other framework or technology you'll be working with during your time as an engineer (fundamental!). It provides answers to things like "how big should my classes be?", "where do I put my code?", "when should I create another class?", in a simple, direct languange. It's one of the best written/edited books I've personally read.
  • Deep-dive into Design Patterns

    • Here you'll learn that Design Patterns are nothing but an application of the SOLID principles you've learned before, you'll realize that some things you were doing had a fancy name to them, and learn that by using these fancy names you can communicate the intent of the design of your application to your fellow developers. I recommend this book instead of the famous GoF one for its simplicity, examples, pros and cons and comparisons, as well as explaining where does it makes sense to use them, in a simple and easy to understand language.
  • Refactoring

    • This famous book written by Martin Fowler will drive you nuts with its repetition, but the value you'll get from it is learning "why shouldn't I always use Design Patterns for everything?", "why shouldn't I always start by breaking down and abstracting code, when it looks so obvious that I'm violating a principle here?", here you'll learn when and how to make a judgment call on design and the impact/costs associated to it, it's therefore imperative that you get through this book until the end, even if you hate the repetition, because it's on purpose! On this book, the author will use Java to express himself through code, which is quite different from Ruby. We'll dive deep into Java at a later point in time, so at this point it'll be an exercise in trying to understand code from a language you don't yet comprehend, using your past experience/logic from Ruby. This should be your first step in understanding that languages are just a means to an end, and if they stem from the same paradigm (object-oriented in this case), they should behave (and quite possibly look) the same.
  • Clean Code

    • This seminal book will gloss over what you've already learnd from SOLID, but also teach you to write code that is both readable and understandable by your fellow humans.

Fundamentals

  • Ace the Java Coding Interview

    • Data Structures, algorhtmic complexity directly affect the efficiency/scalability of your software, when you're iterating on simple 10~100 item collections all these might seem overkill since they are still processed at sub-milisecond speed, but what if you have hundreds of thousands or millions of items per collection? How to write efficient code and how to solve difficult problems is what you'll learn through these courses (refer to this coursera course if needed to understand Java's syntax.
  • Operating Systems: Three Easy Pieces

    • Learning how Operating Systems works, what are threads/processes, what are the effects of I/O and scheduling, what happens inside the memory of your OS can and will impact how your own applications behave (or misbehave), therefore it's vital that you grasp these concepts no matter at which software layer you'll be working with.
  • Computer Networks

    • Similar to Operating Systems, this one will teach you the fundamentals of networking, the different protocols, their impact in the behaviour of your application, and a short intro on security.
  • Learning SQL

    • You'll be hard-pressed to build an application without any sort of "storing my data somewhere" kind of feature, thankfully the journey from learning SQL is a much simpler/shorter one than a programming language, as most of the code you'll learn from one relational database can be ported directly into another without changes. This book will cover from the very basics up to more advanced concepts, and should leave you confortable with writing queries and designing the structure of the data to be stored.
  • NoSQL Distilled

    • Now that you know SQL, how about No? This is a much shorter book that should give you a basic understanding over different types of databases, aside from the SQL ones, their usages, pros and cons, and when should you prefer one over the other. This book might be a bit tough for you at this moment, but give it an honest attempt nonetheless and we should go back to it once we get through some more content.
  • Scalability & System Design for Developers

    • Your task is to build the next Facebook, where do you start? You're in charge of designing Uber's backend, what will you take into consideration? On this series of courses you'll take the fundamentals you've learned previously and apply them to the real world to solve complex problems and pass interviews at top companies.

Web development

HTML/CSS

  • Build Responsive Real World Websites with HTML5 and CSS3
    • Here we'll learn the basics of HTML and CSS. This course will cover most of what you need to know about creating web-pages and how to style them (the bane of all developers including those at the front-end). There isn't logic involved in this one, but there is a lot of practice involved in gaining enough muscle-memory to position your elements and customize them to your (or your clients) liking.
  • CSS - The Complete Guide 2022
    • This is a much more comprehensive course on CSS which should get you covered on flexbox and grids as well as best practices and implementation details of CSS, mobile-first design and an introduction to animations and transitions.

MVC Framework

Rails
  • Agile Web Development with Rails 7
    • We're finally going to see some real-world action! Rails is a web framework that inspired most of the most famous web frameworks out there, such Laravel for PHP, Django for Python, Phoenix for Elixir. Here you'll learn about the MVC pattern, REST, migrations, background jobs, mailing, testing, ORMs and a bit of JavaScript. All of these concepts will carry over to whichever application you'll work with in your career and will make your transition to other frameworks a breeze, it's also at this point where you'd be taking the initial steps outside of the fundamentals and into the job market (as a full-stack developer).

Frontend

JavaScript
  • The Complete JavaScript Course 2021: From Zero to Expert!

    • "What, a Udemy course for a programming language?" Yep, if you want a reference book be my 708-page guest! this course should give you enough of an understanding of the language, main features and usages, it's a bit different from Ruby but you should have had a taste of it on the Rails book. Javascript is an ubiquitous language which you'll work with throughout your career no matter if you're on the front-end (which we'll begin covering here), back-end or database admin side of development.
  • React - The Complete Guide (incl Hooks, React Router, Redux)

    • Learn how to make modern Single Page Applications with React, currently the most popular frontend component library on the market and a possible building block should you want to learn other libraries such as Vue and Angular in the future.
  • React Avançado: Crie aplicações com NextJS, GraphQL e mais

    • This is a buzzword-heavy course, here you'll learn the skills to work with the cutting-edge on the front-end, at this point you should feel confortable interviewing for a Jr developer position! Woohoo! Money!

Backend

Go
  • Learn Go With Tests

    • Enough color and happines in your life, back to the backend. This time around we'll learn Go (with tests!), this is a fast-growing programming language that was designed to be easy to learn, fast, and provide a sane way to dealing with concurrency (we'll learn some of it here).
  • The Go Programming Language

    • This is Go's reference book, once you are comfortable with its usage and syntax from the previous online book, it's time to stretch your legs with a well-written reference book that goes into the nitty-gritty of what makes Go tick.
  • Concurrency in Go

    • You should have had a taste from concurrency with the two previous books, but here we'll learn more about the fundamental aspects of it, and how to employ them in the real-world where performance matters.

🚧 WIP section below 🚧

Microservices

DDD
Distributed Systems
Communication
Caching
Patterns

Infrastructure

Virtualization
Containers
Continuous Integration
Monitoring
Cloud Platfoms

Advanced Topics

Programming Systems
Compilers
MongoDB

Interview Preparation

Technical

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment