KAPACb

Рефакторинг законодательства

Вот что я могу как программист предложить для развития государства и общества?
Многие жалуются, что тексты законов длинные и сложные, а с другой стороны, их легко превратно толковать и злоупотреблять ими. В программировании есть аналогичная проблема - длинный и запутанный программный код, который иногда делает не то, что хотели от него создатели. Аналогия здесь достаточно сильна: программист пишет текст, по которому работает машина (и она не жалуется, что текст слишком сложный - но его надо читать и другим коллегам, и ему самому), законодатель - текст, по которому будут жить люди. Как можно применить опыт программистов для решения проблем законодательства?
В программировании это называется "рефакторинг". Применительно к тексту вообще - это редактирование текста без изменения его смысла, для улучшения его читаемости, понятности и готовности к дальнейшим изменениям.
Сохранение смысла при изменении текста (насколько это нужно - обсудим ниже) в рефакторинге представляет основную трудность. Исследования лингвистов в установке эквивалентностей текстов тут не сильно помогут - изменения смысла при слишком опрометчивом изменении текста могут оказаться неочевидными и не очень предсказуемыми. Сейчас нельзя просто взять и упростить в тексте "среднее общеобразовательное учреждение" до "школы" - к закону тут же примажутся Высшая школа экономики, театр "Школа современной пьесы", автошкола, школа диабетиков в районной поликлинике и т.п.
Но средство для сохранения смысла в программировании тоже есть. Текст закона надо "накрывать тестами" - видимо, и автоматизированные тесты, и описание сценариев для тестирования вручную можно обобщить до одного процесса: описание возможных ситуаций, при которых закон может быть применён или отказаться быть применяемым. Как правило, ситуации описываются на каждое "условие" или на каждый "вариант".   Подобный текст с вариантами будет на порядок длиннее самого закона и займёт много рабочего времени законодателей, что кажется расточительством - однако, для улучшения качества и надёжности текстов это крайне полезно.
Изменение текста в таком случае будет корректным, если оно сохранит возможное действие закона при каждой ситуации - и не будет, если действие закона хотя бы в одной ситуации изменится. Хочется, конечно, совместить и улучшение текста, и улучшение смысла, но принцип "двух шляп" теоретика рефакторинга Фаулера советует нам каждый раз выбирать какое-то одно.
Описание тестовых ситуаций, к тому же, послужит удобным и понятным комментарием к тексту закона. Его можно написать и заранее к ещё не написанному законопроекту - что соответствует принципу Test Driven Development - и потом дописать законопроект к этим тестам. Если происходит "баг" - кто-то применяет закон так, что это противоречит той идее, ради которой он писался, или происходит ещё что-то вредное - эта ситуация становится тестовой, в которой сработает следующая, исправленная версия закона, сохранив при этом все предыдущие.
Вернёмся, наконец, к вопросу смысла. Процесс принятия законов мне представляется последовательностью выявления следующего:

  1. Жизненная проблема, требующая решения в законодательстве.

  2. Принципы - этические, научные, политические, идеологические (да, в парламентах заседают политики, члены партий) - которые могут определить решение этой проблемы.

  3. Общие принципы решения данной проблемы, спроецированные на неё из п.2

  4. Логика решения проблемы в законе. Вырабатывается с учётом вляния других явлений на возможные ситуации, наличия в стране ресурсов для решения проблемы, необходимости компромисса между фракциями и так далее.

  5. Текст нового закона, выражающий эту логику.

Мы видим, что одного наличия хороших принципов в п.2, как полагают наиболее политически активные граждане, для качественного законодательства недостаточно. Появляется сложность, и она может появиться как в пункте 4, так и в пункте 5. Для устранения чисто языковой сложности в самом тексте нужен рефакторинг - но рано или поздно упрощение текста упрётся в сложность лежащей за ним логики. Логику тоже можно и нужно упрощать, но делать это стоит ещё аккуратнее с тщательным составлением и рассмотрением тестовых ситуаций - за изменениями их исходов могут пойти изменения в судьбах людей.
Работа программистом привела меня к другому отношению к различным правилам и законам. Нормативный документ - вообще говоря, не священное писание, которое не надо трогать, но и не бумажка, написанная бюрократами, чтобы мешать людям жить как они хотят. Это - инструмент для улучшения качества жизни и работы людей, для решения жизненных проблем. И этот инструмент требует обсуждения и усовершенствования. О законе можно сказать, что он "хорош" и "работает", если его "тупое", формальное, буквально применение, независимо от личных качеств исполнителей, приводит именно к тем результатам, ради которых он принимался. Его будут исполнять живые люди, но пусть нам не придётся надеяться на то, что они заткнут проблемы закона - пусть его исполняют так, как машина исполняет программный код.
кот, рыжий

Вынь пробку!

Альбом Вынь пробку готов, и 2 февраля 2020 года был презентован в библиотеке имени Есенина города Люберцы.

PbxwMySegQo

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

KAPACb

Направление рифмы

А вот скажите мне, друзья-филологи и коллеги-поэты.

Я где-то (уже не помню, увы) недавно прочёл что-вроде "я могу рифмовать и вперёд, и назад". Дальше по смыслу было, что толку от этого никакого, но я не об этом. Меня зацепил вопрос, что стоит за этим, может быть, уже термином?

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

- по порядку следования в тексте;
- от более распростанённой словоформы к менее;
- от окончания строки из нескольких слов с рифмующим его целым словом (или наоборот)
- по порядку сочинения строк автором - что, конечно, обычно скрыто от читателя.
- upd. от конкретного к абстрактному;
- upd2. от неожиданного в контексте произведения к более ожидаемому;

Исследовалось ли что-то такое? Замечаете ли вы эти направления в читаемых или создаваемых стихах? Кажется ли вам какое-то направление (или, вернее, сочетание направлений в каких-то из этих четырёх смыслов) признаком более "слабой", "дешёвой" рифмы? Замечаете ли постоянство или непостоянство этих сочетаний в произведнии.

Очень интересно, исследовал ли кто-нибудь это всё. К поздравлениям лауреата Грирорьевской премии iris_sibirica присоединяюсь!

automat

Левое и правое IT

Среди теоретиков программирования и продвигаемых ими идей тоже есть правые и левые, как в политике.

Правые - это Пол Грэм (или как его там, Грэхам?) Больше возможностей для сильных программистов, лично закреплённый код, использование максимально мощных программных средств, при этом - апология экономического неравенства и восхваление хакерства и стартапов.

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

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

KAPACb

Новые песни

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

Романс маньяка

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

А идёт всё к одному:
Не твоё, дурак, не трогай,
Не нашёл покой уму –
Так иди своей дорогой,
А дорога коротка,
Но петляет как река.

Я смотрю с её петель,
Заковыристых развязок,
Бесконечна куча тел,
Как бы знал – не лез бы сразу.
Накатило, понесло,
Залежалось, отлегло.





Бумага фонарей

За окном рассыпана бумага фонарей,
Выйди, собери её скорей!
Круглые листы лежат на плоскости и ждут карандаша,
Глаз прищуриваю, руки чешутся, волнуется душа.

Чем тебе покажется бумага фонарей?
Чем скорей ответишь, тем верней:
Картой, транспарантом, или скатертью для ланча на ходу,
«Шпорой», перевязочным пакетом, сверхсекретом на виду?

За окном подмигивают дети фонарей,
Сколько ярких окон без дверей!
Сколько сказок знают, я прошу их рассказать всего одну:
Можно ли и мне не суетиться, излучать свою волну?

Что ты мне напишешь на бумаге фонарей?
Ничего не проще и хитрей:
Танцем своей тени исчезая, растворяясь, чуть дыша,
С новый вдохновеньем возвращаясь на конец карандаша.


The Law

Я просыпаюсь в палате, отходит наркоз,
Где моя шерсть, чего ради я бегал и рос?
Что-то теперь мне подсунут ценой перемен?
This is the Law, are we not Men?

Из глубины своей ямы узреть небосвод,
Старых успехов тенями очищенный от
Блеска наследства, бахром золочёных знамен,
This is the Law, are we not Men?

С краденым словом согнуться в нощи яко тать,
Да, я упал, чтоб вернуться, ушёл, чтобы встать.
Нет, не заткнуть мою совесть, я здесь не затем,
This is the Law, are we not Men?

Господи Боже мой, Ты-то Сам знаешь всё как,
Ты же мне вырвал копыта, отрезал пятак,
Дело за мной – это всё, что я понял пока,
Но если это закон, чья здесь рука?

Что же, сестра, подходи и держи свои пять.
Больше нет страха друг друга ни в чём не понять
Остров наш мал, наш надел, наш удел, наш домен,

This is the Law, are we not Men?
This is the Law, are we not Women and Men?

учу

Языки запросов

Вот есть SQL со всеми его диалектами и прочие, довольно экзотические, языки запросов. Не всем они нравятся - но что придёт им на смену?

С одной стороны, в целом вещь хорошая. SQL-запрос абстрактен от реализации, он только описывает получаемые данные и их связь с оставшимися - и в этом смысле SQL воплощает те надежды, которые возлагались на язык Пролог. В других языках такого может и не быть - и приходится интегрировать своё решение на другом языке c SQL.

С другой стороны - как происходит эта интеграция? Вот есть веб-приложение, приходит от клиентской части HTTP-запрос, "средний слой" преобразует его в (SQL-)запрос и переправляет серверу БД. Часто это преобразование не сводится к простой подстановке параметров, и запрос получается сложным (в силу недостатков языка запросов) и плохо читаемым человеком. Какие возможны выходы:

1. Формирование запроса как объекта - и дальнейшее преобразование в запрос на SQL. В предельном случае преобразование будет абстрактно от текущего проекта, и выполнено в виде отдельной библиотеки. Язык запросов в таком случае подменяется интерфейсами для формирования запроса-объекта - мы получаем вместо двух разных языков один с новым подмножеством, а старый язык тогда остаётся языком "сериализации" объектов-запросов. С одной стороны, шагом к этому была Java Persistence Architecture с её CriteriaBuilder - но возможности построенных  абстрактных от СУБД запросов намного скромнее, чем у запросов на конкретном диалекте SQL; с другой, можно вспомнить MongoDB, у которой запросы - просто JSON (то есть уже готовый механизм сериализации используется).

2. Формирование запроса с помощью движков шаблонов - кто-нибудь пробовал??

3. Более тесная интеграция языка среднего слоя внутрь сервера базы данных, переход на какой-нибудь RPC с привычными прозрачными интерфейсами. Тут плохо то, что реализации RPC тоже уже старые и громоздкие (SOAP ещё вспомните), а сами языки "среднего слоя" более императивны, чем декларативны (но тут есть подвижки, типа unapply в Scala), и эта декларативность может помешать использовать внутреннюю оптимизацию запросов. Хотя запросы бывают разные, вручную их тоже оптимизировать бывает надо.

Upd. 4. Вариант, который я не сразу вспомнил , а ведь сталкивался - максимально перенести логику в хранимые процедуры, усложнить статически SQL-код. Можно ведь уже сейчас много что делать, вплоть до сериализации прямо внутри SQL, да? Проблема использования версионности, синхронизации кода в VCS и базе - чисто техническая. То, что получится, будет меньше испытывать проблем от применения двух разных языков, и больше - от недостатков самого SQL.

KAPACb

Новые песни

The Cakewalk

На ладони блюдо, за ногой нога,
Мой любимый танец – это вынос пирога,
Дальше на подносе будут фрукты и вино,
Ем и пью как будто, я не ел, не пил давно.
Как так получилось, кто же виноват,
Что ты так полюбила эти фартук и прихват?
Ведь платьев и перчаток в доме до фига,
Но твой любимый танец – это вынос пирога.

Чего ещё такого скажет мне твоя готовка,
Чего ещё не слышал этот дом?
Что я и сам танцую лучше пана Дуботовка,
Только это мы оставим на потом.

Рождены с глазами, а смотрим будто в щель,
Сколько есть на свете танцев, мест, вещей:
Танец летка-енька – баня, снег, пурга,
Танец пасадобль – плащ, песок, рога,
Но наш любимый танец – это вынос пирога.
Не искать где лучше и не звать гостей,
Старые рецепты лучше свежих новостей
Старая верёвка больше не туга,
Самый лучший танец – это вынос пирога.

Песня о стремлениях и мечтах

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

Припев:
Все хотят чужого, все хотят чужого,
Нового, большого, звёзды на плечо,
Все хотят чужого, все хотят чужого,
Все хотят ещё!

Сдвинувшего нормы не пугают штормы,
Чем сложней задача, тем ему милей.
Скалы, волн громады, вызовы, преграды
Делают сильнее и смелей!

Припев.

Но мы знаем: каждый, испытавший жажду,
Коль ему не страшно, будет напоён,
В поле, на заводе, в обществе, в природе
Он отыщет что-нибудь своё!
Но…
Припев.

Salma ya salaya

(Вольный перевод народной песни арабов Египта)

Всю жизнь по пустыне
Шёл путник, а ныне
Он видит вдали, наконец,
Бассейны, фонтаны,
Павлинов, лианы,
Тенью манящий дворец,
Из его дверей он слышит:

Salma ya salaya,
Привет, скиталец, salaya,
Salma ya salaya,
Мы ждём тебя, bisalaya

Но верить не надо,
Не будет прохлады,
Так обманчивы миражи.
Песок расскалённый,
На вкус чуть солёный
И воздух горячий дрожит,
Но, закрыв глаза, он слышит:

Salma ya salaya,
Входи смелее, salaya,
Salma ya salaya,
Садись за стол, bisalaya...

Утешная

Столько часов, а нам всё не спится,
Ночь прячет свет, мы прячем лица,
Слёзы стеной, я столько не выпью!
Why weep ye?

Мир не таков, как ты хотела,
Нет никому до тебя дела,
Вот и всего, а плача на весь мир,
Ай вэйзмир!

Знаешь, и я так же размякнуть,
Сжаться в комок, так же заплакать
Мог бы и сам, будь я так нежен,
Но нет же!

Я то уже в курсе, как мир изменчив,
Нам с тобой будет чему выйти навстречу
В новом году, в следующем патче,
Не плачь же!

Романс изгоя

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

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

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

Так не надо искать, оставайтесь под крышей, меж стенками,
И однажды под ночь я приду на немеркнущий свет,
Весь в пыли как в долгах, волосатый, обвешанный феньками,
Постучусь к Вам в окно, и скажу Вам: впишите на флэт!

Инверсия

Не действуй на столетья, павши ниц!
Сойдёт пространство - помогу запутаться:
Басят они, как штык у ягодиц,
Затянутые времени конструкции!

Столетья распадаются на дни,
Столетья разлетаются годинами,
Но ты не удивишься ни на миг:
Что завтра, что вчера - да всё единое!

У некоторых, впрочем, общий бред
И общий барабан, и маски стёртые,
Они насоберут со всех побед
И почести возьмут, но нужно ль мёртвым-то?

Огромные века слепить бы в снег,
И по земле повеет странной сухостью.
Но иногда я вдруг узнаю - эх!
Ушло моё столетие по глупости!

Ушёл мой век короткий - и плевать,
Плевок средь наводнения - искать ещё!
Так будем хитро прибыль забывать -
Так, в частности. В минуту подходящую.
KAPACb

Паразитная функциональность

https://www.gazeta.ru/science/2017/12/26_a_11545316.shtml

У автобусов ЛиАЗ-5292 есть защита от езды с закрытыми дверями. Эта полезная штука порождает опасный обратный эффект: можно использовать открытую дверь как состояние органов управления, в котором автобус не едет, но тогда он может неожиданно тронуться при закрытии двери.

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