November 2018

S M T W T F S
    123
45678910
11121314151617
18192021222324
2526 27282930 

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Wednesday, March 7th, 2018 03:37 pm
На правах потока сознания.

СННЯУ (с неделю назад я узнал), что на современном HTML + CSS (БЕЗ JavaScript), оказывается, можно сделать модальный диалог подтверждения. Минут 5 я разбирался, как это устроено (надо было найти релевантный код в полном дизайне страницы), а потом за пару секунд встроенный параноик нашел, как легким изящным неосторожным движением посадить в этой программе багу, которую потом только искать придется с полгода... А тем временем данные из базы на сервере будут пропадать... Подтверждение было у кнопки удаления, ага. Все мои читатели знают, за что я нынче люблю языки с богатой системой типов и строгой типизацией времени компиляции?

Полученный инсайт я вторую неделю перевариваю.

Инсайт начался с того, что HTML даже изначально, до CSS — язык программирования. Да, domain-specific. Да, с весьма ограниченной функциональностью. Да, для своеобразного типа процессора. Но программирования. Декларативный, если я правильно соображаю, как принято называть этот класс языков. В смысле, программист на нем излагает, что должно быть показано Ю. Конечному и как оно должно выглядеть, а не как именно это рисовать. Современный CSS добавляет к арсеналу программиста дополнительные возможности, но не меняет ситуацию кардинально. Однако, с дополнительными возможностями появляются и дополнительные возможности их использования как бы не вполне по назначению.

Помимо разметки страницы, в HTML есть одна инструкция совершенно другого типа. Ключевая, без которой он бы не состоялся. Переход по ссылке. На ее абьюзе, собственно, и построен вышеупомянутый трюк. А вот возможность посадить там очень незаметную багу — это уже дополнение от CSS. На чистом HTML то же действие вызвало бы явный переход на другую страницу, заметный для Ю. Конечного.

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

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

Следующий шаг сформулировался так: поведение программы на декларативномм языке, даже простой, плохо предсказуемо для программиста. Не заточен под это человеческий мозг. Про Пролог я такое читал, про Моделику краем уха слышал от коллег (слышал о фактах, вывод мой), а HTML + CSS даны в ощущениях.

Причем в простых случаях, на уровне Hello World, оно как раз обманчиво хорошо предсказуемо. Лучше, чем с процедурным или функциональным. Но как только скомбинировались несколько посылок декларативных инструкций (а в реальных задачах будет именно так) — комбинаторный взрыв разносит вдребезги систему ассоциативных связей.

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

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

Подробно проверено на ruby, чей фреймворк rails построен на наследовании там, где следовало бы на делегировании. Чуть что не работает из коробки — хвостов не найдешь, а стек трейс через цепочку наследований и миксинов на ровном месте оказывается глубиной в полсотни слоев там, где по уму их должно быть три. И бага (которую авторы могут считать фичей, и даже позаботились об отключении) может быть на любом.

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

Инсайт, впрочем, не остановился и здесь. Следующим шагом оказалось то, что любой язык, включая естественные и даже язык жестов — тоже, в частности, такой язык программирования. Как правило, хренового. Человеческие языки (вернее, это скорее свойство процессора) обычно здорово выигрывают по скорости программирования и порой даже по предсказуемости. От машины, однако, можно добиться уровня предсказуемости, с человеком недостижимого. Но дорого. Между процессорами есть и еще ряд различий, но к языкам они уже не относятся :)

Кот Камышовый, услышав эту мысль еще в сыром виде, произносил словосочетание «однозначность понимания». Я же хочу сделать акцент на предсказуемости результата. Однозначность понимания — не цель, а средство, причем одно из. И как мы видим на примере машинных языков, далеко не всегда достаточное.
Wednesday, March 7th, 2018 01:52 pm (UTC)
Вот интересно, регекспы ты куда запишешь? Тоже в декларативные?