Behavior Driven Development - подход к разработке ПО, основывающийся на ориентации на business value и исполняемых спецификациях, написанных на человеческом языке
Behavior Driven Development - подход к разработке ПО, основывающийся на ориентации на business value и исполняемых спецификациях, написанных на человеческом языке
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
В докладе рассказывается об опыте применения «инверсия управления» (Inversion of Control) при разработке новой версии KES. Этот подход заключается в том, что более высокоуровневый код не зависит напрямую от конкретной реализации нижележащего слоя. Вместо этого он зависит от абстрактного протокола (интерфейса), конкретный же компонент подставляется конфигурационным кодом-клиентом. Эта практика позволяет понизить loose coupling программных модулей и применяется практически в любых крупных проектах.
При разработке новой версии KES было принято решение изменить подход к реализации инверсии управления. Было решено отказаться от централизованного обобщенного реестра доступных компонентов (шаблон (паттерн) Service Locator) в пользу явной передачи зависимостей конфигуратором (ручная инъекция зависимостей (manual Dependency Injection)). При это возникли проблемы с использованием готовых библиотек Dependency Injection Frameworks. Применение подобных библиотек стало стандартом в мире разработки Java/C# за последние 10-15 лет, но в мире C++ они пока не получили подобного распространения. В докладе делается обзор и сравнение актуальных DI-Framework’ов на C++, анализируется их применимость к практическим задачам ЛК. Анализируется, что могут привнести стандарты C++11/14 для упрощения решения таких задач.
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
The 2nd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
Потратив множество человеко-часов над разработкой автотестов для нескольких огромных проектов, я с полной уверенностью могу сообщить, что составил может быть далеко не полный, но уж точно достаточно крупный набор практик, с которыми хочется поделиться с каждым
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
В докладе рассказывается об опыте применения «инверсия управления» (Inversion of Control) при разработке новой версии KES. Этот подход заключается в том, что более высокоуровневый код не зависит напрямую от конкретной реализации нижележащего слоя. Вместо этого он зависит от абстрактного протокола (интерфейса), конкретный же компонент подставляется конфигурационным кодом-клиентом. Эта практика позволяет понизить loose coupling программных модулей и применяется практически в любых крупных проектах.
При разработке новой версии KES было принято решение изменить подход к реализации инверсии управления. Было решено отказаться от централизованного обобщенного реестра доступных компонентов (шаблон (паттерн) Service Locator) в пользу явной передачи зависимостей конфигуратором (ручная инъекция зависимостей (manual Dependency Injection)). При это возникли проблемы с использованием готовых библиотек Dependency Injection Frameworks. Применение подобных библиотек стало стандартом в мире разработки Java/C# за последние 10-15 лет, но в мире C++ они пока не получили подобного распространения. В докладе делается обзор и сравнение актуальных DI-Framework’ов на C++, анализируется их применимость к практическим задачам ЛК. Анализируется, что могут привнести стандарты C++11/14 для упрощения решения таких задач.
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
The 2nd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
Потратив множество человеко-часов над разработкой автотестов для нескольких огромных проектов, я с полной уверенностью могу сообщить, что составил может быть далеко не полный, но уж точно достаточно крупный набор практик, с которыми хочется поделиться с каждым
Все разработчики автоматизированных тестов рано или поздно сталкиваются с проблемой - "то, что есть в тулзе, которую я юзаю, явно не достаточно и надо что-то делать".
Мы поговорим с чего начать и чем продолжить, так чтоб получить действительно хорошее решение для автоматизированного тестирования. Обсудим интеграцию с continues integration и реализации систем репортинга. За опорный пример возьму фреймворк на базе Selenium.
Алексей Ильенко "In real-time with Apache Kafka"Fwdays
- will talk about Apache Kafka;
- will learn how to not fear Apache Kafka, as a fire;
- will show how it can unfold in three clicks and use in production;
- how to build a Lua query logging system and what PHP is here for.
Codeception + Docker + Robo и что из этого вышлоCOMAQA.BY
Параллелизация тестов, а именно: лучший пхп тулл для автоматизации (Codeception); основы Docker контейнирезации; robo - что это и зачем он нам нужен; profit
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
«JSSDK: Начало» Когда использовать готовые решения, а когда писать самим. Какие шаги нужно сделать, чтобы ваша работа не оказалась напрасной и принесла пользу окружающим. Все эти нюансы будут рассмотрены на примере внутреннего фреймворка, который возник вследствие необходимости объединения кодовой базы двух проектов.
Видеозапись:
http://getdev.net/Event/dependency-injection
Рассказ о внедрении зависимостей (Dependency Injection), зачем оно нужно, откуда оно пошло и развивалось. Виды Dependency Injection, разница между ними и рекомендации к применению. Расказ про декораторы (decorators). Рассказ про абстрактные фабрики. Рассказ про управление временем жизни. Рассказ про IoC -контейнеры вообще и Castle Windsor в частности.
В докладе будет:
- что такое F.I.R.S.T
- организация кода приложения для повышения его тестируемости, поддерживаемости и производительности
- какой тест-фреймворк выбрать для решения какой задачи?
- какие виды тестирования бывают и за какие из них отвечают разработчики?
- как тратить больше времени на код, а не на тесты
- как и какие метрики тестирования собирать
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
Доклад - https://www.youtube.com/watch?v=lJsqRwULRVA
Какие проблемы решаем?
быстрый вход нового разработчика в проект
стандартизация настроек разработчиков
переключение между проектами - разные версии ПО и библиотек (mysql 5.6/5.7, node 0.12/7.2)
приучаем разработчиков к сетевому взаимодействию компонентов
Microservice - масштабирование/разделения разработки
Делим ресурсы staging среды между проектами
Ігор Карпиленко — PHPStorm for drupal developerLEDC 2016
Розгляд та аналіз інфструментів PHPStorm для drupal розробника: QA tools, Xdebug, Issue Tracking System, Drush, інструменти для роботи з Vagrant, Docker і базами даних. Корисні плагіни.
Alexander Shkurko, Technical Advisor at Atwix talks on
‘Disaster Recovery Plan for E-commerce Solutions based on Magento’ Magento Meetup Online on November 17th.
Alex listed the basic steps that should be taken into account by agencies, business owners, and developers to minimize risks and transform the lose-lose situation into a win-win for businesses and clients.
✔ Magecom: https://magecom.net/
✔ Facebook: https://www.facebook.com/magecomcompany/
✔ LinkedIn: https://www.linkedin.com/company/mage...
✔ Instagram: https://www.instagram.com/magecomcomp...
✔ Twitter: https://twitter.com/magecomcompany/
The document summarizes Anastasiia Bondar's presentation on Hyvä themes for Magento. It discusses performance metrics for Magento Luma and Hyvä product pages, frontend technologies like Tailwind and Alpine.js used in Hyvä themes, and options for building themes. It also covers the Hyvä React checkout, Magewire checkout, compatibility with extensions, and upcoming releases, partnerships, and support resources.
Opukhlyi Vladyslav, Backend Tech Lead at Magecom talks on "How to Rescue your Magento 2 Project" Magento Meetup Online on November 17th.
Vladyslav explained how to find critical mistakes in projects, fix them, and make the client and the team happy.
✔ Magecom: https://magecom.net/
✔ Facebook: https://www.facebook.com/magecomcompany/
✔ LinkedIn: https://www.linkedin.com/company/mage...
✔ Instagram: https://www.instagram.com/magecomcomp...
✔ Twitter: https://twitter.com/magecomcompany/
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...Magecom UK Limited
Сергей Незбрицкий, CTO в Magecom, 11 ноября выступил на Magento Meetup Online #11 с темой «Google Page Insights и Magento 2».
В своем докладе Сергей перечисляет основные проблемы, связанные с Magento 2 Frontend performance. А также он перечислил требования к Google Pagespeed Insights, чтобы сделать Magento 2 френдли.
---
Sergey Nezbritskiy, CTO at Magecom, talks on “Google Page Insights and Magento 2” Magento Meetup Kharkiv Online on November 11th.
Sergey lists the main issues related to Magento 2 Frontend performance in his talk. He also listed the requirements for Google Pagespeed Insights to make Magento 2 friendly.
Magecom: https://magecom.net/careers/
Facebook: https://www.facebook.com/magecomcompany
Instagram: https://www.instagram.com/magecomcompany/
The document discusses using Node.js microservices with Magento. Specifically, it discusses:
- Using Node.js to create microservices for Magento like NodeJento for the ORM and services for Laravel, Python, etc.
- Some benefits of using Node.js microservices include non-blocking I/O, single threading, and reusing the same tech stack on front-end and back-end.
- It provides an example of initializing a Node.js/Express app with NodeJento to query Magento database models and return product data.
Александр Шкурко на Magento Meetup Kharkiv Online расскажет о Magento enhanced media gallery. Это разрабатываемый инструмент для работы с медиа-ресурсами.
Со стороны администратора, можно выделить такие фишки: новый расширенный интерфейс для поиска и сортировки, поиск по ключевым словам и возможность узнать, где именно используется картинка: catalog, product, cms page/block.
С технической стороны, будут интересны подходы к организации работы самого модуля: его архитектура и взаимодействие с другими частями платформы, индекс картинок из файловой системы и работа masonry grid component.
Из доклада Владислава Опухлого на Magento Meetup Kharkiv Online вы узнаете, как вложиться в дедлайны и что учитывать, чтобы в погоне за сроками не накопить ошибки в инфраструктуре, которые могут положить сайт в самый разгар продаж!
Всё то, что не является проблемой отдельно и что больно поправлять в бессонную ночь в режиме срочно и на сейчас.
Алексей Коростелев рассказал как работает Magento Cloud и не только. Еще он поделился опытом настройки собственного масштабируемого кластера в AWS c особенностями деплоя.
Making the Magento 2 Javascript Loading Great Again - Robin van RaanMagecom UK Limited
In his talk at Magento Meetup Kharkiv, Robin van Raan covers the latest techniques for RequireJS optimizations for Magento 2. Did you know that your production site is running RequireJS in development mode? Let's fix that and make your frontend 3x faster!
This document provides an overview of advanced Git commands for changing the commit history, including rebase and reset. It discusses rebasing onto different branches to rewrite the commit history in a linear sequence. Interactive rebase is mentioned to edit commit messages. Revert is described as creating new commits to undo changes instead of modifying history. Hard reset is warned to change the local tree. Resources are provided for further learning about manipulating Git histories.
This document discusses an Adobe Stock integration community project for Magento. The project aims to enable merchants to add high-quality stock images to website content directly from the Magento admin without leaving the interface. Milestone 1 of the project involves implementing image search and uploading watermarked previews to the media gallery. Future milestones will add licensing of stock images and replacing watermarks with licensed images. The project is hosted on GitHub and contributions are welcomed from the Magento community.
Proof of Concept for Magento 2 Projects: Occamo’s RazorMagecom UK Limited
This document discusses proof of concept (POC) projects for Magento 2, outlining different types including new projects, maintenance projects, and "black box" projects. It describes key aspects to address for each type such as technical requirements, risks, and human resource needs. Occam's Razor principle of selecting the simplest adequate solution is emphasized. Risks for different project types are identified such as Magento updates, module incompatibilities, and underestimating work. Methods are proposed for scoping POCs appropriately and avoiding overengineering or skill underestimation for "black box" projects.
This document discusses Oleksandr Lyzun's experience working on several Magento Community projects including Async/Bulk API, GraphQL, PWA, and Asynchronous Import. It provides details on the goals and status of each project, how they improve the Magento experience, and benefits of contributing to open source Magento projects. The document also references resources like the Magento Community Portal and Backlog for finding additional projects to contribute to.
1. The document discusses challenges that can arise when using MSI (Multi Source Inventory) with reservations in Magento when integrating with third party systems like ERPs.
2. Two case studies are presented: 1) an ERP-driven infrastructure where the ERP is the system of record for order status and stock data and 2) a Magento-driven infrastructure where Magento pushes data to the ERP.
3. In both cases, the reservations logic in MSI may need to be disabled to allow the system of record to properly update stock levels and clean up reservations without stock level conflicts. The key is identifying the system of record for stock data and having the responsible system clear reservations.
The document discusses how a lead developer at Fiyo, an online webshop in 9 countries, wants to improve communication and information sharing with business owners to better meet their needs. It recommends providing more context about business software and processes, enhancing direct communication through backlogs and planning, allowing business owners to test software before and after release to evaluate performance, and improving processes to help both the business and developers succeed. The overall goal is to establish better information sharing and communication through evaluation to create happier business owners and developers.
2. Немного обо мне
Максим Гром Tech Lead in ZFort
3 года с Magento 2
6 лет преподавал в ХАИ
MailMaximGrom@gmail.com
Веду 2 канала на youtube:
Maksym Grom / WebDev. GromMax
47
4. Наследование ∉ киты ООП
Композиция - мейнстрим (не только в M2)
Private > Protected
Interface > Abstract Class
VirtualType, Plugin > Rewrite, Preference
Что полезного? 49
5. Увидеть новый уровень SOLIDности кода
S - один класс одна задача
O - все можно расширить
L - чистый конструктор
I - композиция интерфейсов - мейнстрим
D - проси интерфейс, а не реализацию
Что полезного? 50
7. DI это когда
Что дает DI для M2?
● Все объекты создаются из Inversion of Control
(IoC) Container
● IoC Container владеет конфигурацией каждого
класса в системе
● Объект просит зависимость через конструктор,
а IoC решает что туда передать
52
8. DI недостатки
● Создание дерева зависимостей при создании объекта
● Медленное создание объекта при медленном
конструкторе в зависимости
● Накладные расходы из-за рефлексии
● Обслуживание конфигурации (У M2 все есть -> xml)
Что дает DI для M2? 53
18. Запуск приложения с разными настройками
Initial
app/etc/di.xml
Global
[vendor]/[module]/etc/di.xml
Area
[vendor]/[module]/etc/[area]/di.xml
frontend, adminhtml, webapi_rest,
webapi_soap, crontab, graphql
Что дает DI для M2? 63
20. Bootstrap App -> app/etc/di.xml
Как работает DI?
Загрузить initial di.xml
(app/etc/di.xml)
ObjectManager::configure($di)
MagentoFrameworkObjectManagerConfigConfig
Подготовка di в php
Создать App
65
21. Решить для какой area этот процесс
bin/magento http
/rest
Di
global
Di
global
cron:run
Di
crontab
Area
crontab
cli /?wsdl /admin /
Di
webapi_rest
Area
webapi_rest
Di
frontend
Area
frontend
Di
adminhtml
Area
adminhtml
Di
webapi_soap
Area
webapi_soap
Cron Job Rest Service Soap Service Action
Как работает DI? 66
22. ObjectManager -> create or get (Shared)
create($type, $arguments) get($type)
Cached?
Create type
Return object
Cache type
getPreference
true
false
Как работает DI? 67
23. Create type
create($type, $args)
$params = resolveParams($type)
$params === null
return new $type()
$args = resolveArguments($params, $args)
return create($type, $args)
Если аргумент object то создаем
через ObjectManager
Если shared то через get,
иначе через create (рекурсия)
Как работает DI? 68
24. Результат в M2. Single Public Method Classes
Тип класса Публичные методы
Actions dispatch
Factory create
Observer execute
Service execute
Repository* get, getById, save, getList, delete
Как работает DI? 69
25. Результат в M2
● Запускаются все конструкторы*, потом
методы
● Медленный конструктор - плохо
● Data Transfer Object (DTO) без
конструктора
Как работает DI? 70
28. Задача, добавить грид в админку
ProjectBlogetcadminhtmldi.xml
В любом гриде в админке ошибка
Невозможно создать [name]_data_source
В чем проблема?
Ограничения DI 73
29. Задача, добавить грид в админку
ProjectBlogetcadminhtmldi.xml
CollectionFactory
Собирается как global di.xml
Ограничения DI 74
36. Или получай через ObjectManager
Или внедряй как Block
Или внедряй как ViewModel
Virtual type 81
37. Примечание
● VirtualType может быть создан из VirtualType
● Параметры конструктора type и virtualType
склеиваются через array_replace
● Для класса типа Pool нужно обеспечить
возможность склейки типов
Virtual type 82
39. Задача
● Загрузить список продуктов
● Продукты конкретной категории
● Если категория anchor, то загрузить продукты
дочерних категорий
Virtual type 84
40. Наши пожелания
● Создать как можно меньше кода
● Не создавать новые API сервисы
● В идеале использовать
MagentoCatalogApiProductRepositoryInterface
● Не использовать ProductCollection как
зависимость в своем коде
Virtual type 85
47. VirtualType. Вывод
● Это экземпляр базового класса
● Идеально для композиции
● Массивы в конструкторе замещаются
полностью
● Можно создать через ObjectManager
● VirtualType можно сделать из VirtualType
Virtual type 92
49. Plugin регистрируется в di.xml
Перехватывает любой публичный метод
Класс плагина не нужно наследовать
Plugin это shared объект
Plugins 94
50. Как DI решает кого плагинить (dev mode)
Начало
Сканировать методы
before[MetodName]
around[...], after[...]
Есть плагины в
цепочке
Завершить для этого класса
Вычислить цепочку родителей
(классы, интерфейсы)
Генерировать Interceptor
Подготовить конфиг
очередности вызовов для
методов
Этот
класс
Final?
Сортировать плагины
Подменить класс на Interceptor
true
false true
false
Plugins 95
53. Plugins не работают для
Static method
- Должен быть создан класс через ObjectManager
Private method
- Не наследуются в Interceptor
Protected method
- Нарушение SOLID принципов (use preference)
VirtualType - новый объект, а не класс
- Плагинится класс
Plugins 98
54. Plugins. Вывод
● Используй на классы другого модуля
● Делай stateless plugin - shared object
● Before plugin для подмены входных параметров
● After plugin для подмены результата
● Around plugin > preference
● Используй на Interface > Class
Plugins 99
56. Задача подготовить массив моделей из CSV
Модель другого модуля с интерфейсом
Интерфейс с пометкой @api, модель нет
● Через конструктор можно получить только
один объект или shared
● Через new нельзя создавать интерфейсы
● Классы без @api могут быть удалены - проблема
обновлений
Factory. Набрать массив интерфейсных моделей 101
57. Magento создаст фабрику автоматически
по наличию постфикса Factory
Factory. Набрать массив интерфейсных моделей 102
59. Factory. Вывод
● Нужно создавать объекты? Используй
Factory
● Factory - пример класса без хардкода
● Генерация Factory гарантирует
однотипность этого подхода
Factory 104
61. Задача сделать CLI, работающую с frontend area
И загрузить продукт со SKU “Test”
Vendor/Module/etc/di.xml
Proxy. CLI, загрузка продукта SKU TEST 106
63. Инициализируем area и di в начале метода execute
1. Активирует area для специальных случаев (загрузка
сессии)
2. Подключает DI для area
Proxy. CLI, загрузка продукта SKU TEST 108
64. Проблема. ProductRepository создан в конструкторе
1. Обращение к БД в конструкторе CLI
2. Создание класса до готовности DI (1-2-3 -> 2-1-3)
Proxy. CLI, загрузка продукта SKU TEST 109
65. Подменяем класс на Proxy
Proxy - отложенная загрузка класса. При первом запросе к
proxy объекту будет создан исходный объект.
Назначайте Proxy только через di.xml
Proxy. CLI, загрузка продукта SKU TEST 110
66. Integration Test
Начало
Очистка тестовой
DB
bin/magento setup:upgrade
Запуск тестов на новой БД
Создает ConsoleListInterface
Создает все объекты команд
Для каждой команды строится
дерево зависимостей
-Запрос к БД ломает наполнение БД
-ResourceModel делает запрос к БД
-Repository внедряет ResourceModel
Proxy 111
75. Выводы в целом
● Создавай объекты через Factory
● Медленный конструктор - плохо (Proxy)
● Используй композицию вместо наследования
● Используй чужой код через VirtualType
● Инициализируй сервис через конструктор
● Расширяй сервисы через Plugin
120