Learn Software Engineering

Self-Directed Guide to Software Engineering

Created by Tim Lisiecki

Start learning software engineering on your own! Begin by learning web development fundamentals and move on to more advanced software engineering topics and concepts. This guide is a curated collection of online courses and helpful resources from different mediums covering various topics needed to become a successful software engineer.

👇 Scroll to Get Started!

The purpose of this guide is to introduce the topics and concepts needed for teaching yourself software engineering, specifically full-stack JavaScript engineering. There are many ways to learn software engineering other than pursuing the traditional Computer Science degree. One of the great things about the internet is the endless amount of information you can find about anything.

The main reason I am putting this guide together is so I can use it while teaching myself full-stack JavaScript engineering. However, there are many aspiring developers and engineers in the same position as me, so I wanted to make something that others could not only use, but also expand and/or make their own. This guide is open-sourced on Github for others to contribute to, or to clone in order to customize for thier own use. In my few years teaching myself web development, I have found it difficult to find the important information needed to teach myself. In other words, "you don't know what you don't know". After reviewing many software engineering bootcamps and CS degree programs, I noticed a lot of similarities between them, specifically the gaps of information I was lacking in self-directed learning. Another reason I put this together is that there is a lower barrier to entry in software engineering with a trend of self-taught programmers on the rise (see #8 in this article).

In this guide I do refer to both "web developers" and "software engineers". Although many people use these titles interchangeably, I believe that they are different from each other. I agree with this article's definition of each:

Web Developer - As a general rule web developers primarily work with websites, as opposed to building an application that would run on your computer (like Slack or Spotify, etc). If you are a web developer, you're probably working as either a frontend, backend or full stack developer (read What is a full stack developer to learn more).
Software Developer/Engineer - This title covers a larger range of skill sets / possible roles. While it can refer to designing, building, and maintaining software and applications, but it has also been used when referring to web developers. Often using the term “engineer” implies you have a deeper knowledge of computer science topics (such as data structures and algorithms).

I believe if you want to teach yourself software engineering of web applications, it is important to first learn and gain experience in web development.


Before you get started, it is important to note that this guide is not for everyone. This guide is geared towards the aspiring developer/engineer that has the capability, discipline, and (most importantly) the motivation to teach themselves software engineering. There are other ways to learning software engineering from expert instructors, like enrolling in bootcamps or taking the traditional route to earning a Computer Science degree. So if you need that type of direction for you to succeed in learning, this guide may not be for you, unless you want to use this as a supplement to a bootcamp or CS degree program. However, enrolling in a bootcamp or CS program can cost thousands of dollars. This guide is an alternative for those who seek to save money (not all courses linked in this guide are free, but they are very affordable with discounts applied) while also covering the topics and concepts needed to be a successful software engineer.


Before jumping into the topics and concepts, I wanted to share some tips and advice I wish I had when I first started teaching myself web development... advice that I will use when teaching myself software development. This can actually apply to self-directed learning in general in most cases.

My two most important pieces of advice is focused on your mindset and approach to self-directed learning. Looking back, I had the wrong mindset and approach when I first started learning web development, and it definitely effected how efficiently I learned along the way. I eventually was able to get a job as a web developer, but it took longer than I would have liked.

Mindset

A lot of bootcamps and online courses (along with some that I suggest in this guide) may state that you will be able to get a job after completing their bootcamp or course. When I first started learning web development, I took it almost as a guarentee since I was new to everything. My end goal was to get a job as a web developer, and at the time, was laser-focused on that end goal. The problem with this mindset was that I was too focused on the end result, and when that happens, I started to take shortcuts while taking the courses. Taking shortcuts worked in moving through the topics quickly, coding along with the videos, but I did not get the deep understanding of the fundamentals that I should have. I had both a false confidence from breezing through the courses, and imposter syndrome (that every developer gets) when trying to attempt coding on my own.

The right mindset is having the end goal of becoming a successful developer or engineer, but your focus should be on getting a deep understanding of at least the fundamentals, if not all the topics and concepts, along the way to achieving that goal. As this article states, "Ordinary People Focus on the Outcome. Extraordinary People Focus On the Process".

Approach

Another important piece of advice is to have the right approach to self-directed learning. When I first started to learn to code, I believed finishing one online course would land me a developer job right away. I would rush through a course, and immediately start applying to as many jobs as I could. The projects on my Github were mostly code-alongs from the videos of the online courses. It's not surprising that I did not hear back from the jobs I applied to, and with the ones I did hear back from, I did not make it far in the interview process. You don't learn much by coding along with someone else. You learn by trying to do it yourself, which involves some struggling along the way (which is part of the learning process). I also recommend taking multiple courses, even if each course covers the same topics. This helps reinforce the fundamentals, and also introduces you to new ways and techniques in coding since each developer codes differently. It also allows you to work on different projects to build on your skills.

The right approach involves consistently putting in the work to practice and understand the topics that you have learned. Develop a routine or system that works for you and stick to it. Also, no single course is going to teach you enough to land a developer job; however taking multiple courses will give you the chance to learn and reinforce the fundamental skills in different ways.

Bringing It Together

Having the right mindset and the right approach will be key in self-directed learning. Since I have realized this, I completely changed how I teach myself new things, not only in software engineering. With the right mindset and approach, I have started to get into a system (as of writing this, it has been a few months into COVID 19 pandemic, so there's more time to focus on learning). I start my week day mornings reading a Javascript or software engineering-related book (see below for a list of books) from ~ 8am - 9am; I then start my day at my full-time job (luckily doing web development, so I am able to apply things I learn in real life) from 9am-5pm; I end my week days with about 1-2 hours of continuing courses, reading resources, and coding. I also spend a few hours each weekend continuing courses, reading resources, and coding. I devote about 15-20 hours to learning each week in addition to working at least 40 hours each week. But this is how I feel works for me when teaching myself. You will definitely have a different routine or system that works for you.

Other Tips

  • Take your time. It's better to take your time to really learn the fundamentals than to rush through only skimming the topics. It's worth it to spend months building a strong foundation of skills opposed to barely knowing enough to get by.
  • Take a break if you feel frustrated. Coding is hard. Sometimes taking a break and doing something to clear your mind helps you return with a different mindset, making it easier to debug any issues or work through a problem.
  • Learn (and code) in sprints. Don't try to learn as much as possible in a long peroid of time. To productively learn, stick to short bursts of focused learning or coding, anywhere from 30 minutes to 2 hours. Take a short break after each sprint to clear your mind, then continue onto the next sprint.
  • Consistency + Frequency. Its important to consistently and frequently dedicate time to coding. As with anything in life, the more you practice, the better off you will be.
  • Practice, practice, practice. When you learn something new, give it a try for yourself. Try to build something small and see how it works when you do it. The more you practice coding, the better you will be in the long run.
  • Learn to know what to Google when you run into issues. Knowing what to search for specifically when issues or bugs arise is a very important skill that can save you a lot of time and headaches.
  • Immerse yourself in the world of development. If you want to seriously become a developer, surround yourself with all things development. Follow dev related accounts on social media, subscribe to dev related email newsletters, and join developer meetups. I share a few helpful links below to get started, including some social media accounts I follow. In a world where development and engineering is constantly evolving, you have to constantly be staying aware of new updates and trends.
  • Contribute to open source projects. The best way to practice your skills as well as collaborate with other developers' code is to contribute to open source code on Github. I share some resources later on in this guide to help you get started.
  • More to come ...

Here are generally helpful resources. It may be helpful to bookmark some of these links to easily reference. More resources will be shared later on in this guide when applicable to the topic.

Quick References

Videos

Books

Articles

Social Media

Here are some links to social media accounts to follow that are helpful for web development and software engineering

Reddit
Instagram
Twitter
Most likely anything related to web development and software engineering has a Twitter account. I suggest following popular frameworks and libraries, any technology you use frequently, and any developers that have a large following.
  • More to come ...

Here's a list of courses I have either already taken, am currently taking, or will be taking in the near future. I have put them in a suggested order on where to start. Most courses' topics may overlap, but it is helpful to get repitition as well as different perspectives. Also, the first course covers all topics at a high level. The other courses typically focus on a specific topic more in depth. Most of the courses are on Udemy, which frequently has flash sales on courses as low at $10 per course. I recommend waiting for those flash sales, then purchasing multiple courses at once. The projects you code in the courses are great to use as jumping off points to expanding your knowledge of what you just learned. It is okay to use the projects from these courses in your portfolio as long as you make it your own. You need to show that you can actually think like a developer or engineer, not just show that you can follow along with someone else.

  1. The Web Developer Bootcamp by Colt Steele | Udemy
    Note: This course is highly recommended. It covers everything from basic HTML and CSS to building full-stack applications at a beginner's level.It's really great to get a full picture of how web apps work and what it takes to become a developer.
  2. Git a Web Developer Job: Mastering the Modern Workflow by Brad Schiff | Udemy
  3. The Complete JavaScript Course 2020: Build Real Projects! by Jonas Schmedtmann | Udemy
  4. ES6 Javascript: The Complete Developer's Guide by Stephen Grider | Udemy
  5. Become a WordPress Developer: Unlocking Power With Code by Brad Schiff | Udemy
    Note: If you get to this point, you should have the skills to be a web developer. I recommend taking this course since most webiste use Wordpress. You also learn some PHP and other useful skills.
  6. React For The Rest Of Us by Brad Schiff | Udemy
  7. Node.js API Masterclass With Express & MongoDB by Brad Traversy | Udemy
  8. JavaScript Algorithms and Data Structures Masterclass by Colt Steele | Udemy
    Note: This may be one of the most important topics in software engineering. Most of the courses I have taken so far have not even mentioned this topic in depth.
  9. The Complete Junior to Senior Web Developer Roadmap (2020) by Andrei Neagoie | Udemy
Extra Courses
  1. Javascript30 by Wes Bos | Javascript30
  2. Watch and Code® by Gordon Zhu | Watch and Code
  3. Deep Dive Into Modern Web Development | Full Stack Open
  4. COD3 | COD3
  5. Microservices with Node JS and React by Stephen Grider | Udemy
  6. Deno: The Complete Guide Zero to Mastery by Andrei Neagoie, Adam Odziemkowski | Udemy
Interactive Courses

The following sections provide more specific resources and project ideas to expand on topics covered in the above courses. Use these as supplements to the courses in order to strenghten your understanding. The courses do a good job introducing many topics, but the resources below help solidify your understanding.


This section is to learn or review the basics of web technologies and workflow.

By far the most important topics to learn and have a solid understaninding of their syntaxes and how they work. At the very minimum, a website needs HTML for structure, CSS for styling, and Javascript for functionality.

Resources


Any developer needs to know at least the basics of using a computer's command line.

Resources


Resources


Resources


Project Ideas

  • Simple Javascript Game: Build a simple Javascript game like "Rock, Paper, Scissors" to get used to coding using logic and/or rules. It is also a good way to learn to how HTML, CSS, and Javascript all works together.
  • More to come ...

Advanced topics and concepts as well as basic backend.

Resources


Resources


Resources


Resources


Resources


Resources


Contributing to open-sourced projects can not only help you put your skills to the test, but also show your ability to collaborate on other developers' code.

Resources


One of the most underrated engineering skills is documenting your code. Your code may make sense to you (at the present), but it will be way more powerful with clear, concise documentation for users and other developers.

Resources


Project Ideas

  • Knight's Tour Algorithm: A knight's tour is a sequence of moves of a knight on a chessboard such that the knight visits every square exactly once. ... The knight's tour problem is the mathematical problem of finding a knight's tour. Creating a program to find a knight's tour is a common problem given to computer science students.
  • More to come ...

Once you are comfortable with the fundamentals, move on to frameworks and libraries for rapid development.

Resources


Resources


Resources


Project Ideas

  • Refactor Personal Website: Use your personal website as a starter and refactor it to use React for the front end and Wordpress as a decoupled backend.
  • More to come ...

After learning enough to become a front end developer, learn the back end more in depth.

Resources


Resources


Resources


Resources


Resources


Project Ideas

  • Create your own API: Use Strapi to create your own API to use.
  • Build your own full-stack web app: Create a simple web application that users can sign up/login (should use authorization and authentication), create a profile, create/read/update/delete posts, and connect with other users. Aim to use as many skills you can up to this point.
  • More to come ...
If you like how the guide looks, I used CodyFrame framework by CodyHouse. It uses some really cool UI components so check it out for your next project!