If You Don’t Want to Be Replaced by a Robot, Don’t Act Like a Robot

Here’s a rant I’ve been sitting on, and it’s time to let it out. In the modern software development landscape, there’s an unsettling trend: we pretend that the perfect project flow is a conveyor belt, and the only thing slowing us down is “imperfect” specification. Every sprint, there are grumbles about user stories that aren’t… Continue reading If You Don’t Want to Be Replaced by a Robot, Don’t Act Like a Robot

The Onion, the Layer, and the Interface

Modern software architecture is full of metaphors—and none may be as visually striking as the Onion Architecture. But what does it really mean when we talk about “layers,” “abstractions,” and “interfaces”? In this article, we’ll unravel these concepts and explore the foundational principles that shape robust, flexible systems. Peeling Back the Onion The Onion Architecture… Continue reading The Onion, the Layer, and the Interface

How to Create Tailored CVs Easily with the Europass CV Builder

Are you looking for a simple yet powerful way to create a professional CV that highlights your unique career journey? The Europass CV tool is an excellent resource designed to help job seekers across Europe—and beyond—build detailed, polished CVs with ease. Why Choose Europass CV? Europass allows you to create a comprehensive profile capturing every… Continue reading How to Create Tailored CVs Easily with the Europass CV Builder

Blessed Are the Pure Methods, for They Shall Be Testable!

My beloved brethren, hear me now! There are two kinds of methods in this world! On one side, there are those that walk in righteousness—methods of peace and purity, untouched by the temptations of the world! These are the pure methods, unshaken by the chaos around them. They take only what is given, mindful of… Continue reading Blessed Are the Pure Methods, for They Shall Be Testable!

Changing Object Types to Reflect State Transitions

In object-oriented design, objects encapsulate state and expose behavior that operates on that state. Consequently, if an object must exhibit different behaviors at various stages of its lifecycle, it can be beneficial to represent these transitions by changing its type. For example, consider a system that manages books. A newly created but unsaved book might… Continue reading Changing Object Types to Reflect State Transitions

Interfaces vs Abstract Classes

This article moves beyond the typical “mechanical” distinctions between interfaces and abstract classes, focusing instead on their intended roles in your code. In C#, an interface establishes a contract that implementing classes must follow. When multiple implementations share common functionality, they may encapsulate that shared behavior in an abstract base class. However, not every subclass… Continue reading Interfaces vs Abstract Classes

Generic Discriminator and Factory

As discussed in the Open-Closed Principle article, the final solution included an EmailSender class, that acted as the orchestrator, and required as dependencies a CurrentDayProvider and an EmailSenderFactory. The EmailSender class looked like this: The CurrentDayProvider was not the most complicated class ever: And the EmailSenderFactory was pretty standard containing the decision logic based on… Continue reading Generic Discriminator and Factory

Substitute Switch-Case With Data Structures

As discussed in the Open-Closed Principle article I suggested that in some certain situations, the decision on what email sender type to instantiate in the factory, can be represented in a data structure, instead of using switch-case (or if-else) structures. I will paste the code here, because the changes are not major, and then I’ll… Continue reading Substitute Switch-Case With Data Structures