
Я уже несколько месяцев в свободное время занимаюсь созданием open-source фреймворка для написания настольных приложений преимущественно бизнес-направленности (ERP, WMS, CRM и т.п.). Вдохновившись прочтением статьи о проверке бизнес идей [1], хотелось бы изложить некоторые свои мысли обо всей этой затее и услышать ваши отзывы. Что бы я хотел услышать от вас:
- Что вы думаете о реальности этой идеи?
- Быть может у вас есть какие-нибудь другие идеи, которые не жалко отдать в open-source?
- Любые другие отзывы и комментарии
Open-source проекты тоже требуют денег
Сама по себе идея open-source выглядит очень привлекательной, когда вы выступаете в качестве пользователя продукта:
- Многие open-source продукты полностью бесплатны или имеют бесплатную базовую версию.
- Если проект находится в стадии активной разработки, то шансы быстро получить бесплатную поддержку при возникновении проблем также весьма велики.
- Если open-source проект достаточно зрелый, то с большой вероятностью вы сможете найти ответы на большинство возникающих вопросов, так как обсуждение таких проблем также ведется открыто на различных ресурсах наподобие Google Groups [2] или StackOverflow [3].
Если же теперь посмотреть на open-source с точки зрения участников команды проекта, то окажется, что все указанные выше преимущества требуют постоянного труда участников проекта:
- Много времени уходит на написание, отладку и тестирование нового кода, выпуск релизов и так далее.
- Еще больше времени тратится на поддержку пользователей продукта. Пользователи хотят получать правильные ответы на свои вопросы быстро, но при этом часто не утруждают себя тем, чтобы поискать, задавал ли кто-нибудь уже подобный вопрос. Это порождает множество одинаковых вопросов и тратит много времени даже на ответы типа «уже было, посмотри по этой ссылке».
Что я хотел донести, написав эти довольно очевидные вещи? Очень простую мысль — для того, чтобы open-source продукт был качественным и активно развивался, он все же должен неплохо финансироваться, вот почему большинство крупных open-source библиотек, фреймворков и программ развиваются одним из следующих способов:
- Разрабатываются под внутренние нужды коммерческих компаний (имеющих другие источники дохода) и потом полнофункциональная бесплатная версия выкладывается в открытый доступ.
- Разрабатывается бесплатная базовая версия продукта и расширенный набор функциональности, продаваемый за деньги. Иногда речь идет только о платной технической поддержке бесплатного, но сложного в освоении продукта. В некоторых случаях за деньги в приоритетном режиме могут дописываться фичи по требованию заказчика.
- В Америке также возможен вариант стартапа, который быстро получает деньги на развитие, имея минимальный прототип или иногда только идею продукта, но в нашей стране это не очень-то работает.
Все остальные «способы» существования open-source проекта наподобие пожертвований (donate) пользователей не очень работают, что, например, хорошо демонстрирует история с OpenSSL [4], когда денег, собираемых с помощью пожертвований, не хватало даже на зарплату двух разработчиков, что в конечном счете вылилось в критическую уязвимость Heartbleed [5].
Откуда возникла идея

Пару лет назад я делал попытку открыть свое дело в несвязанной с IT отрасли, но по разным причинам оно не пошло. Всем известно, что даже самая маленькая компания в нашей стране по закону обязана вести бухгалтерский учет и моя компания не была исключением. Бухгалтерию я решил для целей самообразования вести сам. Я заранее узнал у знакомого бухгалтера какие бухгалтерские программы программы могут подойти для только что открывшейся фирмы по соотношению цена — функциональность.
Со слов бухгалтера хорошим кандидатом была самая простая версия 1С.Упрощенка [6], стоимостью что-то около 3000 рублей. Я конечно же в итоге купил именно её, но перед этим смотрел и на альтернативные варианты. Из коробочных продуктов, ничего толкового за те же деньги тогда найти не удалось (хотя сейчас мне кажется, что я недостаточно хорошо искал), но зато я рассматривал и облачные решения для малых предприятий (наподобие Моё дело [7] или Контур.Бухгалтерия [8]), набиравшие тогда популярность. Облако меня не устроило минимум по двум причинам:
- Нельзя было в какой-то момент отказаться от облака и пересесть на другой популярный коробочный продукт, т.к. не было функции экспорта данных из сервисов. Кажется, что такой функции нет до сих пор.
- Я знаю как устроены облака и Интернет в целом, сколько каждую неделю находится уязвимостей и как долго они исправляются на серверах. Поэтому я не очень верю в безопасность таких важных данных как бухгалтерия компании, когда они доступны онлайн.
Таким образом, я и стал владельцем лицензии на 1С.Упрощенка. Я не буду подробно описывать свой не очень приятный опыт общения с 1С, тем более, что многие из недостатков этой программы уже были недавно описаны в статье [9]. Меня в первую очередь смущает несколько вещей:
- Отсутствие модульности в системе. Род деятельности моей организации требовал наличия лишь нескольких базовых модулей — Базовая работа с проводками, Банк и Касса, Учет сотрудников и Отчёты. При этом я «в довесок» получаю еще кучу лишних модулей наподобие Производство, Склад и Нематериальные активы. Эти модули отвлекают внимание от действительно нужных мне задач, т.к. интерфейс получается очень перегруженным. Я не против, если база данных будет содержать немного больше таблиц, чем требуется, но я не согласен, если такое же происходит с интерфейсом.
- Скорость работы. По-большому счету 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 [10], но за нее опять же нужно платить, поэтому в сумме стоимость даже базовой версии 1С может возрасти до 6-8 тысяч рублей, если приплюсовать лицензию на Windows.
Пора действовать

Это и многое другое заставляло меня грустить тёмными вечерами перед экраном с 1С. В конце концов я решил попробовать написать платформу, которая не обладала бы недостатками 1С, и, возможно, в перспективе написать на ней какую-нибудь альтернативу 1С. Вот как выглядит мой стек технологий:
- Java. Тут долго ничего объяснять не нужно. Выбор Java в качестве основного языка программирования и JVM в качестве рантайма решает проблемы с переносимостью программ на разные платформы. Кроме того под Java есть несколько первоклассных сред разработки (привет, Jetbrains!) и нет проблемы с обучением разработчиков. Поскольку продукт разрабатывается с нуля, то можно сразу же писать на Java 8 и прикладывать правильную JRE к дистрибутиву.
- JavaFX [11]. Это достаточно новая технология для построения UI приложения, разрабатываемая компанией Oracle. Она позиционируется как замена устаревшему Swing, позволяет отделить представление интерфейсов (XML файлы) от логики работы (Java классы) и поддерживает стилизацию при помощи CSS. Уже имеются средства разработки приложений на JavaFX наподобие SceneBuilder [12] и ScenicView [13]. А кроме того JavaFX приложения можно запускать и как веб-приложения (хотя не уверен насколько это удобно и быстро).
- PostgreSQL. Для бухгалтерии и бизнеса, на мой взгляд, лучше подходят реляционные базы данных, поскольку они из коробки обеспечивают целостность данных, а сами данные как правило хорошо ложатся на табличную структуру. PostgreSQL в этой роли является одним из лидеров среди бесплатных реляционных баз данных, поэтому о нём ведутся серьезные разговоры даже в качестве замены баз данных от Oracle в государственных органах.
- Spring Framework. Было бы удивительно, если бы я не выбрал Spring в качестве основного фреймворка для написания приложения. Кроме того, что Spring — это отличный IoC контейнер для приложения, он представляет целую экосистему библиотек для работы с различными базами данных, а также дает из коробки такие штуки, как декларативное управление транзакциями БД и декларативное описание ролей.
- Spring Data + Hibernate JPA. Логику работы с базой данных кажется удобнее всего сделать при помощи Spring Data [14], т.к. во многих случаях не нужно писать запросы к базе (они генерируются по имени метода). Hibernate [15] используется лишь как надежная реализация JPA в связке со Spring Data.
- Apache Camel. Для обеспечения масштабируемости решения имеет смысл сразу же закладываться на применение enterprise integration patterns [16] и логики, основанной на передаче сообщений. Если речь идет о копии приложения, расположенной на одной машине с базой данных, то все будет сводиться к формированию очередей сообщений в памяти приложения. Однако, если сразу закладываться на такой подход на малых масштабах, то при росте числа потребителей приложения можно будет легко перейти на использование удаленных серверов очередей (наподобие Apache ActiveMQ [17] или ZeroMQ [18]).
- Stecker. Эту штуку [19] для поддержки модульности в системе я написал сам, посмотрев, как оно сделано в популярной CI-системе Jenkins [20] и немного почитав про OSGI [21].
- JUnit и набор матчеров для JavaFX. Для написания тестов лучшим выбором является JUnit и набор дополнительных инструментов для написания тестов для JavaFX. Примером такого инструмента является TestFX [22].
В общем, как вы понимаете, на проведение экспериментов и выбор технологий тоже требуется время, особенно, если все это делается по вечерам и в выходные дни, поэтому непосредственно до написания кода приложения я дошел месяца два назад. Что удалось сделать на данный момент:
- Написано базовое JavaFX приложение (даже имеет небольшую заставку при загрузке)
- Создана схема базы данных, годная для базовой бухгалтерии
- Произведен импорт классификаторов наподобие ОКВЭД, КБК, ОКСМ, ОКФС, ОКОГУ, ОКТМО и т.п. в базу данных. Заодно написал клиента [23] для базы данных адресов ФИАС [24].
- Приложение умеет автоматически встраивать UI, определенный в плагинах в основное приложение. Поддерживается режим разработки UI, в котором изменение FXML файла с описанием UI приводит к обновлению UI приложения на горячую (без перезагрузки приложения).
- Поддерживается загрузка из плагинов классов, требуемых для работы с базой данных (JPA entities, Spring Data repositories).
Семь раз отмерь — один раз отрежь

Как вы уже, наверное, поняли, я поставил перед собой довольно большую (быть может даже слишком большую) задачу — написать, нечто, что бы могло бы полностью заменить 1С для небольших предприятий, но при этом:
- Не обладало бы недостатками 1С, перечисленными выше
- Имело бы открытый исходный код
- Имело бы понятную модель монетизации
- Позволяло бы зарабатывать на этом сторонним разработчикам
Как я себе вижу решение этих задач:
- Недостатки 1С нивелируются при помощи правильного стека технологий, о котором я говорил выше, а также правильного подхода к разработке, основанного на повсеместном применении CI и покрытии критических частей системы автоматическими тестами
- Ядро системы и ключевые библиотеки публикуются под свободной, но НЕ копилефтной лицензией (например, Apache License 2.0) на Гитхабе.
- Приложение распространяется следующим образом: набор основных бухгалтерских модулей наподобие банка или работы с персоналом бесплатен для всех, а вот специализированные модули вроде подготовки отчетности или производства также имеют открытый исходный код, но при этом продаются по подписке за разумные деньги. Подписка идет раз в год на обновления, т.е. если отказаться от подписки, то программа не перестанет работать, но со временем может отстать от изменений в законодательстве, могут измениться формы документов и т.п. Каждый пользователь имеет право выбрать себе подписку на произвольный набор модулей в соответствии с его потребностями. Таким образом не нужно платить за лишнюю функциональность сразу и купить ее, когда она понадобится.
- Поскольку весь стек технологий является открытым, то ничто не мешает другим разработчикам писать собственные модули и продавать их по подписке. При этом становится доступна услуга проверки кода сторонних модулей разработчиками ядра системы, которая делается за разумную плату.
Ясно, что начинать нужно с минимально работающего прототипа. Я считаю, что минимальный прототип должен содержать следующие бухгалтерские модули:
- Рабочий стол (стартовый экран системы)
- Модуль работы с проводками (план счетов, ручные проводки)
- Модуль работы с банком (обмен с банком в формате 1С, создание платежных поручений и требований, банковские выписки)
- Модуль формирования отчетности (самые базовые отчеты типа АДВ, РСВ, форм 4-ФСС и 4а-ФСС, отчет по НДФЛ, отчет в Росстат)
- Зарплата и кадры (начисление зарплаты, формирование платежек на взносы в ФСС и ПФР, вычеты)
- Данные об организации (хранение различных кодов: ОГРН, ИНН, КПП, а также данных о руководителях и учетной политике)
- Импорт данных (скорее всего в формате XML из 1C)
Недавно я дошел до реализации бухгалтерской функциональности в приложении и тут посмотрел ту самую лекцию Аркадия Морейниса [1]. Эта лекция очень здравая и соответствует тому, что я читал и слышал до этого, поэтому решил перепроверить какие еще бухгалтерские программы могут быть использованы небольшими компаниями. Выяснилось, что на самом деле бухгалтерских программ существует множество и от разных разработчиков. Безусловно, сюда не попадают гиганты наподобие SAP или Oracle из-за своей высокой стоимости. Серьезными настольными программами можно считать следующие:
- 1C [25]
- Buhsoft [26]
- Парус [27]
- БЭСТ [28]
- Инфо-Бухгалтер [29]
Все они работают только под Windows, но при этом 1C имеет клиента для Linux. Кроме этих поддерживаемых и более менее обновляемых решений существует огромная масса маленьких неподдерживаемых программ от разных производителей. Мне очень не хочется становиться еще одной такой программой, поэтому я не совсем уверен смогу ли я, решив описанные выше проблемы 1С, составить перечисленным компаниям хоть какую-то конкуренцию, т.к., очевидно, что это очень конкурентный рынок. Кроме того, если следовать логике Аркадия Морейниса, то лезть на такой перенаселенный рынок не стоит, а следует искать свою нишу, что правильно. В связи с этим у меня есть большие сомнения нужно ли мне продолжать делать бухгалтерию или следует переключиться на что-нибудь другое?
Если не выходить за рамки прикладных бизнес-решений, то я вижу еще пару-тройку возможных идей:
- Система управления складом (WMS) [30]. Таких систем сильно меньше и много самописных решений. Они проще в реализации, и, на мой взгляд, меньше подвержены переписыванию из-за изменений в законодательстве.
- Система управления цепочками поставок (SCM) [31]. Эта тема популярна в Европе уже лет 10-15 и постоянно появляются новые решения, оптимизирующие логистику и поставки товаров.
- Различные специализированные программы для патентных отделов или для HR менеджеров.
Очень не хочется, чтобы мой труд пропал зря. Кому интересно посмотреть текущую версию кода без документации и комментариев, можно покликать тут [32]. Спасибо всем, кто дочитал до конца!
Автор: vaniaPooh
Источник [33]