CodeMesh

Nov. 6th, 2015 01:20 pm
migmit: (Default)
[personal profile] migmit
Я вернулся. Запишу кое-какие впечатления, для памяти.

Конференция была на порядок круче, чем недавняя JoyOfCoding. Хорошая организация, много интересных докладов. Я завёл несколько новых знакомых; самое интересное знакомство — со Стефани Вайрих (или Уэйрич, я не знаю, как произносить её фамилию, по-немецки или по-английски), которая делала доклад про Dependent types in Haskell.

По пунктам.

День 0: Tutorials.
1) Building Web Services in Haskell! - Allele Dev
Отстой. Содержание доклада — веб-сервис на фреймворке Spock, который на базовом уровне не отличается от Happstack. Подача — докладчик три с половиной часа бубнит себе под нос возле экрана. Напомню, это tutorial — то есть, аудитория тоже должна что-то сделать, своими руками. Нифига. Я в конце концов стал читать книжку с flibusta.me.

По-видимому, надо было пойти на Concatenative Programming - William E. Byrd & Rob Martin.

2) Getting started with Elm - Evan Czaplicki
А вот это было здорово. Эван, как оказалось, работает в венгерской Prezi, куда я пытался интервьюироваться (неудачно). Тут были и hands-on, и юмор, и общение с аудиторией (вплоть до того, что аудитория голосованием решала, чем заниматься дальше). И Elm — интересная штука, своего рода Haskell, но с компиляцией в JS. Плюс собственный веб-сервер для дебага. Плюс time-travelling debugger (можно посмотреть всё, что происходило раньше). Плюс интеграция с внешним JS. В общем, вкусно.

Одна забавная вещь. В Elm нет тайпклассов (что, ИМХО, хорошо), но ограничивать полиморфизм как-то надо (OCaml-овское полиморфное сравнение — это бомба замедленного действия), так что чуть-чуть тайпклассов всё-таки есть: если имя переменной типа начинается с, например, comparable, то это как если бы к ней был контекст Ord. Свои тайпклассы делать нельзя, свои инстансы тоже.

День 1.
1) Keynote: Grace Murray Hopper: The Original Pirate Hacker - Melissa Pierce
Снова отстой. Больше феминистического активизма, чем чего-то интересного.

То, что Пирс очень похожа на Фредерику Лаундс из сериала "Ганнибал", причём и внешне и по голосу, не добавляет интереса.

2) The Road to Running Haskell at Facebook Scale - Jon Coens
Sales pitch. Неплохой, надо признать. Не думал, что Хаскель настолько "готов для десктопапродакшена". А у них реально хаскельные продукты обрабатывают миллионы запросов в секунду.

Ложка дёгтя: у них, всё-таки, работает Саймон Марлоу. Интересно, далеко ли они уехали бы без него?

3) CRDTs in Practice - Marc Shapiro, Nuno Preguiça
М-м-м... странно.

Они пытаются выполнять определённые операции асинхронно, ни разу не останавливая процессинг для синхронизации, а только обмениваясь данными. Это всё хорошо, но вот пример, который они показали, вызвал у меня устойчивые ассоциации с Operational Transformation. Когда я задал вопрос, Шапиро сказал, что единственная связь между их подходом и OT в том, что они рассматривают OT как пример "как не надо делать". Но выглядит всё равно очень похоже; у меня ощущение, что они разбили OT на части и запрятали их в разные места. Доказать не могу, это чисто ощущение, и больше ничего.

Возможно, дело в том, что OT я реализовывал в процессе трудоустройства в JetBrains (прерванный по моей инициативе), и это такой молоток, из-за которого мне всё кажется моими пальцами. Надо ещё почитать и подумать.

4) From Irrational Configuration System to Functional Data Store — Rob Martin
Ничего интересного. Что-то вроде отчёта о проделанной работе. Плюс у Мартина явно паттерн-ориентированное мышление.

Впрочем, ничего более интересного в это время не было.

5) Function-Passing, A New Model for Typed, Asynchronous and Distributed Programming - Heather Miller
Идея достаточно любопытная, чтобы не задумываться о возможных применениях. Миллер, кстати, сама сказала, что это pet project, и не факт, что из этого что-то выйдет.

Фишка в том, что вводится новая монада (хотя Миллер не произнесла это слово), но не в категории типов, а в её подкатегории, где морфизмами являются сериализуемые функции. То есть, функция сама по себе чистая, и всё, что она замыкает, обязано быть сериализуемым. Тогда можно хранить данные на разных нодах — причём данные уже могут быть не сериализуемыми. fmap понимается просто как передача функции туда, где лежат данные, и применение там (ленивое). (>>=) чуть сложнее, но, в общем, та же фигня. Реально интересно.

6) Accidentally Concurrent - Evan Czaplicki
И опять Эван. Он начал с того, что замоделировал мутабельную переменную как процесс (в стиле pi-calculus), после чего убеждал народ, что мутабельность — плохо, потому что в результате мы получаем разветвлённую сеть параллельных процессов, в которой сам чёрт ногу сломит, и всё влияет на всё. Он был прав, и опять забавен, пусть даже и не сообщил ничего реально нового.

7) Coordination-Free Designs for Mobile Gaming - Christopher Meiklejohn
Э-э-э... вообще не помню, о чём он говорил. Кажется, это опять был "отчёт о проделанной работе". Скучно.

8) Keynote: Propositions as Types - Philip Wadler
Старая гвардия. Лямбда-мэн рассказывал об истории, поминал Чёрча, Гёделя, Тьюринга и прочих, рассказывал анекдоты (как Гёдель придумал своё определение алгоритма в пику Чёрчу, Чёрч доказал, что их определения эквиваленты, сказал Гёделю: "вот, подавись", на что Гёдель ответил "ну, значит, моё определение неправильное"). Весело, и отлично подходит для полуфинала.

День 2.
1) Keynote: Why Functional Programming Matters - John Hughes Mary Sheeran
Хьюджеса я уже видел, на приснопамятной JoyOfCoding — он тогда всех веселил. На этот раз веселил всех Вадлер, а Хьюджес говорил довольно мало. Большую часть времени говорила Ширан, и это было скучно. Из её слов стало понятно, что функциональное программирование — это круто, потому что мы не знаем, сколько компараторов нужно, чтобы отсортировать 32 числа.

2) Beyonds Lists: High Performance Data Structures - Phil Trelford
Правильнее было назвать "Data Structures 101". Юзайте, дети, B+-деревья, и ваши волосы будут мягкими и шелковистыми.

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

3) Transactions: Myths, Surprises and Opportunities - Martin Kleppmann
Реально круто. Клеппманн говорил о том, какие гарантии предоставляет механизм транзакций в известных СУБД. Я не знал, что всё настолько плохо.

4) FRP and Functional Game Programming - Elise Huard
Ниачём. Возьмите любую вводную статью по FRP, косноязычно перескажите середину, и вот оно.

Вроде, ничего приличного в это время не было.

5) Depending on Types - Stephanie Weirich
Миленько. По сути, то же самое, что я показывал здесь, только не про списки, а про RB-деревья. А вот вторую часть мы с ней сейчас обсуждаем в почте.

6) Into Production - Jamie Winsor
Опять отчёт о проделанной работе, но несколько более занятный. Не знаю, может, я просто много кофе выпил.

7) My Little Pony - Darach Ennis, Sylvan Clebsch
Рассказывали о языке Pony. Много и хорошо шутили, потратили почти всё время на объяснение базового синтаксиса, после чего реально содержательную часть (разные виды ссылок) за недостатком времени скомкали до полной невозможности. Кстати, введения в Pony, которые мне случалось видеть, грешат тем же. Так и не узнал, насколько же этот язык крут.

8) Panel Discussion - Joe Armstrong, Don Syme, Bruce Tate, Josh Watzman, Tony Hoare
И опять на закуску старая гвардия. Веселее всех был Хоар, который повторил своё общеизвестное признание про "ошибку ценой в миллиард долларов", уточнив "миллиард долларов в год" и добавив, что это ОЧЕНЬ оптимистическая оценка.

Резюме. Из 18 выступлений разного сорта было 4 однозначно полезных, одно весьма спорное, 4 просто забавных, и всего пара-тройка откровенно дурацких.

Date: 2015-11-06 12:52 pm (UTC)
From: [identity profile] yatur.livejournal.com
> если имя переменной типа начинается с, например, comparable, то это как если бы к ней был контекст Ord

Фортран форева!

PS. А что там с СУБД? А то мы сейчас как раз боремся с неработающими транзакциями в Оракле :)
Edited Date: 2015-11-06 12:54 pm (UTC)

Date: 2015-11-06 12:56 pm (UTC)
From: [identity profile] migmit.livejournal.com
Ну, Эван сам признался, что это типакакбы хак.

Я сначала беспокоился, что это на самом деле сабтайпинг, и в функцию сравнения с типом "comparable -> comparable -> Bool" можно подставить, скажем, число и строку. Оказалось, что всё проще.

С СУБД всё плохо. Клеппманн показывал различные гарантии, которые предоставляют транзакции. Самое сильное — сериализабельность, т.е., такое же поведение, как если бы транзакции действительно шли однопоточным образом. Во многих СУБД по умолчанию идут более слабые гарантии — например, "read committed", при котором гарантируется только то, что транзакция будет читать ТОЛЬКО то, что пишут закоммиченные транзакции (кажется, это, например, умолчальное поведение MySQL). При этом вполне возможен, например, такой вариант: две транзакции, A и B; транзакция A пишет два значения в базу, транзакция B их читает. При такой гарантии может быть, что B прочитает одно значение ДО выполнения транзакции A, а другое — после, и увидит неконсистентное состояние базы.

Клеппманн давал табличку, какие гарантии предоставляют разные СУБД; я не помню, что там было с Oracle, но, кажется, по умолчанию сериализабельность не даёт никто.

One more thing: документация к СУБД может говорить "serializability", но это не значит настоящую сериализабельность. Там полная каша с терминологией.
Edited Date: 2015-11-06 01:48 pm (UTC)

Date: 2015-11-06 01:55 pm (UTC)
From: [identity profile] yatur.livejournal.com
Спасибо. Про read committed, фантомы и прочие интересности написано в доках. Там действительно много путаницы с терминологией, но к этому быстро привыкаешь. Я думал, он проводил более гоубокий анализ.

Date: 2015-11-06 02:08 pm (UTC)
From: [identity profile] migmit.livejournal.com
Вот, нашёл его проект по тестированию всего этого дела: https://github.com/ept/hermitage

Там написано, что в Oracle максимум — это snapshot isolation, что неплохо, но всё равно может лажать.

Date: 2015-11-06 03:02 pm (UTC)
From: [identity profile] thesz.livejournal.com
serializable - это обязательное упорядочение по блокировкам.

Если что, есть прикольный проект Calvin: http://cs-www.cs.yale.edu/homes/dna/papers/scalable-calvin.pdf и https://github.com/yaledb/calvin (для смеха рекомендую посмотреть на реализацию paxos).

Цитата из статьи: Calvin’s scheduling mechanism then processes this request log, deciding when each transaction should be executed in a way that maintains an invariant slightly stronger than serializable isolation: transaction execution may be parallelized but must be equivalent to a serial execution (a) in the order that transaction requests were logged and (b) that does not non-deterministically cause transactions to abort.

Это пример, как делать правильные serializable транзакции.

Date: 2015-11-06 03:04 pm (UTC)
From: [identity profile] migmit.livejournal.com
Если я правильно понимаю, то подход STM тоже подпадает под serializable (я спросил Клеппманна, но он в STM не рубит).

Date: 2015-11-06 03:16 pm (UTC)
From: [identity profile] thesz.livejournal.com
Именно так.

В STM анализируется наличие изменений в прочитанных переменных перед накатом транзакции. При наличии изменений транзакция откатывается. Поэтому STM предоставляет serializable уровень.

Date: 2015-11-06 03:20 pm (UTC)
From: [identity profile] migmit.livejournal.com
Но там с блокировками не особенно.

Date: 2015-11-06 03:25 pm (UTC)
From: [identity profile] thesz.livejournal.com
Зависит.

Первая версия STM имела одну блокировку на все транзакции. Однако переменные можно снабжать (случайным) индексом блокировки и тогда можно блокироваться только на нужном объединении индексов. Например, работа с индексами 1 и 2 не будет пересекаться с работой с индексами 3 и 4. Взаимная блокировка устраняется упорядочением - для блокировки i > j надо забрать блокировку на j.

Уж не знаю, сделали ли это.

Date: 2015-11-06 03:29 pm (UTC)
From: [identity profile] migmit.livejournal.com
Э-э-э, разве в STM вообще есть блокировки?

Date: 2015-11-06 04:05 pm (UTC)
From: [identity profile] thesz.livejournal.com
Да.

https://github.com/ghc/ghc/blob/master/rts/STM.c

* STM_UNIPROC assumes that the caller serialises invocations on the STM
* interface. In the Haskell RTS this means it is suitable only for
* non-THREADED_RTS builds.
*
* STM_CG_LOCK uses coarse-grained locking -- a single 'stm lock' is acquired
* during an invocation on the STM interface. Note that this does not mean that
* transactions are simply serialized -- the lock is only held *within* the
* implementation of stmCommitTransaction, stmWait etc.
*
* STM_FG_LOCKS uses fine-grained locking -- locking is done on a per-TVar basis
* and, when committing a transaction, no locks are acquired for TVars that have
* been read but not updated.

...

* lock_stm & unlock_stm are straightforward : they acquire a simple spin-lock
* using STM_CG_LOCK, and otherwise they are no-ops.

Забавно они сделали то, что сделали.

Надо будет попробовать по-моему сделать.

Date: 2015-11-06 04:13 pm (UTC)
From: [identity profile] migmit.livejournal.com
> the lock is only held *within* the implementation of stmCommitTransaction, stmWait etc.

А, ну, это неинтересно. Это кратковременные локи, удерживаемые только при КОММИТЕ транзакции, а не с самого ея начала. Implementation detail.

Date: 2015-11-09 10:01 am (UTC)
From: [identity profile] thesz.livejournal.com
Количество блокировок O(размер лога транзакции) для точных блокировок и удерживаются O(размер лога транзакции) в случае одного блока (да и в случае точных блокировок тоже).

Date: 2015-11-09 10:12 am (UTC)
From: [identity profile] migmit.livejournal.com
Э-э-э... ичо?

Date: 2015-11-09 10:19 am (UTC)
From: [identity profile] thesz.livejournal.com
1) блокировки есть,

2) их накладные расходы далеки от нуля.

Date: 2015-11-09 11:48 am (UTC)
From: [identity profile] migmit.livejournal.com
Как я уже говорил: это не те блокировки. Транзакции всё равно идут в параллель.

Date: 2015-11-09 01:26 pm (UTC)
From: [identity profile] thesz.livejournal.com
https://mail.haskell.org/pipermail/haskell-cafe/2009-June/062749.html

While either optimistic[1] or pessimistic[2] STM can livelock, this can be solved by some sort of exponential backoff algorithm (which does not guarantee progress, just makes a livelock less likely).


retry может вызвать livelock: http://stackoverflow.com/questions/6915079/difference-between-tvar-and-tmvar

Да, транзакции идут в параллель. Однако наличие заметных по накладным расходам блокировок может привести к бесконечным повторам (livelock).

Date: 2015-11-09 01:31 pm (UTC)
From: [identity profile] migmit.livejournal.com
Я окончательно перестал понимать, в чём твой пойнт.

Update: https://mail.haskell.org/pipermail/haskell-cafe/2009-June/062703.html

There will always be at least one process making
progress, but potentially at the expense of starving others indefinitely
(a form of livelock).
Edited Date: 2015-11-09 01:37 pm (UTC)

Date: 2015-11-09 02:02 pm (UTC)
From: [identity profile] thesz.livejournal.com
Укрытие блокировок в "одно место" не избавляет от возможности нанести себе вред блокировками. См. последний параграф твоей ссылки.

Эх.

Надо мне попробовать сделать блокировки STM по моей идее. Тогда получится 1) O(1) блокировок от размера транзакции (STM_CG_LOCK) и 2) вероятностное (а-ля фильтр Блума) пересечение времени удержания блокировок.

Date: 2015-11-09 03:03 pm (UTC)
From: [identity profile] migmit.livejournal.com
> Укрытие блокировок в "одно место" не избавляет от возможности нанести себе вред блокировками.

Против этого никто никогда и не возражал.

Date: 2015-11-06 02:58 pm (UTC)
From: [identity profile] thesz.livejournal.com
Read committed, по идее, не позволяет описанного поведения. Транзакция выполняет commit и после этого все видят изменения A и B.

Но зато возможна ситуация, когда A пишет счёт[Зефиров]=1 (перевод рубля другу), B пишет x[10]=3 (перевод рубля от другого друга), и может быть любой порядок записей. Если, конечно, не устанавливать блокировок (SELECT FOR UPDATE).

Тут шестого декабря планируется встреча хаскелистов, думаю про это всё рассказать (пусть и мельком). Я буду про хранилище БД рассказывать.

Date: 2015-11-06 03:01 pm (UTC)
From: [identity profile] migmit.livejournal.com
A и B — разные транзакции.