1Script або Як я почав open-source проект


Теза про те, що 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.1 x
  • Середовище розробки — VS 2013-2015
  • Ім'я інтерпретатора — oscript.exe (запуск на виконання — oscript <your file->)
  • Розширення файлу скрипта — .os
  • Розширення файлу пакету — .ospx
  • Продуктивність коду — в більшості вимірів до 4-х разів швидше оригінальної платформи 1С. Як мінімум, не повільніше її.
  • Репозиторій движка — github.com/EvilBeaver/OneScript
  • Репозиторій бібліотеки — github.com/EvilBeaver/oscript-library
Сайт проекту не пишу, по-перше, щоб не звучало, як піар, а по-друге, він просто не винесе хабраэффекта.

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

  • Дерзайте! Якщо ви будете тримати свій проект в столі і нікому про нього не розповідати, то про нього ніхто і не дізнається. Почніть зі статті на Хабр. В одній статті буде недостатньо. Згадуйте свій проект у форумах, присвячених предметної області вашого проекту, наводьте приклади вдалого застосування.
  • Будьте готові до того, що пропозицій від людей багато, а реальних комітів — сильно менше. Підхід в стилі «Це open-source, тобі треба, ти й зроби», на жаль, не прокотить.
  • Заздалегідь продумайте рішення «проблеми зростання». Зростання, як правило, вибуховий і впоратися з різко зрослим пулом завдань досить складно.
  • Автоматизуйте все що можна з самого початку — тестування, збирання, публікацію версій, документування. Ці речі простіше всього відкласти на потім, але «потім» вже не буде часу все це автоматизувати.
  • Залучайте контриб'юторів. Внесок у проект-це не тільки код. Найчастіше це навіть просто ідеї. Запитуйте: «як краще зробити це», «як могло б виглядати ось це». Вам підкажуть. І цілком ймовірно — допоможуть.
  • Вирощувати проект — неймовірно круто. Не соромтеся, діліться своєю роботою, отримуйте задоволення від процесу!


Спасибі, що дочитали до кінця! :)
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.