![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я вернулся. Запишу кое-какие впечатления, для памяти.
Конференция была на порядок круче, чем недавняя 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 просто забавных, и всего пара-тройка откровенно дурацких.
Конференция была на порядок круче, чем недавняя 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 просто забавных, и всего пара-тройка откровенно дурацких.
no subject
Date: 2015-11-06 12:52 pm (UTC)Фортран форева!
PS. А что там с СУБД? А то мы сейчас как раз боремся с неработающими транзакциями в Оракле :)
no subject
Date: 2015-11-06 12:56 pm (UTC)Я сначала беспокоился, что это на самом деле сабтайпинг, и в функцию сравнения с типом "comparable -> comparable -> Bool" можно подставить, скажем, число и строку. Оказалось, что всё проще.
С СУБД всё плохо. Клеппманн показывал различные гарантии, которые предоставляют транзакции. Самое сильное — сериализабельность, т.е., такое же поведение, как если бы транзакции действительно шли однопоточным образом. Во многих СУБД по умолчанию идут более слабые гарантии — например, "read committed", при котором гарантируется только то, что транзакция будет читать ТОЛЬКО то, что пишут закоммиченные транзакции (кажется, это, например, умолчальное поведение MySQL). При этом вполне возможен, например, такой вариант: две транзакции, A и B; транзакция A пишет два значения в базу, транзакция B их читает. При такой гарантии может быть, что B прочитает одно значение ДО выполнения транзакции A, а другое — после, и увидит неконсистентное состояние базы.
Клеппманн давал табличку, какие гарантии предоставляют разные СУБД; я не помню, что там было с Oracle, но, кажется, по умолчанию сериализабельность не даёт никто.
One more thing: документация к СУБД может говорить "serializability", но это не значит настоящую сериализабельность. Там полная каша с терминологией.
no subject
Date: 2015-11-06 01:55 pm (UTC)no subject
Date: 2015-11-06 02:08 pm (UTC)Там написано, что в Oracle максимум — это snapshot isolation, что неплохо, но всё равно может лажать.
no subject
Date: 2015-11-06 03:02 pm (UTC)Если что, есть прикольный проект 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 транзакции.
no subject
Date: 2015-11-06 03:04 pm (UTC)no subject
Date: 2015-11-06 03:16 pm (UTC)В STM анализируется наличие изменений в прочитанных переменных перед накатом транзакции. При наличии изменений транзакция откатывается. Поэтому STM предоставляет serializable уровень.
no subject
Date: 2015-11-06 03:20 pm (UTC)no subject
Date: 2015-11-06 03:25 pm (UTC)Первая версия STM имела одну блокировку на все транзакции. Однако переменные можно снабжать (случайным) индексом блокировки и тогда можно блокироваться только на нужном объединении индексов. Например, работа с индексами 1 и 2 не будет пересекаться с работой с индексами 3 и 4. Взаимная блокировка устраняется упорядочением - для блокировки i > j надо забрать блокировку на j.
Уж не знаю, сделали ли это.
no subject
Date: 2015-11-06 03:29 pm (UTC)no subject
Date: 2015-11-06 04:05 pm (UTC)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.
Забавно они сделали то, что сделали.
Надо будет попробовать по-моему сделать.
no subject
Date: 2015-11-06 04:13 pm (UTC)А, ну, это неинтересно. Это кратковременные локи, удерживаемые только при КОММИТЕ транзакции, а не с самого ея начала. Implementation detail.
no subject
Date: 2015-11-09 10:01 am (UTC)no subject
Date: 2015-11-09 10:12 am (UTC)no subject
Date: 2015-11-09 10:19 am (UTC)2) их накладные расходы далеки от нуля.
no subject
Date: 2015-11-09 11:48 am (UTC)no subject
Date: 2015-11-09 01:26 pm (UTC)retry может вызвать livelock: http://stackoverflow.com/questions/6915079/difference-between-tvar-and-tmvar
Да, транзакции идут в параллель. Однако наличие заметных по накладным расходам блокировок может привести к бесконечным повторам (livelock).
no subject
Date: 2015-11-09 01:31 pm (UTC)Update: https://mail.haskell.org/pipermail/haskell-cafe/2009-June/062703.html
no subject
Date: 2015-11-09 02:02 pm (UTC)Эх.
Надо мне попробовать сделать блокировки STM по моей идее. Тогда получится 1) O(1) блокировок от размера транзакции (STM_CG_LOCK) и 2) вероятностное (а-ля фильтр Блума) пересечение времени удержания блокировок.
no subject
Date: 2015-11-09 03:03 pm (UTC)Против этого никто никогда и не возражал.
no subject
Date: 2015-11-06 02:58 pm (UTC)Но зато возможна ситуация, когда A пишет счёт[Зефиров]=1 (перевод рубля другу), B пишет x[10]=3 (перевод рубля от другого друга), и может быть любой порядок записей. Если, конечно, не устанавливать блокировок (SELECT FOR UPDATE).
Тут шестого декабря планируется встреча хаскелистов, думаю про это всё рассказать (пусть и мельком). Я буду про хранилище БД рассказывать.
no subject
Date: 2015-11-06 03:01 pm (UTC)