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

Phprussia

Мир изменился CQRS и ES встречаются в PHP чаще, чем кажется

30.04.2021 20:15:00 | Автор: admin

Генри Форд чуть не прогорел на своей классической фразе про пятьдесят оттенков черного. General Motors стала предлагать разноцветные модели Chevrolet, Pontiac, Buick, Oldsmobile и Cadillac и не прогадала. Глядя на это, даже упрямый Форд изменил свое мышление и разработал новый Ford A, вернувший его на автомобильный Олимп. Бывают времена, когда парадигма мышления должна стать новой ибо человек умирает тогда, когда перестаёт меняться Генри Форд.

Пришло время и для разработчиков. Command Query Responsibility Segregation (CQRS) и Event Sourcing (ES) уже не миф они реально работают. Конечно, не для всех задач как и классический черный цвет Форда, PHP никуда не исчез и нужен по-прежнему. Но теперь уже есть задачи, где мы встречаемся с CQRS и ES чаще, чем нам кажется. Антон Шабовта на PHP Russia 2021 расскажет, как смена парадигмы и взгляд с другой стороны помогают разработчикам. А перед конференцией мы расспросили Антона подробнее о его новых взглядах на разработку, PHP и, конечно, оCQRS и ES.

Антон, расскажи о себе и о своей работе. Чем ты занимаешься?

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

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

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

Твой доклад на конференции будет про долгий путь к CQRS и Event Sourcing. Это связано с твоей карьерой разработчика?

Да. Впервые я столкнулся с подходами Command Query Responsibility Segregation (CQRS) и Event Sourcing (ES) еще при работе с E-Commerce в 2015 году. И это стало важной вехой в моей карьере разработчика. Информации о CQRS и ES было много, но столько же возникало вопросов, мифов и недопонимания. Что именно представляют собой эти технологии? Как их использовать? Где стоит применять и какие проблемы они действительно призваны решать? Так вот одна из моих целей на PHP Russia 2021 развенчать часть этих мифов и показать, что мы сталкиваемся с CQRS и ES намного чаще, чем кажется, даже если раньше мы никогда не слышали эти слова.

В 2017 году, проработав два года с CQRS и ES, я сделал доклад об этом в рамках митапов Минской PHP User Group. Но, пересмотрев слайды, я понял, что в корне неверно подходил к объяснению этих технологий. За пять лет мое понимание значительно преобразилось, и я надеюсь, что на этот раз смогу лучше объяснить. Так что во многом доклад для PHP Russia 2021 это еще и работа над ошибками.

У тебя есть опыт с Erlang и Java (про С/С++, C# и Python знаем), или же ты целенаправленно изучаешь практики оттуда, чтобы рассмотреть их для PHP?

По-разному, it depends. Исторически так сложилось, что многие книги по архитектуре программных систем используют примеры и понятия из Java-мира. И чтобы не упустить какие-то ключевые моменты и важные нюансы, пришлось разбираться в Java. Недавно стряхнул пыль с этих знаний, когда искал решения для своих проектов и разбирался с фреймворками Axon и Akka. В целом же, практики из одного языка, по крайней мере, из Java, очень легко и просто переносятся на PHP.

С# я начал изучать, когда разбирался в устройстве фреймворка NServiceBus. В нем реализовано много классных решений, связанных с MBA (message-based architecture), SOA (service-oriented architecture) и сопутствующими технологиями.

Erlang это вообще отдельная история. Интерес к нему пришел в процессе изучения классического понятия ООП (объектно-ориентированного программирования) от Алана Кея и модели экторов. Это реально классный язык, совершенно непохожий на другие. Не могу сказать, что готов сейчас писать на нем production ready код, но изучать его концепции, конечно, продолжу.

Получается, что ты изучаешь, условно говоря, не какие-то языки, а перенимаешь практики из других языков, которые там успешны?

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

Помогает ли знание других языков лучше писать на PHP?

И да, и нет. С одной стороны, многие практики и идеи можно (и нужно!) применять в PHP, особенно из близких по духу по подходам языков (Java, C#). ООП-модель PHP очень близка к этим языкам. К тому же мир разработки в PHP очень сильно изменился, например, после выхода фреймворка Symfony 2. Команда Symfony проделала колоссальную работу по прививанию паттернов проектирования в PHP community. Но большинство паттернов были придуманы не для PHP, а для других языков, в том числе, для Smalltalk и Java.

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

Когда нужны подходы из других языков, а когда лучше по старинке или попроще?

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

Я стараюсь для себя придерживаться KISS-принципа, то есть Keep it simple, stupid: если есть возможность делать что-то проще и не усложнять, то лучше так и сделать. Такие серьезные подходы как CQRS и ES несут много изменений не только в коде, а даже в самой модели мышления программиста. Мы ставим себя в определенные рамки, и за это придется платить. Не бывает серебряной пули в программировании.

Поэтому внедрять CQRS и ES не глядя, просто потому что можем очень-очень плохая идея. Можно получить намного больше проблем, чем пользы. Конечно, когда-то это оправдано, но не всегда. Поэтому нужно хорошее изучение problems face, чтобы понимать, зачем мы внедряем эту технологию и какую проблему бизнеса пытаемся ею решить.

Что дают эти подходы разработчику, в чем помогают?

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

Поэтому нет популярных фреймворков для CQRS и ES?

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

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

Создатель этих подходов Грег Янг любит повторять в своих докладах, что для реализации ES и CQRS достаточно двух операций:

  1. Сравнение по образцам (pattern matching);

  2. Лево-ассоциативная свертка списка (left fold) функция высшего порядка.

И многие языки поддерживают эти операции уже на уровне стандартной библиотеки. Например, тот же left fold в PHP существует как array_reduce, и дополнительно можно придумать другие варианты реализации.

Pattern matching, к сожалению, полностью в PHP еще не реализован, хотя работа в этом направлении ведется. Но та малая часть из pattern matching, которая нужна для имплементации ES, легко эмулируется в user-land коде.

Есть также много технологий, которые работают вокруг и рядом с CQRS и ES те же message-based architecture и service-oriented architecture. Для этих технологий уже есть фреймворки, хотя достаточно популярных в PHP-мире пока не сформировалось. Какие-то работы сейчас ведутся и какие-то фреймворки вырастают. Но enterprise production ready, решений уровня того же NServiceBus в C# либо Axon в Java, пока в PHP не сложилось. Ждем!

А есть ли учебник, где на пальцах правильно объясняются эти подходы?

Изучать CQRS и ES стоит с просмотра докладов отца-основателя Грега Янга, с его публичных выступлений, статей, материалов и записей в блоге. Он подробно пишет, как он пришел к этим подходам, и из каких проблем они возникли. Для продолжения есть его книга Versioning in an Event Sourced System там вы найдете для себя кое-какие нюансы.

Много материалов по ES и CQRS подходам можно найти в документации Microsoft. У них есть даже более развернутый вариант, который вышел в виде отдельной книги Exploring CQRS and Event Sourcing. Предисловие к книге написал тот же Грег Янг.

Еще этим технологиям много внимания уделяют те, кто пишут и работают с DDD-подходом (Domain-Driven Design), например, Vaugh Vernon. И у него есть книга Implementing Domain-Driven Design, в которой большая глава посвящена именно ES и CQRS.

Кому можно верить, не проверяя, в мире разработки и PHP: Фаулеру, Мартину, кому-то еще?

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

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

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

То есть ты сам не придерживаешься этого всего?

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

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

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

Чего ты ждёшь от конференции в этом году?

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

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

  • Что нас ждет в PHP 9?

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

  • Вопрос, волнующий всех: появятся ли у нас Generic-типы? Недавно добавили Union-типы. Скорее всего, скоро добавят пересечения, но Generic это то, что возникает так или иначе в вопросах на каждой PHP-конференции.

И афтепати, конечно!

PHP Russia 2021 пройдёт в гибридном формате будет и офлайн, и онлайн. Онлайн-зрители смогут задавать вопросы спикерам в зале, принимать участие в дискуссиях и участвовать в активностях на стендах партнёров.

Мы с нетерпением ждём нашу встречу в офлайне 28 июня 2021 года. Сегодня последний день до повышения цены сейчас стоимость очного участия 27 000 рублей

Подписывайтесь на наши соцсети, чтобы быть в курсе новостей (FB,VK,Telegram-канал,Twitter), общайтесь с коллегами в чате.

Подробнее..

29 ноября в Москве конференция по PHP в России будет офлайн

16.10.2020 14:10:19 | Автор: admin
Пандемия повлияла на все бизнес-процессы, мы долго были в онлайне. Но 29 ноября PHP-разработчики смогут наконец встретиться офлайн в тёплой атмосфере, увидеть лучших спикеров PHP-вселенной, и задав им вопросы, разобрать актуальные кейсы и обсудить проблемы. PHP Russia 2020 пройдёт в Москве в гостинице Radisson Slavyanskaya. Приходите, если хотите получить ускорение и направление в развитии плюс набраться новых идей для своих проектов!

Александр Макаров расскажет о предстоящих активностях на конференции, о некоторых интерактивах и других нюансах. Александр эксперт в PHP, лидер фреймворка Yii, соавтор Yii 2 и представитель Yii в PHP-FIG. Кроме разработки фреймворка успел поработать в разных компаниях, таких как Skyeng, Wrike и Stay.com и перепробовать в бою целые поколения разных технологий.

Мы расспросили Александра как главу программного комитета по PHP Russia 2020 обо всех активностях и интересностях встречи.



Саша, что нас ждет на первой в этом году оффлайновой конференции?
Будет много интересных докладов :)

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

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

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

Будет, естественно, информация про PHP 8, и затронем интересную тему: она не совсем по PHP, а про написание плагинов для нашей любимой IDE PhpStorm.

Как и в прошлые разы, неплохо представлены такие лидеры PHP-разработки, как BADOO, Skyeng, ManyChat, Onliner, Lamoda, Авито и SuperJob. Они работают не только на PHP, но PHP это самое главное в их стеке. Необязательно все выступят с докладами, но представители этих компаний будут все.

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

Что необычного будет в этот раз?
Будет необычный формат с Дмитрием Стоговым из команды самого PHP. Он сделал JIT PHP.
Дмитрий приезжает не с докладом, а пообщаться в свободной форме с сообществом. Будет шанс задать ему любые вопросы не только про PHP 8 (и вообще про PHP), но и про остальную разработку, и даже чем он занимается в его свободное время. У Дмитрия неисчерпаемое множество тем для разговора, с ним очень интересно, а мы будем модерировать эту сессию вопросов и ответов.

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

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

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

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

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

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

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

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

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

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

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

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

За счет прогонов и крутой экспертизы у ПК (они все очень опытные докладчики, которые выступали в том числе и в Европе), получаются очень качественные доклады на выходе, и мы стараемся не опускать планку.

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

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

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

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

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

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

Must learn PHP Tools:


PHP Engineer Things to Learn:


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

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

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

Теория программирования пакетные принципы и метрики

17.03.2021 10:08:48 | Автор: admin


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


Что есть абстракция?


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



Наши проблемы идут от мозга и от того, как устроена наша память. В отличие от хорошего хранилища долговременной памяти, кратковременная устроена по типу stack:
  • Есть входы и выходы;
  • TTL объекта около 20 секунд;
  • Удерживается очень мало объектов. Раньше считали, что оперативно человек оперирует 72 объектами (George Miller, 1989). Потом поняли, что это число еще меньше: 41 объект (Cowan, 2001) и вообще зависит от объектов.
  • Если мы что-то хотим держать в памяти дольше, то нам нужно сконцентрироваться и использовать повторение:



Еще мы используем Chunking (группировку) всякий раз, когда важно запомнить что-то большое. Например, чтобы запомнить число 88003334434, мы разделим его на группы по типу телефонного номера: 8-800-333-44-34. Для нашего мозга получится 5 объектов, которые запомнить легче, чем пытаться удержать число целиком или отдельно каждую его часть.

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

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

Но как построить абстракцию, не сделав хуже?


Существует два понятия: cohesion (связность) и coupling (связанность). Они относятся в первую очередь к классам, но в целом и ко всем остальным сущностям. Разницу мало кто видит, так как звучат они почти одинаково.

И, хотя оба означают связь, coupling понимают в негативном ключе. Один объект завязан на другой в плохом смысле, если, ломая один из объектов, ломается всё остальное по цепочке. Cohesion несёт в себе позитивную ноту. Это группировка, в которой то, что близко по смыслу лежит в одном месте и взаимодействует примерно с теми же местами, опять же близкими по смыслу.

Для того, чтобы понять, coupling у вас или cohesion, существуют проверочные правила. Их сформулировал инженер и специалист в области информатики Роберт Мартин еще в 2000 году, и это принципы SOLID:
  • SRP;
  • OCP;
  • LSP;
  • ISP;
  • DIP.

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

Что есть пакет?


Пакет это группа единиц кода. Причем, пакеты это не обязательно пакеты Maven или Composer, или npm. Это программные модули, то, что вы выделяете в namespaces или иным способом группируете.

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

И того, кто эти пакеты пилит, обычно волнуют два вопроса: Как правильно формировать пакеты и как работать с зависимостями пакетов?

Как их правильно формировать?


Собственно, cohesion и coupling, как основополагающие принципы, отлично работают и для пакетов. Но сработает ли SOLID для пакетов?

Да, но не совсем. Оказалось, что существуют ещё 6 принципов от того же Роберта Мартина, сформулированные в том же году. Часть из них относится к cohesion, и это о том, как дизайнить код: REP, CCP, CRP. Другая часть это coupling (то есть использование пакетов): ADP, SDP, SAP и это о том, как сделать так, чтобы один пакет не завязался на другой и чтобы всё нормально работало:



1 принцип REP (Reuse-Release Equivalency Principle)


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

Принцип гласит: The granule of reuse is the granule of release. Only components that are released through a tracking system can effectively be reused. This granule is the package. что переиспользуем, то и релизим. Эффективно переиспользовать можно только компоненты, релизнутые через системы версионирования. Такие компоненты называются пакетами. То есть упаковывайте то, что переиспользуется в отдельные пакеты и релизьте это через любимый пакетный менеджер, версионируя по SemVer.

2 принцип CCP (Common Closure Principle)


Classes that change together are packaged together изменение в пакете должно затрагивать весь пакет. Этот принцип очень похож на SOLID-ский OCP. Классы, которые изменяются по одной и той же причине, должны упаковываться в один пакет. Что логично.

Нормальный пример: адаптеры. Библиотека, допустим, кеш. Если мы запихиваем в один пакет тучу адаптеров: для файлов, memcached, Redis, то при попытке изменить один какой-то адаптер мы нарушаем два принципа. Во-первых, принцип REP (начинаем релизить один из адаптеров, а релизить приходится все). А во-вторых принцип CCP. Это когда классы для адаптера под Redis изменяются, а все остальные адаптеры в пакете нет.

3 принцип CRP (Common Reuse Principle)


Classes that are used together are packaged together Пакеты должны быть сфокусированными. Использоваться должно всё. То есть классы, которые используются вместе упаковываем вместе. Проверочное правило здесь такое: смотрим, используется ли в нашем софте всё из того пакета, который к нему подключен. Если используется чуть-чуть, значит, скорее всего, пакет спроектирован неверно.

Эти три принципа дают понимание, как пакеты дизайнить. И казалось бы, нормально делай нормально будет. Однако реальность сурова, и я сейчас объясню почему. Вспомним треугольник от Артемия Лебедева, который вершины быстро, дёшево и качественно обозначил несколько другими словами. Такой же треугольник нарисовали и для пакетных принципов в Институте Макса Планка:



Получается, эти принципы конфликтуют, и в зависимости от того, какие стороны треугольника мы выбираем, вылезают соответствующие косяки:
  • Если мы группируем для пользователей (REP) и для мейнтенера (CCP), то получаем множество ненужных релизов: новые версии пакетов начинают вылетать как из пулемета. И пакет как тот же Chromе достигает версии 46 за полгода, когда все остальные браузеры выпускают одну мажорную версию раз в 7 лет.
  • Если мы группируем для пользователей (REP) и выделяем классы в пакеты по признаку переиспользования (CRP), у нас получаются изменения в туче пакетов. А это неудобно мейнтенеру, потому что приходится лезть в каждый из пакетов, и не получается релизить их по отдельности. Это дикая головная боль.
  • Если мы группируем для мейнтенера, то есть соблюдаем CCP и CRP, то получается всё круто для человека, который поддерживает этот пакет, но не круто для юзера, потому что переиспользовать такие пакеты получается плохо: они выходят как всякие мелкие штучки, которые собрать вместе просто нереально.

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

Теперь переходим к принципам использования.

4 принцип ADP (Acyclic Dependencies Principle)


The dependency graph of packages must have no cycles Если есть циклические зависимости, то проблема вызывает лавину. Если есть циклы, то есть зависимость пакета зависит от самого пакета прямо или косвенно, то косяк в одном пакете вызывает лавину во всех остальных пакетах, и ломается абсолютно всё. К тому же, такие пакеты очень тяжело релизить.

Поэтому надо проверять, есть ли циклы. Для этого необходимо строить направленный граф зависимостей и смотреть на него. Руками это делать не очень удобно, поэтому для PHP есть библиотека clue/graph-composer, которой скармливаешь пакет, и она строит гигантский граф со всеми зависимостями. Смотреть на это, конечно, невозможно, поэтому надо зайти в PR#45, зачекаутить его и выбрать возможность исключать зависимости, которые не интересны. Допустим, если вы пишите фреймворк, то вам скорее всего интересны зависимости на свои пакеты, а чужие не так сильно, ведь свои косяки поправить можем, чужие тяжелее. И получается вот такой граф:


Если мы видим как здесь что циклических зависимостей нет, то всё отлично. Если есть, надо исправлять. Чем меньше зависимостей, тем проще.

Как разорвать цикл?


  1. DIP использовать инверсию зависимостей через интерфейсы. Мы должны ввести интерфейс и на него завязаться вместо зависимости на конкретные реализации.
  2. CRP выделить общий пакет. Например, есть кеш и с адаптерами. Чтобы развязать между собою Redis, базу и так далее выделяем драйверы в отдельные пакеты и выделяем сам общий пакет, в котором лежит только сам интерфейс. Это выглядит ужасно получается такой бесполезный пакет. Но с точки зрения DIP и CRP это будет правильно. И помимо того, что реально не будет ломаться, еще и даст нам крутой профит мы можем писать под этот пакет свои реализации.
  3. Переделать...

5 принцип SDP (Stable Dependencies Principle)


Это принцип стабильных зависимостей: Depend in the direction of stability Не получится строить стабильное на нестабильном. Нестабильность считается так:



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

6 принцип SAP (Stable Abstraction Principle)


Принцип стабильных абстракций гласит A package abstractness should increase with stability Стабильные пакеты абстрактны / Гибкие конкретны. То есть абстрактность должна возрастать со стабильностью. Стабильность здесь то, как часто нам приходится менять части пакета: классы, интерфейсы, или что-либо ещё. Абстрактные пакеты должны быть стабильны, чтобы безболезненно на них завязываться. В примере с тем же кэшем пакет с интерфейсом будем сверхстабильным, потому что менять интерфейс, про который мы договорились и хорошо над ним подумали скорее всего, не придётся. Если мы, конечно, абстрагируем не СУБД.

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

Можно ли измерить абстрактность?


Конечно. Абстрактность это число классов и интерфейсов в пакете, деленное на число абстрактных классов и интерфейсов в этом самом пакете. То есть количество конкретного и абстрактного, деленное на количество абстрактного:


Еще есть такой полезный показатель, как D-метрика, в которой по вертикали нестабильность, а по горизонтали абстрактность. По двум зонам вверху справа и внизу слева мы можем понять:
  • Если стабильно, но не абстрактно это подозрительно.
  • Если дико нестабильное и очень абстрактное значит кто-то играется с интерфейсами и делает нашу жизнь адом.
  • Но иногда бывает 0,0 когда супер-неабстрактно и супер-стабильно, как в случае с хелперами или стандартными библиотеками PHP типа stdlib, strings, arrays и это будет нормально.



Линия посередине называется главной линией, и если классы и интерфейсы попадают на неё или выстраиваются вдоль это тот случай, когда всё отлично. По сути, D-метрика это дистанция от главной линии, поэтому 0 в этом случае это хорошо, а 1 плохо. Но, как правило, ни то, ни другое не случается значения плавают в диапазоне от 0 до 0,9-0,7. Считается метрика так:


Для PHP есть 2 инструмента для того, чтобы посмотреть метрику своих пакетов:
  • PHP_Depend;
  • PhpMetrics.

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

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

Резюме


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

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

Данные принципы же позволяют не скатываться в монолит или в left-pad из npm. С left-pad была в свое время история его создали для добавления символа в конце строки, так как в JavaScript есть традиция дробить пакеты вообще в пыль. А потом на этот пакет завязалось практически всё вплоть до пакетных менеджеров и самых крутых фреймворков. В какой-то момент автор обиделся на всех и выпилил left-pad из системы после чего, как вы понимаете, сломалось всё. Рассмотренные принципы, в том числе, позволяют уменьшить вероятность такого сценария.
Единственная конференция по PHP в России PHP Russia 2021 пройдет в Москве 28 июня. Первые доклады уже приняты в программу!

Купить билеты можно тут.

Хотите получить материалы с предыдущей конференции? Подписывайтесь на нашу рассылку.
Подробнее..

Категории

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

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