Sharing is caring

Here you find a list of the best resources I’ve come across to learn software engineering on your own. The resources include online courses, tutorials, Youtube channels, and books. Most of my software development experience is Python and Java-based, which is why most of the resources I’ve tested and recommend are based on Java and Python.

Disclosure: Some of the links in the following sections are affiliate links. This means I may earn a small commission at no additional cost to you if you decide to purchase. I could be an affiliate for many online education products. I’ve specifically chosen to partner with the providers of courses and books that I recommend based on my own experience. As an Amazon affiliate, I earn from qualifying purchases. By using my links you help me provide information on this blog for free.

Online Courses

I’ve compiled a series of Coursera specializations on software engineering listed in order from beginner to advanced. The first two specializations focus on software development fundamentals. If you have the fundamentals under the belt, I recommend getting up to speed with algorithms and data structures. The third specialization is great for that. Lastly, you need to understand how to use your programming skills to design and architect software systems. The instructors in the Software Design and Architecture Specialization do a great job at building this kind of understanding. After finishing these specializations, you should have a pretty decent understanding of the major topics and skills that make a great software engineer.

Object-Oriented Programming in Java Specialization
Level: Beginner
Prerequisites: None

This specialization teaches you the nuts and bolts of object-oriented programming, which is the foundation of solid software development skills. In a series of courses, you’ll work through the basics of Java syntax, data structures, classes, and principles of object-oriented design. It also teaches you how to use your IDE to debug your programs effectively. This is an extremely important skill that is often overlooked by courses that focus solely on the language.

Take the “Object-Oriented Programming in Java Specialization” on Coursera.

Java Programming and Software Engineering Fundamentals Specialization
Level: Beginner
Prerequisites: None

This is a great series of courses that takes you from a programming newbie to being able to build a complete Java-based web system. Some of the courses are the same as in the OOP in Java specialization. If you are not interested in the web stuff, I recommend taking the OOP in Java specialization.
The assignments are tough for a total beginner, and you’ll spend a lot of time doing research on StackOverflow. But that way you’ll learn much more effectively and thoroughly.

Take the “Java Programming and Software Engineering Fundamentals Specialization” on Coursera.

Algorithms Specialization on Coursera
Level: Beginner-Intermediate
Prerequisites: Basic programming skills, preferably in Java or another statically typed language.

The algorithms specialization gives you a great understanding of common algorithms for searching, sorting, graph traversal as well as data structures such as stack, queue, and heaps. You will develop a thorough understanding of when and where these algorithms are appropriate and learn to analyze their runtime efficiency. If you internalize the concepts taught here you’ll be in a great position to succeed at interviews for competitive software engineering jobs.

Take the “Algorithms” specialization on Coursera.

Software Design and Architecture Specialization
Level: Intermediate
Prerequisites: A basic understanding of object-oriented design and programming experience in Java or another statically typed language.

Once you have some programming experience, you also need to learn how to write clean code and design a system to be an effective developer. The software design and architecture specialization introduces these skills through a series of courses. I found it very rewarding, especially if you are a junior developer and want to understand the next higher level.

Take the “Software Design and Architecture Specialization” on Coursera.

Books

The books can be purchased on Amazon or through most other booksellers.

Cracking the Coding Interview
Level: Beginner
Prerequisites: Basic programming experience in Java or another statically typed language. Previous exposure to data structures, algorithms, and object-oriented design is helpful.

If you want to get a junior software engineering job, especially at a prestigious firm like one of the FAANG, this is your bible. It heavily focuses on data structures and algorithms, program efficiency, and object-oriented design.
I’d recommend reading this book and doing some of the exercises for all beginner software developers.

Clean Code
Level: Intermediate
Prerequisites: A decent understanding of object-oriented design and programming experience in Java or another statically typed language.

A timeless classic that, for me, was of tremendous help to make the jump from rookie programmer to professional developer. The author, Robert Martin, is an intellectual heavyweight in the software engineering industry. He lays out a set of practices and principles on how to write good code and beautifully illustrates them with examples in Java. This book is so valuable because it points your attention down to a lot of things that you are probably not aware of when you are a beginner or even intermediate programmer. For example, it wasn’t initially obvious to me why functions should only do one thing and shouldn’t return null from a function. But once I got to building larger object-oriented systems, I very much cherished Martin’s advice.

Code Complete
Level: Intermediate
Prerequisites: A basic understanding of object-oriented design and programming experience in Java or another statically typed language.

Code Complete is another timeless classic for software engineers at pretty much any level that teaches language-independent best practices and how to plan, structure, and construct software systems in general. If you want to make the jump from developer to software architect, this one should be on your bookshelf.

Refactoring
Level: Intermediate
Prerequisites: A basic understanding of object-oriented design and programming experience in Java or another statically typed language.

Refactoring is the practice of changing your code without changing its functionality. This is an extremely important skill for any software developer because you can never anticipate and plan out what your code will look like before you start programming. You will often be in a situation where you need to restructure your program so you can add further functionality. This book by Martin Fowler, another software engineering luminary, teaches you this essential practice.

Design Patterns
Level: Intermediate
Prerequisites: A basic understanding of object-oriented design and programming experience in Java or another statically typed language.

Design patterns are a set of best practices to address common problems. Even though the software industry is changing rapidly, many of the challenges haven’t changed very much. Design patterns encapsulate the wisdom of the most experienced developers on how to address these problems.
This book is another one you should read once you have some object-oriented programming experience and plan to become a professional developer.

Blogs and Youtube Channels

Baeldung

Baeldung is a blog and online platform that covers pretty much anything related to Java. If you have a specific Java problem, you will probably find the answer here.

Martin Fowler

The author of Refactoring has a blog where he shares his thoughts related to software design and architecture. His insights are worth gold, and when I’ve been stumped and wasn’t sure on how to structure a system, I often found guidance here.

PythonProgramming & RealPython

PythonProgramming & RealPython are for Python what Baeldung is for Java. Both sites offer tons of free blog posts, coding examples, programming tutorials, and general advice on Python programming.


Sharing is caring