eaxcast-s02e03/

Темы юбилейного десятого выпуска: какой язык круче, Haskell или OCaml, есть ли жизнь с eventual consistency, почему все приложеньки убегают от нас в веб, почему Haskell не будет работать на JVM, а также что и куда торчит у Clojure с F#, что нового нас ждет в Riak 2.0 и великая мудрость о том, в какой именно момент появляется необходимость в масштабировании. Предыдущие выпуски: девятый , восьмой , седьмой , шестой .

Слушать онлайн:
http://eaxcast.podfm.ru/_eaxcast/10/

Скачать файл:
http://eaxcast.podfm.ru/_eaxcast/10/file/podfm_eaxcast__eaxcast_203.mp3

Шоу нотес:

Голоса выпуска: Владимир @vshabanov Шабанов, Валерий @sum3rman Мелешкин, Сергей @kpy3 Елин, Александр @afiskon Алексеев

Фоновая музыка: The Panets — Winter Beats (Big Power Mix)

Сергей: Всем привет, вы слушаете подкаст EaxCast выпуск три второго сезона. И в этом выпуске мы продолжаем благодарить тех, кто дал нам на BoomStarter более 500 рублей. Это Сергей Максимов, Сергей Скороходов, Black White, Alexander Kucherenko, Владимир Коваленко, Александр Олейник, Ivan Bazanov, Эд Шанг, Vitaliy Andreev, Андрей Богомолов, Арсений Зинченко, Alexey Ponasenko, IC Rbow, Alexey Astafyev, Павел Волковицкий, Anton Belov, Павел Мартынов, Alexandr Shakun. Как я справился?

Александр: Ты, Сереж, справился отлично, не считая того, что Вадим Коваленко, а не Владимир.

С: Да. Давай я скажу отдельно Вадим Коваленко, а ты потом вклеишь. Ты на это мастер. Потому что я весь список не повторю.

А: Мне влом 🙂

[Что-то очень неслабо бабахает на заднем плане]

Ух ты, это у нас сегодня гром и молния. Так что иногда у нас за кадром будут такие ужасные грохоты. Мы с ними, видимо, ничего не можем сделать.

А в выпуске сегодня Сережа Елин, вы его конечно же узнали. Я, Александр afiskon Алексеев, Валерий Мелешкин, привет, Валер.

Валерий: Привет.

А: И наш специальный гость Владимир Шабанов. Привет, Вов.

Владимир Шабанов: Привет, привет.

А: Вов, тебя немножко тихо слышно, говори громче, не стесняйся, нечего бояться.

ВШ: Привет, привет! Так лучше слышно?

А: Да, да, так слышно намного лучше. И традиционный вопрос, который я задаю всем гостям поголовно. Пожалуйста, расскажи нам немного о себе. Ну, так, вкратце, родился, вырос, все такое.

ВШ: Немножко о себе. Я, как легко догадаться, программист, родившийся в городе герое Москве. На данный момент мне почти 32 года, программирую я… В седьмом классе я пошел во дворец пионеров в кружок программистов, потом как-то я попал в техникум, и уже курсе на втором начал зарабатывать даже какие-то деньги программированием. То есть, можно считать, что с 11 класса. Ну, и, дальше, без остановок, программировал-программировал. По дороге окончил техникум, окончил Бауманку , правда не по программированию. В армию не хотелось, а поступить на программиста было тяжело, поэтому я стал инженером конструктором, можно сказать, токарем-программистом.

С: То есть, ты программируешь токарные станки?

ВШ: Нет, конечно я их не программирую. Но просто у меня получилось, что я одновременно и инженер конструктор, хотя только по образованию. А так все время работал программистом. Хотя, за токарным станком тоже стоял на какой-то практике, и даже начальнику цеха очень понравилось, как я точу какие-то фаски. Но я не согласился выйти работать в субботу.

Детей нет, жена есть, гражданская. Работал я когда-то, первая работа была, с записью звука, причем всякой: телефонов, микрофонов, для служб безопасности записывали телефонные разговоры всяких там людей, чтобы они не распространяли военные тайны. Соответственно, куча всяких обработок этого звука, всяких интерфейсов, писалок круглосуточных, много всего было. Это было на плюсах, C++ Builder, много чего еще было по дороге.

Потом попал, ну, не совсем gamedev, делал игрушки, но для игровых автоматов, когда у нас был рассвет этого дела. Соответственно, когда потом начали это дело гнобить, и, в общем-то правильно сделали, эта работа закончилась. Но вот как раз там я делал игрушки на OCaml . Как-то так получилось, что пошел на новую работу, до этого на старой была куча legacy, а на новой можно было начать с нуля. И я подумал, а что бы мне на OCaml бы не попробовать. На Haskell тогда побоялся, потому что он тогда еще был подозрительно тормозной. И я подумал, что игрушки на нем делать стремно. А OCaml был на втором месте после Си в каком-то там shootout-бенчмарке .

В: Дух Haskell сейчас негодует на заднем фоне.

ВШ: Ну, это было достаточно давно, это было в 2004-2005. Тогда у Haskell еще были какие-то проблемы, особенно со сборкой мусора, она тогда еще была не параллельной. Хотя, тогда еще и многоядерных компов-то еще толком не было. Но в общем, подвисание в игрушке больше чем на длительность кадра из-за сборки мусора — не очень хорошо, будет все дергаться. И, в общем, я побоялся, хотя это можно было обойти. И это уже история.

Дальше, соответственно, это дело подзатухло, поскольку игровые автоматы начали гнобить. И пошел искать другие работы. По мелочи поработал в другой игро-конторе, но там мутная какая-то контора оказазалась, потом что-то начал ходить по собеседованиям. Было начало 2009, разгар кризиса и прочая фигня. Люди везде удивлялись запросам о зарплатах, особенно в игродельных конторах. И как-то я подумал, не написать ли мне Зефирову . Комментировал я в его ЖЖ-шечке давно, да и вообще я его с фидошных времен почитывал, еще тогда запомнился. Написал, и стал в итоге работать с Зефировым. Тут уже был Haskell, немножко Java, немножко C#, и вообще все подряд было. Там мы делали супер-пупер мега систему для разработки всякой микроэлектроники. Не для электроники, в смысле платы разводить. А для электроники типа всяких, для которых VHDL тот самый. Микросхема, по сути. Плюс еще и прошивки. Как там? «И хакал я твою игрушку своим дебагером». Я даже писал сишный дебагер, работающий с этими прошивками. В общем, там забавно было.

Потом захотелось мне сделать читалку RSS, в которой можно комменты читать. Потому что запарило с Google Reader переходить и смотреть, не откомментили ли что-нибудь интересное в посте. И я ее начал потихоньку фоном делать. И заодно еще копить деньги, чтобы… Достаточно трудно заниматься и работой, и одновременно чем-то еще. Потому что уже не 15 лет, а ближе к 30. Тяжело, когда и работа, и семья, и что-то свое еще делать. Соответственно, что-то поднакопил, что-то поднаписал по всяким вечерам и выходным. И, собственно, пошел в кругосветное плавание — уволился и начал работать над ридером full time, начал его делать. Потом я его какой-то сырой выпустил, как говорится «если вам не стыдно за свою первую версию продукта, значит вы ее слишком поздно выпустили».

Выпустил, конечно, были радужные мечты, что, конечно, всем понравится и все начнут срочно покупать пачками. Конечно же, этого не произошло. Кому-то понравилось, но реализация оставляла желать лучшего. И его я пилил-пилил, улучшал-улучшал, пошли какие-то продажи. Еще не за то, что… Первый чувак, который купил, я ему написал: «Спасибо, что купили. Что вам в ридере понравилось, чего бы вы хотели улучшить?». И он написал первую же просьбу: «А можно ли у вас сделать, чтобы комменты спрятались?». В ридере, который делался для показа в нем комментов! Я так несколько удивился, сделал несколько режимов просмотра, чтобы можно было… В начале было все развернуто, местами слишком много, и я спросил у товарища: «А зачем ты, собственно, вообще купил? Если первое, что тебе нужно, это убрать комменты?» Это единственная на тот момент отличающая черта его была. Он сказал, что работает супер-пупер быстро, задолбал тормозной гуглоридер.

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

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

А потом закрылся Google Reader, и пошло поехало. Стало жить веселее, народу навалило много, на такое количество я не рассчитывал совершенно. Как ни странно, вся эта штука с этим справилась, не развалилась ни от хабраэффектов. Не развалилась, пробыв почти сутки на Hacker News , на главной. И, в общем, отлично сработал. Когда были эти события, у меня в reader был один единственный, он еще не был распараллелен и распределен, был один единственный бинарик запущен, который все это выдерживал. И crawler, который вытаскивает фиды и комменты, тоже был один единственный бинарик, тоже не был распределен. И все это выдержал. Это к вопросу о производительности Хаскеля.

С: Володь, ты так интересно рассказал нам про свой проект, но так и не назвал его.

ВШ: У него название не очень хорошее. Называется он BazQux . Есть foo, bar, а за ними идет baz, qux. Как оказалось, далеко не все знают третью и четвертую метасинтаксическую переменную. А еще оказалось, что по-английски она звучит не «кукс», а «куакс». Если б знал, наверное так не назвал, и, более того, по-английски многие люди вообще не могут это прочесть, потому что в английском языке после букв Q и U обязательно должна идти гласная, «quit», «quality». Обязательно что-то должно быть. Если идет согласная, нативный, то есть, у кого английский язык родной, они путаются и вообще не знают, как назвать. Так что название у меня крайне «удачное». Думаю, все-таки его поменять на что-нибудь. Но, пока еще не придумал, на что. Хотя это не мешает тому, что половина тех, кто покупает — из англоговорящих стран.

С: А много у тебя сейчас подписчиков?

ВШ: Подписчиков на самом деле не так много, как хотелось бы, порядка трех тысяч. Но зарегистрировавшихся раз в десять с чем-то больше. У меня еще достаточно хорошая конверсия между количеством зарегистрировавшихся и купивших.

С: Да, действительно, от себя могу сказать, что твоя читалка, с моей точки зрения, почти близка к идеалу. Я в свое время когда с гугла уползал, когда он закрылся, пожалуй «базкукс» или «базкуикс» — единственная читалка, в которой я провел много времени. Я сейчас открою страшную тайну, я ей пока не пользуюсь, но планирую в нее переехать, потому что моя штатная читалка перестала меня устраивать.

А: Вов, скажи, если мои подсчеты в уме и не только верны, я так понимаю, твой стартап тебя сейчас полностью кормит?

ВШ: Ну, да, я живу за счет него. Хотя, за вычетом расходов на серваки, у меня получается, что если б я работал, зарплата у меня была б скорее всего больше, чем я имею со стартапа. Но у стартапа есть свои плюсы.

А: Ты работаешь на себя, и, наверное, это не так уж напряжно. Ну, ты большую часть времени ничего не делаешь, а оно капает, разве не так?

ВШ: Ну, на самом деле, я очень много добавляю различных вещей, работаю я над ним достаточно плотно. Хотя, в последнее время, уже по облегченной программе, потому что, ну, как, сколько можно так работать.

А: А ты этим до сих пор один занимаешься? У тебя есть какая-нибудь команда?

ВШ: Я этим всем один занимаюсь, потому что на команду у меня и фичей столько нет, наверное, чтобы на команду, и средств особых нет. У меня получилось так, что у меня когда все это началось, много серверов затарил, и достаточно большую часть суммы, которая мне пришла, основная часть пришла летом, дальше уже пошел некий спад ажиотажа, уже меньше народу. И я большую часть этой суммы, в принципе, на сервера спустил. У меня сейчас что-то идет, что-то капает, но на данный момент моя зарплата вообще небольшая. Но, вот, приближается лето, «зима близко».

А: Скажи, ты как-то сейчас продвигаешь BazQux? Реклама, там, в Google AdSense или еще где-то?

ВШ: Я пробовал продвигать его через Google рекламу, но оказалось, что оно как-то совершенно нерентабельно. Что-то примерно, 5000 потратил, 500 или 1000 заработал. Вообще ни о чем. Положим, продлят там через год, через два, через три, ну будет больше общая итоговая сумма, но все равно не уверен, что это окупится. Реклама в гугле как-то не дала должного эффекта.

Самую лучшую рекламу получается делать не у меня, а когда кто-то, кто пользуется, у кого есть более-менее популярный блог, он пишет, что пользуюсь этой штукой, очень нравится, и народ оттуда валит. Ну, и иногда попадаются какие-то ссылки просто на realworld проекты на Haskell, а что-то на Ur/Web , по каким-то программистским темам попадаются ссылки. А вот так просто по рекламе, с рекламой у меня туговато.

Если бы я умел бы хорошо рекламировать, у меня было бы намного больше пользователей. У меня, собственно, сейчас как раз делается меньше фич, и читаю больше по маркетингу. И думаю что-нибудь, может поспонсировать популярные блоги, когда привалит летнее бабло, ну и там посмотрю, сейчас у меня достаточно хороший продукт, и в общем-то… Ну, продукт, всегда надо продвигать, но сейчас, думаю, это надо особо усилить. Просто я программист, а не рекламщик, и мне это достаточно тяжело, чего-нибудь кому-нибудь впаривать. Или кому-нибудь объяснять, что это круто. У тех кто пользуется, получается это гораздо лучше, чем у меня.

А: Я тоже не большой рекламщик, но когда-то прочитал немного книжек про SEO и все такое. Так что я от себя скажу, что BazQux очень хорошая читалка, и вы, дорогие слушатели, должны хотеть ею пользоваться. Вы регистрируетесь на BazQux, продлеваете, оплачиваете себя аккаунт на год, и у вас сразу жизнь становится не жизнь, а просто сахар.

С: Правда-правда.

А: Не, серьезно, нормальная читалка, пацанская. Я ее без приколов советую.

Вов, скажи пожалуйста, вот ты, если я правильно понимаю, лет 6 писал на Haskell, а до этого лет 5 на OCaml. Вот сейчас, в третьем-то тысячелетии, в эпоху сплошных многоядерных процессоров и параллельных да concurrent сборщиков мусора, что круче? Haskell или OCaml ?

ВШ: Ну, я уже сколько-то лет назад перешел с OCaml на Haskell. Он уже тогда был круче, и тогда еще не все было… Я тогда перешел на него, потому что он сам по себе как язык круче. Потому что пишешь на OCaml-ле и думаешь, а вот тут бы typeclass сделать вместо вот этих каких-то непонятных огромных функторов. Тут бы я операторчик свой добавил, тут бы что-нибудь еще придумал. И сама разработка на Haskell — грузишь целый модуль, потом дергаешь что-то в репле. А в Caml-е все как-то одно, как в Emacs когда пишешь, посылаешь одно за другим эти выражения. Когда какой-нибудь модуль из зависимых ты подправил, надо его как-то геморройно перезагружать все это дело. В общем, там сама разработка не очень прикольная. В Haskell взял модуль, загрузил, все зависимости загрузились. Что-то в зависимости поменялось, взял все перезагрузил. Сама база разработки уже комфортнее. А уж как язык он гораздо мощнее. Плюс ленивые вычисления . Да, они там память могут где-то и зажрать, но со временем это все уходит, а выразительную силу они гораздо большую имеют. Можно делать больше всяких прикольных штучек, и не геморроиться. То есть, тупо лучше как язык. А сейчас с runtime, и с библиотеками, в общем сейчас он лучший как платформа также.

С: Скажи, а насколько он хорош в продакшене, по твоему опыту?

А: Сколько раз падал с утечками из-за ленивых вычислений? Всякие эрлангисты, они любят на эту тему потроллить.

С: Не только на эту, извини, что перебиваю, но еще на тему, что у Эрланга есть прекрасный remsh, в который ты можешь всегда попасть и что-то там быстро проверить, почекать, подправить, захотдэплоить.

А: Я переформулирую вопрос. Как же так, server side на Haskell, и без remsh да и с ленивыми вычислениями? Это не может работать!

ВШ: Для начала, это работает. Из-за ленивых вычислений оно за все время… Ну вот я как-то раз чего-то где-то забыл, запустил, а потом на следующий день смотрю по логам, что у меня что-то отожрало кучу гигов, да еще ушло в своп. Но благодаря SSD даже то, что оно ушло в своп, оно ничего не убило.

А поскольку это произошло после очередного деплоя, я посмотрел, что в последний день делал, увидел, что может повлиять, и поправил. Ну, была утечка, которая прошла в продакшен. Но она не нанесла большого ущерба, была быстро исправлена. Были еще утечки в процессе разработки, не дошедшие до продакшена, когда я еще crawler делал. Но там они heap profiler’ом вполне находились, лечились. И в целом, необходимость куда-то залезть, в remsh и что-то там сделать, я спокойно могу порешить процесс reader’а. Как у меня делается deploy — делается make, и делается kill этого reader’а, и он перезапускается. Мне ничего не мешает пришить, поправить. То есть, черт его знает, у меня не было таких ситуаций, что там что-то произошло совершенно непонятное, и мне нужно обязательно туда залезть, чтобы что-то разобраться, что там произошло.

А: Я, если честно, не очень понял насчет reader’а. Ты не мог бы поподробнее рассказать?

ВШ: Ну, reader — это что? Процесс с сервером встроенным вебовским. Этих процессов несколько, и даже если он один, то, в принципе, не так много там запросов в секунду валит. Обломится кто-нибудь, вряд ли кто-нибудь заметит. В общем, у меня система, которая не работает так, что сервит видео и нельзя остановить. У меня все запросы короткие. И если один из миллиона запросов за день, или сколько там, обломается — ну и фиг бы с ним, я могу посмотреть, перегрузить. А такого, чтобы происходило вообще непонятное, как-то не было такого.

А: Валера там притих. Я знаю, у него накопилась масса вопросов.

В: Начну совершенно с другого конца. Когда речь шла о gamedev, ты сказал, что не стал пользовать Haskell тогда, в частности потому что боялся долгого garbage collect. Но ведь и в OCaml тоже garbage collection, и OCaml, сам по себе его рантайм, тоже не умеет жить с многими тредами. Хотя, руками, конечно можно себе сделать.

ВШ: Дело в том, что у OCaml-а сборщик мусора инкрементальный. У него есть минорные сборки, а мажорные по чуть-чуть идут. У Haskell мажорный сборщик по-моему до сих пор не инкрементальный. Он делает одно большое копирование всех данных. Поэтому у OCaml эти сборки небольшие, одна сборка проходит за много шагов. А у Haskell она большая, и она такая «stop the world» , мы все останавливаем, делаем сборку. Сейчас не уверен на счет «stop the world», и насколько она инкрементальная, я не слежу особо за тем, что там происходит. Но у OCaml она инкрементальная, и OCaml еще по производительности самой по себе, все-таки тогда там не было таких хороших оптимизаций в GHC. Он еще в принципе быстрее работал. Выбрал потому, что он был второй в shootout после Си. И это было главной причиной. Про то, что сборка может тормозить я уже несколько позже обнаружил.

В: А ты писал двухмерные игры или трехмерные?

ВШ: И двухмерные, и трехмерные.

В: И как с библиотеками для этого дела было? У OCaml? Или ты делал биндинги к Си?

ВШ: У OCaml я просто, двухмерное, что — написал на OpenGL, и там ничего особого не нужно. Картинка загрузилась, уж не помню, чем я ее там загрузил, а к OpenGL binding-и есть. Для 2D там квадратики рисовать, ничего особенного. Для 3D игрушки я использовал OpenSceneGraph , хотя я с ним… Ну это плюсовая библиотека. Приделал к ней binding, и, в общем-то, об этом пожалел в итоге. Я столько навозился со всей этой стыковкой, со всей фигней, что по той же бы схеме сделав только то, что мне нужно, сделав это ручками, я сделал бы, наверное, это быстрее. Но тогда я был такой опытный 3d-шник, что понаделал всяких ошибок, из-за чего проект основательно затянулся, из-за чего были всякие неприятности.

В: А это все работало на какой-то одной вариации железа?

ВШ: Ну, да, поскольку это игровой автомат, это одна. Ну, хотя, там не совсем одна, там в одной партии закупили одно, в другой — другое. Но предварительно тестили, но как-то раз купили кучу видюх ATI-шных, а под линуксом ATI-шные дрова под OpenGL были какие-то ужасающие. Оно под виндой подавало 100 с чем-то кадров в секунду, а под Линуксом 30-50, в общем раза в два или в три медленнее. И тогда, да, было весело, видюх уже взяли много. Потом когда на NVidia перешли, стало как-то легче. Но, в основном, конечно, на одном железе.

А: С таким багажом опыта, после написания прошивок для железок, после написания игр, тебе в этом нашем унылом вебдеве да серверсайде — тебе не скучно этим заниматься? На а чего там? Сходил в базу, отдал результат…

ВШ: Ну, как сказать. Вот я начал «сходил в базу, отдал результат», и оказалось все не так просто. У RSS-ридеров есть фишка, что они очень много всего пишут, у них постоянно все обновляется, куча записей, и бедный PostgreSQL начал отлично рассыпаться, дико тормозить, retry-ить транзакции и вообще. Может оно как-то и просто, но повозиться, чтобы reader стал нормально работать с хорошей скоростью, выдерживать нагрузки, повозиться пришлось нормально так. Как сказать, мне в свое время было неинтересно web и базы данных, потому что все подряд этим занимались. А мне это нафиг не нужно, что я буду делать, что все подряд делают. Была у меня такая штука, это, наверное, еще в техникуме было. Потом было, что вот, я пишу на OCaml и на Haskell, а там надо будет писать на PHP каком-нибудь. Тоже меня ужасала эта перспектива, да еще и на Javascript, который тоже динамически типизированный .

Но захотелось сделать reader свой. Но он должен был быть web-овский. Появилась задача под web, ну и вообще как бы сейчас все переходит в web. Десктопные приложения какие-то остаются, но все идет туда, никуда не денешься. Так или иначе там окажешься. И тут я еще увидел Ur/Web, который позволяет мне писать не на PHP, не на Javascript. Я, собственно, когда Ur/Web увидел, и начал reader на нем делать. Идея у меня была достаточно давно, только очень не хотелось этим заниматься. Так что я себе сделал интересный web при помощи того, что я использую такие нестандартные инструменты.

А: Скажи, а как ты относишься к Java и JVM как платформе. Там тоже есть функциональные языки, например OCaml-Java или есть даже Haskell, он там называется, сейчас я попробую, он там называется Frege . Но при этом есть множество библиотек, которое ты можешь очень удобно подбиндить. Ты смотрел в этом направлении, как вообще относишься к JVM?

ВШ: Ну, на Java я практически ничего не писал. У меня получилось, что я писал на C++, а потом, собственно, на OCaml с Haskell. Ну, там, что-то вот как раз в ПРОСОФТ когда с Зефировым работал, приходилось пилить на Java. Но, в общем, у меня мало опыта Java, мне ее огромное количество библиотек ничего не говорит. Потому что я все равно ими не владею и не видел. Так, в целом, JVM, она несколько дольше запускается и у нее, и у всех этих языков, должны будут торчать уши этой JVM, точно так же как под .NET сделали F#, а оттуда все равно этот .NET торчит. Я залез в F#, увидел там null, и закрыл вкладку. Потом я еще на что-то такое натыкался.

Когда я после Си писал на OCaml и понимал, что у меня нет null, нет никаких проблем с поинтерами, и вообще там ничего. И тут я увидел их в F#. Я так думаю, в Java тоже что-нибудь будет лезть. Та же самая Clojure на Java зафигачена, и народ жалуется, что там какие-то ужасные стэктрейсы на какие-то другие проблемы. Ну, в общем, не знаю, мне не очень нравится. Это очень хорошо, если вы уже пишите что-нибудь на Java, и вы хотите от нее как-то уйти, и есть море легаси. Да, такой промежуточный вариант хорош. Но если вы хотите делать что-то новое, то лучше как-то брать чистое, только тру, только хардкор. Тот же самый Haskell на JVM я не думаю, что его получится сделать так, чтобы он эффективно работал, не меняя что-нибудь в самой JVM. Собственно, и .NET тоже, в нем надо что-то менять, чтобы Haskell эффективно работал.

А: А можно поподробнее, что на твой взгляд может в JVM мешать Haskell нормально работать?

ВШ: JVM точился под мутабельный язык, с неленивыми вычислениями, а Haskell — это прямая противоположность, у него ничего не мутабельное, вычисления ленивые. Как минимум нужны будут какие-то оптимизации для той же самой ленивости. В Haskell их там много специализированных — специальные там битики в указателях, сам компилятор неленивое что-то вставляет, правильное. В общем, когда есть язык и рантайм чисто под этот язык, в любом случае можно накрутить чего угодно. А когда рантайм под императивный язык, а на нем мутится что-то функциональное, все равно будут какие-то несостыковки.

А: У тебя, как я понимаю, в продакте Riak ? Как он тебе?

ВШ: Риак мне очень нравится тем, что его админить… собственно, просто не надо его админить. Такая штука, что захотел добавить комп, сервак, добавил, никаких проблем. Захотел апгрейдить сервак — остановил, запустил. Захотел проапгрейдить сам Riak — можно не останавливая Riak, останавливая ноду за нодой, делать обновление версии. Не нужно останавливать весь Riak, чтобы обновить его до следующей версии. С операционной точки зрения очень удобно. Когда Google объявил о закрытии Google Reader, повалило куча народу. Я был в таком полуобморочном состоянии, следя, чтобы ничего не рассыпалось, отвечая на кучу писем и комментариев… А тут стало место на хардах заполняться, нагрузка возросла. Начал апгрейдить серваки, и в общем, в таком полуобморочном состоянии спокойно их всех обновил, и ничего не произошло.

Есть такая поговорка, что необходимость масштабирования всегда появляется внезапно. И вот Riak для таких вот вещей, что внезапно надо размасштабировать, а вы все офигели от того, что происходит, он очень хорош.

В: А расскажи, как ты с eventual consistency живешь?

ВШ: С eventual consistency… Ну, собственно, есть у меня typeclass Resolvable, с функцией resolve.

В: То есть, ты делаешь merge, по сути, на уровне бизнес-логики?

ВШ: Ну, да, да. Но оно встроено. Когда я делаю, есть библиотека riak , которая на hackage пакет, в нее уже встроены все эти штуки, чтобы делать resolve. И когда там делается get, и если там несколько вариантов этих sibling, то он вызывает для них функцию resolve. Конечно, функцию resolve надо писать более-менее с умом, понимая, что один там может быть вообще пустой. Кстати, это, наверное, самая главная фишка в Riak, которую нужно делать. Нужно всегда ставить «allow mult», потому что по умолчанию он не стоит, и это как бы большая беда. По-моему, в новых версиях они уже сделали его по-умолчанию.

Произошло один раз — подсоединили мне новый сервак, как-то не на гигабит, а на 100 мегабит. Я их попросил проводочек починить, что там за фигня такая. Они мне случайно зацепили еще другой сервак, и получилось, что не то, что partition произошел, но на какое-то мгновение Riak не сообразил, что у него из тройной его репликации два уже отвалилось. И он некоторые значения начал читать как пустые, с одного прочел, а с двух других ничего не прочел. А потом, когда шнурок обратно вставили, он их смерджил и на некоторых значениях у меня не стояло «allow mult», стоял «last write win», и я получил, что у меня снеслись тупо значения. Прочлось пустое, в него там что-то добавилось, а все, что было до этого — снеслось. Я потерял какую-то часть данных, слава Богу немного, и не особо критичную, но было очень неприятно все это дело восстанавливать. Так что в Riak всегда надо ставить «allow mult», и писать вот эти функции для разрешения конфликтов.

В: По следам того, что ты сейчас сказал, у меня к тебе два вопроса еще. Не возникало ли у тебя желания воспользоваться такой чудесной штукой, как QuickCheck, для того, чтобы тестировать подобную логику, которая может, пардон, выстрелить?

ВШ: Там, на самом деле, логика достаточно туповатая. Я выкладывал в интернете Ur/Web-овскую часть сорсов, и часть Haskell сорсов, и, в принципе, там даже есть все эти resolve инстанции. Сейчас, в подкасте, их, конечно, не покажешь, но могу кинуть ссылку, где они есть, там все эти функции достаточно тривиальны. Разрешения конфликтов — там достаточно глубокого вдумчивого взгляда, это мой стандартный способ разработки. Посмотрел, увидел, что тут вообще может произойти. Тут большинство функций из серии «берем значение, в котором это поле максимальное». Ну или «объединяем два значения». Ну, какие-то иногда писал тесты, но без QuickCheck. QuickCheck я, кстати, так ни разу нигде и не пользовался. Его все нахваливают, вроде, похоже, что штука прикольная, но как-то я обычно использую более обширные тесты. Не просто какую-то функцию на ввод-вывод, ну, чистую функцию взял, в нее загнал любые параметры, посмотрел какие выходы. Я обычно именно функциональный, когда вся программа берется, что-то делается. Тот же самый ридер — взял фид, подписался, посмотрел, что происходит. А всякие промежуточные вещи, они обычно в репле всплывают.

В: QuickCheck можно не только так использовать, как просто функцию на вход и выход тестировать. А сами Riak-овцы генерят QuickCheck-ом все возможные порядки событий, а потом эти порядки событий выполняют на неком процессе, или на группе процессов, и потом смотрят, что в процессе применения этой группы событий к этой группе процессов никакой инвариант не сломался. Практически такой module check получается. Не module checking, конечно, потому что не все состояния перебираются, но некоторые трассы проверяются таким образом.

ВШ: У меня просто не настолько критический продукт, наверное. У меня не база данных, в которой очень страшно что-то. В общем, пока я не почувствовал необходимости настолько жестко все проверять. У меня как-то написал, добавил… Язык чистый, такого, что одну фичу добавил, а другую фичу при этом сломал — такое крайне редко происходит, и поскольку еще я работаю один, я более-менее помню, что у меня к чему. Что-то могу, конечно, забыть, но в целом такого, что пришел и, не подумав, что-то напортачил, не зная, для чего это было сделано, и поломал — такого у меня особо не происходит. Если б было несколько человек, нужны были б какие-то тесты, а сейчас я практически без тестов работаю. Тестирую как обычный тестировщик, готовый продукт тестирую, а автоматических тестов практически нет.

В: Второй вопрос. У меня тут в итоге два вопроса получилось, в смысле, во втором вопросе будут два подвопроса. Какими фичами Riak ты пользуешься? Понятно из твоего рассказа, что ты не пробовал, не игрался со встроенным CRDT , который появляется в новых версиях. Кстати, рекомендую посмотреть, возможно это поможет убрать кучу кода про resolve. И, соответственно, пользуешься ли ты всякими Riak Search , Yokozuna , как-то secondary indexes используешь, и если ты что-то из этого используешь, то как это для тебя работает?

ВШ: У меня в Reader есть поиск, фильтры и прочие штуки, я в начале, когда у меня уже был Riak, и я думал, на чем же мне сделать поиск. Попробовал Riak Search. В общем, никому не советую, не стоит им пользоваться вообще в принципе. Может что-то сейчас улучшили, исправили, но пару лет назад у меня из-за этого Riak рассыпался многократно. У меня вариантов десять, наверное, было различных падений Riak, его разваливаний, и все они были так или иначе связаны с этим. Поиск не рекомендую.

В: А чем ты сейчас ищешь?

ВШ: ElasticSearch , он рулит, он офигенный, и ElasticSearch всем рекомендую. Они еще несколько дней назад получили финансирование, миллионов 70 долларов , так что думаю, у ребят все будет хорошо.

В: Просто у ElasticSearch, у него тоже бывают местами странности с потерями данных. Вот у ребят из Riak, у них что хорошо, почему мне нравится их софт, они все тестируют на всяких очень странных случаях. В частности QuickCheck. Я ни разу не пользовался Riak Search, и я вполне могу поверить, что он на продакшене разваливается. Собственно, это не удивительно, потому что они в итоге его выкинули, и в Riak 2.0 будет новая собственная подсистема поиска, которая называется Yokozuna , которая будет сделана поверх Solr Apache’вского. Поэтому я готов поверить, что Riak Search не очень крутая штука. Но при этом они всегда тестируют на очень странных граничных случаях, и я читал посты о том, что ElasticSearch при всей его офигительности на некоторых странных граничных случаях, например, разваливания сети всяческого, иногда, бывает, теряет данные.

ВШ: Ну, ElasticSearch, он вообще не partition tolerant, то есть, он с этим не дружит. ElasticSearch он именно для поиска, хранить данные в нем не стоит. Он такой, что у меня пока ни разу с ним ничего не происходило. Ну, только тогда, когда у меня случайно выдернули не тот провод, у меня потом, когда его вдернули обратно, у меня эта нода потерялась. Она не стала ни с чем никого мержить, она как будто бы одна без кластера. Но поскольку есть резервные копии, я ее просто убил, перезапустил, и все восстановилось. ElasticSearch просто именно как поиск хорошо работает, а Riak отлично подходит под хранение, ну и для поиска не подходит. Поэтому у меня их две.

А: Я предлагаю на этой радостной ноте завершить выпуск, если, конечно, ни у кого нет возражений. Раз, два, три… возражений нет.

С: Есть! Я просто кнопочку пока отключил, чтобы не дышать в микрофон. У меня еще один традиционный, в общем-то, вопрос. Скажи, Володя, а в чем и на чем ты разрабатываешь?

ВШ: Разрабатываю я в Emacs, под Mac OS. Ну, собственно, на серверах обычный Linux Debian. В котором я тоже в терминале сижу в Emacs и что-то там правлю. Ну, и как обычно, там Makefile, немножко bash местами, а так все.

С: Все традиционно.

А: Катишь deb-пакетами?

ВШ: Нет, по ssh пускаю make и все. Ну, делаю git pull, make и готово.

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

ВШ: Всем пока.

С: Пока.

В: Пока.

Дополнение: EaxCast S02E04 — Riak 2.0, Cloud Haskell, встраиваемые базы данных для Erlang, а также DevOps и Docker

EnglishRussianUkrainian