As you will learn, a Subject is both an Observer and an Observable, acting as a proxy multicasting device (similar to an event bus). Subjects have their place in reactive programming, but you should strive to exhaust your other options before utilizing them because, if used under the wrong conditions, they can be very difficult to debug. Erik Meijer, the creator of ReactiveX, described them as the "mutable variables of reactive programming".
Just like a mutable variable is necessary at times even though you should strive for immutability, a Subject is sometimes a necessary tool to reconcile an imperative paradigm with a reactive one.
But before we discuss when and when not to use the Subject class, let's take a look at what it does exactly.