четверг, 18 августа 2016 г.

Про м*

Нет, не про мудаков.

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

Так вот...

Это наиболее простое объяснение, которое я когда-либо встречал:

https://www.quora.com/Can-I-understand-monad-as-a-container-performing-certain-computation/answer/Bartosz-Milewski?share=a7312bea

В молодости ты все думаешь, что контейнер - это некая структура данных. Так вот... забейте, это не так. Думайте, что это контейнер (никакой STL тут не причем).

Самое важное, что есть в функциональном программировании (и вообще в программировании. и мире в целом) - это композиция  ("композибилити"). Это когда выход одного может быть входом другого. Для ФП - это как бы базис. Хваленное ООП не такое, тут понятие вход/выход выходит за рамки ООП. Ну а в мире, один из самых простых примеров - вилка-розетка. Это только потом Lego появилось.

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

В мире java до сих пор (2016 год у меня на дворе) любят null. Все-таки немного про мудаков. Всякие вариации nullable, Option[_] и есть контейнер. Мудаки все равно будут утверждать что null быстрее работает, что-нибудь про боксинг говорить. Мудаки как есть. Закончили про них.

Еще контейнер - список. Функция возвращает не просто один "детерминированный" вариант, а целый список. Список пустой - функция загнулась. Список из одного элемента, единственный результат. Несколько элементов - резветвление "недетерминированных" вычислений (тут кавычки нужны, оно конечно все детерминированно).

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

Аналогия с прямолинейным Option/nullable тут на лицо. Если - косяк, то - косяк. Иначе живем. Можно обернуть этот косяк к красивым сообщение об ошибке. Так вот... у нас есть еще один контейнер.

А фьючи..? Например поэтому не хочется говорить структура данных, это именно контейнер.

Про упоротых хаскеллистов я пока не буду, мне рановато. Все равно IO() немного маджик, там как-то скрыта ссылка на внешний мир.

State он прикольный, но я тоже ничего здесь писать не буду. У меня местами есть подозрение, что в какие-то моменты времени до меня доходят Free M* и trampoline. Трансформеры пока мимо кассы.

А так реальный пример с широкими массами: заметил у Сереги на работе код на swift-e. Тот унылый треугольник кода, где пять вложенных if-ов, в каждом проверка на null и что-то деланье. Выразил свое негодование. Через неделю проверил, там 4-5 вынесенных мини-функций, но все равно по факту лапша. Континуэшенами не втирал, но близко. Оказалось, что в swift у Option и так есть map/flatMap. Переписали в 4 строки, ни одного if-a.

В первые полгода сначала кажется, какой же классный синтаксис, for работает и со списками, и с фьючами, и с Option. Так вот, это не синтаксис, это и есть м*.

ЗЫ. Вот и философский вопрос. Предположим есть язык, в котором достаточно богатая типизация, м* вынесены как абстракция, но нет for-comprehension. Вопрос, на который день он появится?

вторник, 10 мая 2016 г.

Изоморфизм с едой

Таки услышал хорошую мысль от Erik Meijer, про всякие agile&&scrum. Делюсь.

Вот в McDonalds работает куча необразованного персонала тинейджерского возраста, им нужно куча инструкций/бизнес-процессов, что бы из полуфабрикатов (читай, тоже так себе продукты) сделать что-то более-менее съедобное.

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

Конец цитаты (вольный пересказ).

Все эти ваши методологии (с) направлены на:
- взаимодействие с "верхами" (заказчик/клиент/менеджер)
- показать прозрачность разработки/планирования
- ...

Но никаким образом не сказываются на внутреннем качестве кода. Тесты/CI/code_review как-то мимо. Оно и понятно, что scrum-ы и для производства автомобилей применимо, где code review отсутствует. Так и получается, что все все равно говорят на разных языках.

А выход у программиста - это код. И с моей точки зрения, нужно все метрики вводить на код. Хороводы у костра - это дистракт от кода, и программистам он вообще теплее не делает (а всем остальным руко-водителям как бы теплее).

Вместо получения нормальной спецификации по задаче (да, это сложно, но это как-то нужно делать) вводят кучу *-мастеров, по словам Erik-а, вообще на сетевую пирамиду похоже.

ЗЫ. После ухода с МС, Мейер как-то много где тусил. А потом как-то пропал. Вообще, локально обсуждали, думали опять с кем-то поругался. Оказалось, его хорошенько по здоровью скосило, на полгода. Вывод: не строить домыслов.

пятница, 6 мая 2016 г.

Алгеброидная хроника

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

РосМатриксКонтроль удаленно зафиксировал незаконное использование размерности больше 3, на место предполагаемого преступления выехала оперативная полугруппа "Анти-Тензор". Подозреваемые задержаны.

Главарь группы (погоняло Моноид), ранее судимый за подобные ко-преступления, имеет характеристику 7, что далеко от идеала. Согласно аксиомам, Универсум гарантирует бесплатного алгеброида для данного процесса. Остальные элементы ранее не выходили за пределы Банахова пространства и отпущены под подписку о невычислениях.

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

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

среда, 6 апреля 2016 г.

Объявление (аренда квартиры)

Таки извиняюсь, личное, и объявление.

Сдам 2-х комнатную квартиру, Ижевск, район ГорСовета, 9 этаж, вид на Металлург.

Кухня вся (газ плита, микроволновка, холодильник), стиральная машина, пылесос, 2 раскладных дивана, интернет.

15тр + счетчики. На длительный срок(!). Депозит в размере 1 месяца, так как без риэлторов, то других платежей нет. Сильное желание, чтоб вы меня знали (и симметрично).

Таки не актуально. Всем спасибо.
















пятница, 4 марта 2016 г.

Scala

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

Собственно, Scala is awesome. Оосам. За 2.5 года (чуть более чем) профессиональной (100% и свободное время) понимаю, что это что-то иное, чем ... язык.

В принципе, язык и есть способ мышления. Все еще поражает, что у меня есть рост (хотя вру, не поражает), но рост есть.

Начал отличать здоровую от нездоровой функциональщины. Пока у нас в коде есть 2-3 кб нездоровой функциональщины. Нездоровая - это когда ты и твоя команда не понимает, как оно работает. В общем, у нас есть немного shapeless с небольшими включениями HList-ов. Базовую концепцию понять не сложно, но у нас кусок нездоровой. В принципе, я понимал, что это можно сделать магией, спросил на StackOverFlow, и получил кусок магии. Суммарно 2-3 дня вкуривания, и ... не помогло.

Еще в 2-3 местах хочется scalaz.Functor.lift, но не критично. По факту хочется лифтинга с базовой функции на коллекцию, что еще внутри параллелизм был. Одного метода вручную должно хватить.

Еще у нас есть имплициты (неожиданно, правда?), очевидно, у всех есть. А еще есть имплицит, который из одного имплицита достает что надо. То есть такой рекурсивный имплицит на один уровень.

Еще у нас есть 4Тб сырых данных и 9.5 млрд строчек там. Это так, что б померяться. Правда, это вся история, а не за сутки.

Еще у нас нет null-ов. Вообще. Zero. Хотя NPE был на этой неделе, но там запрос в легаси БД, где джоиняться 10 таблиц (какие-то дебилы писали), и на выходе где-то пусто оказалось. Но дальше этого null-ы не пройдут. ScalaStyle проверяет, что в коде нет слова null. И точка.

Еще у нас нет var-ов. Лукавлю, есть. Есть два итератора, и как-то внутри итераторов без стейта вообще сложно, особенно, если он нужен. И еще в одном/двух местах, но там не я, и надо выпиливать.

Еще понимаешь, что дело не в языке, а в людях/головах. Бывает отвернешься, смотришь коммит, а там на тебя смотрит Try[Option[List[String]]]. Или null, или var, однажды вообще break торчал. А ты такой, берешь лопату, и говоришь: "Не надо так". Потом идешь в continuous integration и добавляешь правило, что оно само следило за порядком.

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

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

Еще в одном месте доабстрагировались, что есть мини-OLAP, с иерархической агрегацией, и все это в N строчек кода. N - мало.

А еще я понимаю, что хвастаться - не хорошо.

А еще есть чудики, которые пишут, что язык ХХХ - говно, мы перешли на Go, и все стало круто. Другие, что компания, занимающаяся языком YYY произвела ребрендинг (поменяла название), что языку YYY - хана.

Из всего этого я понял, что мир не одномерен (читай, язык ХХХ - лучший), а как минимум трехмерен [команда, задача, технологии]. Но об этом кричат люди, которые даже не в команде.

В общем, не будьте плоскими. Можно считать это тостом.