filin: (Default)
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 построен на наследовании там, где следовало бы на делегировании. Чуть что не работает из коробки — хвостов не найдешь, а стек трейс через цепочку наследований и миксинов на ровном месте оказывается глубиной в полсотни слоев там, где по уму их должно быть три. И бага (которую авторы могут считать фичей, и даже позаботились об отключении) может быть на любом.

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

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

Кот Камышовый, услышав эту мысль еще в сыром виде, произносил словосочетание «однозначность понимания». Я же хочу сделать акцент на предсказуемости результата. Однозначность понимания — не цель, а средство, причем одно из. И как мы видим на примере машинных языков, далеко не всегда достаточное.
filin: (Default)
Thursday, February 19th, 2015 08:49 pm
Прочитал интересную серию статей Paul Callaghan в PragPub (https://pragprog.com/magazines, выпуски с 38 по 49, кроме 44, а существенная для этого текста часть — с 45-го), и сделал для себя некий существенный вывод, к которому эта серия — прекрасная иллюстрация. Оным выводом и хочу поделиться )

Сразу озвучу совсем уж сухой остаток. На данный момент развитие средств программирования таково, что оптимум называется Haskell. Может быть, еще какие-то сходные языки, не уверен. Ключевые моменты: богатая система типов и статическая их проверка. Только вместе. Но. Более богатые, чем хаскель, средства (зависимые типы) пока оказываются намного ниже оптимума. Подробно - много букв )
filin: (Default)
Monday, July 14th, 2014 10:23 pm
В переписке вокруг одной программы посетила недомысль:

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

Для бедных — это написание юнит-тестов. Именно написание, а не сами юнит-тесты.

Теперь в задумчивости про «для богатых» и «для среднего класса». Пруфчекер — это, боюсь, уже для миллионеров... Хотя, если освоить, например, агду, и попытаться выразить архитектуру на ней...
filin: (Default)
Monday, July 14th, 2014 10:18 pm
В путеводителях по Непалу раньше писали (не знаю, пишут ли еще сейчас), что местным не стоит задавать вопросы, подразумевающие ответ да/нет: у них, типа, считается, что ответом "нет" ты расстраиваешь собеседника, поэтому на вопрос "я правильно иду в Горепани?" рискуешь услышать "да", даже если идешь в обратную сторону. А надо спрашивать "в Горепани в какую сторону?" Тогда покажут в правильную.

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

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

У нас неконструктивная традиция. Когда европеец спрашивает "правильно ли я иду в Горепани?" и получает в ответ честное "нет", ему что на самом деле надо? Правильно, попасть в Горепани. Решил ему этот ответ эту задачу? Правильно, не решил. Он узнал, что этим путем он в Горепани НЕ попадет. И чо? И ничо! Если тебе надо попасть в Горепани, надо спрашивать дорогу в Горепани.

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

Я еще не понял, какие я из этого сделаю выводы для себя...
filin: (Default)
Wednesday, December 5th, 2012 06:27 pm
Помнится, Нассэ проводила среди юзеров, по большей части гуманитариев, опрос на тему "зачем вам компьютер общего назначения, и не годится ли специализированный?". Почти никому не годился. Аргументы были разные. Так вот, правильный ответ на самом деле сводится к "при пристальном рассмотрении специализированный энд-юзерский компьютер свою задачу, увы, не решает". Промышленный тоже, но об этом не здесь и не сейчас. То есть на первый взгляд - да, решает, а на пристальный - нет.

Пример. Мой смартфон, HTC Desire Z. В основной функции телефона - звонить - как говорит Игус, "работает как физический объект". В смысле, да, звонить можно. Если удастся снять трубку, для начала, потому как разблокировка экрана у андроидов, как и положено, нечеловеческая. Ну, правда, я понимал, что беру не телефон с прибамбасами (напрочь они мне не сдались, те прибамбасы), а карманный компьютер с GSM-модулем. В этом качестве он, после замены штатной операционки на cyanogenmod и установки wheezy в chroot, вполне меня устраивает, и кажется, на рынке нет вменяемых альтернатив. А к функциям его как интеллектуального телефона (без прибамбасов - просто как телефона, но с записной книжкой и работой с блютусной гарнитурой) претензий более чем достаточно, предыдущая дешевая нокия была в этом качестве куда лучше. Впрочем, записная книжка у cyanogenmod все же лучше, чем у нокии, а главное, поскольку это компьютер общего назначения, ее можно заменить на альтернативную, в том числе написать свою. Родная HTC'шная была, кажется, хуже, хотя сейчас уже не помню.

Но вот то, что на нем стоит cyanogenmod и у меня в ней есть рут (в ней, благо, штатно есть рут, ломать не надо), очень существенно для его полезности. Что б я делал с родной прошивкой, не знаю.

Второй пример из совсем недавних. Хотелось купить электронную книгу в подарок пожилой женщине, с компьютером на Вы. Но нужна с нормально подсвеченным экраном (без подсветки есть, неудобно), умеющая читать вменяемое количество форматов, и не глючащая на каждом шагу. Что-то я начинаю подозревать, что у нас ебуки сплошь с хохляцкими прошивками. Не украинскими, а именно хохляцкими. Даже если на русском. То есть ниточки тянутся в Украину, но существенно качество. Уже третий ебук с такими ниточками. Предыдущие были ебуки странных контор. Ведут себя печально, на кнопки реагируют крайне неохотно, и т.п. Эту брали PocketBook IQ-701. Наиболее толковой в этом классе конторы. Может, конечно, у них эта модель неудачная - в отличие от еинковых, эта (LCD) на древнем андроиде. Ничем бы не плохо, кроме того, что приложения маркета нету, а через браузер маркет ее не поддерживает. То есть ничего доставить нельзя. (Да, я в курсе, что для нее есть прошивка на втором андроиде, но она тоже украинская, и судя по описанию, тоже хохляцкая.) Так вот, половину заявленных форматов не читает. Проверялось 4 - fb2.zip и txt читает, epub и pdf - падает. Распознает, даже показывает обложку книги, но при попытке пойти ее почитать немедленно возвращается обратно. (Падает не всё приложение целиком, а только читалка, но стопроцентно.) При этом по задумке интерфейс как раз подходящий - при втыкании в компьютер честно представляется флешкой, при вытыкании обратно перечитывает залитое, программа чтения снабжена виджетом, и вообще расположена довольно близко... Минимум проблем. Вот только не работает. И всего на 20% дороже можно купить 7" Samsung Galaxy Tab 2, в котором уже 4 андроид, который нормально поддерживается, и для которого можно налить читалок с маркета на любой вкус. Которые работают.

Почему сразу не взяли Galaxy? Потому что у молодой женщины, с компьютером на китайском (то есть уже не на Вы, но еще не на одном, и даже не на родственном, языке), аналогичный не удалось нормально состыковать с виндой (XP SP2, правда, но работает) по USB. Потому что это всё-таки специализированное устройство, только не для тех задач, для которых оно куплено, а для интернет-серфинга. И что-то я сильно подозреваю, что для этих задач оно тоже не ахти, но тут уже я совсем не ЦА, и задач ЦА не знаю. Ну, благо дома есть сеть, а на том же маркете Total Commander и LAN plugin к нему, но даже так не шибко удобно. А у предыдущей женщины LAN с WiFi дома нет. И боюсь, что задача закладывания туда книжек, скачанных мужем из сети, перейдет из разряда "имеет не шибко удобное решение" в разряд "решение есть, но требует очень много нервов". Либо к нам ногами ходить, у нас сеть есть. И архив либрусека тоже есть.

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

P.S. После того, как на коммент к предыдущему посту мне ЖЖ не дает ответить с редкостно извращенной диагностикой (Нассэ, на твой как раз), я решил запретить комментирование там. Кросспосты из dreamwidth остаются, а комментировать ходите в DW. Впрочем, я пишу так редко, что вряд ли это создаст кому-либо серьезные неудобства...
filin: (Default)
Wednesday, December 5th, 2012 05:55 pm
Поймал себя на привязавшейся фразе из песни. В редакции


Ты признайся, кого тебе надо,
ты скажи, программист молодой.


По осознании немедленно развилось в


Что ж ты кодишь всю ночь одиноко,
что ж ты серверу спать не даешь?


Отвяжись уже!