Под капотом чужого продукта

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

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

Сложности начинаются по прошествии времени. Продукт у поставщика обновляется, а наш нет. Или обновляется, но работает не как ожидалось. Или работает, но через какое-то время появляются неожиданные ошибки. Или продукт поменялся так, что модификация с сохранением функционала теперь невозможна. Фактически компания теперь имеет кастомный продукт без возможности внятной поддержки. Таким образом получаются различные необновляемые CRM/ERP/фреймоворки и сторонние библиотеки, а 1С-ники отлично знают "счастье" работы с правленной конфигурацией.

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

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

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

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

Halloween docs

Осенью далёкого теперь 1998 года из в сеть утекли так называемые Хеллоуинские документы. Это внутренняя аналитика Microsoft по вопросам конкуренции её продуктов с Linux и в целом с открытым программным обеспечением. Это крайне интересное чтиво, как в первоисточнике, так и с комментариями Эрика Раймонда. Кто интересуется внедрением ИТ-систем, интеграцией и даже разработкой ПО полезно хотя бы ознакомиться с этой историей. И точное необходимо кто развивает ИТ-бизнес или метит в фаундеры, а также любому бизнесу, завязанному ключевым образом на ИТ.

А история следующая. В 90-е годы Майкрософт вполне себе хорошо жил на рынке серверных операционных систем. Даже больше: MS вместе с Интелом (=wintel) были такими же столпами индустрии в корпоративном ИТ, как сейчас Nvidia с OpenAI в искусственном интеллекте. Unix в разных вариантах использовался, но имел огромные сложности как коммерческий продукт, а Linux был вообще уделом маргиналов и прочих гиков. Основной софт писался под Windows и основное внимание "денег" было направленно в wintel.

В хеллоуинских документах Linux и OSS уже признается как серьезная угроза бизнесу MS. Открытые протоколы, эффективная архитектура ОС, работа с сетью, расширяемость, масштабируемость и многое другое в линуксах было сделано изначально лучше. Например, такая выдержка:

Linux Operating System

The Next Java VM?

The Linux OS is the highest visibility product of the Open Source Software (OSS) process. Linux represents a best-of-breed UNIX, that is trusted in mission critical applications, and — due to it’s open source code — has a long term credibility which exceeds many other competitive OS’s.

Linux poses a significant near-term revenue threat to Windows NT Server in the commodity file, print and network services businesses. Linux’s emphasis on serving the hacker and UNIX community alleviates the near-medium term potential for damage to the Windows client desktop.

In the worst case, Linux provides a mechanism for server OEMs to provide integrated, task-specific products and completely bypassing Microsoft revenues in this space.

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

Архитектура критически повлияла и на развитие смартфонов, о чём в доках ни слова, тогда об этом "не мечтали". Apple свои айфоны делала под iOS, который потомок BSD. Google выбрал в качестве платформы Linux и получился Android. Обе компании сделали свои экосистемы на этих решениях. Майкрософт пыталась сделать свою ОС под смартфоны и она не получила развития, даже покупка Нокии не помогла.

С позиции более чем 25-летней давности произошедшее уже далёкая история. Но так и произошло! Главный вывод: Архитектура на долгосроке определяет развитие.

О старых конфигурациях 1С

У одного заказчика используется 1С:Торговля достаточно старой версии на такой же старой платформе 8.2. И то, и другое уже не поддерживается 1C, никакие обновления не ставятся. Хранение данных выполнено в MS SQL старой древней, который установлен на ещё более древнем Windows Server. Конфигурация Торговли была достаточно сильно дописана на заказ именно под бизнес-процессы заказчика. И вот эта вся связка работает уже более 5 лет. Надо сказать, прекрасно работает.

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

С момента внедрения конфигурации прошло уже более 10 лет. СУБД, ОС и серверы, на которых это всё работает, устарели и их отдельно даже смысла обновлять нет.

Что делать? Конструктивно ничего с этим не сделать. Только делать всё наново. И в конкретно этом случае в новом решении из качественно-быстро-дешёво даже 2 пунктов не набирается.

Что сделали: оставили как есть.

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

Неподдерживаемый код

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

В продакшене могила компилировалась из исходников на тех же CentOS серверах примерно в те же годы, т.е. начало 2010-х. На тех же серверах работает код самого проекта на php 5.4 с остальным уже сильно не новым окружением. А код заказчика развивается и хотелось бы уже мигрировать новую спецификацию языка и использовать возможности новых библиотек. Но сделать это сложно.

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

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

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

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

Выводы:

  1. Избегать использования библиотек, поддержка которых вероятно скоро прекратится. Заранее это не всегда можно определить, но есть косвенные признаки.
  2. Писать код с продуманной архитектурой и интерфейсами, которые позволяют легко поменять хранилище (и не только его).
  3. Разделять задачу на разные уровни. Конкретно здесь хранение можно почти полностью реализовать на более низком уровне без существенного потери функционала.
  4. Использовать как можно более прозрачные и унифицированные инструменты.