Я уже несколько месяцев в свободное время занимаюсь созданием open-source фреймворка для написания настольных приложений преимущественно бизнес-направленности (ERP, WMS, CRM и т.п.). Вдохновившись прочтением статьи о проверке бизнес идей, хотелось бы изложить некоторые свои мысли обо всей этой затее и услышать ваши отзывы. Что бы я хотел услышать от вас:
- Что вы думаете о реальности этой идеи?
- Быть может у вас есть какие-нибудь другие идеи, которые не жалко отдать в open-source?
- Любые другие отзывы и комментарии
Open-source проекты тоже требуют денег
Сама по себе идея open-source выглядит очень привлекательной, когда вы выступаете в качестве пользователя продукта:
- Многие open-source продукты полностью бесплатны или имеют бесплатную базовую версию.
- Если проект находится в стадии активной разработки, то шансы быстро получить бесплатную поддержку при возникновении проблем также весьма велики.
- Если open-source проект достаточно зрелый, то с большой вероятностью вы сможете найти ответы на большинство возникающих вопросов, так как обсуждение таких проблем также ведется открыто на различных ресурсах наподобие Google Groups или StackOverflow.
Если же теперь посмотреть на open-source с точки зрения участников команды проекта, то окажется, что все указанные выше преимущества требуют постоянного труда участников проекта:
- Много времени уходит на написание, отладку и тестирование нового кода, выпуск релизов и так далее.
- Еще больше времени тратится на поддержку пользователей продукта. Пользователи хотят получать правильные ответы на свои вопросы быстро, но при этом часто не утруждают себя тем, чтобы поискать, задавал ли кто-нибудь уже подобный вопрос. Это порождает множество одинаковых вопросов и тратит много времени даже на ответы типа «уже было, посмотри по этой ссылке».
Что я хотел донести, написав эти довольно очевидные вещи? Очень простую мысль — для того, чтобы open-source продукт был качественным и активно развивался, он все же должен неплохо финансироваться, вот почему большинство крупных open-source библиотек, фреймворков и программ развиваются одним из следующих способов:
- Разрабатываются под внутренние нужды коммерческих компаний (имеющих другие источники дохода) и потом полнофункциональная бесплатная версия выкладывается в открытый доступ.
- Разрабатывается бесплатная базовая версия продукта и расширенный набор функциональности, продаваемый за деньги. Иногда речь идет только о платной технической поддержке бесплатного, но сложного в освоении продукта. В некоторых случаях за деньги в приоритетном режиме могут дописываться фичи по требованию заказчика.
- В Америке также возможен вариант стартапа, который быстро получает деньги на развитие, имея минимальный прототип или иногда только идею продукта, но в нашей стране это не очень-то работает.
Все остальные «способы» существования open-source проекта наподобие пожертвований (donate) пользователей не очень работают, что, например, хорошо демонстрирует история с OpenSSL, когда денег, собираемых с помощью пожертвований, не хватало даже на зарплату двух разработчиков, что в конечном счете вылилось в критическую уязвимость Heartbleed.
Откуда возникла идея
Пару лет назад я делал попытку открыть свое дело в несвязанной с IT отрасли, но по разным причинам оно не пошло. Всем известно, что даже самая маленькая компания в нашей стране по закону обязана вести бухгалтерский учет и моя компания не была исключением. Бухгалтерию я решил для целей самообразования вести сам. Я заранее узнал у знакомого бухгалтера какие бухгалтерские программы программы могут подойти для только что открывшейся фирмы по соотношению цена — функциональность.
Со слов бухгалтера хорошим кандидатом была самая простая версия 1С.Упрощенка, стоимостью что-то около 3000 рублей. Я конечно же в итоге купил именно её, но перед этим смотрел и на альтернативные варианты. Из коробочных продуктов, ничего толкового за те же деньги тогда найти не удалось (хотя сейчас мне кажется, что я недостаточно хорошо искал), но зато я рассматривал и облачные решения для малых предприятий (наподобие Моё дело или Контур.Бухгалтерия), набиравшие тогда популярность. Облако меня не устроило минимум по двум причинам:
- Нельзя было в какой-то момент отказаться от облака и пересесть на другой популярный коробочный продукт, т.к. не было функции экспорта данных из сервисов. Кажется, что такой функции нет до сих пор.
- Я знаю как устроены облака и Интернет в целом, сколько каждую неделю находится уязвимостей и как долго они исправляются на серверах. Поэтому я не очень верю в безопасность таких важных данных как бухгалтерия компании, когда они доступны онлайн.
Таким образом, я и стал владельцем лицензии на 1С.Упрощенка. Я не буду подробно описывать свой не очень приятный опыт общения с 1С, тем более, что многие из недостатков этой программы уже были недавно описаны в статье. Меня в первую очередь смущает несколько вещей:
- Отсутствие модульности в системе. Род деятельности моей организации требовал наличия лишь нескольких базовых модулей — Базовая работа с проводками, Банк и Касса, Учет сотрудников и Отчёты. При этом я «в довесок» получаю еще кучу лишних модулей наподобие Производство, Склад и Нематериальные активы. Эти модули отвлекают внимание от действительно нужных мне задач, т.к. интерфейс получается очень перегруженным. Я не против, если база данных будет содержать немного больше таблиц, чем требуется, но я не согласен, если такое же происходит с интерфейсом.
- Скорость работы. По-большому счету 1С.Упрощенка стоит так недорого, потому что с технологической точки зрения является приветом из 90-х. Основной движок написан на C++, что само по себе не плохо, но может приводить к неожиданным падениям приложения из-за ошибок инициализации памяти, что я неоднократно наблюдал со своей копией. Кроме того в качестве хранилища используется т.н. «встроенная база данных» — проприетарный и довольно плохо документированный бинарный формат хранения данных, написанный разработчиками 1С. В этом формате все данные хранятся в одном файле, что не добавляет базе данных скорости.
- Непрозрачность обновлений. Об этом уже подробно рассказывалось в указанной выше статье, но у меня есть несколько своих претензий к обновлениям. Во-первых, частые изменения интерфейса — за год, что я пользовался 1С после обновлений расположение элементов интерфейса кардинально менялось минимум 2 раза. Во-вторых, очень большое время применения обновлений — от получаса до 2 часов на очень маленькой базе данных (не больше сотни платежек и пару сотрудников). Вероятно, это связано со спецификой работы файловой базы данных, но тем не менее мне непонятно, что может так сильно меняться каждые 2 недели. Я не удивился, если бы менялся код самого 1С, но вот почему миграции базы данных идут так долго мне непонятно. В-третьих, наличие большого количества багов в системе — чуть ли не каждое второе обновление в списке изменений содержит только строчку «исправлены ошибки предыдущих версий». Вообще сложилось впечатление, как будто разработчики 1С проводят на владельцах базовых версий программы бета-тестирование, т.к. насколько я понимаю автоматического тестирования на платформе 1С не было до последних версий.
- Нестандартные технологии. Поскольку 1С ведет свою историю из 90-х годов, то он тащит за собой собственный нестандартный набор технологий — собственный язык программирования, собственную среду разработки, собственный отладчик и так далее. Чтобы поменять что-то в коде 1С нужно с нуля изучать новый язык со своими подводными камнями, что уменьшает число компетентных специалистов, которые могут потенциально поучаствовать в разработке платформы, хотя 1С и борется с этим, устраивая различные учебные семинары и конкурсы. В любом случае скорость работы и оптимизации языка, на мой взгляд, не могут сравниться с другими мейнстрим языками наподобие Java или C#.
- Работает только под Windows. Думаю, что не ошибусь, если скажу, что от этого грущу не только я. Моя основная операционная система — это Mac OS X, но также я часто работаю с Linux, а вот платить за лицензию для Windows мне вовсе не хочется. Текущее решение — это запускать под Virtualbox виртуальную машину с Windows, внутри которой стоит 1С. Слышал также о решениях, на основе Wine@Etersoft, но за нее опять же нужно платить, поэтому в сумме стоимость даже базовой версии 1С может возрасти до 6-8 тысяч рублей, если приплюсовать лицензию на Windows.
Пора действовать
Это и многое другое заставляло меня грустить тёмными вечерами перед экраном с 1С. В конце концов я решил попробовать написать платформу, которая не обладала бы недостатками 1С, и, возможно, в перспективе написать на ней какую-нибудь альтернативу 1С. Вот как выглядит мой стек технологий:
- Java. Тут долго ничего объяснять не нужно. Выбор Java в качестве основного языка программирования и JVM в качестве рантайма решает проблемы с переносимостью программ на разные платформы. Кроме того под Java есть несколько первоклассных сред разработки (привет, Jetbrains!) и нет проблемы с обучением разработчиков. Поскольку продукт разрабатывается с нуля, то можно сразу же писать на Java 8 и прикладывать правильную JRE к дистрибутиву.
- JavaFX. Это достаточно новая технология для построения UI приложения, разрабатываемая компанией Oracle. Она позиционируется как замена устаревшему Swing, позволяет отделить представление интерфейсов (XML файлы) от логики работы (Java классы) и поддерживает стилизацию при помощи CSS. Уже имеются средства разработки приложений на JavaFX наподобие SceneBuilder и ScenicView. А кроме того JavaFX приложения можно запускать и как веб-приложения (хотя не уверен насколько это удобно и быстро).
- PostgreSQL. Для бухгалтерии и бизнеса, на мой взгляд, лучше подходят реляционные базы данных, поскольку они из коробки обеспечивают целостность данных, а сами данные как правило хорошо ложатся на табличную структуру. PostgreSQL в этой роли является одним из лидеров среди бесплатных реляционных баз данных, поэтому о нём ведутся серьезные разговоры даже в качестве замены баз данных от Oracle в государственных органах.
- Spring Framework. Было бы удивительно, если бы я не выбрал Spring в качестве основного фреймворка для написания приложения. Кроме того, что Spring — это отличный IoC контейнер для приложения, он представляет целую экосистему библиотек для работы с различными базами данных, а также дает из коробки такие штуки, как декларативное управление транзакциями БД и декларативное описание ролей.
- Spring Data + Hibernate JPA. Логику работы с базой данных кажется удобнее всего сделать при помощи Spring Data, т.к. во многих случаях не нужно писать запросы к базе (они генерируются по имени метода). Hibernate используется лишь как надежная реализация JPA в связке со Spring Data.
- Apache Camel. Для обеспечения масштабируемости решения имеет смысл сразу же закладываться на применение enterprise integration patterns и логики, основанной на передаче сообщений. Если речь идет о копии приложения, расположенной на одной машине с базой данных, то все будет сводиться к формированию очередей сообщений в памяти приложения. Однако, если сразу закладываться на такой подход на малых масштабах, то при росте числа потребителей приложения можно будет легко перейти на использование удаленных серверов очередей (наподобие Apache ActiveMQ или ZeroMQ).
- Stecker. Эту штуку для поддержки модульности в системе я написал сам, посмотрев, как оно сделано в популярной CI-системе Jenkins и немного почитав про OSGI.
- JUnit и набор матчеров для JavaFX. Для написания тестов лучшим выбором является JUnit и набор дополнительных инструментов для написания тестов для JavaFX. Примером такого инструмента является TestFX.
В общем, как вы понимаете, на проведение экспериментов и выбор технологий тоже требуется время, особенно, если все это делается по вечерам и в выходные дни, поэтому непосредственно до написания кода приложения я дошел месяца два назад. Что удалось сделать на данный момент:
- Написано базовое JavaFX приложение (даже имеет небольшую заставку при загрузке)
- Создана схема базы данных, годная для базовой бухгалтерии
- Произведен импорт классификаторов наподобие ОКВЭД, КБК, ОКСМ, ОКФС, ОКОГУ, ОКТМО и т.п. в базу данных. Заодно написал клиента для базы данных адресов ФИАС.
- Приложение умеет автоматически встраивать UI, определенный в плагинах в основное приложение. Поддерживается режим разработки UI, в котором изменение FXML файла с описанием UI приводит к обновлению UI приложения на горячую (без перезагрузки приложения).
- Поддерживается загрузка из плагинов классов, требуемых для работы с базой данных (JPA entities, Spring Data repositories).
Семь раз отмерь — один раз отрежь
Как вы уже, наверное, поняли, я поставил перед собой довольно большую (быть может даже слишком большую) задачу — написать, нечто, что бы могло бы полностью заменить 1С для небольших предприятий, но при этом:
- Не обладало бы недостатками 1С, перечисленными выше
- Имело бы открытый исходный код
- Имело бы понятную модель монетизации
- Позволяло бы зарабатывать на этом сторонним разработчикам
Как я себе вижу решение этих задач:
- Недостатки 1С нивелируются при помощи правильного стека технологий, о котором я говорил выше, а также правильного подхода к разработке, основанного на повсеместном применении CI и покрытии критических частей системы автоматическими тестами
- Ядро системы и ключевые библиотеки публикуются под свободной, но НЕ копилефтной лицензией (например, Apache License 2.0) на Гитхабе.
- Приложение распространяется следующим образом: набор основных бухгалтерских модулей наподобие банка или работы с персоналом бесплатен для всех, а вот специализированные модули вроде подготовки отчетности или производства также имеют открытый исходный код, но при этом продаются по подписке за разумные деньги. Подписка идет раз в год на обновления, т.е. если отказаться от подписки, то программа не перестанет работать, но со временем может отстать от изменений в законодательстве, могут измениться формы документов и т.п. Каждый пользователь имеет право выбрать себе подписку на произвольный набор модулей в соответствии с его потребностями. Таким образом не нужно платить за лишнюю функциональность сразу и купить ее, когда она понадобится.
- Поскольку весь стек технологий является открытым, то ничто не мешает другим разработчикам писать собственные модули и продавать их по подписке. При этом становится доступна услуга проверки кода сторонних модулей разработчиками ядра системы, которая делается за разумную плату.
Ясно, что начинать нужно с минимально работающего прототипа. Я считаю, что минимальный прототип должен содержать следующие бухгалтерские модули:
- Рабочий стол (стартовый экран системы)
- Модуль работы с проводками (план счетов, ручные проводки)
- Модуль работы с банком (обмен с банком в формате 1С, создание платежных поручений и требований, банковские выписки)
- Модуль формирования отчетности (самые базовые отчеты типа АДВ, РСВ, форм 4-ФСС и 4а-ФСС, отчет по НДФЛ, отчет в Росстат)
- Зарплата и кадры (начисление зарплаты, формирование платежек на взносы в ФСС и ПФР, вычеты)
- Данные об организации (хранение различных кодов: ОГРН, ИНН, КПП, а также данных о руководителях и учетной политике)
- Импорт данных (скорее всего в формате XML из 1C)
Недавно я дошел до реализации бухгалтерской функциональности в приложении и тут посмотрел ту самую лекцию Аркадия Морейниса. Эта лекция очень здравая и соответствует тому, что я читал и слышал до этого, поэтому решил перепроверить какие еще бухгалтерские программы могут быть использованы небольшими компаниями. Выяснилось, что на самом деле бухгалтерских программ существует множество и от разных разработчиков. Безусловно, сюда не попадают гиганты наподобие SAP или Oracle из-за своей высокой стоимости. Серьезными настольными программами можно считать следующие:
Все они работают только под Windows, но при этом 1C имеет клиента для Linux. Кроме этих поддерживаемых и более менее обновляемых решений существует огромная масса маленьких неподдерживаемых программ от разных производителей. Мне очень не хочется становиться еще одной такой программой, поэтому я не совсем уверен смогу ли я, решив описанные выше проблемы 1С, составить перечисленным компаниям хоть какую-то конкуренцию, т.к., очевидно, что это очень конкурентный рынок. Кроме того, если следовать логике Аркадия Морейниса, то лезть на такой перенаселенный рынок не стоит, а следует искать свою нишу, что правильно. В связи с этим у меня есть большие сомнения нужно ли мне продолжать делать бухгалтерию или следует переключиться на что-нибудь другое?
Если не выходить за рамки прикладных бизнес-решений, то я вижу еще пару-тройку возможных идей:
- Система управления складом (WMS). Таких систем сильно меньше и много самописных решений. Они проще в реализации, и, на мой взгляд, меньше подвержены переписыванию из-за изменений в законодательстве.
- Система управления цепочками поставок (SCM). Эта тема популярна в Европе уже лет 10-15 и постоянно появляются новые решения, оптимизирующие логистику и поставки товаров.
- Различные специализированные программы для патентных отделов или для HR менеджеров.
Очень не хочется, чтобы мой труд пропал зря. Кому интересно посмотреть текущую версию кода без документации и комментариев, можно покликать тут. Спасибо всем, кто дочитал до конца!
Автор: vaniaPooh