juan_gandhi: (Default)
Juan-Carlos Gandhi ([personal profile] juan_gandhi) wrote2009-03-13 10:43 am

студент и основоположник (басня в прозе)

Широко известна в народе так называемая бигтейбл, внедрённая в дискурс гуглом. Что за бигтейбл такой? Это пакеты данных, индексированные ключом; ключ - строка неограниченной длины. Пакет не обязательно читать-писать целиком, он состоит из групп колонок, так что целиком читается-пишется только группа; группа состоит из колонок. В каждой ячеечке (ключ + колонка) хранится какое-то данное; можно по желанию хранить и историю, т.к. к данному приложена отметка времени; юзер сам выбирает, хранить последнюю или всё что есть.

Удобно, быстро, дёшево; да ещё и распределять данные легко: фактически таблица состоит из таблеток, содержащих определённую часть ключей (смежную); таблетки ж разбросаны по серверам. Репликация тоже делается без участия человека.

Одно неудобство - всё это на си, и работает через арписи. Сишникам раздолье, у них есть соответствующие классы; а джавщики страдали. Наконец выдающийся основоположник Ф.Е. осчастливил население, написав джавный интерфейс; программист судьбу благословил.

В это время в Сингапуре учился студент Маниш, родом из индийской деревни. В Сингапуре учёба, как в СССР, халявная, только потом надо три года отработать как молодому специалисту. А работа в Сингапуре одна: в банке потеть над банковским софтвером.

Но есть же Гугл; и вот Маниш посылает своё резюме, чтоб приехать практикантом.

В Гугле с практикантами порядок такой: все эти левые резюме сваливаются в базу; их там десятки тысяч; желающие инженера копаются в этой базе и иной раз лениво выдёргивают какой-нибудь пёрл (всё та же Пирамида Лебедева), и отправляют на доследование, т.е. в кадры. Кадры организуют телефонные интервью, ну и т.д. Обычно на этом и кончается: спросишь у будущего практиканта, может ли он запрограммировать Фибоначчи на каком-либо языке, он и вянет. Маниш не отвял, а браво ответил на все вопросы и осенью явился в Маунтин Вью.

Как это осенью? А так: кроме летней, бывает ещё зимняя практика, на два семестра. Ну там сначала-то он записался на один семестр, но вскоре это переиграл. Да и то; зарплаты в гугле практикантам плотят больше иной раз, чем инженерам в стартапах в Пало Альто. Так что у меня завёлся весёлый умный практикант. Быстренько освоил язык питон, а также гугловский стиль джавы.

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

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

Ну вы ж понимаете, в майсиквеле работает такая программа хитрая, она запросы оптимизирует, данные читает параллельно, поддерживает транзакции... ничего этого в бигтейбле нету. Это есть в других инфраструктурах, но они ещё не существовали на тот момент.

И что Маниш? А Маниш обнаруживает такую простую вещь: если у нас таблица разбита на 20 таблеток, и вся информация, где какие ключи, известна, то почему бы нам в 20 threadов не читать эту самую таблицу, со всех таблеток параллельно. И пишет Маниш такую параллельную читалку.

Дело в том, что это особенность джавы - лёгкость, с которой ты пишешь multithread code. В си сдохнуть можно такое написать.

Ну и, после непродолжительного вылизывания стиля и рисования грамотных юниттестов, сабмитит он это дело; я аплодирую. Теперь следующий этап, впарить этот код Выдающемуся Основоположнику.

Пишем ченджлист, посылаем ему на ревью.

Тишина. Две недели - ни слова.

Пишем Вежливое Письмо.

Тишина. Две недели, тишина.

Пишем ещё письмо. В ответ нам сообщают, что а) надо ещё разобраться; б) есть недоработки; в) мы сами над аналогичным вопросом думаем.

И так мы провели оставшиеся полгода. Пока Маниш не уехал обратно в Сингапур.

Потом я ещё три месяца надоедал основоположнику. Потом я пошел в другую команду. В той, предыдущей, все эксперименты с бигтейблом выкинули на помойку. Включая, очевидно, и код Маниша.

Так что воз и ныне там.

А Маниш нормально; полученной в Гугле зарплатой он расчитался с Сингапуром и поехал в Цюрихское отделение Гугла, на постоянку. И ныне там; катается на лыжах, сделал себе модную татуировку. Думаю, у него всё хорошо.

Но Гугл так и не умеет читать бигтейблы параллельно.

[identity profile] ex-kashanya.livejournal.com 2009-03-13 06:13 pm (UTC)(link)
Гугл всё равно лучше.

[identity profile] ktotam.livejournal.com 2009-03-13 07:44 pm (UTC)(link)
чем армян.

[identity profile] ex-kashanya.livejournal.com 2009-03-14 02:36 am (UTC)(link)
Он индексирует мой сайт, а Яндекс - нет.

[identity profile] ex-kashanya.livejournal.com 2009-03-14 01:08 pm (UTC)(link)
Бесполезно. Я пробовала уже.

[identity profile] pigmeich.livejournal.com 2009-03-14 01:10 pm (UTC)(link)
Значит за эротику банят. А у Гугла может просто руки до рунета не дотянулись.

[identity profile] ivan-gandhi.livejournal.com 2009-03-14 04:34 pm (UTC)(link)
Гуглу русское пофиг, имхо; у них есть словарь неприличных русских слов, а больше, наверное, всё.

Но Кашане я б советовал не обсуждать такие вопросы в открытом месте, т.к. нас тут читают; вдруг кто-нибудь возьмёт да и проявит инициативу - для этого много не надо.

[identity profile] itman.livejournal.com 2009-03-13 06:17 pm (UTC)(link)
Я все-таки справедливости ради замечу, что
а) не гугл придумал "индексацию ключом"
б) это не совсем индексация ключом, это столбцовые базы данных (column-oriented databases).
Вместо кортежа (n-tuple) (f1, f2, ... ,fn) хранятся различные проекции этого кортежа (в том числе с переставленными атрибутами). Фишка в том, что эти проекции проще индексировать, сжимать и быстро находить.

[identity profile] ivan-gandhi.livejournal.com 2009-03-13 06:30 pm (UTC)(link)
Кортежи, конечно, чисто мысленное построение.

[identity profile] itman.livejournal.com 2009-03-13 06:35 pm (UTC)(link)
Как и вся математические абстракции.

[identity profile] dkfl.livejournal.com 2009-03-13 06:44 pm (UTC)(link)
как-то сложно у вас в гугле бегтейбл объясняется..
обычно пишут "столбцовые базы данных". куда понятней :)

[identity profile] ivan-gandhi.livejournal.com 2009-03-13 06:55 pm (UTC)(link)
Я про "столбцовые базы данных" ничего до сегодняшнего дня не слышал. :)

[identity profile] ingas.livejournal.com 2009-03-15 03:22 pm (UTC)(link)
Под "столбцовыми базами данных" (vertical store, еще как то) обычно имеют в виду реляционки типа Sybase AQ, Monet DB

Бигтейбл - обычно называют key-value store

[identity profile] scolar.livejournal.com 2009-03-13 07:40 pm (UTC)(link)
Сдаётся мне, что для человека, так не любящего совок, Вы слишком наплевательски относитесь к NDA.

[identity profile] pigmeich.livejournal.com 2009-03-13 07:52 pm (UTC)(link)
А он разве в Гугле работает?

[identity profile] scolar.livejournal.com 2009-03-13 08:16 pm (UTC)(link)
А Гугл это вообще что?

[identity profile] pigmeich.livejournal.com 2009-03-13 09:04 pm (UTC)(link)
Это такое слово с разноцветными буквами и желтыми «о».

[identity profile] mikkim08.livejournal.com 2009-03-13 08:04 pm (UTC)(link)
Так бигтейбл же это открытая информация.

[identity profile] scolar.livejournal.com 2009-03-13 08:14 pm (UTC)(link)
Закрытой информацией может быть кто кого и как нанял, и кто кого куда и с чем послал.

[identity profile] ivan-gandhi.livejournal.com 2009-03-13 09:12 pm (UTC)(link)
Если будут претензии, я переведу этот пост в режим для френдов.

[identity profile] simonff.livejournal.com 2009-03-13 07:58 pm (UTC)(link)
To be fair, это скорее нехарактерный случай. Я с основоположниками особо не сталкивался (а когда сталкивался, получал быстрые ответы), но я могу себе представить, какое количество code reviews им приходит. Если человек через день-два не отвечает, обычно или толкаешь его коллег, или идешь к нему вживую или в чат, и там все быстро решается - или он понимает, зачем тебе это нужно, или ты понимаешь, почему это никому не нужно. Конечно, если целенаправленно ни с кем больше не говорить, а ждать формального ответа, у code review есть шанс протухнуть.

[identity profile] ivan-gandhi.livejournal.com 2009-03-13 09:15 pm (UTC)(link)
Полухарактерный. Бывало так, бывало и так. Однажды от Джоша Блока, вполне интеллигентного и покладистого человека, я так и не дождался ревью, но не больно и надо было. А так - все люди разные, конечно. И, несмотря на все эти глюки, я этих основоположников очень уважаю, даже если у нас взгляды радикально расходятся.

[identity profile] faceted-jacinth.livejournal.com 2009-03-13 09:46 pm (UTC)(link)
В том месте, где я сейчас работаю, вообще нет документации по интернал интерфейсам. Совсем вообще ни одной и это ужасно. Зато у каждого сотрудника есть телефон, также есть сает с приятной табличкой с именами-фамилиями-фотками-телефонами-дислокацией, так что довольно быстро научаешься звонить, узнавать, а если что сложно, то узнавать, можно ли подойти, и подходить. И как-то так получается, что этот ужасный фейл, отсутствие документации, на самом деле приводит к неиллюзорным винам, в том смысле, что если мне что-то от кого-то нужно, то я не буду сидеть месяц занимаясь другими делами, я встану и пойду к нему и поговорю. Ну, потому что это принятый способ взаимодействия -- пойти и поговорить.

[identity profile] ivan-gandhi.livejournal.com 2009-03-15 03:21 pm (UTC)(link)
А я вот сижу и в конфлюэнс заношу всё, что узнал. Чтоб другим не приходилось бегать искать коллег или писать письма в Китай.

[identity profile] sab123.livejournal.com 2009-03-13 08:17 pm (UTC)(link)
Про "убиться можно" - наглая ложь.

[identity profile] illy-drinker.livejournal.com 2009-03-13 09:12 pm (UTC)(link)
Вы про многопоточность?
ДУмаете библиотеки заменяют родную поддержку в языке (со всей оптимизацией и пр)?

[identity profile] sab123.livejournal.com 2009-03-13 09:15 pm (UTC)(link)
А что там можно особо оптимизировать? Вот разве что стек сделать в виде списка.

[identity profile] illy-drinker.livejournal.com 2009-03-13 09:40 pm (UTC)(link)
так в Яве сообществе они этим занимаются с 90х
лок стратегии или общение процессора с локальными кешами на многоядерных архитектурах

[identity profile] sab123.livejournal.com 2009-03-13 09:47 pm (UTC)(link)
Лок стратегии везде одинаковы. Разве что в Джаве блокировки сделаны с кривизной. Общение процессора с локальными кэшами - тоже везде аналогично, и применимо только к кривым архитектурам типа сановской, в которых на железе сэкономили. В более приличных архитектурах типа интеловской оно делается в железе и потому может работать гораздо эффективнее.

[identity profile] illy-drinker.livejournal.com 2009-03-13 10:11 pm (UTC)(link)
Лок стратегии везде одинаковы. Р

Я помню ИБМ много работала над локами в вирт машине и они писали, что достаточно сильно повышают перформанс

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

[identity profile] illy-drinker.livejournal.com 2009-03-13 10:14 pm (UTC)(link)
в смысле простые явовские программы лучше масштаб их аналогов на С++


вс еэто были какие-то простые примеры

[identity profile] faceted-jacinth.livejournal.com 2009-03-13 10:00 pm (UTC)(link)
Так ведь насколько я знаю в жаве встроенная поддержка сосёт как пылесос Вулкан. Например, замечательное слово volatile оказывается совершенно бессмысленным и бесполезным, потому что охочий до оптимизаций конпелятор может переносить через него все другие чтения и записи. То есть если вы считаете, что код
volatile bool flag;
int something = 0;
...
flag = 0;
something = 10;
sleep(1000);
if (flag)
{
   if (something == 20)
   {
       doSomething();
   }
}

гарантирует вам, что тело ифа может исполниться вообще, то вы глубоко заблуждаетесь, ололо. Это в сишарпе assignment to a volatile memory location acts as a memory barrier, preventing relocation of reads and writes from/to ANY memory locations to be cached by the compiler. А в жаве как нефиг - something не volatile, значит, можно её зачитать в регистр вначале функции и больше не трогать никогда.

[identity profile] faceted-jacinth.livejournal.com 2009-03-13 10:01 pm (UTC)(link)
* assignment to or a read from

[identity profile] faceted-jacinth.livejournal.com 2009-03-13 10:03 pm (UTC)(link)
s/to be cached/to be performed/
О чём-то не о том я думал

[identity profile] illy-drinker.livejournal.com 2009-03-13 10:07 pm (UTC)(link)
а ну этот конкретно пример интеракции оптимизации компилятора и многопот известен давно
Они с ним что-то сделали или все также?


[identity profile] faceted-jacinth.livejournal.com 2009-03-13 10:35 pm (UTC)(link)
В жаве? Не знаю, подозреваю, что нет.

В сишарпе такие майндфаки исправляются - например, была совершенно прекрасная в своей глючности вещь: finalizer объекта мог быть вызван по ходу исполнения метода этого объекта, если там дальше ни разу не использовался this. То есть если я зачитываю вендовую Handle в локальную переменную и собираюсь с ней дальше что-нибудь сделать, то где-то посередине может случиться сборка мусора, которая замечательно соберёт тот объект, в котором сейчас исполняется код (ну, раз он не обращается ни к каким полям уже, всё нужное сохранено в локальных переменных), вызывается деструктор, закрывающий хэндл, и мой метод замечательно сосёт всякое. Реальный пример: я пишу метод Close для свого файлообразного потока, ну, понятно.

То есть проблема была в том, что IntPtr, использовавшийся для ссылок на объекты оси, нифига не понимался GC как ссылка. Это исправли добавлением классов вроде SafeHandle. Исправили! А не как в жаве!

[identity profile] skavish.livejournal.com 2009-03-13 11:08 pm (UTC)(link)
> В жаве? Не знаю, подозреваю, что нет.

прекрасный аргумент

[identity profile] illy-drinker.livejournal.com 2009-03-15 01:01 am (UTC)(link)
то что обсуждается выше - действительно неприятный баг в понимании волатайл явой

[identity profile] skavish.livejournal.com 2009-03-15 02:03 am (UTC)(link)
в чем состоит баг? то о чем вы говорите исправлено лет 6 назад. не говоря уже о том что бага никогда не было, все соотвествовало спекам. просто в 1.5 решили volatile немного затянуть.

[identity profile] skavish.livejournal.com 2009-03-13 11:08 pm (UTC)(link)
какая то чушь, уж извините

[identity profile] alexclear.livejournal.com 2009-03-14 12:05 am (UTC)(link)
Это в сишарпе assignment to a volatile memory location acts as a memory barrier, preventing relocation of reads and writes from/to ANY memory locations to be cached by the compiler.

Вот это-то как раз и есть майндфак, как и многое у M$.

[identity profile] faceted-jacinth.livejournal.com 2009-03-16 02:06 pm (UTC)(link)
Забавно получилось.

Оказывается, я был не прав, в пятой жаве таки сделали всё как в дотнете (там есть ещё какие-то совсем дико суровые тонкости в дотнетовской имплементации, но неважно).
http://en.wikipedia.org/wiki/Java_Memory_Model
http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml
http://java.sun.com/docs/books/jls/third_edition/html/memory.html

Но зато как весело теперь ваш комментарий выглядит!

[identity profile] alexclear.livejournal.com 2009-03-16 02:31 pm (UTC)(link)
Да, да, отлично, теперь это вопрос для собеседований!

И мой комментарий следует читать так:

"...как и многое у M$ и Sun".

[identity profile] faceted-jacinth.livejournal.com 2009-03-16 04:01 pm (UTC)(link)
Да нет же, это как раз правильный подход именно к мультитредовой синхронизации.

Слово volatile в C и C++ имело несколько другой смысл и для другого предназначалось - для прямой работы с железом, например. Ну и вот компилятор гарантирует, что каждое чтение-запись дойдёт до железа, и что относительный порядок волатильных чтений/записей будет как в коде (а все остальные чтения/записи могут прыгать как угодно вокруг, если это не меняет семантику).

Естественно, поверх такой абстракции можно и многотредовое взаимодействие сделать: тогда весь без исключения шаред стейт должен быть помечен как volatile (причём видимо любой доступ к полю волатильного поля тоже должен считаться волатильным).

Но это и неудобно программисту (легко что-нибудь забыть так пометить, а проверить никак невозможно), и как правило тормозит по сравнению с новой, заточенной специально под мультитредное взаимодействие концепцией: когда каждый синхронизационный примитив именно что синхронизирует всё состояние. Memory barrier ведь ничего не делает на самом деле, это просто запрет компилятору производить некоторые оптимизации. Зато позволяет проводить другие. В самом деле, вот есть у меня захват и освобождение мутекса, в новой модели компилятор не сможет перенести какие-то операции через эти два момента (причём скорее всего тех операций, которых я бы хотел разрешить перенести, не будет вовсе, например, потому что локальные переменные функции другим тредам недоступны по определению и на них запрет не распространяется), зато сможет как угодно тасовать и кешировать их внутри этих трёх кусков.

[identity profile] alexclear.livejournal.com 2009-03-16 04:20 pm (UTC)(link)
Да нет же, это как раз правильный подход именно к мультитредовой синхронизации.

Я почитал первую и третью ссылку и понял (вторую ссылку я читал как-то давно, но понял совсем не то, что понял сейчас).

Слово volatile в C и C++ имело несколько другой смысл и для другого предназначалось - для прямой работы с железом, например.

К этому и претензия - почему в современной Java тоже есть "volatile", а не какое-нибудь там что-нибудь, я не знаю.
Это весьма запутывает.
На самом деле, речь ведь идет об определении блоков, связанных отношением happened-before.

[identity profile] brumka.livejournal.com 2009-03-13 08:55 pm (UTC)(link)
Вполне типичная история. Студент полез поперёд батьки, который вдобавок ещё и "Основоположник".

А сами разве не можете пользоваться кодом? Почему на это требуется соизволение верховного Основоположника?

[identity profile] ivan-gandhi.livejournal.com 2009-03-13 09:11 pm (UTC)(link)
Сами, конечно, пользовались - пока все не разбежались. После чего было предано забвению.

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

[identity profile] poluzhivago.livejournal.com 2009-03-13 09:03 pm (UTC)(link)
В жизни не пойму, почему вопросы эффективности должны интересовать наемного работника больше, чем они интересуют владельцев (совладельцев, держателей акций и т.п.) этого бизнеса.

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

[identity profile] gabaidulin.livejournal.com 2009-03-14 12:25 am (UTC)(link)
Какой вы меркантильный, есть еще люди, для которых это все еще just fo fun.

[identity profile] poluzhivago.livejournal.com 2009-03-14 01:03 am (UTC)(link)
Это не меркантильность. Это нежелание чувствовать себя идиотом. Что же касатся fun - у меня это на рабочие отношения не распространяется. Так сложилось - не фан.

[identity profile] ivan-gandhi.livejournal.com 2009-03-14 04:27 pm (UTC)(link)
Ну, так неинтересно жить. Хочется ж прекрасного. Если я попадаю в такое положение, что надо трубить от и до, то это означает одно: нужно срочно менять работу. (Как и вышло с гуглом.)

[identity profile] poluzhivago.livejournal.com 2009-03-14 10:22 pm (UTC)(link)
Понимаю. Но у меня "жить" и "работать" находятся в несколько разных плоскостях. Может, мне не повезло, но за те виды деятельности, которые мне по душе, денег не платят. Во всяком случае таких, на которые можно жить. Поэтому мне приходится зарабатывать тем, за что более или менее прилично платят, и что не требует слишком много времени и усилий. Т.е. я бы рад работать ради удовольствия, но не знаю такой работы. Как-то так.
recoder: (wally)

[personal profile] recoder 2009-03-17 03:06 pm (UTC)(link)
Угу. Или стараться всё делать правильно или — халтура и работа 9-to-5. Остальное — компромиссы с самим собой.

[identity profile] besisland.livejournal.com 2009-03-13 09:38 pm (UTC)(link)
Ох уж этот «Гугл».

[identity profile] 6pack.livejournal.com 2009-03-13 11:59 pm (UTC)(link)
Давайте про GPS теперь :-)

[identity profile] blacklion.livejournal.com 2009-03-14 10:05 am (UTC)(link)
Дело в том, что это особенность джавы - лёгкость, с которой ты пишешь multithread code. В си сдохнуть можно такое написать.
Посмеялся, спасибо.

А история хорошая.

[identity profile] blacklion.livejournal.com 2009-03-14 10:10 am (UTC)(link)
Поясню про Си: там такое или нельзя написать вообще (потому что нет memory model) или пишется так же легко как в Java — Всё зависит от вашей точки зрения на правильность работы :)
В 99.9% случаев — второе.

Java не предоставляет ничего интересного для мультитреда, кроме (это важно, это очень важно, но не всегда) memory model. А так — те же локи, те же треды. Всё. Никакого rocket science вообще, увы.

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