A direct quote from https://github.com/mobxjs/mobx-state-tree
> mobx-state-tree is a state container that combines the simplicity and ease of mutable data with the traceability of immutable data and the reactiveness and performance of observable data.
Preethi Kasireddy did a fantastic presentation at ReactConf comparing Redux and MobX [0], Robin Wieruch wrote a good article comparing them last year [1], there was a Reddit thread with good discussion as well [2], and I have links to more comparisons at [3].
They're different tools taking very different approaches to solving the same kinds of problems, and they definitely appeal to different developers.
[0] https://youtu.be/76FRrbY18Bs
[1] http://www.robinwieruch.de/redux-mobx-confusion/
[2] https://www.reddit.com/r/reactjs/comments/4npzq5/confused_re...
[3] https://github.com/markerikson/react-redux-links/blob/master...
I've never tried MobX, but it looks pretty impressive too. I can imagine it working really well if you have the discipline to not leak your mutations all over the place.
MobX is useful mostly as the data model / selector part of redux. It does an awesome job of it. Once you've defined your core data model, you can create layers of computed properties and transformations out to your view. The view then rerenders in a really optimal way.
Where redux shines is the prescriptive nature. The layout of a redux app is fairly well defined at this stage and there are "right" and "wrong" places to put (and look for) different types of code.
With MobX there's still no clear way to layout your application, so, as you say, you need to be more disciplined with your approach.
Vanilla Redux that somewhat closely mimics the Elm architecture is fantastic at it, but average Redux apps in the wild are...mediocre at best.
You literally can't fuck up rendering performance, provided you don't have a single huge component the renders your entire state.
Redux falls apart pretty hard when people start layering sugar and abstractions on top. It's my pattern of choice, but for teams that insist on abstracting the Redux boilerplate away, I steer them to MobX.
After having used Mobx for more than 10 months now, I still have to find areas that I dislike about Mobx.
That said, my subsequent apps have gone much better and I definitely prefer it to Redux, but I can see the appeal of Redux's more structured approach.
Out of the box, you get absolutely perfect rendering update performance. You literally can't do it any better, thanks to observables.