In order for things to work smoothly clients need access to pull in as much data from relays as possible and as quick as possible. It can end up generating hundreds of thousands of events that the client might have to display which can take a chunk of memory and cpu time.
The further back in the sequence of events the client has to look based on its query, the more it will struggle to display it quickly. No matter how you query relays this always seems to be the case. Relays need to be way less dumb than they are.
So this morning you make a post about enjoying a nice cup of Coffee. Everyone from the void responds and you get comments and likes from somewhere. Crazy!! You log out for the day so you can really consider what just happened.
You log back in the next day to see if anyone has left you notifications or messages or anything. No messages are showing! You leave it idle for a few minutes and suddenly you're getting notifications for something that happened hours ago.
The client has to work harder in order to retrieve that historical data. I think relays will need to be less "dumb" because there are a few ways to query a relay but nothing in a way that makes it easy for the client to manage memory, state, and the flow of data.
Here is a challenge I noticed with managing data.
Suppose I have a batch of posts. Each post has a pubkey. This pubkey represents the entity that created the post. I want to find out if this pubkey has a username or nick name.
In my code, I might have a query to a relay or multiple relays like this:
{kinds:[0,1], limit:500}
This will ask the relay for two event types. Event type 0 contains profile information and event type 1 will contain posts. You must match the pubkey of one event to the pubkey of another. Easy!
That query will query 500 of the past events based on current date/time in total. If there are 400 posts events and 100 user events, the chances of the username being in that batch of events is not likely. Even if you have 500 post events and 500 profile events that won't matter if the entity has created a profile that happened 600 events ago then you're not going to get that event and the post will not have an associated username.

I can only speak from the perspective of someone who barely does development stuff until I find projects I think might be fun like Nostr. I know some Javascript and that is about it but can wing it most of the way.
I can tell you that from my own experience most things fall apart once you test your client at scale. It is why I keep iterating and I just feel like I am making no progress at all when I see all these other clients that are beautiful and amazing. Even though they have similar problems. I do think a lot of devs who rely on frameworks are in for a rude awakening. Anyone who builds native clients in languages like C or builds clients from scratch in JavaScript without stuff like Vue or React will end up building the better experiences.
I could only dream of ever building one of the few successful clients out there. I don't even have the financial resources to eat so I have no idea why I am putting any time towards this at all

If there are any companies out there trying to build a client with more resources than I have please reach out. Would love to be able to continue to do this.