The Advanced Software Design Express Course

Learn years of software intuition in five weeks

Testimonials

 

Disclaimer: The Express Course is a new offering, so no testimonials yet exist.
However, below are testimonials for The Advanced Software Design Course, which should still be informative given we teach a similar curriculum in the Express 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.

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.

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

Benjamin Duron, Software Engineer, Paris

Yesterday was my last day of a 13-month freelance project as a backend architect in a SaaS startup. It was so rewarding to be able to apply the course concepts to build their product from scratch. I’ve read a lot of books about SWE, but found myself only using the ones from the course most of the time. That’s how useful they are! Thanks to the things I learned in this course, the code has always been able to evolve without rewrites when new requirements were introduced.

Cameron Yick, Software Engineer, New York City

Cameron Yick

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.

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.

Azhar Desai, Software Engineer, Thinkst Canary

Azhar_DesaiThis 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.

Andrew Edwards, Software Engineer, London

Andrew EdwardsThe 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!

Jess Smith, Software Engineer, New York City

Jess SmithThree 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.

Sarah, Senior Software Engineer

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%.

Josh Curtis, San Francisco

josh curtisJimmy’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.

Steve Phillips, Software Engineer, San Francisco

Profile photo of Steve Phillips

Mirdin’s Advanced Software Design Course was fantastic.  I’ve found myself immediately applying what I learned, especially when it comes to preventing subtle dependencies between components.
It’s about time that software design evolve from a pile of opinions into a science.  Bravo, Jimmy, for taking us a huge leap in that direction!

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.

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.

Disclaimer: The Express Course is a new offering, so no testimonials for this course exist yet.
However, below are testimonials for The Advanced Software Design Course, which should still be informative given we teach a similar curriculum in the Express 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

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

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

John Tran, Tech Lead, ONEHOPE Wine

John Tran

Benjamin Duron, Software Engineer, Paris

Yesterday was my last day of a 13-month freelance project as a backend architect in a SaaS startup. It was so rewarding to be able to apply the course concepts to build their product from

Cameron Yick, Software Engineer, New York City

Cameron Yick 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

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

Azhar Desai, Software Engineer, Thinkst Canary

Azhar_DesaiThis 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

Andrew Edwards, Software Engineer, London

Andrew EdwardsThe 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

Jess Smith, Software Engineer, New York City

Jess SmithThree 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

Sarah, Senior Software Engineer

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%.

A new streamlined course

We've seen massive growth in the engineers who have dedicated themselves to our Advanced Software Design Course. But though it's designed for busy professionals, many engineers and companies do not have the 5-8h to spend on a course each week; it could be anything from having young children to wanting to take the course during work hours or just plainly not wanting to spend so much time on a course.

Are there other courses they could study instead? Yes for specific things like web programming, but we're still alone in training experienced engineers in general advanced software engineering skills. Previously, engineers in this position's only option would have been our private coaching.

This course solves this problem.

Join the over 250 professional software engineers who have taken our courses

What You'll Learn

Week 1: The Hidden Layer of Logic

  • Why design is conceptually different from implementation, and what this means for building robust code.
  • How can one change specifications without breaking existing software?
  • What does it mean for the code to work but the program still be considered wrong ?
  • Fundamental informal familiarity with Hoare logic, just enough to see the barrier between the lines of code that gets formed by specifying pre/postconditions and how this is related to specifications.
  • When should you use DRY, and when is it a mistake?
  • What does it mean for software to be considered correct?
  • How can identical code do different things?

Intended learning outcome
The student will be able to see the difference between specification and code.

Week 2: The Embedded Design Principle

  • 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.
  • Most of the time, programmers are rediscovering the ideas that led the previous programmer to write the code as it is before we can make changes. Learn how to speed up that process by embedding the design into the code.
  • Sometimes it can be hard to know where to start when starting a new codebase or implementing a new requirement. By thinking about the concepts and ideas and embedding them, we get a foundation to express our program in.
  • Don’t get stuck in an old design; think about how capturing some implicit concepts can make the code much more straightforward and clearer to work with going forward.

Intended learning outcome
The student will be able to express the concepts and design of a program in code.

Week 3: Take-Home project

Use what you have learned so far and put it all together in a short design exercise.
This exercise will just take a few hours, but it will teach you a lot.
This is the way we allow you to practice software in an efficient way.

 

Intended learning outcome
The student will be able to experience how quickly earlier decisions can come back to bite you.

Week 4: The Representable/Valid Principle & Algebraic Refactoring

  • How to design code that contains zero error-checking, but is less likely to fail than even the most defensively-written code.
  • Being careful in the code is just one way to get a correct program. How do we make it impossible to represent unwanted states?
  • How many states can your data model actually represent?
  • What is an invariant?
  • See subtle ways in which an invariant is broken.
  • Understanding sum and product types and how common data structure patterns in most languages are just special cases of these two fundamental constructs.
  • How refactoring a program can be isomorphic to factoring polynomials in algebra.

Intended learning outcome
The student will understand and be able to use the concept of ‘correct by construction.’

Week 5: The Data Over Code Principle & Future-Proofing Code

  • 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.
  • Learning to spot and remove 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.

Intended learning outcomes
The student will understand true abstraction.
The student will understand the concept of type isomorphism and when two data models are the same.
The student will understand subtyping and how to prepare a program for future extensions or contractions.


About the instructor

Nils Eriksson

Nils is a previous top student of the course turned Instructor. Previously he was a tech lead engineer at Discovery Networks, where he oversaw the development of multiple products such as the 2020 Olympics, Eurosport Player, Dplay, and Discovery+. In addition, he has experience as a mentor and coach for several of Mirdins 1-on-1 clients.


More than just lectures

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.

Two 30-minute 1-on-1 sessions

Two 30-minute 1-on-1 sessions with ICF-certified coach James Koppel or former student and instructor Nils Eriksson.
One in the middle of the course and one at the end. We both have a lot of experience with 1-on-1 clients.
During these sessions, we can discuss any questions that have arisen in the course, go through the answer to an exercise together,
talk about software engineering in general, or look at something specific from work.


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. We 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. 


Prerequisites

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

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.

Format


The class will meet in webinars every other week for four total lectures. Each unit will have a handful of self-correcting questions.
There will be one take-home challenge that will be given an extra week with no lectures.
At the beginning of each lecture, we will briefly discuss the previous unit and its exercises. 

The webinars will be held from 17:00 to 18:30 GMT. All webinars will be recorded; attendance is optional but strongly encouraged.
This course will have small groups of 7 people to allow for easier group discussions, and we are going to do exercises together in class. 

Here’s that in several timezones:

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

The goal is for the course to take between 2-3h per week.

1.5h live lecture

1.5h readings/exercises outside of class.

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


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:
21 November - 19 December
Every Monday , 17:00 - 18:30 GMT

 

Register your interest in the Express Course