Shortest Path Academy

A free, comprehensive course.

Michael's shortest path to full-stack development.

Introduction
Starting Journey
Quick Summary
This is the course I'd want if I were new to programming and web development.
About This Introduction
This introduction gives a historical perspective on how we arrived at the current explosion in programming languages, frameworks, and libraries, and how there might seem like an impossible amount to learn for someone new to programming, and web programming in particular.
It then goes on to describe how this course helps you manage this avalanche of choices by focusing on the fundamentals that apply across languages, while still giving you real, concrete practice with multiple programming languages and web technologies.
The Tyranny of Choice
In 1982, at age 14, I taught myself to program on an Apple ][ computer with 64k of memory, of which 48k was available for programs. (The image of the two hikers above, in a highly compressed, lossy JPG format, is just about 48k.) I programmed in BASIC, and when that proved too slow to make "real" games, I learned assembly language.
There was no internet. Learning was from books. And if you wanted to use a clever piece of code that someone else had written, you copied it character-by-character from a book or magazine article. It was hard, but it was also easy. There were so few choices that it didn't take long to learn everything, and programmers spent almost all of their time being creative with the limited tools they had, instead of trying to keep up with an avalanche of tool choices.
In 2004, when I started a job at Amazon and was coming up to speed, belatedly, on web programming, things were completely different. Front-end programming was in JavaScript. Back-end programming and offline processing was in C, C++, C#, Perl, Java, or PHP. Python was becoming popular.
Aside from all these language choices, two even larger trends were growing, making things both easier and harder for programmers. First, lots of code examples and code libraries were becoming available. C++ programmers were expected to know the Standard Template Library, which offered stable, optimized implementations of common data structures and algorithms. (Java and C# had similar built-in libraries.) Specialized libraries of all kinds offered code to solve hard problems like the internals of 3D games, matrix and other math computations, geometrical algorithms, XML processing, data storage, and many others.
Secondly, more and more elaborate web frameworks were gaining popularity. Starting from simple substitutions of values into HTML pages with early versions of PHP, frameworks like ASP.NET and Ruby on Rails added more and more server-side features to handle web requests according to common patterns and best practices. The idea was that following such patterns avoided reinventing the wheel, prevented errors, and made codebases understandable to anyone familiar with the given framework. But for programmers, frameworks also meant more to learn, and more to debug if the framework wasn't doing what you expected.
In the last 20 years, libraries and frameworks have continued their explosive growth.
Programming vs. Shopping
As a new programmer or web developer, it's hard to know what language to focus on first. You hear that some languages are harder, some easier. But what do employers want? Plus, the choice of language determines the available choices for web frameworks. There are mature web frameworks based on Python, PHP, C#, Node.js (back-end JavaScript), and other languages. What are the pros and cons? Which would make you most employable?
In addition to the major choices of language and framework, there's also a seemingly infinite list of libraries for doing any significant piece of work: libraries for caching, message passing, XML and JSON parsing, reading and writing graphics files, doing math and geographic calculations, working with dates and times, and much more. In some cases, languages come with certain libraries built in. In other cases you link your program with a library from a third party. Because it is a common stumbling block to build and integrate third-party libraries correctly, there are elaborate package-management tools for gathering and building these dependencies and keeping them up to date as the library makers add features and fix bugs.
In short, modern programming can feel more like shopping than creating. And it makes sense: why reinvent the wheel if someone has already made a library or framework that does the thing perfectly and has been thoroughly tested? On the other hand, this can lead to paralysis, weighing and reconsidering each option, searching for some perfect option that might exist out there and has all the features you need, reading reviews, watching tutorials. It can go on forever. Any time you want to do anything, there is a pause to wonder, should I shop first? Should I find an existing framework or library? Should I use a framework or library that meets my needs but is bloated with stuff I don't care about? Or should I just write it myself (possibly with AI assistance) and risk making something incomplete and with errors?
Tutorial Hell ("Okay, but how do I actually write programs?")
Tutorial Hell refers to a state you can get in from reading or watching too many tutorials. In one video after another, a kind expert guides you through the features of a language or framework. They show you how a for loop works, or how to use a certain CSS property. Or they patiently solve a data structure/algorithm (DSA) problem. The videos are accurate and generally well made. The teachers are patient and clear. You understand it all.
And yet, when it comes to putting it all together in a simple program, you don't know where to start. Perhaps all the information you've learned is in your head, but disjointed. Perhaps you don't quite know how to set up the tools. More fundamentally, you feel you don't know how to "think like a programmer." So you watch another tutorial.
About this Course
I feel badly whenever I see that learning programming is not fun. For me, programming always was and still is fun. When I started programming, I didn't care if I was doing it "right" or what others might think of my code: I just had things I wanted to make and I was more than happy to make them in Applesoft BASIC, which in hindsight is an incredibly deficient language. Still, I took pride in iteratively improving my code, and I learned a lot about programming in the process.
Today, because there are so many tools and so many "best practices" imposed either by the tools, or by the opinion of experts, it can feel like there is very much a "right" way to program, and understandably learners want to know the best language to learn, the best framework to use, and the best/right programming techniques. And I know you're impatient to get through it so that, knowing all the proper tools and techniques, you can finally get creative, build things you want to build, or work at a job where you feel mastery as you help create the future.
The goal of this course is to help you get there by following what is, in my opinion, the shortest path.
Even though I call it short, you might feel it's actually not so short, because I spend a lot of time making sure you get a solid grounding in what I consider the most important concepts. If you look over the table of contents, you'll see that some of the topics have an infinity symbol in the upper-right corner, and some don't. The ones without the infinity symbol are more factual. They involve novel concepts that can be tricky to understand, but once you get them, you get them. On the other hand, the infinity symbol means, "This topic is one you never really finish learning." These are topics where you will continue to practice throughout your career. I have tried to give enough, and deep enough, exercises and projects in these topics to give you a solid start.
There are also a lot of concepts and tools I don't cover in detail, because I don't think they are very important for you right now. In some cases there are tutorials out there than can explain them well, if you are interested. In other cases, they are important things to learn, but they are not required to get things done. I think you can learn about them after you get some mastery over "plain programming."
To summarize, I hope, first, to give you the facts and basic concepts as quickly and efficiently as possible, focusing especially on those that I found confusing when learning them. Second, for the more difficult, more subjective, more creative skills, I hope to give you a solid foundation and a feeling of competence.
My Opinionated Approach
This course reflects some important biases I have, opinions that are not necessarily shared by other programmers and teachers. Please consider these carefully when deciding whether or not to embark on this course.
Some Answers
To answer the two questions we started with:
The real work in learning programming is what I call "plain programming," along with a bit of "data structures and algorithms." For web development, there is a huge amount of factual information to learn, especially about page layout with CSS. But almost nobody fails to become a front-end programmer because of CSS. But they do fail because of JavaScript, because they never really got good at plain programming. I try my best in this course to really help you learn to "think like a programmer" in any programming language.
What about AI?
I don't believe anybody really knows what's going to happen with AI and programming in the medium and long term. In my experience, at present, AI has trouble writing a complete program, even if you specify the requirements very clearly. But it can do a decent job, getting a lot of it right, and it's getting better every month (or every week, or every day, it often feels like). In my experience, at present, it is necessary for a programmer to review, understand, and fix up much of the code that AI writes. Further, in my experience AI does well when writing short programs from scratch, or inserting lines inside a function. But when it comes to making global modifications to a large existing program, it's hit-or-miss, and it will often get things wrong, sometimes messing up unrelated parts of the program that are not related to the requested change.
Here is how I currently use AI in programming, as of July 2025:
Of course, the big question for someone learning to code now, is whether the rapid improvements in AI make it pointless. If AI can now program better than an entry-level programmer, and soon better than most intermediate or senior level programmers, why learn to program? I don't have a definitive answer but my thoughts are:
About Michael
Michael Katz picture
Hi, I'm Michael Katz. I live in Seattle and spend a lot of time in Romania. (I know many programming languages but have been struggling with Romanian. I thought it might be about the same difficulty as Spanish, but I was very wrong.)
I have been programming since the early 1980s. I have worked for many years for the emergency response division of NOAA (part of the U.S. Department of Commerce) on emergency response software for hazardous chemical and oil spills. In the past I worked for a few different game companies, including Sierra Online (later Sierra Entertainment). I have worked on a few medical devices. I worked for a year at Amazon. I have passed many technical programming interviews, and have been a hiring manager myself. I have also done a lot of programming projects on the side, including a number of games for iOS and Android, and more recently some games and SaaS projects for the web.
I have a bachelor's degree in computer science from Brandeis University, and a master's degree in math, science, and technology education from UC Berkeley. I have done a lot of teaching and tutoring in both programming and math, for both kids and adults.