Descripción general
El libro consta de 12 capítulos divididos en 3 secciones. Hay casi ninguna imagen, y se lee con bastante dificultad y lentitud porque todo es texto continuo, además de que la letra no es muy grande. Después de cada capítulo hay un resumen breve de unas cuantas páginas, así como una extensa bibliografía.
Resumen breve
El primer capítulo explica términos como mantenibilidad, escalabilidad y fiabilidad. El autor habla de qué son y por qué son importantes. Por cierto, recuerdo desde la universidad que estas no son las únicas características que debe tener el software.
El segundo capítulo describe modelos de datos, en concreto las bases de datos relacionales clásicas, las orientadas a documentos y las de grafos. Nada demasiado concreto todavía—solo características, ventajas y desventajas. Por cierto, aquí también se tratan los lenguajes de consulta (además de SQL, el autor incluso pone CSS como ejemplo de lenguajes declarativos).
Capítulo tres. Aquí es donde las cosas se ponen un poco más complejas y menos familiares para el trabajo diario del desarrollador promedio: árboles-B, SS-Tables, árboles LSM, índices hash. No es demasiado complicado, pero no trabajas con esto directamente todos los días, así que la información se olvida rápido. En el mejor de los casos, de 50 páginas del libro solo quedan un par de ideas. Pero algo que sí menciona y con lo que me topo casi a diario es el trabajo con índices y los subsistemas de almacenamiento de bases de datos (usando InnoDB y MyISAM como ejemplos).
El cuarto capítulo se centra en formatos de datos usados en transmisión. Hay que reconocerle al autor que no se limita a JSON y XML, sino que cubre Thrift, Protocol Buffers y Avro. También describe enfoques de transmisión como REST y RPC. Esto, por cierto, cierra la primera parte—sobre fundamentos de sistemas de información—y empieza otra parte—sobre sistemas distribuidos.
Uno de los siguientes capítulos, que inicia una nueva sección, trata sobre replicación. En mi opinión, la información aquí es bastante buena. Cubre las topologías principales para construir sistemas de replicación, describe nodos líderes y seguidores (incluso replicación sin líder), consistencia, problemas de latencia, quórum—todo esto está en el capítulo.
El siguiente capítulo es sobre particionamiento. También está bien explicado. La diferencia entre particionamiento y replicación. Particionamiento por rangos de valores clave, particionamiento por hash, enrutamiento de consultas y balanceo de carga—estos son los temas principales. Por cierto, el particionamiento se describe de forma general, sin atarse a ninguna tecnología o base de datos, así que todo aplica a otros sistemas: en MongoDB, Elasticsearch y SolrCloud se llama "shard"; en HBase—"región"; en Bigtable—"tableta"; en Cassandra y Riak—"nodo virtual" (vnode).
Luego viene un capítulo sobre transacciones. También está bien desarrollado. La mayor parte gira en torno a ACID, y también hay información sobre manejo de errores y abortos de transacciones.
Los dos últimos capítulos de la sección tratan sobre fallos, problemas y dificultades en sistemas distribuidos (por ejemplo, redes no fiables o desincronización de relojes entre dispositivos—"relojes no fiables"), así como consistencia y consenso (linearizabilidad) y trabajo con transacciones distribuidas.
De los tres capítulos siguientes (si excluimos el último, demasiado teórico, sobre el futuro de los sistemas de información), destacan los que hablan de procesamiento por lotes y en flujo (literalmente así se llaman). Aquí se cubren Hadoop, MapReduce y brokers de mensajes. Aunque toda esta información se presenta de forma algo superficial.
Mi opinión
Un libro teórico sobre programación que profundiza mucho en términos como tipos de bases de datos, concepto de transacciones, replicación, particionamiento, problemas de alta carga y disponibilidad en sistemas distribuidos, procesamiento en flujo y por lotes—y lo más importante—qué herramientas y tecnologías existen para resolver problemas relacionados con estos enfoques. Debido a su extensión, leerlo resulta lento y tedioso. Pero en general, si aprender programación es como armar un rompecabezas mental donde cada pieza es una tecnología, enfoque o simple consejo, este libro sin duda revela muchas de esas piezas. Así que, aunque el libro fue largo y árido, y el resumen—enorme, igual le puse una calificación bastante alta.