Как стать автором
Обновить
222.9
Рейтинг
Skyeng
Крутой edtech с удаленкой для айтишников
Сначала показывать

Функциональные тесты на проекте: жизнь до и после на примерах

Блог компании Skyeng Тестирование IT-систем *PHP *Программирование *Тестирование веб-сервисов *

Наша команда отвечает в Skyeng за личный кабинет и CJM пользователя до оплаты. Изначально проект был написан на Symfony 4.4 и представлял собой набор слабо связанных компонентов, которые были ответственны за правила работы для фронтенда.

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

У нас были лишь юнит-тесты: каждый покрывал логику одного класса. Все тесты вместе давали покрытие основной логики кода и гарантию, что все работает правильно. Но 100% покрытие кода тесты не обеспечивали. И сейчас не обеспечивают.

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

И мы обратились к функциональным.

Читать далее
Всего голосов 12: ↑12 и ↓0 +12
Просмотры 1.5K
Комментарии 1

Новости

Как автоматически уйти в отпуск, уволиться и снова приняться на работу

Блог компании Skyeng Управление проектами *Управление персоналом *Удалённая работа


«Бюрократия» — про обычные кадровые процессы. Мы в Skyeng всегда работали удалённо с основания. С ростом встала задача удобного поддержания HR-процессов, так как в ручном режиме поддерживать их стало невозможно: сотрудникам было неудобно и непонятно, а HR валился от количества заявок.

Что сделали:

  • Продукт, где находятся все базовые запросы сотрудников. По нажатию пары кнопок можно получить все нужные справки, доступы, отметить отпуск, отгул или вообще оформить увольнение. То есть не надо ни с кем разговаривать. Каждое действие запускает набор скриптов, который создаёт все нужные задачи в Джире или автоматически оформляет все нужные документы.
  • Сами наборы скриптов. У любой заявки есть процесс, который мы продумали и автоматизировали, то есть не надо ничего придумывать. Например, при смене роли пользователя (переходе на другую должность) собираются и добавляются-отзываются все доступы и ставятся все нужные задачи.
  • SLA на каждое действие. Как только есть описанный процесс — можно назначать ответственных и сроки. Теперь, если вам нужна какая-то бумажка от кадров, не вы заходите и спрашиваете, готово ли, а уже кадры должны уложиться в свои SLA, и у каждого шага есть ответственный.
  • Бота, который в первые дни работы «ведёт» сотрудника.
  • Автоматизацию микромоментов. Например, за день до ухода в отпуск в слаке проставляется соответствующий статус плюс у сотрудника становится видно в профиле, кто за него работает и по каким вопросам.

Знаете что? Получилось удобно!
Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Просмотры 5.4K
Комментарии 14

Три кризиса подряд с 24 февраля: блокировки видео, баны русских аккаунтов и опенсорс-зловреды

Блог компании Skyeng Управление разработкой *Управление проектами *Видеоконференцсвязь

Период скачка проблем с видео

26 февраля у нас начались серьёзные проблемы с видеосвязью. Роскомнадзор начал замедлять трафик для Facebook (запрещённой в России организации). Если вы помните, как они блокировали Телеграм, когда из нормально работающих сервисов остался только он, то вот получилось примерно то же самое. Конкретно, как мы предполагаем, они закрывали целые подсети, и наши Янус-сервера для видео тоже попали под эти баны. Также, похоже, применялась какая-то маска по пакетам, потому что в Хроме видео отвалилось почти сразу, а вот в Firefox ещё работало. Проблемы были у всего WebRTC-сообщества.

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

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

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

Пришлось заняться большой уборкой, заменой вендоров и вообще масштабно рассмотреть все возможные риски.
Читать дальше →
Всего голосов 41: ↑40 и ↓1 +39
Просмотры 10K
Комментарии 15

Зачем использовать materialize и dematerialize операторы и что такое Notification в RxJS?

Блог компании Skyeng Разработка веб-сайтов *JavaScript *Angular *

Вы когда-нибудь встречали такие операторы, как materialize и dematerialize в RxJS? А что насчет класса Notification? Вероятно, многие слышали, но не до конца представляли, где их можно применить на практике.

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

Materialize

Для начала вспомним, какие типы значений может эмитить объект типа Observable: это next, error и complete. Если вы не помните, что это значит, здесь можно почитать.
Соответственно и про observer, набор коллбэков (onNext, onError, onComplete), тоже советую вспомнить.

Вот что говорится в документации о materialize операторе: «A function that returns an Observable that emits Notification objects that wrap the original emissions from the source Observable with metadata».

Читать далее
Всего голосов 18: ↑18 и ↓0 +18
Просмотры 2.1K
Комментарии 7

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

Блог компании Skyeng Data Mining *Машинное обучение *Управление проектами *

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

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

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

  1. Собрал по данным методологических исследований карту навыков английского языка, разбитую на сотни отдельных веток, связанных друг с другом, как в хорошей RPG.
  2. Отскринил несколько реальных учеников по этой карте и придумал, как с её помощью вычислить образовательный прогресс.
  3. Наложил карту навыков на контент, чтобы каждое упражнение автоматически учитывалось в оценке прогресса (о, это было долго и сложно).
  4. Провалидировал на тысячах внутренних тестов, не зависящих от системы оценки прогресса.
  5. Заложил адаптацию для учеников разных языковых групп, поскольку родной язык ученика даёт ему какие-то навыки сразу, а какие-то делает очень сложными.
  6. Семь раз усложнил, а после существенно упростил систему.

В итоге каждый урок моя система скорит каждому ученику баллы опыта в разные ветки навыков.
Читать дальше →
Всего голосов 40: ↑38 и ↓2 +36
Просмотры 5.4K
Комментарии 29

Матчинг преподавателей и учеников с помощью ML

Блог компании Skyeng Машинное обучение *

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

Читать далее
Всего голосов 6: ↑6 и ↓0 +6
Просмотры 1.3K
Комментарии 7

Архитектура на «микросервисах» в монолите: проект из практики

Блог компании Конференции Олега Бунина (Онтико) Блог компании Skyeng PHP *Node.JS *Микросервисы *

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

На старте было просто: связаться с нами можно было только через почту. Входящим ящиком был IMAP, исходящим — SaaS сервис по отправке почты, забрать письма с которого было то еще приключение. Мы смотрели на заголовки и соединяли письма в цепочки, как в любом почтовике: Gmail, Outlook. В таком виде передавали операторам. 

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

Так появился проект линковка.

Читать далее
Всего голосов 23: ↑23 и ↓0 +23
Просмотры 8K
Комментарии 2

Погружаемся в работу со скроллом в Jetpack Compose

Блог компании Skyeng Разработка мобильных приложений *Разработка под Android *

В этой статье я хочу поделиться опытом работы со скроллом в приложении, написанном на Jetpack Compose.

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

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

Читать далее
Всего голосов 12: ↑12 и ↓0 +12
Просмотры 2.5K
Комментарии 1

Создать динамический компонент теперь проще: изменения в Angular 13

Блог компании Skyeng Разработка веб-сайтов *Angular *

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

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

Читать далее
Всего голосов 17: ↑17 и ↓0 +17
Просмотры 3.3K
Комментарии 6

Как UIView мешал слоям анимироваться

Блог компании Skyeng Разработка под iOS *Разработка мобильных приложений *Интерфейсы *Дизайн мобильных приложений *

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

Заодно разберемся с таким понятием, как неявные анимации.

Читать далее
Всего голосов 13: ↑12 и ↓1 +11
Просмотры 3.2K
Комментарии 2

Что смотрели и читали по PHP в 2021: список от сообщества

Блог компании Skyeng PHP *Управление сообществом *Исследования и прогнозы в IT

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

Как собирались мнения

Ссылку на опрос помогли распространить городские чаты и админы крупных PHP-каналов, деврелы компаний, где в стеке есть PHP, конференция PHP Russia, сайт phpcommunity.ru. Вот полный список классных ребят и компаний, которые помогли исследованию сбыться.

Еще пара полезных ссылок на старте.

- Подробнее про результаты опроса за 2021 и сравнение с 2020.

- А здесь 80+ видео и статей за 2020 — в подборке, подготовленной @spasibo_kep

Поехали.

Читать далее
Всего голосов 41: ↑39 и ↓2 +37
Просмотры 9.2K
Комментарии 0

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

Блог компании Skyeng Тестирование веб-сервисов *Видеоконференцсвязь

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

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

Мы учим не только английскому, но и математике, и другим предметам. Вдруг выяснилось, что для ряда занятий нужно собирать больше 10 человек, и при этом нужно иметь возможность разговаривать с каждым. Понятно, что учителю можно дать толстый канал в 1 Мбит/с, а ученикам — каналы потоньше: в 144p или 240p, например, но всё равно квадратичный рост трафика выглядел угрожающе.

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

Вы же тоже хотите посмотреть, как быстро он упадёт, да?
Читать дальше →
Всего голосов 23: ↑21 и ↓2 +19
Просмотры 4.4K
Комментарии 7

Force Update — механизм принудительного обновления мобильных приложений

Блог компании Skyeng Разработка под iOS *Разработка мобильных приложений *Разработка под Android *

Абсолютное большинство мобильных приложений имеет интересный нюанс – «хвост» старых версий, которыми все еще продолжают пользоваться. В этой статье мы посмотрим, какие проблемы это приносит и как с этим бороться. Материал будет полезен и мобильным разработчикам, и тем, кто каким-либо образом связан с разработкой мобильных приложений, к примеру, разрабатывает backend сервисы, которые используются в приложениях.

Читать далее
Всего голосов 17: ↑14 и ↓3 +11
Просмотры 5.1K
Комментарии 13

Как мы теперь реагируем на аварии на проде (и пара примеров)

Блог компании Skyeng Управление проектами *Управление продуктом *

Когда отлетает сертификат.

16:45: выкатываем изменение на один из проектов, добавился новый компонент. Автотесты видят нормальные 200-е ответы страниц, компонент проверяется вручную на страницах сайта.
17:41: QA сообщают, что часть автотестов главной страницы не отработана. На главной какой-то другой контент, а не главная.
17:42: аварийный слак-бот Валентин маршрутизирует инцидент, определяет команду, которая релизила новое обновление, создаёт конференц-кол и вызванивает каждого.
17:47: команда принимает решение откатывать релиз, на главной показывается одна из внутренних страниц.
18:16: у команды недостаточно прав на запуск отката, призывается команда С0.
18:22: запуск отката.
18:35: успешный откат.

Постмортем: с 16:45 до 18:35 пользователи видели не главную страницу, а одну из внутренних. Визуально разница между ними не очень большая, но на новой главной можно было только записаться на первый бесплатный урок, никакого дополнительного контента нет. Статистическая разница в динамике заявок говорит, что потери небольшие, примерно 20 тысяч рублей. Корневая причина: через ревью и первичное тестирование прошло изменение, которое заменяет главную:


В модуле был импортирован модуль FreeLessonModule. А внутри FreeLessonModule прописываются роуты:


Прошёл импорт модуля вне описания корневых роутов, что привело к дописыванию нового правила роута, которое подменило главную. Избежать этого можно, не импортируя модули из shared-папки. Рассказали на ретро командам, как и что делать.
Читать дальше →
Всего голосов 30: ↑30 и ↓0 +30
Просмотры 5.1K
Комментарии 12

Async/await для существующих iOS-приложений

Блог компании Skyeng Разработка под iOS *Разработка мобильных приложений *


Ранее я писал статью о работе оффлайн с веб-контентом. С того времени команда Apple выпустила Xcode 13.2 и Swift 5.5. Прочитав книгу о современной модели многопоточности в Swift, я понял, что это лучшее время для обновления моих примеров с async/await!
Перед прочтением моей статьи очень рекомендую прочитать материал о многопоточности в Swift Language Guide.
Читать дальше →
Всего голосов 8: ↑8 и ↓0 +8
Просмотры 2.9K
Комментарии 2

Вертел я ваши UIView

Блог компании Skyeng Разработка под iOS *Разработка мобильных приложений *Интерфейсы *Дизайн мобильных приложений *

Эта статья является логическим продолжением UIKit ты вообще про UI?
Если вы ее пропустили, рекомендую сначала ознакомиться с ней. На всякий случай напоминаю, что весь графический интерфейс – это ответственность слоев (не вью!).

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

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

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

Читать далее
Всего голосов 17: ↑17 и ↓0 +17
Просмотры 5.5K
Комментарии 5

QA и Support: как не усложнять друг другу жизнь

Блог компании Skyeng Тестирование IT-систем *Тестирование веб-сервисов *Тестирование мобильных приложений *Service Desk *

Привет. Меня зовут Маша, я — тестировщик в команде мобильной платформы. Когда-то для нас была актуальна проблема взаимодействия QA и Support. Сложностей было предостаточно, как и неприятных последствий. Но со временем мы успешно разобрались во всем. Хочу поделиться нашим опытом и рассказать, какие изменения сработали во благо.

Читать далее
Всего голосов 13: ↑12 и ↓1 +11
Просмотры 4.3K
Комментарии 6

CSS и XPath для QA: чтобы разобраться с локаторами, нужно всего лишь…

Блог компании Skyeng Тестирование IT-систем *CSS *Тестирование веб-сервисов *

Привет! Часть моей работы — обучать коллег, ручных тестировщиков, ремеслу автоматизации. И тема с поиском локаторов, по моему опыту, самая тяжкая для изучения. Здесь куча нюансов, которые надо учитывать. Но стоит разобраться, и локаторы начинают бросаться в глаза сами. Хороший автоматизатор должен идеально уметь находить читабельные и краткие локаторы на странице. Об этом и пойдет речь ниже.

Наливаем чай-кофе и погнали!

Читать далее
Всего голосов 25: ↑25 и ↓0 +25
Просмотры 20K
Комментарии 28

UIKit ты вообще про UI?

Блог компании Skyeng Разработка под iOS *Разработка мобильных приложений *
✏️ Технотекст 2021

Спойлер - нет! Ну, не совсем. Мы привыкли воспринимать UI как визуальную составляющую, но ведь UI – это User Interface. Так вот, интерфейс – это то, с помощью чего пользователь взаимодействует с нашим приложением. В случае с графическим интерфейсом пользователь его видел и воспринимает информацию. Однако он статичный и, когда пользователь хочет взаимодействовать с ним, он использует другие интерфейсы: тачскрин, клавиатуру или мышку. Да, это тоже интерфейсы. И UIKit как раз таки отвечает не за графический интерфейс, а за распознавание пользовательских жестов и их обработку.

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

Так как же он устроен? У нас же есть базовый класс UIView и куча его стандартных наследников. Мы можем сами создавать свои вью и как угодно их кастомизировать. И все это видим на экране. Почему тогда UIKit и UIView – это не про графический интерфейс? Давайте разбираться.

Читать далее
Всего голосов 28: ↑28 и ↓0 +28
Просмотры 13K
Комментарии 16

Автодока здоровой инфраструктуры: сравниваем 3 инструмента

Блог компании Skyeng IT-инфраструктура *Управление проектами *Управление продуктом *Подготовка технической документации *

Эпопея с автодокументацией началась у нас неспроста: 300 разработчиков, 500 репозиториев и 400 сервисов — все живет на 600 хостах и использует 600 баз данных. Изменения происходят настолько часто, что ручной поиск данных в наших масштабах — та еще морока. При этом раньше никакого общего хранилища с актуальной информацией о владельцах проектов, о конфигурациях хостов и связанных с проектами сервисах не было. Расскажу, как мы вконец устали от квестов, перешли на сторону автодоки и почему выбрали в помощь Insight.

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

В 2018 году, когда я только пришла в компанию в роли девопса, мне дали для погружения в процессы простую задачу: допилить скрипт локального разворачивания проектов, чтобы он корректно работал под macOS. То есть скрипт уже был, он успешно работал для Linux-окружения. Его нужно было просто адаптировать, подправить пару регулярок, настроить сеть, дописать инструкцию — совсем не сложно. Я довольно быстро сделала правку в самом инструменте, и казалось, что нет никаких проблем. Но дальше 15-минутная на первый взгляд задача растянулась на 3 месяца.

Читать далее
Всего голосов 20: ↑19 и ↓1 +18
Просмотры 2.8K
Комментарии 1

Информация

Дата основания
Местоположение
Россия
Сайт
www.skyeng.team
Численность
1 001–5 000 человек
Дата регистрации
Представитель
Alisa Kruglova