Self-Directed Guide to Software Engineering
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!
Introduction
About this Guide
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:
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.
Tips and Advice
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 ...
General Resources
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
- Web Skills - a collection of links on practically every skill related to web and software development. I highly recommend bookmarking this page in your browser and using it as a reference as you progress in your career.
- Web Development Fundamentals (Google Dev)
- Front End Handbook 2019
- Laws of UX
- DEV Community
- CSS Tricks
- Devhints
- 2020 Web Developer Roadmaps
- More to come ...
Videos
- How to Think Like a Front-End Developer
- New vs Pro coder pt-1
- New vs Pro coder pt-2
- More to come ...
Books
- Programming JavaScript Applications: Robust Web Architecture with Node, HTML5, and Modern JS Libraries by Eric Elliott
- JavaScript: The Good Parts by Douglas Crockford
- The Unicorn Project: A Novel about Developers, Digital Disruption, and Thriving in the Age of Data by Gene Kim
- More to come ...
Articles
- First Principles: Elon Musk on the Power of Thinking for Yourself
- If You Want To Achieve Your Goals 10x Faster, You Need to Stop Following Routines
-
The 2020 Web Developer Roadmap
Note: The roadmap is similar to this guide but with way more information and resources put together by a professional developer, however, I include articles about important soft skills that will help you progress as a developer or engineer. It will be helpful to use both my guide and this roadmap.
- Learn to become a Backend Developer - Roadmap to becoming a Backend Developer in 2020
- How to Learn Software Design and Architecture | The Full-stack Software Design & Architecture Map
- Lessons Learned from My Journey as a Self-Taught Developer
- 7 Skills of Highly “Effective” Programmers
- 10 Best Project Tutorials For Self-Taught Developers
- Learn From the Giants — Top Engineering Blogs You Will Benefit From
- More to come ...
Social Media
Here are some links to social media accounts to follow that are helpful for web development and software engineering
- r/HTML
- r/css
- r/Frontend
- r/javascript
- r/learnjavascript
- r/webdev
- r/Wordpress
- r/node
- r/expressjs
- r/reactjs
- r/learnprogramming
- r/eli5_programming
- r/SoftwareEngineering
- r/softwaredevelopment
- @jsnuggets
- @javascript.js
- @developerspace
- @javascriptmastery
- @thecodergeek
- @webdevofficial
- @webdesign.tips
- @real_css_tricks
- @comment_sense
- @coding
- @thecodingroom
- More to come ...
Courses
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.
-
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.
- Git a Web Developer Job: Mastering the Modern Workflow by Brad Schiff | Udemy
- The Complete JavaScript Course 2020: Build Real Projects! by Jonas Schmedtmann | Udemy
- ES6 Javascript: The Complete Developer's Guide by Stephen Grider | Udemy
-
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.
- React For The Rest Of Us by Brad Schiff | Udemy
- Node.js API Masterclass With Express & MongoDB by Brad Traversy | Udemy
-
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.
- The Complete Junior to Senior Web Developer Roadmap (2020) by Andrei Neagoie | Udemy
Extra Courses
- Javascript30 by Wes Bos | Javascript30
- Watch and Code® by Gordon Zhu | Watch and Code
- Deep Dive Into Modern Web Development | Full Stack Open
- COD3 | COD3
- Microservices with Node JS and React by Stephen Grider | Udemy
- 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.
1. Fundamentals
This section is to learn or review the basics of web technologies and workflow.
HTML, CSS, JavaScript
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
- HTML Cheat Sheet
- HTML Cheat Sheet - Devhints
- CSS Cheat Sheet
- CSS Cheat Sheet - Devhints
- Javascript Cheat Sheet
- ES6 Cheat Sheet - Devhints
Command Line Basics
Any developer needs to know at least the basics of using a computer's command line.
Resources
Git and Github
Resources
Troubleshooting and Debugging
Resources
- Chrome DevTools Docs
- Debugging Strategies You Can Use on Every Project
- 5 Steps to a Bullet-Proof Debugging Strategy
- Debugging Strategies Checklist
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 ...
2. Front End Development
Start Thinking Algorithmically
Resources
- A Beginner’s Guide to Algorithmic Thinking
- Data structures/algorithms for web devs?
- How to Think Algorithmically
- Breaking Down Problems Is the #1 Software Developer Skill
Engineering Techniques
Resources
- Web Engineering
- 4 Design Patterns In Web Development
- Design Patterns in Web Development
- Software Engineering | Project Planning
- ELI5: What is the "SCRUM" and "AGILE" work methodologies?
- Agile Project Management
- How to set up an Agile - Scrum Workflow in ClickUp
- Asana for Agile and Scrum
Intermediate HTML, CSS, and Javascript
Resources
- Building a Scalable CSS Architecture With BEM and Utility Classes
- 5 Principles that will make you a SOLID JavaScript Developer
- KISS, DRY, YAGNI and More. The 7 Acronyms Every Developer Should Know
- Introduction to the DOM
- 15 JavaScript concepts that every JavaScript Programmer must know.
- Frontend Development is Dead. Long Live Frontend Engineering!
- 5 JavaScript Tips to Make You a Better Programmer
- Airbnb Javascript Style Guide
Project Ideas
- Personal Resume Website: Start off by building a basic website for yourself. This can used as a resume site as well.
- Budget Calculator: Build a basic budgeting app. You can use 'localStorage' to save your budget month-over-month.
- More to come ...
3. Full Stack Development
Advanced topics and concepts as well as basic backend.
Data Structures
Resources
- The 4 Data Structures Every New Developer Should Know
- 8 Common Data Structures in Javascript
- Data Structures in JavaScript
Algorithms
Resources
- Recursive Functions in JavaScript
- Recursion
- Big O Notation in JavaScript
- Understanding Big-O Notation With JavaScript
- Understanding Big O Notation via JavaScript
- Algorithms & Time Complexity (Talking Big O like the Pros)
- Algorithms in JavaScript
- Here Are the Most Common JavaScript Algorithms and Data Structures
- Algorithms in JavaScript - 40 Problems, Solutions, and Explanations
- Algorithm Solving Techniques pt. 1
- Algorithms, Data Structures and Web Development
Advanced JavaScript and Engineering Concepts
Resources
- 12 JavaScript Concepts That Will Level Up Your Development Skills
- 33 Concepts Every JavaScript Developer Should Know
- 10 JavaScript concepts you need to know for interviews
- The Modern JavaScript Tutorial
- The Secret of Simple Code - How 10x Developers Produce 10x Value
- JavaScript SEO: What You Need to Know
- More to come ...
Node.js and Express.js
Resources
Database Interaction
Resources
- SQL vs NoSQL : MySQL vs MongoDB — The Difference
- Differences Between SQL & NoSQL Databases – MySQL & MongoDB Comparison
- SQL vs NoSQL: 5 Critical Differences
- More to come ...
Authentication and Authorization
Resources
- Authentication & Authorization in Web Apps
- The Most Common Authentication Methods in Web Application Development.
- How To Securely Implement Authentication in Single Page Applications
- Steps to building authentication and authorization for RESTful APIs
Open Source Code
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
Documentation Best Practices
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 ...
4. Front End Frameworks
Once you are comfortable with the fundamentals, move on to frameworks and libraries for rapid development.
Intro to Frameworks
Resources
- Airbnb React/JSX Style Guide
- React JS
- React Cheat Sheet - Devhints
- Redux for React: A Simple Introduction
Package Managers and Build Tools
Resources
- Gulp Cheat Sheet - Devhints
- Webpack Cheat Sheet - Devhints
- High-performance webpack config for front-end delivery
Design Patterns
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 ...
5. APIs and Back End Development
After learning enough to become a front end developer, learn the back end more in depth.
Back End Libraries and Frameworks
Resources
- Top 10 JavaScript Frameworks for Server Side Development in 2020
-
Deno.js
Note: As of this writing, Deno.js is relatively new. It is an alternative to Node.js, built by the creator of Node.js. It may be worth learning now as it starts to grow in popularity and competing with Node.
REST APIs
Resources
- Learn REST
- Understanding And Using REST APIs
- Learn REST: A RESTful Tutorial
- How to Build a RESTful API with Authentication in 5 minutes — all from your command line (Part 1)
- How to Build a RESTful API with Authentication in 5 minutes — all from your command line (Part 2)
Typescript
Resources
Git Workflows
Resources
- 5 types of Git workflows that will help you deliver a better code
- Comparing Workflows
- 4 branching workflows for Git
-
Development Workflow Best Practices (Version Control)
Note: This article focuses on Git workflow for Wordpress development, but it demonstrates a good workflow for multiple environments (Development, Staging, Production).
Advanced Debugging, Testing, and Documentation Techniques
Resources
- 5 Advanced Javascript and Web Debugging Techniques You Should Know About
- The 16 JavaScript debugging tips you probably didn't know
- The best unit testing frameworks for Node.js
- JavaScript unit testing frameworks in 2020: A comparison
- 19 Best Practices for Automation Testing With Node.js
- Javascript Testing Best Practices
- Node.js & JavaScript Testing Best Practices (2020)
- Software Documentation Types and Best Practices
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 ...
6. Extra Learning
Learn some of the more in demand skills as well as some cutting edge technologies to gain a leg up on the competition when applying to jobs.
GraphQL
Resources
Deno.js
Resources
Docker and Kubernetes
Resources
AWS
Resources
- Learn from AWS experts. Advance your skills and knowledge. Build your future in the AWS Cloud.
- Learn to Build on AWS
Advanced Accessibility
Resources
Microservices
Resources
Data Visualization
Resources
- Best JavaScript Data Visualization Libraries for 2020
- Beginner’s guide to build data visualisations on the web with D3.js
Learn Another Language
Resources