Coaching Application

Hi! I’m Jimmy Koppel, and I’m a software-engineering coach. I’ve been doing this for over 6 years. Between my courses and 1-on-1 coaching, I’ve trained just shy of 250 software engineers, from people just breaking into the field, to ones with over 20 years experience. And I’ve taught hundreds more in one-off sessions and workshops, and tens of thousands more through online articles.

This is my 1-on-1 coaching program. This is a program for people who are not satisfied with the normal rate of learning, for people who want knowledge taught nowhere else, and for people who want to dedicate themselves to becoming the best.

Think this might be for you? In this document, I explain exactly what to expect from coaching.

Types of Coaching

I generally have two kinds of coaching relationships with clients:

Short-Term Targeted Coaching: This is coaching tied to a specific goal, such as feedback on a design. It is available on an ad-hoc basis, for timeslots as short as 30 minutes.

Long-Term Foundational Coaching: This is coaching to generally deepen your skills and improve your understanding of software engineering. With the exception of students who have already taken the Advanced Software Design Web Course or Weekend Intensive, I require a minimum 10-session commitment, in order to give time to build the coaching relationship, and to start with deeper topics.

Most of this document applies to long-term foundational coaching.

 

What’s Included with Coaching?

First, all coaching sessions come with the things required to help students get the most out of their session: I’ll read through documents or code beforehand, answer questions over E-mail, and send students a recording of our call.

For long-term foundational coaching, I think of it less as a few timeslots on my calendar, and more as bringing students into my inner circle. I routinely give students access to the latest curriculum developed, often before anyone else has seen it. In the past, I’ve used my personal network to help students find a new job, and met up with them on other continents.

As with my web-course students, I give all my students access to a Slack workspace for alumni, ongoing access to the latest version of the Curated Reading List and Software Design Glossary, and invite them to dinners when I travel.

What Happens in a Coaching Session?

I’ve done hundreds of sessions, and every one has been different. Even for sessions based on the same material, the client is different. The only rule is that I always come into a session with a plan, and always come prepared to not use it. If you’ve seen a lesson on my website or course, it emerged from material originally taught to one person. And that’s only a fraction of the material developed for 1-on-1 clients. And when someone wants something not covered by an existing lesson plan, I make new material.

In addition to the technical aspect, I am trained in mainstream life-coaching by iPEC, the Institute for Professional Excellence in Coaching, and certified by the ICF. I thus often help my clients in emotional situations as well, be it with navigating a difficult situation at work, charting out a life plan, or dealing with feelings of inadequacy.

Here are a few example sessions:

The client sends me a personal project he’s been working on, and I review the code before the session. I point to a few sections I consider design flaws, and ask how the code would change under several scenarios, and teach him about the principle the current code violates. The client asks about another part of the code he doesn’t like. This leads into a discussion about how that’s an instance of a general pattern from PL theory, and why the problems he’s complained about are inevitable.
We’ve been in a weeks-long discussion about information-hiding. In this session, I teach the client about existential types and the type theory of modules, and end with a teaser about how it helps us identify when code is violating another module’s secret. In the following session, we practice translating some ordinary code into the language of module theory, and identify a counterintuitive example where a secret leaks.
A client asks me a follow-up question about the previous week, asking if the lesson of the previous week implies something negative. I start to answer with an example, but sense something’s wrong. I ask him about burnout; the rest of the session and the following week’s are me coaching him about burnout and what gives him energy.

What Can I Expect to Gain from Coaching?

I cannot predict with certainty the outcome of any prospective client. I can share the patterns I’ve noticed in client outcomes. It is very common for clients to have some kind of software “epiphany” within the first five sessions. By the tenth session, others have noticed a difference in their understanding.

Often, their perception changes of their job. Sometimes, clients begin to understand conversations around them, and suddenly find themselves more accepted and listened-to . Other times, they begin to feel they understand things their coworkers don’t, and begin looking for a new job.

Beginning the Coaching Relationship

Clients differ in their needs, not only in their existing skills and immediate wants, but also in what view of material works best (e.g.: balance of deeper theory vs. immediate applications), and whether they’re interested in homework between sessions. My goal in the beginning of the relationship is to understand how best to work with you, and to identify a few gaps in your understanding or skill-set to begin the coaching process. To do this, I give all new clients a questionnaire, and review their code: either by reading their open-source code, or, if none is available, by giving a 3-hour coding challenge. For the first session, I usually have to prepare multiple topics, in search of one which resonates with the client.

Finding an approach that clicks with a client is often an iterative process. In one extreme example, I spent the first three sessions with a client repeatedly finding that everything I tried to teach him was too advanced. We then had a very productive coaching relationship, with over 70 sessions over the following 2 years.

Never trust a coach who claims a 100% success rate. At time of writing, I have had 16 very happy 1-on-1 long-term coaching clients, and 2 unhappy ones.

Logistics

All available timeslots are between 11 AM and 1 PM or between 9 PM and 11 PM US Eastern Time, Mondays-Thursdays.

Pricing

Sessions may be purchased in packages of 1, 4, or 10. Purchased sessions may be used indefinitely long after purchase.

These prices are for individuals, where arrangements are simple and bureaucracy minimal. Contact us for corporate pricing.

Jimmy Koppel:
1 session: $349
4 sessions: $1326
10 sessions: $3141

Additional coaches

Nils Eriksson, Portugal (GMT+1).
1 session: $150
4 sessions: $570
10 sessions: $1425

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+. He also offers 1-on-1 training under my guidance.
He is available from 09:00-17:00 GMT+1, Monday to Thursday.

    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.

    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.

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

    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.

    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.

    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.

    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

    John Tran

    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.

    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.

    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.

    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!

    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.

    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.

    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.

    Ben Toner, Co-founder and Chief Scientist at Affinda; Co-founder and Lead Data Scientist at Vesparum

    Ben TonerMirdin’s Advanced Software Design course is the only course I recommend to professional software engineers. Let me explain why. Software engineering is one of those professions where skills are mainly accumulated through experience. Sure, you can learn to code from a course, but the technical skills that separate a junior engineer from a staff engineer are usually hard-won, accumulated over many years. Jimmy has distilled many of these concepts into modules that you can instead learn in a couple of hours! How can you say no to that? It’s a unique offering and extremely good value. For me, it was especially good to put words and frameworks around some of the things that I would do, but was somehow unable to communicate to my team. Wholeheartedly recommended!

    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!

    Alon Honig, VP of Data Architecture at Sotheby’s

    This content is too good to be free.

    Bill de hÓra, Head of Architecture, Zalando

    Tweet