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

Итак, мы – компания, оказывающая своим клиентам высокотехнологичные услуги – аутсорсинг ИТ-экспертизы, удаленное сопровождение, разработка ПО на заказ и т.д. и т.п. Как и для любой другой компании, для нас актуален вопрос соблюдения трудовой дисциплины и контроля присутствия наших высококвалифицированных сотрудников на рабочем месте. Задачи такого рода относительно успешно решаются в тех случаях, когда сотрудники а) работают по строгому графику в офисе и б) их отношением к тому, что за ними следят, можно пренебречь. То есть можно установить на входе в офис традиционные СКУД, поставить следящее ПО на офисные компьютеры и спокойно реализовывать функции Большого Брата. Но в случае работы с экспертной командой все эти меры сработают скорее в минус, и вот почему.

Во-первых, типичный сотрудник высокотехнологичной компании (далее назовем его «эксперт») – это человек, который работает не только на работе и не только в традиционное рабочее время. Это связано… это может быть много с чем связано – с фактической необходимостью осуществлять какие-то работы ночью, с разницей часовых поясов с клиентами, в конце концов с тем, что пик производительности нашего гениального разработчика приходится на интервал между 23-00 и 4-00, и в это время он творит чудеса. Соответственно, необходимо учитывать не пребывание в непосредственной близости от рабочего компьютера, а фактическую работу на нем (возможно, и удаленно из дома).

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

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

Ну и, в-четвертых, к программам, собирающим данные пользователя, с подозрением относятся сами высокотехнологичные компании. Мало ли куда потом эти данные уплывают…

В общем, мы проблему для себя осознавали, но, как настоящий «сапожник без сапог», решать ее для себя не спешили. Пока с такой же проблемой к нам не обратился наш Клиент. Вот отсюда начинаются ранее анонсированные совпадения.

Так вот, наш клиент — компания, оказывающая своим клиентам высокотехнологичные услуги. А именно, стартап, специализирующийся на услуге Dedicated Developers Team (когда программистов сдают в аренду заказчику). Понемногу количество программистов у клиента разрослось, и встал вопрос о трудовой дисциплине и контроле рабочего времени. А традиционными средствами пользоваться клиент не хотел, по причинам, полностью совпадающим с описанными выше. Так что совпадение потребностей было стопроцентное. С предложением решить для него эту задачу клиент обратился к нам, и мы с энтузиазмом (предчувствуя как минимум двойную пользу =) ) принялись исследовать вопрос.

Оказалось, что наш клиент, как и мы, работает преимущественно под Windows. И приложения, с которыми он (как и мы!) работает, довольно тяжеловесные, типа SharePoint. На обычном домашнем ноутбуке, и уж тем более на IPad, не поработаешь. Поэтому сотрудники используют свою рабочую машину даже когда работают из дома – они подключаются к ней через службу удаленного рабочего стола RDG (Remote Desktop Gateway). Все, как у нас!

Далее выяснилось, что и мы, и заказчик используем в качестве и офисной АТС, и универсального средства коммуникаций Skype for Business (бывший MS Lync). Эта программа, кроме своих непосредственных обязанностей, выполняет еще одну – она в любой момент времени может сообщить статус присутствия пользователя в системе. Итак, сотрудник всегда для работы пользуется рабочим компьютером – на нем всегда стоит Skype for Business – Skype всегда знает статус присутствия пользователя… Небольшое умственное усилие – и идея сбора истории изменения статусов и получения на основе нее графика работы прочно обосновалась в нашем коллективном разуме. Осталось только ее реализовать, к чему мы и приступили.

Естественно, сбор статистики с клиента не имел большого смысла, т.к. не видно на каком устройстве в данный момент работает сотрудник. Следовательно, надо было смотреть на содержимое баз данных Skype серверов (речь, конечно же, о корпоративных серверах Skype4B). Соответствующая информация о структуре БД серверов Skype4B, хоть и не была документирована, но доступ к ней не потребовал каких-то операций по дешифрованию или декомпиляции. Под катом немного технических подробностей для заинтересованных.

Технические подробности
План:
  1. Базы данных Skype For Business сервера.
  2. База rtcdyn:
    • Понятие клиент в rtcdyn.
    • Извлекаем клиентов. Таблица [RegistrarEndpoint].
    • Работаем с изменениями статусов клиентов. Таблица [PublishedInstance].
    • Статусы клиентов. Колонка Availability.
  3. Журнал логов присутствия.

Базы данных Skype For Business сервера


Существует две базы данных, с которыми мы работаем при мониторинге изменения статусов:

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

[rtcdyn] – содержит динамическую информацию, касательно изменения статусов клиентов(программ) которые подключены к серверу Skype For Business.

База rtcdyn


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

Понятие клиент в rtcdyn

Прежде всего следует условится с понятием «клиент». Это прежде всего программа или веб браузер с которого происходит коннект к серверу Skype For Business. «Клиент» для соединения требует логин и пароль пользователя и предоставляет дополнительные сведения касательно устройства, часовой зоны. Важно понимать, что собираемая информация по «Клиенту» касается только «Клиента», а не реального пользователя. Т.е. сведения которые мы будем собирать зависят от того, где пользователь запустит «Клиент».

Рассмотрим пример:
  1. Пользователь А может запустить клиент внутри Remote Desktop сессии, и следовательно его клиент будет передавать серверу Skype For Business сведения о компьютере внутри Remote Desktop сессии.
  2. Пользователь А может запустить клиент на мобильном телефоне, и следовательно аналогично будут передаваться данные касательно мобильного телефона.

Все сведения от «клиентов» независимы друг от друга.

Извлекаем клиентов. Таблица [RegistrarEndpoint]

После коннекта к базе rtcdyn мы видим несколько таблиц. Среди них можно найти таблицу RegistrarEndpoint. Попробуем извлечь некоторую информацию из данной таблицы.

select top 5 ContactInfo 
from [rtcdyn].[dbo].[RegistrarEndpoint];



После преобразования полученной информации, мы можем увидеть сведения об источнике подключения к серверу Skype For Business.

Например:

P;sip:212.3.112.68:51024;transport=tls;ms-opaque=b68b30d990;ms-received-cid=608500;] ;;sip:lyncedge1-uk.point.local:5061;transport=tls;opaque=state:Ee.ag8rxSddCvwU5-K8q7K742RAAA;lrbwbyztosJ7NpwKGhwBHTHlngAA70f2c5f712 <sip:lyncedge1-uk.point.local:5061;transport=tls;opaque=state:Ee.ag8rxSddCvwU5-K8q7K742RAAA;lrbwbyztosJ7NpwKGhwBHTHlngAA70f2c5f712>

Из данной строки можно извлечь IP адрес устройства с которого идет подключение «клиента».

Аналогично можно извлечь сведения из колонки ClientApp. В данной колонке находится информация про приложение из которого происходит сам коннект к серверу Skype For Business.

Примеры значений которые могут содержаться в ClientApp приведены ниже:

UCCAPI/15.0.4753.1000 OC/15.0.4753.1000 (Skype for Business)
RTCC/5.0.0.0 OWA/15.00.1076.009


На основании ClientApp можно определить название, тип клиента и его версию.

Работаем с изменениями статусов клиентов. Таблица [PublishedInstance]

Таблица PublishedInstance заполняется автоматически при поступлении информации об изменении статуса (Activity) «Клиента». Среди всех столбцов особенно интересны:

PublisherId – идентификатор аккаунта пользователя который подключается к Skype For Business;

LastPubTime – дата и время при котором произошло изменение статуса «Клиента»;

Data – основная часть сведений по измененному статусу. Позволяет понять что именно произошло со статусом в конкретный промежуток времени. Более подробное описание сведений которые могут находиться в столбце можно найти в Chapter 6 книги Enhanced Presence Lync 2010.

Мы же извлекаем из Data только информацию про Availability, TimeZoneBias, Device и PublisherId.

Отдельно следует сказать про BoundEndpointId. Этот столбец указывает на идентификатор сессии, которая устанавливается при каждом подключении «клиента» к серверу Skype For Business. По данному идентификатору мы можем определить дополнительные сведения по устройству, с которого подключается «клиент». Это позволяет вести изменения статусов индивидуально для каждого устройства.

В итоге, после применения выборки из столбца Data, группировки и сортировки мы получаем вот такой результат:


Статусы клиентов. Колонка Availability


Все статусы в базе пишутся только номерами, и Microsoft не дает информации, какой статус что означает. Есть только общие сведения по диапазонам, которые зарезервированы под различные Activity.

Например 15500 – away, mobile. Или 6700 – busy, presenting.

Пришлось потратить время на исследование и сбор статистики для составления таблицы-справочника диапазонов Activity:

В данном случае на основе справочника и колонки isav определяется – засчитывается ли время в активное или нет.

Журнал логов присутствия


Новая поступающая информация по статусам сохраняется в отдельную базу, которая никак не связана с базами rtc и rtcdyn. Параллельно мы обсчитываем общие сведения за прошедшие дни для ускорения вывода отчетов активного и неактивного времени «клиента». Сохранение логов производится с помощью TimerJob, либо в случае использования SQL Express с помощью Windows расписания.


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

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

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

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

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

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

Реализация со скринами системы:

SkypeTime
Личный кабинет:


Отчет по сотруднику за период:


больше скриншотов можно увидеть у нас на сайте


Можем констатировать – с задачей мы справились. Наш заказчик доволен, мы (пользуясь сами этой системой) довольны, сотрудники, деятельность которых контролируется… ну, как минимум, не недовольны, а некоторые, как уже сказано выше, и благодарны системе за структурированные отчеты о графике работы и другие сотрудник-ориентированные фичи. Пожалуй, систему не стоит использовать для ведения табеля или начисления зарплат, но в качестве инструмента, предоставляющего менеджеру оценочную информацию о работе сотрудника, она очень эффективна. Еще она является неоценимым подспорьем сотруднику-администратору, ведущему информацию об отгулах и отпусках. Такая ситуация, как — сотрудник в отпуске, начальник попросил его полдня поработать из дома, а потом взять это время в отгул — теперь легко отслеживается. А возможности настройки гибких условий типа «если в 9:15 не на работе значит прогул» или даже «можно опаздывать не чаще двух раз в неделю и если ночью работал с заказчиком, то можно поспать до обеда, а после поработать из дома» сделали возможным использовать систему для ИТ-компаний, где обычные СКУД практически не применимы. Ну и факт отсутствия «шпионского» ПО на компьютерах сотрудников благоприятно отражается на атмосфере в коллективе. А хорошая рабочая атмосфера – это, «по данным британских ученых», до 80% успеха работы =)

P.S. Да, конечно, было бы неплохо и смотреть статистику работы в интернет, и собирать список установленных программ, но это совсем другой уровень шпионажа, чреватый потерей лояльности коллектива. Кроме того, в нашей практике такие изощренные обманщики встречаются крайне редко, и они все же довольно быстро выявляют себя низкой производительностью или низким качеством работы – так что награда все равно находит героев.

Комментарии (23)


  1. Alliceinwonders
    09.12.2015 10:32
    +1

    Как система учитывает вариант «запустил клиент и ушел на два часа пить чай» или превращение удаленной работы требующей 20 минут в полтора часа за счет работающего клиента?


    1. serjdag
      09.12.2015 13:30
      +3

      На прошлой работе было… Если сотрудник не блокировал компьютер покидая рабочее место, то с легкой руки проходящего мимо админа все его коллеги, а иногда и вообще все сотрудники компании, «приглашались» на пиво/в ресторан/кафе/боулинг и т.д., за счет сотрудника, после чего сообщение удалялось из Отправленных и из Корзины


      1. FractalizeR
        09.12.2015 14:27
        +2

        И долго такие сотрудники работали после этого в компании? :)


        1. serjdag
          09.12.2015 14:56
          +1

          долго), но мотивировало к блокировке компьютера


      1. guestfromEarth
        09.12.2015 17:19
        +1

        Это как в «Место встречи...», когда Шарапов дело на столе оставил)


      1. bebop
        11.12.2015 19:33

        сотруднику надо было экран выключать перед уходом :)


    1. intet
      09.12.2015 16:24
      +2

      Есть еще вариант 20 минут работы 60 минут чтения хабра, для повышения учтенного рабочего времени.


  1. hazard2
    09.12.2015 10:39
    +5

    А в скайпе разве нельзя поставить зафиксировать статус «в сети»?

    Кроме того, было бы интересно посмотреть на человека, который был «благодарен системе за структурированные отчеты о графике работы».


    1. hardpoint
      09.12.2015 11:07
      +2

      перед системой не стоит задача тотального контроля, больше на доверие.

      но все же, если сотрудник запретил изменение статуса, и вдруг ему звонит менеджер, и сотрудник недоступен, то вопрос честности вызывает вопрос.


    1. Oxoron
      09.12.2015 11:10
      +1

      было бы интересно посмотреть на человека, который был «благодарен системе за структурированные отчеты о графике работы».

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


    1. MazayZaycev
      09.12.2015 13:24
      +2

      Статус в клиенте и у сервера Skype for Business это разные вещи, статус в клиенте поставить можно, но на сервере Inactive (5000-5999) или Away(15000-15999) все равно появятся. Например во время разговора приходит статус “in a call inactive” 5000

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


  1. Sergey-S-Kovalev
    09.12.2015 12:18
    +14

    Я всегда думал, что эксперты, это те кто у кого работа на результат, а не на «от звонка до звонка».

    Для тех кто не любит контроль со стороны линка по присутствию:
    Кладёте листок напротив выхлопа из ноутбука, под него авторучку под углом и сверху ставите мышку.

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


    1. hardpoint
      09.12.2015 12:39
      +6

      для обхода привязывают к мышке электробритву или зубную щетку, но это видно


    1. hardpoint
      09.12.2015 15:44
      +2

      У нас никто никого не “тыкает носом” в количество отработанных часов. Менеджер и так имеет представление кто есть кто в команде (особенно если в команде меньше 15 человек). Систему можно рассматривать как помощника. Если есть сомнения в сотруднике – посмотри на отчёты. В каком режиме человек работает, сколько раз за день он бегает покурить, чай попить, а может быть и на собеседования ходит. Уходит ровно в 18:00 или нет (если все время ровно, может быть проект человеку не интересен, а может ему предложить на 10 минут раньше уходить, потому что как выясняется он на автобус опаздывает?). Можно увидеть, ходят ли сотрудники на обед вместе или каждый за себя? И таких вопросов накапливается много.
      К тому же есть и психологический момент: мало кто любит чувствовать себя лузером, особенно в команде (если конечно команда есть). Если у меня за день (неделю) явно не доработки и к тому же на митинге сказать нечего, то может я на часик-другой задержусь.


  1. michael_vostrikov
    09.12.2015 12:54
    +1

    > после начала рассылки отчетов среднее время присутствия сотрудника на рабочем месте повысилось.
    Немного непонятно, а это как? Сначала работали с 9 до 18, а стали с 9 до 19?


    1. FractalizeR
      09.12.2015 14:28
      +1

      Наверное, в туалет стали меньше ходить. Хочется, но ведь время система все равно посчитает. Так что — терпеть! :)


    1. hardpoint
      09.12.2015 15:28
      +1

      рабочий день с 9 до 18, никогда не бывает 8 часов рабочих и 1 час обед. В жизни (по крайней мере у нас в компании) время работы в среднем составляет 07:25 – 07:40. А у отстающих было и меньше 7 часов, сейчас ситуация значительно выровнялась.


      1. michael_vostrikov
        09.12.2015 18:08

        Ясно, спасибо. Кстати, а есть какие-то границы, на которые сотрудник может ориентироваться — типа «среднее время должно быть 7 часов в день»?


        1. MazayZaycev
          09.12.2015 18:23

          За 1 день нет, а за период отображается в отчётах для менеджера и в личном кабинете сотрудника. Например, за неделю запланировано 40 часов, в рабочее время 38:42, сверхурочное — 03:36, итого on-line 42:18.


      1. frst
        10.12.2015 11:36
        +1

        не понимаю зачем конторе, у которой деятельность не привязана к реальному времени иметь такой античеловеческий график, утром в 9 все пробки собираешь, вечером в 18 все пробки собираешь, и так весь город, набиваются в маршрутки как селёдки, коллективное сумасшествие


        1. hardpoint
          11.12.2015 17:08

          система позволяет вести гибкий график без необходимости пользователю его отмечать или менятью


  1. qw1
    09.12.2015 15:18
    +2

    Вася, можешь подойти посмотреть, у меня что-то не компилируется.
    Не могу, у меня рабочее время перестанет считаться.


    1. hardpoint
      09.12.2015 15:22
      +2

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