1Script или Как я начал open-source проект

f2562f0b74d14d338c7b8ff75fae580d.jpg
Тезис о том, что open-source создается гиками-энтузиастами в наше время несколько утратил актуальность. Тем не менее, идеология открытого кода родилась именно так. Классные программы, написанные ночью, бородатыми (и не очень) чудиками, бескорыстно, просто, чтобы сделать мир лучше — изменили мир разработки ПО.

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

Однажды, мне в голову упала идея проекта. Идея была чисто исследовательской и я не собирался делать из этого некий «продукт». Кроме того, я раньше не вел проектов в открытом доступе и мне очень хотелось попробовать, как это вообще происходит. Что из этого получилось — под катом.
В самом начале жизненного пути проекта я уже писал про него на Хабре. Тогда это были первые шаги, код был сырым, но он работал. Мне хотелось, чтобы проект вызвал интерес со стороны других авторов, поскольку в одиночку я его явно бы не потянул и вообще, забросил. В принципе, так бы и вышло, если бы я не получил свой первый pull-request от незнакомого человека. Но обо всем по порядку…


Я сделал собственную реализацию стековой машины, исполняющей скрипты на языке 1С: Предприятие. Или, если проще — открытый интерпретатор языка 1С и открытую же реализацию некоторых стандартных классов 1С. При этом, ставилась четкая прикладная цель проекта — дать 1С-никам инструмент скриптовой автоматизации, который легко будет изучить. Проект был назван 1Script.

И вот, проект опубликован на хабре и на профильном 1С-овском портале infostart.ru. Жду обратную связь. Первый отклик получил на мисте и от души посмеялся. Топик на форуме назывался «Интерпретатор 1С на хабре. Давайте зачмырим?» На мисте много добрых людей, я порадовался:)

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


Спустя примерно два месяца после публикации на меня вышел Сергей Батанов (Серега, привет!:) — заметный чувак в сообществе 1С-ников, который предложил свою помощь в развитии стандартной библиотеки. Это был 1С-овский класс «ТаблицаЗначений». Разумеется, я согласился. А когда я увидел реальный код, который прислал Сергей, я радовался, как ребенок, правда. В Интернетах часто бывает, когда кто-то что-то предлагает на словах, но до дела часто не доходит. А тут — реальный живой код, который работает, который полностью адекватный, который можно вставить в проект!

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

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

Дальше-больше


Спустя какое-то время, мне написал Александр Кунташов, с вопросом об интеграции 1Script и проекта Снегопат (www.snegopat.ru). Кто не знает — это такой решарпер для 1С. В нем можно делать скриптовые плагины к Конфигуратору 1С и есть целое сообщество авторов подобных плагинов.
Плагины эти писались на JavaScript, в связи с чем требовали квалификации, выходящей за рамки стандартного программиста 1С. Из-за этого, в конечном итоге, тормозилось и развитие экосистемы плагинов. Число людей, желающих улучшить Конфигуратор, примерно равно общему числу 1С-ников, однако, необходимость изучения JavaScript отпугивает авторов потенциальных шедевров.

Я, опять же, дико обрадовался востребованности своего детища, выпросил у автора дистрибутив Снегопата и стряхнул пыль со своих знаний C++. Пыли оказалось намного больше, чем знаний, но творческий зуд сделал свое дело, и я погрузился в MSDN.

Примерно через месяц, в Конфигураторе 1С стало можно писать плагины прямо на языке 1С, не переключаясь в окно редактора JavaScript. Тогда же были исправлены первые критичные баги движка и существенно пересмотрена внутренняя архитектура.
Я же получил пьянящий восторг от общения с С++, COM, ATL и всем вотэтимвот, после долгих лет работы исключительно с 1С. Ну и еще от того, что сделал нечто полезное, ощутимое для сообщества 1С-ников.


Примерно в это же время (точно уже не помню) проект попал в поле зрения Алексея Лустина (alexey-lustin) (Леха, тебе тоже привет!) — среди 1С-ников человека известного и уважаемого. Это совпало по времени с моим поиском нового места работы. Я присматривал интересные компании на рынке, а Алексей — специалистов под проект Continuos Integration/Continuos Delivery для 1С-ников. Тогда Леша уже видел мой проект (и ник) на хабре, а я уже знал, что некая команда продвинутых 1С-ников в сети делают занятные нестандартные вещи.

В тот момент в сообществе уже были известны такие штуки, как юнит-тестирование, хранение кода 1С в git, BDD+cucumber для 1С и прочее. Самым доступным из этих чуваков мне показался Алексей и я написал ему письмо, где спросил нет ли у того интересной работы. Так я вместе со своим проектом попал в веселую компанию гиков, собравшихся к тому времени в компании, где работал Алексей.

На тот момент движок уже имел минимально необходимый скрипту набор возможностей, и его можно было (как мне казалось) в принципе применить в качестве скриптования сборки и развертывания баз 1С.

Зачем вообще применять для этого новый движок?


Собственно, скриптовых языков мильон, непонятно же, зачем нужен еще один, да еще и неизвестный — спросит читатель хабра — и будет не совсем прав. Стратегически, будущий продукт предназначался для 1С-ников и должен был бы жить переходя от разработчика к разработчику, независимо от кадровых изменений в компании. В сообществе 1С-ников существует объективная проблема: среди них много классных специалистов, но почему-то средний 1С-ник не хочет учить никакой другой язык, после того, как хорошо набил руку в 1С. Я не знаю в чем причина данного явления, наверное в том, что 1С рулит (irony)? Люди приходят в 1С зная Java, С/С++, микроконтроллеры, Delphi, либо не зная ничего, но они часто остаются в 1С и неохотно переходят обратно в свои исходные экосистемы.
Я сейчас предвижу волну гнева, но будьте добры, дослушать тезис до конца. Из любого правила есть исключения, однако, планируя систему, которая должна пережить несколько поколений разработчиков (не биологических, а кадровых поколений, разумеется), то с наибольшей вероятностью вы найдете специалиста, который сможет ее развивать, если она будет написана на 1С. Если это будет питон (или вставьте ваш любимый язык), то вам придется нанимать питонщика, очень хорошо знающего 1С. А после его перехода в большие начальники — вам придется искать еще одного такого же, с компетенциями в области 1С. А если это сразу будет язык 1С, то вам придется найти только 1С-ника, хорошо знающего 1С и этого будет достаточно.
Иными словами, система будет более живучей и сможет развиваться бОльшим количеством спецов, если будет написана на знакомом им всем языке.

Таким образом, стала понятна сфера применения 1Script: это DevOps и подобные задачи для целей 1С проектов.

Первые шишки и правильная разработка


Первый же более-менее большой скрипт, который я написал (до этого были тексты не более ста строк) вызвал падение движка. При определенном сочетании параметров и цепочек вызовов управление передавалось в неизвестное место кода, и приложение падало. Пришлось почти полностью переписать реализацию стека вызовов и обработку исключений. Это был вызов в стиле «Ах ты так! Ну ща я тебя исправлю!» Боевой запал позволил переписать нужные модули за один день и выявить помимо этого еще пару-тройку багов. Код стал выполняться стабильно. Я выпустил новый релиз. Попутно, поскольку я теперь занимался Continuous Integration, пришло осознание, что проекту тоже требуется билд-сервер и автоматизация выпуска релизов. Кроме того, к проекту подключился artbear, известный среди 1С-ников, как корифей и гуру 1С-тестирования. Он сделал мне на базе своего фреймворка xUnitFor1C инструментарий для тестирования движка. Так у меня появились приемочные тесты поведения, написанные также на языке 1С. Я поднял на своем домашнем сервере TeamCity и настроил ночные сборки с прогоном тестов. Попутно, я зарядился энтузиазмом — проект живет и приобретает новых контрибьюторов. Это дико вдохновляло.

За какие-то три-четыре месяца библиотека классов движка обросла, наконец, всем необходимым для большинства задач скриптинга: появились сетевые функции, работа с архивами, XML и прочее. Наш проект по CI для 1С был успешно запущен.

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

В ноябре 2014 года меня пригласили выступить на престижной 1С-овской конференции Infostart Event в Питере. Разумеется, я согласился, а темой выступления взял 1Script. Тему утвердили, что для меня означало, во-первых, факт некоторой известности проекта (т.е. слушатели, вероятно, придут, т.к. хотя бы что-то про это слышали), а во-вторых, я надеялся привлечь контрибьюторов, поскольку времени на развитие движка хватать почти перестало.
Специально для конференции я даже сделал специальную забаву — CGI режим, в котором скрипты можно было запускать под управлением HTTP сервера и формировать HTTP-вывод. Сайты на языке 1С теперь уже не страшный сон хостера, а суровая реальность (шутка).
Выступление на Infostart можно считать первым публичным анонсом, где 1Script уже не стесняясь можно было назвать продуктом, инструментом, способным решать конкретные задачи. Это был уже не эксперимент, а боевой продукт. Хотя еще и в статусе беты.


Как оказалось, наличие в твоем управлении востребованного проекта, даже небольшого — несет в себе немалый такой груз накладных расходов. Для начала, это поток фич. Пожелания приходят намного чаще, чем коммиты, реализующие эти пожелания. Требуется строго учитывать версии, в которых исправлялись те или иные ошибки. Требуется как-то уведомлять пользователей о том, что с версии Х исправлена ошибка или появилась новая возможность. Рост функционала требует документирования, причем документация имеет тенденцию к устареванию.
Ну и самое забавное — требуется техническая инфраструктура собственно «поддержки». Потребовался сайт, генератор документации, сервер сборки/деплоя и прочее и прочее… Потребовались финансовые вложения в инфраструктуру — минимальные, но все-таки вложения.
Начиная исследовательский проект, я даже не предполагал такое количество организационно-технических вопросов, с которыми придется столкнуться при росте проекта. Очень помог в этом плане переход на методику git-flow, стало проще разбираться самому и общаться с пользователями на тему версий и веток.

Опыт краудфандинга (ужасное слово)


В начале этого года я попробовал провести эксперимент — организовал сбор пожертвований на инфраструктуру — доменное имя и хостинг. Мне было интересно, насколько проект сможет окупить собственное существование. Результат был, незнакомые мне люди, действительно, присылали примерно по 100–500 р. чего хватило на оплату доменного имени в зоне .io. Затем, кампания была свернута и поток средств прекратился. До полной окупаемости дело не дошло, хотя, некоторое финансовое подспорье было получено.
Самое главное — натурно был проверен тезис об эффективности модели donation, как таковой. Вывод — в моем случае donation сложно назвать эффективным, хотя и нулевым он не был.

Библиотека полезных скриптов


За полтора года кодинга на 1Script выделились библиотечные блоки, которые можно использовать самому и рекомендовать другим. Естественным путем в моем распоряжении скопился ряд наработок, которые были пригодны к повторному использованию.
Это привело к тому, что в движок была добавлена возможность подключения сторонних «пакетов», написанных также на 1Script. На выходе получился еще один проект, получивший название oscript-library. (https://github.com/EvilBeaver/oscript-library) Эта библиотека, разумеется, также потребовала инфраструктуры, документации, end-user обновлений и прочего. Зато поток контрибьютинга со стороны 1С-ников вырос в разы. Пакеты ведь разрабатываются на уже знакомом языке, а значит можно сразу приносить пользу, портировать уже имеющиеся наработки и т.д. Сообщество »1С-скриптописателей» начало расти, чему в немалой степени поспособствовал уже второй доклад на Infostart Event в 2015 г.

Как это выглядит


Для импорта используется специальная директива препроцессора #Использовать (#Use) Ее нет в оригинальной платформе 1С, но для простоты импорта библиотек пришлось отойти от канонического синтаксиса и позаимствовать решение в других экосистемах.

#Использовать json

// класс ЧтениеJSON объявлен в библиотеке и доступен благодаря директиве #Использовать
ОбъектЧтения = Новый ЧтениеJSON();
// дальше идет какой-то код
// ...


Конкретное решение вырабатывалось уже коллективом авторов, продумывались сценарии применения, подводные камни и пр. В качестве инструмента для «мозгоштурма» был использован Google Docs.

Пакетный менеджер


Для управления пакетами был на коленке написан простенький пакетный менеджер, получивший название OPM (OneScript Package Manager). Он также написан на 1Script и представляет собой консольную утилиту управления пакетами. В данный момент идет переосмысление инфраструктуры пакетов и работа над production-ready версией opm.
На сегодняшний момент 1Script это стабильный, успешно применяемый в десятках компаний инструмент автоматизации для 1С-ников. Кроме того, OneScript это уже своего рода бренд, это название известно в сообществе, инструмент активно применяют, пишут, задают вопросы, обсуждают и, что особенно приятно — дорабатывают.
Кроме того, практически неотъемлемой частью проекта является библиотека пакетов повторно используемого кода. Она небольшая, но покрывает значительную часть задач, ежедневно решаемых типовым 1С-ником.
Это уже не просто «интерпретатор 1С». Сообществом была создана экосистема полезных и востребованных инструментов.
Для меня же это был уникальный опыт, я получил слова (и дела) поддержки от десятков незнакомых (и теперь уже знакомых) мне людей. Программа, которую я начал исключительно для того «чтобы попробовать» превратилась в работающий проект, используемый в реальных боевых задачах. Кроме того, получен огромный опыт управления таким вот open-source проектом — поддержка, сопровождение, инфраструктура и т.д…
Ну и самое главное — получено удовольствие от того, что делаешь нечто нужное.

Что планируем сделать дальше


Активное применение библиотеки пакетов выявило ряд недочетов и неудобств. Планируем внести коррективы в инфраструктуру пакетов и расширить функционал пакетного менеджера. Также планируем расширять набор библиотек, например, сейчас идет работа над оберткой для Docker API. Мы управляем docker-контейнерами с помощью скриптов на 1С и наработки по этой теме, вероятно, также будут опубликованы, когда будут доведены до ума. В результате будет получен упрощенный DSL для манипуляции контейнерами из сценария 1script.

Техническая сводка


  • Язык программирования — C#, .NET v4.0/Mono 3.1x
  • Среда разработки — VS 2013–2015
  • Имя интерпретатора — oscript.exe (запуск на выполнение — oscript )
  • Расширение файла скрипта — .os
  • Расширение файла пакета — .ospx
  • Производительность кода — в большинстве замеров до 4-х раз быстрее оригинальной платформы 1С. Как минимум, не медленнее ее.
  • Репозиторий движка — github.com/EvilBeaver/OneScript
  • Репозиторий библиотеки — github.com/EvilBeaver/oscript-library


Сайт проекта не пишу, во-первых, чтобы не звучало, как пиар, а во-вторых, он просто не вынесет хабраэффекта.

Советы начинающим экспериментаторам


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

  • Дерзайте! Если вы будете держать свой проект в столе и никому о нем не рассказывать, то о нем никто и не узнает. Начните со статьи на Хабр. Одной статьи будет недостаточно. Упоминайте свой проект в форумах, посвященных предметной области вашего проекта, приводите примеры удачного применения.
  • Будьте готовы к тому, что предложений от людей много, а реальных коммитов — сильно меньше. Подход в стиле «Это open-source, тебе надо, ты и сделай», к сожалению, не прокатит.
  • Заранее продумайте решение «проблемы роста». Рост, как правило, взрывной и справиться с резко возросшим пулом задач довольно сложно.
  • Автоматизируйте все что можно с самого начала — тестирование, сборку, публикацию версий, документирование. Эти вещи проще всего отложить на потом, но «потом» уже не будет времени все это автоматизировать.
  • Привлекайте контрибьюторов. Вклад в проект это не только код. Зачастую это даже просто идеи. Спрашивайте: «как лучше сделать это», «как могло бы выглядеть вот это». Вам подскажут. И вполне вероятно — помогут.
  • Выращивать проект — невероятно круто. Не стесняйтесь, делитесь своей работой, получайте удовольствие от процесса!

Спасибо, что дочитали до конца! :)

© Habrahabr.ru