Not so many developers are clearly make a distinction between design and architecture, and the experience of the interviews shows that the basic paradigm of OOP often cause difficulty. Java language is quite old and not all principles were implemented properly in it, and the abundance of frameworks further confuses developers. This presentation will discuss the basics of OOP and modern look on them, the benefits and harms of inheritance, interfaces, and the applicability of the opportunities that they offer for the ever-growing project. It will also consider the appearance of the normal cycle of code to work on TDD, how to postpone the architectural and design solutions until the right moment, tried and tested over the years architectural design patterns, principles of good code design. This talk will be useful to those who want to create high-quality, understandable and easy to support solutions in Java.