Skip to main content
← All Tags

Software design

23 articles in this category

Software designProgramming languages

Inheritance is a Relic: Composition Over Class Hierarchies

Object-oriented programming taught us that code reuse is achieved through class inheritance. In practice, deep inheritance hierarchies create fragile base classes, high coupling, and rigid domain structures. It is time to abandon inheritance and embrace composition.

Read more
Software designCode quality

The Fallacy of DRY: Why You Should Write Duplicated Code First

Don't Repeat Yourself (DRY) is one of the first design principles programmers learn. But applying it too early creates tightly coupled, hyper-flexible abstractions that crumble under the weight of changing requirements. Write duplicated code until the structure reveals itself.

Read more
Software designArchitecture

Why Clean Architecture is a Maintainability Nightmare

Robert C. Martin's 'Clean Architecture' promises to decouple your business logic from external frameworks and databases. In practice, it leads to a sprawling wasteland of boilerplate, interface layers that pass data straight through, and excessive mapping functions. Here's why YAGNI should trump architecture dogmatism.

Read more
DatabaseBackendSoftware design

Why ORMs are the Worst Anti-Pattern in Modern Backend Development

Object-Relational Mapping (ORM) tools promise to free developers from SQL. In exchange, they introduce the N+1 query problem, hide database performance realities behind black-box abstractions, and create models that couple application state to database schemas. It's time to write SQL again.

Read more
Software designArchitecture

Microservices: The Great Architecture Grift of the 2010s

The industry fell head-over-heels for microservices, believing they would solve all development bottlenecks. Instead, we traded in-process function calls for unreliable network requests, simple joins for distributed transactions, and single deployments for orchestration nightmares. The monolith was right all along.

Read more
AI NewsSoftware DesignArchitecture

Stop Using UserService Blindly – Replace Entity-Based Layers with Intentional Design

Artyom Kornilov explains how entity-based Services and Repositories often add indirection without abstraction, bloating codebases.

Read more
ArchitectureSoftware designBackend

Software Architecture Is Mostly About Boundaries

A practical guide to drawing boundaries that survive contact with reality: APIs, modules, ownership, and the uncomfortable fact that most bugs are boundary bugs wearing a fake mustache.

Read more
PythonSoftware designBackend development

Python Dataclasses vs Pydantic: The Complete Production Guide

A comprehensive technical reference covering ALL features of Python dataclasses and Pydantic v2+. Learn when to use each, performance trade-offs, validation patterns, serialization mechanics, and production patterns for senior engineers.

Read more
Software designCode qualityBook reviews

Clean Code: The Cult of Dogma and Why Your Abstractions Are Probably Wrong

Robert C. Martin's Clean Code shaped a generation of developers, but its dogmatic rules about tiny functions, obsessive DRY, and terrible example code have caused more harm than good. Here's what the book got right, what it got catastrophically wrong, and what to read instead.

Read more
Software architectureSoftware designSystem design

Massively scaling a web application

A complete guide to scaling web applications from a single server to multi-region deployments. Covers vertical and horizontal scaling, load balancing, database sharding, caching, CDNs and more.

Read more
Software architectureSoftware designSOLID

SOLID

Complete guide to SOLID principles in object-oriented programming. Learn Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion with practical examples.

Read more
Software architectureSoftware designSOLID

D (Dependency Inversion) from SOLID

Understand the Dependency Inversion Principle from SOLID. Learn why high-level modules should depend on abstractions, not concrete implementations, and how DIP enables testable, flexible architecture.

Read more
Software architectureSoftware designSOLID

I (Interface Segregation) from SOLID

Learn the Interface Segregation Principle from SOLID. Discover why fat interfaces force unnecessary dependencies and how to design focused, client-specific interfaces.

Read more
Software architectureSoftware designSOLID

L (Liskov Substitution) from SOLID

Understand the Liskov Substitution Principle from SOLID. Learn why subclasses must be substitutable for their parent classes and how violations lead to subtle bugs in inheritance hierarchies.

Read more
Software architectureSoftware designSOLID

O (Open/Closed) from SOLID

Master the Open/Closed Principle from SOLID. Learn how to design software that is open for extension but closed for modification, so new features don't break existing code.

Read more
Software architectureSoftware designSOLID

S (Single Responsibility) from SOLID

Understand the Single Responsibility Principle from SOLID. Learn why a class should have only one reason to change and how SRP leads to more maintainable, testable code.

Read more
Software design

Technical debt

Understanding technical debt in software development. Learn how to identify, manage, and pay down technical debt while maintaining agile development velocity.

Read more
Software designSoftware architecture

Microservices vs Monoliths

Comprehensive comparison of microservices and monolithic architectures. Learn when to use each approach, their benefits, trade-offs, and best practices for modern software development.

Read more
Software architectureSoftware designThoughts

Best Of: The Early History Of Smalltalk

Key quotes and insights from Alan Kay's paper on the early history of Smalltalk. Explores object-oriented programming origins, message passing, and the philosophy behind Smalltalk's design.

Read more
Software architectureSoftware designDomain-Driven Design

Hexagonal Architecture: Why Your Domain Logic Shouldn't Know About Your Database

Stop letting frameworks dictate your architecture. Learn how Hexagonal Architecture (Ports & Adapters) isolates business logic from infrastructure, makes testing trivial, and lets you swap databases without rewriting code.

Read more
Software architectureSoftware designDomain driven design

Anemic vs Rich Domain Models

Understand the difference between Anemic and Rich Domain Models in Domain-Driven Design. Learn which approach to choose for better code organization and where to put business logic.

Read more
Software designDomain driven design

Domain Driven Design Core Concepts

Master the core concepts of Domain Driven Design (DDD). Learn about entities, value objects, aggregates, repositories, and how to apply DDD in complex business domains.

Read more
Software design

Tell, Don't Ask: Getters Are Evil

Why getters leak abstraction and scatter business logic. Learn the Tell Don't Ask principle to encapsulate behavior inside domain objects and avoid duplicated logic.

Read more