News Feed: Why are we doing it wrong?
Hello, my name is Dmitry Karlovsky and I have news for you. Well, as news, a fresh look at the usual thing in the form of another article. Most likely you will get to it from any news feed. Or do not get if the news will be published at the wrong time. No matter how interesting this article is to you.
The thing is how the ribbons are formed and how the user interacts with them. And here, unfortunately, as usual, the simplest solution is the extremely wrong one. Let's see why.
Ways of consumption
Suppose a user has requested a list of some entities from us. How the user will view these entities depends on their goals. There are two ways to consume:
Active search. The user is looking for something specific. He applies filtering and sorting to narrow the output, and then sequentially scans the materials, checking each one of them. Here it is important that the list being viewed does not change during the process of viewing, otherwise you can easily skip what you are looking for.
Passive search. The user is not looking for anything specific. On the contrary, he wants the service to look at what this service has and bring the user what is interesting to him. Here it is just important to show the user the most relevant materials at the moment for a particular user. And what he has already seen is not to show at all.
So, the news feeds are intended just for the passive consumption of these same news. Yes, the user can limit the range of interests with the help of filters, but he is not looking for any specific news, as he most likely does not know about it and went into the tape to find out about it. And his satisfaction depends on how much more interesting (relevant) materials he sees and how many uninteresting he does not see.
Relevance Criteria
Relevance can be influenced by many factors. For example, changing the priority of the task assigned to you in the task manager is very important news that should be shown to the user as soon as possible. Even if after that comments appeared in a dozen other tasks.
But there are general criteria, such as:
- Viewing If the user has already seen this news and somehow reacted to it (squandered, deleted, marked as read, passed to details, etc.), then the second time he no longer wants to see it.
- Relevance. Some news loses its relevance with the emergence of more recent news on the same topic. For example, from the news about the change in the status of the task, only the latest one is interesting, reflecting the current state.
- Date. Fresh news is often more interesting. And some old news is no longer so interesting that it is better not to show it at all (for example, the news that hot water was turned off a day ago).
Tapes in wildlife
In the overwhelming majority of cases, news feeds are formed by issuing materials sorted by the date they were created, published or modified. That is, the remaining (more important) criteria of relevance are simply not taken into account. Ultimately this leads to user dissatisfaction. A few examples to illustrate:
VKontakte
The user opens the news for the first time and consistently browses them - everything is fine. After some time, a notice appears on top of that there is some fresh news. And here he has not a tricky choice:
- Continue flipping through the tape
- Rewind the tape to the beginning to see the latest news (which is not the fact that it is more relevant).
Since the ribbon is quasi-infinite, and the browser tab can not live forever, and curiosity has not been canceled. So sooner or later the user will again be in the "beginning" of the tape. Ok, scroll down. Nothing foreshadows troubles, when suddenly begin to go the news that the user has already seen. And here again the user has no tricky choice:
- Quickly to wind the tape, lowering the Internet traffic into the pipe, hoping to gossip to the news that he had not yet seen.
- Score on the tape and do something else.
It turns out every time the user is not home to some news, he never sees them. But they might be interesting to him. Moreover, they could be critical and radically change his life.
This problem is so typical that it can be given a special name. Let it be Fragmentary Awareness Syndrome.
Home Habra
SFO here is aggravated by padzhinatsiey. When switching between pages, the user sees the news from the previous page. And if he lingers on a page a little longer, then he can easily get several pages of “Boyans” in a row. I described this problem in more detail in a note about padjination .
Youtube
In the "recommended" just give out 18 often haunted videos and all. To see something new in the recommendations, you need to manually delete everything that did not arouse interest. Of course, a rare user will do this. In the "subscriptions" - they are simply sorted by date, which is why he will never see old, but perhaps interesting to the user videos. Is that accidentally stumble upon them in the "recommended."
The root of the problem
When the user just opened the tape for the first time, he has only one point of arrival of news - immediately after the previous viewed. He scans them down and suddenly a second point of entry appears - somewhere above. And it's hard to say where the news is relevant. When he returns after a short break, he immediately has at least two points: the beginning of the tape and the place where he finished watching the news the last time. And since the private user does not have the opportunity to watch the news to previously viewed, these points of receipt of news are multiplying and multiplying.
Decision
The point of receipt of relevant news should be only one. In this case, it should receive the most relevant news in real time. Among all the news can be divided into the following groups:
- Visible. Those news that we previously picked up to him and he sees now on the screen.
- Watched. News that the user has already watched and squandered. When the news leaves the visible area up - you can safely mark it as read.
- Story. List of news generated for a specific user. This includes both the news that the user has already viewed, and those that he is looking at right now.
Ideally, even reloading the page should not change anything in the news list. When a user requests more news (by pressing a button or scrolling down), we select another portion of the most relevant news for the current moment and enclose it in the story. Thus, the user has a clear idea of the tape as something interesting and not changing. Everything he has ever seen is in the order in which he saw it. And shaking down he constantly gets something interesting, without worrying that he will miss something. The truth may have to wind a long time, if a lot of news.
Relevance
The simplest, of course, is simply to consider the latest news more relevant. But you can let the user help the service understand what interests him and what doesn't. You can do this by adding the ability to delete news. If the user doesn’t just waste the news, but deletes it so that it doesn’t litter his story, then this type of news is not interesting to him and this information can be used for subsequent collection.
API
Since the story is being replenished and viewed from the end, we cannot use the traditional padjination, because the news will then constantly jump between pages. In addition, a request for some 100,500 pages for a DBMS may be too heavy. Therefore, we will use anchors for data sampling. To do this, we will specify the following data in the request:
- Anchor. ID of the news starting from which the data should be returned. If the anchor is not specified, then the last read news is taken as the anchor.
- Bias. The number of news for the sample. This number can be positive and then the news comes back after the anchor. Either negative and then the news is returned to the anchor.
If the offset is negative, but there is no necessary number of news before the anchor, then it simply returns as much as it is. By the difference between the number of forgiven and the number of those who came, the client can understand that we have rested against the beginning of the story.
If the offset is positive, and the required number of news after the anchor is not, then the story is supplemented to the desired number with the most relevant news at the moment. If the news is completely over, then again, return how much is and the client detects the end of the tape.
Query Script
Open the ribbon, we have no anchor yet:
GET /feed?offset=5
Make a request for unread news:
SELECTFROM history WHEREuser = 123AND read_at NOTNULLORDERBYidASClimit5
The user sees a selection of unread news, which stopped last time:
[ { id : 3232 } , { id : 5343 } , { id : 7346 } , { id : 9825 } , { id : 9967 } ]
User rolls up to see the news that he saw last time:
GET /feed?anchor=3232&offset=-5
SELECTFROM history WHEREuser = 123ANDid < 3232ORDERBYidDESClimit5
[ { id : 323 } , { id : 329 } , { id : 544 } , { id : 843 } , { id : 898 } ]
User shakes down to see something new:
GET /feed?anchor=7346&offset=5
SELECTFROM history WHEREuser = 123ANDid > 7346ORDERBYidASClimit5
If we have received few news, we select the necessary number of the most relevant of those missing in the history and add them to the history, after which we return everything together:
[ { id : 38574} , { id : 47246} , { id : 52378} , { id : 69238} , { id : 73294} ]
Realizations in wildlife
If you know any services that implement tapes in this way or in a similar way, I will be happy to place links to them here so that readers can themselves appreciate the convenience of this approach.