<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adevinta Spain</title>
    <description>The latest articles on DEV Community by Adevinta Spain (@adevintaspain).</description>
    <link>https://dev.to/adevintaspain</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2490%2F197ead93-3a42-443d-aceb-b372b908486a.png</url>
      <title>DEV Community: Adevinta Spain</title>
      <link>https://dev.to/adevintaspain</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adevintaspain"/>
    <language>en</language>
    <item>
      <title>Cómo construir tu propia data platform. From zero to hero.</title>
      <dc:creator>Gustavo Martin Morcuende</dc:creator>
      <pubDate>Fri, 09 Jun 2023 20:08:41 +0000</pubDate>
      <link>https://dev.to/adevintaspain/como-construir-tu-propia-data-platform-from-zero-to-hero-96c</link>
      <guid>https://dev.to/adevintaspain/como-construir-tu-propia-data-platform-from-zero-to-hero-96c</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Este artículo es el resultado de la ponencia presentada el día 28 de abril de 2023 en la &lt;a href="https://salmorejo.tech/2023/"&gt;Salmorejo Tech&lt;/a&gt;. Las slides de la presentación pueden encontrarse en el siguiente enlace: &lt;a href="https://www.slideshare.net/GustavoMartin46/cmo-construir-tu-propia-data-platform-from-zero-to-hero"&gt;slideshare&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Con esta ponencia se buscaba explicar a una audiencia con conocimientos básicos de tecnología, las distintas herramientas que se pueden emplear para construir una plataforma de datos.&lt;/p&gt;

&lt;p&gt;La ponencia comienza con una configuración sencilla, que prácticamente cualquier persona del mundo de la informática puede entender. Termina con una configuración compleja, donde sin entrar en muchos detalles, sí permite a la audiencia hacerse una idea de qué herramientas se requieren para implementar la solución.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferencia entre el mundo operacional y el mundo analítico.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TjUUEDl4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afl0sn6atmfhcb1sz72i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TjUUEDl4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afl0sn6atmfhcb1sz72i.png" alt="Image description" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El mundo operacional es donde encontramos las típicas aplicaciones de frontend y backend. En este mundo no es estrictamente necesario guardar históricos de información. Aquí estamos más interesados en guardar lo que el usuario necesite para realizar sus operaciones y estas operaciones pueden caducar con el paso del tiempo. Además, en el mundo operacional, guardamos grandes cantidades de información personal como pueden ser el email, teléfonos de contacto, direcciones, etc, etc. Esto es así porque los necesitamos para contactar con el usuario. Por ejemplo, para enviarle un pedido.&lt;/p&gt;

&lt;p&gt;En el mundo analítico lo que se quiere es guardar tanta información como sea posible. En muchas ocasiones historificada. En este mundo también, no es estrictamente necesario guardar datos personales, por ejemplo el email. Aquí no necesitamos contactar con el usuario, y por tanto no necesitamos conocer su email real, pero sí que puede que estemos interesados en saber cuántos emails distintos se han utilizado en el sistema a lo largo de los años.&lt;/p&gt;

&lt;p&gt;Es en este mundo analítico donde implementaremos nuestra plataforma de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es una plataforma de datos?
&lt;/h2&gt;

&lt;p&gt;Una plataforma de datos es un conjunto de aplicaciones, herramientas, bases de datos que permiten la adquisición, el almacenamiento, preparación y gobierno de datos. Es una solución completa para el procesado, ingesta, analizado y presentación de datos generados por una empresa.&lt;/p&gt;

&lt;p&gt;Ver links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mongodb.com/what-is-a-data-platform"&gt;https://www.mongodb.com/what-is-a-data-platform&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.splunk.com/en_us/data-insider/what-is-a-data-platform.html"&gt;https://www.splunk.com/en_us/data-insider/what-is-a-data-platform.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Quiénes son nuestros usuari@s?
&lt;/h2&gt;

&lt;p&gt;Antes de seguir adelante implementando una solución tecnológica, tenemos que identificar los usari@s que utilizarán dicha solución, así como sus necesidades de negocio.&lt;br&gt;
A continuación listamos los casos más típicos de usuarios que podemos encontrar para una plataforma de datos.&lt;/p&gt;
&lt;h3&gt;
  
  
  Data engineer.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X1v__0Hd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ty8cy4wmfnjvefv0c8g4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X1v__0Hd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ty8cy4wmfnjvefv0c8g4.png" alt="Image description" width="732" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se enfoca en el diseño, construcción, mantenimiento y gestión de infraestructuras de datos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Implementación y gestión de sistemas de almacenamiento de datos (bases de datos, almacenamientos en la nube, etc, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Asegurar que los datos estén limpios, organizados y estructurados de manera adecuada para que puedan ser utilizados de manera efectiva.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Data analysts y data scientists y machine learning engineers.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t0KmDpr0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p9qp474njc1xhwq5lque.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t0KmDpr0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p9qp474njc1xhwq5lque.png" alt="Image description" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data scientist: utiliza técnicas estadísticas y de análisis de datos para extraer información útil con el objetivo de mejorar la toma de decisiones y la eficacia de una empresa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data analyst: recopila, procesa y analiza datos para ayudar a las empresas a tomar decisiones informadas. Su trabajo es proporcionar información relevante y accionable para impulsar el crecimiento y el éxito empresarial.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Machine learning engineer: desarrolla y optimiza modelos de aprendizaje automático para resolver problemas empresariales complejos. Su trabajo es construir sistemas que puedan aprender y mejorar a medida que se exponen a más datos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Solución simple.
&lt;/h2&gt;

&lt;p&gt;Ahora que ya sabemos quiénes son nuestros clientes podemos empezar a plantear soluciones. Como se anticipó en la introducción, iremos del modelo más simple al más complejo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xYPTHt4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xt51c5l1hnxa0cqy64t1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xYPTHt4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xt51c5l1hnxa0cqy64t1.png" alt="Image description" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta solución, el mundo operacional y el mundo analítico comparten la misma base de datos.&lt;/p&gt;

&lt;p&gt;Observamos que todos nuestros usuarios comparten el mismo sistema. La plataforma de datos utilizará como sistema de almacenamiento la misma base de datos que el resto del sistema operacional.&lt;/p&gt;

&lt;p&gt;Para pequeñas y medianas empresas, esta puede ser una solución de compromiso, donde no se quiere añadir la complejidad que supone añadir sistemas de almacenamiento específicos para el mundo analítico.&lt;/p&gt;

&lt;p&gt;La plataforma de datos no necesitará proveer de un sistema de almacenamiento especial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ventajas: sistema más simple de mantener.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inconvenientes: acciones realizadas en el mundo analítico (por ejemplo sacar datos en un dashboard) pueden afectar a operaciones como pueden ser la compra de un producto desde el frontend porque el sistema de almacenamiento es compartido.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Herramientas que tendremos que proporcionar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wm2XszOe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnuo5c81yk3ph59a40q4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wm2XszOe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnuo5c81yk3ph59a40q4.png" alt="Image description" width="686" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Base de datos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;postgresql, mysql, oracle, etc, etc&lt;/li&gt;
&lt;li&gt;esquemas&lt;/li&gt;
&lt;li&gt;tablas&lt;/li&gt;
&lt;li&gt;gestión de permisos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplicaciones&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leen tablas de la base de datos, realizan una transformación y escriben los resultados en otras tablas.
&lt;/li&gt;
&lt;li&gt;ETL, extract, transform, load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dashboards&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagramas donde se muestran datos de interés&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Machine learning&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MLFlow&lt;/li&gt;
&lt;li&gt;Kubeflow&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Ejemplo de aplicaciones que podemos usar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Base de datos, por ejemplo &lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Aplicaciones como &lt;a href="https://airflow.apache.org/"&gt;Apache Airflow&lt;/a&gt; para el desarrollo de &lt;a href="https://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;ETLs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dashboards como &lt;a href="https://www.qlik.com/"&gt;Qlik&lt;/a&gt; y &lt;a href="https://www.tableau.com/"&gt;Tableau&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Para machine learning por ejemplo podemos proporcionar &lt;a href="https://www.kubeflow.org/"&gt;Kubeflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Gobernanza
&lt;/h3&gt;

&lt;p&gt;Gran importancia tendrá la definición y aplicación de reglas específicas para estandarizar nombres de las tablas, bases de datos, de procesos, etc, etc.&lt;/p&gt;

&lt;p&gt;Además será importante crear reglas de utilización de las herramientas ofrecidas por la plataforma de datos. Recordemos que al final, detrás de la tecnología hay personas.&lt;/p&gt;

&lt;p&gt;Debemos evitar que se haga un mal uso de dicha tecnología, para ello la gobernanza será fundamental.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solución intermedia.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8zLvs8hE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu7d48smwwgtnmha7abf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8zLvs8hE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu7d48smwwgtnmha7abf.png" alt="Image description" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta solución observamos que el mundo operacional ahora es mucho más complejo. &lt;/p&gt;

&lt;p&gt;Esta solución es necesaria cuando queremos evitar que procesos del mundo analítico afecten al mundo operacional. Además, el mundo operacional está compuesto por diferentes sistemas. Queremos tener todos nuestros datos analíticos en un único lugar para de este modo poder analizarlos y transformarlos de una manera sencilla.&lt;/p&gt;

&lt;p&gt;La plataforma de datos necesitará proveer en este caso de una base de datos propia y de herramientas que permitan la extracción de la información almacenada en los diferentes sistemas del mundo analítico.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ventajas: acciones realizadas en el mundo analítico no afectan al operacional porque el sistema de almacenamiento no es compartido. Todos los datos analíticos están recogidos en un único lugar.&lt;/li&gt;
&lt;li&gt;Inconvenientes: mayor complejidad y costes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Herramientas que tendremos que proporcionar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ift2lczN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/huxwu37vrw9fg0hr3lod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ift2lczN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/huxwu37vrw9fg0hr3lod.png" alt="Image description" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta solución las herramientas a proporcionar son las mismas que en la solución simple, pero ahora tenemos un nuevo tipo de base de datos, el Data Warehouse y aplicaciones que nos permitirán consumir información de los sistemas operacionales. El resto de las herramientas son las mismas que las que se explicaron en la anterior solución.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data Warehouse, por ejemplo, &lt;a href="https://aws.amazon.com/redshift/"&gt;AWS Redshift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Aplicaciones como &lt;a href="https://airflow.apache.org/"&gt;Apache Airflow&lt;/a&gt; para el desarrollo de &lt;a href="https://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;ETLs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dashboards como &lt;a href="https://www.qlik.com/"&gt;Qlik&lt;/a&gt; y &lt;a href="https://www.tableau.com/"&gt;Tableau&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Para machine learning por ejemplo podemos proporcionar &lt;a href="https://www.kubeflow.org/"&gt;Kubeflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ¿Qué es un Data Warehouse?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Es una base de datos centralizada que integra muchas fuentes de datos.&lt;/li&gt;
&lt;li&gt;Permite aislar los sistemas operacionales de los analíticos.&lt;/li&gt;
&lt;li&gt;Queries lanzadas desde el sistema analítico no afectan al operacional.&lt;/li&gt;
&lt;li&gt;Permite reorganizar la información de forma que sea más fácilmente analizable.&lt;/li&gt;
&lt;li&gt;Proporciona un único modelo de datos.&lt;/li&gt;
&lt;li&gt;Permite mantener un histórico de información que el operacional, por no necesitarla, puede borrar.&lt;/li&gt;
&lt;li&gt;Permite integrar múltiples fuentes de datos en un único lugar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E0n2Ta9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mk4w6kn4anixvq0hgurh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E0n2Ta9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mk4w6kn4anixvq0hgurh.png" alt="Image description" width="702" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelado específico, esquema en estrella.&lt;/li&gt;
&lt;li&gt;Compuesto de tablas de hechos y de dimensiones.&lt;/li&gt;
&lt;li&gt;Tabla de hechos: sucesión de hechos, alto número de registros.&lt;/li&gt;
&lt;li&gt;Tabla de dimensiones: descripción de los hechos, pocos registros y muchos atributos.&lt;/li&gt;
&lt;li&gt;Permite la optimización de las queries en modo lectura.&lt;/li&gt;
&lt;li&gt;Permite queries más simples, sin necesidad de múltiples JOINs como podría suceder en un modelo normalizado de entidad-relación.&lt;/li&gt;
&lt;li&gt;Permisos vía GRANTs en tablas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ¿Qué es AWS Redshift?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0_A3PDNN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29ao768s1rudp7mveutw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0_A3PDNN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29ao768s1rudp7mveutw.png" alt="Image description" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es una solución de Data Warehouse implementada por Amazon Web Services. Sin ningún esfuerzo, en la nube, podemos crear nuestro propio servidor.&lt;/p&gt;

&lt;p&gt;En la captura de pantalla superior, se muestra la interfaz gráfica que permite crear y configurar AWS Redshift.&lt;/p&gt;

&lt;p&gt;¡&lt;strong&gt;Cuidado!&lt;/strong&gt; Nunca uses la interfaz gráfica para crear y mantener tu infraestructura en la nube. Usa siempre &lt;a href="https://en.wikipedia.org/wiki/Infrastructure_as_code"&gt;infraestructura como código&lt;/a&gt;. Con esto consigues que tu infraestructura sea reproducible, automatizable y fácilmente mantenible por cualquier persona en tu equipo u organización. Para ello hay diferentes soluciones como pueden ser &lt;a href="https://en.wikipedia.org/wiki/AWS_CloudFormation"&gt;CloudFormation&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/AWS_Cloud_Development_Kit"&gt;CDK&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Terraform_(software)"&gt;Terraform&lt;/a&gt; y muchas otras.&lt;/p&gt;

&lt;p&gt;A continuación, documentamos un ejemplo de código Terraform que permite crear de forma sencilla un cluster &lt;a href="https://aws.amazon.com/redshift/redshift-serverless/"&gt;AWS Redshift serverless&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_redshiftserverless_workgroup"&lt;/span&gt; &lt;span class="s2"&gt;"serverless"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="nx"&gt;workgroup_name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="nx"&gt;namespace_name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_redshiftserverless_namespace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="mi"&gt;4&lt;/span&gt;   &lt;span class="nx"&gt;base_capacity&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;base_capacity&lt;/span&gt;
  &lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="nx"&gt;security_group_ids&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;security_group_ids&lt;/span&gt;
  &lt;span class="mi"&gt;6&lt;/span&gt;   &lt;span class="nx"&gt;subnet_ids&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subnet_ids&lt;/span&gt;
  &lt;span class="mi"&gt;7&lt;/span&gt;   &lt;span class="nx"&gt;enhanced_vpc_routing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="mi"&gt;8&lt;/span&gt;   &lt;span class="nx"&gt;publicly_accessible&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicly_accessible&lt;/span&gt;
  &lt;span class="mi"&gt;9&lt;/span&gt;   &lt;span class="nx"&gt;tags&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;
 &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="mi"&gt;11&lt;/span&gt; 
 &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_redshiftserverless_namespace"&lt;/span&gt; &lt;span class="s2"&gt;"serverless"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;13&lt;/span&gt;   &lt;span class="nx"&gt;namespace_name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
 &lt;span class="mi"&gt;14&lt;/span&gt;   &lt;span class="nx"&gt;admin_username&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;admin_username&lt;/span&gt;
 &lt;span class="mi"&gt;15&lt;/span&gt;   &lt;span class="nx"&gt;admin_user_password&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;admin_user_password&lt;/span&gt;
 &lt;span class="mi"&gt;16&lt;/span&gt;   &lt;span class="nx"&gt;db_name&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db_name&lt;/span&gt;
 &lt;span class="mi"&gt;17&lt;/span&gt;   &lt;span class="nx"&gt;iam_roles&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iam_roles&lt;/span&gt;
 &lt;span class="mi"&gt;18&lt;/span&gt;   &lt;span class="nx"&gt;default_iam_role_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default_iam_role_arn&lt;/span&gt;
 &lt;span class="mi"&gt;19&lt;/span&gt;   &lt;span class="nx"&gt;tags&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;
 &lt;span class="mi"&gt;20&lt;/span&gt; 
 &lt;span class="mi"&gt;21&lt;/span&gt;   &lt;span class="c1"&gt;# https://github.com/hashicorp/terraform-provider-aws/issues/26624&lt;/span&gt;
 &lt;span class="mi"&gt;22&lt;/span&gt;   &lt;span class="nx"&gt;lifecycle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;23&lt;/span&gt;     &lt;span class="nx"&gt;ignore_changes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="mi"&gt;24&lt;/span&gt;       &lt;span class="nx"&gt;iam_roles&lt;/span&gt;
 &lt;span class="mi"&gt;25&lt;/span&gt;     &lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="mi"&gt;26&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="mi"&gt;28&lt;/span&gt; 
 &lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_route53_record"&lt;/span&gt; &lt;span class="s2"&gt;"serverless"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;30&lt;/span&gt;   &lt;span class="nx"&gt;for_each&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route53_record_zone_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="mi"&gt;31&lt;/span&gt;   &lt;span class="nx"&gt;zone_id&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
 &lt;span class="mi"&gt;32&lt;/span&gt;   &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"redshift-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route53_record_name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
 &lt;span class="mi"&gt;33&lt;/span&gt;   &lt;span class="nx"&gt;type&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"CNAME"&lt;/span&gt;
 &lt;span class="mi"&gt;34&lt;/span&gt;   &lt;span class="nx"&gt;ttl&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
 &lt;span class="mi"&gt;35&lt;/span&gt;   &lt;span class="nx"&gt;records&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_redshiftserverless_workgroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.*.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;
 &lt;span class="mi"&gt;36&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución avanzada.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zOJjkQdq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vglhj500ady7rn5wq5wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zOJjkQdq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vglhj500ady7rn5wq5wk.png" alt="Image description" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta solución aparecen dos nuevos elementos: el &lt;a href="https://en.wikipedia.org/wiki/Data_lake"&gt;Data Lake&lt;/a&gt; o &lt;a href="https://www.databricks.com/blog/2020/01/30/what-is-a-data-lakehouse.html"&gt;Lakehouse&lt;/a&gt;, y fuentes de datos de tipo JSON, AVRO, XML o cualquier tipo de API.&lt;/p&gt;

&lt;p&gt;Esta solución la implementaremos cuando tengamos que guardar grandes cantidades de datos no estructurados como pueden ser eventos generados por el &lt;a href="https://en.wikipedia.org/wiki/Internet_of_things"&gt;Internet de las Cosas&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ventajas: podemos guardar datos no estructurados en grandes cantidades.&lt;/li&gt;
&lt;li&gt;Inconvenientes: mayor complejidad y costes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Herramientas que tendremos que proporcionar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wCOsel6Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bjoz6nzjna4pu10h7ou0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wCOsel6Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bjoz6nzjna4pu10h7ou0.png" alt="Image description" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta solución las herramientas a proporcionar son las mismas que en la solución intermedia, pero ahora se añade la necesidad de implementar un Data Lake o un Lakehouse.&lt;/p&gt;

&lt;p&gt;En nuestro caso, y porque estamos usando las herramientas proporcionadas por AWS en la nube, el Lakehouse se implementará haciendo uso de &lt;a href="https://en.wikipedia.org/wiki/Amazon_S3"&gt;AWS S3&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es un Data Lake o Lakehouse?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Es un sistema de almacenamiento de datos masivo y barato.&lt;/li&gt;
&lt;li&gt;Se utiliza para almacenar grandes cantidades de información en su formato nativo, sin necesidad de que los datos estén estructurados de una manera particular (JSON, XML, logs, etc)&lt;/li&gt;
&lt;li&gt;Los datos pueden provenir de diferentes fuentes, bases de datos, sensores, registros de máquinas, APIs, etc.&lt;/li&gt;
&lt;li&gt;Permite aislar los sistemas operacionales de los analíticos.&lt;/li&gt;
&lt;li&gt;Se utilizan sistemas distribuidos como AWS S3 de Amazon o HDFS (sistema de archivos de Hadoop) &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Qué es un Data Lake o Lakehouse implementado en AWS S3?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hL6tbVlf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at2pyhuhwg22edqbovl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hL6tbVlf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at2pyhuhwg22edqbovl6.png" alt="Image description" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En Adevinta, implementado en AWS S3 (en Amazon Cloud)&lt;/li&gt;
&lt;li&gt;Puede verse como un sistema de archivos con carpetas&lt;/li&gt;
&lt;li&gt;¡Pero no es un sistema de archivos!&lt;/li&gt;
&lt;li&gt;Los archivos se llaman objetos.&lt;/li&gt;
&lt;li&gt;Podemos usarlo mediante el Hadoop File System, Apache Spark, etc, etc.&lt;/li&gt;
&lt;li&gt;Permisos vía IAM Roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Cómo podemos usar el Data Lake o Lakehouse?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xg6o8GNj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o4yjvscm8mumt2j5atpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xg6o8GNj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o4yjvscm8mumt2j5atpc.png" alt="Image description" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder usarlo existen aplicaciones como Apache Spark. En la captura de pantalla superior, se muestra un notebook ejecutando código Apache Spark que permite leer un archivo comprimido en formato gzip y mostrar la información que contiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión.
&lt;/h2&gt;

&lt;p&gt;En esta ponencia hemos presentado diferentes soluciones para construir una plataforma de datos. Desde la más sencilla hasta la más compleja. Otras soluciones son posibles, pero todas ellas tendrán piezas muy similares a las aquí discutidas.&lt;/p&gt;

&lt;p&gt;Ahora ya solo queda que tú también montes en tu empresa tu propia data platform y logres ese ascenso o mejora laboral que te mereces.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to build your own data platform. Episode 2: authorization layer. Data Warehouse implementation.</title>
      <dc:creator>Gustavo Martin Morcuende</dc:creator>
      <pubDate>Sun, 04 Jun 2023 23:05:20 +0000</pubDate>
      <link>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-2-authorization-layer-data-warehouse-implementation-e0c</link>
      <guid>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-2-authorization-layer-data-warehouse-implementation-e0c</guid>
      <description>&lt;h2&gt;
  
  
  Introduction.
&lt;/h2&gt;

&lt;p&gt;This article is the second part of the episode about building an authorization layer for your data platform. You can find the whole list of articles following this link: &lt;a href="https://medium.com/@gu.martinm/list/how-to-build-your-own-data-platform-9e6f85e4ce39"&gt;https://medium.com/@gu.martinm/list/how-to-build-your-own-data-platform-9e6f85e4ce39&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the previous article we talked about how to implement the authorization layer in the Data Lake, in this second part we will be talking about the same but in the Data Warehouse.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authorization layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JDH8DWLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eeokawvxsm6zmz1dkg39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JDH8DWLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eeokawvxsm6zmz1dkg39.png" alt="Image description" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see in this diagram the Lakehouse with its metastore and the Data Warehouse. We already talked about the authorization layer for the Lakehouse in the previous article. Now it is the turn for the Data Warehouse.&lt;/p&gt;

&lt;p&gt;Because we will be using &lt;a href="https://en.wikipedia.org/wiki/Amazon_Web_Services"&gt;Amazon Web Services&lt;/a&gt; with &lt;a href="https://aws.amazon.com/redshift/"&gt;AWS Redshift&lt;/a&gt;, we will be implementing this layer using &lt;a href="https://aws.amazon.com/lake-formation/"&gt;Lake Formation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Processing layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xyYf0tRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccdijsa6snug3hpkh95o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xyYf0tRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccdijsa6snug3hpkh95o.png" alt="Image description" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Human users and processes will be the ones accessing the stored data through the authorization layer. Machines and processes like Zeppelin notebooks, AWS Athena for SQL, clusters of AWS EMR, Databricks, etc, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with the authorization.
&lt;/h2&gt;

&lt;p&gt;Data engineers, data analysts and data scientists work in different and sometimes isolated teams. They do not want their data to be deleted or changed by tools or people outside their teams.&lt;/p&gt;

&lt;p&gt;Data owners are typically in charge of granting access to their data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Owner — consumer, relationship.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fleeuAEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75l47konu6302lr6756y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fleeuAEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75l47konu6302lr6756y.png" alt="Image description" width="766" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A data consumer requests access to some data owned by a different team in a different domain. For example, a table in a database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The data owner grants access by approving the access request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upon the approval of an access request, a new permission is added to the specific table.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our authorization layer must be able to provide the above capability if we want to implement a data mesh with success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Warehouse, AWS Redshift.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B2yaFplg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9wi6bmx0jjjxlcmvhm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B2yaFplg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9wi6bmx0jjjxlcmvhm2.png" alt="Image description" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Data Warehouse is implemented on the top of AWS Redshift. Not many years ago a new service was released by Amazon called AWS Redshift RA3. What makes RA3 different from the old Redshift is that, in the new implementation, computation and storage are separated. Before having RA3, if users needed more storage capabilities, more computation had also to be paid even if computation was not a problem. And in the opposite way, when users needed more computation capabilities, more storage had to be paid. So, Redshift costs were typically high.&lt;/p&gt;

&lt;p&gt;We will be using AWS Redshift RA3. Here you can find some useful links that explain further what are AWS Redshift and AWS Redshift RA3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html"&gt;https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/"&gt;https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Warehouse, AWS Redshift RA3.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kLYViEDG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u3w0ahowrt0kummulkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kLYViEDG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u3w0ahowrt0kummulkf.png" alt="Image description" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon Redshift data sharing allows you to securely and easily share data for read purposes across different Amazon Redshift clusters without the complexity and delays associated with data copies and data movement. Data can be shared at many levels, including schemas, tables, views, and user-defined functions, providing fine-grained access controls that can be tailored for different users and businesses that all need access to the data.&lt;/p&gt;

&lt;p&gt;Lake Formation can be integrated with data sharing.&lt;/p&gt;

&lt;p&gt;For further information visit the following links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/announcing-amazon-redshift-data-sharing-preview/"&gt;https://aws.amazon.com/blogs/big-data/announcing-amazon-redshift-data-sharing-preview/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/centrally-manage-access-and-permissions-for-amazon-redshift-data-sharing-with-aws-lake-formation/"&gt;https://aws.amazon.com/blogs/big-data/centrally-manage-access-and-permissions-for-amazon-redshift-data-sharing-with-aws-lake-formation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Authorization, Federated Lake Formation.
&lt;/h2&gt;

&lt;p&gt;Using Lake Formation with AWS Redshift RA3 we can manage the permissions across different accounts from only one central account in a federated way. We are delegating permissions to other accounts but we keep the control of them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HT7y-pkT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/chs87i0uufo1gcb9a72w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HT7y-pkT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/chs87i0uufo1gcb9a72w.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Authorization, implementation.
&lt;/h2&gt;

&lt;p&gt;In order to implement federated authorization with AWS Redshift RA3 you can follow the next steps:&lt;/p&gt;

&lt;p&gt;AWS Redshift RA3, producer account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE DATASHARE producer_sharing&lt;/li&gt;
&lt;li&gt;GRANT USAGE ON DATASHARE producer_sharing TO ACCOUNT ‘FEDERATED_GOVERNANCE’&lt;/li&gt;
&lt;li&gt;ALTER DATASHARE producer_sharing ADD SCHEMA producer_schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Redshift RA3, consumer account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE DATASHARE consumer_sharing&lt;/li&gt;
&lt;li&gt;GRANT USAGE ON DATASHARE consumer_sharing TO ACCOUNT ‘FEDERATED_GOVERNANCE’&lt;/li&gt;
&lt;li&gt;ALTER DATASHARE consumer_sharing ADD SCHEMA consumer_schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Redshift RA3, main federated account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Through Lake formation console, allow access from consumer account to producer_sharing. You can see a screenshot about this configuration down below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aLzrxyZu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ix5ykv1gb09i9zjc8rln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aLzrxyZu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ix5ykv1gb09i9zjc8rln.png" alt="Image description" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the above configuration, the query from the consumer account will only see the column &lt;code&gt;brand_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PLoYeKa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6k87khycwuml8l7fo4qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PLoYeKa9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6k87khycwuml8l7fo4qo.png" alt="Image description" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;p&gt;In this article we have explained how you can implement an authorization layer using AWS AWS Redshift RA3 and AWS Lake Formation.&lt;/p&gt;

&lt;p&gt;With this authorization layer we will be able to resolve the following problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Producers and consumers from different domains must have the capability of working in an isolated way (if they wish so) if we want to implement a data mesh with success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Producers must be able to decide how consumers can access their data. They are the data owners, and they decide how others use their data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fine grained permissions can be established. At column and even if we want, at row level. This will be of great interest if we want to be GDPR compliant. More information about how to implement the GDPR in your own data platform will be explained in future articles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for the next article about how to implement your own Data Platform with success.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I hope this article was useful. If you enjoy messing around with Big Data, Microservices, reverse engineering or any other computer stuff and want to share your experiences with me, just follow &lt;a href="https://twitter.com/gumartinm"&gt;me&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datamesh</category>
      <category>dataplatform</category>
      <category>redshift</category>
      <category>lakeformation</category>
    </item>
    <item>
      <title>How to build your own data platform. Episode 2: authorization layer. Data Lake implementation.</title>
      <dc:creator>Gustavo Martin Morcuende</dc:creator>
      <pubDate>Fri, 02 Jun 2023 21:43:39 +0000</pubDate>
      <link>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-2-authorization-layer-data-lake-implementation-22l9</link>
      <guid>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-2-authorization-layer-data-lake-implementation-22l9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction.
&lt;/h2&gt;

&lt;p&gt;This is the second episode in the series about how to build your own data platform. You can find the whole list of articles in the following link &lt;a href="https://medium.com/@gu.martinm/list/how-to-build-your-own-data-platform-9e6f85e4ce39"&gt;https://medium.com/@gu.martinm/list/how-to-build-your-own-data-platform-9e6f85e4ce39&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember, a data platform will be used by many teams and users. Also the data to be stored could be coming from many and different sources. Data owners will want to set permissions and boundaries about who can access the data that they are storing in the data platform. &lt;/p&gt;

&lt;p&gt;In this episode I will explain how you can add these capabilities to your data platform. Also I will introduce the concept of &lt;a href="https://en.wikipedia.org/wiki/Data_mesh"&gt;data mesh&lt;/a&gt;, and how you can use the authorization layer for implementing the workflow between data consumers and data owners that you will need for creating a successful data mesh.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authorization layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N45XVE7B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvqr33kdqbct0r48nn7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N45XVE7B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvqr33kdqbct0r48nn7w.png" alt="Image description" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our authorization layer will be on the top of the storage one. In this way, users and applications willing to use the stored data will need to do it through this layer in a safe way. No data will escape from the storage layer without authorization.&lt;br&gt;
For implementing this layer you can use different solutions like &lt;a href="https://www.databricks.com/product/unity-catalog"&gt;Unity Catalog&lt;/a&gt; from Databricks, &lt;a href="https://aws.amazon.com/lake-formation/"&gt;Lake Formation&lt;/a&gt; from AWS, plain &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html"&gt;IAM&lt;/a&gt; roles also from AWS, &lt;a href="https://ranger.apache.org/"&gt;Apache Ranger&lt;/a&gt;, &lt;a href="https://privacera.com/"&gt;Privacera&lt;/a&gt; and many others.&lt;/p&gt;

&lt;p&gt;For this article, and because we are working with Amazon Web Services, we will be implementing this layer using IAM roles and Lake Formation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Processing layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MYKzhibH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8792221phjqc31znbm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MYKzhibH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8792221phjqc31znbm1.png" alt="Image description" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Human users and processes will be the ones accessing the stored data through the authorization layer. Machines and processes like&lt;a href="https://docs.aws.amazon.com/es_es/emr/latest/ReleaseGuide/emr-zeppelin.html"&gt; Zeppelin notebooks&lt;/a&gt;, &lt;a href="https://aws.amazon.com/athena/"&gt;AWS Athena&lt;/a&gt; for SQL, clusters of &lt;a href="https://aws.amazon.com/emr/"&gt;AWS EMR&lt;/a&gt;, &lt;a href="https://www.databricks.com/"&gt;Databricks&lt;/a&gt;, etc, etc.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem with the authorization.
&lt;/h2&gt;

&lt;p&gt;Data engineers, data analysts and data scientists work in different and sometimes isolated teams. They do not want their data to be deleted or changed by tools or people outside their teams. &lt;/p&gt;

&lt;p&gt;Also, for being &lt;a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation"&gt;GDPR&lt;/a&gt; compliant, to access &lt;a href="https://en.wikipedia.org/wiki/Personal_data"&gt;PII&lt;/a&gt; data, big restrictions will be required even at column or row level. &lt;/p&gt;

&lt;p&gt;Every stored data needs to have an owner, and in Data Mesh, data owners are typically in charge of granting access to their data.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is a Data mesh?
&lt;/h2&gt;

&lt;p&gt;Taken from &lt;a href="https://www.datamesh-architecture.com/#what-is-data-mesh"&gt;https://www.datamesh-architecture.com/#what-is-data-mesh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zLMEBH_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8bgtdcweu403xixt0gy5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zLMEBH_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8bgtdcweu403xixt0gy5.png" alt="Image description" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The term data mesh, coined in 2019 by &lt;a href="https://martinfowler.com/articles/data-mesh-principles.html"&gt;Zhamak Dehghani&lt;/a&gt;, is based on four key principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Domain ownership: Domain teams are responsible for their data, aligning with the boundaries of their team's domain. &lt;strong&gt;An authorization layer will be required for implementing those boundaries for some team&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data as a product: Analytical data should be treated as a product, with consumers beyond the domain. &lt;strong&gt;An owner-consumer relationship will exist, where consumers require access to products owned by a different team.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self-serve data infrastructure platform: A data platform team provides domain-agnostic tools and systems to build, execute, and maintain data products.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Federated governance: Interoperability of data products is achieved through standardization promoted by the governance group.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Owner - consumer, relationship.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gXDwwtL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lpj6odko10ldaotgctge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gXDwwtL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lpj6odko10ldaotgctge.png" alt="Image description" width="756" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A data consumer requests access to some data owned by a different team in a different domain. For example, a table in a database.&lt;/li&gt;
&lt;li&gt;The data owner grants access by approving the access request.&lt;/li&gt;
&lt;li&gt;Upon the approval of an access request, a new permission is added to the specific table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our authorization layer must be able to provide the above capability if we want to implement a data mesh with success.&lt;/p&gt;
&lt;h2&gt;
  
  
  Data Lake.
&lt;/h2&gt;

&lt;p&gt;In this section we will write a brief recap about what we explained in previous article: &lt;a href="https://medium.com/@gu.martinm/how-to-build-your-own-data-platform-f273014701ff"&gt;https://medium.com/@gu.martinm/how-to-build-your-own-data-platform-f273014701ff&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  AWS S3.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ihIahoPU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfcoir117w9w1q6ukqj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ihIahoPU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfcoir117w9w1q6ukqj5.png" alt="Image description" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Notebooks, Spark jobs, clusters, etc, etc, run in Amazon virtual servers called EC2.&lt;br&gt;
These virtual servers require permissions for accessing AWS S3. These permissions are given by IAM Roles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will be working with Amazon Web Services. As we said before, because the amount of data to be stored is huge, we can not use HDD or SSD data storages, we need something cheaper. In this case we will be talking about AWS S3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, in order to ease the use of the Data Lake, we can implement metastores on the top of it. For example, Hive Metastore or Glue Catalog. We are not going to explain deeply how a metastore works, that will be left for another future article.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When using a notebook (for example a Databricks notebook) and having a metastore, the first thing that the notebook will do is to ask the metastore where the data is physically located. Once the metastore responds, the notebook will go to the path in AWS S3 where the data is stored using the permissions given by the IAM Role.&lt;/p&gt;
&lt;h3&gt;
  
  
  Direct access or with a metastore.
&lt;/h3&gt;

&lt;p&gt;We have two options for working with the data. With or without using a metastore.&lt;br&gt;
With the metastore, users can have access to the data in the Data Lake in an easier way because they can use SQL statements as they do in any other databases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KAFTb0Mq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inicqwio30qpl0x4bq2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KAFTb0Mq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inicqwio30qpl0x4bq2r.png" alt="Image description" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Authorization, direct access.
&lt;/h2&gt;

&lt;p&gt;Consumers run their notebooks or any other applications from their AWS accounts and consume data located in the producer’s account. &lt;/p&gt;

&lt;p&gt;These notebooks and applications run in Amazon virtual servers called Amazon EC2 instances, and for accessing the data located in AWS S3 in the producer’s account, they use IAM Roles (the permissions for accessing the data)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QozqZ2ce--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09juuarv46cd5on6gt28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QozqZ2ce--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09juuarv46cd5on6gt28.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  S3 bucket policy
&lt;/h3&gt;

&lt;p&gt;For example, for being able to access to the S3 bucket called &lt;code&gt;s3://producer&lt;/code&gt;, with the IAM Role with ARN &lt;code&gt;arn:aws:iam::ACCOUNT_CONSUMER:role/IAM_ROLE_CONSUMER&lt;/code&gt;, we can use the following AWS S3 bucket policy in the &lt;code&gt;s3://producer&lt;/code&gt; bucket:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pWh0hDJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ladtrivevp9l0lrh0oaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pWh0hDJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ladtrivevp9l0lrh0oaf.png" alt="Image description" width="800" height="647"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Direct access
&lt;/h3&gt;

&lt;p&gt;Here, we are showing an example, where from a Databricks notebook using the above IAM Role and running in the consumer account, we are able to access data located in the producer’s account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--byVEaHzD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4czn5agezvot3zbrd9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--byVEaHzD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4czn5agezvot3zbrd9h.png" alt="Image description" width="800" height="712"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Can we do it better?
&lt;/h3&gt;

&lt;p&gt;With &lt;a href="https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html"&gt;Glue Catalog as metastore&lt;/a&gt;, data in S3 can be accessed as if it was stored in a table with rows and columns.&lt;/p&gt;

&lt;p&gt;If we use tables instead of the direct access, we can grant permissions even at column level.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/es/lake-formation/"&gt;Lake Formation&lt;/a&gt; provides its own permissions model that augments the IAM permissions model. This centrally defined permissions model enables fine-grained access to data stored in data lakes through a simple grant or revoke mechanism, much like a database. Lake Formation permissions are enforced using granular controls at the column, row, and cell-levels.&lt;/p&gt;
&lt;h2&gt;
  
  
  Authorization, Lake Formation.
&lt;/h2&gt;

&lt;p&gt;For using Lake Formation we will need the following elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An application running in some machine in an AWS account. For example, an AWS EC2 instance where a Spark notebook will be executed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A shared resource between the producer and consumer’s account. In this case we are sharing the S3 bucket called producer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An IAM Role with permissions for using the producer’s bucket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Two AWS Glue Catalogues as metastores. The one in the consumer's account will be in charge of forwarding the table resolution to the metastore in the producer’s account. Both metastores are also shared between the two accounts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tsQzll7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4kf9b0vhgayf1hfxtc75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tsQzll7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4kf9b0vhgayf1hfxtc75.png" alt="Image description" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The catalogue in the producer’s account contains all the required information for translating the virtual table to its physical S3 location.&lt;/p&gt;

&lt;p&gt;In the below screenshots you can see the Lake Formation configuration for the Glue metastore located in the producer’s account. &lt;/p&gt;

&lt;p&gt;First you can see the table and database where the producer’s table is located. You can also see that we are sharing the specific table with the consumer’s account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database: schema
Table: producer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7TugteEC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pq3grmajm8yrt5frh2uu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7TugteEC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pq3grmajm8yrt5frh2uu.png" alt="Image description" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above table we can configure access permissions. For example, we can decide that we will be allowing only the use of &lt;code&gt;SELECT&lt;/code&gt; statements from the consumer’s account and also the only column that will be shown is the one called &lt;code&gt;brand_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--buVHHBGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fn3pafvce60y0pzyrssu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--buVHHBGt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fn3pafvce60y0pzyrssu.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, from the Spark notebook running in the consumer’s account we can run SQL statements against the table located in the producer’s account.&lt;/p&gt;

&lt;p&gt;Because we only allowed access to the column called &lt;code&gt;brand_id&lt;/code&gt;, the consumer will only see values for that column. Any other column will be hidden.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--90aIq0ek--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at1wvg6seyizk0u6esap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--90aIq0ek--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at1wvg6seyizk0u6esap.png" alt="Image description" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;p&gt;In this article we have explained how you can implement an authorization layer using AWS IAM Roles and AWS Lake Formation.&lt;/p&gt;

&lt;p&gt;With this authorization layer we will be able to resolve the following problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Producers and consumers from different domains must have the capability of working in an isolated way (if they wish so) if we want to implement a data mesh with success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Producers must be able to decide how consumers can access their data. They are the data owners, and they decide how others use their data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fine grained permissions can be established. At column and even if we want, at row level. This will be of great interest if we want to be &lt;a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation"&gt;GDPR&lt;/a&gt; compliant. More information about how to implement the GDPR in your own data platform will be explained in future articles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for the next article about how to implement your own Data Platform with success.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I hope this article was useful. If you enjoy messing around with Big Data, Microservices, reverse engineering or any other computer stuff and want to share your experiences with me, just follow &lt;a href="https://twitter.com/gumartinm"&gt;me&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datamesh</category>
      <category>dataplatform</category>
      <category>datalake</category>
      <category>lakeformation</category>
    </item>
    <item>
      <title>Cómo me organizo con trabajo y familia numerosa</title>
      <dc:creator>Jorge Castro</dc:creator>
      <pubDate>Tue, 20 Dec 2022 00:24:49 +0000</pubDate>
      <link>https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84</link>
      <guid>https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Explica las cosas de manera que hasta un niño pueda entenderlas” ― Richard Feynman&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;Para aprender necesito recopilar, procesar y organizar información.&lt;/p&gt;

&lt;p&gt;Con una mezcla de configuración de mis redes sociales, Getting Things Done (GTD) y la creación de mi cerebro digital, he encontrado mi forma de seguir aprendiendo con un trabajo exigente y familia numerosa.&lt;/p&gt;

&lt;p&gt;Si quieres saber cómo lo hago tendrás que seguir leyendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;¿Por qué sigo aprendiendo?&lt;/li&gt;
&lt;li&gt;Mi contexto&lt;/li&gt;
&lt;li&gt;¿Cómo me organizo?&lt;/li&gt;
&lt;li&gt;Para mantenerme actualizado necesito tener fuentes de conocimiento&lt;/li&gt;
&lt;li&gt;¿Cómo organizo todo lo que aprendo?&lt;/li&gt;
&lt;li&gt;¿Qué son notas atómicas altamente enlazadas?&lt;/li&gt;
&lt;li&gt;Vale, ya he recopilado mucha información, pero ¿cuándo aprendo?&lt;/li&gt;
&lt;li&gt;¿Y esto es suficiente?&lt;/li&gt;
&lt;li&gt;Estas son las herramientas que uso para organizarme&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ¿Por qué sigo aprendiendo?
&lt;/h2&gt;

&lt;p&gt;He pasado por muchos roles que necesitan habilidades y conocimientos diferentes.&lt;br&gt;
He trabajado como Backend, SRE, Tech Lead, Engineering Manager y últimamente disfruto trabajando como Machine Learning Engineer en Adevinta.&lt;/p&gt;

&lt;p&gt;El desarrollo de software es una profesión que aunque estés 2 años en un mismo rol y en una misma empresa, necesitas adquirir nuevos conocimientos, herramientas y habilidades.&lt;/p&gt;

&lt;p&gt;Nunca me había parado a pensar cómo me mantengo actualizado.&lt;br&gt;
Pensarlo me ha hecho ser consciente de que sigo un proceso y he intentado estructurarlo para poder explicarlo.&lt;/p&gt;

&lt;p&gt;A lo mejor alguna cosa te sirve.&lt;/p&gt;

&lt;p&gt;Ten en cuenta que mi forma de aprender está muy influida por mi contexto.&lt;br&gt;&lt;br&gt;
Es muy posible que si tuviera un contexto diferente aprendería de forma diferente.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Mi contexto
&lt;/h2&gt;

&lt;p&gt;Mi prioridad son mi mujer y mis 4 hijos.&lt;br&gt;&lt;br&gt;
Yo elijo utilizar la mayor parte de mi tiempo en disfrutar con la familia y esto me deja muy poco tiempo para aprender.&lt;/p&gt;

&lt;p&gt;Llevo muchos años buscando la mejor forma de aprender. &lt;br&gt;
Todo lo que te contaré ha ido naciendo de muchos años de prueba, error y ajustar las cosas hasta que me han ido funcionando.&lt;/p&gt;

&lt;p&gt;Además tengo una opinión bastante impopular: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todos tenemos 24 horas al día. &lt;/li&gt;
&lt;li&gt;Cada uno elegimos en qué las dedicamos. &lt;/li&gt;
&lt;li&gt;Menos respirar, y unas cuantas horas de sueño, el resto del tiempo decidimos de forma consciente en qué lo invertimos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando quieras me lo rebates por &lt;a href="https://twitter.com/nikey_es" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; o &lt;a href="https://masto.es/@nikey_es" rel="noopener noreferrer"&gt;Mastodon&lt;/a&gt; y lo discutimos 😜&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo me organizo?
&lt;/h2&gt;

&lt;p&gt;Para tener mi cabeza despejada y organizada utilizo &lt;a href="https://es.wikipedia.org/wiki/Getting_Things_Done" rel="noopener noreferrer"&gt;GTD - Getting Things Done&lt;/a&gt;. Tanto para lo personal como lo laboral.&lt;/p&gt;

&lt;p&gt;Si no conoces GTD no pasa nada.&lt;br&gt;&lt;br&gt;
Te dejo mi definición y un par de diagramas que lo resumen muy bien. (El site de dónde copié los diagramas ya no existe.)&lt;/p&gt;

&lt;p&gt;Para mí, GTD es una metodología que me permite descargar y organizar todo lo que tengo en la cabeza de una forma que sé que en cada momento voy a tener disponible lo siguiente que necesito hacer y no voy a perder nada de lo que quiero conservar para el futuro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pasos de GTD
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2FGetting_Things_Done_Overview.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2FGetting_Things_Done_Overview.jpg" alt="Getting_Things_Done_Overview.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flujo de GTD
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2FGTD_Todoist_Flowchart.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2FGTD_Todoist_Flowchart.jpg" alt="GTD_Todoist_Flowchart.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Que las apariencias no te engañen.&lt;br&gt;&lt;br&gt;
Usar GTD no es sencillo. &lt;br&gt;
Yo tarde 3 intentos (a lo largo de 2 años) en conseguir que me funcionara.🤯  &lt;/p&gt;

&lt;p&gt;Durante el post nombraré varias veces la &lt;em&gt;Bandeja de entrada&lt;/em&gt; (Inbox), así que te explico cómo la uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es donde apunto todo lo que quiero sacar de mi cabeza. &lt;/li&gt;
&lt;li&gt;En mi caso la tengo centralizada en una carpeta en &lt;a href="https://todoist.com/" rel="noopener noreferrer"&gt;Todoist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;En esta Bandeja de Entrada apunto cada idea, nota, tarea, link interesante, pensamiento, curso que me interesa, video, etc. todo aquello que quiero sacar de mi cabeza pero que después quiero hacer algo con ello.&lt;/li&gt;
&lt;li&gt;Apunto todo lo que se me ocurre, incluso cuando estoy fregando cacharros, limpiando la casa, doblando la ropa, etc. Cosas mecánicas que me permiten parar de hacerlas, apuntar y seguir con la tarea.&lt;/li&gt;
&lt;li&gt;Esta Bandeja de Entrada debería procesarla varias veces al día, pero lo normal es que solo consiga hacerlo 1 vez al día. 🤷 (Y desde que llegó mi 4ª hija, una vez cada 2 días...)&lt;/li&gt;
&lt;li&gt;Intento que quede vacía y organizada para garantizar que voy a volver a esas tareas cuando sea necesario, sin tener que estar pensando continuamente en ellas. &lt;/li&gt;
&lt;li&gt;Cuando se me acumulan cosas sin procesar en la bandeja de entrada no miro nuevas cosas hasta que la proceso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La bandeja de entrada es solo el punto de entrada a GTD.&lt;br&gt;
Sin el resto de la metodología solo sería una lista infinita de cosas y no me serviría para nada.&lt;br&gt;
Para explicar el resto de fases de GTD harían falta muchos posts.&lt;/p&gt;

&lt;p&gt;Aquí te dejo una &lt;a href="https://www.muypymes.com/2014/03/31/gtd-para-dummies-todo-lo-que-necesitas-saber" rel="noopener noreferrer"&gt;introducción&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para mantenerme actualizado necesito tener fuentes de conocimiento
&lt;/h2&gt;

&lt;p&gt;Siempre busco la forma de conseguir información con el mínimo esfuerzo. &lt;br&gt;
Tengo muchas fuentes de conocimiento, y siempre que puedo me "aprovecho" de los algoritmos de recomendación.&lt;br&gt;
Además dejo que Google me conozca para que me muestre lo que yo quiero ver y evitar un poco la procrastinación. &lt;br&gt;
Mi objetivo es minimizar el tiempo que necesito para conseguir la información para continuar aprendiendo.&lt;/p&gt;

&lt;p&gt;Actualmente mis fuentes de conocimiento son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Medium pero &lt;strong&gt;solo el Daily Digest&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Twitter (&lt;strong&gt;pero una par de veces por semana&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Google Noticias (cuando me apetece porque también me ayuda a desconectar)&lt;/li&gt;
&lt;li&gt;Youtube&lt;/li&gt;
&lt;li&gt;Libros (En los pocos momentos que tengo para leer)&lt;/li&gt;
&lt;li&gt;Cuando quiero profundizar en un tema busco en Google y leo libros que me han recomendado o que ya tengo pendientes de leer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Medium Daily Digest
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deja que Medium trabaje por ti. &lt;/li&gt;
&lt;li&gt;Yo no voy a Medium, Medium y sus subsites vienen a mi.&lt;/li&gt;
&lt;li&gt;Tengo 2 cuentas de correo en las que recibo cada día el Medium Daily Digest&lt;/li&gt;
&lt;li&gt;En cada cuenta recibo temas diferentes:

&lt;ul&gt;
&lt;li&gt;Temas tech, desarrollo de software, ML, etc..&lt;/li&gt;
&lt;li&gt;Temas de productividad, management, mejora personal, etc..&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Puedes &lt;a href="https://medium.com/me/readinghistory" rel="noopener noreferrer"&gt;refinar las recomendaciones&lt;/a&gt; y &lt;a href="https://medium.com/me/following" rel="noopener noreferrer"&gt;cambiar los topics que sigues&lt;/a&gt;.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2Fmedium_refine_recommendations.png" alt="medium_refine_recommendations.png"&gt;
&lt;/li&gt;

&lt;li&gt;Muchos días solo leo el subject de los Daily Digest (suele ser el título del primer artículo). Si no me interesa ni lo abro.&lt;/li&gt;

&lt;li&gt;Si abro el mail, leo como máximo el título de los 3 primeros artículos del mail.&lt;/li&gt;

&lt;li&gt;Es la forma de no recopilar información infinita, porque si miras hasta el final, siempre encuentras algo que te llama la atención.&lt;/li&gt;

&lt;li&gt;&lt;p&gt;¿Y qué hago si me interesa el título de alguno de esos artículos? Pues lo mando a mi Bandeja de Entrada.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;¡Importante!&lt;/strong&gt; Si te interesa algún link y no quieres que afecte a las recomendaciones de esa cuenta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copia el link desde el email&lt;/li&gt;
&lt;li&gt;Edita la URL para quitar los ítems del source para que Medium no te lo trackee.&lt;/li&gt;
&lt;li&gt;Ábrelo en una ventana de incógnito o usa DuckDuckGo por si estás logado en Medium con la otra cuenta (Yo suelo estar deslogado siempre)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.Twitter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;La mayoría de cuentas que sigo están relacionadas con mis intereses.&lt;/li&gt;
&lt;li&gt;Dejo que Twitter haga su magia..... ¿Por qué? porque lo miro muy poco, un par de veces por semana.&lt;/li&gt;
&lt;li&gt;No me interesa ver el último comentario de las cuentas que sigo.&lt;/li&gt;
&lt;li&gt;Me interesa ver "lo más destacado"&lt;/li&gt;
&lt;li&gt;Cualquier link o tweet que crea que luego me va a servir o que quiero hacer algo con él... A la Bandeja de Entrada.&lt;/li&gt;
&lt;li&gt;Me pierdo muchas cosas, sí, y no pasa nada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Google Noticias
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google puede ser tu amigo si lo personalizas y le das tiempo...&lt;/li&gt;
&lt;li&gt;Puedes modificar la personalizacion de Google &lt;a href="https://adssettings.google.com/authenticated" rel="noopener noreferrer"&gt;sobre publicidad&lt;/a&gt; y &lt;a href="https://myactivity.google.com/activitycontrols/webandapp" rel="noopener noreferrer"&gt;sobre tu actividad&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Así cuando en tu móvil Android deslizas a la izquierda y vas a Google noticias, verás cosas que te interesan de verdad.&lt;/li&gt;
&lt;li&gt;Y si algo te interesa... A la Bandeja de Entrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Youtube
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lo puedes poner de fondo mientras cocinas, doblas ropa, friegas los cacharros, en el coche como si fuera un podcast.&lt;/li&gt;
&lt;li&gt;Tengo 2 listas de videos:

&lt;ul&gt;
&lt;li&gt;Una con temas que puedo poner en el coche para solo escuchar. Son temas por los que tengo curiosidad, videos que lo que cuentan no sé si me aportará algo pero tienen buena pinta. Si hay cosas interesantes que quiero apuntar, cuando paro el coche, añado el video a la Bandeja de entrada con algo como: "Repasar video para apuntar concepto XYZ".
&lt;/li&gt;
&lt;li&gt;Tengo otra lista con el resto de cosas que quiero ver y que necesitan atención plena para tomar notas o asimilar conceptos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.  Libros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;En casa me suelo levantar el primero y durante la semana aprovecho el desayuno para leer un poco de algún libro.&lt;/li&gt;
&lt;li&gt;Otro de mis rincones de lectura es el baño.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leo muy lento porque las ideas que me parecen interesantes del libro las intento convertir en &lt;em&gt;notas atómicas altamente enlazadas&lt;/em&gt;. Luego hablaré de qué es esto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Esto quiere decir que cada día me levanto antes y en el desayuno leo libros? No, algunos días leo algún artículo, otros programo algo, muchos no hago nada... &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depende del día, el tiempo que tenga y las ganas que tenga ese día de hacer algo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Cómo organizo todo lo que aprendo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tengo implementado GTD en una cuenta de pago de Todoist.&lt;/li&gt;
&lt;li&gt;En mi caso solo con Todoist no es suficiente.&lt;/li&gt;
&lt;li&gt;Tomo notas atómicas altamente enlazadas de todo lo que aprendo, pero Todoist no me sirve para hacerlo.&lt;/li&gt;
&lt;li&gt;Para las notas he tenido que crear &lt;a href="https://youtu.be/h9LfuVZquhg" rel="noopener noreferrer"&gt;mi cerebro digital&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Llevaba años usando &lt;a href="https://www.onenote.com/" rel="noopener noreferrer"&gt;OneNote&lt;/a&gt; para volcar todo lo que aprendo o todo lo que luego quiero volver a consultar. &lt;/li&gt;
&lt;li&gt;En los últimos meses he cambiando a &lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt; y poco a poco estoy migrando lo que tengo en OneNote. &lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;(Sí, he probado Notion y no es lo que yo necesito)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Las principales razones para el cambio a Obsidian son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Su sencillez para crear notas atómicas altamente enlazadas.&lt;/li&gt;
&lt;li&gt;Tener las mismas funcionalidades en móvil y en escritorio&lt;/li&gt;
&lt;li&gt;Tener control total sobre mis notas. Son markdowns y puedo guardarlos y leerlos como yo quiera. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Para organizar mis notas uso varios de los principios de &lt;strong&gt;Zettelkasten&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Si no conoces Zettelkasten este video lo explica muy bien y muestra una posible implementación en Notion. &lt;a href="https://www.youtube.com/watch?v=2rV13AhSHgs" rel="noopener noreferrer"&gt;Tomar Notas de esta forma me ha Cambiado la Vida | Zettelkasten con Notion&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Este otro video te puede ayudar a entender Zettelkasten de forma visual: &lt;a href="https://www.youtube.com/watch?v=XsAKJLWunOM" rel="noopener noreferrer"&gt;Cómo tomar notas para siempre | Método Zettelkasten explicado con ejemplos visuales&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Qué son notas atómicas altamente enlazadas?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Son la base de &lt;strong&gt;Zettelkasten&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Son notas tomadas con &lt;strong&gt;tus propias palabras&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Son &lt;strong&gt;atómicas&lt;/strong&gt; porque solo hablan de un concepto. No tienen porque ser cortas, pero cuanto más breves mejor.&lt;/li&gt;
&lt;li&gt;Son &lt;strong&gt;altamente enlazadas&lt;/strong&gt; porque creas notas con referencias cruzadas con otras notas que a su vez tienen referencias cruzadas a otras notas, etc..&lt;/li&gt;
&lt;li&gt;Por ejemplo, este post sale de copiar cosas de muchas notas atómicas. Notas sobre GTD, Aprender haciendo, Práctica deliberada, Zettelkasten, como priorizar....&lt;/li&gt;
&lt;li&gt;Este es el grafo que tengo actualmente con notas enlazadas y cada día va creciendo
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnikeyes.github.io%2Fimages%2F2022-11-13-como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos%2Fmi-cerebro-digital.png" alt="mi-cerebro-digital.png"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vale, ya he recopilado mucha información, pero ¿cuándo aprendo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cada semana "me comprometo" como mínimo a usar 2 fuentes de conocimiento, ya sean artículos, capítulos de libros, videos. &lt;/li&gt;
&lt;li&gt;Los selecciono en &lt;a href="https://facilethings.com/blog/es/basics-weekly-review" rel="noopener noreferrer"&gt;la revisión semanal de GTD&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Selecciono 1 fuente sobre Machine Learning. (Ahora estoy aprendiendo sobre modelos de difusión como Stable Diffusion. Si te interesa el tema, estas son &lt;a href="https://nikeyes.github.io/recursos-para-usar-stable-diffusion/" rel="noopener noreferrer"&gt;mis notas de lo último que he aprendido&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Selecciono 1 fuente que me apetezca de las que tengo recopiladas, sea de lo que sea. Desde videojuegos, crianza, jardinería, magia, etc. Cualquier cosa no relacionada con la primera fuente. (A no ser que me apetezca leer más cosas sobre lo anterior 😅)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Y esto es suficiente?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pues no&lt;/strong&gt;. Esto solo sirve para leer y tomar notas de nuevas cosas o profundizar en lo que quiero aprender. &lt;/li&gt;
&lt;li&gt;Leer y leer sin practicar a mí no me funciona.&lt;/li&gt;
&lt;li&gt;A mí lo que me funciona es &lt;strong&gt;aprender haciendo&lt;/strong&gt; (learning by doing), sobretodo usando &lt;strong&gt;práctica deliberada&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Para explicarte cómo aprendo he creado &lt;a href="https://dev.to/adevintaspain/como-sigo-aprendiendo-con-trabajo-mujer-y-4-hijos-1l8h"&gt;este otro post&lt;/a&gt; con todo el detalle&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estas son las herramientas que uso para organizarme
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Todoist&lt;/strong&gt; -  para implementar GTD.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt; - donde estoy creando mi cerebro digital.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar&lt;/strong&gt; - para todo aquello que tiene día y hora concreta.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drivesync&lt;/strong&gt; - para sincronizar Google Drive desde Android (solo sincronizo el vault de Obsidian).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo compressor&lt;/strong&gt; - para comprimir las imágenes que guardo en Obsidian.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voiceliner&lt;/strong&gt; - para crear notas de voz exportables a markdown.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gestor de archivos Plus&lt;/strong&gt; - Para copiar los markdown de Voiceliner al vault de Obsidian.
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aprendizaje</category>
      <category>mejoracontinua</category>
      <category>aprenderconhijos</category>
    </item>
    <item>
      <title>Cómo sigo aprendiendo con trabajo y familia numerosa</title>
      <dc:creator>Jorge Castro</dc:creator>
      <pubDate>Wed, 07 Dec 2022 23:14:57 +0000</pubDate>
      <link>https://dev.to/adevintaspain/como-sigo-aprendiendo-con-trabajo-mujer-y-4-hijos-1l8h</link>
      <guid>https://dev.to/adevintaspain/como-sigo-aprendiendo-con-trabajo-mujer-y-4-hijos-1l8h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Nunca vas a aprender todo lo que quieres.&lt;br&gt;&lt;br&gt;
Nunca vas a leer todo lo que quieres.&lt;br&gt;&lt;br&gt;
Nunca vas a ver todo lo que quieres.&lt;br&gt;&lt;br&gt;
Y no pasa absolutamente nada.&lt;br&gt;&lt;br&gt;
¡Acéptalo y vivirás más tranquila!” ― Jorge Castro&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;Si quieres llevarte una sola idea, &lt;strong&gt;aprende haciendo&lt;/strong&gt; (learning by doing) pero haciendo &lt;strong&gt;práctica deliberada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si quieres saber como llego a esa &lt;strong&gt;práctica deliberada&lt;/strong&gt; con un trabajo exigente y familia numerosa... Tendrás que seguir leyendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;¿Por qué sigo aprendiendo?&lt;/li&gt;
&lt;li&gt;Mi contexto&lt;/li&gt;
&lt;li&gt;¿Cuándo leo cosas nuevas?&lt;/li&gt;
&lt;li&gt;¿Y esto es suficiente?&lt;/li&gt;
&lt;li&gt;¿Qué es eso de la práctica deliberada?&lt;/li&gt;
&lt;li&gt;¿Qué es eso de aprender haciendo?&lt;/li&gt;
&lt;li&gt;¿Y si quiero aprender soft-skills?&lt;/li&gt;
&lt;li&gt;¿Y cómo aprendendo en mi día a día?&lt;/li&gt;
&lt;li&gt;¿Cómo sigo aprendiendo cuando solo tengo 30 minutos libres?&lt;/li&gt;
&lt;li&gt;¿Y si solo tengo 5 minutos libres?&lt;/li&gt;
&lt;li&gt;Resumen&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para aprender tengo que recopilar información y tenerla siempre disponible y a punto. Tengo mi forma de organizarme y de capturar información para aprender. Si te interesa el tema puedes leerlo &lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84"&gt;aquí&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué sigo aprendiendo?
&lt;/h2&gt;

&lt;p&gt;He pasado por muchos roles que necesitan habilidades y conocimientos diferentes.&lt;br&gt;
He trabajado como Backend, SRE, Tech Lead, Engineering Manager y últimamente disfruto trabajando como Machine Learning Engineer en Adevinta.&lt;/p&gt;

&lt;p&gt;El desarrollo de software es una profesión que aunque estés 2 años en un mismo rol y en una misma empresa, necesitas adquirir nuevos conocimientos, herramientas y habilidades.&lt;/p&gt;

&lt;p&gt;Nunca me había parado a pensar cómo me mantengo actualizado.&lt;br&gt;
Pensarlo me ha hecho ser consciente de que sigo un proceso y he intentado estructurarlo para poder explicarlo.&lt;/p&gt;

&lt;p&gt;A lo mejor alguna cosa te sirve.&lt;/p&gt;

&lt;p&gt;Ten en cuenta que mi forma de aprender está muy influida por mi contexto.&lt;br&gt;&lt;br&gt;
Es muy posible que si tuviera un contexto diferente aprendería de forma diferente.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Mi contexto
&lt;/h2&gt;

&lt;p&gt;Mi prioridad son mi mujer y mis 4 hijos.&lt;br&gt;&lt;br&gt;
Yo elijo utilizar la mayor parte de mi tiempo en disfrutar con la familia y esto me deja muy poco tiempo para aprender.&lt;/p&gt;

&lt;p&gt;Llevo muchos años buscando la mejor forma de aprender. &lt;br&gt;
Todo lo que te contaré ha ido naciendo de muchos años de prueba, error y ajustar las cosas hasta que me han ido funcionando.&lt;/p&gt;

&lt;p&gt;Además tengo una opinión bastante impopular: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todos tenemos 24 horas al día. &lt;/li&gt;
&lt;li&gt;Cada uno elegimos en qué las dedicamos. &lt;/li&gt;
&lt;li&gt;Menos respirar, y unas cuantas horas de sueño, el resto del tiempo decidimos de forma consciente en qué lo invertimos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando quieras me lo rebates por &lt;a href="https://twitter.com/nikey_es"&gt;Twitter&lt;/a&gt; o &lt;a href="https://masto.es/@nikey_es"&gt;Mastodon&lt;/a&gt; y lo discutimos 😜&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuándo leo cosas nuevas?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Si quieres entender cómo recopilo y uso mis fuentes de conocimiento puedes leerleerlo &lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84"&gt;aquí&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Cada semana "me comprometo" a usar 2 fuentes de conocimiento ya sean artículos, capítulos de libros, videos. &lt;/li&gt;
&lt;li&gt;Ahora mismo tengo 2 grupos:

&lt;ul&gt;
&lt;li&gt;Selecciono 1 fuente sobre Machine Learning. (Ahora estoy aprendiedo sobre modelos de difusión como Stable Diffusion. Si te interesa el tema, estas son &lt;a href="https://nikeyes.github.io/recursos-para-usar-stable-diffusion/"&gt;mis notas de lo último que he aprendido&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Selecciono 1 fuente que me apetezca de las que tengo recopiladas, sea de lo que sea. Desde videojuegos, crianza, jardinería, magia, etc. Cualquier cosa no relacionada con la primera fuente. (A no ser que me apetezca leer más cosas sobre lo anterior 😅)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Y esto es suficiente?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pues no. Esto solo sirve para leer y &lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84/#qu%C3%A9-son-notas-at%C3%B3micas-altamente-enlazadas"&gt;tomar notas&lt;/a&gt; de nuevas cosas o profundizar en lo que quiero aprender. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leer y leer sin practicar a mí no me funciona.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A mí lo que me funciona es &lt;strong&gt;aprender haciendo&lt;/strong&gt; (learning by doing), sobretodo usando &lt;strong&gt;práctica deliberada&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es eso de la práctica deliberada?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Es practicar de forma consciente los temas que quieres mejorar.&lt;/li&gt;
&lt;li&gt;Tienes que ejercitar aquellas cosas que necesitas y se te dan peor.&lt;/li&gt;
&lt;li&gt;Necesitas total concentración y esfuerzo con el tema. &lt;/li&gt;
&lt;li&gt;Los demás temas que quieres aprender no existen.&lt;/li&gt;
&lt;li&gt;Normalmente hace falta repetición. Tienes que practicar de forma sostenida durante un tiempo.&lt;/li&gt;
&lt;li&gt;Eso implica que tienes que tener muy claro a qué vas a renunciar para hacer esa práctica deliberada de forma sostenida.&lt;/li&gt;
&lt;li&gt;Y por supuesto, tener fuerza de voluntad y constancia para cumplirlo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es eso de aprender haciendo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Siempre aprendo más si lo aplico en algo práctico, ya sea algo para casa, para el trabajo, dar una charla, un taller, etc. Algo en lo que pueda aplicar lo que estoy aprendiendo.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intento seguir el siguiente proceso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Me hago las siguientes preguntas: Si tengo que explicárselo a alguien que no sabe del tema ¿Qué le explicaría? ¿Cómo se lo explicaría? ¿Por dónde empezaría la explicación?&lt;/li&gt;
&lt;li&gt;Divido lo que quiero aprender en partes pequeñas y manejables.&lt;/li&gt;
&lt;li&gt;Recopilo &lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84/#para-mantenerme-actualizado-necesito-tener-fuentes-de-conocimiento"&gt;mis fuentes de información&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Busco la forma de recibir feedback lo más inmediato posible de cada una de las partes que he dividido. Por ejemplo, código funcionando, llevar una conversación con la técnica que quería aprender, etc.&lt;/li&gt;
&lt;li&gt;Y me planteo continuamente cómo podía haber aprendido mejor y más rápido.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En realidad estoy aplicando mi propia variante de la &lt;a href="https://www.businessinsider.es/tecnica-feynman-como-aprender-cualquier-cosa-forma-efectiva-969275"&gt;técnica Feynman&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lo bueno de aprender haciendo es que a medida que avances irás encontrando nuevas dudas y problemas de los que aprender.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Y si quiero aprender soft-skills?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Exactamente lo mismo. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprender haciendo&lt;/strong&gt; y &lt;strong&gt;práctica deliberada&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Por ejemplo, quiero mejorar la escucha activa.&lt;/li&gt;
&lt;li&gt;Tu práctica será utilizar de forma consciente alguno de los principios de escucha activa en la siguiente conversación que tengas con otra persona, ya sea tu pareja, tu hijo, un amigo o una persona de tu equipo si eres manager.&lt;/li&gt;
&lt;li&gt;Y cuando lo hayas practicado piensa en cómo lo podías haber hecho mejor y vas mejorando poco a poco.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Y cómo aprendendo en mi día a día?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Aquí empieza lo difícil.&lt;/li&gt;
&lt;li&gt;Te toca saber priorizar de verdad...🤷‍♂️&lt;/li&gt;
&lt;li&gt;Durante X semanas solo me centro en un tema.&lt;/li&gt;
&lt;li&gt;Lo difícil no es elegir el tema al que me quiero dedicar, lo difícil es decidir a qué voy a renunciar. Por ejemplo, no veré esa serie que tantas ganas le tengo, o no jugaré ese nuevo juego que tiene buena pinta, o no aprenderé sobre este tema que también me interesa hasta dentro de un tiempo...&lt;/li&gt;
&lt;li&gt;Algunas noches, cuando las fieras se van a dormir, en lugar de ponerme una serie/peli/juego, pruebo cosas que me han parecido interesantes de lo que he ido aprendiendo.&lt;/li&gt;
&lt;li&gt;Otras veces me levanto 1 hora antes para programar o probar algo que llevo días dándole vueltas.&lt;/li&gt;
&lt;li&gt;Esto quiere decir que aprendo muy pocas cosas y muy lento. Es algo que tienes que asumir y vivir con ello.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si intentas aprender a un ritmo que no es sostenible con tu vida, acabará afectando a tu salud, a tu familia y a tu trabajo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;En vacaciones siempre intento hacer como mínimo un curso (Codely, Pluralsight, Udemy u otras plataformas) y aplicar lo que aprendo del curso: 

&lt;ul&gt;
&lt;li&gt;Por ejemplo, las últimas vacaciones hice varios cursos sobre bash y Mac en Codely (cada día intentaba ver un capítulo del curso en varios ratos que iba teniendo) y de ahí he creado la template para configurar el entorno para desarrollar proyectos de Machine Learning.
&lt;/li&gt;
&lt;li&gt;Para aprender Node.js me hice un scrapper de precios de PortAventura (y antes de la pandemia nos íbamos a PortAventura con todo incluido y hotel de lujo a precio de los "baratos"). &lt;/li&gt;
&lt;li&gt;Para aprender Python hice una template de despliegue de modelos de Machine Learning.&lt;/li&gt;
&lt;li&gt;Para aprender Obsidian estoy creando mi propio cerebro digital.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Tienes que buscar algo que te permita aplicar lo que quieres aprender de forma práctica.&lt;/li&gt;
&lt;li&gt;Y si lo vas a aplicar en tu trabajo, que sea en una prueba de concepto o fuera del camino crítico de tu negocio. (Qué nos conocemos... 😜)&lt;/li&gt;
&lt;li&gt;A veces me propongo explicar ese tema a otra persona o dar una charla o escribir sobre ello, así me obligo a tener fechas y a pensar muy bien que necesito aprender en el tiempo que tengo para que lo puedas explicar a otras personas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Cómo sigo aprendiendo cuando solo tengo 30 minutos libres?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Si tienes poca disponibilidad también puedes aprender.&lt;/li&gt;
&lt;li&gt;Aprenderás lento, pero si eres constante puedes aprender igual.&lt;/li&gt;
&lt;li&gt;Cuando voy a tener muy poca disponibilidad troceo mucho lo que quiero aprender y elijo cosas muy concretas para practicar.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Por ejemplo, si quiero aprender testing en legacy code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En mis primeros huecos disponibles recupero posts o capítulos de libros que &lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84/#para-mantenerme-actualizado-necesito-tener-fuentes-de-conocimiento"&gt;tengo guardados sobre el tema&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Si creo que sigo necesitando más información, en los siguientes huecos busco nueva información sobre el tema.&lt;/li&gt;
&lt;li&gt;Después voy leyendo/viendo, tomando notas y decidiendo qué tema concreto practicaré.&lt;/li&gt;
&lt;li&gt;Por ejemplo, decido practicar "Approval Testing"&lt;/li&gt;
&lt;li&gt;En los siguientes huecos busco ejemplos que podría implementar para practicar "Approval Testing"&lt;/li&gt;
&lt;li&gt;En alguno de los huecos preparo el entorno y el ejemplo&lt;/li&gt;
&lt;li&gt;Y a partir de ahí... ¡A practicar!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Es un proceso lento. Con otro contexto podrías hacerlo en una tarde, pero si no tienes una tarde, poco a poco puedes conseguir los mismos resultados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;La clave está en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trocear mucho lo que quieres aprender.&lt;/li&gt;
&lt;li&gt;Ten siempre todo preparado suponiendo que sólo vas a tener 30 minutos libres:&lt;/li&gt;
&lt;li&gt;Si son libros, a la vista y marcados por dónde ibas.&lt;/li&gt;
&lt;li&gt;Si es desarrollo, el IDE abierto y preparado.&lt;/li&gt;
&lt;li&gt;La documentación, tutorial o video en el punto para empezar. &lt;/li&gt;
&lt;li&gt;Seguro que en 30 minutos te da tiempo a practicar ese tipo de test que querías, esos atajos de teclado que necesitas o ese refactor que no dominas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sumando pequeños aprendizajes puedes llegar a resultados extraordinarios&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Como dice &lt;a href="https://twitter.com/TonyRobbins"&gt;Tony Robbins&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;No importa lo mal o lento que vayan las cosas, sigues estando muy por delante de todos los que ni siquiera lo intentan.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esta forma de aprender hace que empiece algunos temas y entre parón y parón ya no tenga ganas de continuar con ellos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para mí eso significa que ese tema o no es tan importante como creía, o no lo necesito tanto como esperaba y no pasa nada, a lo mejor lo retomo en un futuro, o no.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Y si solo tengo 5 minutos libres?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Si solo tienes 5 minutos libres es que estás priorizando otras cosas por delante de tu aprendizaje. &lt;/li&gt;
&lt;li&gt;O cambias las prioridades o asumes que solo podrás leer alguna cosa de vez en cuando. &lt;/li&gt;
&lt;li&gt;Para solo leer sin tiempo de práctica, mejor usa esos 5 minutos para descansar y desconectar, que te hace falta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Para aprender vas a necesitar motivación, pero la motivación se te va a acabar. Lo que de verdad necesitas es mucha &lt;strong&gt;fuerza de voluntad y constancia&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Asume que &lt;strong&gt;no puedes aprender todo lo que quieres&lt;/strong&gt; y no pasa absolutamente nada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elige un tema, &lt;strong&gt;sólo un tema&lt;/strong&gt; y durante un tiempo enfócate solo en ese tema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84/#para-mantenerme-actualizado-necesito-tener-fuentes-de-conocimiento"&gt;&lt;strong&gt;Recopila información&lt;/strong&gt;&lt;/a&gt; relacionada con el tema durante un tiempo: capítulos de libros, cursos, tutoriales, podcasts, lo que creas que te ayudará para empezar a aprender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/adevintaspain/como-me-organizo-para-seguir-aprendiendo-con-trabajo-mujer-y-4-hijos-3i84/"&gt;&lt;strong&gt;Organízate la información&lt;/strong&gt;&lt;/a&gt; para tenerla siempre accesible de forma rápida.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elige algo práctico donde aplicar lo que vas a aprender y usa cada minuto que tengas para aprender usando &lt;strong&gt;práctica deliberada&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ten tu &lt;strong&gt;entorno&lt;/strong&gt; de aprendizaje &lt;strong&gt;siempre a punto&lt;/strong&gt; y listo para continuar donde lo dejaste.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Parte del aprendizaje es organizar todo lo que has aprendido, ya sea código bien ordenado en GitHub, resúmenes, notas bien estructuradas, etc. Esto te ayudará a consolidar el aprendizaje y te permitirá consultar ese tema de forma muy rápida en un futuro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Antes de pasar al siguiente tema &lt;strong&gt;descansa&lt;/strong&gt; unos días, semanas o meses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Y por último, &lt;strong&gt;vuelve a empezar&lt;/strong&gt;...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aprendizaje</category>
      <category>mejoracontinua</category>
      <category>aprenderconhijos</category>
    </item>
    <item>
      <title>How to build your own data platform. Episode 1: sharing data between environments. Data Warehouse implementation.</title>
      <dc:creator>Gustavo Martin Morcuende</dc:creator>
      <pubDate>Tue, 06 Dec 2022 00:27:50 +0000</pubDate>
      <link>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-1-sharing-data-between-environments-data-warehouse-implementation-4nko</link>
      <guid>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-episode-1-sharing-data-between-environments-data-warehouse-implementation-4nko</guid>
      <description>&lt;h2&gt;
  
  
  Introduction.
&lt;/h2&gt;

&lt;p&gt;This article is the second part of the first episode about how to build your own data platform. To catch up, follow this link: &lt;a href="https://dev.to/adevintaspain/how-to-build-your-own-data-platform-4l6c"&gt;https://dev.to/adevintaspain/how-to-build-your-own-data-platform-4l6c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a short recap, remember that for creating a data platform many parts are involved. For this first episode we are only focusing on the component that we called storage layer. In the storage layer we could find the Lakehouse or Data Lake and the Data Warehouse. In the previous article we talked about how to share data in the Data Lake, in this second part we will be talking about the same but in the Data Warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FQ5xqutf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/19ifkap4g03ppz060no5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FQ5xqutf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/19ifkap4g03ppz060no5.png" alt="storage layer" width="880" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see in this diagram three different elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Lakehouse:&lt;/strong&gt; we already talked about it in the previous article.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metastore:&lt;/strong&gt; also we explained it in the last article. We will talk about it more deeply in the coming articles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Warehouse:&lt;/strong&gt; many times you will need to implement &lt;a href="https://en.wikipedia.org/wiki/Star_schema"&gt;star schemas&lt;/a&gt; for creating &lt;a href="https://en.wikipedia.org/wiki/Data_mart"&gt;data marts&lt;/a&gt;. Here, users can find meaningful data for creating dashboards, machine learning products or any other thing that users require. In this case, the Data Warehouse will be implemented on &lt;a href="https://aws.amazon.com/redshift/"&gt;AWS Redshift&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current situation (environment isolation)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gvQG4qaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbep4wl6hfks7ffzetjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gvQG4qaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbep4wl6hfks7ffzetjg.png" alt="current situation" width="880" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember that if you want users to create data products as fast as possible, you will need to create at least one environment where these users can mess around with the stored data. In this isolated environment they will be able to break and change as many things as they want. Our production environment must be isolated from this and other environments because we do not want to break productive processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with data.
&lt;/h2&gt;

&lt;p&gt;We want users to be able to work with huge amounts of data in an easy and fast way, but we want them to do that in isolated environments from the productive one because we do not want them to break anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Warehouse, AWS Redshift.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VaSkUBmG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzoj2ui1lamfqvfjy9mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VaSkUBmG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzoj2ui1lamfqvfjy9mm.png" alt="data warehouse aws redshift" width="880" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the environments have the same components but isolated one of each other.&lt;/p&gt;

&lt;p&gt;The Data Warehouse is implemented on the top of AWS Redshift. Not many years ago a new service was released by Amazon called &lt;a href="https://aws.amazon.com/redshift/features/ra3/"&gt;AWS Redshift RA3&lt;/a&gt;. What makes RA3 different from the old Redshift is that, in the new implementation, computation and storage are separated. Before having RA3, if users needed more storage capabilities, more computation had also to be paid even if computation was not a problem. And in the opposite way, when users needed more computation capabilities, more storage had to be paid. So, Redshift costs were typically high.&lt;/p&gt;

&lt;p&gt;Since the release of AWS Redshift RA3, because storage and computation are separated, users can decide if they want to increase either their storage or computational capabilities and only pay for what they need.&lt;/p&gt;

&lt;p&gt;We will be using AWS Redshift RA3. Here you can find some useful links that explain further what are AWS Redshift and AWS Redshift RA3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html"&gt;https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/"&gt;https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Warehouse, Redshift RA3.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AIqEGZr7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m88lbkztghbtsmf9ngm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AIqEGZr7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m88lbkztghbtsmf9ngm9.png" alt="Image description" width="880" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Redshift RA3 storage is located under the component called Redshift Managed Storage located in AWS S3. As you can see on the above diagram, compute nodes are separated from the storage.&lt;/p&gt;

&lt;p&gt;You can find more information about RA3 in the following link: &lt;a href="https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/"&gt;https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Warehouse, integration and production environments.
&lt;/h2&gt;

&lt;p&gt;In the integration environment we work with data as you can see in the pictures below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k4g_ne66--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9w3bnsf50fmd4nftntf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k4g_ne66--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9w3bnsf50fmd4nftntf9.png" alt="integration environment" width="880" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the production environment we have the exact same system but isolated from the integration environment. In production we find the exact same statements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rkHqq7fW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rdgq5gtsnm9imr9mlapz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rkHqq7fW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rdgq5gtsnm9imr9mlapz.png" alt="production environment" width="880" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Warehouse, sharing data.
&lt;/h2&gt;

&lt;p&gt;AWS Redshift RA3 includes something called data sharing. With data sharing we can access with read only permissions to Redshift data located in other Redshift servers and even in different accounts or environments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data sharing provides instant, granular, and high-performance access without copying data and data movement. You can query live data constantly across all consumers on different RA3 clusters in the same AWS account, in a different AWS account, or in a different AWS Region. Queries accessing shared data use the compute resources of the consumer Amazon Redshift cluster and don’t impact the performance of the producer cluster.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/"&gt;https://aws.amazon.com/blogs/big-data/use-amazon-redshift-ra3-with-managed-storage-in-your-modern-data-architecture/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/blogs/big-data/announcing-amazon-redshift-data-sharing-preview/"&gt;https://aws.amazon.com/blogs/big-data/announcing-amazon-redshift-data-sharing-preview/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Sharing.
&lt;/h3&gt;

&lt;p&gt;With Data Sharing, we can configure the AWS Redshift in the integration environment for accessing the storage of the AWS Redshift located in the production environment.&lt;/p&gt;

&lt;p&gt;You can find more information about it in the following link: &lt;a href="https://aws.amazon.com/blogs/big-data/sharing-amazon-redshift-data-securely-across-amazon-redshift-clusters-for-workload-isolation/"&gt;https://aws.amazon.com/blogs/big-data/sharing-amazon-redshift-data-securely-across-amazon-redshift-clusters-for-workload-isolation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RyBas7s6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xaxeqp18optazuuqc954.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RyBas7s6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xaxeqp18optazuuqc954.png" alt="data sharing" width="880" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Sharing, implementation.
&lt;/h3&gt;

&lt;p&gt;In order to create a data sharing between the integration and production AWS Redshift servers, you can follow the next steps.&lt;/p&gt;

&lt;p&gt;AWS Redshift RA3, production environment, statements to run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE DATASHARE meetup_sharing;&lt;/li&gt;
&lt;li&gt;GRANT USAGE ON DATASHARE meetup_sharing TO ACCOUNT 'INTEGRATION';&lt;/li&gt;
&lt;li&gt;ALTER DATASHARE meetup_sharing ADD SCHEMA schema;&lt;/li&gt;
&lt;li&gt;ALTER DATASHARE meetup_sharing SET INCLUDENEW = TRUE FOR SCHEMA schema;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Redshift RA3, integration environment, statements to run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE DATABASE meetup_pro FROM DATASHARE meetup_sharing OF ACCOUNT 'PRODUCTION' &lt;/li&gt;
&lt;li&gt;CREATE EXTERNAL SCHEMA IF NOT EXISTS pro_schema FROM REDSHIFT DATABASE 'meetup_pro' SCHEMA 'schema';&lt;/li&gt;
&lt;li&gt;GRANT USAGE ON SCHEMA pro_schema TO schema;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the above configuration, when using the &lt;strong&gt;pro_&lt;/strong&gt; prefix in the integration environment, we will be accessing data located in the production one. This access is read only, so we can not modify that data in any way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FoRyIkv1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv36ycjybfxv95fp83ge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FoRyIkv1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv36ycjybfxv95fp83ge.png" alt="data sharing implementation" width="880" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;p&gt;Through this article we have covered how to resolve the following problems in a Data Lake implemented in AWS S3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users (data engineers, data analysts and data scientists) need to work in pre-production environments with the same amount of data as in production.&lt;/li&gt;
&lt;li&gt;We want to have different and isolated environments: integration, production, etc.&lt;/li&gt;
&lt;li&gt;Users need to work with the data in the easiest possible way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for the next article about how to implement your own Data Platform with success.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I hope this article was useful. If you enjoy messing around with Big Data, Microservices, reverse engineering or any other computer stuff and want to share your experiences with me, just follow &lt;a href="https://twitter.com/gumartinm"&gt;me&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataplatform</category>
      <category>datalake</category>
      <category>lakehouse</category>
      <category>datamesh</category>
    </item>
    <item>
      <title>How to build your own data platform. Episode 1: sharing data between environments. Data Lake implementation.</title>
      <dc:creator>Gustavo Martin Morcuende</dc:creator>
      <pubDate>Tue, 29 Nov 2022 01:06:07 +0000</pubDate>
      <link>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-4l6c</link>
      <guid>https://dev.to/adevintaspain/how-to-build-your-own-data-platform-4l6c</guid>
      <description>&lt;h2&gt;
  
  
  Introduction.
&lt;/h2&gt;

&lt;p&gt;Data is the new oil. Companies want to make the most of the data they produce. For achieving this goal, there is a need for systems capable of consuming, processing, analysing, and presenting massive volumes of data. These systems need to be easy to use, but they also need to be reliable, able to detect problems and store data correctly. These and other issues are intended to be resolved by Data Platforms.&lt;/p&gt;

&lt;p&gt;It is not an easy task to build a Data Platform. Multiple skill sets are needed, from infrastructure and programming to data management.&lt;/p&gt;

&lt;p&gt;This article is the first, of what I hope will be a longer series of articles where we'll try to unravel the secrets of how to build a Data Platform that allows you to generate value-added products for your users. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is a data platform?
&lt;/h2&gt;

&lt;p&gt;We can discover definitions of what is a data platform just using our preferred web search engine. For example, I found the following definitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A data platform enables the acquisition, storage, preparation, delivery, and governance of your data, and adds a security layer for users and applications.&lt;br&gt;
&lt;a href="https://www.mongodb.com/what-is-a-data-platform" rel="noopener noreferrer"&gt;https://www.mongodb.com/what-is-a-data-platform&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A data platform is a complete solution for ingesting, processing, analyzing and presenting the data generated by the systems, processes and infrastructures of the modern digital organization.&lt;br&gt;
&lt;a href="https://www.splunk.com/en_us/data-insider/what-is-a-data-platform.html" rel="noopener noreferrer"&gt;https://www.splunk.com/en_us/data-insider/what-is-a-data-platform.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, a data platform is a place where we can store data from multiple sources. Also a data platform provides users with the required tools for searching, working and transforming that data, with the goal of creating some kinds of products. These products could be dashboards with useful insights, machine learning products, etc, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a data platform? Very simplified diagram.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bpq3juhhmddhzcma5wj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bpq3juhhmddhzcma5wj.png" alt="Data Platform simplified diagram" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this diagram we can find all the basic components that create a data platform (we are not trying to describe a &lt;a href="https://en.wikipedia.org/wiki/Data_mesh" rel="noopener noreferrer"&gt;Data Mesh&lt;/a&gt; or a &lt;a href="https://en.wikipedia.org/wiki/Data_management_platform" rel="noopener noreferrer"&gt;Data Management Platform&lt;/a&gt;, those things will be left out for other future articles) You can find the same components with other names but same functionality in other diagrams describing other data platforms. In this diagram we can find these components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Sources:&lt;/strong&gt; databases, REST APIs, event buses, analytics tools, etc, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumption:&lt;/strong&gt; tools for consuming the data sources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; the place where the consumed data will be located.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security layer:&lt;/strong&gt; component in charge of providing authentication, authorization and auditory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processing:&lt;/strong&gt; programs or tools that will enable us to work with the stored data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Catalog:&lt;/strong&gt;  because the amount of stored data will be huge, we need a tool that will make easy for users to find the data that they need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tableau, Qlik, Kubeflow, MLflow, etc, etc:&lt;/strong&gt; data will be used for some goal. Typically this goal could be to create a dashboard with meaningful diagrams, create models for machine learning and many other things.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This first article will be focusing on the storage layer, so from now on, we will talk only about that component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage layer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyv8h616qadlfl8xnzglu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyv8h616qadlfl8xnzglu.png" alt="storage layer" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, the storage layer is the place where the data is stored. Because the amount of data to be stored is huge, we can not use HDD or SSD data storages, we need something cheaper. In this case we will be talking about &lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;AWS S3&lt;/a&gt; because we are working with &lt;a href="https://en.wikipedia.org/wiki/Amazon_Web_Services" rel="noopener noreferrer"&gt;Amazon Web Services&lt;/a&gt;. For &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Azure" rel="noopener noreferrer"&gt;Azure&lt;/a&gt;, you could use &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-introduction" rel="noopener noreferrer"&gt;Azure Data Lake Storage Gen2&lt;/a&gt;. If you are working with &lt;a href="https://en.wikipedia.org/wiki/Google_Cloud_Platform" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;, you could use &lt;a href="https://cloud.google.com/storage" rel="noopener noreferrer"&gt;Google Cloud Storage&lt;/a&gt;. It does not matter what storage you use as long as it is cheap and can store a huge amount of data.&lt;/p&gt;

&lt;p&gt;You can see in this diagram three different elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Lakehouse:&lt;/strong&gt; it is the evolution of the traditional Data Lake. Data Lakehouse implements all the capabilities of a Data Lake plus ACID transactions. You can find more information about Lakehouses in this &lt;a href="https://www.databricks.com/glossary/data-lakehouse" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usually in a Data Lakehouse or a Data Lake you can find different zones for storing data. The number of zones that you can find depends on how you want to classify your data. How to create and classify the data in your Data Lake or Lakehouse is a complicated matter that will be treated in a future article. The Data Lake is the first place where the consumed data is stored. Sometimes it is just meaningless raw data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Warehouse:&lt;/strong&gt; many times you will need to implement &lt;a href="https://en.wikipedia.org/wiki/Star_schema" rel="noopener noreferrer"&gt;star schemas&lt;/a&gt; for creating &lt;a href="https://en.wikipedia.org/wiki/Data_mart" rel="noopener noreferrer"&gt;data marts&lt;/a&gt; in order to make easy for users the use of the stored data. Here, users can find meaningful data for creating dashboards, machine learning products or any other thing that users require.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metastore:&lt;/strong&gt; data is stored in the blob storage, if you want to use this data as if it was stored in a traditional database we need an element for translating schemas and table names to folders and files in the blob storage. This translation is made by the metastore.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article does not try to deeply explain how the above three elements work. Those explanations will be left out for other future articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current situation (environment isolation)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccaa5e1n1ak9gubjql5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccaa5e1n1ak9gubjql5c.png" alt="Current situation" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want users to create data products as fast as possible, you will need to create at least one environment where these users can mess around with the stored data. In this isolated environment they will be able to break and change as many things as they want. Our production environment must be isolated from this and other environments because we do not want to break productive processes. Different and isolated environments will exist. These environments contain the same processing and storage layers but these layers are isolated in their own environments. So notebooks in the sandbox environment can not break data stored in the storage layer from the production environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with data.
&lt;/h2&gt;

&lt;p&gt;Data engineers, data analysts, data scientists and data people in general who work with big data require huge amounts of data in order to implement, develop and test their applications. These applications could be ETLs, ELTs, notebooks, dashboards, etc, etc.&lt;/p&gt;

&lt;p&gt;In a healthy system, these users should be able to work in a safe environment where they can be sure &lt;strong&gt;that they do not break anything that already works in production when trying to implement new solutions.&lt;/strong&gt; We need to create isolated environments. These environments could be sandbox, integration, production environment, etc, etc.&lt;br&gt;
The problem with having different and isolated environments is that, in no productive environments, the amount of data will probably be much lower than the one that will be generated in production.&lt;/p&gt;

&lt;p&gt;So now, we face the following problem: &lt;strong&gt;we want users to be able to work with huge amounts of data in an easy and fast way, but we want them to do that in isolated environments from the productive one because we do not want them to break anything.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution 1.
&lt;/h2&gt;

&lt;p&gt;Remember that we have data sources, and those data sources must be connected to our different and isolated environments. We could ask those data sources to send us the same amount of data as they are sending in the productive environment.&lt;/p&gt;

&lt;p&gt;The problem with this solution is that, in many cases, those data sources have their own no preproductive environments and it is impossible for them to generate the same amount of data in the rest of the environments as in the production environment. Also, they will not be willing to connect our own no preproductive environments to their productive ones because we could break their environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqlt7t9fgb85zg0nh9e0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqlt7t9fgb85zg0nh9e0.png" alt="the solution 1" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This solution in many cases will not work.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution 2.
&lt;/h2&gt;

&lt;p&gt;Another solution could be as simple as implementing a job for copying data from the storage located in the productive environment to the no productive one. For example, a Jenkins job.&lt;/p&gt;

&lt;p&gt;The problem with this solution is that copying huge amounts of data is not fast and also, the job can break easily for multiple reasons (not having the right permissions, the right amount of memory for moving all the required data, etc, etc)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4jwqdefqo3wh0hi5yma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4jwqdefqo3wh0hi5yma.png" alt="the solution 2" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This solution does not ease the development of new applications because the copying process is slow, sometimes will not work, and data is not immediately available.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution 3.
&lt;/h2&gt;

&lt;p&gt;What our users need is to have access to data generated in the production environment from the tools running in the no productive environments. We need to provide a solution where applications like notebooks running in for example the integration environment can access the storage located in the productive one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuz5j2qhr6vpue2uduq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuz5j2qhr6vpue2uduq6.png" alt="the solution 3" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This solution will work in all cases. This is the solution that we are going to explain in this article focusing on the component related to the Data Lake. In a next article we will explain the same solution implemented in a Data Warehouse.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lake, AWS S3.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frry6ez0gwlkpx6vrdtkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frry6ez0gwlkpx6vrdtkg.png" alt="data lake aws s3" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Notebooks, Spark jobs, clusters, etc, etc, run in Amazon virtual servers called &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html" rel="noopener noreferrer"&gt;EC2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These virtual servers require permissions for accessing AWS S3. These permissions are given by &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html" rel="noopener noreferrer"&gt;IAM Roles&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will be working with Amazon Web Services. As we said before, because the amount of data to be stored is huge, we can not use HDD or SSD data storages, we need something cheaper. In this case we will be talking about &lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;AWS S3&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, in order to make easy the use of the Data Lake, we can implement &lt;a href="https://www.quora.com/What-is-hive-meta-store/answer/Shruti-Pawar-9" rel="noopener noreferrer"&gt;metastores&lt;/a&gt; on the top of it. For example, Hive Metastore or Glue Catalog. We are not going to explain deeply how a metastore works, that will be left for another future article.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When using a notebook (for example a Databricks notebook) and having a metastore, the first thing that the notebook will do is to ask the metastore where the data is physically located. Once the metastore responds, the notebook will go to the path in AWS S3 where the data is stored using the permissions given by the IAM Role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lake, integration and production environments.
&lt;/h2&gt;

&lt;p&gt;In the integration environment we have two options for working with the data. With or without using a metastore.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceeo319vjd2zbv25ue14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceeo319vjd2zbv25ue14.png" alt="data lake integration metastore" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the production environment we have the exact same system but isolated from the integration environment. In production we find the exact same two options.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh3a9ju0ppi0et4gqh64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh3a9ju0ppi0et4gqh64.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the metastore allows us to use the data located in the Data Lake as it was a normal database. Also, we can see that the metastore does not store data but the metadata that allows us to find the real stored data in AWS S3. With the metastore, users can have access to the data in the Data Lake in an easier way because they can use SQL statements as they do in any other database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lake, sharing data.
&lt;/h2&gt;

&lt;p&gt;When users run their notebooks or any other application from the integration environment they need to have access to the production data located in the storage zone of the production environment.&lt;/p&gt;

&lt;p&gt;Remember that those notebooks and applications run in Amazon virtual servers called Amazon EC2 instances, and for accessing the data located in AWS S3 they use IAM Roles (the permissions for accessing the data) We can modify the IAM Role in the (for example) integration environment in order to allow EC2 instances to access data located in the productive storage zone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmttrjn9x4lwasx833oxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmttrjn9x4lwasx833oxn.png" alt="data lake sharing data" width="800" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  IAM Role configuration.
&lt;/h3&gt;

&lt;p&gt;For example, for being able to access to S3 integration and production folders we can configure the IAM Role in the following way:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwdqel5iyw3ejvha2t30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwdqel5iyw3ejvha2t30.png" alt="IAM Role" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any application running on a machine with this IAM Role can read data from production and integration and can only modify the data located in the integration environment. So the productive data is not modified in any way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Applying the solution.
&lt;/h3&gt;

&lt;p&gt;Once we have applied the above configuration in the IAM Role, users have direct access to the data located in the productive environment, for example from the integration environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmckirq5sqi0xecxxqcvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmckirq5sqi0xecxxqcvj.png" alt="applying solution" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we do it better?
&lt;/h3&gt;

&lt;p&gt;With this configuration users, from for example their notebooks, can access the productive data and work with it without being able to modify it. But, we know, by means of a metastore, users can access the data even in an easier way. So the question is: can we use metastores with this solution?&lt;/p&gt;

&lt;p&gt;We will see how to do it in the next section of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Lake, sharing data. Waggle Dance.
&lt;/h2&gt;

&lt;p&gt;Waggle Dance is a request routing Hive metastore proxy that allows tables to be concurrently accessed across multiple Hive deployments.&lt;/p&gt;

&lt;p&gt;In short, Waggle Dance provides a unified endpoint with which you can describe, query, and join tables that may exist in multiple distinct Hive deployments. Such deployments may exist in disparate regions, accounts, or clouds (security and network permitting).&lt;/p&gt;

&lt;p&gt;For further information follow this link: &lt;a href="https://github.com/ExpediaGroup/waggle-dance" rel="noopener noreferrer"&gt;https://github.com/ExpediaGroup/waggle-dance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fmbntehg6p0ok77n5dg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fmbntehg6p0ok77n5dg.png" alt="data lake waggle dance" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, when asking for some table from the integration environment, and based on some configuration, the Waggle Dance living in the integration environment decides if the metastore to be asked resides either in the production or integration environment.&lt;/p&gt;

&lt;p&gt;For example, this configuration could be based on some prefix. In the below example, the &lt;strong&gt;pro_&lt;/strong&gt;prefix. When using this prefix the data to be retrieved will be located in the production environment instead of the integration one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc41r9jt6hx0pluvfi781.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc41r9jt6hx0pluvfi781.png" alt="using data lake waggle dance" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion.
&lt;/h2&gt;

&lt;p&gt;Through this article we have covered how to resolve the following problems in a Data Lake implemented in AWS S3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Users (data engineers, data analysts and data scientists) need to work in pre-production environments with the same amount of data as in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We want to have different and isolated environments: integration, production, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users need to work with the data in the easiest possible way.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for the next article about how to share data with AWS Redshift and many others that will follow about how to implement your own Data Platform with success.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I hope this article was useful. If you enjoy messing around with Big Data, Microservices, reverse engineering or any other computer stuff and want to share your experiences with me, just follow &lt;a href="https://twitter.com/gumartinm" rel="noopener noreferrer"&gt;me&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>softwaredevelopment</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Rózsa Politzer/Péter La madre fundadora de la Teoría de la Recursividad</title>
      <dc:creator>Wanda Delisio</dc:creator>
      <pubDate>Thu, 19 May 2022 12:03:43 +0000</pubDate>
      <link>https://dev.to/adevintaspain/rozsa-politzerpeterla-madre-fundadora-de-la-teoria-de-la-recursividad-20e7</link>
      <guid>https://dev.to/adevintaspain/rozsa-politzerpeterla-madre-fundadora-de-la-teoria-de-la-recursividad-20e7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TOvbJNOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sci9796v9giizzi4o7ox.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TOvbJNOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sci9796v9giizzi4o7ox.jpg" alt="Image description" width="759" height="1038"&gt;&lt;/a&gt;Cuando postergas algo y tu terapeuta te recomienda que empieces por hacer una pequeña tarea y eso te lleva a dar un paso más y otro y otro… Y de pronto aquello tan grande que querías evitar lo has resuelto a base de dividirlo en pequeñas porciones. &lt;/p&gt;

&lt;p&gt;Eso es a lo que &lt;strong&gt;Rózsa Péter&lt;/strong&gt; dedicó toda su vida: &lt;strong&gt;La recursividad&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Las funciones recursivas están detrás del motor de búsqueda de Google y también de Google Maps, del Trading, de los modelos de Machine Learning, de juegos como el Apalabrados o el mítico Buscaminas, de métodos de ordenación como MergeSort, etc.&lt;/p&gt;

&lt;p&gt;Rózsa Politzer (luego Péter). Nacida en Budapest (Hungría), 1905. Matemática. Madre fundadora de la Teoría de la Recursividad. Práctica, puesto que es quien aplica por primera vez la recursividad a la computación. Gran comunicadora, porque nos lo explica en su libro “&lt;u&gt;Recursive Functions&lt;/u&gt;* in Computer Theory”.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*Las funciones recursivas son funciones que se llaman a sí mismas durante su propia ejecución.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nace en el seno de una familia **judía **de clase media-alta. &lt;/p&gt;

&lt;p&gt;Empieza a estudiar Química porque su hermano mayor está estudiando Medicina y su padre decide que así, Rozsa, podrá ser útil para su hermano… Pero su destino era otro. &lt;/p&gt;

&lt;p&gt;Al asistir a una conferencia sobre &lt;u&gt;las series de Fourier&lt;/u&gt;* descubre su vocación y es inspirada para crear lo que luego serán los algoritmos recursivos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*Herramienta matemática básica del análisis de Fourier empleado para analizar funciones periódicas a través de la descomposición de dicha función en una **suma infinita de funciones sinusoidales mucho más simples**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Durante este cambio de vocación sufrió el ahora conocido &lt;strong&gt;Síndrome del impostor&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cuando comencé mi educación universitaria, todavía tenía muchas &lt;strong&gt;dudas sobre si era lo suficientemente buena para las matemáticas&lt;/strong&gt;. Entonces un compañero me dijo las palabras decisivas: no es que yo sea digno de ocuparme de las matemáticas, sino que las matemáticas son dignas de ocuparse”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con 22 años se gradúa en Matemáticas. Empezó su investigación de posgrado sobre la teoría de los números pero al enterarse de que ya estaba probada con anterioridad, &lt;strong&gt;se retiró y se dedicó a la poesía durante un tiempo&lt;/strong&gt;. La literatura alemana de Goethe y su amiga dramaturga, Béla Lay, tuvieron una gran influencia en ella. &lt;/p&gt;

&lt;p&gt;Además, debido a la Gran Depresion, Hungría se alía con la Italia fascista y la Alemania nazi para incrementar su comercio. Eso provoca un giro a la derecha en las instituciones y Rózsa, al igual que otras personas, recibe presiones para cambiar su apellido judío por uno “más húngaro”. De ahí el cambio de Politzer a Péter. &lt;/p&gt;

&lt;p&gt;Con 27 años presenta en el ICM (International Congress of Mathematicians) la “Teoría de las Funciones Recursivas”.&lt;/p&gt;

&lt;p&gt;Con 30 años obtiene su doctorado cum laude y con 31 presenta una ponencia en el ICM titulada "Sobre las funciones recursivas de segundo paso".&lt;/p&gt;

&lt;p&gt;Justo en ese momento que su carrera estaba despegando el gobierno húngaro pronazi prohibía ejercer la enseñanza a todas las personas judías. Así que sólo puede dar clases particulares.&lt;/p&gt;

&lt;p&gt;Es entonces cuando se interesa por hacer llegar las Matemáticas al común de la sociedad y empieza a escribir "Jugando con el Infinito. Exploraciones y excursiones matemáticas". (Quizás ahora lo llamaríamos “El infinito explicado para dummies”)&lt;/p&gt;

&lt;p&gt;Lo publica con 38 años y es una de las mejores introducciones a este tema y a todo el campo de las matemáticas. Al dividir su libro en 3 partes: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El aprendiz de brujo&lt;/li&gt;
&lt;li&gt;El papel creativo de la forma&lt;/li&gt;
&lt;li&gt;La autocrítica de la razón pura &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Péter desarrolla su material en 22 capítulos que suenan casi demasiado atractivos para ser verdad: jugar con los dedos, colorear la serie de números grises, volvemos a atrapar el infinito, etc.&lt;/p&gt;

&lt;p&gt;Con 40 años consigue por primera vez trabajo de &lt;strong&gt;profesora&lt;/strong&gt;, ya que hasta entonces debido a la influencia nazi no le había sido posible. &lt;/p&gt;

&lt;p&gt;Con 46 publicó “Recursive Functions”, el primer libro específico sobre las funciones recursivas.&lt;/p&gt;

&lt;p&gt;Y cuando cumple los 50 vuelve a la universidad donde estudió, pero esta vez como profesora. Donde se gana el cariño del alumnado que la llama la “&lt;strong&gt;tía Rózsa&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;Con 68 años fue la primera mujer miembro de la Academia Húngara de Ciencias.&lt;/p&gt;

&lt;p&gt;Durante los años 60 se empiezan a utilizar las funciones recursivas, en las que ella trabajó, en los lenguajes de programación.&lt;/p&gt;

&lt;p&gt;Ella recoge todos los resultados conseguidos en su libro “Recursive functions in computer theory” que se publica 6 meses después de su muerte por cáncer en 1977.&lt;/p&gt;

&lt;p&gt;P.D.: Si vas a usar la recursividad en tu código, en nombre de la tía Rózsa, recuerda siempre agregar una condición de salida. De lo contrario entrarás en un bucle infinito. De lo contrario entrarás en un bucle infinito. De lo contrario entrarás en un bucle infinito. De lo contrario entrarás en un bucle infinito. De lo contrario entrarás en un bucle infinito. De lo contrario entrarás en un bucle infinito. [...]&lt;/p&gt;

</description>
    </item>
    <item>
      <title>First steps to functional programming with Kotlin</title>
      <dc:creator>ArnauG</dc:creator>
      <pubDate>Tue, 22 Feb 2022 15:33:06 +0000</pubDate>
      <link>https://dev.to/adevintaspain/first-steps-to-functional-programming-with-kotlin-4o2b</link>
      <guid>https://dev.to/adevintaspain/first-steps-to-functional-programming-with-kotlin-4o2b</guid>
      <description>&lt;p&gt;All the code in this post is in:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ArnauG" rel="noopener noreferrer"&gt;
        ArnauG
      &lt;/a&gt; / &lt;a href="https://github.com/ArnauG/MasterMindSolver" rel="noopener noreferrer"&gt;
        MasterMindSolver
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Exercise to resolve Mastermind code solver
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;
 

&lt;p&gt;In functional programming all the elements can be understood as functions and the source code can be executed by sequential calls of functions. On the other hand we do not assign values independently. A function can be imagined as a variable of the program. It can be reused and always return a result (it has no side effects).&lt;/p&gt;

&lt;p&gt;These are the main characteristics of functional programming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses Immutable data.&lt;/li&gt;
&lt;li&gt;Focus is on: “What you are doing”&lt;/li&gt;
&lt;li&gt;Supports Parallel Programming&lt;/li&gt;
&lt;li&gt;Its functions have no-side effects&lt;/li&gt;
&lt;li&gt;Flow Control is done using function calls &amp;amp; function calls with recursion&lt;/li&gt;
&lt;li&gt;The program have not state&lt;/li&gt;
&lt;li&gt;Supports both "Abstraction over Data" and "Abstraction over Behaviour".&lt;/li&gt;
&lt;li&gt;It’s easy to combine with imperative programming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now stop writing and let’s get down to work. To exemplify how to transform a procedural code to functional code I am going to codify a MasterMind solver. Mastermind is a code-breaking game for two players. A code is made up 4 coloured pins and their position. I will use 6 colours (that we will represent with letters from A to F) to choose from and the same colour can be repeated multiple times:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACDF
AABC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The game play is as follows:&lt;/p&gt;

&lt;p&gt;The second player (the one that is guessing) sets out a series of pins in order to guess the code. The first player (that defined the secret code) then provides some feedback to the player in light of how close they are to the correct combination.&lt;/p&gt;

&lt;p&gt;The feedback is as follows:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number of pins that are both the right colour and position
Number of pins that are correct in colour but in the wrong position
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Secret:  AABC, Guess: ABED, Result: rightPosition: 1, wrongPosition: 1
Secret:  AABC, Guess: ABAD, Result: rightPosition: 1, wrongPosition: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Now I am going to show a possible solution using procedural programming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;TOTAL_MASTER_MIND_POSITIONS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;evaluateGuess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;guessList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toCharArray&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toMutableList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;secretList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toCharArray&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toMutableList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt; &lt;span class="nc"&gt;TOTAL_MASTER_MIND_POSITIONS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;guessList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;secretList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;rightPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TOTAL_MASTER_MIND_POSITIONS&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;secretList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="n"&gt;removed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt; &lt;span class="n"&gt;secretList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;currentChar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guessList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secretList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentChar&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;secretList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;guessList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
      &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the first part of the code “right position calculation” we check position coincidences and remove the corresponding characters from each array. Then looking at the size of the resultant array we can calculate the number of coincidences. In the second part we do a similar approach passing each time through the remaining secret array.&lt;/p&gt;

&lt;p&gt;Now we can start with a functional approach, kotlifying (use kotlin colections api to solve the problem) a little the code. In the code below we can see a possible solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// secret: ABCD, guess: AFED&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;evaluateGuess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//[(A,A),(B,F),(C,E),(D,D)]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;//[(B,F),(C,E)]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unzip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;//[BC,FE]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;rightPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TOTAL_MASTER_MIND_POSITIONS&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
      &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
  &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;firstOrNull&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;evaluation&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;secretMutable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toMutableList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="c1"&gt;//Kotlin list interface not allow mutability&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;wrongPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;secretMutable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;// Flow control using recurrency&lt;/span&gt;
      &lt;span class="n"&gt;wrongPosition&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt;
        &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secretMutable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;wrongPosition&lt;/span&gt;
      &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To resolve the first part of the problem we use the kotlin api extension for collections. Those are very useful and give the developers a powerful tool to manipulate them. Let’s see what’s going on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// secret: ABCD, guess: AFED&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;evaluateGuess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//[(A,A),(B,F),(C,E),(D,D)]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;//[(B,F),(C,E)]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unzip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;//[BC,FE]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;rightPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TOTAL_MASTER_MIND_POSITIONS&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
      &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the second part I choose a different approach to walk through some of the main characteristics of the functional programming paradigm as mutability and Flow control using recurrency. We can see in the example below that the level of abstraction is very similar to the procedural example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
  &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;firstOrNull&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;evaluation&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;secretMutable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toMutableList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="c1"&gt;//Kotlin list interface not allow mutability&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;wrongPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;secretMutable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;// Flow control using recurrency&lt;/span&gt;
      &lt;span class="n"&gt;wrongPosition&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt;
        &lt;span class="nf"&gt;generateEvaluationWithNumberOfAppearances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secretMutable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;wrongPosition&lt;/span&gt;
      &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrongPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To finish I want to show another example that combines imperative and functional programming given us a more elegant code :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Code extracted from coursera course Java to Kotlin&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;evaluateGuess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;rightPositions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;commonLetters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ABCDEF"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sumBy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;

      &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rightPositions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;commonLetters&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;rightPositions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see using Kotlin API we have a huge versatility that can help us to introduce functional programming with a very little effort. And learning to use this powerful programming language gave us awesome results.&lt;/p&gt;

&lt;p&gt;Bibliography:&lt;/p&gt;

&lt;p&gt;1.- &lt;a href="https://www.coursera.org/learn/kotlin-for-java-developers" rel="noopener noreferrer"&gt;https://www.coursera.org/learn/kotlin-for-java-developers&lt;/a&gt;&lt;br&gt;
2.- &lt;a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional" rel="noopener noreferrer"&gt;https://es.wikipedia.org/wiki/Programación_funcional&lt;/a&gt;&lt;br&gt;
3.- &lt;a href="https://en.wikipedia.org/wiki/Mastermind_(board_game)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Mastermind_(board_game)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://careers.adevinta.es/ofertas/?search=backend&amp;amp;stc=aff-blog%20dev.to-First%20steps%20to%20functional%20programming%20with%20Kotlin"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxylaitnsg2ui0an8g50l.png" alt="Ofertas Backend"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo hemos desarrollado nuestro modelo de Product Discovery en Adevinta Spain</title>
      <dc:creator>Víctor Solà</dc:creator>
      <pubDate>Wed, 16 Feb 2022 09:20:50 +0000</pubDate>
      <link>https://dev.to/adevintaspain/como-hemos-desarrollado-nuestro-modelo-de-product-discovery-en-adevinta-spain-15p3</link>
      <guid>https://dev.to/adevintaspain/como-hemos-desarrollado-nuestro-modelo-de-product-discovery-en-adevinta-spain-15p3</guid>
      <description>&lt;p&gt;En Adevinta Spain llevamos dos años invirtiendo en mejorar todos los  procesos relacionados con una de las fases más clave del desarrollo de un producto digital: la fase de descubrimiento, en inglés &lt;em&gt;Product Discovery&lt;/em&gt;. En este artículo explicaré el porqué de esta inversión estratégica, los detalles de lo que estamos haciendo y lo que hemos aprendido durante este proceso. &lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Cómo trabajamos en Adevinta Spain?
&lt;/h2&gt;

&lt;p&gt;Desde hace ya algunos años tenemos una cultura y metodología propia de trabajo: PEAK (&lt;em&gt;Prioritization, Empowerment, Alignment, Knowledge&lt;/em&gt;). Es un marco que nos ayuda en el día a día a tomar decisiones, organizarnos mejor y tener más visibilidad y autonomía. Si te interesa entender mejor qué es PEAK, te recomiendo que veas &lt;a href="https://www.youtube.com/watch?v=n4z-WL4sOP0&amp;amp;ab_channel=AgileSpain" rel="noopener noreferrer"&gt;esta charla&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Como muchas otras empresas de desarrollo de software, dentro del marco de PEAK, desarrollamos nuestros productos digitales de la siguiente forma:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trabajamos en equipos de producto multidisciplinares&lt;/strong&gt; (perfiles de producto, diseño, análisis de datos y desarrollo). &lt;/li&gt;
&lt;li&gt;Nos organizamos en &lt;strong&gt;equipos con una misión clara&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definimos objetivos y hacemos seguimiento de métricas de forma trimestral&lt;/strong&gt; para alcanzar esos objetivos (OKRs). &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nos enfocamos en intentar mejorar de forma continua nuestros productos y la forma en la que trabajamos. Por ello, en el área de producto hemos invertido principalmente en 2 grandes iniciativas ligadas a la mejora constante: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scrum Revamp:&lt;/strong&gt; iniciativa para mejorar y estandarizar cómo utilizamos el &lt;em&gt;framework&lt;/em&gt; de Scrum dentro de los equipos de producto. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Discovery:&lt;/strong&gt; iniciativa enfocada a ayudar a los equipos de producto a entender mejor qué es lo siguiente que deben desarrollar para poder lograr sus objetivos e impactar sus métricas asociadas. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este artículo nos centramos en explicar esta segunda iniciativa. &lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué creímos necesario invertir en Product Discovery?
&lt;/h2&gt;

&lt;p&gt;Poner a &lt;strong&gt;usuarios y clientes en el centro del desarrollo del producto&lt;/strong&gt; forma parte de nuestros valores en Adevinta. Como organización estamos convencidos de que la forma de tener éxito a largo plazo es tener el mejor producto y, para lograrlo, creemos firmemente que el camino correcto es poner el foco en las necesidades implícitas y explícitas de nuestros usuarios y clientes. &lt;/p&gt;

&lt;p&gt;Intentamos ser lo más eficientes posible. Queremos invertir nuestros recursos en desarrollar aquellas cosas que nuestros usuarios y clientes necesitan y no desperdiciar recursos por el camino. Pero no somos perfectos. &lt;/p&gt;

&lt;p&gt;Hace unos años, cuando analizamos cómo veníamos desarrollando nuestros productos, nos dimos cuenta de que &lt;strong&gt;teníamos algunos problemas&lt;/strong&gt; que nos alejaban de esta visión: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Diferencia en los procesos:&lt;/strong&gt; no todos los equipos trabajábamos de la misma manera la fase de descubrimiento. Utilizábamos metodologías y herramientas distintas y dedicábamos un volumen de recursos bastante desigual en función del equipo. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poca alineación con las necesidades de nuestros usuarios:&lt;/strong&gt; a menudo nos encontrábamos desarrollando funcionalidades que no estaban alineadas de forma clara con una necesidad de usuario o cliente. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poca exploración de posibles soluciones:&lt;/strong&gt; debido a algunos sesgos cognitivos (que todos padecemos), algunos equipos se enamoraban de la primera solución que les venía a la mente para solucionar un problema u oportunidad. No explorábamos más opciones. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foco en la funcionalidad en vez de en la necesidad:&lt;/strong&gt; muchas veces nos focalizábamos en entregar funcionalidades en vez de entregar valor a usuarios y clientes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con el fin de solucionarlos, decidimos empezar a trabajar en una iniciativa que nos ayuda a &lt;strong&gt;conseguir los siguientes objetivos&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Establecer un marco de trabajo estandarizado&lt;/strong&gt; entre los distintos equipos de la organización para la fase de descubrimiento. &lt;/li&gt;
&lt;li&gt;Conseguir que una mayor parte de los desarrollos estén focalizados en &lt;strong&gt;solventar necesidades de nuestros usuarios y clientes&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explorar múltiples posibles soluciones&lt;/strong&gt; para un problema u oportunidad, y no quedarnos con la primera idea que nos viene a la mente. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebajar el nivel de incertidumbre&lt;/strong&gt; de nuestros desarrollos. Estar más seguros de que lo que estamos desarrollando va a impactar a nuestros objetivos y métricas asociadas. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reducir el desperdicio de recursos de desarrollo&lt;/strong&gt;. Validar posibles soluciones antes de desarrollarlas por completo y descartar ideas de forma más rápida y económica. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitar la innovación&lt;/strong&gt; y la diferenciación. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Cómo empezó la iniciativa? El piloto de Dual Track
&lt;/h2&gt;

&lt;p&gt;Para empezar, establecimos un grupo de trabajo heterogéneo, con perfiles de diversas áreas de la empresa (Producto, UX, Agile Coaches), para definir el marco de cómo queríamos que los equipos trabajaran en la fase de descubrimiento. Invertimos tiempo en aprender de lo que se estaba haciendo en la industria, lo que estábamos haciendo internamente y, sobre todo, en definir nuestro modelo futuro sobre la fase de &lt;em&gt;Product Discovery&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;A esta iniciativa piloto la llamamos &lt;em&gt;Dual Track&lt;/em&gt;, con la intención de ayudar a los equipos a entender que hay 2 tipos de trabajo que suceden de forma simultánea: todo aquello que hacemos para entender qué debemos desarrollar (&lt;em&gt;Product Discovery&lt;/em&gt;) y todo aquello que hacemos para desarrollar (&lt;em&gt;Product Delivery&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglw7l1kwrma5mrvpmnnr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglw7l1kwrma5mrvpmnnr.png" alt="Discovery track: Entender problemas y oportunidades para definir hipótesis y reducir la incertidumbre en la entrega de valor a nuestros usuarios y clientes. Delivery track: Definir, implementar y validar el impacto de soluciones que entregan valor a nuestros usuarios y clientes."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cuando tuvimos desarrollado el modelo de cómo queríamos trabajar la fase de descubrimiento, empezamos con formaciones a 3 equipos de producto. Las formaciones consistían en explicar el modelo, los beneficios y algunas técnicas en detalle a través de sesiones teóricas y prácticas. Estas sesiones las organizaban y dirigían nuestros perfiles de Research Ops. &lt;/p&gt;

&lt;p&gt;Realizar el piloto nos permitió detectar muchas mejoras, tanto en el contenido de las formaciones como en la interacción entre los perfiles de Research Ops y los equipos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Extendiendo la iniciativa a todo el grupo Adevinta
&lt;/h2&gt;

&lt;p&gt;Esta misma necesidad de mejorar el conocimiento sobre &lt;em&gt;Product Discovery&lt;/em&gt; que teníamos en Adevinta Spain, se detectó a nivel de todo el grupo Adevinta en el momento en que nosotros estábamos finalizando nuestro piloto. En base a esta necesidad, empezamos el desarrollo de una formación más global. Tomando de base los contenidos del piloto de &lt;em&gt;Dual Track&lt;/em&gt; y complementándolos con la visión, el conocimiento y las experiencias de otros compañeros del grupo Adevinta. &lt;/p&gt;

&lt;p&gt;Todo este trabajo acabó cristalizando en un curso sobre &lt;em&gt;Product Discovery&lt;/em&gt; que os voy a detallar a continuación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nuestro curso sobre Product Discovery
&lt;/h2&gt;

&lt;p&gt;La formación se compone de un curso online que se consume de forma autónoma y de sesiones presenciales donde se pone en práctica el contenido teórico. Las sesiones prácticas permiten a los equipos practicar las distintas técnicas aprendidas durante el curso, siempre trabajando sobre retos reales con los que el equipo de producto está lidiando en ese momento. Todas las sesiones prácticas son conducidas por un &lt;em&gt;discovery coach&lt;/em&gt; que facilita y prepara la sesión.&lt;/p&gt;

&lt;p&gt;También hacemos seguimiento del progreso del equipo a través de una plantilla que mide la madurez en distintas áreas de la fase de &lt;em&gt;Discovery&lt;/em&gt;. El equipo rellena la plantilla justo antes de empezar la formación y otra vez a los 6 meses de haberla finalizado. Este sistema nos permite comparar la evolución y medir el impacto que ha tenido el curso en los distintos equipos.  &lt;/p&gt;

&lt;p&gt;El contenido del curso es el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Módulo 1: Product Discovery basics&lt;/strong&gt;&lt;br&gt;
En este módulo hacemos una introducción a los conceptos más básicos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qué entendemos por &lt;em&gt;Product Discovery&lt;/em&gt; y cuáles son sus distintas fases.&lt;/li&gt;
&lt;li&gt;Qué entendemos por &lt;em&gt;Product Delivery&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Qué es el concepto de &lt;em&gt;Dual Track&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Cómo participan los distintos perfiles de un equipo multidisciplinar en la fase de &lt;em&gt;Discovery&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Cómo incluimos la fase de &lt;em&gt;Discovery&lt;/em&gt; en nuestras rutinas de Scrum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Módulo 2: Alineamiento y captura de oportunidades&lt;/strong&gt;&lt;br&gt;
En este segundo módulo explicamos la importancia de estar alineados a nivel de equipo de producto para poder realizar &lt;em&gt;Product Discovery&lt;/em&gt; de forma correcta y cómo podemos capturar y priorizar oportunidades para la consecución de nuestros objetivos. Algunas de las cosas que contamos en esta sección son: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cómo funciona el &lt;em&gt;framework&lt;/em&gt; de OKRs y cómo nos permite como equipo saber en qué nos debemos enfocar, cuáles son nuestros objetivos en un período de tiempo determinado y cómo vamos a medir el impacto en esos objetivos. &lt;/li&gt;
&lt;li&gt;Qué es una oportunidad para un equipo de producto y cómo la diferenciamos de una solución. Cómo escribir una oportunidad de forma correcta.&lt;/li&gt;
&lt;li&gt;Cómo podemos capturar oportunidades para nuestro equipo de producto. Tipos de fuentes de información sobre oportunidades para equipos de producto. Diferencias entre investigación cualitativa vs. cuantitativa y entre investigación actitudinal vs. investigación sobre comportamiento. &lt;/li&gt;
&lt;li&gt;Cómo mapear las oportunidades de un objetivo específico a través de la técnica del &lt;em&gt;Opportunity Solutions Tree&lt;/em&gt;. Esta técnica, creada y popularizada por Teresa Torres, es una de las técnicas clave del curso. Puedes aprender más sobre ella en este &lt;a href="https://www.producttalk.org/opportunity-solution-tree/" rel="noopener noreferrer"&gt;enlace&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Cómo priorizar las oportunidades a atacar primero. Qué factores se deben tener en cuenta cuando estamos priorizando oportunidades y cómo combinarlos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hay 2 sesiones prácticas en el módulo 2; la primera consiste en construir un &lt;em&gt;opportunity solutions tree&lt;/em&gt; con un objetivo y &lt;em&gt;key result&lt;/em&gt; del equipo. La segunda consiste en hacer un ejercicio de priorización de oportunidades para ver qué oportunidad atacamos primero.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Módulo 3: Explorando oportunidades&lt;/strong&gt;&lt;br&gt;
En el tercer módulo hablamos en detalle de cómo explorar una oportunidad y cómo adquirir conocimiento para poder plantear soluciones más efectivas a posteriori. Algunos de los contenidos en el módulo 3 son: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La técnica del &lt;em&gt;Opportunity Canvas&lt;/em&gt;. Esta técnica, originalmente descrita por Jeff Patton en &lt;a href="https://www.jpattonassociates.com/opportunity-canvas/" rel="noopener noreferrer"&gt;este artículo&lt;/a&gt;, nos ayuda como equipo de producto a mapear todo lo que sabemos sobre una oportunidad y, más importante, todo aquello que no sabemos y sobre lo que queremos investigar antes de lanzarnos a pensar en una solución. En Adevinta hemos construido nuestro propio &lt;em&gt;Opportunity Canvas&lt;/em&gt; en función de nuestras necesidades. &lt;/li&gt;
&lt;li&gt;Cómo seleccionar qué técnica de investigación es más adecuada en función de las preguntas o dudas que tenemos sobre una oportunidad. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La sesión práctica del módulo 3 consiste en construir un &lt;em&gt;opportunity canvas&lt;/em&gt; para la oportunidad priorizada al final del módulo 2. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Módulo 4: Ideación y generación de hipótesis&lt;/strong&gt;&lt;br&gt;
Una vez tenemos la información suficiente sobre una oportunidad empezamos con la fase de ideación de posibles soluciones. En el módulo 4 hablamos de: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qué es ideación y qué no cuando la realizamos en el contexto de &lt;em&gt;Product Discovery&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;Cómo articular un taller de ideación en un equipo de producto. &lt;/li&gt;
&lt;li&gt;Distintas técnicas de ideación divergentes para crear múltiples posibles soluciones, como por ejemplo el “&lt;em&gt;How might we …&lt;/em&gt;”, “&lt;em&gt;The worst possible idea&lt;/em&gt;” o “&lt;em&gt;Heaven and hell&lt;/em&gt;”. &lt;/li&gt;
&lt;li&gt;Procesos para seleccionar opciones y priorizar soluciones a validar en la siguiente fase, como puede ser el “&lt;em&gt;Combine and refine&lt;/em&gt;” o la técnica ICE de priorización. &lt;/li&gt;
&lt;li&gt;Cómo definir hipótesis como fundamento para la experimentación. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La sesión práctica del módulo 4 consiste en realizar un taller de ideación, practicando distintas técnicas para generar soluciones sobre nuestra oportunidad priorizada anteriormente. El taller de ideación es una de las sesiones que recomendamos hacer de forma presencial. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Módulo 5: Validación&lt;/strong&gt;&lt;br&gt;
El módulo 5 es el último módulo de nuestro curso sobre &lt;em&gt;Product Discovery&lt;/em&gt; y en él hablamos sobre cómo validar suposiciones sobre nuestras soluciones antes de desarrollarlas por completo en la fase de &lt;em&gt;Product Delivery&lt;/em&gt;. En este módulo hablamos de: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qué es una suposición y qué tipos de suposiciones existen. &lt;/li&gt;
&lt;li&gt;Cómo balancear entre riesgo y &lt;em&gt;time to market&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;Cómo detectar y mapear suposiciones sobre nuestras soluciones y cómo priorizar cuáles hay que validar. &lt;/li&gt;
&lt;li&gt;Técnicas de validación en la fase de Discovery, como por ejemplo el &lt;em&gt;smoke test&lt;/em&gt;, el &lt;em&gt;concept test&lt;/em&gt;, el &lt;em&gt;concierge test&lt;/em&gt; o el &lt;em&gt;extreme programming spike&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;Cómo utilizar la técnica del Validation Canvas para organizar tu fase de validación. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La sesión práctica del módulo 5 consiste en completar el validation canvas para coordinar qué experimentos vamos a realizar como equipo para validar suposiciones sobre nuestra posible solución antes de pasar a la fase de &lt;em&gt;delivery&lt;/em&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hemos conseguido, aprendizajes y próximos pasos
&lt;/h2&gt;

&lt;p&gt;A día de hoy han pasado por el curso más de &lt;strong&gt;53 equipos&lt;/strong&gt; de producto y, en total, hemos formado a más de &lt;strong&gt;700 personas&lt;/strong&gt; en todo el grupo Adevinta. Hemos progresado mucho pero todavía nos falta formar a varios equipos y seguir mejorando nuestros procesos. Además, &lt;strong&gt;hemos iterado de forma continuada la formación&lt;/strong&gt;, introduciendo mejoras y nuevas técnicas sobre todo gracias al feedback que nos han proporcionado los asistentes en las diversas olas en las que hemos ido desplegando el curso. &lt;/p&gt;

&lt;p&gt;El curso sobre &lt;em&gt;Product Discovery&lt;/em&gt; no es un fin en sí mismo. Lo que pretendíamos con esta iniciativa era realmente impactar en cómo los equipos trabajan en su día a día haciendo desarrollo de producto. &lt;strong&gt;Hemos conseguido establecer unos mínimos comunes en cómo y cuándo los equipos deben hacer &lt;em&gt;Discovery&lt;/em&gt; y hemos introducido ciertas técnicas que ahora los equipos utilizan de forma habitual&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Durante este proceso hemos aprendido mucho. Algunos &lt;strong&gt;aprendizajes clave y consejos&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definir un marco metodológico&lt;/strong&gt; para equipos muy diversos, con experiencias previas diferentes y madurez desigual no es tarea fácil. Se necesita tiempo, voluntad y, sobre todo, &lt;strong&gt;soporte a nivel ejecutivo&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una formación&lt;/strong&gt; es un producto que &lt;strong&gt;necesita iteración&lt;/strong&gt;. En nuestro caso ha sido clave lanzar un piloto y aprender sobre el mismo antes de lanzar la formación a toda la organización. También la recogida de feedback continuo y la iteración del contenido nos ha permitido elevar el nivel del curso de forma constante. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incluir a perfiles variados en la definición del modelo&lt;/strong&gt; y en la creación de los contenidos de la formación ha enriquecido el contenido. Nos ha costado más tiempo pero al final ha sido más fácil que los equipos incorporen los aprendizajes. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Las sesiones prácticas son clave.&lt;/strong&gt; El aprendizaje se produce a través de la práctica en situaciones reales de desarrollo de producto. Combinar teoría como base y práctica nos ha permitido que los equipos integren las técnicas de forma más rápida. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El acompañamiento es esencial&lt;/strong&gt;. En nuestro caso el guiar las sesiones prácticas y hacer seguimiento y acompañamiento al equipo a través del perfil del &lt;em&gt;discovery coach&lt;/em&gt; nos ha ayudado a que la formación no se vea como un esfuerzo puntual sino a provocar el cambio real en la forma de trabajar. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agradecimientos y enlaces de interés
&lt;/h2&gt;

&lt;p&gt;Para montar nuestro modelo (y también nuestro curso) de &lt;em&gt;Product Discovery&lt;/em&gt; nos hemos inspirado en artículos y modelos ya existentes en la industria. A continuación os dejo una selección de algunos enlaces que nos han inspirado y que creo pueden ser interesantes para profundizar más: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://svpg.com/dual-track-agile/" rel="noopener noreferrer"&gt;Dual Track Agile&lt;/a&gt; by Marty Cagan&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jpattonassociates.com/dual-track-development/" rel="noopener noreferrer"&gt;Dual Track Development is not Duel Track&lt;/a&gt; by Jeff Patton&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/l7-5x0ra2tc" rel="noopener noreferrer"&gt;Introduction to modern Product Discovery&lt;/a&gt; by Teresa Torres&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://herbig.co/product-discovery/" rel="noopener noreferrer"&gt;Product Discovery, a Practical Guide for Product Teams&lt;/a&gt; by Tim Herbig&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.producttalk.org/opportunity-solution-tree/" rel="noopener noreferrer"&gt;Opportunity Solutions Tree: Visualize your thinking&lt;/a&gt; by Teresa Torres&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jpattonassociates.com/opportunity-canvas/" rel="noopener noreferrer"&gt;Opportunity Canvas&lt;/a&gt; by Jeff Patton&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.designkit.org/methods" rel="noopener noreferrer"&gt;Design Kit Methods&lt;/a&gt; by Ideo.org&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/agileinsider/forming-experimental-product-hypotheses-85b1d41541c4" rel="noopener noreferrer"&gt;Forming Experimental Product Hypotheses&lt;/a&gt; by Chris Compston&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://itamargilad.com/idea-validation-much-more-than-just-a-b-experiments/" rel="noopener noreferrer"&gt;Idea Validation - Much More Than Just A/B Experiments&lt;/a&gt; by Itamar Gilead&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;El desarrollo del curso de Product Discovery habría sido imposible sin el trabajo incansable de Alba, Ari, Austin, Julia, Liz, Simmone y Tarra.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;En futuros artículos compartiremos más detalles sobre nuestro modelo y sobre cómo estamos aplicando algunas de las técnicas clave de nuestro curso de Product Discovery.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;La foto de la portada es de &lt;a href="https://unsplash.com/@noble_m1tchellon" rel="noopener noreferrer"&gt;Nobel Mitchell&lt;/a&gt; en &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ux</category>
      <category>productdiscovery</category>
    </item>
    <item>
      <title>Data Platform: Qué es y cuáles son sus retos
</title>
      <dc:creator>Adevinta Eng.</dc:creator>
      <pubDate>Fri, 28 Jan 2022 12:43:26 +0000</pubDate>
      <link>https://dev.to/adevintaspain/data-platform-que-es-y-cuales-son-sus-retos-5228</link>
      <guid>https://dev.to/adevintaspain/data-platform-que-es-y-cuales-son-sus-retos-5228</guid>
      <description>&lt;p&gt;&lt;strong&gt;¿Qué es un data Platform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data Platform es un producto clave en nuestra cultura data driven, como acelerador tecnológico para poder gestionar el dato como activo, y yendo más allá incluso como producto. Una Cloud Big Data Platform que debe dotar a nuestros usuarios de una infraestructura como servicio y herramientas de autoconsumo de la información en todo su pipeline de datos. Y todo ello acompañado de una cultura del dato como producto y una gobernanza computacional federada. Sí, hablamos de Data Mesh, y ahí tenéis bastante literatura de la mano de su creadora, Zhamak Dehghani.&lt;/p&gt;

&lt;p&gt;Liderando un equipo Data Platform en Adevinta Spain&lt;br&gt;
Adevinta Spain es un grupo de marketplaces líder en España formado por &lt;a href="https://www.adevinta.es/marcas"&gt;6 marketplaces&lt;/a&gt;, que reciben a 1 de cada 2 internautas españoles cada día.&lt;/p&gt;

&lt;p&gt;Como PO del equipo producto Data Platform en Adevinta Spain, mi misión es liderar la visión y estrategia del producto, con un equipo de desarrollo compuesto por Big Data Engineers, DataOps y Machine Learning Engineers.&lt;/p&gt;

&lt;p&gt;Hace un año que &lt;a href="https://www.adevinta.es/ofertas-empleo"&gt;me incorporé a Adevinta Spain&lt;/a&gt; y me enfrenté al gran reto como equipo de ser impulsores de la evolución de la compañía a nivel Data. En este tiempo nos hemos acercado más al negocio y los usuarios, porque las soluciones tecnológicas no son más que una respuesta a la estrategia y como tales deben ir acompañadas de personas y procesos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IRftPW6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vygmersrxd8qbbcoosa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IRftPW6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vygmersrxd8qbbcoosa4.png" alt="Image description" width="480" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ¿cómo acercar un mundo tan técnico a los usuarios? Pues ese es mi gran reto, hacer entendible lo complejo, entender la tecnología y entender al usuario, hablar ambos idiomas y trabajar como one team para construir un producto enfocado en valor.&lt;/p&gt;

&lt;p&gt;El reto es grande porque nuestra Data Platform da servicio a todos los marketplaces con los que cuenta Adevinta en España (&lt;a href="https://www.fotocasa.es/es/"&gt;Fotocasa&lt;/a&gt;,  &lt;a href="https://www.habitaclia.com/"&gt;Habitaclia&lt;/a&gt;, &lt;a href="https://www.infojobs.net/"&gt;InfoJobs&lt;/a&gt;, &lt;a href="https://www.coches.net/"&gt;coches.net&lt;/a&gt;, &lt;a href="https://motos.coches.net/"&gt;motos.net&lt;/a&gt; y &lt;a href="https://www.milanuncios.com/"&gt;Milanuncios)&lt;/a&gt;. Y debemos equilibrar el dar un servicio global centralizado, y a su vez dar autonomía a los equipos/dominios de datos. Para no ser un cuello de botella y poder acelerar nuestra cultura data driven. Donde el usuario se preocupe por los datos, y los pueda incorporar en los procesos de decisión y construcción de productos en todos nuestros marketplaces.&lt;/p&gt;

&lt;p&gt;El camino está iniciado y ya caminamos juntos tecnología, personas y procesos. Dónde desde Data Platform aportamos las últimas tecnologías Big Data y productos innovadores que puedan acelerar nuestra estrategia de compañía y data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nuestra Visión de Data Platform: ¿Dónde estamos hoy?
&lt;/h2&gt;

&lt;p&gt;Pues estamos dando un servicio centralizado a nivel infraestructura a cada uno de nuestros marketplaces y/o dominios de datos, con una ingesta de datos masiva y con un catálogo central de discovery y gobernanza de la información.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i9WMdWpm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9z3jkg6hhc6lzzxs5nw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i9WMdWpm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9z3jkg6hhc6lzzxs5nw.png" alt="Image description" width="640" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dedicando esfuerzos a automatizar procesos y dar herramientas a nuestros usuarios para que sean independientes, y sean los mínimos procesos los que dependan de nosotros. Porque tenemos la suerte de que cada marketplace cuenta con un equipo potente de Data Engineers, Data Analyst y Data Scientist para la construcción de productos data.&lt;/p&gt;

&lt;p&gt;Cada uno de los dominios recolecta las fuentes de datos de interés, utiliza los productos para su ingesta, transforma los datos en las diferentes zonas lógicas de Data Lake y Datawarehouse. Y a partir de ahí, analyst y data scientist hacen su magia convirtiendo el dato en insight, dashboard de seguimiento o modelo de machine learning, que en última instancia convierte el dato en acción para la toma de decisiones y evolución de producto en todos nuestros marketplaces, mejorando el conocimiento del cliente y la experiencia de usuario.&lt;/p&gt;

&lt;p&gt;El dominio es por tanto, dueño de su dato y de todos los procesos de transformación del mismo. A través de los cuales genera productos de datos que posteriormente comparte con el resto de marketplaces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jUUl-om9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yjipiw0kx2h317xp9rse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jUUl-om9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yjipiw0kx2h317xp9rse.png" alt="Image description" width="640" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y desde Data Platform ofrecemos la infraestructura y las herramientas para que los dominios puedan trabajar con los datos.&lt;/p&gt;

&lt;p&gt;La infraestructura engloba engine, cómputo, scheduler, endpoints (sqlaas, notebooks, programmatic), networking, deploy y etc. En definitiva lo que el usuario no ve y dota de capacidades para realizar “la magia”.&lt;/p&gt;

&lt;p&gt;Las herramientas de autoconsumo, que engloba las capacidades anteriores y aporta esa capa “user friendly” que el usuario requiere para realizar su día a día, preocupándose por el dato y nada más. Aquí vivimos en plena evolución porque la tendencia de democratizar la analítica hace que los perfiles sean dispares y debamos adaptar capas a skills requeridos. Así que, en este punto, hay un mundo por evolucionar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visión de Data Platform: ¿Hacia dónde vamos?
&lt;/h2&gt;

&lt;p&gt;Hacia un data ownership asumido 100% por los dominios, donde el productor/dominio es el que gobierna el dato porque es el que lo conoce y sabe evolucionarlo para que su valor sea máximo. Donde nosotros como Data Platform facilitamos la infraestructura, las herramientas y los productos como servicio para que puedan ser independientes y llevarlo a cabo, garantizando la escalabilidad, y acelerando así la construcción de modelos de machine learning y la toma de decisiones basadas en datos. Y donde cada dominio construye y comparte sus productos de datos con el resto.&lt;/p&gt;

&lt;p&gt;En esta transición es muy importante equilibrar las tres patas: personas, procesos y tecnología. Es por ello, que avanzamos en paralelo en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;La cultura de la compañía con el dato&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;La definición de políticas y procesos de data governance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Y en dotar de la tecnología (data platform) necesaria para acelerar la estrategia y acompañar a las personas y los procesos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porque solo se puede avanzar y acelerar juntos, no hay otro camino.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escrito por Marta Díaz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Master en Business Intelligence y Big Data, Diplomada en estadística y Licenciada en Investigación y Técnicas de Mercado. Muy ligada al Gobierno del Dato, es miembro activo de Dama Spain en los Comités “Data Governance &amp;amp; Metadata” y “Data Quality &amp;amp; Content Management”. Actualmente desarrolla su actividad profesional en &lt;a href="https://www.adevinta.es/"&gt;Adevinta Spain&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>data</category>
      <category>dataplatform</category>
    </item>
    <item>
      <title>ENTREVISTA DigitalES: Juan Carlos Ruiz, un ‘arquitecto’ de páginas web detrás de Fotocasa
</title>
      <dc:creator>Adevinta Eng.</dc:creator>
      <pubDate>Thu, 27 Jan 2022 09:41:14 +0000</pubDate>
      <link>https://dev.to/adevintaspain/entrevista-digitales-juan-carlos-ruiz-un-arquitecto-de-paginas-web-detras-de-fotocasa-1nh8</link>
      <guid>https://dev.to/adevintaspain/entrevista-digitales-juan-carlos-ruiz-un-arquitecto-de-paginas-web-detras-de-fotocasa-1nh8</guid>
      <description>&lt;p&gt;‘CRACKS de la tecnología’ es una serie semanal de entrevistas de DigitalES, a través de las que dan voz a esos profesionales TI que son absolutos genios de la tecnología en España. El objetivo es saber de ellos/as, conocer y reconocer el trabajo que realizan en las empresas en las que trabajan; saber qué les apasiona y qué consejos guardan para aquellos/as que vendrán detrás.&lt;/p&gt;

&lt;p&gt;Juan Carlos Ruiz se inició en la programación a los 10 años. Siendo todavía un niño, diseñó un programa de gestión para su padre. Combinaba su inquietud por la informática con una pasión por la arquitectura, el diseño y el arte que aún conserva. Dos décadas después, este joven no diseña planos de viviendas, pero hace posible que muchos millones de personas compren y vendan sus casas a través de Internet.&lt;/p&gt;

&lt;p&gt;Trabaja en el equipo de frontend de &lt;a href="https://www.fotocasa.es/es/"&gt;Fotocasa&lt;/a&gt;, el portal inmobiliario de &lt;a href="https://www.adevinta.es/"&gt;Adevinta Spain&lt;/a&gt;, y hoy atiende a DigitalES desde Barcelona, la ciudad en la que siempre soñó vivir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MST7rT_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kzz62ys9me12y9nai0c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MST7rT_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kzz62ys9me12y9nai0c.jpg" alt="Image description" width="880" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.- Trabajar para un portal como Fotocasa, y encima desde la ciudad modernista por excelencia. ¡Te encaja como anillo al dedo!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- Desde pequeño tuve claro que quería vivir en Barcelona. Aun hoy, me parece una ciudad extraordinaria y tengo la suerte de que una gran compañía como Adevinta Spain ha decidido instalar aquí su sede mundial, así como la mayor parte de sus equipos de desarrollo web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En Adevinta Spain, todo el desarrollo se hace in-house.&lt;/strong&gt; No hay que olvidar que, para un gigante de portales de Internet (&lt;a href="https://www.fotocasa.es/es/"&gt;Fotocasa&lt;/a&gt;, &lt;a href="https://www.habitaclia.com/"&gt;habitaclia&lt;/a&gt;, &lt;a href="https://www.infojobs.net/"&gt;InfoJobs&lt;/a&gt;, &lt;a href="https://www.coches.net/"&gt;coches.net&lt;/a&gt;, &lt;a href="https://motos.coches.net/"&gt;motos.net&lt;/a&gt; y &lt;a href="https://www.milanuncios.com/"&gt;Milanuncios&lt;/a&gt;), &lt;strong&gt;cuestiones como el diseño, la usabilidad y la experiencia de usuario representan elementos esenciales de su modelo de negocio&lt;/strong&gt;. La Web es el núcleo de su propuesta de valor, y por eso es tan importante que &lt;strong&gt;las personas que trabajan con el código sientan el proyecto como algo suyo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.- Ese compromiso con los proyectos al que aludes, ¿se promueve activamente en Adevinta Spain?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- Yo diría que sí. De un lado, &lt;strong&gt;se promueve un clima de trabajo donde la gente esté contenta y motivada&lt;/strong&gt;, por ejemplo, permitiendo que &lt;strong&gt;propongamos nuevas funcionalidades&lt;/strong&gt; o maneras de mejorar las ya existentes. Eso ayuda a que nos sintamos partícipes de los proyectos y de la empresa. Por otra parte, los trabajadores de Adevinta Spain &lt;strong&gt;recibimos continuamente formación sobre el negocio&lt;/strong&gt;, lo cual nos hace entender mejor las necesidades de la empresa. Yo creo que, si conoces bien el producto, la calidad de tus desarrollos se va a ver muy incrementada.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Cuando conoces bien el producto, la calidad de tus desarrollos se ve muy incrementada."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;P.- ¿Qué hace exactamente un desarrollador en Adevinta Spain? ¿Cómo os estructuráis y organizáis?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- Existen equipos por cada vertical de negocio de Adevinta Spain y, por supuesto, recursos y herramientas que compartimos en toda la compañía. &lt;strong&gt;Cada equipo&lt;/strong&gt;, a su vez, **cuenta con especialistas en los diferentes sub-campos en que puede dividirse el desarrollo **web, como desarrolladores frontend, backend, mobile (iOS / Android)… Y como equipo multidisciplinar también tenemos perfiles UX/UI, Data Insight, SEO y otros perfiles que requiera el proyecto. En realidad, todos tenemos una base de conocimiento sobre programación frontend y backend, pero por lo general nos ceñimos a nuestra área de especialización, como buen “equipo full-stack”.&lt;/p&gt;

&lt;p&gt;Con respecto al trabajo en sí, &lt;strong&gt;aplicamos metodologías ágiles&lt;/strong&gt;. Concretamente Scrum, que consiste en distribuir todos los nuevos desarrollos en sprints de dos semanas. En quince días, tenemos que ser capaces de programar nuevas funcionalidades y probarlas. Si funcionan, se llevan a Producción y, si no, iteramos o se descartan. ¡Y vuelta a empezar!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.- El trabajo de desarrollador, en efecto, se ha sofisticado mucho en los últimos años. ¿Cómo explicas a qué te dedicas a personas que no conocen el mundo TIC?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- A mi madre, por ejemplo, empecé por contarle que mi trabajo consistía en aporrear el teclado y tomar mucho café. Después, le expliqué que una página web siempre tiene una parte visual, con la que interactúan los usuarios, y otra parte invisible, que es todo lo que hay detrás. Hoy por hoy, mi madre -y como ella, cada vez más personas- conoce la diferencia entre un desarrollador frontend y backend.&lt;/p&gt;

&lt;p&gt;También ayuda que trabajemos para portales muy conocidos y reconocidos por la sociedad. Hablamos de 18.8 millones de usuarios únicos, es decir, &lt;strong&gt;19.3 millones de personas que confían en los marketplaces de Adevinta Spain para encontrar lo que buscan&lt;/strong&gt;. Es emocionante que el fruto de tu trabajo sean servicios que usa tanta gente…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Es emocionante que el fruto de tu trabajo sean servicios que usa tanta gente para encontrar lo que buscan."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;P.- Si tus padres no trabajaban en nada cercano a la informática, ¿de dónde crees que te vino la vocación tecnológica?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- Fue algo gradual. Me apuntaron a clases extraescolares de mecanografía con máquina de escribir. [Bromea: “¡Creo que llegué a hacer músculo en los meñiques!”] Después empecé con la mecanografía con ordenador y, a partir de ahí, me fui interesando más y más por la ofimática. Descubrí que podía hacer fórmulas en Excel, bases de datos en Access… El profesor vio que yo mostraba interés y me enseñó los fundamentos de HTML, CSS, JavaScript y PHP.&lt;/p&gt;

&lt;p&gt;Incluso le monté un programa de gestión a mi padre cuando tenía 10 años. Mi vocación siempre fue la de arquitecto, pero la informática me gustaba y se me daba bien, y me fui dejando llevar por ese camino. Así que nunca llegué a la Facultad de Arquitectura, pero me gusta pensar que, en cierto modo, he acabado siendo un “arquitecto de software”.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;P.- Al respecto de la salida profesional que tiene aprender programación, ¿qué perfiles son los que más escasean?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
R.- En España hay muchísimo talento, pero al mismo tiempo, por esa sofisticación de la que hablábamos antes, cuesta encontrar buenos especialistas. Con la pandemia, diría que la dificultad para encontrar programadores es menor, porque el teletrabajo hace posible que busquemos candidatos en otras ciudades, provincias e incluso países de habla hispana.&lt;/p&gt;

&lt;p&gt;Después, cada nueva incorporación lleva a cabo su propio proceso de onboarding, que suele consistir en un pequeño proyecto con el que se va familiarizando con el resto del staff técnico y con las herramientas que usamos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.- ¿Y cómo los seleccionáis?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- En Adevinta Spain &lt;strong&gt;hemos cambiado recientemente el modo en que realizamos la selección de personas&lt;/strong&gt;, precisamente para ser capaces de identificar mejor quién tiene verdadera madera de desarrollador/a. Así, primero intentamos** romper el hielo con el chico o la chica, tomando un café** y hablando de nuestros hobbies o de cualquier otra cosa. Después de un rato, le &lt;strong&gt;planteamos una prueba técnica que dura solamente una hora&lt;/strong&gt;. Nada de pruebas complejísimas de una semana de duración; eso lo hacíamos antes y generaba muchísimo estrés a los/as candidatos/as. Algunos de nosotros expusimos ese problema a nuestros superiores, que escucharon ese feedback y, como resultado, hoy el proceso de captación es mucho más ágil.&lt;/p&gt;

&lt;p&gt;Claro está, las pruebas técnicas pueden jugarte una mala pasada. Recuerdo que yo estaba nerviosísimo cuando me tocó hacerla. Sin embargo, intentamos ver más allá y proyectar si esa persona encajaría en el equipo, y durante la entrevista procuramos que esté cómoda. Además, hacemos esfuerzos conscientes por aumentar la diversidad y que haya más mujeres en los equipos de desarrollo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hacemos esfuerzos conscientes por aumentar la diversidad y que haya más mujeres en los equipos de desarrollo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;P.- ¿En qué sueles tú fijarte en las entrevistas de trabajo? ¿Qué consejo les darías a los jóvenes que quieren llegar a ser grandes desarrolladores frontend el día de mañana?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R.- Siempre les pregunto por qué otras cosas han hecho y qué aficiones tienen. Me interesan mucho esos complementos o soft skills. Creo que intereses como el dibujo, la pintura o el diseño te aportan cuidado por el detalle, por el pixel. Y eso, al final, se traslada a la calidad de tu trabajo.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
