Управление информационными потоками

Я считаю себя человеком, стремящимся к максимальной эффективности. Это не какая-то вещь, для поддержания которой мне приходится ежедневно прилагать сознательные усилия, а особенность моего мозга: любая неэффективность меня раздражает. Если я могу выполнить задачу за шесть часов вместо восьми, то я с радостью пару раз сыграю в Доту. Между написанием кода для обхода блокировщика рекламы и подметанием улицы я выберу подметание улицы — уборка мусора приносит больше пользы, чем его создание. И так далее.

Поэтому я активно охочусь на концепты, которые позволяют мне все делать быстрее и правильнее. Все что угодно, лишь бы это позволяло экономить время и силы.

Причем речь не идет о различных техниках управления временем, вроде Pomodoro. Я еще в детстве заметил, что дополнительные дисциплинарные приемы скорее уменьшают мою эффективность, чем увеличивают, когда пытался заставить себя выполнять домашнюю работу в определенное время. Все эти приемы очень индивидуальны и предназначены для неорганизованного мозга. Мозг же организованный от природы начинает пинать своего владельца тем сильнее, чем дольше он не занят чем-нибудь полезным. Главный дисциплинарный прием в таком случае — сойтись с ним в том, какое занятие является наиболее продуктивным в данный момент.

Я ценю более универсальные концепты — техники работы с информацией, выгоду от которых может получить практически любой человек.

Для примера: любой инфодизайнер знаком с преимуществами использования персональной записной книжки. Она позволяет разгрузить мозг от информации, которая понадобится когда-то в будущем, и сосредоточиться на том, что важно в данный момент. Да, для этого требуются базовые знания о работе с информацией и определенная личная реорганизация. Но в отличие от приемов тайм-менеджмента, записная книжка не загоняет человека в жесткие дисциплинарные рамки и не имеет никакого свода обязательных правил. После знакомства с основами приема и его назначением, человек может подстроить этот прием под себя. Это очень общий концепт, поэтому он очень гибкий и подходит почти всем.

Одним из таких концептов я начал активно пользоваться несколько месяцев назад и сейчас попытаюсь сформулировать.

I. Speakers and Listeners

Основа концепта проста и знакома многим людям, занятым в IT, медиа и подобных сферах.

Девочка Маша, встретив на улице мальчика Сашу, сообщила тому важную информацию. Мальчик Саша, не умеющий держать язык за зубами, проболтался своему лучшему другу Вове.

В этой простой информационной цепочке представлены все основные сущности обмена информацией.

Маша является спикером — источником информации. Более того, она потенциально является первичным источником, если она не пересказала Саше информацию, полученную от кого-то еще.

Саша и Вова — слушатели. Они получили информацию от спикера и вольны поступать с ней как им будет угодно. Саша, к примеру, решил передать эту информацию другому человеку, что делает его одновременно и слушателем, и спикером. Такую комбинацию можно назвать трансмиттером — промежуточным звеном информационной цепи. Вова же решил полученную информацию держать в себе, поэтому цепочка на нем закончилась. По крайней мере пока: до тех пор, пока Вова или Саша не решатся поделиться информацией с кем-нибудь еще.

В этом, вкратце, и состоит вся суть обмена информацией в обществе.

Каждый день мы получаем информацию из различных источников. Чаще всего эти источники являются вторичными (т.е. трансмиттерами), поэтому могут искажать информацию. Иногда мы решаем поделиться полученной информацией с другими людьми, что делает нас самих трансмиттерами и возлагает некий груз ответственности за корректность передаваемой информации, чтобы весь процесс не превращался в игру в глухие телефоны.

На таком поверхностном уровне от концепта уже есть польза. Теперь мы знаем, что у любой информации есть источник, трансмиттерам не всегда можно доверять, а к вопросу передачи информации другим людям нужно подходить внимательно и ответственно.

Теперь чуть углубимся и перейдем к основному содержимому.

II. Channels and Subscribers

Разговор между Машей и Сашей вряд ли был первым и вряд ли будет последним. Если у Маши частенько есть интересная информация, которой она спешит поделиться, это делает ее постоянным спикером. А у постоянных спикеров могут быть постоянные слушатели.

Иными словами, Маша создала информационный канал. Ее слушатели превратились в подписчиков, и теперь следуют за ней по пятам и с замиранием сердца ждут от нее... голубиных писем. Или что там у них было в доинформационную эпоху?

Каналы изначально были очень человечными. Люди объединялись в группы и обменивались информацией с глазу на глаз. Подписчики собирались в кружок и слушали любимого спикера.

prideandprejudice

Затем начали набирать оборот газеты и журналы, доски с объявлениями, всяческие бюллетени и прочая, и прочая. У канала теперь могло быть больше одного автора, а подписчики могли быть разбросаны по всему миру и следить за каналом с любой точки земного шара. Обмен информацией с глазу на глаз перестал быть основным.

Сегодня каналы — это то, что люди смотрят по телевизору и слушают по радио. Все новостные ленты и подписки в Twitter, Facebook, YouTube, Instagram и прочих сервисах. Часть электронной почты и многие чаты.

Все эти каналы, вдобавок к обычным «оффлайновым» каналам, не только отнимают наше время, но и формируют нашу информационную среду.

Here’s my theory. If you’re an average well-off person, leading your average well-off life, consuming average well-off media and seeing ads targeted at the average well-off demographic, and going over to your average well-off friends’ houses and seeing their average well-off products, which are you more likely to hear about? A structured-light optical engine for cytological research? Or a juicer?

Scott Alexander

Если не держать личный список подписок под контролем, то информационная среда превратится в информационное болото. В ней, словно сорняки, будут незаметно появляться каналы, которые не приносят никакой пользы, а только тратят время и отвлекают от других, полезных каналов.

От некоторых каналов-паразитов можно защититься (спам и рекламу, например, можно блокировать автоматически), но большинство других требует «тестового заезда» — внимательного знакомства или временной подписки, без которых бывает сложно понять ценность канала.

Поэтому список подписок, как и хороший сад, требует периодической инспекции. Интересен ли мне этот канал до сих пор? Важна ли для меня информация, которая на нем публикуется? Стоит ли она потраченного времени?

Любой канал, который не прошел такую проверку, должен быть удален из списка. Сделать это в виртуальном мире довольно легко: у всех популярных сервисов есть кнопка «отписаться». Особо назойливых авторов можно добавить в игнор-лист или черный список.

Это очень важное отличие виртуального мира от реального, в котором нет подобных инструментов. Блокировать людей в реальном мире сложнее и... не очень разумно.

К слову, у Black Mirror есть эпизод, затрагивающий эту тему.

Управление каналами в реальной жизни должно выглядеть не как попытка забанить всех людей, с чьим мнением ты не согласен, а скорее как поиск интересных людей и дрейф от неинтересных. Этими интересными людьми должны быть не только единомышленники, но и всевозможные бунтари, новаторы, пионеры, визионеры и мечтатели. Люди с открытым умом, обладающие способностью видеть проблему с разных точек зрения, не боящиеся идти против общественного мнения, и вдохновляющие других поступать правильно, а не так, как принято. Такие люди помогают выйти из зоны комфорта и покинуть «царство дураков» — привычное застойное общество, погрязшее в предрассудках и стереотипах.

Как искать интересных людей и минимизировать вред от людей неинтересных — это вопрос, достойный отдельного обсуждения, и особо актуальный в свете открытых дебатов на тему влияния социокультурных факторов на формирование интеллекта. Но чтобы не отвлекаться от основной темы, я хочу подробнее остановиться не на проблемах общения людей в реальной жизни, а на особенностях работы с каналами в виртуальном мире.

III. Zephyr

Интернет — это бесконечный океан информации. К всеобщему счастью, он представляет собой не ком слипшихся данных, а поделен на огромное число независимых ресурсов, иначе бы с ним было невозможно работать. Каждый ресурс посвящен одной или нескольким темам. Если информация на нем периодически обновляется, то каждая тема превращается в канал, на который можно подписаться.

Некоторые ресурсы вроде YouTube даже используют термины «канал» и «подписчик» в своем интерфейсе, давая пользователю возможность выцепить информацию из общего потока. Другие используют схожие термины: лента, стрим, читатель, фанат и так далее.

Даже если ресурс не позволяет пользователю работать со своими каналами посредством веб-интерфейса, он может предоставлять новостную ленту (RSS / Atom) или почтовую рассылку.

Такое разнообразие способов подписки должно в идеале приводить к тому, что автор небольшого проекта реализует хотя бы один способ, а большой сервис (вроде того же YouTube) реализует их все, чтобы пользователь мог выбрать наиболее подходящий.

Но это совсем не то, что я наблюдаю каждый день.

Некоторые разработчики не торопятся добавлять подписку на свой ресурс, аргументируя это дополнительными трудозатратами и нагрузкой на сервер. Другие не могут или не хотят составить полную карту каналов, и делают, к примеру, одну-единственную RSS-ленту для всех категорий сайта. А крупные компании бывают настолько одержимы системой аккаунтов, что скрывают инструменты для работы с каналами (а то и часть данных) за регистрацией и закрытым API.

Кроме того, сам факт наличия нескольких способов подписки ведет к разрозненности. С некоторыми каналами приходится работать на сайте или в специальном приложении, с другими — в RSS-ридере, с третьими — в почтовом клиенте. У четвертых вообще нет подписки, поэтому их нужно проверять вручную или искать обходные пути.

Это неудобно, это отнимает время и делает работу с личным списком подписок неэффективной. Плюс, меня давно посещала идея объединить все новости и уведомления в одном приложении. Поэтому я решил его написать.

Zephyr

Начну с того, чем Zephyr не является.

Zephyr — это не RSS-ридер. Он поддерживает и RSS, и Atom, но не позволяет полноценно отображать содержимое ленты. Zephyr — это не десктопный клиент Twitter (или других сервисов). Он не интегрирован в его структуру, не позволяет писать и лайкать твиты. Также он не является почтовым клиентом, мессенджером и ответом на главный вопрос жизни, вселенной и всего такого.

Zephyr — это центр уведомлений. Его главная задача — кидать пользователю небольшие сообщения при возникновении какого-либо события.

Каждое сообщение может быть самодостаточным или содержать ссылку на полный текст, которую можно открыть в браузере. Поэтому Zephyr отлично дополняет браузер — при обновлении новостной ленты пользователь получает ссылку и переходит на полноформатный текст статьи на новостном ресурсе.

Из коробки приложение поддерживает любой XML-подобный файл, что позволяет подписываться на новостные ленты и практически любые веб-страницы. Для выбора нужной части страницы используется CSS-селектор, поэтому приложение предназначено больше для продвинутых пользователей. Но об этом чуть позже.

Средства для поиска CSS-селектора есть почти в любом браузере (Firefox, Chrome).

Вот несколько примеров из скриншота.

RSS:

https://creativecommons.org/feed/
item > link

Twitter:

https://twitter.com/elonmusk
p.tweet-text

YouTube:

https://www.youtube.com/user/Kurzgesagt/videos
.yt-lockup-title

На что еще можно подписаться? Новинки киноиндустрии, свежие эпизоды сериала, новые альбомы музыкальных исполнителей, обновления любимого приложения, сообщения в теме форума, события в мире, прогноз погоды, курсы валют... Любые сайты, на которые вы периодически заходите в ожидании обновления.

Если нужный канал не является XML-файлом (или требует авторизации), то для него можно написать плагин. Каждый плагин для Zephyr — это скрипт на Python, возвращающий список сообщений.

Вот простой плагин, который построчно считывает файл и оформляет каждую строку как сообщение. Если кинуть его в папку plugins, то при создании канала можно будет выбрать новый тип канала.

import os
import codecs

__version__ = "1.3.1"

PLUGIN_INFO = {
        "id": "file_linebyline",
        "name": "File",
        "settings": [
                {"id": "filename", "name": "File", "type": "str"},
        ]
}


def run(settings, **kwargs):
        messages = []
        filename = settings["filename"]
        if not os.path.isfile(filename):
                error = {"text": "file '{0}' was not found".format(filename)}
                return {"errors": [error]}
        with codecs.open(filename, "r", "utf-8") as f:
                for line in f:
                        messages.append({"text": line.strip()})
        messages.reverse()
        return {"messages": messages}

Плагины, кроме прочего, позволяют снизить сложность использования приложения. Скажем, если добавить специальный плагин для Twitter, то от пользователя больше не потребуется знаний CSS — для подписки достаточно будет ввести имя аккаунта.

Можно создать плагин, который не будет брать информацию из внешних источников, а будет каналом сам по себе. Пример: напоминание о днях рождения и других важных датах.

Если Zephyr запущен постоянно, то им можно даже пользоваться как планировщиком: периодически заливать файлы на сервер, делать резервное копирование и прочее.

В ближайших планах у меня написать плагины для почты и персональных лент Twitter и YouTube. В более неопределенном будущем — подробнее описать структуру плагинов, особенности версионирования, открыть исходный код и сделать другие полезные вещи.

Код Zephyr кроссплатформенный, но для Linux и macOS билды не оптимизировались. Поэтому выкладываю пока только билд для Windows (7 и выше). Для ОС ниже Windows 10 может понадобиться VC Redist 2015.

Zephyr 1.3.1

Уже сейчас, без всяких плагинов, мой список подписок насчитывает более 70 каналов. Надеюсь, кому-нибудь приложение пригодится так же, как пригодилось мне.