Why your code is hard to test (and how to fix it) | Issue #81


If your code is hard to test, hard to reuse, and hard to change, you’re probably hardcoding your dependencies.

It’s one of the most common architectural problems I see in Python code, even in production systems.

In this week's video, I take a small but realistic example, a data pipeline that loads, transforms, and exports some records, and show you how Dependency Injection can turn it from a rigid mess into something clean, testable, and modular.

No frameworks required.

You’ll learn:

  • Why hardcoded logic breaks your codebase
  • How to refactor to constructor-based DI
  • How to write your own tiny DI container (in just a few lines)
  • And how frameworks like FastAPI use DI under the hood


Enjoy your weekend (and don't forget to check out the insane Black Friday offer below 😉)!

Cheers,

Arjan


🔥 Happy Black Friday! 🔥

It’s that time of year again: I’m rolling out the BIGGEST discount of 2025 on all ArjanCodes courses! For just a few days, you can grab any course at 30% off.

If you’re ready to start thinking like a software architect, sharpen your design skills, and finally invest in the kind of high-level thinking AI can’t automate, now’s the perfect moment.

Here’s what you can dive into:

Just use coupon BLACKFRIDAY2025 at checkout.

⏳ Don’t wait: this offer disappears on December 1 at midnight!

👕 Clean code and clean clothes

The ArjanCodes merch store features T-shirts, hoodies, hats, and more for the clean-code-obsessed. Careful though: you'll look dangerously professional while reviewing PRs.

👉 Check out the store here and grab something before your stand-up call starts.

Unsubscribe | Send by ArjanCodes

Wolvenplein 25, Utrecht, UT 3512 CK

The Friday Loop

Every Friday, you'll get a recap of the most important and exciting Python and coding news. The Friday Loop also keeps everyone posted on new ArjanCodes courses and any limited offers coming up.

Read more from The Friday Loop

Have you ever hesitated between writing a method or a property, and then just picked one because “it felt right”? That small choice actually carries a lot of design weight. In this week’s video, I explore when properties make sense and when methods are the better choice. I talk about what properties promise to the reader of your code, why setters should be used carefully, how this choice affects abstractions and Protocols, and where async fits into all of this. This video is also a good...

Most systems don’t start out needing CQRS. They start simple: create, update, list, dashboard. Everything in one place. Everything reasonable. Until read requirements slowly begin to reshape the system, often in subtle ways 🧩. In this week’s video, I show how that happens using a FastAPI app backed by MongoDB, and how Command Query Responsibility Segregation (CQRS) provides a clean way out once reads and writes want very different things. Along the way, I cover: separating command intent from...

Code can be correct and still be unpleasant to read. A lot of software design isn’t about what the code does but about how clearly it communicates the sequence of ideas behind it. In this week’s video, I explore the Fluent Interface pattern by refactoring a small animation engine in Python. I start with a clunky but functional API, then gradually reshape it until defining an animation reads almost like a sentence: move, rotate, scale, fade. Enjoy this deep dive into API design, readability,...