"Złoty standard" lektur na temat programowania równoległego, rozproszonego i współbieżnego w realiach roku 2020.

0

Przyłapałem się na fakcie, że o ile miałem styczność z zagadnieniami tego typu, to nie potrafię w zasadzie wymienić jakichś pozycji z literatury przedmiotu poza może starymi pionierskimi pracami wprowadzającymi takie konstrukty jak semafory przez Dijkstrę itp. Czy coś wam świta w temacie pozycji dedykowanych typowo tym zagadnieniom? Czy też może jest to zaledwie temat poruszany raczej typowo w połączeniu z algorytmiką czy konkretnymi dziedzinami programowania.

1

W świecie Scali to chyba tylko niekończące się kłótnie aktorzy versus IO/Task/Future. Nie wiem już kto wygrał tą kłótnię i czy ktoś ją wygrał. Niestety żadnych książek teoretycznych na ten temat nie widziałem :(

3

Zbigniew J.Czech "Wprowadzenie do obliczeń równoległych" 2010

1

Java Concurrency in Practice ale to taki klasyk ;)

6

Nie wiem czy o tego rodzaju literaturę Ci chodziło, ale sam szukałem niedawno czegoś w temacie systemów rozproszonych i trafiłem na Designing Data-Intensive Applications; The big ideas behind reliable, scalable, and maintainable systems Martina Kleppmana. Całości nie zrecenzuję, bo jestem obecnie w trakcie, ale pokrótce:

  • na pierwszy rzut oka to jest książka pisania dla inżynierów, nie to żeby była pozbawiona zagadnień teoretycznych, ale do szczegółowych rozważań, wywodów i formalizmów matematycznych są po prostu odnośniki, w samej książki dane zagadnienie jest po prostu wyjaśnione, z ilustracjami / diagramami / wykresami / przykładami narzędzi które daną rzecz implementują
  • czyta się dobrze, dość fajnie wyważony stopień skondensowania informacji - raczej nie idzie to w stronę wałkowania w kółko tego samego, lub wtrącania zbędnych anegdotek, lub przeskakiwania z pojęcia na pojęcie i wynoszenia poziomu abstrakcji na orbitę
  • książka pokrywa sporo różnych zagadnień dotyczących systemów rozproszonych i okolic, pośrednio lub bezpośrednio - trochę miejsca jest poświęcone np. na sposoby składowania danych w bazach i ich wpływ na działanie systemu, ale też na problem ustalania konsensusu, współbieżne zapisy, zależności danych, replikację, partycjonowanie, rozwiązywanie konfliktów, spójność przyczynową i inne.
  • jak dotąd (pierwsze ~ 40% książki) autor nie fiksuje się na konkretnej technologii, więc nie jest to nic w rodzaju jak programować wielowątkowo w Javie. Wręcz tu i ówdzie widać różne smaczki i mały rant na "własne" rozwiązania różnej maści języków programowania.

Generalnie w książce pojawia się sporo pojęć, które na studiach przewijały mi się np. na wykładzie z systemów rozproszonych, programowania współbieżnego itd (jednak głównie na rozprochach), więc zakładam że tematyka jest zgodna z tym czego szukasz, ale raczej nie jest pisana "naukowym" stylem.

4

Algorytmika to raczej sznoruje buty tej dziedzinie (czyt. wiąże latające końcówki).

  • "Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems", Martin Kleppmann
  • "Distributed Computing: Principles, Algorithms, and Systems", Ajay D. Kshemkalyani
  • "Structured Parallel Programming: Patterns for Efficient Computation", Michael McCool, James Reinders, Arch Robison
  • "MapReduce Design Patterns: Building Effective Algorithms and Analytics for Hadoop and Other Systems", Donald Miner, Adam Shook
  • i na koniec coś o semaforach: "Podstawy programowania współbieżnego i rozproszonego" (Ben Ari)

Oprócz tego jest cała masa technologii praktycznych, które warto znać a które są związane ściśle z wybranymi językami lub środowiskami programistycznymi, przykłady:

  • OpenMP (simd/parallel), MPI, CUDA, OpenCL, SYCL, OpenACC, Intel OneAPI, TBB
  • Java SE: "Java Threads and the Concurrency Utilities", Jeff Friesen
  • C++: "C++ Concurrency in Action", Anthony Williams
  • Java: JMS, PCJ, Akka, Vert.x, RxJava
  • AMQP, Hadoop, AWS, gRPC

i koncepty:

  • korutyny
  • fibers
  • async (+ wybrany-język)

Koncept "aktorzy" z jakichś przyczyn wydaje się słabszy niż klasyczny "message passing", być może dlatego że bardziej (za bardzo) rozbudowany w stosunku do tego drugiego. To jest moja osobista opinia wynikająca z obserwacji rynku.

2

Również polecam Designing Data-Intensive Applications i The Little Book of Semaphores, a od siebie bym dorzucił do tej listy jeszcze Distributed Systems For Fun and Profit by Mikito Takada, którą można określić jako streszczenie tej pierwszej.

Niedawno też pojawiła się nowa pozycja, której jeszcze nie czytałem, ale spis treści wygląda obiecująco:
Distributed Systems for practitioners by Dimos Raptis

1

To do żadnego kanonu się raczej nie zalicza, ale zawiera krótkie wprowadzenia do kilku konkretnych rozwiązań z tego zakresu z punktu widzenia obliczeń naukowych i ma "open access".
https://mitpress.mit.edu/books/scientific-programming-and-computer-architecture
https://divakarvi.github.io/bk-spca/spca.html

Z innych praktycznych rzeczy chyba niewymienionych tutaj to w kwestii programowania rozproszonego warto poczytać o
Sparku i koncepcji RDD (tzn. trochę więcej niż w książce Kleppmanna).

Dla niektórych może być też zaskakujące, jak to może "robić się samo" w nudnych i pogardzanych ;) bazach danych.
https://www.oracle.com/technical-resources/articles/database/database-performance-geist-parallel-execution.html

1

Z bardziej praktycznych pozycji (ale to nie klasyk, raczej MEAP):
"Parallel and High Performance Computing" - Robert Robey, Yuliana Zamora

3

"Making reliable distributed systems in the presence of software errors" - praca doktorska Joego Armstronga, która opisuje Erlanga.

1

book.mixu.net/distsys/
aosabook.org/en/distsys.html
phuu.net/2015/12/07/distributed-systems-reading-list.html
github.com/golang/go/wiki/Courses#distributed-computing
github.com/heathermiller/dist-prog-book

1 użytkowników online, w tym zalogowanych: 0, gości: 1