А вместо буржуйского Энтера, батенька, теперь будет наш, пролетарский Ввод
А вместо буржуйского Энтера, батенька, теперь будет наш, пролетарский Ввод

На заре проникновения компьютеров из больших кондиционированных залов, где священнодействовали белохалатные жрецы, в залы поменьше и погрязнее, а то и вовсе в личные спальни, возникла вполне логичная идея «Программирование — вторая грамотность». Предполагалось, что если персональная ЭВМ стоит у вас дома, то и заниматься ею придется вам лично, решая с ее помощью свои мелкие или, наоборот, глобальные проблемы, и никто вам в этом не поможет.

Будущее опровергло эту сомнительную идею. Программирование в его нынешней младенческой форме оказалось слишком сложным занятием, требующим специализации, многолетней учебы и нужным образом повернутых мозгов. Добавьте к этому свободный рынок и получите нынешнее четкое разделение на разработчиков и юзеров. Первые пишут, вторые — пользуются готовым и не жужжат.

Но иногда им все‑таки хочется большего — как‑то повлиять на то, чем они, собственно, пользуются. Речь, разумеется, не о тех пользователях, которые от нехрен делать втыкают в телефон, судорожно пролистывая цветастые картинки на уровне двадцать пятого кадра. Нет, мы говорим о профессионалах своего дела, замотивированных и ответственных, каждый день с девяти до пяти сидящих перед монитором, на который выведены кнопочки и иконки большой и сложной системе. В ней, особенно если система соприкасается с постоянно осциллирующими бизнес‑требованиями постоянно возникают мелкие задачи, которые программисту делать лень. Какие‑нибудь условия получения скидки клиентом в зависимости от цвета волос, года рождения и фазы Луны в этот момент. Интеллектуального интереса они не представляют никакого — обычно это длинная цепочка if‑elsif‑else. Компилировать заново мегабайты сложного кода ради такой ерунды даже как‑то стыдно, отладка потом предстоит долгая и муторная, в общем, это те задачи, от которых хочется сбежать подальше.

Зато пользователям сложной, но не вполне их удовлетворяющей системы такие вещи, прямо касающиеся их непосредственных занятий, наоборот, весьма родны и близки. Вообразите себе, допустим, маркетолога, неделями выдумывающие те самые скидки. Уж‑он то не ошибется, поставив вместо трех и пять десятых пять и четыре десятых, что вполне может сделать программист, больше озабоченный тормозящим запросом или падающим с грохотом окном.

И потому у программиста возникает естественная мысль — передать такие вещи тому, кому больше надо, заодно разгрузив от них себя. Дать юзеру какой‑нибудь инструмент, с помощью которого он сможет сам сделать себе эти проклятые скидки, которые меняются у него каждую неделю, как будто ему больше делать нечего.

С точки зрения программирования в этом деле — делегировании некоторых полномочий — особых сложностей нет. В конце концов все сведется к каким‑нибудь полям ввода, содержимое которых потом попадет в таблицу базы данных, откуда и будет каким‑то образом интерпретироваться.

Гораздо сложнее придумать, что именно дать в руки пользователю, чтобы оно было практически полезно, но при этом обошлось без огнестрельных ранений нижних конечностей. Требования к инструменту получаются довольно сложные и противоречивые.

С одной стороны, он должен быть достаточно универсальным, чтобы дать пользователю доступ к широкому кругу задач. В идеале — даже к таким, которые первоначально даже не предполагались и не имелись в виду, потому что непрофессионалы в программировании могут от наивности выдумать такие применения, которые профессионалам не придут в голову даже в плохом психоделическом трипе.

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

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

Первое, что приходит в голову, — засунуть в готовую систему Javascript и отобразить на его объекты соответствующие внутренности. Решение, конечно, убогое. Наш пользователь — не программист и не собирается им становиться, у него уже есть своя любимая профессия, и менять ее он не собирается. Ему совершенно неинтересно разбираться, с какой радости typeof null получается вдруг объект и отчего знак «равно» пишется по два раза, будто при заикании.

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

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

Кроме того, представление программ в виде текста народным массам по большому счету чуждо. Читать любят немногие, а уж вычитывать, то есть замечать опечатки, — так и вовсе никто, кроме программистов, корректоров и горстки граммар‑наци. Впрочем, даже последние тут не пригодятся, поскольку им будет не с кем ругаться и некому демонстрировать свое превосходство.

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

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

Вниманию уважаемой публики предлагаются три такие модели. Это не какие‑то порождения досужего ума, а концентрированный опыт, отобранный автором в долгих баталиях с юзерами и доказавший свою ценность на практике.

1. Таблица

Тут и рассказывать особо нечего. Если у вас есть какая-то величина, которая по сложным и нелогичным законам зависит от одной-двух остальных, то ничего лучше обычной таблички нету. С первого взгляда все понятно, доступно и ничего не надо объяснять.

Редактор таблицы
Редактор таблицы

От вас как от программиста требуется только отобразить описательные выражения на внутренние переменные, а дальше как хотите — можете интерпретировать эту табличку на ходу, можете скомпилировать ее в код из месива if и switch.

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

Если вы амбициозны и у вас есть лишнее время, а таблиц такого рода требуется много, можно сделать универсальный редактор, в котором можно будет добавлять и удалять столбцы и строки, подгоняя его под нужный формат.

2. Пошаговые планы

Бизнес очень любит выдумывать всякие акции для клиентов вроде «заплати за две порции и получи вторую за полцены», а вот программисты их реализовывать совсем не любят. Опять же — неинтересно и муторно. Вот отличный кандидат для передачи в твердые и уверенные руки продвинутых пользователей.

Ментальная модель здесь подходит такая — делим выполнение на отдельные шаги, состоящие из последовательности действий. Шаг «Старт» запускается первым, остальные шаги или планируются через определенное время, или срабатывают по возникновению каких‑то внешних событий.

Акции часто ограничиваются какими‑то условиями, поэтому пригодится еще соответствующее поле.

Тут уместно будет привести картинку редактора акции, что будет понятнее тысячи слов.

Нам срочно нужна акция со скидкой...
Нам срочно нужна акция со скидкой...

Как видите, фактически у нас теперь есть GoTo и If условий, следовательно, язык получился полный по Тьюрингу — с условиями и циклами. Но не волнуйтесь, мы его урежем. Чтобы избежать падения в смоляную яму надо всего лишь ограничить и условия, и действия заранее определенным списком. Ну и вообще‑то у нас ведь нет переменных. Так что много и сложно юзера не наворотят, даже если очень захотят.

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

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

3. Мешок фактов

Представьте себе службу техподдержки какого‑то большого предприятия, например, провайдера Интернета. Звонит клиент с обычной жалобой «у меня не работает». «Что именно не работает?». «Все!».

Получив эту исчерпывающую информацию, оператор должен быстро (клиент висит на линии и нервно дышит в трубку) понять в общих чертах, что происходит, для чего просмотреть множество сведений, обычно разбросанных на паре‑тройке разных экранов. Проблема может быть в закончившихся на счете деньгах (экран «Финансы»), в сломавшемся оборудовании клиента (экраны «Текущий трафик» и «Прошлый трафик») или в поломке на самой линии (экран «Сообщения от ремонтных бригад»).

Все необходимые сведения в системе есть, но хорошо бы их свести как‑то воедино. Да вот беда — операторы бывают разные и с разными обязанностями, и смотреть им приходится потому в разные стороны. Вот бы хорошо было, если бы каждый из них (или хотя бы самый продвинутый) мог соорудить себе помощника, да потом еще оперативно его менять по своему вкусу и новым требованиям.

Что ж, этой беде можно помочь.

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

Но вот тут‑то они будут в самый раз. Бинго! Ведь метафора у них очень простая — есть мешок фактов, лежащих в совершенном беспорядке. Например, «Клиент=145», «Текущая скидка = 2», «Состояние линии = сломана» и т. п. И есть длинный‑предлинный список условий с привязанными к ним действиями. Условия независимы друг от друга, срабатывают они не по порядку, а ровно в тот момент, когда обнаруживаются их факты.

ЕСЛИ <Cостояние линии>="сломана" ТО Сообщить оператору: "Ничего не работает, так и скажите, пусть ждут"

ЕСЛИ <группа клиента>="VIP" И <Клиент>!=5 ТО Сообщить оператору "Любимый пользователь, разговаривайте особо вежливо"; Послать начальнику отдела сообщение "Важный клиент {{Клиент}} жалуется на качество связи"

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

Триггеры и действия. Цвета указывают на конкретный тип условия (или действия), делая интерфейс приятно окрашенным
Триггеры и действия. Цвета указывают на конкретный тип условия (или действия), делая интерфейс приятно окрашенным

Если от оператора требуется какая‑то дополнительная информация, то можно еще добавить отдельные поля ввода, сделав их содержимое автоматически добавляемыми в мешок отдельными фактами.

Редактор будет выглядеть примерно так же, как в предыдущем случае — выпадающий список готовых условий и действий, перетаскивание их на нужное место, заполнение пропусков.

Выбор условий и действий из предустановленного списка
Выбор условий и действий из предустановленного списка

Кстати, на той же основе вполне можно, вспомнив истоки, запилить и мини‑экспертную систему, перенеся в нее часть неявных знаний работников.

Что же касается реализации этого самого мешка, то прошедшие десятилетия все‑таки даром не прошли. Экспертные системы хоть и растеряли свои вселенские амбиции, но выжили словно ящеры в царстве млекопитающих, и скрываются теперь под скромным именем Business rules. Под крышкой там все те же старые добрые сети Рете или их коллеги. Нечто грандиозное вроде CLIPS или DROOLS, наверное, брать для своих проектов не стоит, но что‑то поменьше можно найти практически для любого языка. Например, если вы используете JS, обратите внимание на проект rools.

А я на этом раскланиваюсь и желаю всем творческих успехов.

Комментарии (27)


  1. kozlov_de
    09.01.2024 20:18
    +1

    Чего за фигня?


    1. randomsimplenumber
      09.01.2024 20:18
      +3

      Что-то по программистски ;) По условиям задачи пользователю нужно составлять свои алгоритмы, но без написания кода.

      Что-то адепт Дракона вышел из чата.


    1. gatoazul Автор
      09.01.2024 20:18

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


  1. bugigugi
    09.01.2024 20:18
    +5

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


    1. saipr
      09.01.2024 20:18

      Я попытаюсь написать.

      Из всей приведенной цитаты, внимание заслуживает - "нужным образом повернутые мозги". Но это относится к любой творческой сфере (яркие представители Эдисон, Тесла ...). Про младенческую форму вообще непонятно, автор, что может определить где начинается и кончается младенчество, юность, отрочество и т.д. А интересно, например, в металлургии какая сейчас форма?

      А с нужным образом повернутыми мозгами мне вспоминается такой эпизод:

      Представь себе кучу пронумерованных/подписанных спичечных коробков, в
      каждом из которых лежит какое-то количество спичек. Коробок со спичками –
      это и есть ячейка. Адрес ячейки – это номер коробка или его название.
      Теперь предположим, что надо узнать, сколько всего спичек хранится в
      пятом и десятом коробках вместе, т.е. выполнить операцию сложения, и
      такое же количество спичек положить в коробок с номером 15. Заглядываем в
      коробок №5 и запоминаем сколько в нём спичек, затем аналогичным образом
      поступаем с коробком №10, складываем запомненные значения. Это и есть
      то количество спичек, которое нужно положить в коробок №15. ЭВМ делает
      тоже самое, только не с коробками, а с ячейками памяти


      1. gatoazul Автор
        09.01.2024 20:18
        -1

        Металлургия дает стабильный нужный результат - сталь такой-то прочности в таких-то количествах. Программированию до этого пока далеко.

        Кто в какой стадии - можете определить сами.


        1. firehacker
          09.01.2024 20:18
          +1

          Металлургия дает стабильный нужный результат - сталь такой-то прочности в таких-то количествах.

          Не дает:


        1. M_AJ
          09.01.2024 20:18
          +1

          Программированию до этого пока далеко.

          В каком смысле? Программирование тоже дает стабильный результат, при четко известном, стандартном и выполнимом ТЗ. Проблемы возникают, когда неизвестен точный путь достижения результата, но при таких вводных и в металлургии проблемы те же.


        1. DarthVictor
          09.01.2024 20:18
          +2

          Металлургия дает стабильный нужный результат - сталь такой-то прочности в таких-то количествах. Программированию до этого пока далеко.

          Вы ведь не металлург?


  1. Batalmv
    09.01.2024 20:18
    +2

    Очень длинная подводка к BMRS :) Очень.

    -----------

    По опыту тот же Drools влетает в проект за пару часов и дальше да, часть написания логики можно отдать, как минимум, аналитику.

    Поэтому я не совсем понял, почему именно "такое грандиозное" брать не стоит :)

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

    Но это такое, дилема "хардкодинг" vs "параметризация" наверное всегда будет актуальной и каждый проект будет искать свою идеальную границу между двумя подходами и в части "параметризация" изобретать 100500 колесо :)


    1. gatoazul Автор
      09.01.2024 20:18

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


      1. Batalmv
        09.01.2024 20:18

        Там можно прикрутить "морду", а табличные формы отдавать в виде Excel :)

        Но лично я бы пользователям не давал :) Накосячат ... а потом "подтирай" за ними :)


  1. amatoravg
    09.01.2024 20:18

    Именно так зарождалась 1С...


  1. M_AJ
    09.01.2024 20:18
    +5

    Программирование в его нынешней младенческой форме оказалось слишком сложным занятием

    Дело не в сложности, дело в том, что большинство людей не хочет усваивать лишнего. Некоторые не хотят научиться пользоваться даже своим собственным смартфоном, и не потому что это сложно, им это просто не нужно и не интересно, они освоили круг задач который их интересует, при попытке рассказать что-то сверх того — отмахиваютя. А для "пролетарский" прикладной разработчики уже давно есть Excel — его возможностей хватает на очень широкий спектр расчётных задач, анализа данных и так далее, и те самые "замотивированные профессионалы" пользуются им для этих целей уже десетилетиями. Иногда даже их проекты перерастают во вполне самостоятельное приложения.


    1. gatoazul Автор
      09.01.2024 20:18

      Вы предлагаете в какую-нибудь систему складского учета впихнуть Excel, чтобы кладовщик там автоматизировал свои мелкие проблемы вроде "при выдаче реактора сообщить об этом мастеру по мирному атому" ?


      1. M_AJ
        09.01.2024 20:18

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


        1. gatoazul Автор
          09.01.2024 20:18

          А потом эти работники чертыхаются и ненавидят свою работу, потому что интерфейс для них спроектировали профессионалы, понятия не имеющие об их повседневных нуждах и проблемах.


          1. GBR-613
            09.01.2024 20:18
            +1

            Значит - не профессионалы, раз не вникли в их интересы и нужды.


  1. Vottakonotak
    09.01.2024 20:18

    Не совсем понятно, что означает термин "замотивированные профессионалы". Но могу сообщить, что я действительно был и есть недоволен современными программами. Например, moodle вызвал у меня острое желание сделать программу для создания кода задания для вставки в quiz. Мне было невыносимо прописывать теги к пропускам или к тесту, которые содержали инфу с оценкой за ответ ну и сам правильный ответ, а именно так и было в moodle. Ну вот тогда, я придумал программу для автоматизации этого процесса и за 200$ на фрилансе мне её сделали. Теперь я сам создаю moodle, для себя и моих товарищей уже 3й год. Могу сказать, что лучше проектировать чем программировать, так будет быстрее.


  1. stVolf
    09.01.2024 20:18
    +1

    это письмо из 2004 года?


  1. GoshaAndYasha
    09.01.2024 20:18

    Что за фигня

    Выше хороший вопрос. Я догадался, может быть. Это первая ствтья из обстоятельного цикла, в третьей-четвёртой прозвучит слово Julia.


    1. gatoazul Автор
      09.01.2024 20:18

      Нет. Никакого продолжения не будет. Julia - это тоже программирование.


  1. GoshaAndYasha
    09.01.2024 20:18

    Но это программирование как в заголовке - для народа. И Julia - это другое...

    Мне кажется, я нашёл способ просто и точно показать/передать дух Julia. Идём на сайт и давим на кнопку документации: И получаем документацию

    Делаем окно браузера поуже, если он не мобильный, конеяно, и видим

    • Есди нажать на сэндвич в правом верхнем углу, то слева выдвинется панель с оглавлением

    • Промотав вниз до предела, имеем справа внизу переход на release notes, которых в оглавлении нет

      Типичная игривая латиноамериканка Джулия...


  1. Tuvok
    09.01.2024 20:18

    Ожидалось в конце статьи хотя бы абзац о визуальном программировании (UE blueprints, HiASM, LabView, ...) но нет. Странно.


    1. gatoazul Автор
      09.01.2024 20:18

      Цель статьи - поделиться собственным опытом удачных метафор и прочитать в комментариях опыт других, а вовсе не давать обзор средств визуального программирования.

      Благодарю вас за подсказку, посмотрю указанные вами системы, там могут быть интересные идеи.


      1. Tuvok
        09.01.2024 20:18

        Видимо вы не так поняли, я не об обзоре средств, а о том что это как раз больше всего подходит под определение "программирование без программирования". То что нужно для народа.


  1. Dr_Dash
    09.01.2024 20:18

    Макросы в таблицах - тоже вид программировприя, без необходимости перекомпиляции мегабайт кода