<?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: Juan A. Reséndiz</title>
    <description>The latest articles on DEV Community by Juan A. Reséndiz (@jresendiz27).</description>
    <link>https://dev.to/jresendiz27</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%2Fuser%2Fprofile_image%2F22813%2Fc3e689a3-39f8-4270-925b-f2ec297d98fb.jpg</url>
      <title>DEV Community: Juan A. Reséndiz</title>
      <link>https://dev.to/jresendiz27</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jresendiz27"/>
    <language>en</language>
    <item>
      <title>[Opinión] El problema del liderazgo en los equipos de tecnología.</title>
      <dc:creator>Juan A. Reséndiz</dc:creator>
      <pubDate>Mon, 02 Aug 2021 23:27:45 +0000</pubDate>
      <link>https://dev.to/jresendiz27/opinion-el-problema-del-liderazgo-en-los-equipos-de-tecnologia-3m6p</link>
      <guid>https://dev.to/jresendiz27/opinion-el-problema-del-liderazgo-en-los-equipos-de-tecnologia-3m6p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Esto es mi opinión, la comparto y espero poder generar conciencia y un poco de debate sano; con la finalidad de mejorar o bien, comenzar con el camino de un liderazgo integral en la industria de tecnología.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conforme pasan los años y uno va creciendo en TI (hablando específicamente en la industria del Software) te das cuenta de las fuertes deficiencias en educación emocional, comunicación y resolución de conflictos que existen en la industria.&lt;/p&gt;

&lt;p&gt;Desafortunadamente es algo de lo que pecamos muchos en el área, nuestro egoísmo y &lt;a href="https://carloscastrom.wordpress.com/2012/06/24/teorias-de-comunicacion-que-es-gatekeeping/" rel="noopener noreferrer"&gt;gatekeeping&lt;/a&gt; nos impiden buscar un crecimiento organizacional íntegro y orgánico sin tener que aspirar siempre a ser el mejor en todo.&lt;/p&gt;

&lt;p&gt;Estos problemas permean mucho más allá cuando contamos con posiciones de liderazgo y nos deja con una gran deficiencia al intentar ser líderes de equipo. &lt;/p&gt;

&lt;p&gt;Imaginemos la siguiente mezcla: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gatekeeping&lt;/li&gt;
&lt;li&gt;Sesgos personales&lt;/li&gt;
&lt;li&gt;Poca educación emocional (empatía, tolerancia, respeto, etc)&lt;/li&gt;
&lt;li&gt;Mala comunicación (timing, ortografía, tono de voz, etc)&lt;/li&gt;
&lt;li&gt;Egoísmo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es una exquisita combinación para el desastre. &lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuál podría ser el origen de este problema?
&lt;/h2&gt;

&lt;p&gt;Esta es una excelente pregunta, y considero, no hay una respuesta correcta, si no, un universo de éstas. &lt;/p&gt;

&lt;p&gt;Bajo mi perspectiva, uno de los principales factores viene desde la formación y perfil de áreas relacionadas a ingeniería.&lt;/p&gt;

&lt;p&gt;En ciertas escuelas/empresas/bootcamps se nos enseña que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Somos los mejores"&lt;/li&gt;
&lt;li&gt;"Podemos con todo lo que tenemos enfrente"&lt;/li&gt;
&lt;li&gt;"Cómo sea, pero hazlo"&lt;/li&gt;
&lt;li&gt;"Todos los egresados y egresadas de aquí terminan en las FAANG"&lt;/li&gt;
&lt;li&gt;"Si X persona no sabe Y concepto, ¿Para qué lo quiero en mi equipo?"&lt;/li&gt;
&lt;li&gt;"Necesito profesionales y especialistas, no code monkeys"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas y muchas otras frases las podemos encontrar en #TechTwitter &lt;strong&gt;(donde también hay MUCHO apoyo y pasión por querer cambiar esto)&lt;/strong&gt;,así como rondando en chats de algunas comunidades, Linkedin y hasta dentro de los mismos procesos de reclutamiento (si eres entrevistador o aplicante, te invito a analizarlo).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Este tipo de ideas durante nuestra etapa formativa, terminan por acentuar conductas, por ejemplo: elitismo, egoísmo, falta de empatía, un debate sesgado y acotado por nuestro mismo grupo social, etc; que pueden o van a perdurar por años&lt;/strong&gt;, siempre y cuando no decidamos tomar conciencia, aceptar que se puede cambiar y actuar a nivel personal.&lt;/p&gt;

&lt;p&gt;Ahora imagina que tu líder (tech lead, manager, líder de área, CTO, CEO, etc) comparte esas mismas ideas, esto termina por generar procesos con muchos sesgos y acentuar dichos comportamientos. &lt;/p&gt;

&lt;p&gt;El resultado es &lt;strong&gt;un equipo fragmentado y una comunidad viciada&lt;/strong&gt; con esas mismas ideas; brindando también &lt;strong&gt;inconformidad y alta rotación en los equipos&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Existe una solución o ¿cuál sería el camino más adecuado?
&lt;/h2&gt;

&lt;p&gt;Esta pregunta, igual que la anterior, no tienen una respuesta única ni absoluta (porque se terminaría por polarizar, y no es el objetivo); sin embargo, hay caminos validados y documentados.&lt;/p&gt;

&lt;p&gt;Es necesario comenzar con el proceso de deconstrucción como individuos (más aún los que estamos en posiciones de liderazgo), eso nos permitirá analizar y comprender mejor nuestros sesgos, fortalezas, debilidades y miedos (que se suelen reflejar en acciones que reprimen y limitan a nuestro equipo), y así comenzar a cuestionar si lo que somos es realmente lo que queremos tener en nuestra carrera profesional y mostrar como estandarte de un área. &lt;/p&gt;

&lt;p&gt;Aceptar la enorme diversidad de opiniones y como cada una de estas son valiosas para el crecimiento integral de la comunidad, será uno de los pilares para lograr una comunicación sana dentro del equipo.&lt;/p&gt;

&lt;p&gt;Estar abiertos como líderes del área a opiniones totalmente distantes de las nuestras, para comprenderlas y complementarlas o bien, incentivar el debate sano en los equipos a los que lleguemos a formar parte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cambiar la imposición por guía, fomentar la comunicación abierta, motivar la retroalimentación empática, incentivar el reconocimiento, invitar a cometer y aprender de los errores&lt;/strong&gt;, son algunas de las muchas acciones que podemos tomar cuando estamos al frente de un equipo.&lt;/p&gt;

&lt;p&gt;Quitarnos la idea y esa pasión por el control en cada uno de los procesos de nuestros equipos y comprender, &lt;strong&gt;que la diversidad ideológica nos permite un crecimiento integral&lt;/strong&gt;, nos da una excelente oportunidad para crecer profesional y emocionalmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  La educación emocional: una herramienta difícil de encontrar y a veces igual de complicado de desarrollar.
&lt;/h2&gt;

&lt;p&gt;Estas famosas &lt;em&gt;Soft Skills&lt;/em&gt; (también muy relacionadas con la educación emocional), pueden ser unos de los factores de diferenciación entre un excelente compañero de trabajo (ya sea líder o no) o bien, alguien a quien podemos apoyar e incentivar a crecer a la par con el resto del equipo o de la organización. &lt;/p&gt;

&lt;p&gt;A título personal, estas habilidades me ha tocado desarrollarlas a través de procesos complejos (terapia, cometer errores, pérdidas, cambios de trabajo, etc), siendo mi experiencia sólo uno de los muchos caminos igual de válidos para lograrlo. &lt;/p&gt;

&lt;p&gt;Lo más importante es &lt;strong&gt;desarrollar la humildad, cuestionar la formación/idea que tenemos de nosotros, buscando siempre  nuestro crecimiento a la par de la comunidad&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como líderes, debemos recordar que todos los seres humanos tenemos una gran cualidad: la vulnerabilidad; esta nos permite detectar nuestras fortalezas y debilidades, a pesar de lo amargo que puede llegar a ser reconocerla y afrontarla.&lt;/p&gt;

&lt;p&gt;Terminaré por preguntarte: &lt;strong&gt;Y tú, ¿por donde comenzarás a cuestionarte y cuestionar los procesos e ideas que tienes a tu alrededor?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>liderazgo</category>
      <category>opinion</category>
      <category>management</category>
    </item>
    <item>
      <title>Le debo dinero al Banco de México: Negociando la deuda técnica.</title>
      <dc:creator>Juan A. Reséndiz</dc:creator>
      <pubDate>Thu, 02 Jul 2020 18:34:44 +0000</pubDate>
      <link>https://dev.to/jresendiz27/le-debo-dinero-al-banco-de-mexico-negociando-la-deuda-tecnica-30ej</link>
      <guid>https://dev.to/jresendiz27/le-debo-dinero-al-banco-de-mexico-negociando-la-deuda-tecnica-30ej</guid>
      <description>&lt;h2&gt;
  
  
  Apenas llegué y ya estan lloviendo los &lt;del&gt;golpes&lt;/del&gt; tickets
&lt;/h2&gt;

&lt;p&gt;A todos nos ha pasado. Llegas a un nuevo equipo, una nueva empresa, startup o consultora y tu primer semana te asignan un bug.&lt;br&gt;
¿Será mi novatada? ¿Por qué está pasando esto? Probablemente te harás miles de preguntas, pero hay algo común en ese comportamiento: &lt;em&gt;&lt;strong&gt;la deuda técnica&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La &lt;em&gt;&lt;strong&gt;deuda técnica&lt;/strong&gt;&lt;/em&gt; se define como el trabajo adicional (o retrabajo) a una tarea o funcionalidad definida, regularmente por alguno de estos motivos (pueden ser más):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un camino fácil (a veces hackish) &lt;a href="https://jeffreypalermo.com/2009/09/debunking-the-duct-tape-programmer/" rel="noopener noreferrer"&gt;Duck tape programmer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Optimización prematura&lt;/li&gt;
&lt;li&gt;Mala definición o diseño&lt;/li&gt;
&lt;li&gt;Acoplamiento con algún componente externo o interno&lt;/li&gt;
&lt;li&gt;Falta de visión durante el refinamiento de la tarea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este concepto tiene una analogía directa con la deuda monetaria en cualquier sistema financiero, es decir, si dicha deuda no se paga, esta seguirá generando intereses y dificultará su pago futuro o reimplementación, lo cual suele ser muy costoso por la posible pérdida de conocimiento.&lt;/p&gt;

&lt;p&gt;Cabe destacar que, como cualquier deuda o préstamo que se pide al banco, siempre se puede negociar y dependerá del uso que decidamos darle.&lt;/p&gt;

&lt;p&gt;Por ejemplo, podemos pedir un préstamo para poner un negocio y conforme tengamos cierta liquidez comenzar a pagarlo; o bien, irnos a un bar con nuestros amigos a gastarnos el ingreso recién generado.&lt;/p&gt;

&lt;p&gt;La situación en la industria del software es la misma. &lt;em&gt;&lt;strong&gt;No es malo tener deuda técnica, es malo cuándo no decides pagarla o la ignoras&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hola, este software fue mio pero yo ya me fui
&lt;/h2&gt;

&lt;p&gt;Todos hemos tocado ese punto donde tenemos &lt;em&gt;&lt;strong&gt;sistemas legados&lt;/strong&gt;&lt;/em&gt;, procesos completos de ingeniería que tienen áreas enormes de oportunidad pero por ser "viejos" son juzgados y vistos como el principal problema del mundo actual.&lt;/p&gt;

&lt;p&gt;Un &lt;em&gt;&lt;strong&gt;sistema legado&lt;/strong&gt;&lt;/em&gt; es aquel que podemos clasificar como obsoleto, poco actualizado o bien, con visión distinta a lo que requiere el negocio actualmente. &lt;strong&gt;Muchos&lt;/strong&gt; factores pueden hacer que un sistema sea clasificado o no como legado. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Falta de soporte de algún framework, biblioteca o lenguaje&lt;/li&gt;
&lt;li&gt;Exceso de deuda técnica en el sistema&lt;/li&gt;
&lt;li&gt;Actualización de los estándares bajo los que el sistema fue diseñado&lt;/li&gt;
&lt;li&gt;Cambios en la estructura del negocio que impiden su actualización gradual&lt;/li&gt;
&lt;li&gt;Las métricas sobre cambios o actualizaciones suelen ser muy costosas (relacionado al mismo tiempo a la deuda técnica)&lt;/li&gt;
&lt;li&gt;Acoplamiento del proceso con algún hardware en específico y qué este haya sido deprecado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos solo son algunos de los &lt;em&gt;muchos&lt;/em&gt; factores que pueden marcar como legado a un sistema.&lt;br&gt;
Pero la pregunta del millón: ¿Debo reemplazar todo mi sistema y crearlo desde cero? ¿Puedo evitar tener un sistema legado?&lt;/p&gt;

&lt;p&gt;Las respuestas pueden ser: No y No. Sin embargo, puedes &lt;strong&gt;negociar, visualizar y planear&lt;/strong&gt; el crecimiento de tu sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Aceptan pagos a meses sin intereses?
&lt;/h2&gt;

&lt;p&gt;La forma más sana (como hasta en la vida misma) de atender las deudas que uno tiene es tener visibilidad de las mismas. Dentro de la industria del software la situación es (o se recomienda que sea) la misma. Para poder llevar un rastreo más eficaz de la deuda técnica se recomiendan los siguientes puntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mantener un registro de las funcionalidades que generaron nueva deuda (código duplicado, falta de pruebas, diseño acoplado a un componente en específico, problemas de seguridad, etc)&lt;/li&gt;
&lt;li&gt;Clasificar de forma quincenal (por medio del refinamiento, en caso de usar el framework Scrum) la urgencia, impacto y tiempo de cada tarea de deuda técnica&lt;/li&gt;
&lt;li&gt;Asignar de ser posible del 20 al 25 % de la velocidad del equipo a pagar la deuda técnica que más dolencias les trae para avanzar de una forma más eficiente&lt;/li&gt;
&lt;li&gt;En caso de ser posible, alinear las nuevas funcionalidades para que la nueva arquitectura sea más mantenible, contando con &lt;a href="https://medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6" rel="noopener noreferrer"&gt;alta cohesión y bajo acoplamiento&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Volver a negociar la deuda en caso de ser posible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existen muchas técnicas para el manejo y mantenimiento de código legado, a continuación se listan algunas (de las muchas) existentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faking Collaborators&lt;/li&gt;
&lt;li&gt;Wrap Methods/Classes&lt;/li&gt;
&lt;li&gt;Breaking Dependencies&lt;/li&gt;
&lt;li&gt;Database Refactoring techniques&lt;/li&gt;
&lt;li&gt;Dependency breaking techniques (Extract interface, Parametrize constructor/method, encapsulate global dependencies, etc)&lt;/li&gt;
&lt;li&gt;Replacing conditionals with Polymorphism&lt;/li&gt;
&lt;li&gt;Remove Middle Man&lt;/li&gt;
&lt;li&gt;Improving via design patterns&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Muchas otras técnicas existen para poder lidiar con código legado o refactoring, algunas de estas las podemos encontrar en el libro de &lt;a href="https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=sr_1_1?crid=3KUVIUUV0I376&amp;amp;dchild=1&amp;amp;keywords=refactoring+second+edition&amp;amp;qid=1593039494&amp;amp;s=books&amp;amp;sprefix=Refac%2Cstripbooks-intl-ship%2C338&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;Refactoring: Improving the design of existing code&lt;/a&gt;, &lt;a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/ref=sr_1_1?crid=WD8QVMAS4BSP&amp;amp;dchild=1&amp;amp;keywords=working+effectively+with+legacy+code&amp;amp;qid=1593039457&amp;amp;s=books&amp;amp;sprefix=working+effec%2Cstripbooks-intl-ship%2C193&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;Working Effectively with Legacy Code&lt;/a&gt;, &lt;a href="https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997/ref=sr_1_1?dchild=1&amp;amp;keywords=effective+java&amp;amp;qid=1593039432&amp;amp;s=books&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;Effective Java&lt;/a&gt; y &lt;a href="https://www.amazon.com/gp/product/0321774515/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321774515&amp;amp;linkCode=as2&amp;amp;tag=passionaboutd-20" rel="noopener noreferrer"&gt;Refactoring Databases: Evolutionary Database Design&lt;/a&gt;, por mencionar algunas fuentes.&lt;/p&gt;

&lt;p&gt;Estas técnicas (o métodos) pueden formar parte de nuestro set de trucos de magia para poder resolver problemas, sin embargo, habrá veces que tendremos que reemplazar bloques completos, haciendo lo posible por mantener estable el contrato de nuestra API pública.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un caso de estudio: El equipo de tooling en Kueski
&lt;/h2&gt;

&lt;p&gt;Sin entrar en detalles, en &lt;a href="https://kueski.com/" rel="noopener noreferrer"&gt;Kueski&lt;/a&gt; contamos con un equipo enfocado a la creación de herramientas e infraestructura para hacer más fácil la vida a los desarrolladores/ingenieros y así puedan entregar valor al negocio, considerando calidad y velocidad. Cuestiones de CI/CD, aprovisionamiento de servidores, regresiones automatizadas, infraestructura, DevSecOps, manejo de licencias, son algunos de los puntos con los que nos toca lidiar.&lt;/p&gt;

&lt;p&gt;Desde la creación de este equipo (a la par de la implementación de la cultura DevOps) hemos empujado el financiamiento sano de la deuda técnica. Siendo un equipo de cinco ingenieros, hemos logrado dar soporte a más de 150 pipelines, incluyendo lo antes mencionado hasta la fase de entrega; ~70 integrantes del equipo de ingeniería (incluyendonos). Y por mucho podemos decir de forma muy humilde ... &lt;strong&gt;Sí, tenemos deuda técnica&lt;/strong&gt; ...&lt;/p&gt;

&lt;p&gt;Nadie del equipo era (aún no lo somos) experto en ésta área, comenzamos a notar el incremento en tiempo (o puntos del sprint) para cambios pequeños y eso nos levantó un foco rojo. Desde Agosto del 2019, comenzamos a llevar el tracking puntual de bugs/technical debt que ibamos encontrando o eran reportados por nuestros usuarios finales.&lt;/p&gt;

&lt;p&gt;Hemos adoptado una forma de trabajo que consiste en los siguientes procesos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trunk based development&lt;/li&gt;
&lt;li&gt;Feature flags&lt;/li&gt;
&lt;li&gt;System monitoring and alerting via Slack&lt;/li&gt;
&lt;li&gt;Service Desk (para peticiones externas o soporte a ingeniería)&lt;/li&gt;
&lt;li&gt;Scrum (para planeación y manejo de nuevos features)&lt;/li&gt;
&lt;li&gt;Kanban board (registro de deuda técnica)&lt;/li&gt;
&lt;li&gt;Pair programming

&lt;ul&gt;
&lt;li&gt;Temas de soporte&lt;/li&gt;
&lt;li&gt;Diseño y arquitectura de nuevos features&lt;/li&gt;
&lt;li&gt;Refactoring de deuda técnica&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Behavior Driven Development (70 - 80% de Coverage)&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Cuestiona, siempre cuestiona&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Documentar la api pública&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Si se rompe algo, no te preocupes, es simplemente que lo debemos mejorar&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;em&gt;El pipeline es mi pastor, y nada me faltará&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Be aware of your team&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;em&gt;Be clear and concise&lt;/em&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Cada qué detectamos que necesitamos seguir algún camino poco mantenible o tomar algún atajo para resolver una incidencia, reportamos el ticket de deuda técnica en el Kanban board con el siguiente formato:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre del proyecto&lt;/li&gt;
&lt;li&gt;Descripción de la deuda a pagar&lt;/li&gt;
&lt;li&gt;Propuesta o arquitectura de solución (opcional)&lt;/li&gt;
&lt;li&gt;Esfuerzo estimado inicial (low, medium, high, coffee time)&lt;/li&gt;
&lt;li&gt;Esfuerzo después de terminada&lt;/li&gt;
&lt;li&gt;Comentarios extra de la tarea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Las tareas son refinadas por la persona que la reporta (a veces éstas salen a través de una sesión de pair programming, por ejemplo); agregando diagramas o bien, bosquejos de la solución. Cada dos semanas (lo que dura un sprint), dedicamos el 20% de la fuerza (de ser posible) para atacar la deuda técnica generada, esto con la finalidad de contar con una base lo suficientemente mantenible para seguir avanzando.&lt;/p&gt;

&lt;p&gt;Elegimos las tareas de deuda técnica que se encuentran relacionadas a un componente que requiere una mejora o bien, una funcionalidad nueva. Todo esto lo hacemos adoptando feature flags y monitoreo (con alertas en Slack), lo cual nos ha permitido actuar de forma proactiva en lugar de esperar a que nos llegue la petición por medio de un ticket o una incidencia.&lt;/p&gt;

&lt;p&gt;Regularmente fomentamos la solución compartida a través de pair programming. Sin dudarlo hemos aprendido (o mejor dicho, re-aprendido) que varias mentes piensan mejor que una. También decidimos no contar con un coverage del 100%, ya que ante todo, nos gusta contar con cierta flexibilidad para poder innovar sin tener que lidiar con un monolito de pruebas. &lt;a href="https://www.youtube.com/watch?v=EZ05e7EMOLM" rel="noopener noreferrer"&gt;Hay una plática muy buena sobre ésto&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalmente: Salir del buró de crédito
&lt;/h2&gt;

&lt;p&gt;El pago de deuda técnica es algo que se tendrá que hacer y es parte de nuestro rol como ingenieros. Es parte de un desarrollo integral el saber tratar con sistemas con deuda y legados (suelen ir relacionados pero no son dependientes), ya que &lt;em&gt;no siempre podremos crear todo desde cero&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ante todo, &lt;em&gt;sé empático con el equipo y el sistema actual&lt;/em&gt;, el objetivo es aprender e incrementar la funcionalidad, no sólo juzgar la situación.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sé humilde y juega en equipo&lt;/em&gt;, a veces nosotros mismos generamos esa deuda técnica (sí, no somos para nada perfectos), trabaja a la par con el equipo actual o equipos involucrados, para ellos es importante contar con la visibilidad y comprender el estado del arte en ese momento, así se logrará atacar de mejor forma la deuda, no sólo con un contexto sesgado.&lt;/p&gt;

&lt;p&gt;Una gran ventaja de tener todo nuestro sistema en un estado sano y mantenible, es que cuando llegan los famosos &lt;em&gt;volantazos&lt;/em&gt;, muy comunes en nuestra área, nos es más fácil reaccionar y adecuarnos, en lugar de &lt;em&gt;tener que reinventar todo desde cero&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La frase de &lt;em&gt;"Move fast and break things"&lt;/em&gt; tiene muchos matices, no debemos ser radicales y por ello buscar lo perfecto o bien &lt;em&gt;romper todo por el bien común&lt;/em&gt;. Tratemos de buscar el punto medio donde probablemente algunas cosas se lleguen a romper, sin embargo, tratando de mantener al mismo tiempo toda la maquinaria funcionando ahora y pensando en un futuro. &lt;/p&gt;

&lt;p&gt;En Tooling fomentamos la discusión, siempre apoyando los puntos de vista y empujando que exista una mejora contínua.&lt;/p&gt;

&lt;p&gt;Aprender a lidiar con sistemas legados y deuda técnica no te hace más o menos ingeniero (a veces queremos abusar de estar siempre a la vanguardia), recuerda que todo lo nuevo en unos años, será nuevamente código legado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/the-andela-way/what-technical-debt-is-and-how-its-measured-ff41603005e3" rel="noopener noreferrer"&gt;https://medium.com/the-andela-way/what-technical-debt-is-and-how-its-measured-ff41603005e3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6" rel="noopener noreferrer"&gt;https://medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itpeernetwork.intel.com/information-security-and-technical-debt-management/" rel="noopener noreferrer"&gt;https://itpeernetwork.intel.com/information-security-and-technical-debt-management/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caylent.com/fight-technical-debt" rel="noopener noreferrer"&gt;https://caylent.com/fight-technical-debt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeffreypalermo.com/2009/09/debunking-the-duct-tape-programmer/" rel="noopener noreferrer"&gt;https://jeffreypalermo.com/2009/09/debunking-the-duct-tape-programmer/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=sr_1_1?crid=3KUVIUUV0I376&amp;amp;dchild=1&amp;amp;keywords=refactoring+second+edition&amp;amp;qid=1593039494&amp;amp;s=books&amp;amp;sprefix=Refac%2Cstripbooks-intl-ship%2C338&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=sr_1_1?crid=3KUVIUUV0I376&amp;amp;dchild=1&amp;amp;keywords=refactoring+second+edition&amp;amp;qid=1593039494&amp;amp;s=books&amp;amp;sprefix=Refac%2Cstripbooks-intl-ship%2C338&amp;amp;sr=1-1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/ref=sr_1_1?crid=WD8QVMAS4BSP&amp;amp;dchild=1&amp;amp;keywords=working+effectively+with+legacy+code&amp;amp;qid=1593039457&amp;amp;s=books&amp;amp;sprefix=working+effec%2Cstripbooks-intl-ship%2C193&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/ref=sr_1_1?crid=WD8QVMAS4BSP&amp;amp;dchild=1&amp;amp;keywords=working+effectively+with+legacy+code&amp;amp;qid=1593039457&amp;amp;s=books&amp;amp;sprefix=working+effec%2Cstripbooks-intl-ship%2C193&amp;amp;sr=1-1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=EZ05e7EMOLM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=EZ05e7EMOLM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=URSWYvyc42M" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=URSWYvyc42M&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/is-quality-worth-cost.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/is-quality-worth-cost.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/TechnicalDebt.html" rel="noopener noreferrer"&gt;https://martinfowler.com/bliki/TechnicalDebt.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>techicaldebt</category>
      <category>softwareengineering</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>Site Reliability Engineering: Afrontando el riesgo y los desastres</title>
      <dc:creator>Juan A. Reséndiz</dc:creator>
      <pubDate>Mon, 01 Jun 2020 19:36:06 +0000</pubDate>
      <link>https://dev.to/jresendiz27/site-reliability-engineering-embracing-risk-and-disaster-management-4bi6</link>
      <guid>https://dev.to/jresendiz27/site-reliability-engineering-embracing-risk-and-disaster-management-4bi6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Conflict isn't an inevitable part of offering a software service"&lt;/em&gt; - &lt;a href="https://landing.google.com/sre/sre-book/chapters/introduction/" rel="noopener noreferrer"&gt;Google Site Reliability Engineering&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es Site Reliability Engineering?
&lt;/h2&gt;

&lt;p&gt;Dentro del área del desarrollo de software, es parte de nuestro día a día resolver problemas de cualquier tipo, incluyendo el conciliar una entrega de alguna funcionalidad, la reparación de algún defecto o mejora al sistema actual.&lt;/p&gt;

&lt;p&gt;Site Reliability Engineering, es un concepto que Google ha hecho famoso desde hace varios años, cuyo principal objetivo es unificar la parte de diseño de software con la parte operativa de un producto/servicio, tomando en cuenta factores cómo la resiliencia, seguridad, entrega, manejo de riesgos del ciclo del desarrollo de un sistema informático entre otros.&lt;/p&gt;

&lt;p&gt;Los equipos de SRE se encuentran enfocados a procesos de ingeniería y entrega de valor al producto. Sin un proceso constante de análisis, diseño e implementación, &lt;a href="https://landing.google.com/sre/sre-book/chapters/eliminating-toil/" rel="noopener noreferrer"&gt;la carga operativa suele incrementar&lt;/a&gt; y eso implica la necesidad de contar con más personal para ejecutar la carga de trabajo.&lt;/p&gt;

&lt;p&gt;Uno de los enfoques principales de SRE, es reducir esa carga operacional manteniendo una razón, ah doc a las necesidades del producto sin comprometer la calidad del mismo (la propuesta de Google es 50%/50%). &lt;/p&gt;

&lt;p&gt;Es decir, mantener la carga operativa y el proceso de innovación/automatización de forma que los equipos de trabajo no sólo se enfoquen en atender problemas operacionales, sino también realizar mejoras, &lt;a href="https://www.toptal.com/finance/part-time-cfos/technical-debt" rel="noopener noreferrer"&gt;resolver deuda técnica&lt;/a&gt;, e innovar sobre el producto en cuestión.&lt;/p&gt;

&lt;p&gt;En esta serie de 3 publicaciones, estaremos hablando de temas relacionados a SRE y cómo estos conceptos nos pueden ayudar a mejorar nuestro ritmo de trabajo, trabajando a la par con las áreas involucradas para que nuestros sistemas cumplan con los requisitos de calidad, disponibilidad y seguridad propuestos por el equipo o la competencia en sí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disponibilidad: Manejando el riesgo y los desastres en el software
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Todos los sistemas son propensos a fallos&lt;/strong&gt;. Si un sistema aparenta no tener fallos, es probable que los tenga, simplemente aún no se han presentado.&lt;/p&gt;

&lt;p&gt;Cuando existe algún tipo de fallo o riesgo en algún sistema, éste desgasta la relación con los usuarios (sean internos o externos); uno de los objetivos de SRE es fomentar la reducción o acotación de éste riesgo.&lt;/p&gt;

&lt;p&gt;Existen varios factores que determinan el costo de los factores de disponibilidad, los dos principales son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redundancia&lt;/strong&gt;: Ya sea en equipo físico, recurso humano o espacio para lograr ejecutar un plan de acción ante un fallo (o responder ante alguna anomalía).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo de oportunidad&lt;/strong&gt;: Los recursos que una organización desea considerar para el diseño de funcionalidades minimizando el riesgo. Estos recursos no sólo se enfocan a la disponibilidad/seguridad; si no también pueden representar nuevas funcionalidades o mejoras al sistema/producto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es importante mencionar que no todos los recursos deben ser enfocados a la disponibilidad, ni tampoco al desarrollo de nuevas funcionalidades; ya que este balance puede ir cambiando con el paso del tiempo.&lt;/p&gt;

&lt;p&gt;Factores como el diseño del sistema, el cliente final, criticidad del servicio, cantidad de deuda técnica, por mencionar algunos, son pilares a considerar para definir cuál debe ser la disponibilidad de un servicio.&lt;/p&gt;

&lt;p&gt;La mejor forma de poder tomar una decisión es teniendo métricas dentro de los sistemas, sin embargo, si tomamos un sistema nuevo, se puede conciliar contar con algún tipo de holgura y conforme pasa el tiempo (un trimestre, por ejemplo) determinar el peso de cada uno de los factores y así mejorar la propuesta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://landing.google.com/sre/sre-book/chapters/embracing-risk/" rel="noopener noreferrer"&gt;Dentro del libro de SRE&lt;/a&gt;, se mencionan las siguientes dos propuestas de medición de disponibilidad de un sistema:&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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisponibilidad_1.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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisponibilidad_1.png" alt="Disponibilidad"&gt;&lt;/a&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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisponibilidad_2.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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisponibilidad_2.png" alt="Disponibilidad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usualmente la disponibilidad es calculada por el número de 9s que el proveedor del servicio puede garantizar.  &lt;em&gt;Una disponibilidad de 99.9% habla de un porcentaje de baja disponibilidad de apróximadamente 8.76 horas al año.&lt;/em&gt; Cada número nueve agregado a ese valor, implica un análisis profundo de la arquitectura actual, infraestructura y costos: en horas hombre, contratos con proveedores y mantenimiento.&lt;/p&gt;

&lt;p&gt;Para poder afrontar el riesgo dentro de nuestros sistemas es necesario tomar en cuenta las siguientes preguntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disponibilidad

&lt;ul&gt;
&lt;li&gt;¿Cuál es el nivel requerido de disponibilidad?&lt;/li&gt;
&lt;li&gt;¿Cómo es el manejo de las integraciones con terceros en caso de que éstas fallen?&lt;/li&gt;
&lt;li&gt;¿Cómo podemos aprovechar el costo de oportunidad para ayudar a reducir los riesgos?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Negocio

&lt;ul&gt;
&lt;li&gt;¿Cuál es el nivel de disponibilidad que provee la competencia?&lt;/li&gt;
&lt;li&gt;¿El servicio impacta directamente en las ganancias (del producto o servicio)?&lt;/li&gt;
&lt;li&gt;¿El servicio es gratuito o de paga? (Considerando un &lt;a href="https://en.wikipedia.org/wiki/Service-level_agreement" rel="noopener noreferrer"&gt;SLA&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;¿Actualmente cuál es el proceso de control de calidad con el que se cuenta? (El balance en la &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;pirámide de pruebas&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Diseño y Arquitectura

&lt;ul&gt;
&lt;li&gt;¿Las métricas actuales fueron diseñadas considerando la deuda técnica?&lt;/li&gt;
&lt;li&gt;¿Cuál es la frecuencia de actualización del servicio? ¿Se intenta encontrar un nicho en el mercado o es un servicio ya establecido?&lt;/li&gt;
&lt;li&gt;¿Cómo es el proceso de monitoreo actual? (Logs, red, consultas, tiempos de respuesta, consumo de memoria, etc).&lt;/li&gt;
&lt;li&gt;¿Es necesario contar con algún requisito de seguridad? ¿El servicio se encuentra dentro de una &lt;a href="https://blog.finjan.com/trusted-computing-base/" rel="noopener noreferrer"&gt;Trusted Computer Base (TBC)&lt;/a&gt;?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Estas preguntas pueden formar parte del diseño y creación de cualquier sistema que desee contar con &lt;a href="https://www.atlassian.com/blog/statuspage/high-availability" rel="noopener noreferrer"&gt;alta disponibilidad&lt;/a&gt;, y ser consideradas no sólo a nivel sistema, también a nivel funcionalidad y adecuarse a cómo sea necesario.&lt;/p&gt;

&lt;p&gt;Siempre existe la alternativa de contar con distintos niveles de disponibilidad dependiendo el servicio, con base en la cantidad de subscriptores/funcionalidades, así los clientes pueden elegir el plan que más les convenga (cambiando los beneficios y el esquema de cobro).&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabajando para ser seguros y resilientes
&lt;/h2&gt;

&lt;p&gt;Un sistema que sólo se encuentra orientado a cuestiones de seguridad y resiliencia, sin contemplar los requerimientos de funcionalidad de negocio, tiende a ser un sistema rígido y poco usable. Es importante tener en cuenta lo antes mencionado para conciliar estos requerimientos y saber que siempre existirá un riesgo que debemos considerar como aceptable para no dificultar el flujo de trabajo.&lt;/p&gt;

&lt;p&gt;Durante la creación de un proyecto, la etapa de toma de requerimientos y diseño es indispensable para poder delimitar las fronteras del sistema, es decir, el acoplamiento con otros módulos, bases de datos, bibliotecas, sistemas de archivos, interfaces de red y servicios externos.&lt;/p&gt;

&lt;p&gt;Existen &lt;a href="https://refactoring.guru/design-patterns/structural-patterns" rel="noopener noreferrer"&gt;patrones de diseño&lt;/a&gt; y de &lt;a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/" rel="noopener noreferrer"&gt;arquitectura&lt;/a&gt; que pueden ayudar a disminuir el riesgo de acoplamiento con algún sistema o biblioteca; sin embargo, el riesgo siempre estará ahí y no por estar aislado dejará de existir.&lt;/p&gt;

&lt;p&gt;Dentro del flujo de trabajo de cualquier equipo, es indispensable contar con ciertas etapas durante el desarrollo para garantizar la integridad y calidad del producto que entregamos. A continuación se mencionan algunas fases a considerar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Análisis de dependencias&lt;/li&gt;
&lt;li&gt;Análisis de licencias&lt;/li&gt;
&lt;li&gt;Análisis de vulnerabilidades&lt;/li&gt;
&lt;li&gt;Cobertura de código&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.codinghorror.com/code-smells/" rel="noopener noreferrer"&gt;Code smells&lt;/a&gt;/Linting&lt;/li&gt;
&lt;li&gt;Pruebas unitarias, de integración, de sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas fases son algunas que pueden ser tomadas como parte de cualquier flujo de trabajo, siempre de forma automatizada por medio de algún servicio de integración continua como &lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;, &lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt;, &lt;a href="https://travis-ci.org/" rel="noopener noreferrer"&gt;TravisCI&lt;/a&gt;, &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;Github Actions&lt;/a&gt;, etc. Estas fases de desarrollo pueden fungir como un integrante más al equipo de trabajo; un integrante imparcial con una visión y procesos automatizados.&lt;/p&gt;

&lt;p&gt;El contar con procesos automátizados y replicables, es parte de la cultura Devops. Debemos ver éste proceso de automatización como una inversión a largo plazo para mejorar la calidad, más allá de un bloqueante durante las etapas tempranas del desarrollo.&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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fsoftware_security.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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fsoftware_security.jpg" alt="This is how we fail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tocando temas de seguridad, al igual que al hablar de temas de resiliencia, entre más seguro sea un sistema, tiende a ser menos usable, ya que cada capa de seguridad puede llegar a entorpecer la usabilidad y tiempos de respuesta de un servicio; y entre más componentes llegue a tener un sistema, mayor es su superficie de ataque.&lt;/p&gt;

&lt;p&gt;Muchos de los factores de seguridad y disponibilidad suelen ser no tangibles y en general abstractos respecto a temas de negocio, por lo mismo no son tomados como prioridad durante las fases de desarrollo; también suelen ser emergentes conforme pasa el tiempo.&lt;/p&gt;

&lt;p&gt;A nivel seguridad, esta puede ser una lista de referencia de factores a tomar en cuenta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Cómo el servicio se encuentra estructurado (módulos, monolito, microservicios)?&lt;/li&gt;
&lt;li&gt;¿Cuáles son los mecanismos de comunicación entre servicios (REST, RPC, Sockets)?&lt;/li&gt;
&lt;li&gt;¿Cómo se encuentran estructuradas las pruebas para realizar validaciones de seguridad o sanitización?&lt;/li&gt;
&lt;li&gt;¿Se debe contar con algún tipo de restricción por cuestiones de legislación o manejo de datos?
¿Qué información con la que tratamos debe ser cifrada o sanitizada?&lt;/li&gt;
&lt;li&gt;¿Cuáles son las técnicas de autenticación mínimas requeridas para garantizar la auditabilidad de accesos?&lt;/li&gt;
&lt;li&gt;¿Se cuenta actualmente con un proceso de aplicación de parches de seguridad en el sistema actual?&lt;/li&gt;
&lt;li&gt;¿El sistema cuenta con los roles necesarios para garantizar &lt;a href="https://heimdalsecurity.com/blog/what-is-the-principle-of-least-privilege/" rel="noopener noreferrer"&gt;el principio del menor privilegio&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;¿Dentro del diseño se consideró contar con CIA &lt;a href="https://developer.mozilla.org/en-US/docs/Archive/Security/Confidentiality,_Integrity,_and_Availability" rel="noopener noreferrer"&gt;(Confidentiality, Integrity, Availability)&lt;/a&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una estrategia que puede ayudar al SRE, Product Owners y equipos de ingeniería en general, es seguir un template de requerimiento/diseño con las preguntas que se consideran relevantes, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Feature #1

Description:
    A description about the feature.

External/Internal Dependencies:
    A list of all the possible dependencies that might be used by the system itself
    and how they will be managed.

SLA:
    Service Level Agreements that needs to be achieved for this feature.
    If they don't exists; at least SLO should be managed for the service

Security and Data considerations:
    If there is any consideration about how the service's data has to be handled
    (obfuscating or anonymizing data). This point it's suitable to describe the
    minimum security levels for the feature/system, at least the service
    should live in a TCB. If the managed data needs to be encrypted, this needs
    to be handled here, like the used algorithm or provider.

Do the service creates new technical debt?
    It's important to keep in track all the technical debt created/paid by the team,
    so it doesn't overwhelm the deliver velocity.

Service/Feature technical requirements:
    Database versions, languages, dependencies, coverage levels.

Architecture diagrams:
    If required, the service diagrams are suitable for a quick review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como punto indispensable, &lt;a href="https://blog.pythian.com/building-mature-devops-practice-implementing-devops-best-practices-throughout-application-lifecycle/" rel="noopener noreferrer"&gt;se recomienda que todos los sistemas diseñados puedan contar con un proceso de auditabilidad&lt;/a&gt;, con la finalidad de poder afrontar las incidencias que puedan llegar a presentarse; brindando la visibilidad y permisos mínimos para resolver el problema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dzone.com/articles/best-practices-for-efficient-log-management-and-mo" rel="noopener noreferrer"&gt;El manejo de logs es una parte indispensable para el monitoreo de un sistema&lt;/a&gt;, y no sólo es contar con éstos, también que deben proveer información importante sobre los procesos que un sistema ejecuta, sin exponer información sensible sobre clientes, por ejemplo.&lt;/p&gt;

&lt;p&gt;Existen muchas alternativas para manejar el monitoreo dentro de tus aplicaciones, servicios como &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt;, &lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;, &lt;a href="https://www.elastic.co/what-is/elk-stack" rel="noopener noreferrer"&gt;ELK&lt;/a&gt;, &lt;a href="https://aws.amazon.com/cloudwatch/" rel="noopener noreferrer"&gt;AWS Cloudwatch&lt;/a&gt;, etc; pueden ser integrados a tu sistema. Muchos de estos servicios te permiten generar dashboards para poder realizar un análisis de lo que pasa actualmente.&lt;/p&gt;

&lt;p&gt;La inclusión de alertas (con base en ciertos errores o umbrales de las métricas) nos permite reaccionar ante algún tipo de incidencia, ya sea de forma manual o programática; además de mantener a los equipos de trabajo en sincronía de lo que pasa en los ambientes productivos.&lt;/p&gt;

&lt;p&gt;Dentro de las métricas que pueden formar parte de un sistema, estas son las que se recomienda mantener monitoreadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de memoria&lt;/li&gt;
&lt;li&gt;Logs de procesos críticos de sistema operativo (journalctl)&lt;/li&gt;
&lt;li&gt;Logs del proceso productivo (se recomienda que sean mostrados directamente en el STDOUT, así será más fácil su integración con  contenedores)&lt;/li&gt;
&lt;li&gt;Tráfico de red&lt;/li&gt;
&lt;li&gt;Métricas de CPU&lt;/li&gt;
&lt;li&gt;Uso de disco&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La periodicidad de recolección de las métricas, dependerá de la razón de ser del componente; por ejemplo: Imaginemos un servicio con con una interacción constante a una API externa y  un proceso matemático complejo. Dado esa breve (y muy vaga) descripción, probablemente el uso de disco no sea una métrica que debamos obtener minuto a minuto, sin embargo, el uso de CPU y el tráfico de red se convierten en válidas opciones para tener con una mayor frecuencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todo explotó: Un plan ante el desastre (Disaster Recovery Plan)
&lt;/h2&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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisaster_fail.jpeg" 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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fdisaster_fail.jpeg" alt="This is how we fail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por más intentos materiales y humanos invertidos en cualquier proceso de ingeniería, estos tendrán defectos y existirán errores; cómo SREs, es nuestra misión inculcar una cultura orientada a evitar desastres, al mismo tiempo contar con planes de contingencia para mitigar posibles errores humanos, ventanas de mantenimiento, incidentes de seguridad, etc.&lt;/p&gt;

&lt;p&gt;Un DRP (Disaster Recovery Plan) consta del conjunto de procedimientos, acciones y puntos de contacto mínimos para mantener el negocio funcional mientras se trabaja en recuperar el estado más reciente del sistema.&lt;/p&gt;

&lt;p&gt;Este tipo de plan se debe realizar a la par con todas las áreas de negocio, no sólo desde ingeniería;  para poder garantizar la mayor cobertura operativa en caso de algún incidente. Los DRP se deben encontrar actualizados y adecuados al giro actual de la empresa.&lt;/p&gt;

&lt;p&gt;Dentro del desarrollo de un plan de recuperación, &lt;a href="https://www.gocloudwave.com/disaster-recovery-101-update-review/" rel="noopener noreferrer"&gt;existen algunos conceptos base que deben ser tomados en cuenta&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RTO: Recovery Time Objective. Se define como el tiempo que necesita la empresa para poner sus sistemas nuevamente en línea y funcionales después de que un evento fue declarado.&lt;/li&gt;
&lt;li&gt;DT: Decision Time. Muchos lo consideran el tiempo más crítico dentro de un plan de contingencia; este es el tiempo involucrado desde que se conoce la incidencia hasta que se inicia con el plan de recuperación. Este tiempo es crucial, ya que depende de los managers, leads, CTO, SREs el tomar la elección de ejecutar. A veces el tiempo invertido en soluciones por parte del equipo de ingeniería puede verse reflejado en minutos u horas con pérdidas de información. No existe una fórmula perfecta para esta métrica y depende de la criticidad del incidente, servicios afectados, horas del día o las personas involucradas.&lt;/li&gt;
&lt;li&gt;RPO: Recovery Point Objective. Es el tiempo entre tu último respaldo y cuándo se decidió ejecutar el plan de recuperación. Estos respaldos se pueden dejar en otras cuentas o medios físicos, de cualquier forma, es importante recordar que la consistencia de la información es la más importante.&lt;/li&gt;
&lt;li&gt;WRT: Working Recovery Time. Es el tiempo estimado en ejecutar el plan de recuperación desde que inicia hasta que éste mismo es culminado. Este tiempo puede ser tan crítico como la información involucrada en el sistema mismo.&lt;/li&gt;
&lt;li&gt;MTD: Maximum Tolerable Downtime. El tiempo máximo permitido en el que los sistemas pueden estar como no disponibles, es decir, el tiempo que la empresa puede tolerar no contar con un sistema funcional.&lt;/li&gt;
&lt;/ul&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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fconcepts.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%2Fjresendiz27-public-assets.s3.us-east-2.amazonaws.com%2FSRE-Posts%2FEmbracingRisk%2Fconcepts.png" alt="DRP Concepts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El DRP debe estar documentado y ser conocido por todas las áreas involucradas, además de contar con un proceso de revisión (dependiendo el servicio y la tasa de cambio del mismo) que puede ir de un trimestre, hasta un par de años.&lt;/p&gt;

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

&lt;p&gt;SRE es un tema integral dentro del desarrollo de una aplicación o sistema, forma parte integral de los procesos operativos y de ingeniería. Es importante tener en cuenta que &lt;strong&gt;no existe una fórmula para solucionar todos nuestros problemas de riesgo y disponibilidad&lt;/strong&gt;, la baraja de opciones es infinita, agregando también la gran velocidad con la que la industria de software suele moverse.&lt;/p&gt;

&lt;p&gt;Sin embargo, este tipo de cuestionamientos y lineamientos son algo que no ha cambiado a lo largo de los años en la industria del software. Deben ser considerados como guías para un trabajo contínuo y de calidad, más allá de normas por seguir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Los desastres siempre ocurrirán, sea cual sea su magnitud.&lt;/strong&gt; SRE fomenta una cultura para afrontar este tipo de retos de forma ordenada, segura y eficiente; sin dejar detrás la importancia que tiene el negocio y los clientes en el proceso.&lt;/p&gt;

&lt;p&gt;La flexibilidad y la aceptación de éstos horizontes desconocidos nos permiten siempre tener un campo fértil para la innovación, siempre y cuando se tenga un diseño flexible y estructurado de lo que deseamos alcanzar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recursos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://landing.google.com/sre/sre-book/chapters/introduction/" rel="noopener noreferrer"&gt;https://landing.google.com/sre/sre-book/chapters/introduction/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://landing.google.com/sre/sre-book/chapters/eliminating-toil/" rel="noopener noreferrer"&gt;https://landing.google.com/sre/sre-book/chapters/eliminating-toil/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.toptal.com/finance/part-time-cfos/technical-debt" rel="noopener noreferrer"&gt;https://www.toptal.com/finance/part-time-cfos/technical-debt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Service-level_agreement" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Service-level_agreement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/practical-test-pyramid.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.finjan.com/trusted-computing-base/" rel="noopener noreferrer"&gt;https://blog.finjan.com/trusted-computing-base/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/blog/statuspage/high-availability" rel="noopener noreferrer"&gt;https://www.atlassian.com/blog/statuspage/high-availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codinghorror.com/code-smells/" rel="noopener noreferrer"&gt;https://blog.codinghorror.com/code-smells/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://heimdalsecurity.com/blog/what-is-the-principle-of-least-privilege/" rel="noopener noreferrer"&gt;https://heimdalsecurity.com/blog/what-is-the-principle-of-least-privilege/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Archive/Security/Confidentiality,_Integrity,_and_Availabilityc" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Archive/Security/Confidentiality,_Integrity,_and_Availabilityc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/best-practices-for-efficient-log-management-and-mo" rel="noopener noreferrer"&gt;https://dzone.com/articles/best-practices-for-efficient-log-management-and-mo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gocloudwave.com/disaster-recovery-101-update-review/" rel="noopener noreferrer"&gt;https://www.gocloudwave.com/disaster-recovery-101-update-review/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.pythian.com/building-mature-devops-practice-implementing-devops-best-practices-throughout-application-lifecycle/" rel="noopener noreferrer"&gt;https://blog.pythian.com/building-mature-devops-practice-implementing-devops-best-practices-throughout-application-lifecycle/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://landing.google.com/sre/sre-book/chapters/embracing-risk/" rel="noopener noreferrer"&gt;https://landing.google.com/sre/sre-book/chapters/embracing-risk/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/azure/architecture/patterns/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refactoring.guru/design-patterns/structural-patterns" rel="noopener noreferrer"&gt;https://refactoring.guru/design-patterns/structural-patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sre</category>
      <category>techicaldebt</category>
      <category>softwaredesign</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
