Распределённые вычисления: немного теории

  • Tutorial
Девять лет назад я начал «в свободное от основной работы время» преподавать компьютерные дисциплины в одном из университетов Санкт-Петербурга. И только сравнительно недавно к своему удивлению обнаружил, что в наших вузах практически отсутствуют курсы с фокусом на проблематику распределённых вычислений. И даже на Хабре эта тема не раскрыта в достаточной мере! Надо прямо сейчас исправлять ситуацию.

Этой теме я и хотел посвятить статью или даже серию статей. Но потом решил выложить своё учебное пособие по основам распределённых вычислений, вышедшее в свет в этом году (читай, небольшую книгу объемом 155 страниц). В итоге получился гибрид – статья со ссылкой на книгу. Книга распространяется бесплатно и доступна в электронном виде.

Вместо пролога. Приступив к тексту статьи, я в очередной раз задумался, а зачем программисту нужно знать теоретические основы распределённых вычислений. Этот вопрос я неоднократно слышал (и продолжаю слышать) от студентов и специалистов, уже работающих в области ИТ. Действительно, зачем, например, знать, что «множество событий распределённого вычисления упорядочено частично, а не линейно»? В чем, так сказать, каждодневная практическая польза этого фундаментального знания?

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

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

Все мы совершенно естественным образом рассчитываем на то, что перед тем как начать какие-либо манипуляции с человеческим организмом врачи всё-таки изучают его внутреннее устройство и принципы работы. Мы абсолютно не согласны с утверждением, что хирургам гораздо важнее пройти практические курсы кройки и шитья вместо многолетней зубрежки теоретического материала о том, что у нас там внутри и зачем оно там. Так почему же программистам, занимающимся разработкой системы с сетевым взаимодействием (т.е. к настоящему моменту практически любой системы), не нужно знать «что там внутри и зачем оно там»? Почему ошибки в ИТ воспринимаются максимум с легкой иронией? Ну да, ну баг. А кто не пьет не делает багов?! Назови! Нет, я жду! Среди требований к программистам очень часто почему-то на передний план выходят практические навыки владения тем или иным языком программирования. Причем сильно на передний план, полностью затмевая собой требования к пониманию основных концепций, теоретических моделей, алгоритмов, в конце концов… Да и сами программисты, чего греха таить, с началом разговора «про никому не нужную теорию» вянут как цветы в пустыне… Чудеса, не правда ли…

Приведу небольшое высказывание Л. Лэмпорта на эту тему (чуть ниже я постарался перевести это высказывание на русский язык, не сильно отдаляясь от оригинала):

For quite a while, I've been disturbed by the emphasis on language in computer science. One result of that emphasis is programmers who are C++ experts but can't write programs that do what they're supposed to. The typical computer science response is that programmers need to use the right programming / specification / development language instead of / in addition to C++. The typical industrial response is to provide the programmer with better debugging tools, on the theory that we can obtain good programs by putting a monkey at a keyboard and automatically finding the errors in its code.
I believe that the best way to get better programs is to teach programmers how to think better. Thinking is not the ability to manipulate language; it's the ability to manipulate concepts. Computer science should be about concepts, not languages.

Уже довольно длительное время меня беспокоит слишком большое внимание, уделяемое компьютерному языку в ИТ. В результате переизбытка такого внимания появляются программисты, которые являются экспертами в С++, но которые не в состоянии написать программы, делающие то, что от этих программ требуется. Типичная реакция представителей ИТ на эту проблему заключается в предложении программистам использовать другой более подходящий язык (программирования, спецификаций и т.п.) вместо / вдобавок к С++. В свою очередь характерный для индустрии разработки ПО выход из ситуации видится в предоставлении программистам более совершенных инструментов отладки, видимо, основываясь на предположении, что получить хорошие программы можно просто посадив мартышку за клавиатуру и затем отыскивая и исправляя ошибки в её коде.
Моё твердое убеждение в том, что для получения качественных программ необходимо учить программистов думать лучше. Умение думать – это не способность оперировать компьютерным языком; это способность оперировать концепциями. Изучение информационных технологий должно быть сфокусировано на изучении концепций, а не языков.

Для иллюстрации того насколько могут быть важны «концепции» и «элементы теории» в вопросах построения распределённых систем давайте рассмотрим парочку простеньких примеров. Для начала — групповую рассылку сообщений электронной почты между пользователями A, B, C и Х. Предположим, что пользователь А отправляет всей группе письмо с темой «Общее собрание». Пользователи В и С отвечают на него всей группе своими сообщениями с темой «Re: Общее собрание».

В действительности события происходят в следующей последовательности:
  1. Первым отправляется сообщение от пользователя А.
  2. Пользователь В получает его, читает и отправляет ответ.
  3. Пользователь С получает оба сообщения от А и В и затем отправляет свой ответ, опирающийся на оба сообщения от А и В.

Однако в связи с произвольными и независимыми задержками доставки сообщений, некоторые пользователи могут видеть другую последовательность наступления событий. Например, согласно сценарию, приведённому на рисунке ниже, в почтовом ящике пользователя Х сообщения будут располагаться в следующем порядке:
  1. Сообщение от пользователя С с темой «Re:Re: Общее собрание».
  2. Сообщение от пользователя А с темой «Общее собрание».
  3. Сообщение от пользователя В с темой «Re: Общее собрание».



Ага, оказывается порядок поступления сообщений, наблюдаемый различными процессами, может быть различным даже для FIFO каналов! А что делать, если мы хотим, чтобы наблюдаемый порядок был везде одинаков (и при этом не хотим использовать синхронный обмен сообщениями)? К примеру, если мы пишем свой транспорт с соответствующими гарантиями. Или хотим построить отказоустойчивую службу (replicated state machine), где каждая реплика должна обрабатывать поступающие запросы в едином для всех реплик порядке, чтобы состояния реплик не различались? Вопрос…

Рассмотрим теперь еще одно выполнение распределённой системы, в которой процессы взаимодействуют только с помощью обмена сообщениями, и каждый процесс занимается включением / выключением фонаря с определенным светом. Пусть первый процесс управляет фонарем с красным светом, второй – с желтым, а третий – с зеленым. Такая вот светофорная система. На рисунке ниже включение процессом своего фонаря обозначено прямоугольником, а выключение – вертикальной линией; отправка и получение сообщения – стрелкой. Вопрос: могут ли процессы определить, какие фонари светили одновременно?



Так вот оказывается, что в данном выполнении асинхронной системы процессы никак не смогут определить был ли включен красный свет одновременно с желтым. Может быть да. А может и нет… Сие останется неизвестным. Но зато будет точно известно, что красный и зеленый фонари одновременно находились во включенном состоянии. Другими словами, оказывается, нет особого смысла говорить о том, что то или иное глобальное состояние достигается по ходу выполнения распределённой системы! Равно как и очень часто нельзя сказать, выполнялось ли какое-либо условие (предикат), заданное на множестве его глобальных состояний! Опять же вопрос: почему?

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

Введение в распределённые вычисления >>

Из этой книги вы узнаете:

  • про причинно-следственный порядок событий распределённого вычисления
  • что такое справедливость, безопасность и живучесть
  • что такое конус прошлого и конус будущего для события вычисления
  • чем логический параллелизм отличается от физического параллелизма
  • почему не имеет особого смысла говорить о совокупности глобальных состояний вычисления, а имеет смысл говорить о совокупности событий вычисления
  • как нам упорядочить события распределённого вычисления в одну или несколько последовательностей, которые «могли бы» происходить в системе
  • что такое логические часы, и какое такое логическое время они отсчитывают
  • почему логическое время останавливается, если в системе ничего не происходит
  • чем скалярное время отличается от векторного
  • как и для чего можно использовать логическое время в распределённых алгоритмах
  • какие есть подходы к эффективной реализации векторных часов
  • зачем нам может понадобиться матричное время
  • чем распределённый алгоритм отличается от централизованного
  • как решать задачу взаимного исключения без использования разделяемых переменных
  • на какие категории делятся все распределённые алгоритмы взаимного исключения
  • зачем в алгоритмах на основе получения разрешений используется логическое время
  • почему философам так трудно пообедать в распределённой системе
  • зачем нам граф конфликтов и граф предшествования
  • почему граф предшествования должен меняться со временем
  • почему в алгоритмах на основе передачи маркера есть еще много чего кроме собственно «передачи маркера»
  • и, я надеюсь, ещё кое-что…

Из чего состоит книга и как её читать?

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

Первый раздел по большей части болтологический и посвящен «качественным» особенностям распределённых систем. Если вы не знаете, что такое распределённая система, и какие к ней предъявляются требования, то первый раздел имеет смысл прочитать. Если же вы знаете, что поступающие процессу-получателю сообщения могут давать устаревшее представление о процессе-отправителе, точно так же, как и световое излучение, поступающее к нам от далекой звезды, дает представление о состоянии этой звезды в прошлом, то первые четыре пункта можно пропустить :) Отдельно стоит отметить п. 1.5 «Взаимодействие в распределённых системах», в котором я попытался привести несколько простых задач, демонстрирующих сложности, с которыми можно столкнуться при разработке распределённых систем. Эти задачи мы будем потом решать, вооружившись теоретическими знаниями, поэтому стоит с ними ознакомиться.

Во втором разделе представлена модель распределённого вычисления и основная теория, используемая при дальнейшем изложении. В определенном смысле этот раздел является ключевым. Однако надо быть готовым к работе с такими терминами как «множество / подмножество», «бинарное отношение», «отношение эквивалентности», «отношение порядка», «линейный / частичный порядок». В этом разделе вы встретите доказательства некоторых утверждений. Мне кажется, что их следует, как минимум, проглядеть (а лучше изучить) для более глубокого понимания существенных особенностей функционирования распределённых систем, выделяющих их среди систем других классов.

На базе теории, представленной выше, в третьем разделе, наконец, рассматриваются более практичные вещи, а именно, различные механизмы логических часов. С их помощью мы можем упорядочивать события в одну или несколько последовательностей, которые могли бы происходить в системе, что позволяет значительно упростить разработку алгоритмов для распределённых систем. Приводятся примеры использования логических часов для решения задач, сформулированных в п. 1.5 «Взаимодействие в распределённых системах».

Четвертый раздел посвящен изучению основных распределённых алгоритмов взаимного исключения, построенных без применения привычных разделяемых переменных. Ключевые идеи этих алгоритмов используются и для решения многих других задач в распределённых системах. Кроме того, их изучение позволяет раскрыть такие важные вопросы, как обеспечение свойств безопасности и живучести распределённых алгоритмов. Поэтому этот раздел мне представляется весьма полезным для ознакомления.

На кого ориентирована эта книга?

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

Чего бы мне хотелось?

Буду рад, если материал книги окажется для вас полезным и познавательным — будет время вернуться сюда после её прочтения и черкнуть «спасибо», буду признателен. Кроме того, мне бы хотелось собрать весь материал по теме, включая комментарии, вопросы и ответы в одном месте, чтобы потом отсылать сюда всех желающих, включая новые курсы новых студентов. Если вы сможете помочь и дополнить материал своими мыслями, своим опытом, буду признателен вдвойне. Читайте, набирайтесь знаний и используйте их в своей работе! Скачать книгу в формате PDF прямо сейчас вы сможете по ссылке ниже:

Введение в распределённые вычисления >>

Успехов!
Михаил Косяков

Вместо эпилога. «Информация, в отличие от ресурсов, задумана, чтобы ею делились». Роберт Кийосаки
Поделиться публикацией

Комментарии 37

    +2
    Звучит отлично! Каким образом можно оплатить часть проделанной работы?
      0
      Если честно, я не совсем понял что вы имеете ввиду: что оплатить, зачем оплатить, кому оплатить? :)
        +7
        Я был бы не против оплатить стоимость эквивалентную бумажной книге (500-3000 руб), но не вижу ни «купить», ни «donate»
          0
          Ах вот вы о чем! Спасибо! Для меня это высокая оценка. Значит, правильное дело делаем, товарищи :) Значит, материал полезен. Честно говоря я не был готов к такому повороту ни технически, ни психологически. Но раз уж в статье я написал «книга распространяется бесплатно и доступна в электронном виде», значит так тому и быть. Еще раз, спасибо!
            +1
            … да, смею предположить, что с текстом книги вы еще не успели ознакомиться :) Буду признателен, если после её прочтения вы найдете время вернуться сюда и черкнуть свои комментарии.
              0
              да, я успел ознакомиться только с оглавлением и выборочно с содержимым. по крайней мере точно посоветую людям, кому это необходимо :)
              сам постараюсь прочесть на выходных (если они будут)
                +1
                Буду рад, если книга пригодится также вашим коллегам!
      +8
      Я веду практику по распределенным вычислениям у третьего и шестого курсов кафедры ВТ ИТМО. При подготовке к занятиям я пользовался этим пособием, когда оно еще не было опубликовано, и поэтому очень хорошо знаком с текстом. Очень рекомендую к прочтению всем, кто увлекается компьютерными науками: интересный и полезный материал изложен очень живо и просто, одно удовольствие читать.
        0
        Женя, спасибо! Рад, что пособие оказалось полезным для тебя!
        +5
        Уважаемый Михаил Сергеевич, после беглого ознакомления с выложенным вам текстом, я был немало удивлен обнаружив, что значительная часть из наугад просмотренного мной представляет собой практически подстрочный первод достаточно известной книги Ajay D. Kshemkalyani, Mukesh Singhal, Distributed Computing, Principles, Algorithms, указанной под номером 4 в вашем списке дополнительной литературы. Достаточно сравнить описания конусов событий и предшествующий материал. Замечательным образом, даже названия подразделов и их порядок часто совпадают.
          0
          Никита, спасибо за комментарий! Из него следует, что вы стали изучать материал книги :) Это приятно!

          Вы правы, что описание конуса прошлого и конуса будущего взято из книги Kshemkalyani A. D., Singhal M. Distributed Computing: Principles, Algorithms, and Systems, указанной под номером «четыре» в списке основной используемой литературы (собственно, эта книга и присутствует в списке литературы в том числе поэтому :) и, кстати, я рекомендую её к изучению) Однако не соглашусь с тем, что, как вы пишите, значительная часть материала взята оттуда. Скажу больше, материал книги построен на всех 30 источниках, указанных в этом списке. Это я могу гарантировать: соответствующая бумажная стопочка до сих пор лежит у меня на столе :) – на самом деле при написании текста было переработано больше, чем эти 30 источников, просто эти 30 мне показались наиболее удачными.

          Позволю процитировать себя из Введения:
          Представленный в пособии список литературы содержит перечень источников, которые автор рекомендует в первую очередь для получения более подробной информации по рассматриваемым и дополнительным вопросам из области распределенных вычислений [1-7] и материал из которых в той или иной степени был использован при написании данного пособия [1-30].

          Надеюсь, вы измените своё мнение после более детального ознакомления с материалом!
            +1
            Возможно я недостаточно ясно выразился. Речь не идет о «использовании материалов». Речь идет о том, что значительная доля текста книги за вашим авторством является неатрибутированным дословным переводом других источников (а владельцы авторских прав на цитируемые источники, как вы понимаете, должны в таком случае получать royalties). Мне не кажется, что это существенно отличается от известным примеров диссертаций составленных из… других диссертаций.
              0
              Мне сложно что-либо добавить к моему предыдущему ответу. А почему вас эта тема так сильно беспокоит?
                +1
                … это же учебное пособие, а не диссертация, не монография и не печатная книга.
                  +4
                  И в чем же разница? Понятие авторства, мне кажется, распространяется на все эти типы текстов. Вопрос о причине моего беспокойства сам вызывает у меня удивление. Неужели преподавателю университета нужно объяснять, что нельзя использовать чей-то текст страницами, без указания на заимствование, подписывать результат своим именем и даже объявлять на него авторские права?

                  Кстати, просматривая ваш текст далее, я нахожу все больше и больше скопированного текста, причем иногда ситуация доходит до курьеза. Так на странице 88 вы копируете исходный код алгоритма со страницы 64 вышеуказанной книги и по ошибке часть функции DependencyTrack() попадает в тело функции VisitEvent(), от чего код становится бесмысленным. Нетрудно заметить, что последующее обсуждение алгоритма также скопировано из книги без всяких изменений, включая те же значения тестовых параметров. Последующее описание метода Jard–Jourdan также скопировано практически дословно и т.д. Имеется ли вообще в главах 2 и 3 ваш авторский текст и сколько его?
                    0
                    Над кодом функции DependencyTrack() я помню я думал, изменения внесены намеренно, опираясь на статью-первоисточник. Посмотрите пж-та на описание алгоритма и код, его иллюстрирующий, внимательнее, там не должно быть ошибки. Можете сравнить с первоисточником Fowler J., Zwaenepoel W. Causal distributed breakpoints // Proceedings of the 10th International Conference on Distributed Computing Systems, 1990. P.134–141.

                    В главе 2 я использовал упомянутую вами книгу только для написания пункта 2.4. «Конус прошлого и конус будущего для события». Все остальное — из других источников.

                    В главе 3, например, вы найдете примеры использования логических часов, которые отсутсвуют в упомянутой вами книге. При внимательном изучении вы сможете найти еще другие 10 отличий :) При описании метода Jard–Jourdan я опирался на материал упомянутой вами книги и статью-первоисточник Jard C., Jourdan G.-C. Dependency tracking and filtering in distributed computations // Brief Announcements of the ACM Symposium on PODC, 1994. A full presentation appeared as IRISA Technical Report No. 851, 1994. потому как, помню, «чистое» описание этого метода из книги мне не понравилось, и я из него толком ничего не понял. Поэтому пришлось его переработать с учетом статьи, авторами которой и являются Jard и Jourdan :) Надеюсь, в пособие этот метод изложен яснее, чем в книге, на которую вы постоянно ссылаетесь.
                      +2
                      изменения внесены намеренно

                      Намеренных изменений там быть не может, так как пошаговое описание работы алгоритма дословно скопировано из Kshemkalyani A. D., Singhal M., op. cit., (в дальнейшем KS).

                      В главе 2 я использовал упомянутую вами книгу только для написания пункта 2.4.

                      Вот «источники» нескольких разделов вашей книги:
                      1.5.4. Примитивы взаимодействия — KS, 1.6.1 Blocking/non-blocking, synchronous/asynchronous primitives
                      2.2 Причинно-следственный порядок событий, стр. 52 и далее — KS, Causal precedence relation и часть предыдущего текста со стр. 40.
                      2.3 Эквивалентные выполнения — G. Tel, 2.3.3 Equivalence of Executions: Computations.
                      2.4 Конус прошлого и будущего для события — KS, 2.6 Past and future cones of an event
                      2.5 Свойства каналов — G. Tel, 2.4.2. Properties of the Channels.
                      3.1. Общие принципы построения логических часов — KS, 3.2 A framework for a system of logical clocks
                      3.2. Скалярное время Лампорта — KS, 3.3 Scalar time
                      3.3. Векторное время — KS, 3.4 Vector time

                      Во всех случаях речь идет о дословном копировании значительных участков тескта. В частности, содержательная часть разделов 3 и 4 полностью скопирована из других книг, остальные разделы я не смотрел. Мне почему-то приходит на ум слово «плагиат». Было бы интересно узнать, как относится к этому администрация ИТМО.

                      Поразительным образом, текст, столь вольно копирующий другие, сам защищен от копирования паролем.

                        0
                        Никита, спасибо комментарий. Я прям перечитал книгу, поскольку писал ее какое-то время назад. :) Отчасти Вы правы, отчасти не совсем, но суть не в этом. Конечно, в учебном пособии есть цитирование текста из книг. Это как раз-таки не противоречит требованиям к учебным пособиям.

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

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

                        Если же где-то обнаружите фактические неточности — мало ли что неверно, или в пособии нет частей, которые там обязательно должны быть, по вашему мнению — буду благодарен за обратную связь.
                          +1
                          Мне кажется вы сами понимаете в чем проблема, именно поэтому вы не ответили на вопрос какие части текста написаны вами самостоятельно. Но на всякий случай поясню: то, что вы перевели с английского главы книг по распределенным вычислениям это хорошо. Если бы вы издали сборник таких переводов, это было бы замечательно. Вы, однако, издали их под своим именем. Это называется плагиат и это очень плохо. Когда подобное становится известным, академическая карьера обычно заканчивается.
          0
          Материал конечно интересный сам по себе… Но после беглого просмотра он мне показался даже более далёким от практики, чем упомянутое знание нюансов C++. К примеру не увидел (проверял поиском) даже строчки про MPI, что кажется странным при подобном заголовке.
            0
            Да, вы правы, аббревиатуры MPI в тексте нет :) Наверное самое близкое к MPI, что есть в книге, представлено в разделах 1.5.4 «Примитивы взаимодействия» и 1.5.5 «Синхронный и асинхронный обмен сообщениями» Там предпринята попытка описать какие примитивы взаимодействия существуют и почему они такие.
            0
            Хм… «конус прошлого», «конус будущего», «логическое время». Очень похожие термины часто употребляются в научно-популярных изложениях СТО (Специальной теории относительности). С иллюстрациями, где два конуса (один расходится вверх, другой вниз) соприкасаются вершинами, и внутри конуса, уходящего вниз, написано «absolute past», внутри уходящего вверх написано «absolute future», а пространство вне конусов подписано «absolute elsewhere».
              0
              Так и есть. Эта терминология заимствована из теории относительности, хотя аналогия и не очень глубокая.
              –3
              --аббревиатуры MPI в тексте нет

              я так полагаю что книгу можно и не читать. Ибо в с++ есть три гитик:

              GPU / MPI / и трюки в C++
                0
                Я бы сказал немного по другому.

                Есть 3 уровня распараллеливания:
                1. На уровне инструкций — SIMD (sse, avx и т.п.)
                2. На уровне ядер — OpenMP и ещё куча вариантов типа TBB или даже просто std::thread.
                3. На уровне процессов (узлов) — MPI в первую очередь.

                А GPU — это у нас просто особый вырожденный случай пункта 2, использующий специфическое железо…

                Ну и да, не зная хорошо C++ можно написать тормозное приложение даже с использованием всего вышеперечисленного. )))
                  +2
                  я переиначу свой ответ.

                  1. Распараллеливание используя архитектуру компьютера
                  2. Распараллеливание используя допольнительные вычислительные устройства ака GPU
                  4. Распараллеливание используя сеть компьютеров, включающих 1,2
                +2
                Большое спасибо, очень интересно!

                Но что насчет epub-издания? Хотелось бы почитать в дороге (уезжаю в командировку) на телефоне, а PDF на 4 дюймах плохо воспринимается.
                  +1
                  На здоровье! :) К сожалению, на данный момент материал доступен только в PDF. Надо было указать об этом в тексте поста. Побегу исправлять.
                    +1
                    … поскольку пишу на Хабре впервые, я не знаю, можно ли исправлять / дополнять текст поста после его публикации и жать кнопку «Опубликовать» повторно. К чему это приведет? Подскажите, пожалуйста.
                      0
                      Да, epub-версия нужна, я бы тоже с ней ознакомился.
                        0
                        Да, но как, как мне сделать epub-версию? Я вообще не специалист в издательском деле :) и epub ни разу руках не держал. Может кто-то сразу подскажет как это можно сделать? Или я возьму некоторый таймаут, чтобы попытаться самому разобраться…
                    0
                    Между тем мне на электроную почту приходят отзывы с найденными неточностями и опечатками. К примеру, цитата:
                    Хочу сказать спасибо в целом за книгу и особенное спасибо за возможность скачать pdf.

                    Заметил неточность на странице 36. При описании рисунка 1.7 в тексте говорится о процессах А и В, а на самом рисунке они помечены как P1 и P2.

                    Очень благодарен за подобные письма! Пособие не проходит рецензирование и вычитку текста редактором (да и вообще кем бы то ни было), поэтому в нем безусловно есть ошибки с которыми безусловно надо бороться :) Буду признателен за все найденные ошибки и опечатки.
                      +1
                      Может тогда текст выложите на гитхаб?
                        0
                        Никогда не сталкивался с гитхабом. Будем посмотреть.
                      0
                      /me вспомнил, что хотел ещё раз полистать Тэля, но уже более вдумчиво…
                        +1
                        На мой взгляд очень, очень достойная монография, если не пугаться слов «конфигурация» и «система переходов» :)
                        0
                        Давно интересуюсь распределенными системами и рад, что наткнулся на описание книги. Отталкивает немного пролог с демонстрацией академического мировоззрения и мнением, что в вузах учат думать, но все-таки эта работа задевает настолько важную и перспективную тему, что я обязательно поинтересуюсь у знакомых реальных разработчиков распределенных систем, стоит ли вникать. Очень надеюсь, что работа окажется полезной для меня и будет повод сделать пожертвование.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое