Русский
Русский
English
Статистика
Реклама

Блог компании ростелеком

Обзор криптографического протокола системы дистанционного электронного голосования

15.09.2020 12:21:41 | Автор: admin
В этой статье мы разберем детали реализации криптографического протокола системы дистанционного электронного голосования.

Применение криптографических механизмов и алгоритмов на различных этапах избирательного процесса дает системе дистанционного голосования необходимые свойства. Давайте разберемся подробнее и рассмотрим этапы проведения голосования, описанные в обзорной статье.

Инициализация системы. На этапе инициализации голосования выполняются следующие криптографические операции:

  • Выработка ключевой пары валидатора для выдачи и проверки слепой подписи, как наиболее стойкий и рекомендуемый академическим сообществом для процедуры анонимизации в системах электронного голосования. В настоящий момент системой поддерживается алгоритмы слепой подписи на эллиптических кривых и на базе алгоритма шифрования RSA. В проводимом голосовании использовался алгоритм выдачи и проверки слепой подписи на базе алгоритма шифрования RSA с длиной ключа 4096 бит.
  • Выработка общего открытого ключа шифрования. Для большей безопасности в процессе выработки ключа используется сразу два криптографических алгоритма: протокол DKG Pedersen 91 распределенной выработки ключа и протокол разделения ключа Шамира. Выработка ключа осуществляется как участниками, обладающими техническими средствами, позволяющими контролировать непосредственно ноды сети и сервера подсчета, так и участниками, которые являются хранителями ключей, записанных на внешние носители. Итогом работы двух этих алгоритмов является общий открытый ключ шифрования бюллетеней. Далее мы более подробно рассмотрим процедуру выработки этого ключа.

Предоставление доступа к бюллетеню. На данном этапе работают следующие механизмы:

  • Выработка ключевой пары электронной подписи на устройстве избирателя по ГОСТ Р 34.10-2012
  • Выработка слепой подписи для маскированного открытого ключа избирателя для удостоверения и последующей проверки его права принять участие в голосовании. В настоящий момент механизм базируется на алгоритме шифрования RSA. Подробно механизм анонимизации рассматривается в отдельной статье.

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

  • Шифрование бюллетеня по схеме Эль-Гамаля на эллиптических кривых. Данная схема используется в протоколе, поскольку обладает свойством гомоморфности по сложению, что позволяет получить результаты голосования без расшифрования каждого бюллетеня.
  • Доказательство с нулевым разглашением Disjunctive Chaum-Pedersen range proof используется для доказательства корректности содержимого бюллетеня без его расшифрования. Данный механизм мы разберем подробно в следующей статье.
  • Электронная подпись зашифрованного бюллетеня по ГОСТ Р 34.10-2012.

Подсчет итогов. На этапе подведения итогов выполняется:

  • Гомоморфное сложение зашифрованных бюллетеней.
  • Предварительное частичное расшифрование итогового суммированного бюллетеня частями закрытого ключа участниками, контролирующими отдельные ноды и серверы подсчета с получением шифротекстов от каждого участника;
  • Сборка закрытого ключа в Избирательной комиссии и частичное расшифрование итогового суммированного бюллетеня собранным ключом.
  • Окончательное суммирование шифротекстов и получение итогов подсчета.
  • Выработка и проверка доказательства с нулевым разглашением Chaum-Pedersen proof. Используется для доказательства корректности расшифрования итогового суммированного бюллетеня. Данный механизм мы разберем подробно в следующей статье.

Аудит. На данном этапе могут быть выполнены проверки корректности всех этапов протокола, и в этой статье мы подробнее рассмотрим возможные проверки.

Давайте разберем криптографические механизмы подробнее.

Блокчейн-платформа


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

Ниже на рисунке приведена упрощенная целевая схема размещения блокчейн-платформы.



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

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

Список участников может со временем меняться от минимального на этапе запуска системы в промышленную эксплуатацию, до достаточно широкого и полностью децентрализованного по мере развития системы. При этом всегда существует возможность размещения набора компонентов вне ЦОД.

В качестве блокчейн-платформы используется отечественное решение Waves Enterprise. Транзакции и блоки подписываются по ГОСТ Р 34.10-2012.

Выработка ключей шифрования


Общий открытый ключ шифрования бюллетеней вырабатывается с применением двух криптографических алгоритмов: протокол DKG Pedersen 91 распределенной выработки ключа и протокол разделения ключа Шамира. На базе каждого из этих алгоритмов вырабатывается промежуточный открытый ключ. Затем эти два ключа комбинируются в один общий.

Схема сборки ключа приведена ниже на рисунке.



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

Но если нет возможности собрать кворум независимых участников блокчейн-сети, запускается процедура разделения ключа между независимыми участниками, которые являются хранителями отдельных частей ключа, записываемых на внешние носители (ключ Комиссии)

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

Затем инициализируется создание голосования в блокчейн сети. После создания голосования на серверах подсчета автоматически запускается процедура выработки открытого ключа DKG.

Участниками процедуры распределенной выработки ключей являются n серверов подсчета голосов, о которых мы писали ранее в обзорной статье. Все операции взаимодействия серверов подсчета, как промежуточные, так и конечные фиксируются в блокчейне, а, следовательно, прозрачны и проверяемы. В системе реализована пороговая схема k из n, то есть при расшифровании данных не требуется участие всех n сторон, формировавших открытый ключ DKG, достаточно меньшего числа участников k. Это позволяет расшифровать результаты голосования, даже если n-k серверов подсчета недоступно, либо их закрытые ключи утрачены.

Для формирования открытого ключа используется алгоритм DKG (Distributed Key Generation), описанный в статье A threshold cryptosystem without a trusted party автора Torben Pryds Pedersen, перенесенный на эллиптические кривые. Предполагается, что каждый сервер обладает постоянной (фиксируются регистратором в учетчике) ключевой парой Диффи-Хеллмана, используемой для защищенной передачи данных этому серверу (экспорт/импорт долей ключа).

Параметры протокола


  • Эллиптическая кривая E и генератор P подгруппы этой кривой большого простого порядка q. В текущей реализации используется кривая secp256k1.
  • Другой генератор Q той же подгруппы, для которого значение $x: Q=xP$ неизвестно никому.
  • (k,n), где n общее число участников, сгенерировавших пары ключей, а k минимальное число участников, которое необходимо для восстановления общего секрета, при этом $k(n+1)/2$. То есть, если k-1 участников скомпрометированы или у них украли ключи, то это никак не повлияет на безопасность общего секрета.


В общем виде алгоритм получения точки Q выглядит следующим образом: берется любая последовательность байт, например строка Hello, World!, и от нее считается хэш h = Hash(Hello, World!) после чего преобразуем последовательность байт h в число и считаем $x0=h mod p$, где p модуль кривой, подставляем $x0$ в уравнение кривой: $y^2= x0^3+ a*x0+b mod p$ и пытаемся его решить относительно y. При отсутствии решения мы инкрементируем x0 и снова пытаемся решить уравнение для нового значения x0 и т.д.

Шаг 0.
Каждому из n серверов присваивается уникальный порядковый номер от 1 до n. Это необходимо, поскольку коэффициент Лагранжа зависит от порядкового номера сервера.

Шаг 1 создание открытого ключа DKG.

Каждый j -й сервер, j=1,,n:
1. Генерирует пару закрытый ключ priv_j и открытый ключ $Pub_j=priv_jP.$
2. Делает Pedersen commitment для открытого ключа:
Генерируется случайное число r_j
Вычисляется точка $C_j=r_jQ+Pub_j$
$C_j$ публикуется с помощью учетчика
3. После того как все серверы опубликовали свои значения C_i, публикуется скаляр r_j.

Используя скаляры, каждый может восстановить открытые ключи каждого сервера $Pub_j=C_j-r_jQ$ и вычислить открытый ключ DKG $Pub=_(j=1)^n Pub_j $.
Отрытый ключ DKG записывается в блокчейн.

Шаг 2 генерация полиномов и раздача теней.

Каждый j -й сервер, j=1,,n:

1. Генерирует случайным образом полином степени k-1:
$f_j (x)=f_(j,0)+f_(j,1)x++f_(j,k-1)x^(k-1),$
где коэффициент $f_(j,0)=priv_j$, а остальные случайные элементы поля GF(q).

2. Считает значения полинома $f_j (i),i=1,,n,ij.$

3. Зашифровывает значение $ f_j (i)$ при помощи открытого ключа экспорта/импорта i -го сервер для каждого i и публикует с помощью учетчика результаты шифрования.

Шаг 3 проверка коэффициентов полиномов.

Каждый j -й сервер, j=1,,n:

1. Публикует каждый коэффициент своего полинома, умноженный на генератор P.
$F_(j,0)=f_(j,0)P,F_(j,1)=f_(j,1)P,,F_(j,k-1)=f_(j,k-1)P$
2. Расшифровывает все значения $f_i (j),i=1,..,n,ij$ и проверяет их корректность:
Вычисляет $A=f_i (j)P$
Вычисляет сумму
Если A=B, то результат принимается, иначе публикуется жалоба на сервер i, и протокол запускается с самого начала переход к шагу 0.
3. Если ни у кого нет жалоб, то вычисляет свой секретный ключ



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

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

MainPubKey = Hash(PubDKG, PubCommission)*PubDKG + Hash(PubCommission,PubDKG)*PubCommission

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

Описание схемы шифрования бюллетеней


Ниже приведем описание процедуры шифрования бюллетеней по схеме Эль-Гамаля на эллиптических кривых.

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

Encrypted (A) + Encrypted (B) = Encrypted (A+B).

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

Длина закрытого ключа при использовании алгоритма Эль-Гамаля на эллиптических кривых выбирается равной 256 бит, открытый ключ при этом представляет из себя точку эллиптической кривой. Это соответствует уровню безопасности в 128 бит (для взлома необходима 2^128 операций с точками кривой). Такой уровень считается оптимальным для большинства современных промышленных и финансовых систем, в том числе для российского стандарта ГОСТ 34.10-2018 Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи (вариант 256 бит).

В качестве эллиптической кривой используется secp256k1.

Допустим, мы имеем ключевую пару priv, Pub:
Число priv: 0 < priv < q
Точка Pub = priv*Base

Зашифрование:

  • Есть сообщение m, небольшое число, которое мы хотим зашифровать на ключе Pub.
  • Вычисляем точку M = m*Base
  • Генерируем случайное число r: 0 < r < q
  • Вычисляем точку R = r*Base и точку C = M + r*Pub
  • Шифротекст: (R, C)

Расшифрование:

  • Имеется закрытый ключ priv и шифротекст (R, C)
  • Вычисляем точку M = C priv*Base
  • Восстанавливаем m: решаем перебором ECDLP для соотношения M = m*Base

Гомоморфность схемы.

Мы видим, что если зашифровать два сообщения $M1 = m1*Base$ и $M2 = m2*Base$ на ключе Pub:
$(R1, C1) = (r1*Base, M1 + r1*Pub)$
$(R2, C2) = (r2*Base, M2 + r2*Pub)$

То их сумма $(R1 + R2, C1 + C2)$ соответствует зашифрованному сообщению $M1 + M2$.

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

Иванов Петров Сидоров

0 1 0


Тогда, преобразовав его в точки, получим:

Иванов Петров Сидоров

ZeroPoint Base ZeroPoint

где ZeroPoint это точка на бесконечности.

И, наконец, шифруем бюллетень на ключе Pub:

Иванов Петров Сидоров

$(r1*Base, r1*Pub)$$(r2*Base, Base + r2*Pub)$$(r3*Base, r3*Pub)$

Допустим, что мы провели такое голосование с N избирателями. Если для Иванова, Петрова и Сидорова отдельно сложить шифротексты из разных бюллетеней, то получим суммарный бюллетень, который содержит зашифрованные суммы за каждого из кандидатов. Этот суммарный бюллетень можно расшифровать ключом расшифрования и узнать результаты голосования за каждого из кандидатов.

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



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

Описание процедуры расшифрования


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

Для того, чтобы расшифровать шифротекст (R,C) необходимо, чтобы любые k из n серверов вычислили и опубликовали значение $s_jR$ и доказательство корректности расшифрования Chaum-Pedersen (доказательство, что посчитанный $s_jR$ это именно точка R, умноженная на $s_j$, не раскрывая значения $s_j$). Также для этого необходимо собрать закрытый ключ комиссии из не менее чем k1 из т1 частей и с его помощью также выполнить вычисление $s_jR$ с публикацией в блокчейн.



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

Первый этап частичная расшифровка. Каждый K из N серверов системы проводит сложение шифротекстов голосов, получает суммарный бюллетень и выполняет расшифровку на своей части закрытого ключа голосования. Результатом этой операции будет являться шифротекст, комбинирование которого с шифротекстами, полученными в результате таких же операций, выполненных на остальных серверах подсчета, а также же с шифротекстом, полученным на закрытом ключе комиссии, будет давать расшифрованный итоговый результат. Важно отметить если не будет шифротекста, полученного от расшифровки на закрытом ключе комиссии, все остальные шифротексты становятся бесполезными. Получить из них какие-либо итоги невозможно.

Результаты операции публикуется в блокчейн.

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

Третий этап итоговая расшифровка. Серверы подсчета голосования агрегируют результаты K из N серверов, результат расшифрования на закрытом ключе комиссии, и производят окончательную расшифровку, затем производят публикацию результатов голосования.

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

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

Доказательства с нулевым разглашением


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

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

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

Более подробное описание реализации NIZK, а также их проверки, будет рассмотрено в отдельной статье.

Структура записей в блокчейне


Вся информация в блокчейне записывается тремя типами транзакций:

  • CreateContract для создания смарт-контракта под конкретное голосование. Далее в этом смарт-контракте будет агрегироваться вся информация по голосованию. Если одновременно проводится два (и более) голосования, то создается, соответственно, два (и более) экземпляра контракта.
  • CallContract для взаимодействия со смарт-контрактом по различным операциям, перечень которых приведем далее.
  • Data transaction для записи списка избирателей после создания экземпляра смарт-контракта голосования и перед началом непосредственно голосования.

Взаимодействие со смарт-контрактом производится по следующим операциям:

  • Запись базовых данных в смарт-контракт. Здесь сохраняются публичные ключи северов подсчета, которые будут участвовать в криптографическом протоколе, threshold схема, ключи проверки слепой подписи и другие данные, необходимые для организации работы протокола и голосования в целом.
  • dkgScalar, dkgCommit, dkgShadows данные, необходимые для сборки публичного ключа шифрования бюллетеней и реализации пороговой k из n схемы. Подробнее об этом поговорим далее в статье.
  • addMainKey запись набора публичных ключей и общего публичного ключа шифрования бюллетеней.
  • blindSigIssue запись факта выдачи слепой подписи.
  • vote запись непосредственно зашифрованного голоса избирателя.
  • finishVoting команда завершения голосования. После нее новые бюллетени не принимаются.
  • Decryption запись частичного расшифрования результатов голосования. Отправляется каждым сервером подсчета.
  • ComissionDecryption запись частичного расшифрования результатов голосования на закрытом ключе комиссии.
  • Results запись расшифрованных итогов голосования. О расшифровании, подведении итогов и записи результатов подробнее далее в статье.

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

Ниже на рисунках представлено отображение транзакции с голосом в блокчейн-клиенте.





Вся информация о голосовании агрегируется на смарт-контракте и будет доступна через блокчейн-клиент наблюдателям или в виде csv-файла любому желающему.

Ниже на рисунке представлено отображение агрегированной информации в смарт-контракте.


*Данные с тестового сервера.

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

Проверки криптографического протокола и процесса голосования


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

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

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

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

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

Исходный код, реализующий криптографические операции, доступен в этом репозитории на GitHub.
Подробнее..

Спасибо, что живой как мы выбирали пассивный лайвнесс

29.12.2020 12:11:44 | Автор: admin

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

На Хабре не так много статей, посвященных лайвнесс в биометрических системах, а те, что есть, описывают методы и алгоритмы определения лайвнесс или, проще говоря, принадлежности биометрических образцов живому человеку. Отдадим должное их авторам статьи интересные и содержательные, но что если нас интересует насколько хорошо они работают на данных, не входящих ни в один из открытых дата-сетов? Как понять, насколько лайвнесс действительно плох или хорош и какой следует выбирать при необходимости? В этой статье я опишу подход к выбору пассивного singleshot-лайвнесс (т.е. по одному изображению) лица для Единой биометрической системы.

Зачем нужен лайвнесс

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

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

Удалённая банковская идентификация: от сложного к простому, или Банки, зачем вам биометрия?

Мнение автора основано на устаревшей информации. Конкурс Deepfake Detection Challenge по распознаванию дипфейков на видео действительно существует, он проводится компаниями Amazon, Facebook и Microsoft. В этом году отечественная компания NtechLab заняла третье место среди более 2,2 тысячи команд со всего мира.

После прочтения данной статьи только укрепился в мысли, что во всех этих конструкциях есть один лишний элемент сама биометрия. Всё тоже самое точно так же работает и с традиционными способами аутентификации. С той лишь разницей, что вы скорее всего даже не заметите как вашу биометрию заснимут с расстояния 5-10-20 метров. Или вообще восстановят по публичным материалам. Как это уже проделывали. И не раз. И все эти ухищрения, как в этой статье просто упражнения для ума математиков. Но с точки зрения реальной безопасносьи яйца выеденого не стоит.

Ну и да. Уж что-что а социальная инженерия с биометрией упростится просто в разы. Про пин код с карты ещё хоть как-то можно объяснить, что никому не показывать, а вот биометрия Ну откуда бабульки (или даже мне) знать для каких целей меня сейчас снимают: чтобы подтвердить мою личность или чтобы украсть?

Как защитить биометрические данные пользователей от криминального использования

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

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

Новый метод биометрии: биоакустическая подпись

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

Биометрия по лицу, работающая с обычной веб-камеры крайне ненадежна и легко обманывается фоткой. Нормальные лицевые биометрии включают в себя дополнительные средства определения фейков: ИК, 3D и так далее.

Как Сбербанк собирает согласие на обработку биометрии

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

Биометрия активно развивается. Большинство вопросов, которые задают критики, уже имеют решение или решаются сейчас. Более того, в условиях ограничений, связанных с пандемией COVID-19, биометрические технологии получили большое распространение. Очевидным плюсом является сокращение числа прямых контактов: как людей с людьми, так и людей с поверхностями, что, как говорят специалисты, снижает вероятность заболеть. В связи с этим, например, банки встраивают биометрию в свои приложения и банкоматы. Институты используют биометрию для проверки студентов при удалённом режиме обучения. Всё больше работодателей выбирают биометрию для поддержания дисциплины среди удалённо работающих сотрудников.

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

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

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

Делай по ГОСТу

В июле 2020 года в России введена в действие серия стандартов 58624, устанавливающая термины, классификацию и детальное описание атак на биометрическое предъявление для последующего определения эксплуатационных характеристик. До этого времени не было стандартного руководства для объективной и сопоставимой оценки лайвнесс. Стандарты описывают испытания, объектом которых могут являться:

  • подсистема лайвнесс;

  • подсистема сбора биометрических данных;

  • биометрическая система полностью (контроль качества, распознавание и лайвнесс).

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

  • вероятность ошибки классификации предъявления при атаке вычисляют как долю атак, ошибочно классифицируемых как живые люди;

  • вероятность ошибки классификации подлинных биометрических предъявлений вычисляют как долю живых людей, классифицируемых как атаки; вероятность отсутствия ответа на предъявление артефакта (ВООПА) вычисляют как долю атаки, на которую лайвнесс не ответил. ВООПА рассчитывается отдельно для каждого инструмента атаки;

  • вероятность отсутствия ответа на подлинное биометрическое предъявление вычисляют как долю подлинных предъявлений, на которую лайвнесс не ответил;

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

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

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

У нас был сервер, пять веб-камер, один смартфон и пять сотен фотографий

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

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

Для наших испытаний мы выбрали следующие инструменты атак:

  • фотографию лица предъявление распечатанной на цветном принтере фотографии высокого разрешения;

  • 2D-маску предъявление распечатанной на цветном принтере фотографии высокого разрешения с обрезанным фоном;

  • модифицированную фотографию лица предъявление распечатанной на цветном принтере фотографии высокого разрешения с вырезанными отверстиями под рот, нос, глаза;

  • изображение лица на дисплее предъявление выводимой на дисплее фотографии;

  • 3D-маску предъявление силиконовой маски или маски, распечатанной на 3D-принтере.

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

На фото внизу представлен стенд по сбору базы на примере атаки с использованием фотографии лица.

Полученная база данных состоит из не менее 300 образцов на каждый инструмент атаки (за исключением силиконовых масок), что дает минимальную достоверную вероятность 1%. Для сбора образцов использовались несколько веб-камер и мобильный телефон:

  • Logitech C270;

  • Logitech C930;

  • Logitech B920;

  • Logitech Brio;

  • Intel Realsense D415;

  • Xiaomi Redmi6.

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

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

Спецификация сервера, на котором проходили испытания:

1) CPU - Intel(R) Core(TM) i5-6600 CPU (4 ядра, 3.30 ГГц, AVX и AVX2 поддерживаются);
2) GPU - Nvidia GeForce GTX 1070 (8 ГБ видеопамяти);
3) ОЗУ - 16 ГБ DDR4;
4) ПЗУ - SSD накопитель SAMSUNG 970 EVO 500ГБ.

Результаты

Я провела испытания 12 методов лайвнесс от независимых вендоров. Все методы, кроме одного, являются пассивными singleshot-методами, для их работы на вход API подаётся RGB изображение лица, на выходе получается liveness score, отражающий насколько предъявленное изображение похоже на подлинное предъявление лица. Один из методов основан на применении 3D-камеры Intel RealSense D415 и, соответственно, на вход принимает RGB изображение и карту глубины изображаемой сцены, а на выходе отдаёт всё тот же liveness score. В таблице ниже приведен перечень измеренных значений эксплуатационных характеристик каждого из протестированных методов лайвнесс.

Рисунок 1 кривые компромиссного определения ошибки при предъявлении атак всех типов (print + replay + mask)Рисунок 1 кривые компромиссного определения ошибки при предъявлении атак всех типов (print + replay + mask)

Алгоритм

ВОКПБП@0.01

ДОПОПБП, мс

СКО_ДОПОПБП, мс

ВООПБП

ДОПОПА, мс

СКО_ДОПОПА, мс

ВООПА

vendor1_v1

0.013

266.501

160.091

0.395

542.772

471.081

0.320

vendor1_v2

0.042

155.626

108.508

0.395

381.548

367.438

0.320

vendor2_v2_CPU

0.048

874.527

21.748

0.008

910.202

60.381

0.039

vendor2_v2_GPU

0.057

863.651

26.629

0.006

903.743

62.957

0.037

vendor1_v3

0.094

110.198

100.997

0.811

293.092

242.255

0.437

vendor3

0.153

146.217

82.217

0.012

360.056

324.149

0.016

vendor2_v1

0.255

874.294

35.319

0.002

1060.088

121.127

0.036

vendor4

0.423

444.085

35.818

0.006

512.427

106.987

0.010

vendor5_v3

0.442

160.426

298.351

0.014

683.258

882.690

0.025

vendor6

0.477

73.560

111.626

0.035

433.866

527.738

0.044

vendor5_v2

0.584

165.370

310.281

0.014

720.696

891.637

0.025

vendor5_v1

0.586

200.883

373.670

0.014

767.726

997.728

0.025

3D liveness

0.777

не измерялось

не измерялось

не измерялось

не измерялось

не измерялось

не измерялось

vendor7

0.967

3021.262

46.769

0.006

3105.798

165.991

0.007

vendor8

1.000

754.956

155.772

0.002

1618.374

1789.670

0.006

Исходя из данных таблицы, можно сделать несколько интересных наблюдений. Первое: лучший на сегодняшний день метод показывает вероятность ошибки классификации подлинного биометрического предъявления 1,3% при вероятности ошибки классификации предъявления атаки 1%. Второе: метод, основанный на применении 3D-камеры, оказался хуже большинства решений, не требующих специальных инструментов регистрации изображений.

Также интересно взглянуть на распределение ошибок по инструментам атаки для лучшего решения. Как видно на следующем рисунке, большая часть кривых выглядит как ступенька. Это связано с тем, что метод справился с классификацией с минимальной достоверно измеряемой ошибкой. Например, для случая с силиконовыми масками, где в нашем тесте было минимальное количество образцов атаки, оценка ВОКПА составила 9% и сказать, что действительное значение ВОКПА меньше, мы не можем, для уточнения её значения требуется больше примеров.

Рисунок 2 кривые компромиссного определения ошибки при использовании разных инструментов атак для лучшего методаРисунок 2 кривые компромиссного определения ошибки при использовании разных инструментов атак для лучшего метода

Что делать дальше

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

  • увеличить количество образцов для каждого вида атаки;

  • собрать базы данных для оценки методов лайвнесс для конкретных приложений или продуктов;

  • собрать базы данных для оценки конкретных методов лайвнесс.

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

Буду рада ответить на вопросы в комментариях, если они у вас есть.

Подробнее..

Persuasive Technology как соцсети и мобильные приложения управляют нашими желаниями

19.02.2021 18:05:42 | Автор: admin

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

Дискуссии об этичности использования этих технологий стали массовыми после выхода фильма Социальная дилемма (The Social Dilemma) на Netflix,поэтому мы решили с помощью нашей платформы для выявления перспективных рынков и технологий TeqViserразобраться, что же такое технологии убеждения, каковы их возможности, как они используются в ИТ-сфере и какие опасности таят. Кстати, именно результаты мониторинга трендов TeqViser мы использовали при разработке стратегии развития Ростелекома

Что такое технологии убеждения?

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

Дисциплина, изучающая технологии убеждения, называется Каптология (Captology, от аббревиатуры CAPT: Computers As Persuasive Technologies) новое направление науки, находящиеся на стыке информационных технологий и психологии.

Оба термина ввел Би Джей Фогг социолог, философ, специалист по поведению из Стэнфордского университета. Он является основателем и директором Stanford Persuasive Technology Lab, позже переименованной в Behavior Design Lab.

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

Изучать технологии убеждения Б.Дж. Фогг начал еще в 90-е годы прошлого века, а массовое применение они получили благодаря социальным сетям и мобильным приложениям, вернее сказать, социальные сети обязаны своей популярностью технологиям убеждения. Кстати, один из сооснователей Instagram, Майк Кригер, был студентом Фогга.

Почему это важно сейчас?

Формируя ежегодный рейтинг глобальных трендов цифровизации , мы обратили внимание на стремительный рост тренда Persuasive Technology по всем источникам. Особенно это заметно в инвестициях, что означает, что совсем скоро технология станет по-настоящему массовой.

Вот немного статистики из TeqViser:

Всего, начиная с 2014 года, опубликовано более 25 тыс. научных статей и получено около 500 патентов, связанных с технологиями убеждения.

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

Кроме инвестиций растёт спрос на квалифицированных специалистов. Как правило, наибольший кадровый дефицит наблюдается на прорывных рынках в период зарождения технологий. По количеству вакансий тренд Persuasive Technology сопоставим с трендом Biometric, однако разница между спросом и предложением на рынке труда для технологий убеждений составляет 2270%, а для биометрии 112%. В очередной раз подтверждается востребованность специалистов, обладающих знаниями сразу в нескольких областях и осуществляющих свою деятельность на стыке дисциплин, в данном случае психологии и ИТ.

Как это работает?

Согласно модели поведения, которую Б.Дж. Фогг сформулировал в 2007 году, в основе любого действия лежит три элемента, которые должны совпасть во времени:
- мотивация человек должен хотеть совершить действие;
- способность у него должна быть возможность совершить это действие;
- триггер (подсказка) его нужно к этому подтолкнуть.

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

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

Вот основные стратегии убеждения:

Стратегия

Описание

Формулировка проблемы и постановка цели

Описывая проблемы и ставя цели, которые покажут человеку, что настоящее нежелательно, а желаемое будущее достижимо, можно добиться от него желаемого поведения

Самоконтроль и обратная связь

Возможность отслеживать собственную производительность усиливает мотивацию

Персонализация

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

Социальное сравнение

Возможность сравнить свою производительность с производительностью других добавляет людям мотивации

Вознаграждение

Небольшое, или даже виртуальное, вознаграждение за целевое поведение побуждает совершать действия чаще и эффективнее

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

Вернемся к модели поведения Б.Дж. Фогга и сопоставим её с возможностями цифровых технологий:

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

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

  3. Триггер: с помощью алгоритмов по анализу пользовательского поведения можно определить лучшее время для триггера (направления уведомления) и сделать его персонализированным.

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

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

Сферы применения и кейсы

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


Проект Perflectie (Нидерланды) это онлайн-платформа для корпоративного обучения, основанная на принципах изменения поведения и стратегиях убеждения.


Nike использует технологии убеждения в своих приложениях Nike Run Club и Nike Training Club, поддерживающих пользователей в занятиях спортом (функционал приложений включает в себя возможность ставить цели, отслеживать свой результат и делиться им, а также различные рекомендации)


MoneyVerbs (США) это платформа для изменения поведения, которая помогает пользователям сформировать правильные денежные привычки и улучшить свое финансовое благополучие.


Van5Naar4 (Нидерланды) мобильная игра, с помощью которой работодатель может стимулировать своих сотрудников отказаться от использования личного автомобиля в пользу более экологичных видов транспорта. В рамках игры пользователи могут объединяться в команды, соревноваться и видеть, сколько энергии они сэкономили, сколько калорий сожгли и т.д.

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

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

Какие есть риски?

Очевидно, что во избежание злоупотреблений технологии убеждения должны применяться этично и ответственно. Самым ярким, из известных примеров неэтичного использования технологий убеждения является кейс Cambridge Analytica . Компания использовала данные, полученные от Facebook, чтобы создавать профили пользователей и перенаправлять как можно более широкую аудиторию на платформу с рекламой, убеждающую посетителей голосовать определенным образом.

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

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

Подробнее..

Нестабильная сортировка в JavaScript

29.09.2020 12:13:11 | Автор: admin

Когда я вижу пост на подобную тему в любой социальной сети, под ним почти всегда оказывается множество комментов вот такого типа:

  • Зачем это нужно знать, если есть встроенные методы сортировки?

  • Зачем изобретать велосипед заново?

  • Это нужно, чтобы пройти собеседование, объективно больше незачем это знать

  • В "любой движок javascript" работают не дураки, и уже сделали все как нужно

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

Сразу к делу

Как думаете, что произойдет после выполнения данного кода?

Кажется, что ничего странного, но есть нюансы.

Случай номер раз

Сделали задачу, техническое решение, код, unit-тесты. По бизнес-процессу тоже все хорошо. При поверхностном тестировании проблем не нашли. Но когда дело дошло до авто-тестов, начались странности. Конфигурация, которую просчитывал Node.js 10, в основном отдавала корректный результат, но иногда конфигурация отличалась. Что усложняло процесс поиска проблемы, учитывая, что в режиме отладки конфигурация отдавалась всегда корректной. А еще у одних членов команды некорректная конфигурация воспроизводилась, а у других нет. И мы сделали вывод, что в старой версии, наверное, баг, и решили обновить версию на более новую.

После длительного поиска проблемы в коде ошибка не была найдена. Тестирование проекта на разных Node показало, что при запуске проекта на Node, начиная с версии 11, ответ был всегда стабильным. Что и послужило решением этой проблемы. Версия Node была обновлена до 12, и проблема исчезла.

Случай номер два

На этот раз конфигурации отличались уже в разных версиях браузера: в Google Chrome 80 был корректный результат, а в его 69 версии нет. И тут нам стало интересно, почему же конфигурация отличается.

  • Увидел, что версии отличаются

  • Открыл Release notes Google Chrome

  • Обнаружил, что Google Chrome 69 это последняя сборка, где используется 6-я версия V8

  • Открыл Release notes V8

  • И начал просматривать все статьи между 6 и 7 версией V8

Спустя некоторое время я наткнулся на статью Getting things sorted in V8, в которой говорится, что с 7-й версии V8 переходит на стабильный алгоритм сортировки TimSort, вместо предыдущего нестабильного QuickSort. И тут сразу стало понятно, что никакой магии нет, и все эти баги из-за нестабильной сортировки.

Нюансы сортировки

Сортировка в Node.js 10.22 (движок V8 v6.8) QuickSort.

Как видите, массив из первого скриншота изменил порядок, хотя функция сравнения всегда возвращала 0.

Сортировка в Node.js 14.5 (движок V8 v7.0) TimSort.

На этот раз сортировка уже не изменила данные.

Как дальше жить

И что же в итоге получается? То, что у клиентов могут быть разные результаты работы нашего кода в зависимости от типа сортировки используемого движка JavaScript. И если с Node.js переход на новую версию решит проблему, то заставить всех пользователей сделать то же самое со своими браузерами не получится.

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

Сравнение разных вариантов решения с нативной реализацией

Мы решили сравнить:

  • lodash.sortby

  • WikiSort javascript адаптация (WikiSort)

  • QuickSort нативная реализация V8 (node.js 10.22.0)

  • TimSort нативная реализация V8 (node.js 14.5.0)

В ходе теста было создано 10 массивов со случайным сортируемым значением, в каждом из которых было по 100 тысяч объектов.

Из этого графика можно сделать вывод: после оптимизаций, которые провел движок V8, сортировка WikiSort не уступает нативной реализации TimSort, хотя при первых сортировках разница довольно заметная. А вот lodash я бы не стал советовать.

Посмотреть результаты теста подробнее можно тут sort-test-js, а исходный код тут Tihon-Ustinov/sort-test-js

Где стабильно?

версия

дата релиза

движок JavaScript

стабильность

Node.js

11.0.0

2018-10-23

V8 7.0.276.28

+

Node.js

10.22.0

2020-07-21

V8 6.8.275.32

-

Google Chrome

70.0.3538

2018-10-16

V8 7.0.276

+

Google Chrome

69.0.3497

2018-09-04

V8 6.9.427

-

Выводы

  • Не верьте в магию JavaScript, у всех странных кейсов в этом языке есть объяснение

  • Изучайте технологии, которые вы используете

  • Читайте официальную документацию

  • Следите за тем, что появляется в новых версиях

  • Не думайте, что уже все сделано и придумано, и вам нужно только использовать готовые решения

Подробнее..

Как проходит наблюдение за экзаменом

12.10.2020 16:11:28 | Автор: admin

Привет! Как вы знаете, мы являемся провайдером видеонаблюдения на различных значимых событиях, в том числе и ЕГЭ.

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

Обычно за ходом экзамена следят специальные люди наблюдатели. Они отмечают на портале видеонаблюдения smotriege.ru подозрительное поведение участников ЕГЭ и передают обнаруженные нарушения на модерацию в Рособрнадзор. Если модераторы считают, что нарушение действительно было, то его передают дальше на отработку в пункт проведения экзаменов (ППЭ). Сотрудники ППЭ проверяют каждое такое обращение и решают, как поступить с нарушителем. Например, удалить с экзамена, если он использовал телефон или шпаргалку.

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

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

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

Как работает алгоритм

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

Обучение и сложности

Чтобы алгоритм точно распознавал поведение участников ЕГЭ и корректно фиксировала нарушения, его нужно было обучить на большом массиве данных. Что мы и сделали, собрав видеозаписи с уже зарегистрированными нарушениями на экзаменах за 2018-2019 годы.

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

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

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

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

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

Результаты и планы

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

Сейчас проводятся исследования по улучшению качества работы алгоритма с использованием нейросетевых технологий Human Activity Recognition, архитектур SlowFast, I3D и C3D. Кроме того, мы работаем над увеличением точности алгоритма, его производительности и удобства эксплуатации. Мы уже расширили датасет и добавили данные за 2020 год это поможет нам существенно увеличить точность алгоритма.

Расширение датасета и добавление данных за 2020 год существенно увеличат точность алгоритмаРасширение датасета и добавление данных за 2020 год существенно увеличат точность алгоритма

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

Подробнее..

Как мы прошли путь от разработки прошивок для каждой камеры до создания универсального SDK для вендоров камер

05.11.2020 16:06:36 | Автор: admin

Привет, меня зовут Олег Герасимов, я директор центра компетенций IT-кластера Ростелекома. Наша команда среди многих задач разрабатывает прошивки камер видеонаблюдения для B2B и B2C-сервисов. В предыдущей статье я рассказывал, как мы научились самостоятельно разрабатывать софт и прошивки для IP-камер, в том числе и недорогих, и подключать их к облаку.


За прошедшее время камеры с нашей прошивкой уже появились на рынке, и, судя по данным Яндекс.Маркета, на полках магазинов цены на них начинаются от 1500 рублей. И это уже не дешевый ноунэйм, а качественные камеры ведущих мировых брендов: Hikvision, Dahua и Uniview. На мой взгляд, это отличный результат!



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


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


Например, если в камере используется сенсор, под который в SDK процессора нет драйвера, то драйвер сенсора придется разработать самим. Это очень трудоемкий процесс, требующий сложной разработки и отладки. Сенсор технически сложный компонент, и на одно изучение технического описания (Datasheet) сенсора могут уйти недели. Это, на секундочку, сотни страниц с описанием тысяч регистров, влияющих на работу сенсора, и логики взаимодействия с ними.


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


Следующий этап разработки прошивок для камер совпал с объявлением тендера на закупку камер. Это уже серьезное событие. Ростелеком закупал сотни тысяч камер на открытом тендере, в который могли войти любые вендоры камер, соответствующих по своим ТТХ продуктовым и техническим требованиям.


Одно из ключевых требований к поставщикам предоставление технической информации о схемотехнике камер, например, о GPIO-выводах, к которым подключены светодиоды, кнопки, ИК фильтры и т.д. Кроме этой информации, мы просили вендоров предоставить специфичные для оборудования патчи ядра/загрузчика и исходные тексты драйверов устройств, в первую очередь, сенсоров и WI-FI чипов.



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


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


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


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



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


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


Техническое решение, с одной стороны, очевидное: сделать SDK для сборки нашей прошивки. Но есть ряд требований:


  • SDK должен уметь собирать прошивки под все типы поддерживаемых SoC. На сегодня это больше 10 чипсетов от Hisilicon, Ambarella, MStar и Fullhan.
  • Нельзя передавать компоненты прошивок от одного вендора другим, потому что это интеллектуальная собственность. Мы подписываем NDA, в котором обязуемся не раскрывать передаваемую информацию.
  • Результаты интеграции, полученные от вендора, нужно уметь замерджить в общее дерево исходников прошивки в нашем Git.
  • У вендора должна быть возможность вносить патчи и дополнения во все компоненты: ядро, загрузчик, SoC SDK и прочие.
  • Нужно иметь гибкую структуру настроек, в которой будут учитываться максимальное количество возможных конфигураций оборудования.
  • Для каждой пары вендор-SoC должна собираться универсальная прошивка, поддерживающая все камеры вендора на базе этого процессора.
  • Сборка должна работать автономно и не требовать доступа в Интернет. Да, большинство разработчиков ПО для камер в Китае не имеют доступа в Интернет на рабочих местах.


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


Другая проблема: под каждый процессор поставляется отдельный SDK от его производителя, с уникальным набором системных компонентов: своя версия и набор патчей ядра, toolchain, uboot, системная библиотека (где-то uclibc, а может быть glibc). Под эти факторы приходится подстраивать систему сборки, а местами и код приложений. Для наглядности масштабов фрагментации вот табличка со списком версий компонентов:


Процессор Версия Linux Версия gcc
Hisilicon 3516a/d 3.4.y gcc 4.9
Hisilicon 3518ev100 3.0.y gcc 4.4
Hisilicon 3518ev200 3.4.y gcc 4.9
Hisilicon 3516cv300 3.18.y gcc 4.9
Hisilicon 3518ev300/3516ev200/ev300 4.9.y gcc 6.3
Hisilicon 3516cv500/dv300 4.9.y gcc 6.3
mStar i3 3.18 gcc 4.8
mStar i6 4.9 gcc 8.2
Ambarella s2l 3.10 gcc 4.9
Ambarella s3l 3.10 gcc 5.2
Fullhan fh8632 3.0.y gcc 4.3

Как видно, разброс огромный: от легаси десятилетней давности до относительно свежих ревизий.


С такими вводными нам предстоял рефакторинг системы сборки прошивок: выделить общие патчи и драйвера, которые будут доступны для всех вендоров, повторить это для 10+ поддерживаемых моделей SoC, полностью переосмыслить систему конфигурации наших компонентов. Заодно выпилить специфичные для камер костыли из init-скриптов, сделав общие и универсальные решения.


В результате мы пришли к структуре, в которой все специфичные для конкретных моделей настройки/конфигурации/makefile/патчи собраны в папках, структурированную по иерархии "Вендор SoC Модель камеры". Такая иерархия позволила автоматизировать сборку SDK с разделением сборок по вендорам. Вот пример, драйверы и конфигурации для камер от выдуманного вендора Megatech на чипсете Hisilicon.


Структура каталогов

Драйверы


drivers + megatech/             -> драйвера и конфиги для вендора 'megatech'| + hi3518ev200/        -> чипсет hisilicon hi3518ev200| | + 1421              -> конфигурации модели камеры с кодом оборудования 1421| | | | + ipcdb.1421.yml -> общая конфигурация| | | | + mpi/entry.1421.yml -> конфигурация видеозахвата| | | | + ptz/entry.1421.yml -> конфигурация PTZ| | + motor             -> драйверы моторов управления PTZ| | | + bu24036_motor   -> драйвер шагового мотора на чипе bu24036| | | | gpio_motor      -> драйвер шагового мотора управляемый GPIO выводами| | + wlan              -> драйверы wi-fi чипов | | | + Makefile        -> скрипт сборки | | + sensor            -> драйверы сенсоров| | | + Makefile        -> скрипт сборки 

Патчи ядра


kernel+ megatech/| + hi3518ev200/| | + mmc_hotplug.patch| | + kernel-config.patch

Патчи uboot


uboot+ megatech/| + hi3518ev200/| | + uboot-mmc.patch| | + uboot-spi.patch

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


  • Настройки оборудования модели камеры (GPIO, наличие и тип Wi-Fi, сенсора, флаги наличия микрофонов, динамиков, дополнительные скрипты инициализации).

Пример yaml
1421:  vendor: megatech  model: Model A  soc: 3518ev2  ethernet: 0  wlan: rtl8188eu  sensor: ov9732  leds:                ir:                  gpio: 23      inverse: true    red:                 gpio: 10    power:      gpio: 10         green:      gpio: 2    net:      gpio: 2  keys:    wps:      gpio: 16    reset:      gpio: 16  peri-out:    pwdn:      gpio: 1      inverse: true    ircut.p:      gpio: 57    ircut.n:      gpio: 60    wifi_pwr:      gpio: 7  flash: spi  misc:    microphone: true    speaker: true    mic_hpf_level: 3    mic_anr_level: 4  scripts:    insert-sns:      - himm 0x200f0040 0x2; # I2C0_SCL      - himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz    init-wlan:      - insmod 8188eu.ko

  • Настройки видеоприложения для конкретной модели (тип сенсора, поддерживаемые разрешения, режимы синхронизации и видеозахвата, подстройки алгоритмов).

Пример yaml
1421:  sensor:    type: ov9732    lib: libsns_ov9732.so  resolutions:    - targets:         - { width: 1280, height: 720, maxrate: 30 }        - { width: 640, height: 480, maxrate: 30 }        - { width: 640, height: 360, maxrate: 30 }        - { width: 320, height: 240, maxrate: 30 }      channels:        - main      source: { width: 1280, height: 720, rates: [30, 25] }  combo_dev_attr:    input_mode: CMOS_33V  vi_dev_attr:    interface_mode: DIGITAL_CAMERA    component_mask: [67043328, 0]    syn_cfg:      vsync: field      vsync_neg: high      hsync: valid_signal      hsync_neg: high      vsync_valid: valid_signal      vsync_valid_neg: high      timing_blank: [ 370, 1280, 0, 6, 720, 6, 0, 0, 0 ]  isp_image_attr:    bayer_format: BGGR

  • Настройки PTZ (тип чипа, тайминги работы шаговых драйверов).

Пример yaml
1421:  type: pan_controller_and_tilt_gpio_generic  interrupt_gpio: 50  absolute: true  pan:    park_ccw: false    continuous: [-20, 20]    relative: [-7.9, 7.9]    absolute: [0, 355]    channel: 0    min_wait: 100    max_step: 140    max_speed: 375    unity: 430  tilt:    park_ccw: true    continuous: [-20, 20]    relative: [-3.5, 3.5]    absolute: [0, 90]    max_step: 2000    unity: 157

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


Процесс сборки полностью автоматизирован. Docker-образы с нашим SDK собираются в общем CI под матрицу сочетаний SoC-вендор.


Исходно у нас было два основных репозитория:


  • build-tools в нем хранятся Dockerfile, скрипты установки SoC SDK и скрипты сборки общих библиотек для поддерживаемых аппаратных платформ. В CI этого репозитория собираются Docker-образы со всем необходимым для сборки прошивки и софта под целевую платформу.
  • vc-firmware здесь хранится система сборки прошивки и компонент. К этому же репозиторию как git-submodule подключены репозитории с исходниками наших компонентов: видеоприложение, облачный агент, модуль обновления). Результатом работы CI в этом репозитории являются сами прошивки камер.

Для нового SDK добавили еще один репозиторий, vc-sdk, к которому подключили vc-firmware и build-tools как git-submodule. В CI этого репозитория сборка разделена на этапы:


  • подготовка базового Docker-образа по аналогии с репозиторием build-tools;
  • сборка пакетов с компонентами (видеоприложение, облачный агент, модуль обновления);
  • загрузка пакетов с общими компонентами (публичные библиотеки, драйверы Wi-Fi и т.д.)
  • копирование каталогов с драйверами и патчами, специфичными для вендора


В результате работы CI получается автономный Docker-образ, рассчитанный на сборку прошивок для камер на выбранном чипе вендором. Он загружался
в общий registry образов, из которого вендор может скачать свой образ.


Следующий объемный фронт работ разработка документации. Документацию мы писали поэтапно, собирая обратную связь от вендоров и учитывая замечания. Кстати, для документации использовался наш инструмент Foliant. Про него наши ребята уже рассказывали на митапе Write the Docs Moscow (http://personeltest.ru/aways/habr.com/ru/post/431210/).


Заключение


За этот год уже 8 вендоров освоило использование нашего SDK, с его помощью добавили поддержку работы с видеонаблюдением Ростелекома в нескольких десятков новых моделей камер. Некоторые из этих камер уже продаются.


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


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

Подробнее..

Внедрение CICD и DevOps в Enterprise (в нашем случае Ростелеком)

22.09.2020 12:22:19 | Автор: admin

Тема до сих пор весьма хайповая, и админы, добавляющие в свои резюме словечко DevOps, автоматически рассчитывают на +100К к зарплате. Но мы не про это. Мы хотим рассказать про то, как Ростелеком ИТ внедряет CI/CD & DevOps в энтерпрайзовый ИТ-ландшафт и тяжелые монолитные Legacy-системы.

Первая часть нашего руководства будет про Почему, зачем, как получить на это денег от бизнеса и как получается внедрять CI/CD в десятки проектных команд очень большой компании. Это интересная практическая информация для руководителей ИТ-подразделений и лидов. Вторая часть статьи сугубо инженерная, с описанием прикладных подходов, инструментов и реализаций в зависимости от типа и технологического статуса проекта. И третий блок будет про процесс внедрения в рамках Karma Framework в круге. Поехали!

Ретро. Как всё начиналось

Примерно за год ИТ-разработка Ростелекома в определенном периметре выстроила современную инфраструктуру, основанную на микросервисной архитектуре с развертыванием в кластере OpenShift. Эту инфру мы потом назвали Платформой Цифровых Продуктов, далее ПЦП. Мы позже подробнее опишем состав ПЦП.

Внедрение ПЦП позволило существенно перестроить работу некоторых команд, которые были лоцированы в одном структурном подразделении, с одной точкой управления. Это важно, так как у нас получилось создать в определенной степени технологический и методологический анклав и выстроить новые практики, которые отличаются от остальной корпорации вплоть до того, что мы не поддержали промышленный корпоративный стандарт, и проекты, запускавшиеся в ПЦП, выводились в продакшн на конечных юзеров, но не передавались в общую эксплуатацию. По сути это означает, что продукты НЕ падали вообще и были вне контура эксплуатации. Но с СБ ИТ все договоренности мы имели и нужные мероприятия делали. Плюс несколько команд начали работать в продуктовом подходе по Agile. Разумеется, это стало возможным на определенном классе продуктов и сервисов, что мы запускали. В основном это были относительно легкие фронтовые и middleware-решения, которые легко создавались на основе микросервисов и быстро запускались web-проекты, но с интеграциями в глубокий корпоративный бэкенд. Часть функционала и интеграции запиливались в микросервисы, которые могли использовать другие проекты. Тем не менее, для большой корпорации это был космос оказывается, за 3-6 месяцев можно развернуть для конечных пользователей довольно большой проект или сервис с интеграцией в общий ИТ-ландшафт, опробовать бизнес-гипотезы и модели или просто включить в продуктовую линейку и возможности для клиентов. Сноска для понимания стартаперов: в больших компаниях со множеством региональных биллингов на миллионы людей раньше нельзя было взять и просто за 3-6 месяцев запустить на всю клиентскую базу новый продукт или сервис. Обычно успехом считалось, что это время уходит только на согласование бюджета и ТЗ. А продукт в коде появлялся не ранее чем через год. Еще здесь стоит заметить, что любой стартап через пару лет становится легаси ))

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

И вот тут-то оказалось, что массы это разнокалиберные монолитные легаси-системы глубокого залегания порой циклопического масштаба и набора функционала с историей, уходящей вглубь веков. Класс систем типа АСР, CRM, аналитические системы, хранилища тарифных планов, системы ордеринга в общем, чудный мир OSS/BSS. И вся наша микросервисная архитектура, весь наш DevOps, OpenShift и CI/CD как попытка научить стадо слонов синхронному плаванию. Причем как чисто технологически, так и коммуникационно. Примерно полгода у нас ушло на исследование: насколько вообще применим пусть не микросервисный, а хотя бы компонентный инфраструктурный подход к монолитным системам. Еще сложнее оказалось объяснить и вовлечь ИТ-хэдов проектов и команд в исследование на тему как и главное зачем распиливать на компоненты ядро, где вся логика зашита, например, в пакеты Oracle. Ну допустим. А далее эстафета достигает, достигает, достигает бизнес-заказчиков. И бизнес задает главный вопрос жизни, вселенной и всего такого а зачем мы будем платить за архитектурный рефакторинг систем, которые и так работают?

Аээ 42!

Обычно на этом дискуссия съеживается, и ИТ уходит в офлайн мариновать тему, а архитекторы наслаждаться интеллектом друг друга. Тоже прок и лекарство против выгорания.

Вот на этом этапе и возникают докладчики на DevOps-конференциях с заявлениями, что в энтерпрайзе все это не летит.

Практики внедрения CI/CD&DevOps в Ростелекоме

Не то чтобы мы самые умные или упоротые. Но мы все же решили посмотреть, что есть за горизонтом событий. Даа, мало, мало огня, мы хотим еще немного больше. Горит в Ростелекоме внутренний огонь!

Начали с простых внутрикорпоративных докладов и митапов для различных проектных ИТ-команд и для инхаус-бизнес-заказчиков. Это не дало результат с точки зрения конкретных внедрений CI/CD & практик DevOps в проекты за периметром ПЦП. Но когда ты этим занимаешься больше года, то повестка начинает проникать даже в весьма консервативные команды и дальние регионы компании. Дискурс меняется, и вдруг некоторые коллеги начинают козырять словом Kubernetes как своим! Это определенно шаг вперед.

Вскоре реплицировался инфраструктурный кластер с похожим на ПЦП подходом в макрорегиональном филиале Ростелекома в Краснодаре, где ребята стали внедрять практику DevOps и CI/CD процессы в новые проекты, но в более тяжелый класс систем, нежели web-решения. Появились общие подходы к автотестированию, юнит-тестированию, нагрузочному тестированию, подготовки к релизу, мониторингу. Потихоньку общий подход к архитектуре, основанной на микросервисах и компонентах, стал доминирующим для новых стартующих в разработку систем. Однако по-прежнему существующие монолитные легаси-системы жили своей жизнью.

Следующим шагом стала попытка организовать гильдии девопсеров. Это горизонтально организованный коммуникационный формат, где различные проектные команды обмениваются опытом и практиками внедрения DevOps и CI/CD. Различные гильдии были созданы и по другим ИТ-специализациям. Формат какое-то время успешно поработал в части дальнейшего проникновения актуальных практик в различные ИТ-команды. Десятки DevOps-инженеров Ростелекома объединились и выносили задачки и свой опыт в общее тематическое инфополе. Но в итоге данный формат затух. Прежде всего потому, что сложно самоподдерживать мотивацию без целеполагания, оформленного в роадмап. Второй веской причиной затухания гильдий стало то, что этот формат без обязательств так и не позволил на системном уровне внедрять CI/CD в большие проекты и легаси-системы. Как ни крути, но не DevOps-инженеры принимают решения о переформатировании всего технологического и релизного цикла разработки или о рефакторинге.

Примерно за три года миссионерской работы знание и принимаемость темы DevOps и CI/CD в компании вышли за порог отрицания. Проделанная работа в итоге начала все же приводить к тому, что по крайней мере IT-команды стали экспериментировать и что-то использовать из инструментов интеграции и развёртывания, особенно в части тестирования и работы с git. И, наконец, мы начали пробовать внедрять CI/CD на некоторых системах тяжелого класса с монолитным ядром в БД и легаси-кодом, которые оказались по разработке в прямом операционном управлении.

Важный кейс и настоящий профит от ПЦП, от сложившегося подхода к архитектуре, разработке и набора инструментов мы получили для сетапа самого яркого огонька в корпоративном ИТ в России 2020 это экосистемы. Концепция цифровых экосистем с кросс-связанностью и кросс-сервисами по всей продуктовой линейке отлично приземляется на микросервисную архитектуру. И у нас уже была готовая инфраструктура, откуда стали быстро расти экосистемные ростки Ростелекома. А что требуется для таких стейтмент-терминов как цифровая экосистема? Правильно quick win. Чайки, налетайте!

Несмотря на заметные результаты, как ни странно, целевое дело пошло на проектах, которые начинали делать не мы, и проекты пришли к нам в Центр Компетенции digital-разработки Ростелеком ИТ в тяжелом нестабильном состоянии. До 90% ресурса команд уходило на багфикс и латание дыр. Техдолг уходил за горизонт полугода. О функциональном развитии можно было забыть. При этом системы были чрезвычайно важны и нужны бизнесу. Вот здесь и случились прорывы. Возвращаясь к вопросу бизнеса: Зачем мы будем платить за архитектурный рефакторинг систем, которые и так работают?. А вот если системы еле ворочаются и критикал-баги зашкаливают, то разговор с бизнесом из томного превращается в конструктив. У вас как у ИТ-разработки появляется возможность найти у бизнеса понимание, что для сохранения жизнеспособности систем и затем их развития нужно не перепиливать все с нуля (на больших системах часто это вообще невозможно по технологическим или бюджетным причинам), а начать внедрять DevOps и CI/CD процессы с параллельным архитектурным рефакторингом, и начинать нужно с особенно критичных мест в системе и оптимизации релизного цикла. А внедрять можно даже в рамках существующего ресурса команды и бюджета. Мы, например, брали на себя коммиты, что через 3 месяца сократим затраты ресурса команды проекта на багфикс с состояния более 50% AS IS, в котором мы получили проект, до приемлемых в среднем по индустрии менее 20%. При том практически без роста бюджета и состава команды.

В общем, если вы хотите внедрить в энтерпрайзовую легаси-систему DevOps и CI/CD процессы, отдайте ее условным индусам. Верните ее потом себе назад в ужасном состоянии, и у вас появится возможность все исправить модными штучками! Шутка))

Что в итоге сработало. Круги и Karma Framework

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

Но реальный системный результат дало использование формата кругов в рамках Karma Framework. Поскольку Ростелеком ИТ не внешний вендор (тоже важный момент, кстати), а инхаус-разработчик в группе компаний ПАО Ростелеком, то мы работаем не за маржинальность, а за карму. Это не абстракция, а финансовая модель, помноженная на ключевые ценности. И, следуя фундаментальным ценностям, таким как открытость, честность, доверие и партнерство между ИТ и бизнес-заказчиками, мы как ИТ зарабатываем карму, или другими словами свою репутацию и лояльность бизнеса, стараясь делать продукты качественно, быстро и за адекватные бюджеты. Для последнего, собственно, и нужны Devops & CI/CD, с точки зрения технологий и процессов.

Karma Framework это оригинальная практика управления IT в Ростелекоме, которую мы внедряем последние годы, и даже Gartner включил Karma в число передовых мировых управленческих практик. Вполне заслуженно, надо сказать. Про Karma Framework можно рассказывать очень долго на разных уровнях абстракции, но для нашей темы достаточно пояснить, что суть фреймворка в плоской модели управления, где упор делается на самоорганизацию команд и горизонтальное взаимодействие команд посредством кругов. В одном круге с каким-либо предназначением может быть множество людей, представителей команд или целых проектных групп, которые объединены целью выполнить предназначение круга.

В нашем случае предназначение Круга DevOps стало очень простым: внедрить подходы Devops и практики CI/CD на корпоративном масштабе во множество проектных команд и сделать это технологическим промышленным стандартом.

В отличие от других форматов, круг позволил выстроить системную работу с роадмапами, инструментами, стандартами и учётом кастомных нюансов. И мы наконец ушли от прекрасного, но малорезультативного евангелизма и обмена опытом в чатах, и занялись предметным внедрением Devops & CI/CD в очень разные классы проектов и систем. Как работает круг и фреймворк в целом, мы расскажем в следующих частях про внедрение Devops&CI/CD в энтерпрайзе.

А пока же эту бизнесовую по сути часть темы резюмируем двумя блоками обоснования и ответом на вопрос, зачем нужно внедрять Devops&CI/CD и платить за это. Плюс несколько ключевых поинтов.

Для бизнеса:

  1. Ускорить Time-2-market вывода продукта в целом или обновлений по линейному развитию легаси.

  2. Экономия. Оплатить внедрение Devops&CI/CD и потратить N бюджета, чтобы на горизонте получить экономию в деньгах Y больше N. Или получить прибавку производительности команды, и это окупит N, а потом пойдет время чистоганом. Реальные горизонты наступления эффектов в энтерпрайзе 612 месяцев. Бывает, что и за пару месяцев на проектах с нулевой зрелостью CI/CD можно окупить потраченный ресурс команды.

  3. Сократить расходы на оплату ресурса команды, уходящего на багфиксы. В среднем по индустрии на зрелых проектах бизнес готов мириться с 20% затрат на саппорт на третьей ЛТП от бюджета развития. В целевом сокращается до 10%, а иногда уходит почти в ноль. И бизнес получает больше функционального развития.

  4. Гораздо более стабильные продукты и системы. Это автоматически ведет к росту бизнес-маркеров типа NPS, экономии на 1-2 линиях, колл-центрах и т.д.

  5. Нормализация работы и коммуникации бизнеса с ИТ. Исчезновение ментальных дисбалансов на темы Кто кому должен и кто плохо работает.

Для ИТ:

  1. Реальная оптимизация технологического цикла разработки. Можно сократить время и усилия почти на каждом участке от аналитики и постановок задач до подготовки релиза и вывода в продакшн. У нас есть кейсы, где вместо ночных многочасовых бдений вывод в продуктив стал занимать десятки минут и без тоскливого ощущения снова получить на регрессе кучу критикал-багов, иногда без возможности откатить.

  2. Частью идеологии DevOps является перестроение многих процессов как технологических, так и административных. Можно за счет нового технологического инструментария и настроек существенно менять формат работы с эксплуатацией и бизнесом и перестать тратить много сил на ПМИ/ПСИ, документацию, которой невозможно пользоваться, согласования в СЭДах и прочий мартышкин труд и бюрократию. Потому что снимаются риски потери контроля, многие вопросы зон ответственности и нестабильной работы системы.

  3. Разработчики занимаются программированием и кодом, творчеством, а не разбором инцидентов и поиском их причин. Вообще, внедрение CI/CD влечет за собой повышение квалификации команды и более точного состояния, когда каждый специалист занимается своим делом.

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

  5. Все нормальные айтишники хотят делать хорошие качественные продукты. Все хотят заниматься производительным трудом на благо продукту и использовать современные стеки и технологии. В энтерпрайзе это делать тяжелее. И внедрение Devops&CI/CD позволяет подкормить профессиональную совесть качественным нектаром.

Важные моменты:

  1. CI/CD начинается до технологического цикла. Мы рассматриваем CI/CD как процесс, который начинается с идеи в горнилах бизнеса. И важно операционные процессы с бизнесом выстроить так, чтобы сырые идеи не залетали в разработку, чтобы бизнес внутри себя договаривался, что конкретно и в каком порядке пойдет в разработку. По сути это качественная работа с бэклогом, чтобы он всегда был полон на пару месяцев вперед и приоритезирован.

  2. Devops&CI/CD можно внедрять на любом уровне зрелости продукта и команды. Целый ряд вещей вообще не технологического порядка, а логистического и операционного. Часть инструментов и подходов можно внедрить очень дешево во всех смыслах. Даже в старых, тяжелых легаси-системах.

  3. Devops&CI/CD не является синонимом Agile и вполне работает в классическом ватерфоле и фикспрайсовых моделях. Отдельные инструменты и подходы вполне можно использовать: ту же автоматизацию сборки, автотесты, Unit-тестирование, правильную настройку git(а) можно внедрять хоть где.

Однако, CI/CD наиболее эффективен в связке со Scrum или Канбан. По сути, это объединение продвинутых операционной и технологической методик работы с ИТ-конвейером. У нас есть несколько кейсов такого рода. И мы увидели большие перспективы наложения на Канбан-доску с ее этапами разработки, матрицы действий и инструментов CI/CD. Здесь просто золотая жила. И мы уже делаем оригинальный фреймворк о том, как поженить Devops&CI/CD с Канбан. В следующих частях темы Devops&CI/CD в энтерпрайзе мы расскажем и том, как устроена наша Платформа Цифровых Продуктов, и о том, как работают круг и фреймворк внедрения Devops&CI/CD в разные классы систем и проектов.

Ждите новостей от Ростелеком ИТ!

Подробнее..

Внедрение CICD и DevOps в Enterprise (Ростелеком) часть 3

27.12.2020 16:14:22 | Автор: admin

Всем привет! Это третья, завершающая, часть нашего рассказа о том, как Ростелеком ИТ внедряет CI/CD & DevOps в энтерпрайзовый ИТ-ландшафт и тяжелые монолитные Legacy-системы. Первую часть про внедрение CI/CD в десятки проектных команд очень большой компании можно прочитать на Хабре по ссылке здесь. Вторую часть сугубо инженерную, с описанием прикладных подходов, инструментов и реализаций читайте тут.

Сегодня мы расскажем про процесс внедрения в рамках Karma Framework в круге. Поехали!

Круг DevOps катаем квадратное, таскаем круглое

Фреймворк сетапа команд и дальнейшей работы по внедрению CI/CD & DevOps в проектные команды Ростелеком ИТ

Круг DevOps существует в модели управления Karma Framework Ростелекома. Под кругом мы понимаем объединение специалистов вне иерархии, которые взаимодействуют в формате экспертное сообщество. Родительским для нашего круга является круг Развитие цифровых технологий. Поэтому мы работаем с заказчиками в двух операционных моделях:

  • Партнерская модель (ИТ владеет бизнес-экспертизой и разделяет цели продукта, ИТ самостоятельно планирует развитие исходя из бизнес-задач);

  • Модель Драйвер (ИТ выступает инициатором и драйвером создания высокотехнологичных решений).

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

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

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

  • Лидер круга драйвит тему и организует регулярные встречи в формате онлайн;

  • Фасилитатор и секретарь круга помогают держать встречи в заданной повестке, фиксировать договоренности и планируемые активности;

  • Эксперты круга помогают командам с обсуждением архитектурных вопросов;

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

Существует два типа этой роли: Делегат-тимлид/Руководитель проектов (РП) и Делегат-DevOps-специалист. Делегат-тимлид/РП отвечает за внедрение процессов в команде и имеет полномочия на такие изменения как, например, выделение ресурсов на реализацию Continuous Delivery (CI) или изменение архитектуры решения. Делегат-DevOps-специалист наиболее погружен в технические аспекты и напрямую работает с инструментами.

  • Наблюдатели приходят в Круг посмотреть и поинтересоваться. В формировании повестки встреч не участвуют, обязательства не принимают;

  • Делегат-куратор в родительский круг обеспечивает связь с родительским кругом в рамках иерархии предназначений, помогает обмениваться ожиданиями с родительским и другими кругами.

Инструменты совместной работы круга

  1. Выделенное пространство в корпоративной базе знаний (например, Confluence.

    В нем описываются общие правила игры, формируются рекомендации, собираются ссылки на полезную информацию. По каждому из проектов-участников круга создается выделенная страница с кратким описанием проекта и его архитектуры, схемами и другими данными, которые могли бы быть полезны для обсуждения вопросов развития инструментов CI/CD и практик DevOps. Каждый проект должен заявить дорожную карту развития DevOps-практик и следовать ей это его основное обязательство перед кругом.

  2. Оперативный чат в мессенджере (у нас Телеграм)

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

  3. Встречи в формате онлайн-конференции

    Сейчас у нас Zoom, но мы планируем переехать в корпоративный TrueConf. Выделены 4 типа встреч:

    • Тактические встречи (1 раз в неделю), на которых происходит синхронизация статусов команд, обзор прогресса по ключевым задачам в соответствии с дорожными картами развития в командах. Еще на таких встречах обсуждаются новые ожидания, которые трансформируются в обязательства, а также формируется карта напряжений;

    • Техническое обсуждение/обмен опытом (по запросу) - проводятся заинтересованным кругом участников для решения конкретного технического вопроса или презентации какого-либо технического решения;

    • Ретроспектива и снятие напряжений (1 раз в квартал) на этой встрече подводятся основные итоги работы круга, проводится обзор снятых напряжений, принимаются решения о дальнейшей эволюции круга;

    • Законодательная встреча круга (по требованию) организационные вопросы, обсуждение правил работы круга и общих процедур. Может быть совмещена с ретроспективой.

  4. Таблица (матрица) соответствия проектов основным стандартам CI/CD опросник, который заполняют команды

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

    • Как именно происходит управление задачами и релизами;

    • Как организован обмен знаниями и документирование;

    • Какие инструменты CI/CD применяются;

    • Как контролируется качество кода;

    • Как мониторятся стенды и собираются метрики.

    • карта развития процессов разработки для каждой из команд.

    Каждый пункт опросника имеет вес 1 или 0 (иногда промежуточные 0.5), проект оценивается в баллах по сумме заполненных строк. Таким образом формируется общая оценка зрелости проекта. На основании таблицы формируется дорожная карта развития процессов разработки для каждой из команд.

Обязательства и продукция круга DevOps включают:

  • Формирование и встраивание фреймворка внедрения CI/CD в связке с Agile-фреймворками команд (проектов);

  • Создание, накопление, поддержание лучших практик, технологий, инструментов в области DevOps;

  • Методологическая поддержка проектов и команд в части DevOps и CI/CD;

  • Содействие обмену знаниями в командах;

  • Содействие повышению качества продуктов и сервисов;

  • Содействие повышению скорости поставки продуктов и сервисов;

  • Содействие в оптимизации процессов эксплуатации продуктов и сервисов.

Фреймворк CI/CD мы планируем привносить в команды, которые в рамках общей digital-трансформации переходят на гибкие методики. Как мы уже отмечали, мы не мыслим Agile без современных технологических инструментов управления разработкой и здесь CI/CD является основной конвейера. Но в кровавом энтерпрайзе, где многим legacy-проектам и решениям от 5 до 10 лет, а некоторым и больше, такие переходы даются не сразу и не так легко.

Общая тенденция такова команды сетапятся в Канбан (или SCRUM), в чем нам помогает очень крутой корпоративный тренер, а в качестве Sidecar к гибкой методологии мы проводим аудит состояния DevOps и CI/CD, даем команде рекомендации, делаем совместную дорожную карту и детальные планы изменений в соответствии реальными возможностями команды и архитектурой информационной системы проекта.

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

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

Конечно, DevOps не заканчивается там, где заканчивается Kanban доска. Команды вовлечены как в процесс релиза, так и в процесс эксплуатации продукта.

Фреймворк, разрабатываемый кругом позволяет на всех этапах технологического цикла выстроить эффективные процессы в команде, а также дает необходимые инструменты на каждом шаге. На рисунке ниже отображено соответствие этапов Kanban процесса, DevOps-практик и инструментов CI/CD.

После вступления в круг DevOps и определения текущего уровня зрелости DevOps процессов команда формирует план своего развития, выделяя три блока задач:

  1. Что можно сделать быстро и без значительных затрат (организационные мероприятия, оптимизация инструментария, централизация документации и базы знаний, методологические подходы и т.п.). Примеры: создать базу знаний проекта в Confluence, ввести и описать стандарты написания кода, правила атрибуции задач, ввести регистрацию техдолга, проводить еженедельные архитектурные комитеты в проекте, описать правила выпуска релизов, проводить ретроспективу после выпуска новых релизов, создать чеклист для ввода в курс дела в команду новичков и так далее.

  2. Что можно сделать в разумный срок, за разумный бюджет (внесение небольших архитектурных изменений или новых практик и методик, приносящих ощутимый эффект) - в рамках имеющегося согласованного бюджета проекта. Примеры: внедрить логирование в Elastic Stack или Graylog, обеспечить покрытие всего кода Unit-тестами на определенный процент, внедрить регистрацию и сбор ошибок с продуктивной среды (например, с помощью Sentry), обеспечить автоматизацию UI-тестирования и т.п.

  3. Что требует дополнительного согласования бюджета из-за значительных изменений в коде или архитектуре решения. Согласование изменений с бизнесом, исходя из прогнозируемой выгоды и улучшений: ускорение цикла разработки, повышение качества, снижение затрат (стоимости владения). Примеры: переход на микросервисную и Cloud Native архитектуру, контейнеризация приложений и размещение в OpenShift-кластере, внедрение инструментария управления версионностью БД (LiquiBase), и т.п.

Новая команда, которая проходит сетап любого из Agile-фреймворков, получает в комплекте фреймворк запуска CI/CD. Команда выбирает из своего числа делегата, который вступает в круг DevOps.

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

На следующем этапе делегат заполняет матрицу соответствия своего проекта стандартам CI/CD, в которую входят показатели уровня текущих процессов и инструментов, используемых в команде. Мы получаем более-менее объективную оценку текущего уровня развития DevOps в команде, выраженную в баллах.

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

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

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

Условия работы в круге

Принципиальными моментами в работе круга DevOps является следующее:

  • Команды приходят в круг добровольно. Никакой обязаловки, никаких принудительных приводов и уговоров;

  • Задача круга как экспертного сообщества заработать репутацию (карму) таким образом, чтобы командам было интересно туда приходить. Примеры экспертных кругов с репутацией в Ростелекоме есть это Круг аналитиков или Круг тестировщиков. Круг DevOps еще совсем молодой, мы только начинаем формировать и сообщество, и репутацию и хотим, чтобы у нас было интересно и работа приносила реальную пользу проектам;

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

  • У круга нет формальных KPI. Его эффективность измеряется кармой. Карма это прежде всего оценка удовлетворенности работы кругом DevOps со стороны родительского круга Развитие цифровых технологий. Выполняем ли мы свое предназначение? Какой фидбек от бизнеса и команд? Не занимаемся ли ненужной фигней, которая никому не понятна и не приносит пользы?

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

Резюме

Экономия ресурсов и времени происходит на многих участках технологического цикла. На основе нашего опыта на десятках проектов мы в среднем получаем такие результаты:

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

  • UAT-тестирование на тяжелых проектах сокращается в среднем с 5 рабочих дней до 2-3 за счет внедрения автотестов (в масштабе 2-3-недельной итерации).

  • Подготовка релиза в среднем сокращается с 4-5 дней до 1-2 за итерацию.

  • Интеграционное тестирование производится на реальных связях со смежными системами, а не на заглушках, для чего обеспечивается связность с тестовыми и Release Candidate-стендами всех окружающих систем. Это существенно снижает количество сюрпризов на продуктиве.

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

  • Регрессионное тестирование в среднем сокращается с 3-5 дней до 1-2 за итерацию, а количество ошибок и хотфиксов за счет автоматизации цикла сводится к минимуму.

  • Экономия по всему технологическому циклу может достигать 5 рабочих дней всей команды; на месячном релизном цикле это дает +25% производительности команды.

  • Не надо бояться разговаривать об изменениях практики разработки с бизнесом и смежными ИТ-службами.

Бизнес умеет считать деньги и смотреть по сторонам, анализируя мировой и российский опыт. Он умеет задавать вопросы А как сделать, чтобы эта фича увидела свет уже в конце квартала?, и ИТ-департаменту нужно быть готовым и ментально, и организационно, и технически обеспечить такую скорость и качество. Именно поэтому в ИТ-стратегию Ростелекома на ближайшие годы включено развитие и внедрение DevOps-процессов, и мы целенаправленно занимаемся этим далеко не простым, но очень полезным и интересным делом.

Подробнее..

Как мы за ночь дистанционное образование поднимали

19.10.2020 14:23:26 | Автор: admin
Всем привет! На связи команда Госпроектов Дизайн-Студии Ростелекома. Мы одна из самых молодых команд нашего центра компетенций, но за относительно непродолжительный срок столкнулись с немалым количеством интересных и комплексных задач. Полученный опыт мы решили транслировать в виде цикла статей, посвященных исследованиям, и нескольким спин-оффам. Собственно, с одного из таких спин-оффов мы и начнём.

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

Постановка задачи


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

НО заключалось в том, что о проекте мы узнали в 16:00. А завтра в 13:00 должна быть презентация министерству, и нужно иметь всё на руках к 11:00, чтобы успеть подготовиться и выдать комментарии для правок. И такие сроки явно выглядят в масштабах системы сильно страшнее, чем пятилетка за три года. Что же делать?

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

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

16:00

Окей, отсчёт пошёл. Мы сразу составили примерный план по процессам проектирования и по временным промежуткам, которые для это проектирования нам требовались:

  1. Создание wireframe-макетов по рабочим столам, расписанию и карточкам уроков для учителя, родителя и ученика;
  2. Создание wireframe-макетов по проведению/участию в видеоконференциях для всё тех же ролей с учётом всех кейсов (просто просмотр, ответ у доски, виртуальная доска, простановка оценок и т.д.)
  3. Поиск UI-решения и быстрая отрисовка компонентов;
  4. Отрисовка основных экранов по wireframe-макетам с использованием компонентов UI;
  5. Написание сценариев для демонстрации работы системы;
  6. Отрисовка полного набора экранов в UI, соответствующих сценариям для демо;
  7. Сборка кликабельных прототипов по сценариям;
  8. Демонстрация РТ Лабс;
  9. Внесение правок;
  10. ???
  11. PROFIT!!!

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

20:00

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


Пример одного из таких ваеров (здесь и далее все картинки кликабельны)

Во время встречи мы все согласились с тем, что тратить драгоценное время проектирования на UI просто супер-не-рационально. Быстро посмотрели, что у нас есть в закромах и, о спасибо, Ростелеком Лицей. Да, мы просто дерзко переиспользовали компоненты уже существующего в компании проекта, чуть изменив цвета. Получилось вроде норм.


Пример одного из экранов с использованием компонентов и стилей Ростелеком Лицей

Супер, первые три задачи мы сделали! Но только на часах уже 21:30, поэтому решено отдохнуть час и в 22:30 продолжить работу.

22:30

Чуть перераспределились. Трое ушли собирать макеты на компонентах UI по ваерам, а один отправился писать сценарии для демонстрации. Час отдыха дал заряд новых сил побежали делать.

01:00

Следующий майлстоун. Сценарии для демонстрации написаны. Для того чтобы построить неразрывный флоу мы решили посмотреть на продукт глазами наших персонажей, по которым проводим демонстрацию, поэтому сначала сценарий строился в виде простого текста с описанием некой персоны и жизненного кейса. Например, вот описание для ученика:
Вова Абрамов ученик 6 А класса. Вчера он весь вечер играл с друзьями в Minecraft, поэтому проспал уроки, а бабушка не хотела его будить. Вова должен быстро зайти на урок, ответить на вопрос учителя, сделать тест от Николая Ивановича. На перемене Вова видит оценку, которую ему поставил учитель (3), и чтобы исправиться скорее, смотрит домашнее задание от Николая Ивановича на послезавтра, делает его и загружает результат в систему.

Теперь это абстрактное описание надо разбить на экраны и действия на них:


Расписанный сценарии в Miro. Темные блоки экраны. Светлые действия

Параллельно основные экраны были собраны по ваерам уже на компонентах UI. Трое ребят продолжили работу над отрисовкой необходимых экранов и состояний по описанным сценариям, а писака отправился спать, чтобы отдохнуть и продолжить работу.

06:30

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


Подготовленные экраны для создания прототипов

Работа по сборке трех кликабельных прототипов (для ученика, учителя и родителя) продлилась как раз до 11:00 сценарии выданы РТ Лабс на отсмотр, получены комментарии и оперативно внесены минорные правки по макетам.

Итог


В 13:00 РТ Лабс ушёл презентовать концепт системы министерству. Ещё через час проснулись ребята, трудившиеся в ночную смену. А часом позже мы узнали, что концепт устроил, и теперь забираем проект для дальнейшей проработки в чуть менее бешеном режиме. Это была победа. По факту мы провели цикл разработки дизайн-решения продукта без исследований в основу концепта легли только наши гипотезы и небольшие клочки информации, которые нам накидал РТ Лабс. Забавно, что наши гипотезы по большей части попали в точку.

Много внимания заслуживает именно наш процесс работы в этой ситуации. Мы сразу поняли, что придётся чем-то жертвовать, и идеал построить за такие сроки мы не сможем. Большую роль сыграли правильный выбор команды для работы над проектом, распараллеливание задач, плотные коммуникации и отдых. Да, отдых. Вспомним час времени с 21:30 до 22:30, а также тот факт, что жаворонку-писарю сценариев дали пойти поспать, а потом проснуться и добить задачи. Но чем ни в коем случае нельзя было жертвовать, так это смыслом. Поэтому двигались от общего к частному от ваеров к макетам в UI; сначала идея, а потом уже реализация.


Итоговый вид системы на примере урезанного рабочего стола учителя

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

Подготовил:
Денисенко Никита (ТГ: contragore)
Ведущий UX/UI-дизайнер
Подробнее..

Как мы пользуемся Jira Query Language на практике

13.12.2020 16:23:06 | Автор: admin
Всем привет!

Меня зовут Сергей Раков, я руководитель B2G-направления в компании Ростелеком ИТ. Я хочу рассказать про язык Jira Query Language (JQL): как им пользоваться на практике, основные приемы, с какими проблемами мы сталкивались и как их решали.

imageОригинал картинки взят у deviniti.com/atlassian

Таск-трекеров очень много, каждый подходит для решения одних задач и не очень помогает решать другие. Многими из них мы пользовались, но сейчас остановились на Jira она наш основной инструмент. Лично мне очень нравится ее язык JQL, который сильно упрощает работу и позволяет из коробки иметь мощный и гибкий инструмент для поиска тикетов.

Из коробки в Jira существуют базовый и продвинутый поиски. Эти два варианта поиска позволяют решить бoльшую часть стоящих перед пользователем задач. Базовый поиск привычен глазу любого человека, кто хоть раз пользовался услугами интернет-магазинов работает по точно такой же простой схеме. Есть множество фильтров: по проектам, типам задач, по исполнителю и статусу. Также можно добавить дополнительные поля по критериям, которые поддерживаются Jira.

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

На помощь приходит продвинутый поиск. Синтаксис JQL очень похож на SQL. Но в JQL не нужно выбирать конкретные поля, которые будем селектить, указывать таблицы и базы данных, из которых будем выводить. Мы указываем только блок с условиями и работаем с сортировкой все остальное Jira автоматически делает сама.

Все, что нужно знать для работы с JQL это названия полей, по которым будем выбирать тикеты, операторы (=, !=, <, >, in, not in, was, is и т.д.), ключевые слова (AND, OR, NOT, EMPTY, ORDER BY и т.д.) и функции, которые из коробки доступны в продвинутом режиме (Now(), CurrentUser(), IssueHistory(), EndOfDay() и другие).

Поля


Jira при вводе в строку поиска сама выдает подсказки всех возможных значений, которые вы ищете: как по полям, так и по значениям этих полей. Для себя я недавно открыл интересное системное поле lastViewed. Jira хранит историю ваших просмотров тикетов.
image
Здесь представлены два варианта составления фильтров для просмотра последних задач. Первый мой вариант с lastViewed, где Jira выдаст просмотренные мной задачи за последние семь дней, отсортированные по убыванию. Этот фильтр настроен на моем дашборде в виде гаджета, и я к нему часто прибегаю. Потому что тикет закрылся, вкладку и номер не запомнил, быстро открыл, посмотрел, какой был последний тикет.

Есть стандартный фильтр Viewed Recently. Он использует функцию IssueHistory(), сортировка тоже производится по полю lastViewed. Результат одинаковый, но способ, даже в Jira, можно использовать разный. Стоит отметить, что поле LastViewed и IssueHistory() возвращают только вашу историю просмотра историю третьих лиц таким образом посмотреть не получится.

image
По большей части в Jira все операторы стандартные. Мне больше всего нравятся операторы WAS, WAS IN, WAS NOT IN, WAS NOT, CHANGED, потому что они работают с временем. В обычных базах данных такой возможности нет.

image

Jira из коробки позволяет работать с историческими данными. С помощью оператора WAS можно найти тикеты, где исполнителем был и есть User1. Если тикет был на мне, а потом перешел на кого-то еще, запрос покажет, что этот тикет когда-то был на мне. Понятно, что для более подробной выборки нужно добавить еще какие-нибудь условия, но мы к этому еще подойдем.

Правда, есть одна оговорка: Jira не хранит историю для текстовых полей: названий тикетов и их описаний. Там нельзя написать: Выведи мне тикеты, в которых поле Summary содержало слово Ростелеком.

Второй пример с оператором CHANGED. Мы хотим получить тикеты, в которых исполнитель был изменен после 1 января 2020 года. Можно использовать другие дополнительные слова, например, BEFORE или знаки >, <, кому как удобнее, и конкретную дату. В этом же примере можно еще сделать отрицание и увидеть, какие тикеты на каких пользователях зависли: assignee not changed AFTER 2020-01-01.

Ключевые слова


image
Основные ключевые слова OR, AND, NOT. Они работают так же, как и логические операторы. Используя OR, мы получим полный набор тикетов из двух проектов A и B. Если нужно сузить выборку, используем AND. Пример нам нужны тикеты из проекта A, по которым исполнителем был юзер B: project = A AND assignee = B. С отрицанием то же самое.

Функции


Согласно документации, в Jira 47 функций, но я никогда не использовал их все. Вот несколько, по моему мнению, основных:

image

now() популярная функция, которая позволяет найти тикеты у которых, например, истек планируемый срок реализации.

currentUser() возвращает текущего пользователя. Jira содержит преднастроенные фильтры, в которых используется эта функция. С currentUser() можно делать универсальные поисковые запросы. Я так делал универсальный дашборд для всей команды разработки: напихал гаджетов на дашборд и в каждом указал вместо конкретного юзера currentUser(). Этот дашборд будет уникальным для каждого залогиненного пользователя, хотя конфигурация будет одинаковая.

unreleasedVersions() это функция, возвращающая тикеты, которые находятся в невыпущенных версиях. Но она не возвращает тикеты, у которых версия не проставлена.

startOfDay() возвращает начало текущего дня. Есть функции для недели, месяца и года. Это же относится и к закрывающей функции endOfDay(). Они позволяют отвязаться от конкретных дат, им можно задавать аргументы: если написать startOfDay(-1), то вернется начало предыдущего дня. Если оставить все как есть, то отобразится начало дня текущего на выходе будет время. Эти функции помогают избежать хардкода, мы очень часто ими пользуемся.

С issueHistory() я уже приводил пример, эта функция возвращает список только ваших просмотров.

linkedIssues() функция, которая позволяет найти тикеты, которые прилинкованы к конкретному тикету.

Это самые простые функции. Но давайте немного углубимся и посмотрим на более сложные связи.

assignee was currentUser()AND fixVersion was inunreleasedVersions()AND created > startOfYear()

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

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

Третье условие дата создания. Мы фильтруем только те тикеты, которые были созданы с момента начала текущего года.

Функции ScriptRunner


Это плагин, значительно расширяющий возможности Jira. Обычно его используют для автоматизации процессов, но также он добавляет очень много дополнительных функций к JQL. ScriptRunner был нашим самым первым плагином, который мы поставили сразу, как только переехали в Jira в конце 2018 года. Я очень активно просил поставить этот плагин, потому что без него не мог собрать данные по связям с эпиками. Мне, например, часто нужно было вернуть все тикеты эпиков по определенному запросу или все эпики для тикетов из подзапросов. ScriptRunner позволяет все это успешно проделывать.

Чтобы пользоваться функциями ScriptRunner, нужно в JQL добавить дополнительное слово issueFunction in или not in. Далее идет функция, например, epicsOf() она возвращает эпики тикетов, которые удовлетворяют условиям подзапроса. Подзапрос идет на второй строке в скобках, и мы его рассмотрим подробнее.

issueFunction in epicsOf("worklogDate >= startOfWeek(-1) AND worklogDate <= endOfWeek(-1)")AND project in ("Видео.B2G")

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

Сам запрос начинает выполняться со скобок, то есть с подзапроса worklogDate даты списания. Дальше идет уточнение >= startOfWeek(-1) начало недели. Но обратите внимание на цифру -1: она означает, что нам нужен не этот понедельник, а прошлый. А еще worklogDate <= endOfWeek(-1), то есть она меньше окончания прошлой недели. Этот запрос будет выдавать тикеты, не важно какие баги, таски, user story, на которые сотрудники списывали времяс понедельника по воскресенье прошлой недели.

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

Выполнив подзапрос, мы получаем обычный набор тикетов. Дальше вступает функция epicsOf, которая дает нам перечень эпиков, связанных с этими тикетами. А дальше идет фильтрация по проекту, ведь мне нужны эпики только по моему проекту, и не интересны все остальные.

Следующий запрос эпики со списаниями в этом году, но без контрактов. Этот запрос появился из-за того, что мы используем Jira не только как таск трекер, но и для ведения финансового учета. Есть отдельный проект под контракты, которые мы ведем в виде тикетов, и используем как систему электронного документооборота: статусы постоянно меняются, мы линкуем контракты с эпиками, знаем, сколько у нас людей списалось в какой эпик, знаем, сколько это стоит, и затем по каждому контракту выставляем стоимость работ. Плюс через контракты переносятся трудозатраты в Redmine 2.0. То есть мы списываемся в Jira, а затем автоматические скрипты переносят наши затраты в в Redmine 2.0 по этим контрактам.

Когда эта автоматика заработала, ко мне начали прилетать запросы от коллег вида: есть эпики, трудозатраты которых нельзя перенести в Redmine, потому что там нет контрактов. Рассмотрим запрос подробнее.

issueFunction in epicsOf("worklogDate >= startOfYear()")AND issueFunction not in hasLinkType(Contract)AND project in ("Видео.B2G")


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

Contract в скобках это тип внутренней связи, соединяющей контракты с эпиками. hasLinkType() функция в ScriptRunner, возвращающая тикеты с этим типом связи. Но мне нужны тикеты, которые не содержат этот тип связи, и поэтому использую отрицание not in.

При выполнении первого условия у меня появился скоуп эпиков, актуальных в этом году. Далее отфильтровались эпики без контрактов, и в финале по конкретному проекту Видео.B2G. Таким образом я получил все эпики, с которыми можно работать.

И в конце хочу предложить пройти небольшой тест из трёх вопросов по теме этого поста. Займет 2 минуты. После прохождения увидите свою оценку. Ссылка на опрос: https://docs.google.com/forms/d/e/1FAIpQLSdGrUZZVB62W_1-nC42Aoaz0nO5jUFTK-qIzPDKLX58u5SzCg/viewform?usp=sf_link

Буду рад что-то уточнить или ответить на вопросы в комментариях, если они у вас есть.
Спасибо.
Подробнее..

Как мы управляем проектами развития аналитической отчётности

22.05.2021 12:06:36 | Автор: admin

Привет, Хабр! Меня зовут Владимир, я бизнес-аналитик в офисе данных Ростелекома и занимаюсь развитием отчётности. Компания делает ставку на развитие data-driven культуры. Спрос на данные и аналитику со стороны бизнеса растёт, и соответственно развивается экосистема управления данными, в том числе организационная структура и бизнес-процессы.

К концу 2019 года объём задач отчётности очень сильно вырос и это стало своеобразным нагрузочным тестированием для наших процессов. Стало понятно, что работать по-старому и соблюдать SLA нам становится все сложнее. Были нужны новые правила игры, соблюдение которых сделает управление типовыми задачами проще, планирование более предсказуемым, а выполнение обязательств реалистичным даже в условиях, когда рост команды сильно ограничен, а рост количества заявок безграничен.

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

Введение

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

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

Ситуация

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

В корпоративном центре Ростелекома все профильные направления, работающие с отчётностью, объединены в Офис Данных. Это более двух сотен сотрудников в Москве и регионах, которые занимаются развитием платформы управления данными, работают в направлении глубокого анализа и развитии аналитической отчётности.

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

Развитие отчётности организовано так: за сегментами бизнеса закреплены постоянные команды из 10-30 аналитиков и разработчиков, из которых формируют рабочие группы для отдельных задач. Различий в бизнес-процессах сегментов много и каждый раз в них разбираться непродуктивно. У разработчиков с этим проще, но всё равно хочется сохранять сработавшиеся команды. Командой сегмента руководит фронт-менеджер, который объединяет роль ресурсного менеджера для команды и аккаунт-менеджера для заказчика.

Обычно в работе у фронт-менеджера есть 10-12 задач, с каждой задачей на различных этапах может работать от 2 до 5 человек. Длительность таких задач от нескольких недель до полугода (это очень грубая оценка, чтобы показать масштабы). По каждой доработке требуется создать артефакты: комплект документов, которые будут использоваться сопровождением для работы над инцидентами, и отчётность в JIRA по объёмам трудозатрат, срокам работ и загруженности ресурсов, которая позволяет анализировать эффективность процессов.

Чтобы задача проходила маршрут и не буксовала, ей нужен владелец, погруженный в предмет и заинтересованный в её своевременном выполнении. Раньше этим занимались фронт-менеджеры, но к концу 2019 года объём задач вырос настолько, что на управление отдельными задачами у них уже не оставалось времени. У фронтов основные обязанности взаимодействие с бизнес-заказчиками, маршрутизация поступающих запросов и управление командой, а управление отдельными задачами можно делегировать, иначе будет как на картинке.

Поиск решения

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

Мы поняли, что в нашем случае многие классические компетенции руководителя проектов окажутся невостребованными: например, не требуется управлять бюджетом или поставщиками, проекты будут выполняться по одному и тому же регламенту, а предметная область всегда будет ограничена отчётностью для конкретного бизнес-сегмента. Задачи чаще всего типовые, но требуют погружения в предметную область, понимания процесса разработки и содержания работ на всех этапах.

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

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

  • погружены в предметную область, как никто другой;

  • участвуют в выполнении задачи на всех этапах;

  • выполняют интегрирующую роль для команды.

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

Реализация

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

Документацию составили в формате методики управления, скорее даже инструкции. Где-то брали собственные наработки, где-то транслировали рекомендации PMBoK на наше организационное окружение. Писали так, чтобы документа было достаточно для выполнения роли РП, и чтобы его мог использовать человек без опыта проектного управления.

Затем, дополнив документ всей сопутствующей мишурой вроде шаблонов, провели обучение и в начале 2020 года запустили процесс в пилотном режиме. Работа ещё не завершена, по части согласованности процессов ещё многое нужно сделать, но определенные выводы уже можно сделать.

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

К плюсам принятого решения можно отнести:

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

  2. На коммуникации внутри команды времени тратим не больше, чем тратили раньше;

  3. Материалы задач легче использовать повторно, сроки в целом стали более прогнозируемыми.

Трудности:

  1. Есть нестыковки с операционными процессами, особенно в нетиповых ситуациях, но это ожидаемо продолжаем шлифовать;

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

Предварительные выводы оптимистичные: для небольших, но требующих погружения, задач совмещение ролей РП и бизнес-

аналитика даёт больше плюсов, чем создает неудобств.

Вместо эпилога

Минуточку, управление работами по задаче Вы там что, открыли для себя дверь роль менеджера проекта и повесили на бизнес-аналитика?. Короткий ответ Да, ответ по существу длиннее Сначала мы оценили все, что нам нужно от роли, упростили её соответственно задачам и подготовили всё необходимое, чтобы даже начинающий РП мог её выполнять.

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

P.S. Только не миниРП, пожалуйста :)

Подробнее..

Как селф-сервис BI убивает кровавый энтерпрайз

15.02.2021 10:17:19 | Автор: admin

Привет, меня зовут Владимир Шилов, я руководитель направления в департаменте анализа данных Ростелекома. В мае 2019 года я пришёл в команду Business Intelligence (BI) и одной из первых задач была реализация отчётности по анализу посещаемости отчетов во всех BI-инструментах, установленных в компании.

Решение этой задачи позволило собрать любопытную статистику и сделать выводы о востребованности BI-инструментов в Ростелекоме. В этой статье я хочу поделиться следующими результатами нашего анализа:

Какие BI системы наиболее востребованы в реалиях крупной компании;
Какие критерии влияют на внутреннюю популярность решения;
Какие современные тенденции пользовательского поведения можно наблюдать внутри компании и какие вопросы будут стоять перед ИТ-подразделениями в ближайшее время.

С чего всё началось: реализация решения по анализу используемости BI систем

Начну с общего описания ситуации и подходов к сбору информации. У нас в компании целевыми BI-системами являются:

1. Oracle BI
2. Microsoft analysis services
3. Microsoft Power BI
4. Qlik Sense
5. Форсайт

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

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

1. Провести анализ логов BI-систем по запуску отчётов;
2. Спроектировать модель витрины данных;
3. Разработать ETL;
4. Реализовать отчет в Power BI;

Решение получилось примерно следующим:

Числа в зелёных стикерах обозначают общее количество инсталляций, в синих количество self-service инсталляций.Числа в зелёных стикерах обозначают общее количество инсталляций, в синих количество self-service инсталляций.

Очевидно, что любая разработка в крупной компании с некоторой бюрократией превращается в нечто большее, чем просто Возьми и сделай! Ты же мужик! и выполнение простого алгоритма из четырёх шагов. Я довольно сильно погряз в разработку архитектурного решения и согласования его с архитекторами, а также предоставления доступов к логам и ETL. В этой статье описывать свои трудности я детально не буду и сконцентрируюсь на конечном результате.

Для начала предлагаю рассмотреть каждый BI-инструмент в отдельности.

Oracle BI

На Oracle BI реализовано подавляющее большинство отчётности в виду того, что Oracle BI является самым старым инструментом и у него почти не было альтернативы очень долгое время. Ниже представлены графики динамик по следующим показателям:
Количество используемых уникальных отчётов за период;
Количество уникальных пользователей.

На основе второго графика динамики уникальных пользователей можно сделать вывод, что аудитория BI-системы стабилизировалась и сильного роста в 2020 году не наблюдается. Этому есть ряд причин:
Доступ к отчётности требует согласования, а прозрачность процесса предоставления доступа очень низкая;
Новые предметные области появляются очень редко;
Нет возможности создавать дашборды с аналитикой.

Analysis services

Microsoft Analysis services в компании это тоже достаточно распространённый инструмент, что во многом обусловлено удобной для пользователей работой в Excel. Именно этот инструмент получил наибольшее распространение в компании: он даже более популярен в МРФ (макрорегиональных филиалах), чем в корпоративном центре. Это можно увидеть на следующей диаграмме по уникальным пользователям в разрезе территорий за последние 12 месяцев:

Ниже представлены графики динамик по следующим показателям:
Количество используемых уникальных OLAP-кубов за период;
Количество уникальных пользователей.

Рост количества используемых OLAP-кубов за последний год не наблюдается, а рост аудитории в BI-системе нестабильный со значительными всплесками. У такой статистики несколько причин:
OLAP-кубы в основном дорабатываются, а новые кубы появляются очень редко;
BI-система больше предназначена для аналитиков, умеющих работать с данными, и она сложно продается широкой аудитории;
Доступ к отчётности требует согласования с владельцем OLAP-куба.

Power BI

BI-система Power BI от Microsoft появилась самой последней в стеке инструментов компании, но именно к этой системе сейчас приковано самое большое внимание со стороны бизнеса по следующим причинам:
Базовый набор визуализаций имеет хороший дизайн;
Лицензирование осуществляется по ядрам на сервере, отсутствует лицензирование по пользователям;
Скорость разработки отчётов довольно высокая, но стоит отметить, что на полный цикл разработки это не сильно влияет.

Ниже представлены динамики показателей аудитории и количество отчётов, которые она использует:

Стоит отметить, что при относительно низком росте количества используемой отчётности аудитория продолжает расти. Это связанно в большей степени с тем, что доступ к отчётам предоставляется без выделения лицензий на каждого пользователя и изначально нет никаких ограничений по доступу, то есть оформлять заявку не нужно. Уже сейчас наблюдается тенденция перевода отчетов с Qlik sense на Power BI именно потому, что новые пользователи подключаются бесплатно.

Qlik sense

Qlik sense была первой корпоративной BI-системой с возможностью реализации полноценных дашбордов. Именно с Qlik sense связан переход от предоставления табличных данных к графическим визуализациям в компании.
Ниже представлены графики динамик по следующим показателям:
Количество используемых уникальных отчётов за период;
Количество уникальных пользователей.

Казалось бы, перед нами современный BI-инструмент с высоким спросом, в котором можно создавать красивые решения, но сильного роста отчётности по сравнению с Oracle BI и Analysis services мы не наблюдаем. Тут есть несколько причин, влияющие на аудиторию и количество новых отчётов:
Лицензия на одного пользователя стоит существенных денег, и поэтому бизнес отказывается заказывать отчетность в Qlik sense;
Длительный период реализации отчётов от подготовки данных до реализации не позволяет быстро перенести все бизнес-процессы на новый инструмент.

Теперь поговорим про инструменты Self-service.

Self-service инструменты

Qlik sense self-service

В ноябре 2019 для бизнеса мы развернули self-service и предложили бизнесу реализовывать свои отчеты на своих источниках самостоятельно. С точки зрения лицензирования было одно изменение разработчики лицензируются отдельно. С лицензиями пользователей изменений не было по причине того, что сервера были объединены в один кластер и лицензии, соответственно, тоже.
Графики динамик количества запускаемых отчётов и уникальных пользователей в недельной динамике представлены ниже:

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

Power BI self-service

Вот мы и дошли к самому интересному. Power BI self-service появился примерно в то же самое время, что и Qlik Sense self-service, но у данных систем есть одно существенное отличие в лицензировании. Для подключения команды разработчиков от бизнеса в Power BI self-service надо разово заплатить за лицензию на 2 ядра, что примерно равняется 35 лицензиям пользователей в Qlik sense, но лимита на пользователей в Power BI нет.

То есть бизнес-подразделение разово платит за одну лицензию и получает существенные возможности по реализации отчётности для большой аудитории. Разумеется это позитивно повляло на показатели используемости данной системы, стоит отметить, что цена вхождения BI-разработчика в разработку базовых отчетов очень низкая.
Ниже представлены динамики показателей аудитории и количество отчётов, которые она использует:

Ещё более наглядно всё выглядит если показать все рассматриваемые системы вместе:

Какие критерии влияют на развитие отчетности?

В части развития отчетности в BI-системах стоит выделить следующие особенности, которые описаны в таблице:

Свойство\BI-система

Power BI

Power BI self-service

Qlik sense

Qlik sense self-service

Analysis services

Oracle BI

Лицензирование

Бесплатно для бизнеса

Лицензия на 2 ядра на одну команду разработки. Для пользователей бесплатно.

Лицензия на каждого пользователя

Лицензия на каждого пользователя и разработчика

Бесплатно для бизнеса

Бесплатно для бизнеса

Вид визуализации

Дашборды

Дашборды

Дашборды

Дашборды

Excel таблицы

Табличные отчеты без аналитики

Требования к квалификации BI-разработчика

Низкие

Низкие

Средние

Средние

Средние

Выше среднего

Качество дизайна базовых визуализаций

Высокое

Высокое

Среднее

Среднее

Отсутствует

Низкое

Процесс подготовки данных

Централизованное хранилище

Собственные источники

Централизованное хранилище

Собственные источники

Централизованное хранилище

Централизованное хранилище

Предоставление доступа

Все отчеты публичные

Все отчеты публичные

По согласованию владельца лицензий

По согласованию владельца лицензий

По согласованию владельца куба

По согласованию владельца области предметной области

Исходя из результатов нашего анализа именно критерии, описанные в таблице, оказали самое большое влияние как на скорость создания новой отчетности, так и на востребованность отчетности пользователями компании. А ключевым фактором успеха Power BI self-service стала политика лицензирования и его условная бесплатность для разработчиков на стороне бизнеса.

Заключение

Из выше сказанного можно сделать вывод, что ключевыми факторами по использованию отчётности в различных BI-системах являются (расположены по мере уменьшения значимости):
Стоимость подключения новых пользователей, особенно на большую аудиторию;
Длительность полного цикла реализации отчёта от подготовки данных до публикации;
Простота реализации отчётов в BI-системе.

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

Несмотря на то, что у ИТ сейчас нет однозначных ответов на эти вопросы, очевидно, что бизнес уже сделал свой выбор в пользу Self-service инструментов, и на эти вопросы нам придется отвечать. Будем рады присоединиться к обсуждению в комментариях. О том, какие решения мы нашли для self-service контура Ростелекома мы расскажем вам в наших будущих статьях.

Статья подготовлена командой управления данными Ростелекома

Подробнее..

ИТ-сообщества в разных компаниях видео и презентации докладов с онлайн-митапа

07.06.2021 16:20:09 | Автор: admin

Привет Хабр! Мы выложили на YouTube видеозаписи докладов митапа ИТ-сообщества в разных компаниях 21 апреля. В онлайн-формате эксперты ИТ-кластера Ростелекома, а также наши коллеги из Альфа-Банка, Fleetcor, Райффайзенбанка рассказали, как создавать и развивать профессиональные сообщества в ИТ-компаниях.

Пропустили мероприятие? Делимся главными тезисами докладов, а ещё видео и презентациями спикеров. В хронолическом порядке.

#1 Делаем сложное возможным Татьяна Егорова(Ростелеком)

Открывающий доклад митапа про историю запуска Гильдии аналитиков Ростелекома с комментариями её создателя. О предназначении гильдии аналитиков, как её строили, с какими трудностями сталкивались и как их преодолевал.

Скачать презентацию

#2 Что сотрудники могут изменить под эгидой Гильдии развития ИТ Полина Самсонова (Ростелеком)

В Ростелекоме действует ещё одно профессиональное комьюнити гильдия развития ИТ. Её создатель Полина Самсонова активный генератор и реализатор идеи объединения сотрудников в круги рассказывает о том, как объединять неравнодушных коллег в сообщества, которые меняют процессы в компании на длинной дистанции.

Скачать презентацию

#3 Рабочие группы и их вклад в развитие системного анализа Алексей Лобзов (Альфа-Банк)

Алексей регулярный спикер митапов и образовательных проектов для системных аналитиков. Вас ждёт знакомство с внутренними проектами Альфа-Банка по развитию системных аналитиков, а после небольшой теоретической части Алексей покажет на реальном кейсе, в чём преимущества и недостатки рабочих групп.

Скачать презентацию

#4 Карьерные диалоги Наталья Пешкова (Райффайзенбанк)

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

Скачать презентацию

#5 Внутренние обучения как способ повышения экспертизы сотрудников Анастасия Груздева и Светлана Михеева (Альфа-Банк)

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

Скачать презентацию

#6 Эти неловкие вопросы про комьюнити Татьяна Такташева (Fleetcor)

Резюмирующий доклад митапа в формате глупых вопросов:
- Как организовать комьюнити?
- Как найти ЦА?
- Какую периодичность встреч выбрать?

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

Скачать презентацию

Вместо заключения

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

Полную видеозапись митапа смотрите на YouTube по ссылке.

Подробнее..

История портирования Reindexerа как покорить Эльбрус за 11 дней

15.06.2021 18:13:51 | Автор: admin

Всем привет! На связи Антон Баширов, разработчик из ИТ-кластера Ростелекома. Импортозамещение набирает обороты, а российский софт всё глубже проникает в нашу повседневную ИТ-шную сущность бытия. Процессоры Эльбрус и Байкал становятся более востребованными, комьюнити расширяется, но мысли о необходимости портировать весь наш любимый технологический стек на неизведанную архитектуру E2K звучат страшнее рассказов про горящий в пламени production-кластер.

Работая в команде по внедрению Эльбрусов, мне довелось в прямом и переносном смысле пощупать наши отечественные процессоры, поэтому я хочу поделиться полученным опытом, рассказать о том, какой болевой порог нужен, чтобы выдержать портирование NoSql native базы данных и не сойти с ума, а еще познакомить разработчиков с миром Эльбруса и его обитателями.

Итак, гость в студии база данных Reindexer, разработка нашего ИТ-кластера.

Стоит сказать, почему выбор пал именно на Reindexer, а не другую БД. Во-первых, всеми любимый и известный Postgres уже есть в составе пакетов ОС Эльбрус. Переносить его нет необходимости. Во-вторых, наш гость уже прошел испытания на ARM, следовательно, пришло время ему покорить Эльбрус.

Стоит упомянуть, что Reindexer появился на свет как продуктвыбора между Elastic и Tarantool. Это определенно хочется попробовать завести на отечественном процессоре.

День 0. Знакомство с гостем

Несколько слов про нашего гостя:

Имя:NoSQL in-memory database Reindexer с функционалом полнотекстового поиска
Возраст:на момент испытаний версия БД была 3.1.2
Происхождение:Россия
Место рождения:пытливый ум разработчика Олега Герасимова@olegator99
Место жительства:https://github.com/Restream/reindexer
Место работы:Ростелеком
Строение:основная составляющая C++, имеются примеси из языка Ассемблера и немного CMake
Особенности:- Ассемблерные вставки;
- Много С++11 и C++14;
- Используются корутины.

Деятельность:- Хранение данных в памяти и на диске;
- Выполнение SQL запросов со скоростью 500K queries/sec для PK запросов;
- Выполнение запросов типа full-text search (почти как Elastic, только не тормозит);
- Работа в режиме server и embedded;
- Общение с крутыми парнями: Go, Java, Rust, .NET, Python, C/C++ и (да простит меня Хабр) PHP.

Заскучали? На этом нудная часть закончилась. В эфире рубрика Ээээксперименты!

День 1. А ты думал, в сказку попал?

Для начала попробуем нашего друга собрать из того, что есть.Идем на тестовый сервер Эльбрус 8C с ОС Эльбрус 6.0.1, клонируем туда репозиторий и запускаем CMake.

Хорошие новости, мы нашли компилятор! Новость действительно хорошая, ведь у Эльбруса свой компилятор LCC.

К счастью, создатели Эльбрус сделали LCC полностью совместимым с GCC и наши любимые нативные программки и сборщики смогут чувствовать себя хорошо без особых манипуляций. LCC уже сделал за вас нужные линки:gcc -> /opt/mcst/bin/lcc*.

Зачем Эльбрусу свой компилятор?

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

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

Ключевая идея архитектуры давайте попробуем выполнить несколько операций за один присест. Эльбрусы позволяют реализовать параллельные выполнение кода без применения многопоточности. Достигается это путем одновременного выполнения разных инструкций внутри одной широкой команды на разных устройствах процессора. Но для того, чтобы процессор понимал, что от него хотят и мог правильно распределить инструкции, ему нужно дать на вход оптимизированный поток больших команд. Именно в формировании этого потока и заключается назначение LCC компилировать код так, чтобы широкие команды содержали параллельно выполняемые инструкции с целью задействовать все устройства CPU. Подробнеетут.

Но вернемся к нашему гостю и тому, что не понравилось CMake.

В скриптах сборки, в CMakeLists.txt выполняется определение операционной системы и архитектуры процессора, на которой собирается Reindexer. Нужно это для того, чтобы подключать правильные исходники ассемблера, ведь как говорится Write once, run anywhere.

Разумеется, на момент написания скриптов никто не знал про процессоры Эльбрус, поэтому наш скрипт и упал. Исправляем.

Программисты люди ленивые, поэтому:

Попытка 2:

А что так можно было? На самом деле да для того, чтобы завелся CMake, этого было достаточно. Теперь ударим в бубен и запустимmake -j8:

Для тех, кто уже успел поработать с кроссплатформенным софтом, не новость, что С/С++ код с помощью макросов разделяют на платформозависимые секции.

Поэтому, в некоторые места кода Reindexer понадобилось добавить парочку новых условий для__E2K__и__LCC__:

После колдовства с макросами нас ждал монстр пострашнее:

Вот что бывает, когда игнорируешь messages у CMake.

Из-за того, что CMake не нашел подходящих исходников, компилятор не смог найти реализации двух функций:jump_fcontextиmake_fcontext. Про назначение этих функций я расскажу чуть позже, а пока что давайте успокоим нашего гостя и подсунем ему пару пустышек:

Этих операций оказалось достаточно, чтобы Reindexer собрался.

Поздравляю, у вас двойня!

Вот они, наши два долгожданных файла:

# file reindexer_serverreindexer_server: ELF 64-bit LSB executable, MCST Elbrus, version 1 (GNU/Linux
# file reindexer_toolreindexer_tool: ELF 64-bit LSB executable, MCST Elbrus, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux.so.2, for GNU/Linux 2.6.33, with debug_info, not stripped

Это можно считать успехом. Мы смогли собрать наш первый Эльбрус-бинарник. Даже два бинарника: reindexer_server и reindexer_tool.

Подведем итоги. Чтобы собрать Reindexer, мы:

  • Поправили CMake-скрипты;

  • Добавили несколько условий в макросы препроцессора;

  • Заглушили ASM функции.

День 3. Наш Гость, попав на Эльбрус, начал подавать признаки жизни

Первый запуск прошел успешно - сервер поднялся, и даже открылся web-ui.

Я привык не останавливаться на достигнутом и решил немного поработать над Reindexer.

Результат меня порадовал - Гость устал и прилег отдохнуть:

Такое поведение наблюдалось только на Эльбрус. На i5 все работало штатно.

Давайте разбираться. Вооружившись отладчиком (gdb кстати под E2K работает прекрасно) и CLion, мне удалось докопаться до истины.

Пару запросов к Reindexer смогли воспроизвести ошибку:

Падает в деструкторе. Интересный момент - упало на free (в данном случае free реализуется через jemalloc). Видимо, здесь идет высвобождение памяти по некорректному указателю. Ошибку эту я исправлял в два этапа:

  1. work around - дело в том, что QueryEntry лежит в объекте ExpressionTree, в самом классе примечательного я не нашел, поэтому копнул в сторону родителя. Оказалось, что до вызова деструктора был вызван вот такой копирующий конструктор, в котором есть интересный MakeDeepCopy(), реализованный с помощью библиотечкиmpark-variant.

    Подробнее про expression tree рассказываюттут.

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

    Итог - оно заработало.

  2. TODO: Исправление тоже есть, но рассказ про него уже выходит за рамки данной статьи. Небольшой спойлер (код из mpark-variant с патчем под e2k):

inline constexpr DECLTYPE_AUTO visit(Visitor &&visitor, Vs &&... vs)#ifdef E2K //Fix for Elbrus    -> decltype(detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),                                                 lib::forward<Vs>(vs)...))    {     return detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),                                                 lib::forward<Vs>(vs)...);    }#else    DECLTYPE_AUTO_RETURN(        (detail::all(             lib::array<bool, sizeof...(Vs)>{{!vs.valueless_by_exception()...}})             ? (void)0             : throw_bad_variant_access()),        detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),                                                 lib::forward<Vs>(vs)...))#endif

День 5. Он ожил! Ну почти

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

Но все это время я упорно игнорировал один компонент.

Помните, как мы убрали завязку на ASM и функцииmake_fcontext и jump_fcontext?

Так вот, ASM исходники в Reindexer нужны для реализации C++ корутин, а эти функции - ключевые для корутин из библиотеки boost/context.

Кто такая эта ваша Корутина?

Корутина это функция, которая может быть приостановлена и возобновлена в любой момент. Для реализации достаточно трех основных компонентов:
- функция
- механизм для ее паузы (suspend)
- механизм для возобновления ее с той точки, в которой была сделана пауза (resume).

Реализацию корутин можно увидеть в таких языках и библиотеках, как:

  • Libcoro(корутины на C/С++)

  • Koishi(тоже корутины, тоже на С/С++)

  • Boost(и это тоже корутины, тоже на С/С++, корутин много не бывает!)

  • Node-fibers(корутины для NodeJS на базе libcoro)

  • Tarantool(fibers на базе libcoro)

  • Kotlin(свои корутины, не на C++)

  • C++20

  • Goroutine

Для наглядности вот скрин теста корутин из Koishi:

Последовательность следующая:

  1. Создали корутину, выделили стек, задали функцию;

  2. Возобновили корутину - в этот момент вызвалась наша функция;

  3. Приостановили корутину с помощьюkoishi_yield здесь мы вернули управление в test1 сразу после строчкиkoishi_resume;

  4. Если мы еще раз сделаемkoishi_resumeна нашей корутине мы вернемся на строчку функции cofunc1 сразу после первого вызоваkoishi_yield.

Без корутин не будет работать reindexer_tool, но не можем же мы оставить Reindexer без такой важной конечности. Будем исправлять.

Начнем с анализа ситуации. Ожидаемо, что ASM Эльбруса бустовские корутины не поддерживают (пока что), а значит нам нужно реализовать их самим. Подробности и реализацию бустовских корутин можете посмотретьздесь, а сейчас наступило время скрещивать ужа с ежом.

Есть несколько вариантов реализовать корутины:

  • Вариант 1:написать ASM реализацию. Самый очевидный, но при этом самый сложный вариант. У нас есть в планах попробовать именно этот вариант, так как ASM корутины - самые быстрые.

  • Вариант 2: забить. Нет, это не наш путь.

  • Вариант 3: использовать библиотеку.

По счастливой случайности Koishi оказалось той самой библиотекой, поддерживающей реализацию корутин с помощью встроенных E2K функций:makecontext_e2k()иfreecontext_e2k().

Koishi, Koishi, что это вообще такое?

Если коротко это библиотека, предоставляющая удобный API по использованию корутин на C/C++ с несколькими вариантами реализации:

  • ucontext

  • ucontext_e2k (наша прелесть)

  • fcontext

  • win32fiber

  • ucontext_sjlj

  • emscripten

Там, где стандартная медицина бессильна, в дело вступает генная инженерия.

Для начала внедрим Koishi в организм Reindexer:

Заменим больной орган на здоровый:

Стараемся не повредить то, что уже работает:

Одним из backend-ов Koishi для корутин выступает fcontext (те же самые boost исходники, что в Reindexer). Последуем древней мудрости работает не трогай! и оставим как есть в случае, если у нас не E2K архитектура. Для Эльбруса мы будем использоватьucontext_e2k.c

И вот он, наш мутант с корутинами полностью здоров и функционален (и на amd64, и на E2K):

День 11. Проводим финальные испытания

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

Всего в Reindexer около 300 функциональных тестов, и мне не терпится запустить их все.

Тесты бежали, бежали и не добежали. Один из тестов вызвал Segmentation Fault.

Всему виной оказались вот эти строчки:

struct ConnectOpts {  /* тут тоже код, но он не такой интересный */  uint16_t options = 0;  int expectedClusterID = -1;};

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

Попробуем воспроизвести на изолированном более простом примере.

ASM, настало твое время

Внимание на скриншот:

Ошибка проявляется именно в том случае, когда отсутствуют не проинициализированные поля. Другими словами, если все ваши поля инициализируются при объявлении вы счастливчик, поймавший Segmentation Fault.

Баг заключается в том, что скомпилированное создание структуры выглядит как странныйaddd. Именно эта строчка и вызывает segfault. Кстати, если вместоbool anyField = falseнаписать простоbool anyField, то код совершенно другой и ошибки нет.

Семь бед, один ответ обновитесь!

Разгадка тайны оказалась проста. На момент работы с Reindexer последней версией компилятора LCC была v.1.25.16, однако в состав пакетов ОС Эльбрус по умолчанию входит 1.25.14, на котором я и запускал тесты. Добрые люди из сообщества подсказали нам, что уже в 15 версии данный баг был исправлен. Я решил обновиться на 16-ую и посмотреть, что будет.

Вот что нам принес новый компилятор LCC v.1.25.16:

C++ код такой же, однако ASM совсем другой, и что самое главное он работает! Последовательно (заранее прошу прощения за мой ломаный asm-русский переводчик):

  1. gestp - выделяем стек и кладем его в %dr3

  2. setwd - задаем текущее окно в регистровом файле

  3. setbn - задаем подвижную базу регистров в текущем окне регистрового файла

  4. addd - кладем "дно" стека (стек размером 0x20) в %dr2

  5. addd - выделяем на стеке нашу структуру

  6. ldb - достаем из констант наш false и кладем его в %r5

  7. stb - кладем наш false из регистра %r5 в наше поле anyField1

  8. addd - подготовили локальный указатель на структуру для вызова метода

  9. addd - передаем указатель в базовый регистр для передачи при вызове anyMethod (в anyMethod мы достаем указатель из регистра %dr0)

  10. disp - подготавливаем регистр перехода на anyMethod

  11. call - вызываем anyMethod

Дальше все просто пересобрать, перезапустить, обрадоваться.

Тесты прошли успешно, и теперь у нас есть полностью рабочий и протестированный Reindexer на Эльбрусе.

На этом все ?

На самом деле нет. Сейчас мы смогли:

  • собрать Reindexer Server

  • запустить Reindexer Server

  • собрать Reindexer Tool

  • запустить Reindexer Tool

  • переписать кусочек Reindexer Tool

  • уронить Reindexer и поднять его

  • добиться 100% проходимости Reindexer тестов

Мы научились:

  • собирать C++ софт на Эльбрус

  • переписывать C++ софт под особенности и отличия Эльбрусов

  • разбираться в ASM E2K

  • превозмогать трудности

  • разбираться в C++ корутинах даже на Эльбрусе

Что в планах:

  • корутины на ASM E2K (может быть даже сравнить fcontext ASM на i5 и ucontext/ASM на E2K)

  • оптимизировать Reindexer под архитектуру Эльбрус

  • перенести еще несколько интересных приложений на Эльбрус

  • дополнить базу библиотек и пакетов Эльбрус

  • организовать E2K инфраструктуру и песочницу

Что же можно сказать про Эльбрус со стороны простого разработчика?

Эльбрус это ваш друг. Он уже умеет в 80% современного софта, работать с ним можно и достаточно комфортно. Его архитектура - действительно произведение искусства, идея одноядерного параллелизма достойна уважения и несет в себе большой потенциал. Вопрос лишь в том, получится ли его раскрыть.

На сегодня это всё, что хотелось бы вам рассказать, но я еще вернусь с новыми интересными подробностями про портирование и оптимизацию, и да прибудет с вами сила Эльбруса!

Подробнее..

Recovery mode Как мы автоматизировали тестирование верстки сайта с помощью скриншотов

08.02.2021 10:22:45 | Автор: admin

Привет, меня зовут Фахридин Джамолидинов, я специалист департамента тестирования в Ростелеком ИТ. Занимаюсь автоматизацией тестирования основного сайта компании rt.ru и сегодня я расскажу, как про мы внедрили тестирование скриншотами, или как помочь автотестам видеть ошибки.

Наш сайт это не только витрина для информирования клиентов и продаж услуг и товаров для сегментов B2C, B2B и B2O, он ещё предназначен для обслуживания текущих клиентов: FAQ, чат, формы обратной связи, платежные формы и т.п.Он постоянно обновляется, и каждый раз после выпуска новой версии нужно проверять сотни страниц с богатым, динамичным UI на работоспособность в браузерах и адаптивность вёрстки.

Конечно же на этапе разработки применяется практика design review со стороны наших продуктовых дизайнеров, но нет-нет да проблемы всплывали: где-то элементы перекрываются, съезжаются, не сохраняется единый стиль. Осознавая, что ручное регрессионное тестирование существующего UI превращается в кошмар и отнимает кучу времени, мы решили автоматизировать данный процесс.

Как всё начиналось

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

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

Итого, что нам требовалось:

  • возможность сравнения всей страницы целиком, отдельных элементов, групп элементов;

  • проверка на адаптивность (десктоп 1920px, планшет 768px, мобила 360px);

  • поддержка минимум двух браузеров: Chrome и Firefox;

  • игнорирование и скрытие элементов (групп элементов) при сравнениях;

  • удобочитаемый отчет с подсветкой отличий.

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

Java основной язык программирования;
TestNG фреймворк автоматизации тестирования;
Maven сборщик;
Selenide обертка над Selenium, которая упрощает написание веб автотестов;
Selenoid GGR сервер-балансировщик для запуска изолированных браузеров в Docker контейнерах;
Allure фреймворк для создания отчётов автотестов и плагин ScreenDiff;
aShot библиотека для попиксельного сравнения изображений.

Благодаря балансировщику Selenoid GGR (Go Grid Router), в котором настроено распределение на несколько машин, мы имеем возможность поддержки нескольких браузеров (при необходимости: нескольких версий), плюс запуск тестов (изолированных браузеров) в параллель (~40 потоков).

В этой статье мы покажем как работает автотестирование по скриншотам будем акцентировать внимание на функционал aShot (кстати, спасибо ребятам из Яндекса за такие полезные инструменты как aShot и Allure) и на самом процессе.

Как это работает

Тесты условно разбиты на две группы:

  • fullscreen страницы целиком (с прокручиванием);

  • element(s) отдельный элемент (группа элементов)

Каждая из групп представляет из себя data-driven тесты, т.е. каждая страница, элемент (группа элементов) это отдельный параметризованный тест на основе DataProvider, а вся задача сводится к сравнению двух скриншотов. Например, регресс верстки списка Landing Page, в виде схемы выглядит так:

Избавляемся от динамики

Динамика в основном проявляется в виде:

  • каретки в полях ввода, которая мигает (может пропасть или появиться);

  • CSS Transition и Animations;

  • видео с автопроигрыванием и ряд других моментов.

Там, где есть возможность отключаем (инъекцией CSS):

Каретку делаем прозрачной (задаем значениецвета = transparent). Таким образом она всегда будет невидимой и не будет влиять на результат. CSS Transition обнуляем transitions-delay и transition-duration. CSS Animation обнуляем animation-delay, animation-duration и ставим состояние анимации в паузу, устанавливаяanimation-play-stateвpaused.

*, *::after, *::before {    caret-color: transparent !important;    transition-delay: 0s !important;     transition-duration: 0s !important;    animation-delay: 0s !important;     animation-duration: 0s !important;    animation-play-state: paused !important;    overflow: hidden; // Опционально скрываем полосу прокрутки}

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

Проверяем на адаптивность

Если с десктоп браузером всё понятно, с планшетом и мобилой встал вопрос, как проще эмулировать браузер. Было решено, что пока достаточно использовать фичу вебдрайвера mobileEmulation. Пример скрипта поднятия вебдрайвера Chrome с включением этой опции, в режиме планшета и выбором девайса = iPad:

@Override    public WebDriver createDriver(DesiredCapabilities capabilities) {WebDriverManager.chromedriver().setup();Map<String, String> mobileEmulation = new HashMap<>();mobileEmulation.put("deviceName", "iPad");ChromeOptions chromeOptions = new ChromeOptions();chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);WebDriver driver = new ChromeDriver(chromeOptions);WebDriverRunner.setWebDriver(driver);return driver;    }

Снимаем скриншоты

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

screens / {browser} / {desktop | tablet | mobile} / {region} в зависимости от выбранного для запуска браузера, устройства (режима адаптивности) и регионов (некоторые компоненты могут быть регионозависимы, т.е. отображаться по-разному в зависимости от выбранного пользователем региона).

Название файла состоит обычно из:

  • для fullscreen (страницы целиком) = {URL path} + опционально {query}, {ref};

  • для отдельного элемента | групп элементов = {URL path} + {уникальный class | id | path} (тут на усмотрение кому как удобно, главное, чтобы можно было выделить уникальное значение)

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

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

Пример снятия скриншота всей страницы (fullscreen):

Создаем объект Screenshot AShot, перед вызовом метода takeScreenshot() вызываем метод shootingStrategy(), в параметрах которого задаем правило съемки viewportPasting(300), т.е. снимать скриншот с прокручиванием, с таймаутом 300 мс. AShot по умолчанию использует jQuery для поиска координат, при его отсутствии, необходимо включить поиск координат с помощью WebDriver API предварительно вызвав метод coordsProvider(new WebDriverCoordsProvider()).

Screenshot actualScreenshot = new AShot()   .shootingStrategy(ShootingStrategies.viewportPasting(200))   .coordsProvider(new WebDriverCoordsProvider())   .takeScreenshot(getWebDriver());

На этапе снятия скриншотов в режиме планшета и мобилы, пробовали разные модели устройств и столкнулись с проблемами, что при прокрутке то масштаб выходил за рамки, то появлялись черные области на скринах, посмотрели открытые Issues проекта AShot, оказалось у многих возникает такая ситуация:

Черные области при прокруткеЧерные области при прокруткеНекорректный масштаб и склейка областей при прокруткеНекорректный масштаб и склейка областей при прокрутке

Погуглив и проанализировав DPR (Device Pixel Ratio) значения страниц в разных режимах, стало понятно, что дело скорее всего в соотношении пикселей устройств, которые мы эмулируем. Запустив window.devicePixelRatio;в консоли браузера, можно найти его. Задали другой shootingStrategy, указав подходящий устройству DPR scaling в параметрах, и таким образом избавились от вышеуказанных проблем.
Для режима планшет (iPad) указали ShootingStrategies.viewportRetina(600,0,0,2f).
Для мобилы (Pixel 2XL) указали ShootingStrategies.viewportRetina(600,0,0,3.5f)

Пример снятия скриншота конкретного элемента (группы элементов):

При вызове метода takeScreenshot(), в параметрах, помимо текущего WebDriver, передаем еще элемент WebElement либо коллекцию элементов Collection <WebElement>, по которым мы хотим получить скриншот:

Collection<WebElement> elements = new ArrayList<>();   elements.add($x("//div[contains(@class,'rtk-offer-list')]")); // допуслуги и оборудование   elements.add($x("//div[@class='rtk-offer__legend']")); // блок ценыScreenshot actualScreenshot = new AShot()   .shootingStrategy(ShootingStrategies.viewportPasting(200))   .coordsProvider(new WebDriverCoordsProvider())   .takeScreenshot(getWebDriver(),elements);

Снятие скриншота c установкой игнорирований элемента(-ов) при сравнении:

Создаем set из элементов, которые хотим игнорировать при сравнениях:

Set<By> ignoredElements = new HashSet();ignoredElements.add(By.xpath(xpath);

и передаем при снятии актуального скриншота этот набор вызовом метода ignoredElements(final Set ignoredElements)

Screenshot actualScreenshot = new AShot()   .shootingStrategy(ShootingStrategies.viewportPasting(200))   .coordsProvider(new WebDriverCoordsProvider())   .ignoredElements(ignoredElements)   .takeScreenshot(getWebDriver());

чтобы игнорирование применилось и для эталонного скриншота, до сравнений, указываем для него набор игнорируемых областей, согласно набору игнорируемых элементов текущего скриншота:

expectedScreenshot.setIgnoredAreas(actualScreenshot.getIgnoredAreas());

Сравнение скриншотов

После того как был получен актуальный скриншот, применены правила и фильтры к нему и эталонному скриншоту, сопоставляем их и аттачим в отчёт.

ImageDiff diff = new ImageDiffer().withDiffMarkupPolicy(new ImageMarkupPolicy().withDiffColor(Color.RED)).makeDiff(expectedScreenshot, actualScreenshot);    if(diff.getDiffSize()!=0){       Allure.label("testType", "screenshotDiff");       attachImg("expected", expectedScreenshot.getImage());       attachImg("actual", actualScreenshot.getImage());       attachImg("diff", diff.getMarkedImage());       attachImg("diff (прозрачность)", diff.getTransparentMarkedImage());       Assert.fail("Скрины отличаются");    }
 Пример отчета с шагами и вложениями (без блока Screen Diff) Пример отчета с шагами и вложениями (без блока Screen Diff)

Для удобства просмотра отличий используем плагин Allure ScreenDiff, который добавляет специальный блок в сценарий, внутри отчёта, с двумя режимами:

  • Отображение отличий с подсветкой (Show diff);

  • Отображение формы с режимом наложения (Overlay) с передвигаемым по горизонтали ползунком для удобного визуального сопоставления текущего и ожидаемого результата.

Отображение отличий с подсветкой (Show diff)Отображение отличий с подсветкой (Show diff) Отображение формы с режимом наложения (Overlay) Отображение формы с режимом наложения (Overlay)

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

А в чём польза?

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

Пользователи мобильной версии версии сайта бренда долгое время вместо кнопки Узнайте больше видели Узнайте боль (спасибо ребятам из Альфа-банка, которые первыми это заметили). Это один из примеров, который вызывает больше улыбку чем неудобство, но бывают ситуации, которые не столь безобидны. На этом пока всё. Всем стабильных тестов! :)

Подробнее..

Пошаговая инструкция по настройке и использованию Gitlab CI Visual Studio для сборки приложения .NET Framework

12.03.2021 14:20:14 | Автор: admin

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


Как только кто-либо из нашей команды вносит изменения в код (читай мерджит feature-ветку в develop), наш билд-сервер:


  • Собирает исходный код и установщик приложения
    • проставляет номер сборки, каждый раз увеличивая последнюю цифру. Например, текущая версия нашего ПО 3.3.0.202 часть 3.3.0 когда-то ввёл разработчик (привет, SemVer), а 202 проставляется в процессе сборки.
    • В процессе анализирует качество кода (с использованием SonarQube) и отправляет отчёт во внутренний SonarQube,
  • Сразу после сборки запускает автотесты (xUnit) и анализирует покрытие тестами (OpenCover),

Также, в зависимости от ветки, в которую были внесены изменения, могут быть выполнены:


  • отправка сборки (вместе с changelog-ом) в один или несколько телеграм-каналов (иногда удобнее брать сборки оттуда).
  • публикация файлов в систему автообновления ПО.

Под катом о том, как мы научили Gitlab CI делать за нас бОльшую часть этой муторной работы.


Оглавление


  1. Устанавливаем и регистрируем Gitlab Runner.
  2. Что нужно знать про .gitlab-ci.yml и переменные сборки.
  3. Активируем режим Developer PowerShell for VS.
  4. Используем CI для проставления версии во все сборки решения.
  5. Добавляем отправку данных в SonarQube.
  6. Причёсываем автотесты xUnit + добавляем вычисление покрытия тестами через OpenCover.
  7. Послесловие.

Перед началом


Чтобы быть уверенными, что написанное ниже работает, мы взяли на github небольшой проект, написанный на WPF и имеющий unit-тесты, и воспроизвели на нём описанные в статье шаги. Самые нетерпеливые могут сразу зайти в созданный на сайте gitlab.com репозиторий и посмотреть, как это выглядит.


Устанавливаем и регистрируем Gitlab Runner


Для того чтобы Gitlab CI мог что-либо собрать, сначала установите и настройте Gitlab Runner на машине, на которой будет осуществляться сборка. В случае проекта на .Net Framework это будет машина с ОС Windows.


Чтобы настроить Gitlab Runner, выполните следующие шаги:


  1. Установите Git для Windows с сайта git.
  2. Установите Visual Studio с сайта Microsoft. Мы поставили себе Build Tools для Visual Studio 2019. Чтобы скачать именно его, разверните список Инструменты для Visual Studio2019.
  3. Создайте папку C:\GitLab-Runner и сохраните в неё программу gitlab runner. Скачать её можно со страницы [документации Gitlab] (https://docs.gitlab.com/runner/install/windows.html) ссылки скрыты прямо в тексте: Download the binary for x86 or amd64.
  4. Запустите cmd или powershell в режиме администратора, перейдите в папку C:\GitLab-Runner и запустите скачанный файл с параметром install (Gitlab runner установится как системная служба).

.\gitlab-runner.exe install

  1. Посмотрите токен для регистрации Runner-а. В зависимости от того, где будет доступен ваш Runner:


    • только в одном проекте смотрите токен в меню проекта Settings > CI/CD в разделе Runners,
    • в группе проектов смотрите токен в меню группы Settings > CI/CD в разделе Runners,
    • для всех проектов Gitlab-а смотрите токен в секции администрирования, меню Overview > Runners.

  2. Выполните регистрацию Runner-а, с помощью команды



.\gitlab-runner.exe register

Далее надо ввести ответы на вопросы мастера регистрации Runner-а:


  • coordinator URL http или https адрес вашего сервера gitlab;
  • gitlab-ci token введите токен, полученный на предыдущем шаге;
  • gitlab-ci description описание Runner-а, которое будет показываться в интерфейсе Gitlab-а;
  • gitlab-ci tags через запятую введите тэги для Runner-а. Если вы не знакомы с этим механизмом, оставьте поле пустым отредактировать его можно позднее через интерфейс самого gitlab-а. Тэги можно использовать для того, чтобы определённые задачи выполнялись на определённых Runner-ах (например, чтобы настроить сборку ПО на Runner-е, развёрнутом на копьютере ОС Windows, а подготовку документации на Runner-е с ОС Linux);
  • enter the executor ответьте shell. На этом шаге указывается оболочка, в которой будут выполняться команды; при указании значения shell под windows выбирается оболочка powershell, а последующие скрипты написаны именно для неё.

Что нужно знать про .gitlab-ci.yml и переменные сборки


В процессе соей работы Gitlab CI берёт инструкции о том, что делать в процессе сборки того или иного репозитория из файла .gitlab-ci.yml, который следует создать в корне репозитория.


Вбив в поиске содержимое .gitlab-ci.yml для сборки приложения .NET Framework можно найти несколько шаблонов: 1, 2. Выглядят они примерно так:


variables:  # Максимальное количество параллельно собираемых проектов при сборке решения; зависит от количества ядер ПК, выбранного для сборки  MSBUILD_CONCURRENCY: 4  # Тут куча путей до утилит, которые просто оябзаны лежать там, где ожидается  NUGET_PATH: 'C:\Tools\Nuget\nuget.exe'  MSBUILD_PATH: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe'  XUNIT_PATH: 'C:\Tools\xunit.runner.console.2.3.1\xunit.console.exe'  TESTS_OUTPUT_FOLDER_PATH: '.\tests\CiCdExample.Tests\bin\Release\'# Тут указываются стадии сборки. Указывайте любые названия которые вам нравятся, но по умолчанию используют три стадии: build, test и deploy.# Стадии выполняются именно в такой последовательности.stages:  - build  - test# Далее описываются задачи (job-ы)build_job:  stage: build # указание, что задача принадлежит этапу build  # tags: windows # если тут указать тэг, задача будет выполняться только на Runner-е с указанным тэгом   only: # для каких сущностей требуется выполнять задачу    - branches  script: # код шага    - '& "$env:NUGET_PATH" restore'    - '& "$env:MSBUILD_PATH" /p:Configuration=Release /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly' # сборка; ключ clp:ErrorsOnlyоставляет только вывод ошибок; ключ nr:false завершает инстансы msbuild   artifacts: # где по завершении задачи будут результаты, которые надо сохранить в gitlab (т.н. артефакты) и которые можно будет передать другим задачам по цепочке    expire_in: 2 days # сколько хранить артефакты    paths: # список путей, по которым находятся файлы для сохранения      - '$env:TESTS_OUTPUT_FOLDER_PATH'test_job:  stage: test  only:    - branches  script:    - '& "$env:XUNIT_PATH" "$env:TESTS_OUTPUT_FOLDER_PATH\CiCdExample.Tests.dll"'  dependencies: # указание, что для запуска этой задачи требуется успешно завершенная задача build_job    - build_job

И последнее: если нам требуется передавать в скрипт значение параметра, который мы не хотим хранить в самом скрипте (например, пароль для подключения куда-либо), мы можем использовать для этого объявление параметров в gitlab. Для этого зайдите в проекте (или в группе проекта) в Settings > CI/CD и найдите раздел Variables. Прописав в нём параметр с именем (key) SAMPLE_PARAMETER, вы сможете получить его значение в в скрипте .gitlab-ci.yml через обращение $env:SAMPLE_PARAMETER.
Также в этом разделе можно настроить передачу введенных параметров только при сборке защищённых веток (галочка Protected) и/или скрытие значения параметра из логов (галочка Masked).
Подробнее о параметрах окружения сборки смотрите в документации к Gitlab CI.


Активируем режим Developer PowerShell for VS


Скрипт, приведённый выше, уже можно использовать для сборки и вызова тестов. Правда, присутствует НО: крайне неудобно прописывать абсолютные пути к разным установкам Visual Studio. К примеру, если на одной билд-машине стоит Visual Studio 2017 BuildTools, а на другой Visual Studio Professional 2019, то такой скрипт будет работать только для одной из двух машин.


К счастью, с версии Visual Studio 2017 появился способ поиска всех инсталляций Visual Studio на компьютере. Для этого существует утилита vswhere, путь к которой не привязан ни к версии Visual Studio, ни к её редакции. А в Visual Studio 2019 (в версии 16.1 или более новой) есть библиотека, которая умеет трансформировать консоль Powershell в режим Developer Powershell, в котором уже прописаны пути к утилитам из поставки VS.


Как применить


Дописываем переменную к секции Variables:


variables:  VSWHERE_PATH: '%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe'

Затем создаём новую секцию before_msbuild якорем enter_vsdevshell и следующим текстом:


.before_msbuild: &enter_vsdevshell  before_script:    - '$vsWherePath = [System.Environment]::ExpandEnvironmentVariables($env:VSWHERE_PATH)'    - '& $vsWherePath -latest -format value -property installationPath -products Microsoft.VisualStudio.Product.BuildTools | Tee-Object -Variable visualStudioPath'    - 'Join-Path "$visualStudioPath" "\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" | Import-Module'    - 'Enter-VsDevShell -VsInstallPath:"$visualStudioPath" -SkipAutomaticLocation'

И всюду, где нам надо использовать утилиты Visual Studio, добавляем этот якорь. После этого задача сборки начинает выглядеть намного более опрятно:


build_job:  <<: *enter_vsdevshell  stage: build  only:    - branches  script:    - 'msbuild /t:restore /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'    - 'msbuild /p:Configuration=Release /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'  artifacts:    expire_in: 2 days    paths:      - '$env:TESTS_OUTPUT_FOLDER_PATH'

Подробно о том, что написано в .before_msbuild
  1. Утилита vswhere.exe умеет находить и выдавать список найденных инсталляций Visual Studio. Расположен она всегда по одному и тому же пути (этот путь записан в переменной VSWHERE_PATH). Поскольку в переменной фигурирует подстановка %programfiles%, её требуется раскрыть до пути к этой папке. Такое раскрытие проще всего сделать через статический метод .NET System.Environment.ExpandEnvironmentVariables.

Результат: мы имеем путь к vswhere.


  1. Вызовом vswhere получим путь к папке с установленной Visual Studio.
    Все параметры утилиты можно посмотреть, если запустить vswhere.exe с параметром -help, в статье же только перечислю использованные:
    • -latest (искать самые свежие установки),
    • -property installationPath (вывести параметр пути установки),
    • -format value (при печати параметра вывести только значение параметра, без его имени),
    • -products <список искомых инсталляций Visual Studio, пробел считается разделителем элементов списка> (указание искомых редакций Visual Studio). Например, при запуске с параметром -products Microsoft.VisualStudio.Product.Community Microsoft.VisualStudio.Product.BuildTools утилита попробует найти Visual Studio редакций Community или BuildTools. Подробнее об идентификаторах продуктов смотрите по ссылке https://aka.ms/vs/workloads.

Результат: в переменную $visualStudioPath записан путь к Visual Studio или пустая строка, если инсталляций Visual Studio не найдено (обработку этой ситуации мы ещё не добавили).


  1. Команда Import-Module загружает библиотеку Microsoft.VisualStudio.DevShell.dll, в которой прописаны командлеты трансформации консоли Powershell в Developer-консоль. А командлет Join-Path формирует путь к этой библиотеке относительно пути установки Visual Studio.
    На этом шаге нам прилетит ошибка, если библиотека Microsoft.VisualStudio.DevShell.dll отсутствует или путь к установке Visual Studio нужной редакции не был найден Import-Module сообщит, что не может загрузить библиотеку.

Результат: загружен модуль Powershell с командлетом трансформации.


  1. Запускаем передёлку консоли в Developer Powershell. Чтобы корректно прописать пути к утилитам, командлету требуется путь к установленной Visual Studio (параметр -VsInstallPath). А указаниеSkipAutomaticLocation требует от командлета не менять текущее расположение (без этого параметра путь меняется на <домашнаяя папка пользователя>\source\repos.

Результат: мы получили полноценную консоль Developer Powershell с прописанными путями к msbuild и многим другим утилитам, которые можноиспользовать при сборке.


Используем CI для проставления версии во все сборки решения


Раньше мы использовали t4 шаблоны для проставления версий: номер версии собиралась из содержимого файла в формате <major>.<minor>.<revision>, далее к ней добавлялся номер сборки из Gitlab CI и он передавался в tt-шаблон, добавляющий в решение везде, где требуется, номер версии. Однако некоторое время назад был найден более оптимальный способ использование команд git tag и git describe.


Команда git tag устанавливает коммиту метку (тэг). Отметить таким образом можно любой коммит в любой момент времени. В отличие от веток, метка не меняется. То есть если после помеченного коммита вы добавите ещё один, метка останется на помеченном коммите. Если попробуете переписать отмеченный коммит командами git rebase или git commit --amend, метка также продолжит указывать на исходный коммит, а не на изменённый. Подробнее о метках смотрите в git book.


Команда git describe, к сожалению, в русскоязычном gitbook не описана. Но работает она примерно так: ищет ближайшего помеченного родителя текущего коммита. Если такого коммита нет команда возвращает ошибку fatal: No tags can describe '<тут хэш коммита>'. А вот если помеченный коммит нашёлся тогда команда возвращает строку, в которой участвует найденная метка, а также количество коммитов между помеченным и текущим.


На заметку: чтобы данная команда работала корректно во всех случаях, автор gitflow даже чуть-чуть поменял скрипты finish hotfix и finish release. Если кому интересно посмотреть обсуждение с автором gitflow, а также увидеть что изменилось (картинка с актуальной схемой в последнем сообщении в треде).


Кстати, по этой же причине если вы используете gitflow, требуется после вливания feature-ветки в develop требуется удалить влитую локальную ветку, после чего пересоздать её от свежего develop:


Не забывайте пересоздавать ветки от develop
(обратите внимание на историю git в левой части картинки: из-за отсутствия пути из текущего коммита до коммита с меткой 1.0.5, команда git describe выдаст неверный ответ)


Но вернёмся к автопроставлению версии. В нашем репозитории царит gitflow (точнее его rebase-версия), метки расставляются в ветке master и мы не занываем пересоздавать feature-ветки от develop, а также merge-ить master в develop после каждого релиза или хотфикса.


Тогда получить версию для любого коммита и сразу передать её в msbuild можно добавив всего пару строк к задаче сборки:


build_job:  <<: *enter_vsdevshell  stage: build  only:    - branches  script:    - 'msbuild /t:restore /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'    - '$versionGroup = git describe --long | Select-String -Pattern "(?<major>[0-9]+)\.(?<minor>[0-9]*)\.(?<patch>[0-9]*)\-(?<commit>[0-9]+)\-g[0-9a-f]+" | Select-Object -First 1'    - '[int]$major, [int]$minor, [int]$patch, [int]$commit = $versionGroup.Matches[0].Groups["major", "minor", "patch", "commit"].Value'    - '[string]$version = "$major.$minor.$patch.$commit"'    - 'msbuild /p:Configuration=Release /p:AssemblyVersionNumber=$version /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'  artifacts:    expire_in: 2 days    paths:      - '$env:TESTS_OUTPUT_FOLDER_PATH'

Как это работает:


  1. Мы проставляем метки в формате <major>.<minor>.<revision>.
  2. Тогда git describe --long возвращает нам строку, описывающую версию в формате <major>.<minor>.<revision>-<количество новых коммитов>-g<хэш текущего коммита>.
  3. Парсим полученную строку через регулярные выражения, выделяя нужные нам части и записывем части в $versionGroup.
  4. Преобразовываем четыре найденные подстроки в 4 числа и пишем их в переменные $major, $minor, $patch, $commit, после чего собираем из них строку уже в нужном нам формате.
  5. Передаём указанную строку в msbuild чтобы он сам проставил версию файлов при сборке.

Обратите внимание: если вы, согласно gitflow, будете отмечать (тэгировать) ветку master после вливания в неё release или hofix, будьте внимательны: до простановки метки автосборка будет вестись относительно последней существующей ветки. Например, сейчас опубликована версия 3.4, а вы создаёте release-ветку для выпуска версии 3.5. Так вот: всё время существования этой ветки, а также после её вливания в master, но до простановки тэга, автосборка будет проставлять версию 3.4.


Добавляем отправку данных в SonarQube


SonarQube это мощный инструмент контроля качества кода.


SonarQube имеет бесплатную Community-версию, которая способна проводить полный анализ. Правда, только одной ветки. Чтобы настроить её на контроль качества ветки разработки (develop), требуется выполнить следующие шаги (разумеется, помимо установки и развёртывания сервера SonarQube):


  1. Создайте в SonarQube новый проект, после чего запомнить его ключ.


  2. Скачайте SonarScanner for MSBuild (с сайта sonarqube.org)[https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/] мы используем версию .NET Framework 4.6+.


  3. Распакуйте содержимое архива в папку. Например, в C:\Tools\SonarScanner.



На заметку: эту утилиту также можно скачать на сборочную машину через NuGet, но тогда надо будет чуть по-иному указывать её путь.


  1. Зайдите в параметры CI/CD в свойствах проекта в Gitlab следующие параметры:
    • SONARQUBE_PROJECT_KEY ключ проекта,
    • SONARQUBE_AUTH_TOKEN токен авторизации.

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


  1. Допишите переменные к секции Variables:


    variables:SONARSCANNER_MSBUILD_PATH: 'C:\Tools\SonarScanner\SonarScanner.MSBuild.exe'SONARQUBE_HOST_URL: 'url вашего сервера SonarQube'
    

  2. Допишите в задачу тестирования ветки разработки (test_job) команды для запуска анализа кода и уберите зависимость от задачи build_job:


    test_job:stage: testonly:- /^develop$/<<: *enter_vsdevshellscript:- '$versionGroup = git describe --long | Select-String -Pattern "(?<major>[0-9]+)\.(?<minor>[0-9]*)\.(?<patch>[0-9]*)\-(?<commit>[0-9]+)\-g[0-9a-f]+" | Select-Object -First 1'- '[int]$major, [int]$minor, [int]$patch, [int]$commit = $versionGroup.Matches[0].Groups["major", "minor", "patch", "commit"].Value'- '[string]$version = "$major.$minor.$patch.$commit"'- '& "$env:SONARSCANNER_MSBUILD_PATH" begin /key:$env:SONARQUBE_PROJECT_KEY /d:sonar.host.url=$env:SONARQUBE_HOST_URL /d:sonar.login=$env:SONARQUBE_AUTH_TOKEN /d:sonar.gitlab.project_id=$CI_PROJECT_PATH /d:sonar.gitlab.ref_name=develop /v:$version /d:sonar.dotnet.excludeGeneratedCode=true'- 'msbuild /t:rebuild /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'- '& "$env:SONARSCANNER_MSBUILD_PATH" end /d:sonar.login=$env:SONARQUBE_AUTH_TOKEN'- '& "$env:XUNIT_PATH" "$env:TESTS_OUTPUT_FOLDER_PATH\CiCdExample.Tests.dll"'
    


Теперь при каждой сборке ветки develop в SonarQube будет отправляться подробный анализ нашего кода.


На заметку: вообще команда msbuild /t:rebuild полностью пересобирает решение. Вероятно, в большинстве проектов анализ можно было бы встроить прямо в стадию сборки. Но сейчас у нас анализ в отдельной задаче.


Пара слов об использованных параметрах:


  • key ключ проекта на сервере SonarQube,
  • v собираемая версия. ИМХО отлично комбинируется с предыдущим шагом автопроставления версии,
  • sonar.gitlab.project_id ID проекта на сервере Gitlab,
  • sonar.gitlab.ref_name название ветки, которое получает сервер SonarQube при передаче результатов анализа,
  • sonar.dotnet.excludeGeneratedCode не включать в анализ объекты, отмеченные атрибутом System.CodeDom.Compiler.GeneratedCode (чтобы не оценивать качество автосгенерированного кода).

Причёсываем автотесты xUnit + добавляем вычисление покрытия тестами через OpenCover


Со сборкой более-менее разобрались теперь приступаем к тестам. Доработаем код прогона тестов, чтобы он:


  • сам находил библиотеки с тестами,
  • прогонял их пачкой через xUnit,
  • вычислял тестовое покрытие через OpenConver,
  • отправлял результаты покрытия тестами в SonarQube.

На заметку: обычно в паре с OpenCover используют ReportGenerator, но при наличии SonarQube мы с тем же успехом можем смотреть результаты через его интерфейс.


Для настройки выполним следующие шаги:


  1. Скачайте OpenCover в виде zip-файла с сайта github.


  2. Распакуйте содержимое архива в папку. Например, в C:\Tools\OpenCover.



На заметку: эту утилиту также можно скачать на сборочную машину через NuGet, но тогда надо будет чуть по-иному указывать её путь.


  1. Допишите переменные к секции Variables:


    variables:OBJECTS_TO_TEST_REGEX: '^Rt[^\n]*\.(dll|exe)$'OPENCOVER_PATH: 'C:\Tools\opencover-4.7.922\xunit.console.exe'OPENCOVER_FILTER: '+[Rt.*]* -[*UnitTests]* -[*AssemblyInfo]*'OPENCOVER_REPORT_FILE_PATH: '.\cover.xml'
    

  2. Модифицируйте задачу тестирования ветки разработки (test_job), чтобы она включала и команды вызова OpenCover:



test_job:  stage: test  only:    - /^develop$/  <<: *enter_vsdevshell  script:    - '$versionGroup = git describe --long | Select-String -Pattern "(?<major>[0-9]+)\.(?<minor>[0-9]*)\.(?<patch>[0-9]*)\-(?<commit>[0-9]+)\-g[0-9a-f]+" | Select-Object -First 1'    - '[int]$major, [int]$minor, [int]$patch, [int]$commit = $versionGroup.Matches[0].Groups["major", "minor", "patch", "commit"].Value'    - '[string]$version = "$major.$minor.$patch.$commit"'    - '& "$env:SONARSCANNER_MSBUILD_PATH" begin /key:$env:SONARQUBE_PROJECT_KEY /d:sonar.host.url=$env:SONARQUBE_HOST_URL /d:sonar.login=$env:SONARQUBE_AUTH_TOKEN /d:sonar.gitlab.project_id=$CI_PROJECT_PATH /d:sonar.gitlab.ref_name=develop /v:$version /d:sonar.cs.opencover.reportsPaths="$env:OPENCOVER_REPORT_FILE_PATH" /d:sonar.dotnet.excludeGeneratedCode=true'    - 'msbuild /t:rebuild /m:$env:MSBUILD_CONCURRENCY /nr:false /clp:ErrorsOnly'    - '$dllsToRunUnitTesting = @(Get-ChildItem "$env:TESTS_OUTPUT_FOLDER_PATH" -Recurse) | Where-Object {$_.Name -match $env:OBJECTS_TO_TEST_REGEX} | ForEach-Object { """""$_""""" } | Join-String -Separator " "'    - '& "$env:OPENCOVER_PATH" -register -target:"$env:XUNIT_PATH" -targetargs:"$dllsToRunUnitTesting -noshadow" -filter:"$env:OPENCOVER_FILTER" -output:"$env:OPENCOVER_REPORT_FILE_PATH" | Write-Host'    - 'if ($?) {'    - '[xml]$coverXml = Get-Content "$env:OPENCOVER_REPORT_FILE_PATH"'    - '$sequenceCoverage = $coverXml.CoverageSession.Summary.sequenceCoverage'    - '$branchCoverage = $coverXml.CoverageSession.Summary.branchCoverage'    - 'Write-Host "Total Sequence Coverage <!<$sequenceCoverage>!>"'    - 'Write-Host "Total Branch Coverage [![$branchCoverage]!]"'    - '} else {'    - 'Write-Host "One or more tests failed!"'    - 'Throw'    - '}'    - '& "$env:SONARSCANNER_MSBUILD_PATH" end /d:sonar.login=$env:SONARQUBE_AUTH_TOKEN'

Обратите внимание: в begin-команде запуска sonar scanner-а появился дополнительный параметр /d:sonar.cs.opencover.reportsPaths.


  1. (необязательный пункт) Ненадолго возврващаемся в Gitlab, заходим в меню проекта Settings > CI/CD и находим на странице настроек параметр Test coverage parsing. Указываем в нём регулярное выражение, которое позволит Gitlab-у также получать информацию о покрытии тестами приложения:
    • если хочется видеть значение покрытия тестов по строкам кода (его ешё называют Sequence Coverage или Statement Coverage), указываем выражение <!<([^>]+)>!>,
    • если хочется видеть значение покрытия тестов по веткам условных операторов (его называют Decision Coverage или Branch Coverage), указываем выражение \[!\[([^>]+)\]!\].

А теперь комментарии по изменениям в скрипте.


Длинная строка, начинающаяся с объявления переменной $dllsToRunUnitTesting, нужна для того, чтобы найти все библиотеки нашего приложения, которые потом будут участвовать в расчёте тестового покрытия. При этом выбираются они по регулярному выражению, заданному в параметре $env:OBJECTS_TO_TEST_REGEX (мы же не хотим, например, учитывать в покрытии библиотеки .net или сторонних nuget-пакетов). Пути ко всем найденным библиотекам склеиваются в строку с разделителем пробелом и двумя двойными кавычками для каждого параметра. Две двойные кавычки были добавлены потому, что OpenCover при вызове приложения xunit съедает одни из кавычек, а вторые кавычки нужны на случай наличия пробелов в абсолютных путях.


Следующая строка запуск утилиты OpenConver с передачей ей списка библиотек нашего приложения, фильтра, по которому OpenCover исключает из покрытия библиотеки с unit-тестами, а также часть классов, не требующих расчёта покрытия (например, AssemblyInfo). Конвейер и Write-Host были добавлены в порыве вдохновения, так как без него у нас не работал вывод OpenConver-а.


И следующий if проверяет, успешно ли завершился запуск OpenConver. Если не успешно кладём скрипт; если же успешно парсим получившийся xml-файлик с отчётом и печатаем значения покрытия тестами, чтобы затем его легко распарсил gitlab через указанное в настройках регулярное выражение.


Послесловие


Как известно, нет предела совершенству. Мы продолжим добавлять новые функции в используемые нами процессы сборки, тестирования и публикации. На момент написания тестируется переезд нашего ПО на .NET 5 (с ним OpenCover уже не работает, сборка выполняется через команду dotnet), а также мы переходим на другой способ публикации (к сожалению, пока не могу дать более подробный комментарий).


Если у вас появятся вопросы или предложения пишите в комментариях.


И спасибо за прочтение!

Подробнее..

Ценность уместного комментария

01.03.2021 10:14:41 | Автор: admin

У каждого из нас есть задача, над решением которой ты долго и безуспешно бьешься, которую изучил уже и вдоль и поперек, но все равно не можешь получить нужный результат. При этом одни уверены, что твоя задача в принципе не имеет решения, другие - что проблемы вообще нет. Такой задачей для меня была длительность выполнения запросов к хранилищу данных на Greenplum. И как же приятно наконец-то написать, что я эту проблему победил!

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

Из раза в раз при работе с хранилищем на ожидание результата запроса уходило по несколько минут. Причем не важно, запрос выбирает данные из таблицы на десять строк, или на миллион - время на ожидание будет соизмеримым.А любой простой в таком творческом процессе, как аналитика - это просто пытка!

Я много раз заходил на исправление такого поведения. Начал с тюнинга sql клиента. DBeaver предлагает пользователям целую кучу разных тонких настроек - кажется, я перепробовал их все, но успеха не достиг. Следом перепробовал настройки самого драйвера PostgreSQL - эффект тот же.

Все это время перед глазами был пример специализированного клиента для Greenplum - Aginity Workbench, в котором из коробки скорость выполнения аналогичных запросов ощутимо выше. Эта прога была дополнительным раздражающим фактором, так как найти причины такого ускорения у меня не получалось - ее исходный код закрыт и работает она только по лицензии, а подключение к greenplum в ней происходит при помощи нативных инструментов, а не обычных jdbc драйверов.

Озарение пришло, когда заглянул в системную вьюху pg_stat_activity - оказалось, что от клиента к базе в действительности летит не один запрос на данные, а два: сначала происходит выборка данных по запросу, а затем - чтение метаданных для этой выборки из pg_catalog. Причем из общего времени выполнения большую часть занимает именно чтение метаданных.

В этот момент я испытал целую бурю эмоций - от радости, что наконец-то нашел проблему, до недоумения от самой сути находки. То, что каталог прилично нагружен, я знал и раньше: к хранилищу сейчас подключено уже больше 250 систем-источников, в каждом не одна сотня таблиц, а в самих таблицах может быть двухуровневое партиционирование. Greenplum учитывает каждую партицию как отдельный объект, поэтому системные представления вроде pg_class прилично раздуваются. Но неужели действительно нужно обращаться к каталогу при любом запросе данных?

К счастью, драйвер постгреса имеет открытый исходный код, поэтому можно самостоятельно посмотреть, что же происходит под капотом. Заглянул в код, нашел нужный класс PgResultSetMetaData и его метод, который запрашивает метаданные - fetchFieldMetaData. Содержимое обнадеживает - похоже, без метаданных можно обойтись: fetchFieldMetaData вызывается из нескольких других методов, которые для моих целей не так важны, при этом сами эти методы допускают возврат пустого объекта, что намекает на возможность выпилить из кода вообще все обращения к fetchFieldMetaData, а значит избежать медленного запроса к каталогу.

Подробнее про методы:
  • isAutoIncrement. От запроса метаданных в этом методе легче всего отказаться: в нашем хранилище таких полей нет, да и комментарий "It is believed that PostgreSQL does not support this feature" как бы намекает, что и для других баз он не пригодится.

      public boolean isAutoIncrement(int column) throws SQLException {    fetchFieldMetaData();    Field field = getField(column);    FieldMetadata metadata = field.getMetadata();    return metadata != null && metadata.autoIncrement;  }
    
  • isNullable. При отсутствии метаданных в резалтсете все поля будут считаться nullable - не велика потеря.

      public int isNullable(int column) throws SQLException {    fetchFieldMetaData();    Field field = getField(column);    FieldMetadata metadata = field.getMetadata();    return metadata == null ? ResultSetMetaData.columnNullable : metadata.nullable;  }
    
  • getBaseColumnName. В коде драйвера этот метод используется в updatable резалтсетах при обновлении значений. В мои планы не входит использование этого функционала, но на всякий случай можно будет прикрутить выбрасывание исключений при вызове таких методов.

    public String getBaseColumnName(int column) throws SQLException {    Field field = getField(column);    if (field.getTableOid() == 0) {      return "";    }    fetchFieldMetaData();    FieldMetadata metadata = field.getMetadata();    return metadata == null ? "" : metadata.columnName;  }
    
  • getBaseSchemaName и getBaseTableName. Возвращают название схемы/таблицы, в которой находится запрошенный атрибут. В коде драйвера метод нигде не используется, мне эти сведения тоже не особо нужны.

    public String getBaseSchemaName(int column) throws SQLException {    fetchFieldMetaData();    Field field = getField(column);    FieldMetadata metadata = field.getMetadata();    return metadata == null ? "" : metadata.schemaName;  }public String getBaseTableName(int column) throws SQLException {    fetchFieldMetaData();    Field field = getField(column);    FieldMetadata metadata = field.getMetadata();    return metadata == null ? "" : metadata.tableName;  }
    

Проверяю влияние по коду, комментирую вызов метода fetchFieldMetaData, собираю jar файл драйвера, подсоединяюсь с его помощью к базе, иииии

Сказать, что это дало результат - это не сказать ничего. Запросы теперь просто летают. Ускорение - в разы. Отправил коллегам на тест - отзывы примерно такие:

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

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

P.S. В итоговой версии кода создал новый параметр подключения драйвера runtimeMetaDisable. Вызов метаданных и выбрасывание исключений привязал к его значению. Такой подход более гибок, чем жестко закомментированный вызов метода и позволяет управлять поведением драйвера в зависимости от потребностей. Код выложил на гитхаб. Если у вашей базы тяжелый каталог и вы хотите попробовать драйвер в деле, но не знакомы с миром java и не знаете, как собрать jar файл драйвера - напишите в комментариях!

Подробнее..

Год на удаленке глазами одной команды. Как это было, итоги и планы

08.04.2021 12:19:54 | Автор: admin

Привет, меня зовут Сергей Раков, я руководитель B2G-направления в ИТ-кластере Ростелекома. 23 марта 2021 года мы отметили год, как полностью работаем в удаленном режиме. За этот год мы в значительной степени пересмотрели наши процессы и решили ряд нетипичных проблем.

by Radik Zby Radik Z

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

Я знал, что удаленные команды могут успешно решать задачи, но придерживался мнения, что эта команда должна быть расположена в одной локации и так же работать в офисе. Но прошлый 2020 год в корне изменил мое мнение о таком подходе. В начале пандемии я очень переживал, что команда будет испытывать стресс в новых вынужденных условиях, и пострадает продуктивность из-за удлинения коммуникаций. Поэтому я сразу начал предлагать различные решения, которые вернули бы ту атмосферу офиса, в которой мы так долго работали. Решение об использовании того или иного инструмента принималось совместно с командой. А бОльшую часть изменений в наши процессы внесла сама команда.

Как искали место для общения

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

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

В итоге я сделал сервер, в котором нагенерил несколько комнат, где постоянно находились ребята по командам отдельно для питонистов, отдельно для рубистов и т.д. В итоге можно было зайти к ним и обсудить какой-нибудь срочный вопрос почти как в офисе. Бонусом у нас появилось одно место для голосовых коммуникаций внутри команды. Никакой генерации ссылок на каждый созвон не требуется. Если писать долго, то мы просто переходим в Discord в свободный канал и решаем все вопросы. У нас даже есть специальный голосовой канал Курилка в котором можно просто поболтать.

Work(&/or)life balance

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

Для сохранения баланса между работой и личной жизнью кто-то начал жестко следить за временными рамками рабочего дня, а кто-то начал более гибко планировать свой рабочий день. Среди этих ребят был и я. Мы начали применять методику из книги Getting Things Done (Как привести дела в порядок) Дэвида Аллена. Она помогла нам все задачи держать в фокусе, ничего не забывать и меньше тратить время на переключение между ними. Удаленка нам показала, что изменения это хорошо. И я понял, что развития без изменений не бывает. В целом, команда научилась более гибко планировать рабочий день и сейчас бОльшая часть команды не хочет выходить обратно в офис.

Схема Getting Things Done, SkillboxСхема Getting Things Done, Skillbox

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

Промежуточные итоги

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

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

Наконец, удалёнка сближает. Хотя мы не общались в нерабочее время, на работе я старался заводить и поддерживать те разговоры, которые были у нас во время перерывов. Я хотел уйти от той модели, когда совещание это только совещание и сейчас если у нас остается время, то после решения рабочих вопросов мы остаемся и болтаем на свободные темы.

Конечно, во время удаленной работы возникали различные организационные сложности. И в первую очередь с подписанием документов. Мы не стали оснащать всех сотрудников МФУ, т.к. они нужны нам крайне редко в основном, в случае подписания каких-либо документов. Мы же программисты, и у нас бумажный документооборот сведен к минимуму. В общем, все попытались максимально перенести в электронную форму, а для решения остальных вопросов мы просто приезжали в офис, подписывали необходимые бумаги и снова возвращались в удаленный режим работы. Но на удаленке не обошлось без дополнительных затрат. Например, у нас есть отдел тестирования, который занимается проверкой качества ПО для IP-камер. Вот таким тестировщикам пришлось выслать дополнительные комплекты тестового оборудования, а иногда даже установить более продвинутые сетевые маршрутизаторы, которые позволяют настроить доступ в нашу закрытую сеть.

Сейчас ИТ-кластер постепенно переходит на гибридный формат работы, и командам разрешили выбрать наиболее удобный формат работы:
- 3 дня в офисе / 2 дня дома;
- 2 дня в офисе / 3 дня дома;
- 1 день в офисе / 4 дня дома
- полностью на удаленке.

Ответственность за это решение несет руководитель команды главное, чтобы команда работала эффективно, а также была рабочая атмосфера, команда чувствовала себя хорошо, и все это вело к увеличению производительности. Некоторые ребята в нашей команде уже иногда выходят в офис. Кто-то только планирует это сделать. Значительная часть сотрудников планирует остаться на удаленке (последний пульс-опрос показал больше 50%), а в офис приезжать только при необходимости, используя специальные гостевые рабочие места.

Подробнее..

Возглавляя тренды, часть вторая

24.01.2021 14:08:22 | Автор: admin

Всем привет! На связи Павел Красовский, заместитель директора Центра стратегических инноваций в Ростелекоме. О важности собственной методологии для оценки перспективных технологий я писалв предыдущем посте, вкратце нам нужно понимать, по каким именно критериям оценивается важность и актуальность того или иного тренда. Сторонние исследования базируются на непрозрачных методах, поэтому Хочешь сделать хорошо сделай сам.

Методология

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

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

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

Изобретения и патенты.
С патентами вообще всё просто: первым запатентовал что-то стоящее до пенсии обеспечен. И вся информация о патентах публична, т.к. все хотят застолбить поляну.

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

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

А ещё кто-то из китов может взять и купить тот или иной стартап. Или пойти и начать делать свой стартап в этой же отрасли и по такой же теме. Это мы тоже отслеживаем как по профильным ресурсам, так и по новостям и ресурсам для HR. Причем тут HR? Когда крупная компания не покупает стартап, а решает делать свой по нужной теме, она начинает наращивать компетенции, читай нанимать спецов из нужной отрасли. И тут уже имеет смысл оценивать базы вакансий и резюме, совокупность вакансий = спрос на технологию и тренд, совокупность резюме = предложение. Это всё можно собрать, посчитать, посмотреть на пересечения и перегибы и найти причинно-следственные связи. Так работают эти источники много лет, значит, им можно доверять.

Вообще, в идеале бы глубоко изучитьна эту тему социальные сети, но они пока не дают необходимого уровня доступа для сбора подобной информации. Особенно Facebook, после событий с Cambridge Analytica.

Пока, за три года, мы прогнали через систему 4,8млн. научных публикаций, 2,4 млн. патентов, информации об инвестициях на сумму$2,3 трлн, 2 млн. вакансий и 7 млн. резюме, около 1 млн. публикаций в СМИ и столько же поисковых запросов.

Как оцениваем

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

Технологический стек исследования трендов:

Сначала из массива вычленяются наиболее частотные и релевантные данные, которые уже можно начинать считать трендами. По хэштегам научных статей строится подробный список трендов, который расширяется по инвестициям и патентам, там тоже довольно много слов для анализа, в итоге получается порядка 2-3 тысяч трендов. На основе кластерного анализа соединяем вершины, и машина начинает подсказывать, что вот тут и вот там вполне себе возможен тренд. На выходе уже список примерно из 200 штук вместо 3 тысяч.

Эти 200 трендов мы уже отсматриваем вручную и отбрасываем какие-то откровенно общие. Допустим, выдала нам машина интернет или software, такой уровень абстракции нам ни к чему. После просмотра всего списка остаются уже 100-120 трендов.

Процесс выявления трендовПроцесс выявления трендов

Процесс выявления трендов

Да, кстати, о лингвистическом анализе. Всё было бы сильно проще, если бы каждый термин использовался только в своем значении, без синонимов и аббревиатур. Но, как вы знаете, ситуация выглядит иначе. Где-то интернет вещей будет назван интернетом вещей, в других источниках IoT, в патентах sensor network, machine type communication и так далее. В общем, кто во что горазд, поэтому мы адаптируем терминологию под конкретный вид источника: под каждый составляется уникальное именно для него семантическое ядро, и тренд привязывается к определенному лексикону.

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

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

Где всё это можно использовать

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

Например, высокоуровневый список вида Топ-100 чего-нибудь, который топы любят смотреть, чтобы понимать во что инвестировать. Практический смысл у таких рейтингов следующий. Есть у компании некий бюджет который она готова потратить на инновации. И ей нужно определить во что вкладывать. Искусственный интеллект? Блокчейн? Беспилотные автомобили? Или может квантовые компьютеры? Подобные списки помогают сравнивать перспективность разных технологий между собой. Конечно, после построения таких списков необходима их верификация и аналитическая интерпретация, но опираться на них вполне можно.

По итогам 2019 года список Топ-15 трендов выглядит так:

Искусственный интеллект второй год подряд занимает 1-е место в общем рейтинге (за последний год отрыв от мобильных сетей только увеличился). В 2019 году неплохой рост показали облачные технологии, поднявшись с 10-го на 4-е место, и технологии дополненной реальности, поднявшись с 24-го на 14-е место.

По каждой технологии мы готовим такие карточки:

Анализируя полученную информацию можно получить много инсайдов. Например, анализируя данные по искуcственному интеллекту и квантовым технологиям, мы обнаружили интересную закономерность: начиная с 2015 года в научных публикациях появляется термин quantum machine learning (использование квантовых компьютеров для анализа данных с помощью машинного обучения). А в 2019 году каждая 15-я научная статья по квантовым технологиям содержала отсылки к искусственному интеллекту. Это говорит о том, что ученые озабочены проблемой нехватки текущих вычислительных мощностей для дальнейшего развития ИИ и, судя по всему, квантовый компьютер станет решением этой проблемы.

5G за год из инновации превратилась в зрелую технологию, которая оказывает достаточно сильное влияние на другие технологии: в странах с первыми коммерческими сетями 5G увеличилась патентная и инвестиционная активность в сфере VR.

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

Ещё одним открытием для нас стали технологии убеждения (persuasive techniques) смесь из привычных ИТ-сервисов и психологических приемов. В 2019 году было сразу несколько крупных инвестиций и рост вакансий в этой области. Основное применение приложения, посвящённые здоровому образу жизни и образовательные сервисы. Другим применением является использование этих технологий в избирательных кампаниях, яркий пример: небезызвестная Cambridge Analytica в 2018 году. Похоже, что среди технологий двойного назначения прибыло.

Мониторинг трендов отличный инструмент для наблюдения за технологическим развитием стран. Вот как, например, выглядит борьба США и Китая за мировое лидерство, которое последние пять лет планомерно захватывал Китай:

Китай абсолютный мировой лидер по патентам и научным публикациям: каждый второй патент и каждая четвертая научная статья в сфере ИКТ китайские. Лидерство США сохраняется только в области инвестиций.

Отслеживать тренды важно ещё вот почему: вы помните, как быстро на рынок ворвались Apple Watch, став первой в мире маркой по узнаваемости часов чуть ли не за два года, обогнав классические цифровые бренды? Вроде как случилось это довольно быстро и внезапно. На самом деле Apple начала активно патентовать технологии для них за десять лет до выхода первой модели часов.

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

Вот, что мы выявили по итогам 2019 года:

Но вот будем ли мы с вами в скором времени пользоваться благами точной медицины или эластокалорического эффекта вопрос остаётся открытым.

Больше аналитики по итогам Мониторинга трендов цифровизации можно получить из наших ежегодных отчётов, доступных по ссылкездесь.

Про планы

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

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

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

Подробнее..

Промежуточные итоги круглосуточного мониторинга системы ДЭГ

13.09.2020 18:19:09 | Автор: admin
При организации безопасности и контроля соблюдения всех требований, предъявляемых к системе дистанционного электронного голосования, применяется комплексный подход, с учетом наработок и опыта в высоконагруженном сервисе инфраструктуры электронного правительства. Мониторинг и анализ защищенности осуществляется в режиме 24/7 на всех этапах, вплоть до окончания голосования. В частности, для мониторинга информационной безопасности привлечены силы корпоративного центра ГосСОПКА ПАО Ростелеком, которые работают при тесном взаимодействии с профильными организациями и компетентными органами.

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

Также в выгружаемом файле находятся 2 транзакции фиксации выдачи слепой подписи на один userID, одна из которых была обработана контрактом, а вторая проигнорирована как некорректная (отсутствие поля result). В результате была выдана только одна слепая подпись.

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

Система работает в штатном режиме.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru