Обратная сторона фреймворков

от автора

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

Из первых рук и на личном опыте.

The Anatomy Lesson of Dr Willem Röell (1728), Cornelis Troost.

The Anatomy Lesson of Dr Willem Röell (1728), Cornelis Troost.

Фреймворк (Framework) — дословно «каркас», большая такая библиотека с окружением и утилитами, вокруг которой вы обязаны выстроить логику приложения по определенным правилам. Эдакий железный столб, на который намотано то что называется «собственной разработкой».

Любимые широкими массами Angular, React, Spring, Hibernate — те самые фреймворки.

Профит

Зайдем с козырей:

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

Особенно на начальном этапе и если вы работаете над проектом не один а в составе команды.

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

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

К сожалению на этом все хорошее заканчивается и начинается бесконечное море проблем.

Когда выбрал Angular для своего нового проекта.

Когда выбрал Angular для своего нового проекта.

Проблемы и последствия

Самое очевидное и банальное, но одновременно слабо осознаваемое:

фреймворк — большой, сложный и не ваш.

Сколь‑нибудь серьезно повлиять на его развитие вы не сможете, предотвратить «поворот не туда» в его развитии, если такое вдруг случится — не получится, продолжить разработку вместо авторов у вас банально не хватит ресурсов, сил и времени.

Рассказы про «открытый код» и «возможность форка» на практике так рассказами и остаются (по большей части) — некому и некогда таким заниматься на обычном проекте в обычной компании.

Представьте масштаб работ по созданию полноценного форка с тестированием и последующей поддержкой акого‑нибудь Spring или Angular — годы работы для серьезной команды.

И это только «ширпотреб» — фреймворки общего назначения и широкого применения. А ведь еще есть нейросети, компьютерное зрение, распределенные вычисления, распознавание текста и прочие замечательные инструменты, со своей спецификой. Сделать форк например какого‑нибудь TensorFlow — задача вообще на грани реальности.

Резюмируя:

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

Вырезать из большого проекта Angular или React — очень непростое занятие.

Детские годы чудесные.

Детские годы чудесные.

Проблемы развития

Вспомните на минуту собственное детство, как вы росли, как росло и изменялось ваше тело — из младенца в ребенка, из ребенка — в подростка, из подростка в СИЗО во взрослую особь.

А теперь представьте, что в какой-то момент ваш скелет вдруг расти перестал:

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

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

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

Ознакомтесь с небольшим «списком павших»:

https://wiki.python.org/moin/WebFrameworks, раздел «1.5. Discontinued/Inactive Frameworks».

https://www.doomworld.com/forum/topic/120735-list-of-web-browser-plugins-that-are-dead-deprecated-discontinued-extinct-with-the-rise-of-html5-https/

https://attic.apache.org/

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

Поворот не туда

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

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

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

В качестве примера:

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

Весь функционал авторизации через социальные сети из JHipster был удален, с вполне официальной рекомендацией «используйте Okta», примеры также остались лишь с использованием сервисов Okta и Keycloak (еще один спонсор).

И никто из тысяч пользователей JHipster ничего с этим сделать не смог.

Лучшие мировые практики

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

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

Atlassian JIRA

Atlassian JIRA

JIRA

Один из самых старых и известных багтрекеров, который видели наверное все, имеющие отношение к коммерческой разработке ПО.

Решение:

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

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

Под рукой оказалось это:

Jira uses OpenSymphony’s WebWork 1 to process web requests submitted by users. Please note that WebWork 1, not 2, is used. WebWork 1 is a MVC framework similar to Struts. Each request is handled by a WebWork action which usually uses other objects, such as utility and Manager classes to accomplish a task.

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

Jenkins CI

Jenkins CI

Jenkins

Решение:

разработать собственный фреймворк, как часть проекта.

Jenkins (в девичестве — Hudson), этот знаменитый проект CI-сервера, с самого начала был построен на собственном веб-фреймворке. Спустя много лет, уже после достижения большого успеха и популярности, фреймворк вытащили наружу в виде отдельного проекта:

https://github.com/jenkinsci/stapler

Так что да, такой вариант тоже возможен.

Но стоит помнить, что Jenkins/Hudson создавался и долгое время поддерживался в одиночку, в качестве пет-проекта очень серьезным профессионалом с большим опытом, работавшим на тот момент в Sun Microsystems.

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

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

WildFly Application Server Console

WildFly Application Server Console

WildFly

Решение:

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

Wildfly — в прошлом JBoss, это такой сервер приложений, соответствующий спецификации Jakarta EE (ранее JEE и J2EE), очень популярный.

Разработкой данного проекта занимается компания Red Hat, когда‑то создавшая первый коммерческий дистрибутив Linux. Компания богатая, известная и имеющая серьезный вес в движении «Open Source».

Все это позволяет ей держать разработку используемых технологий под жестким контролем, фактически часть ключевых разработчиков используемых Wildfly библиотек и фреймворков (например Hibernate) — штатные сотрудники самой компании Red Hat.

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

В наших реалиях подобным образом могут поступать лишь очень немногие компании — попробуйте сами честно ответить на вопрос: кто из российских компаний имеет хоть какой-то вес в Open Source.

Ваш тренер по духовному апгрейду.

Ваш тренер по духовному апгрейду.

Личный опыт

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

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

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

Некоторые примеры миграций и обновлений, которые автор проводил лично:

  • JQuery -> AngularJS -> Angular 2 -> Angular 5 -> Angular 8 -> Angular текущей версии

  • Java 1.2 -> 1.3 -> 1.4 -> 1.5 -> 1.6 -> 1.7 -> 1.8 -> 9 -> 11 -> 19 -> текущая версия

  • J2EE -> Spring

  • J2EE -> JEE -> Jakarta EE

  • MyBatis -> JPA

  • Swing -> JavaFX

  • Ant -> Maven -> Gradle

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

Cама миграция возможна практически всегда.

Ни монструозность размеры проекта, ни степень его устаревания не являются непреодолимым препятствием.

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

Процесс миграции вполне предсказуем про срокам и по сложности.

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

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

Символ распада и деградации.

Символ распада и деградации.

С переписыванием с нуля на самом деле все несколько сложнее и рисковее: таким переписыванием можно сломать «ощущение от использования» — набор паттернов поведения в системе, к которым пользователи привыкли:

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

Что и случилось со знаменитым Skype — некогда пионером в задаче «позвонить через интернет» а ныне доживающим последние дни.

Эпилог

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

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

Фреймворки дают свой эффект лишь на начальном этапе, уже существующий большой проект они не спасут.

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

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

Как показывает опыт Facebook/Meta — если у вас есть миллиард, возможно мигрировать даже кодовую базу, созданную целиком на PHP.

P.S.

Это обновленная версия статьи, оригинал которой можно найти в нашем блоге.

Поскольку мы «собаку съели» и пару кошек на задачах миграции и обновления всевозможного legacy — в большинстве случаев сможем помочь и с вашим проектом, контакты в профиле.


ссылка на оригинал статьи https://habr.com/ru/articles/897656/