Most programmers believe they understand object-oriented programming. It is taught in universities and programming courses, and nearly every developer has encountered it early in their career. Given the number of books already written on the subject, another one may seem unnecessary. Yet the interpretation of OOP commonly presented in schools and classical texts often fails to help programmers produce maintainable software.
The usual process looks familiar. We begin by creating classes and objects, following the patterns recommended in textbooks. Over time we extend them with additional behavior. The classes grow, responsibilities accumulate, and the design gradually loses its structure. What started as a clean architecture becomes difficult to maintain and nearly impossible to test. Eventually the codebase turns into a ball of mud, motivation declines, and the temptation appears to start again from scratch—hoping that the next design will remain clean. Within a few months, the same pattern repeats.
This book, the first in a series, argues that the problem lies in the traditional interpretation of object-oriented programming. It proposes a different understanding of what an object is and how objects should relate to each other. Among its central claims are that object attributes must be immutable, and that constructs such as static methods and NULL references undermine sound object design.
Despite these strong positions, the book is not theoretical. Each idea is illustrated through practical examples written in Java, demonstrating how the concepts translate into everyday programming.
If you read the book from beginning to end, your perspective on object-oriented programming may change substantially. The way you structure classes, design interactions between objects, and reason about software architecture will likely shift. That change may even create disagreements with colleagues who follow more conventional approaches. Proceed carefully—and enjoy the process of writing code.