The Advanced Software Design Course

Learn years of software intuition in weeks


Bryan Andrade, CTO, Atlas Health

Bryan AndradeDon’t repeat yourself. Don’t use magic numbers in your code. As experienced developers, we’ve all heard advice like this. We have decent intuition for “good” code. After watching Jimmy’s Strange Loop presentation and his explanation of citrus advice, I realized that much of the software design tips available have some truth embedded in them, but are imprecise. There are deeper truths for those who want to find them.
Jimmy created a set of principles that we can use to build better software. From his principles, advice like those above can be derived and understood. The course is challenging, but Jimmy will go out of his way to make sure you grasp the material. After the first week of the course, I noticed improvements in my code. By the middle of the course, I was more aware of all the decisions I was making when writing code, and I started changing some of my old habits.
I particularly enjoyed the refactoring exercises and one-on-one coaching sessions. If you are committed to improving your software design skills, work with Jimmy.

John Tran, Tech Lead, ONEHOPE Wine

John Tran

Become a better engineer

Write clean code with minimal risk of bugs

Be the person on your team who can explain why a design decision will save your team hundreds of hours, months or years down the road

Explain in clear terms the reasoning behind why some piece of code 'feels better' than another

Join over 250 professional software engineers

Apply to the Advanced Software Design Course

I’m Jimmy Koppel, and, six years ago, I set out to create a better way for people who could already code well to become masters of their craft.

One of my first clients went from a major career setback right before we started to competing offers from Google and Facebook after four months working together – and Ivy-League grads looking up to her after another four. Another was a brilliant startup founder with a CS degree and over five years experience; after witnessing how our sessions improved his code’s modularity and architecture, he came out saying

I wish I had started working with Jimmy sooner.

Stephen Balaban, CEO at Lambda Labs

And now I want to help you! I’ve taken the intuitions that top engineers use to build robust and maintainable systems and turned them into principles that can be taught and drilled much faster than learning by experience. Now I’ve streamlined this material, tested it on live audiences, and turned it into a course to help bring you to your dream skill level.

This course is not a replacement for hard work and is not a guarantee of success. It is a shortcut to understanding the deepest levels of software engineering.


What You'll Learn

Unit 1: The Hidden Layer of Logic

  • Why design is conceptually different from implementation, and what this means for building robust code.
  • How it's possible for code that never fails to still contain a bug.
  • Understanding how code that looks simple may actually be complex, and how to avoid writing code likely to break in the future.
  • Hoare triples, a simple method of specification that lets you see complexity as concretely as the code itself.
  • Bonus topic: The defect/infection/failure model of bugs and what Hoare triples have to do with debugging by printouts.

Unit 2: The Embedded Design Principle

  • Understanding that code can be mechanically derived from a design, and how this perspective de-mystifies system design.
  • Using the Embedded Design principle to better structure your code.
  • Understand the most general forms of couplings. Learn to to spot and eliminate hidden coupling, and prevent 10-minute tasks from becoming 100-hour tasks.

Unit 3: The Representable/Valid Principle

  • Understanding how to partition the state space of code and reduce the possibility of failure
  • How to design data structures and APIs that cannot be misused.
  • How to design code that contains zero error-checking, but is less likely to fail than even the most defensively-written code.

Unit 4: The Data Over Code Principle

  • Parnas’s 40 year-old "secret" of information hiding.
  • How to use information hiding to make your code more modular and easier to extend.
  • How organizing your program around data structures can make your code cleaner.
  • How an extreme application of this principle can help you understand systems 3x more quickly.

Unit 5: Algebraic Refactoring

  • Understanding sum and product types, and how common data structure patterns in most languages are just special cases of these two fundamental constructs.
  • How most common refactorings are special cases of a handful of rules.
  • How refactoring a program can be isomorphic to factoring polynomials in algebra.

Unit 6: Future-Proofing Code

  • Learning to spot and sequester the assumptions in individual lines of code.
  • Using the Liskov substitution principle to make your code compatible with future versions of itself.
  • Using the theory of subtyping to anticipate and avoid “complexity ratchets” that could make your code treacherous to modify in the future, and impossible to clean up.

More Than Just a Course

Education research shows lectures are not enough. I'm committed to your learning, and that's why I'm making this more than just a course.

Access to my curated library of readings

I've gone through thousands of articles online and hundreds of academic papers to find the few with insights about the general art of software design. And when I couldn't find anything that explained a topic well, I wrote my own. I'm giving you access to all of these.

Exercises and case studies

Between sessions, you'll be given exercises to drill in the concepts and samples from large projects to critique, so you can apply your learnings to real-world software.

Personalized feedback

Rapid and targeted feedback is a general principle that can help you learn anything 3x faster. I read every submission and give individual comments so you can know you're getting the material.

Two 30-minute 1-on-1 sessions with Coach James Koppel

That's right, two 30-minute 1-on-1 sessions with ICF-certified coach James Koppel, one at the middle of the course, and one at the end. I'll use my hundreds of hours of experience working 1-on-1 with professional engineers like you to help you be the best engineer you can be.

Is this course for me?

Are you a junior or mid-level software engineer who wants to build systems that take little effort to maintain, and where adding new features is a pleasure? Then this course may be the right thing to jump you to the next level?

This is not a beginner's course. I designed it for engineers with at least one year of professional experience, and I'll talk with you 1-on-1 before the course to make sure that it's right for you.

If you already have a proven track record of designing systems so that it’s hard to make a mistake in the implementation, or if you routinely show teammates why their code will fail in a year, then you may find this course a nice way to put a more principled perspective on intuition you already have. You may also find the exercises too easy. But, in that case, you might be a great fit for my 1-on-1 coaching, where I'll teach even more advanced material at the pace you desire.


We teach skills which are more fundamental than any particular language or framework. Still, all examples will be in C, Java, or Python, and you should be somewhat comfortable with the syntax of all three.

This is a course for professional software engineers. For homework, you will need to be able to understand code samples from open-source projects we give you to critique, and you will need to be able to reflect on code that you’ve worked with in the past.


The class will meet in webinars every other week for 6 total lectures. Each of the 6 units comes with additional readings and homework, with the last set of homeworks due two weeks after the last lecture.

The webinars will be held from 1100 to 1200 US Eastern Time. All webinars will be recorded; attendance is optional but strongly encouraged. There will be an interactive component.

Here’s that in several timezones:

LocationFirst lecture (lectures every two weeks, same time)
San Francisco
New York

In homeworks, you will be asked to design programs, or critique an existing program, but not implement new programs. You will get personalized feedback on all assignments. Students typically report spending 5-8 hours a week on the homeworks, though we've heard reports as low as 2 hours/week and as high as 16 hours/week depending on experience.

Every attendee will also be offered two 30-minute one-on-one sessions with me.

Like everything, what you get out of this course is what you put into it. Every week comes with mandatory assignments, but there's several times more exercises for the truly dedicated.

I'm interested, what now ?

Glad the course has piqued your interest. Maybe you have more questions or want to get started immediately!

Whichever it is, let's start with a meet and greet where we can get to know each other a bit, answer any questions regarding the course, and see if we are a good fit for each other.

To move forward, fill in the form below, and we will set up a video call at a time that suits you.

See you soon!


Next course:
TBD; Register interest, and we will let you know

Register your interest in the course

    Act Now

    Since I started helping engineers years ago, I've been amazed at how many already-good engineers are still seeking to improve, and how few resources there are to help them at the higher levels. Even still, I can only offer 20 spots in this course, and several of them filled up before I had even announced this course publicly. The first time we ran this course, we got over 2 applications for each spot, so move fast.