I've been using Observables pretty exclusively for almost two years now. What I have now is a cookbook of use cases that I refer back to by looking at what I did in previous projects. That's not to say there's no original thought in new code that I write, just that sometimes the nontrivial cases have escaped my memory. Some examples:
* How do you end the observable's subscription when any of X, Y or Z happen (and at least one of these is a timer)?
* How do you emit N network requests in series, without nesting subscriptions? (ideally you won't need to, but not all APIs are well behaved)
* How do you transform a node-like stream to an observable?
This is just from last week, and some I'm able to do from scratch better than others.
TESTING them is challenging as well. There are non-obvious failures when you use the typical unit testing patterns (a testing framework will report that function was/wasn't called and you're not sure why, because per the test setup that shouldn't be what happened). Almost two years in and I have no idea what the marbles mean, but soon I'll start trying to grok them
But there's no way I see how I can do my job without them. The applications I work on take updates from 1) keyboard 2) mouse 3) direct websocket subscriptions 4) indirect websocket subscriptions 5) xhr calls 6) other messaging patterns that aren't as common.
So I'm at the point where I can easily tell you the differences between switchMap, concatMap, and mergeMap (of which flatMap is an alias), easily pull out filter, map, combineLatest, tap, etc. Sometimes when I'm in the weeds it does help to think that they're just functions, but at no point would I dare tell anyone that this stuff is easy. It's easily the hardest thing I've learned since I started my current job.