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

Sportmaster lab

От кровавого энтерпрайза к командной работе

12.11.2020 14:14:33 | Автор: admin

.model tiny
.code
org 100h
start: mov ah,9
mov dx, offset message
int 21h
ret
message: db "Hello Habr!", 00h, 0Ah, '$'
end start

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

Большинство систем мы пишем сами, но в то же время мы иногда используем и коммерческий софт. В целом можно сказать, что мы стараемся работать модно-молодежно: у нас есть автоматизация на Ansible (именно автоматизация, а не деплой), у нас есть CI/CD на Bamboo + Bitbucket. Есть оркестрация на Mesos, от него мы постепенно переходим к Kubernetes.

Есть и заявки - это не только взаимодействие с другими отделами, но и взаимодействие разработки-эксплуатации. Поэтому мы смотрим в сторону GitOps.

Наши проблемы

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

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

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

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

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

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

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

DevOps ожидание vs. реальность

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

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

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

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

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

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

Инструменты и социальность

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

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

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

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

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

Гибкость. Нужна во всем, DevOps не может быть гибким только с одной стороны. Если так работают только инженеры/команды, а бухгалтерия не может, то получится, что команды будут ждать новых серверов долгое время. И таких историй множество.

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

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

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

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

Выводы

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

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

Подробнее..

Unit-тесты в СУБД как мы делаем это в Спортмастере, часть третья

29.04.2021 16:13:12 | Автор: admin

Привет, привет!

Пару лет назад было решено поделиться историей про автоматизированное тестирование СУБД и наш опыт применения в Спортмастере. С результатами можно ознакомиться здесь и здесь.

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

Спойлер

Краткое описание предыдущих частей

Есть система лояльности Спортмастера:

  • огромная, сложная и высоконагруженная система 24/7

  • важный функционал для бизнеса

  • активно развивается

  • есть сложные вычислительные алгоритмы

  • много потребителей

  • система преимущественно содержит серверную логику на Oracle

Хотелось повысить качество выпускаемого продукта и сократить время на тестирование, поэтому внедрили систему автоматизированного тестирования на PL/SQL:

  • ядро системы это open source библиотека utPLSQL v 2.3 от Стивена Фейерштейна

  • вокруг utPLSQL развёрнуты самописные модули, которые облегчают работу с автотестами:

    • модуль запуска автотестов

    • модуль генерации тестовых данных

    • модуль управления метаданными

    • модуль отчётности

    • и т.д.

  • сформирован каталог автотестов с определением ключевых настроек

  • автоматизированы запуск автотестов, отчётность и накат изменений

А что же сейчас?

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

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

  1. Количество автотестов: 2400

  2. Время работы полного запуска: 40 секунд

  3. Показатель Code Coverage: 55%

Скорость работы

Одним из ключевых параметров системы автоматизированного тестирования является время работы автотестов. В каких-то системах всегда запускаются все тесты, а в каких-то выделяется определённая группа тестов и принимается решение, что такого запуска достаточно для уверенности в работоспособности. Но так или иначе со скоростью работы сталкиваются все, а уж всем автоматизаторам веба и тем более древних приложений я совсем не завидую (отдельный привет TestComplete!).

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

Изначально, наши автотесты работали порядка 30 минут. Небольшое погружение в сторону параллельного запуска позволило сократить общее время работы до 5 минут, но и на этом мы не остановились. Для достижения текущего эталонного результата в 40 секунд было сделано:

  • Разбиение всех автотестов на логические функциональные блоки

  • Обеспечение изолированности тестовых данных под каждый функциональный блок автотестов

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

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

  • Запуск каждого функционального блока в отдельном потоке

  • Формирование сводной отчётности по полному запуску автотестов

Code Coverage

Я всегда с большой улыбкой относился к метрикам покрытия кода, потому что они, конечно, что-то говорят про вашу систему и автотесты, но вот что именно не очень понятно. При этом идеал в 100%-ное покрытие практически недостижим. А даже если и достижим, то никак не гарантирует, что в системе ошибок нет.

А при тестировании серверной части всё становится ещё более непонятно. Ведь работа системы зависит от данных в таблицах. Есть sql-запросы, которые в принципе не поддаются анализу по покрытию. И разве хоть какая-то метрика может дать адекватную оценку состоянию автотестов?

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

Это оказалось совсем несложным:

  • перед запуском автотестов вызвать: dbms_plsql_code_coverage.start_coverage

  • выключить функционал по окончанию всех работ: dbms_plsql_code_coverage.stop_coverage

  • написать запрос, который считает покрытие

А мы, получив приятную цифру в 50% покрытие, пошли заниматься более интересными вещами.

Автоматическая генерация кода

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

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

Автоматически сгенерённый код должен содержать:

  1. Инициализацию всех входных и выходных переменных простых типов

  2. Инициализацию всех входных и выходных коллекций

  3. Процедуры для сравнения двух коллекций одного типа

  4. Вызов тестируемого метода

  5. Базовые проверки выходных значений

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

utPLSQL v3

В качестве базиса системы автоматизированного тестирования используется utPLSQL v2, в то время как уже очень давно вышла 3-я версия фреймворка и именно она продолжает активно развиваться. Стоит отметить, что utPLSQL v3 - это фундаментальная переработка старого решения с реализацией нового и классного функционала.

Так почему же у нас в проекте используется более старая версия фреймворка? К сожалению, utPLSQL v 3 не поддерживает несколько важных для нас фич. Что-то разработчикам кажется концептуально неправильным, до чего-то не доходят руки. Все проблемы решаемы, благо что код библиотеки так и остался открытым и может быть самостоятельно изменён. Соответствующая задача в техническом долге заведена, но она не является наиболее приоритетной в нашей дорожной карте развития автотестов.

Заключение

На проекте лояльности Спортмастера уже несколько лет успешно работает система автоматизированного тестирования на PL/SQL. Основные показатели системы и некоторые технические решения освещены в данной статье. Но мы не останавливаемся в развитии и помимо планового расширения покрытия постоянно находим новые вызовы.

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

Всем добра!

Подробнее..

Frontend в Sportmaster Lab

04.12.2020 16:09:39 | Автор: admin
Всем привет! Меня зовут Сергей, я руководитель направления фронтенд-разработки. Во времена, когда профильные офлайн конференции были чем-то обыденным, у нас были бейджики: название компании Спортмастер, имя и фамилия. Если к нам подходили коллеги из других компаний, то при взгляде на эти бейджики они удивлялись: ведь Спортмастер это магазины, продающий спортивный инвентарь, причем тут IT?

Немногие знают, что Спортмастер объединяет целую группу компаний, в которую входят Ostin, FunDay и другие. За поддержание работы всей этой машины отвечает подразделение SMLab, где трудится почти полторы тысячи человек. Из них где-то 400 это разработчики и 25-30 фронтендеры. Все остальные занимаются ИТ-поддержкой производства, логистики, финансов, и сюда же входят департаменты веб-разработки, обеспечения качества и многие другие.

Все наши разработчики занимаются примерно тем же самым, чем и коллеги в других больших компаниях: разработкой новых и поддержкой старых систем. У нас очень большой стек технологий, а также большой скоуп приложений, которые мы поддерживаем и разрабатываем. На наших плечах лежит разработка и поддержка таких сайтов: Спортмастер, Ostin, FunDay, Columbia, Fila, Demix, UrbanVibes. Ко всему этому у нас большой плацдарм внутренней автоматизации. В общем, для разработчиков есть где развернутся, на прокачке своих навыков.

Внутренняя кухня

image

Как я уже говорил разработчиков в нашем подразделении около 400 человек, чтобы эффективно управлять таким большим подразделением, два года назад в компании запустили процесс трансформации. Сейчас мы работаем по Agile, в настоящее время у нас около 30 продуктовых команд, а ожидается до 100, которые разрабатывают и сопровождают свои проекты. В каждой команде представлены разнообразные компетенции: бизнес, аналитики, разработчики, тестировщики, автоматизаторы, методологи. Мы создали специальный портал, на котором отслеживаем метрики команд, а методологи, в свою очередь, помогают командам настраивать потоки. Как только команда становится достаточно самостоятельной, то методологи переключаются на помощь другим командам.

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

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

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

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

Весь e-commerce в Спортмастере делится на две большие группы:
Первая группа это сайты-гиганты: такие как Спортмастер и Остин, а вторая это группа не менее важных сайтов, но с гораздо меньшими нагрузками такие как FunDay и группа сайтов монобрендов.

Ostin стал самым первым гигантом, который был полностью написан на новых технологиях NodeJS, Vue, SSR, Kotlin и т.д. и вышел в продакшн. Текущая версия сайта Спортмастер была написана приблизительно 4 года назад. Сейчас идет разработка новой версии 3.0 на новых технологиях с новым дизайном, и скоро она заменить старый. Аналогичная ситуация и с сайтом Funday из второй группы, в настоящее время идет активная разработка сайта используя новый стек, вскоре увидим новый сайт.

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

Сайты монобрендов

image

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

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

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

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

Благодаря этому мы минимизировали размер ответа и существенно стандартизировали API, что позволяет команде легче ориентироваться в процессе и в хорде работами над новым функционалом мы очень быстро договариваемся о контракте.

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

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

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

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

Категории

Последние комментарии

  • Имя: Макс
    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