Hallo, mein Name ist Dmitry Karlovsky und ich habe Neuigkeiten für Sie. Nun, als Neuigkeit ein neuer Blick auf das Übliche in Form eines weiteren Artikels. Höchstwahrscheinlich werden Sie von jedem Newsfeed darauf zugreifen. Oder Sie erhalten es nicht, wenn die Nachrichten zur falschen Zeit veröffentlicht werden. Egal wie interessant dieser Artikel für Sie ist.

Die Sache ist, wie die Bänder gebildet werden und wie der Benutzer mit ihnen interagiert. Und hier ist leider wie immer die einfachste Lösung extrem falsch. Mal sehen warum.
Verbrauchsmethoden
Angenommen, ein Benutzer hat uns nach einer Liste einiger Entitäten gefragt. Wie der Benutzer diese Entitäten anzeigt, hängt von seinen Zielen ab. Es gibt zwei Möglichkeiten zu konsumieren:
Aktive Suche. Der Benutzer sucht nach etwas Bestimmtem. Er wendet Filterung und Sortierung an, um die Ausgabe einzugrenzen. Anschließend scannt er die Materialien nacheinander und überprüft sie jeweils. Es ist wichtig, dass sich die angezeigte Liste während des Anzeigevorgangs nicht ändert. Andernfalls können Sie leicht überspringen, wonach Sie suchen.
Passive Suche. Der Benutzer sucht nichts Bestimmtes. Im Gegenteil, er möchte, dass der Dienst sich anschaut, was dieser Dienst hat, und dem Benutzer etwas anzeigt, das für ihn interessant ist. Hier ist es nur wichtig, dem Benutzer die aktuell relevantesten Materialien für einen bestimmten Benutzer zu zeigen. Und was er bereits gesehen hat, ist überhaupt nicht zu zeigen.
Newsfeeds sind also nur für den passiven Konsum dieser Nachrichten konzipiert. Ja, der Benutzer kann den Interessenbereich mithilfe von Filtern einschränken, sucht jedoch nicht nach bestimmten Nachrichten, da er höchstwahrscheinlich noch nichts davon weiß und in den Feed gegangen ist, um mehr darüber zu erfahren. Und seine Zufriedenheit hängt davon ab, wie viel interessanteres (relevantes) Material er sieht und wie viele uninteressante er sieht.
Relevanzkriterien
Viele Faktoren können die Relevanz beeinflussen. Das Ändern der Priorität einer Aufgabe, die Ihnen im Task-Manager zugewiesen wurde, ist beispielsweise eine sehr wichtige Nachricht, die dem Benutzer so schnell wie möglich angezeigt werden sollte. Auch wenn es danach Kommentare von einem Dutzend anderer Aufgaben gab.
Es gibt jedoch allgemeine Kriterien wie:
- Sichtbarkeit. Wenn der Benutzer diese Nachricht bereits gesehen hat und irgendwie darauf reagiert hat (gescrollt, gelöscht, als gelesen markiert, zu den Details gegangen usw.), möchte er sie das zweite Mal nicht sehen.
- Relevanz. Einige Nachrichten verlieren ihre Relevanz mit dem Aufkommen neuerer Nachrichten zum gleichen Thema. Zum Beispiel ist aus den Nachrichten über die Änderung des Status der Aufgabe nur die neueste interessant, die den aktuellen Status widerspiegelt.
- Datum Neue Nachrichten sind oft interessanter. Und einige alte Nachrichten sind nicht mehr so interessant, dass es besser ist, sie überhaupt nicht zu zeigen (zum Beispiel die Nachricht, dass heißes Wasser vor einem Tag abgeschaltet wurde).
Bänder in Wildtieren
In den allermeisten Fällen werden Newsfeeds durch Ausgabe von Materialien erstellt, die nach dem Datum ihrer Erstellung, Veröffentlichung oder Änderung sortiert sind. Das heißt, die verbleibenden (wichtigeren) Relevanzkriterien werden einfach nicht berücksichtigt. Dies führt letztendlich zu Unzufriedenheit der Benutzer. Einige Beispiele zur Veranschaulichung:
VKontakte-Feed
Der Benutzer öffnet die Nachrichten zum ersten Mal und zeigt sie nacheinander an - hier ist alles in Ordnung. Nach einiger Zeit wird oben eine Benachrichtigung angezeigt, dass einige aktuelle Nachrichten erschienen sind. Und dann hat er eine schwierige Wahl:
- Blättern Sie weiter durch den Vorschub
- Spulen Sie den Feed zum Anfang zurück, um die neuesten Nachrichten zu sehen (was nicht relevanter ist).
Da das Band quasi unendlich ist und der Browser-Tab nicht für immer leben kann und niemand die Neugier abgesagt hat. So ist der Benutzer früher oder später wieder am "Anfang" des Bandes. Ok, scrolle nach unten. Nichts deutet auf Probleme hin, wenn plötzlich die Nachrichten, die der Benutzer bereits gesehen hat, weitergehen. Und auch hier ist der Benutzer keine schwierige Wahl:
- Wickeln Sie das Band schnell und schnell auf, senken Sie den Internetverkehr in der Leitung und hoffen Sie, die Nachrichten zu beenden, die er noch nicht gesehen hat.
- Fahren Sie auf Band und machen Sie etwas anderes.
Es stellt sich heraus, dass der Benutzer jedes Mal, wenn er keine Nachrichten erhalten hat, diese nie sieht. Aber sie könnten für ihn interessant sein. Darüber hinaus könnten sie kritisch sein und sein Leben radikal verändern.
Dieses Problem ist so typisch, dass es genau richtig ist, ihm einen speziellen Namen zu geben. Sei es das "Fragmented Awareness Syndrom".
Home Habra
SFO wird hier durch Paginierung verschlimmert. Beim Wechseln zwischen Seiten sieht der Benutzer Nachrichten von der vorherigen Seite. Und wenn er etwas länger auf einer Seite verweilt, kann er leicht ein paar Seiten „Schlachtung“ hintereinander bekommen. Ich habe dieses Problem in einem Hinweis zur Pajinisierung ausführlicher beschrieben .
Youtube
In den "empfohlenen" geben Sie einfach 18 oft beängstigende Videos heraus und das wars. Um etwas Neues in den Empfehlungen zu sehen, müssen Sie alles manuell löschen, was kein Interesse verursacht hat. Natürlich wird dies ein seltener Benutzer tun. In den "Abonnements" - sie sortieren einfach nach Datum, aufgrund dessen der alte, aber möglicherweise für den Benutzer interessante Clips, den er nie sehen wird. Es sei denn, es stößt auf sie in der "empfohlenen".
Wurzel des Problems
Wenn der Benutzer den Feed zum ersten Mal öffnet, hat er nur eine Empfangsstelle für Nachrichten - unmittelbar nach der vorherigen Anzeige. Er schaut sie an und plötzlich erscheint ein zweiter Einstiegspunkt - irgendwo oben. Und es ist schwer zu sagen, wo die Nachrichten relevanter sind. Wenn er nach einer Pause zurückkehrt, hat er sofort mindestens zwei Punkte: den Anfang des Bandes und den Ort, an dem er das letzte Mal die Nachrichten gesehen hat. Und da der Benutzer privat nicht die Möglichkeit hat, die Nachrichten zu sehen, bevor sie zuvor angesehen wurden, multiplizieren sich diese Empfangspunkte für Nachrichten und multiplizieren sich.
Lösung
Der Empfangspunkt für relevante Nachrichten sollte nur einer sein. Gleichzeitig sollten die relevantesten Nachrichten in Echtzeit darin empfangen werden. Unter allen Nachrichten können die folgenden Gruppen unterschieden werden:
- Sichtbar. Die Nachrichten, die wir zuvor für ihn aufgegriffen haben und die er jetzt auf dem Bildschirm sieht.
- Gesehen. Nachrichten, die der Benutzer bereits gesehen und gescrollt hat. Wenn die Nachrichten den sichtbaren Bereich verlassen, können Sie sie sicher als gelesen markieren.
- Die Geschichte. Eine Nachrichtenliste, die für einen bestimmten Benutzer erstellt wurde. Dies umfasst sowohl die Nachrichten, die der Benutzer bereits angesehen hat, als auch die Nachrichten, die er gerade betrachtet.

Im Idealfall sollte auch das Neuladen der Seite nichts an der Nachrichtenliste ändern. Wenn der Benutzer weitere Nachrichten anfordert (durch Klicken auf die Schaltfläche oder Scrollen nach unten), wählen wir einen anderen Teil der aktuell aktuellsten Nachrichten aus und fügen sie in die Story ein. Somit hat der Benutzer eine klare Vorstellung davon, dass das Band etwas Interessantes ist und sich nicht ändert. Alles, was er jemals gesehen hat, ist in der Reihenfolge, in der er es gesehen hat. Und wenn er abschüttelt, bekommt er ständig etwas Interessantes, ohne sich Sorgen zu machen, dass etwas fehlen wird. Es ist wahr, dass es notwendig sein kann, lange zu wickeln, wenn es viele Neuigkeiten gibt.
Relevanz
Am einfachsten ist es natürlich, die neuesten Nachrichten für relevanter zu halten. Sie können dem Benutzer jedoch helfen, zu verstehen, was ihn interessiert und was nicht. Sie können dies tun, indem Sie die Möglichkeit hinzufügen, Nachrichten zu löschen. Wenn der Benutzer nicht nur durch die Nachrichten gescrollt, sondern sie gelöscht hat, damit seine Geschichte nicht verstopft wird, ist diese Art von Nachrichten für ihn nicht interessant und diese Informationen können für die nachfolgende Zusammenstellung verwendet werden.
API
Da unsere Geschichte von Ende an aufgefüllt und angezeigt wird, können wir keine herkömmliche Paginierung verwenden, da die Nachrichten dann ständig zwischen den Seiten wechseln. Darüber hinaus ist das Anfordern von etwa 100500 Seiten für das DBMS möglicherweise zu umfangreich. Daher werden wir für die Datenerfassung Anker verwenden. Dazu geben wir in der Anfrage folgende Daten an:
- Anker Die Kennung der Nachrichten, ab der die Daten zurückgegeben werden sollen. Wenn der Anker nicht angegeben ist, werden die zuletzt gelesenen Nachrichten als Anker verwendet.
- Offset. Die Anzahl der zu probierenden Nachrichten. Diese Zahl kann positiv sein und die Nachrichten kehren nach dem Anker zurück. Oder negativ und dann kehren die Nachrichten zum Anker zurück.
Wenn die Tendenz negativ ist, aber vor dem Anker keine erforderliche Anzahl von Nachrichten vorhanden ist, wird einfach zurückgegeben, wie viel es ist. Durch den Unterschied in der Anzahl der angeforderten und der Anzahl der Besucher kann der Kunde verstehen, dass wir am Anfang der Geschichte stehen.
Wenn die Tendenz positiv ist und nach dem Anker keine erforderliche Anzahl von Nachrichten vorhanden ist, wird die Geschichte durch die derzeit aktuellste Anzahl mit den aktuellsten Nachrichten ergänzt. Wenn die Nachrichten vollständig beendet sind, geben wir erneut zurück, wie viel es ist, und der Client erkennt das Ende des Bandes.
Abfrageskript
Wir öffnen das Band, wir haben noch keinen Anker:
GET /feed?offset=5
Wir bitten um ungelesene Nachrichten:
SELECT FROM history WHERE user = 123 AND read_at NOT NULL ORDER BY id ASC limit 5
Der Benutzer sieht eine Auswahl ungelesener Nachrichten, bei denen er das letzte Mal angehalten hat:
[ { id : 3232 } , { id : 5343 } , { id : 7346 } , { id : 9825 } , { id : 9967 } ]
Der Benutzer schwingt sich hoch, um die Nachrichten zu sehen, die er zuletzt gesehen hat:
GET /feed?anchor=3232&offset=-5
SELECT FROM history WHERE user = 123 AND id < 3232 ORDER BY id DESC limit 5
[ { id : 323 } , { id : 329 } , { id : 544 } , { id : 843 } , { id : 898 } ]
Der Benutzer wird heruntergefahren, um etwas Neues zu sehen:
GET /feed?anchor=7346&offset=5
SELECT FROM history WHERE user = 123 AND id > 7346 ORDER BY id ASC limit 5
Wenn Sie ein paar Neuigkeiten erhalten, wählen wir die erforderliche Anzahl der relevantesten aus, die in der Historie fehlen, und fügen sie der Historie hinzu. Danach geben wir alles zusammen zurück:
[ { id : 38574} , { id : 47246} , { id : 52378} , { id : 69238} , { id : 73294} ]
Erkenntnisse in der Tierwelt
Wenn Sie Dienste kennen, die Feeds auf diese oder eine ähnliche Weise implementieren, werde ich gerne hier Links zu ihnen veröffentlichen, damit die Leser die Bequemlichkeit dieses Ansatzes schätzen können.