Introducing: James Koppel's Advanced Software Design Web Course

Learn To Build Great Software Like No One Else Can.

Do you want to level up as a software engineer?

Do you want to write clean code with minimal risk of bugs?

Do you want to 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?

Then this may be the course for you.

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 4 months working together, and Ivy-League grads looking up to her after another 4. Another was a brilliant startup founder with a CS degree and over 5 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.”

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 it’s not a guarantee of success. It is a shortcut to understanding the deepest levels of software engineering.

Advanced Software Design Web Course

Every other Thursday, starting June 23rd, ending September 1st, 2022
Register Now

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, starting Thursday June 23rd and ending September 1st. 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 Thursdays from 1200 to 1300 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:

  • San Francisco: 9:00 AM-10:00 AM
  • New York: 12:00 PM-1:00 PM
  • London: 5:00 PM-6:00 PM 
  • Bucharest: 7:00 PM-8:00 PM
  • India: 8:30 PM-9:30 PM
  • Singapore: 12:00 AM-1:00 AM (next day)

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.

Ready to Join?

Here’s what will happen:

  1. Fill out this short application below
  2. I will contact you and we will talk over video chat
  3. After determining that you are a good fit for the course, you’ll be officially signed up.

See you in class!


    Act Now

    Since I started helping engineers years ago, I’ve been amazed , 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.

    What others say

    Since 2016, I’ve made a big difference in many people’s lives through my 1-on-1 coaching. My goal for this course is to help 100x more people in the same way.

    From the Web Course

    Ned Nguyen, Staff Engineer, Google

    Ned Nguyen

    As a tech lead at Google, I have always been trying to improve my software design skills. I decided to sign up for Jimmy’s class after looking at the overview of its content.

    Jimmy is a fantastic instructor. He spends a lot of time reviewing my homeworks & answering questions. The reading materials & exercises are top notch. Before Jimmy’s class, I had vague ideas of how to write code “the right way.” After this class, I have a lot more clarity in terms of writing good code and designing better software. I find myself better at articulating my design rationale, and having easier time aligning people’s opinions on difficult decisions. My colleagues also said they noticed my code reviews are a lot more objective and convincing.

    John Tran, Tech Lead, ONEHOPE Wine

    Cameron Yick, Software Engineer, New York City

    This class far exceeded my expectations. Since completing the course, some aspect of his lessons have affected how I write my programs and code reviews every single day.

    Simply put, this is one of the best courses I have ever enrolled in, online or otherwise. The exercises and content for each of the 6 weeks are dense enough to fill a month of study. However, the core concept for each contains practical recommendations that were integratable into my code as early as the day after each lecture. I also really liked being guided through examples (and counter-examples) of the course’s recommendations in action in popular open-source codebases.

    I pursued Computer Science/Electrical Engineering in my undergraduate studies, and have worked in 2 technology startups. Each of the weekly topics were either completely new to me, or presented in “stickier” form than I had ever previously encountered. If you have wondered about what it means to make classes of bug impossible, or wanted to learn how to “drill” at software engineering rather than just hoping to learn from writing more code, this is the course for you!

    Aside from the high quality and actionability of the content, the other critical ingredient in this course is the personalized feedback from Jimmy. He is thorough, thoughtful, and skilled at guiding students towards not just the right answers to exercises, but also helping them to develop intuition and processes for solving similar problems in the future.

    Bryan Andrade, Software Engineer, Santa Monica

    Don’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.

    Jess Smith, Software Engineer, New York City

    Three great things happened because I took Jimmy’s course. First, I built a vocabulary for expressing my concerns about software design. This vocabulary, when applied to code smells, gives me related examples that can help generate specific failure modes.

    Second, I learned how to tell what debates about software are worth engaging in. Some debates are just taste, and some have deep engineering implications. This has sped up my reading because I can filter out a lot of noise.

    Third, I gained a sense of the larger world of software design. The course’s resources section has changed my views on design and software as a whole. I know that these articles will be a source of inspiration and knowledge for a long time to come.

    Andrew Edwards, Software Engineer, London

    The Advanced Software Design course has transformed the way I work. After the first lectures, I quickly began to see where software I had written could be improved. By the end of the course I felt confident that I knew exactly how, and why, to improve it. Recently, I’ve been interviewing for new contracts, and the knowledge I now have has helped make it far easier to impress. In particular, interview code exercises are easier as I can more easily come up with, and discuss, a design first, a method which has really helped to express my level of knowledge without getting bogged down in code level problems.

    I also feel that I now have a clear way to appraise and filter programming advice, something that’s invaluable in a fast moving industry. Thanks Jimmy!

    Nils Erikssson, Tech Lead, Discovery Networks

    Jimmy is a magician that reveals magic tricks. The course taught me the foundational principals of software in a way where I now can both express and use them. I think it has allowed me to skip years of trial and error, where the end result would have been intuition without explanation. If this was a Spanish class, Jimmy would be teaching you the fundamental grammar, not random vocabulary. Furthermore, the course gives you access to a great community of motivated software engineers and hand picked readings to help you continue your software engineering path to mastery.

    Azhar Desai, Software Engineer, Thinkst Canary

    This course should be renamed “Jimmy’s Finishing School For Software Wizardry.”

    Jimmy’s course has changed my day-to-day thinking about software design. It’s easier for me to reason and talk about how a line of code will hinder or help future code changes. I can motivate changes more clearly to others on my team when reviewing designs and code. The course replaced some unhelpful intuitions I had from several years of software engineering leaving a simpler, better fortified base. And did I mention how well-curated the course readings were? Unlike much writing on software design drifting about, these were rewarding to read closely.

    Tyrone Avnit, Software Engineer, Civic Technologies


    You can tell straight away that Jimmy has a deep passion for designing software and designing it well. The course can be challenging, but it pushes you to be a better software engineer by forcing you to think more carefully about every design decision you make. The carefully curated resources that James provides are alone worth taking the course, but for me it was the little spark it triggered inside. I have a deep passion for learning, and this course has given me the confidence and roadmap to go deeper and become that much better by working hard at it everyday.

    From the Weekend Intensive

    Josh Curtis, San Francisco

    Jimmy’s course was superb. It gave me a set of tools that I found immediately helpful in articulating the drawbacks of certain decisions in the code base and data models I work with. Before, I only had vague feelings that something was off but had trouble saying exactly what or why. The concepts from the course continue to be useful whenever I’m writing code or reviewing a PR. Somewhat surprisingly, it increased the satisfaction of reading and writing code. Instead of writing a bunch of classes to implement feature X, I think of as many implementations as I can then try to think about the trade-offs between them all.

    From 1-on-1 Coaching

    Chris, Menlo Park

    In one of my first sessions, Jimmy said he’d make my programming so methodical it’d almost seem boring.  I was wondering what he meant, and after many sessions, I now understand.  And far from being boring, it’s made me so much more productive and confident in my programming abilities.  I now review code for all sorts of issues (coupling, premature abstractions, poor data structures, etc.) in a very precise way, telling engineers exactly what would happen if they did or didn’t listen to what I have to say.  And in most cases, it’d turn out exactly like what I said.  Also, I have a much better understanding of the general structure of large programs that I’m able to navigate huge codebases much more efficiently than before.  Jimmy is really a godsend, and regardless of how good you think you already are, he’ll make you even better.

    Chase, Palo Alto

    Jimmy has a wizardly knowledge around software design. There were several instances in which I asked him questions that I didn’t expect would have a nicely packaged answer, and he somehow was able to arrive at one. He’s able to take the ambiguity of how to “design a software system” and be very explicit and clear about how things should or shouldn’t be done, and the reasons behind them. There really isn’t another place or person I know of that’s able to teach software design as uniquely and effectively as Jimmy. I frequently see many of the topics I’ve learned come up in practice and now know what to do in those situations.

    Sarah, Palo Alto

    Jimmy took me from being that coder that people tolerated because of “potential” and taught me so much that I had Google and Facebook fighting over me, then had all the hottest teams at Facebook fighting over me.

    Oh, and my salary increased 67%.

    Stephen Balaban, CEO, Lambda Labs

    Jimmy is an intelligent, patient, and deeply knowledgeable coach. His sessions have markedly improved my code’s architecture and modularity. In addition to becoming a better SWE, I’m now a better manager and coach to the other engineers on my team. I went into the program with over five years of software engineering experience and an undergraduate degree in Computer Science; I came out wishing that I had started working with Jimmy sooner. Simply put, if you want to become a more effective engineer, I highly recommend working with Jimmy.

    Eve, New York City

    As a self-taught programmer who works as a Product Manager and aspires to be a CTO, I wanted to grow my technical abilities so I could better contribute to my team. I decided to work with Jimmy because I wanted to accelerate my progress and become more capable at identifying good and bad software architecture patterns. Before we started working together, I was shy about participating in more technical work on my team and didn’t have a concrete growth trajectory planned out for myself. Since I started working with Jimmy, I’ve developed the confidence to participate in code reviews with my team and assist with various technical challenges. I have gained a better understanding of my strengths and weaknesses, and I am much more equipped to set realistic goals for my technical growth. My intuitive sense of how to write clean, effective code has been honed, and I can’t wait to continue learning from Jimmy.


    Send an E-mail to and I'll answer within 24 hours.