<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Git archivos - SASE Formación</title>
	<atom:link href="https://saseformacion.es/tag/git/feed/" rel="self" type="application/rss+xml" />
	<link>https://saseformacion.es/tag/git/</link>
	<description>Formación integral en idiomas y IT</description>
	<lastBuildDate>Thu, 08 Oct 2026 11:08:06 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://saseformacion.es/wp-content/uploads/2026/08/cropped-sase_logo_bg_redondeado-32x32.png</url>
	<title>Git archivos - SASE Formación</title>
	<link>https://saseformacion.es/tag/git/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>La IA acelera el código. ¿Quién controla el despliegue?</title>
		<link>https://saseformacion.es/ia-acelera-codigo-controlar-despliegues/</link>
					<comments>https://saseformacion.es/ia-acelera-codigo-controlar-despliegues/#respond</comments>
		
		<dc:creator><![CDATA[David Torres]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 17:30:00 +0000</pubDate>
				<category><![CDATA[Informática y FP]]></category>
		<category><![CDATA[DAW]]></category>
		<category><![CDATA[Git]]></category>
		<guid isPermaLink="false">https://saseformacion.es/?p=5913</guid>

					<description><![CDATA[<p>Con la IA salen más cambios que nunca, pero los despliegues siguen igual. Notas de despliegue, releases, migraciones y CI/CD para controlar lo que sube.</p>
<p>La entrada <a href="https://saseformacion.es/ia-acelera-codigo-controlar-despliegues/">La IA acelera el código. ¿Quién controla el despliegue?</a> se publicó primero en <a href="https://saseformacion.es">SASE Formación</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Realizo desarrollos para empresas medianas, y en los últimos meses me estoy encontrando una situación que se repite. Desde que el equipo usa IA para programar salen muchos más cambios que antes, se ha acelerado la creación de código inmensamente. Sin embargo, la forma de llevarlos a producción no ha cambiado nada: alguien hace un <code>svn update</code> o un <code>git pull</code> en el servidor y repasa de memoria lo que hay que hacer antes y después.</p>



<p class="wp-block-paragraph">No escribo esto contra la IA, porque yo también la uso a diario. Lo escribo porque ha dejado a la vista un problema que estas empresas arrastraban desde hace años y que, con el ritmo de antes, se podía ir capeando.</p>



<p class="wp-block-paragraph">Y no es un problema solo de empresas pequeñas. He trabajado en consultoras grandes que tenían todo esto resuelto hace tiempo: integración continua, revisiones de código, entornos de preproducción y un proceso de despliegue que no dependía de la memoria de nadie. Aun así, la IA les está obligando a adaptarse también a ellas, porque esos procesos estaban dimensionados para el ritmo al que escribe código una persona. Si incluso quien ya tenía los procesos tiene que replantearlos, quien no los tenía lo nota mucho más.</p>



<h2 class="wp-block-heading">Lo que me encuentro</h2>



<p class="wp-block-paragraph">El escenario suele ser parecido. Es una empresa mediana con un equipo de desarrollo reducido, y su forma de trabajar se parece más a un waterfall que a otra cosa, aunque las tareas vivan en un tablero Kanban o similar. Esté el código en Subversion o en Git, he visto equipos con GitHub o GitLab que siguen subiendo directamente a la rama principal, sin <em>pull requests</em>, con un pipeline que nadie mira o sin pipeline, y desplegando a mano igual que con SVN. Tener la herramienta no es usarla. Tampoco hay tests automáticos. La documentación que hay en el repositorio la escribió alguien hace tiempo y nadie la ha vuelto a tocar.</p>



<p class="wp-block-paragraph">Al desplegar, aparecen las cosas que no están en el código:</p>



<ul class="wp-block-list">

<li>una variable de entorno nueva que hay que dar de alta en el servidor.</li>


<li>una consulta que se ejecuta antes de subir, y otra después para comprobar la integridad de los datos.</li>


<li>una migración de base de datos que alguien lanza a mano.</li>


<li>una Lambda que también hay que actualizar, o que hay que ejecutar una vez.</li>

</ul>



<p class="wp-block-paragraph">Lo que más me ha llamado la atención es otra cosa. <strong>Quien despliega no siempre ha mirado las tareas que está desplegando.</strong> Ni hay ningún paso del proceso que le obligue a hacerlo. Sube lo que hay en el repositorio, y lo que esas tareas necesitaban para funcionar depende de que alguien se acuerde de avisarle o de que se lea un comentario sobre la tarea en el tablero.</p>



<h2 class="wp-block-heading">Dos casos recientes</h2>



<p class="wp-block-paragraph">El primero es de esta misma semana. Se subieron cambios y, de repente, algo dejó de funcionar. Revisamos lo que había cambiado y nada en el código podía provocar ese fallo. La única explicación que encontramos fue de tiempos: durante el despliegue convivieron código antiguo y código nuevo. En ese proyecto hay migraciones y Lambdas de mantenimiento que se ejecutan de forma periódica, y lo más probable es que alguna se lanzara justo en ese hueco, con su código o el de la aplicación todavía en la versión anterior. No podemos asegurarlo al cien por cien, y eso es precisamente lo preocupante: nadie tenía apuntado qué se ejecuta solo, cuándo, ni en qué orden había que actualizar cada pieza.</p>



<p class="wp-block-paragraph">El segundo es de otra empresa, que trabaja con Subversion sin ramas: todo el mundo sube a la misma línea, y a veces se suben cambios a medias, con parte de los archivos olvidados en la copia local de quien hizo el commit. Cuando termino un desarrollo para ellos, siempre hago lo mismo antes de subir nada: actualizo desde Subversion, compilo, pruebo lo que he desarrollado, ajusto si hace falta y, si funciona, hago el commit. Pero si en el repositorio faltan archivos de otra persona, el build falla, o tengo que esperar a que alguien los suba. Y el caso peor es el contrario: que el build pase, que el despliegue también, y que algo explote en producción sin que nadie se haya dado cuenta.</p>



<p class="wp-block-paragraph">Ninguno de los dos es un problema de código. Los dos son problemas de proceso.</p>



<h2 class="wp-block-heading">Por qué la IA lo empeora sin tener la culpa</h2>



<p class="wp-block-paragraph">Antes, la propia lentitud hacía de control sin que nadie lo pretendiera. Si una persona tardaba una semana en sacar una funcionalidad, tenía tiempo de saber qué tocaba, y el despliegue de esa semana llevaba dos o tres cambios que todo el mundo conocía.</p>



<p class="wp-block-paragraph">Ahora, en esa misma semana entran muchos más cambios, y cada uno puede traer su propio requisito de despliegue. Además, con el código generado pasa algo nuevo: el desarrollador puede aceptar un cambio que lee una variable de entorno nueva o que da por hecha una columna que no existe, sin haberse quedado con ese detalle. Lo sabía el código, pero la persona no lo tenía en la cabeza, y menos aún el que despliega.</p>



<p class="wp-block-paragraph">Así que el cuello de botella se ha movido. Escribir el código ha dejado de ser lo lento. La pregunta ahora es <strong>cuántos cambios podemos llevar a producción sabiendo lo que hacemos</strong>.</p>



<h2 class="wp-block-heading">El problema de fondo: lo que hace falta para desplegar no está escrito en ningún sitio</h2>



<p class="wp-block-paragraph">La tarea del tablero dice <em>qué</em> se ha hecho: «Añadir autenticación con el proveedor nuevo». Lo que no dice es <em>cómo se despliega</em>: si hay que crear una tabla, qué variable falta en producción o qué hay que comprobar después. Esa información está en la cabeza de quien hizo la tarea o en un mensaje que se perdió hace dos semanas.</p>



<p class="wp-block-paragraph">Hay una pregunta que uso como prueba: <strong>¿dónde está escrito qué hay que hacer para desplegar esta tarea?</strong> Si la respuesta es «pregúntale a tal persona», el proceso depende de que esa persona esté y se acuerde. Y el día que falta o se le olvida un paso, el problema aparece en producción.</p>



<h2 class="wp-block-heading">Lo que propongo, por orden y sin cambiar de herramientas</h2>



<p class="wp-block-paragraph">La buena noticia es que las empresas pequeñas pueden aprovechar los mismos flujos que usan las grandes, adaptados a su tamaño. Y gracias a la IA, implantarlos es mucho más sencillo que antes: el pipeline, el script de comprobación o la configuración de las migraciones son justo el tipo de código que la IA escribe bien y que antes nadie tenía tiempo de preparar.</p>



<p class="wp-block-paragraph">No hace falta migrar a Git si estás en Subversion, ni cambiar de plataforma si ya usas GitHub o GitLab, ni montar Kubernetes para empezar. Lo que les propongo a estas empresas, en este orden, es lo siguiente.</p>



<h3 class="wp-block-heading">1. Notas de despliegue en cada tarjeta</h3>



<p class="wp-block-paragraph">Es lo más sencillo y lo que más cambia. Cada tarjeta del Kanban lleva una plantilla fija, que rellena quien hace la tarea:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>NOTAS DE DESPLIEGUE
¿Migración o SQL?            no / sí → cuál y cuándo (antes o después)
¿Variables de entorno?       no / sí → nombre y en qué entornos
¿Lambdas u otros servicios?  no / sí → cuál y qué hay que hacer
¿Procesos programados?       no / sí → cuáles; ¿se paran mientras se despliega?
¿Cómo se comprueba?          qué mirar en producción después de subir
¿Cómo se deshace?            qué hacer si algo sale mal</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #abb2bf">NOTAS DE DESPLIEGUE</span></span>
<span class="line"><span style="color: #abb2bf">¿Migración o SQL?            no / sí → cuál y cuándo (antes o después)</span></span>
<span class="line"><span style="color: #abb2bf">¿Variables de entorno?       no / sí → nombre y en qué entornos</span></span>
<span class="line"><span style="color: #abb2bf">¿Lambdas u otros servicios?  no / sí → cuál y qué hay que hacer</span></span>
<span class="line"><span style="color: #abb2bf">¿Procesos programados?       no / sí → cuáles; ¿se paran mientras se despliega?</span></span>
<span class="line"><span style="color: #abb2bf">¿Cómo se comprueba?          qué mirar en producción después de subir</span></span>
<span class="line"><span style="color: #abb2bf">¿Cómo se deshace?            qué hacer si algo sale mal</span></span></code></pre></div>



<p class="wp-block-paragraph">La regla es que la tarjeta no pasa a «Listo para desplegar» sin la plantilla rellena, aunque en todas las respuestas ponga «no». Escribir «no» también es información, porque significa que alguien se lo ha preguntado.</p>



<h3 class="wp-block-heading">2. Una release, no un puñado de tarjetas</h3>



<p class="wp-block-paragraph">Quien despliega no debería tener que recorrer el tablero. Antes de cada despliegue se junta en un único documento lo que sube y lo que piden sus notas:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>RELEASE 2026-10-08
Tareas: PROJ-1842, PROJ-1847, BUG-921

Antes:   variable PAYMENT_API_URL en producción
Durante: migración de la tabla customers
         actualizar la Lambda de notificaciones
Después: login, alta de cliente de prueba, /health
Si falla: volver a la revisión anterior; la migración no borra datos</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #abb2bf">RELEASE 2026-10-08</span></span>
<span class="line"><span style="color: #abb2bf">Tareas: PROJ-1842, PROJ-1847, BUG-921</span></span>
<span class="line"><span style="color: #abb2bf"></span></span>
<span class="line"><span style="color: #abb2bf">Antes:   variable PAYMENT_API_URL en producción</span></span>
<span class="line"><span style="color: #abb2bf">Durante: migración de la tabla customers</span></span>
<span class="line"><span style="color: #abb2bf">         actualizar la Lambda de notificaciones</span></span>
<span class="line"><span style="color: #abb2bf">Después: login, alta de cliente de prueba, /health</span></span>
<span class="line"><span style="color: #abb2bf">Si falla: volver a la revisión anterior; la migración no borra datos</span></span></code></pre></div>



<p class="wp-block-paragraph">El desarrollador trabaja con tareas; quien despliega, con releases. Ese documento es además lo que, dentro de un mes, te dice qué se subió un martes cualquiera.</p>



<h3 class="wp-block-heading">3. Que el repositorio sepa a qué tarea pertenece cada cambio</h3>



<p class="wp-block-paragraph">Una convención sencilla: todo cambio lleva el identificador de la tarea. Cómo se consigue depende del repositorio.</p>



<p class="wp-block-paragraph"><strong>Con Git</strong>, lo natural es que cada tarea vaya en su rama y entre en la principal mediante una <em>pull request</em> (<em>merge request</em> en GitLab) con el id en el título. La rama principal se protege para que nadie suba directamente, y la revisión de la <em>pull request</em> es el momento de preguntar por las notas de despliegue. GitHub y GitLab lo traen de serie; solo hay que activarlo.</p>



<p class="wp-block-paragraph"><strong>Con Subversion</strong>, para que no dependa de la buena voluntad, un <em>hook</em> <code>pre-commit</code> en el servidor rechaza los commits cuyo mensaje no empiece por el id:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#!/bin/sh
REPOS="$1"
TXN="$2"
svnlook log -t "$TXN" "$REPOS" | grep -qE '^[A-Z]+-[0-9]+' || {
  echo "El mensaje tiene que empezar por el id de la tarea (PROJ-123)." &gt;&amp;2
  exit 1
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #7F848E; font-style: italic">#!/bin/sh</span></span>
<span class="line"><span style="color: #E06C75">REPOS</span><span style="color: #56B6C2">=</span><span style="color: #98C379">&quot;</span><span style="color: #E06C75; font-style: italic">$1</span><span style="color: #98C379">&quot;</span></span>
<span class="line"><span style="color: #E06C75">TXN</span><span style="color: #56B6C2">=</span><span style="color: #98C379">&quot;</span><span style="color: #E06C75; font-style: italic">$2</span><span style="color: #98C379">&quot;</span></span>
<span class="line"><span style="color: #61AFEF">svnlook</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">log</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">-t</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;</span><span style="color: #E06C75">$TXN</span><span style="color: #98C379">&quot;</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;</span><span style="color: #E06C75">$REPOS</span><span style="color: #98C379">&quot;</span><span style="color: #ABB2BF"> | </span><span style="color: #61AFEF">grep</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">-qE</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&#39;^[A-Z]+-[0-9]+&#39;</span><span style="color: #ABB2BF"> || {</span></span>
<span class="line"><span style="color: #ABB2BF">  </span><span style="color: #56B6C2">echo</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;El mensaje tiene que empezar por el id de la tarea (PROJ-123).&quot;</span><span style="color: #ABB2BF"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #ABB2BF">  </span><span style="color: #56B6C2">exit</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">1</span></span>
<span class="line"><span style="color: #ABB2BF">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Y antes de cada commit, <code>svn status</code>: los archivos marcados con <code>?</code> no están bajo control de versiones. Si alguno es tuyo, falta en el commit. Es el segundo caso de arriba, resuelto con un comando.</p>



<p class="wp-block-paragraph">A partir de ahí, <code>svn log</code> entre dos revisiones, o <code>git log</code> entre dos etiquetas, te da la lista de tareas que entran en un despliegue, y la release se puede comprobar contra ella. Si sale una tarea que nadie había apuntado, mejor verlo antes de desplegar que después.</p>



<h3 class="wp-block-heading">4. Las migraciones, en una herramienta y no en un correo</h3>



<p class="wp-block-paragraph">«Antes de subir, ejecuta esta SQL» es probablemente la instrucción que más sustos da. Herramientas como <strong>Flyway</strong> o <strong>Liquibase</strong> guardan las migraciones como archivos versionados junto al código y registran en una tabla de la propia base de datos cuáles se han aplicado (<code>flyway_schema_history</code> en Flyway, <code>DATABASECHANGELOG</code> en Liquibase). Así no hay que acordarse de qué se ha ejecutado en cada entorno, porque la base de datos lo sabe.</p>



<p class="wp-block-paragraph">Y, por lo que contaba en el primer caso, conviene que cada migración funcione también con la versión anterior del código, porque durante el despliegue van a convivir. Si una columna cambia de nombre, primero se añade la nueva; la versión siguiente deja de usar la antigua, y solo después se borra. Así da igual qué pieza se actualice antes, o qué proceso programado se ejecute en medio.</p>



<h3 class="wp-block-heading">5. Comprobar la configuración antes de tocar nada</h3>



<p class="wp-block-paragraph">El clásico: todo funciona en desarrollo y en producción falla porque faltaba una variable. Un script de veinte líneas que se ejecuta antes del despliegue y lo para si falta algo evita media hora de buscar el error:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#!/bin/bash
for v in PAYMENT_API_URL NOTIFICATION_QUEUE_URL DB_URL; do
  if [ -z "${!v}" ]; then
    echo "Falta $v: no se despliega." &gt;&amp;2
    exit 1
  fi
done
echo "Configuración completa."</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #7F848E; font-style: italic">#!/bin/bash</span></span>
<span class="line"><span style="color: #C678DD">for</span><span style="color: #ABB2BF"> </span><span style="color: #E06C75">v</span><span style="color: #ABB2BF"> </span><span style="color: #C678DD">in</span><span style="color: #ABB2BF"> PAYMENT_API_URL NOTIFICATION_QUEUE_URL DB_URL; </span><span style="color: #C678DD">do</span></span>
<span class="line"><span style="color: #ABB2BF">  </span><span style="color: #C678DD">if</span><span style="color: #ABB2BF"> [ </span><span style="color: #56B6C2">-z</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;${</span><span style="color: #ABB2BF">!</span><span style="color: #E06C75">v</span><span style="color: #98C379">}&quot;</span><span style="color: #ABB2BF"> ]; </span><span style="color: #C678DD">then</span></span>
<span class="line"><span style="color: #ABB2BF">    </span><span style="color: #56B6C2">echo</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;Falta </span><span style="color: #E06C75">$v</span><span style="color: #98C379">: no se despliega.&quot;</span><span style="color: #ABB2BF"> &gt;&amp;2</span></span>
<span class="line"><span style="color: #ABB2BF">    </span><span style="color: #56B6C2">exit</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">1</span></span>
<span class="line"><span style="color: #ABB2BF">  </span><span style="color: #C678DD">fi</span></span>
<span class="line"><span style="color: #C678DD">done</span></span>
<span class="line"><span style="color: #56B6C2">echo</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;Configuración completa.&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">Es mucho mejor que el despliegue no empiece que descubrir el fallo con producción a medias.</p>



<h3 class="wp-block-heading">6. Unas pocas comprobaciones después, siempre las mismas</h3>



<p class="wp-block-paragraph">No hace falta una batería de tests para empezar. Basta con tres o cuatro comprobaciones de humo, siempre las mismas: que responde <code>/health</code>, que se puede iniciar sesión y que la operación principal funciona. Primero como lista en la release, y cuando sea posible, como script.</p>



<h3 class="wp-block-heading">7. Y entonces, automatizar</h3>



<p class="wp-block-paragraph">Cuando lo anterior funciona a mano, es el momento de llevarlo a un pipeline que compile, ejecute el script de variables, aplique las migraciones, despliegue y lance las comprobaciones. La herramienta depende de dónde esté el código: si usas GitHub o GitLab, <strong>GitHub Actions</strong> o <strong>GitLab CI</strong> ya vienen incluidos y no hay que instalar nada; con Subversion, <strong>Jenkins</strong> trabaja con él sin problema. Aunque solo compile, un pipeline que se ejecuta con cada commit ya merece la pena: si alguien deja archivos sin subir, el aviso le llega a él en minutos, y no a la siguiente persona que actualice. Automatizar un proceso que todavía no está escrito solo sirve para equivocarse más rápido. Primero se escribe y luego se automatiza.</p>



<h2 class="wp-block-heading">La IA, también del lado del despliegue</h2>



<p class="wp-block-paragraph">Si la IA ha acelerado los cambios, lo lógico es que ayude también a controlarlos. Y aquí le veo mucho recorrido, más allá de escribir código.</p>



<p class="wp-block-paragraph">Para empezar, ayuda a montar todo lo anterior. Escribir el pipeline, el <em>hook</em>, el script de variables o las primeras migraciones era trabajo que en un equipo pequeño siempre quedaba para «cuando haya tiempo», y con la IA se hace en una tarde. Revisándolo, claro.</p>



<p class="wp-block-paragraph">También sirve para revisar lo que va a subir. Un uso que estoy probando con empresas más antiguas con SVN, y que me parece de los más interesantes, es pasarle el diff (<code>svn diff -r 1200:1215</code>, o <code>git diff main...rama</code> en Git) y pedirle que liste lo que ese cambio necesita para desplegarse: variables de entorno que se leen por primera vez, tablas o columnas nuevas, llamadas a servicios externos, cambios en una API, procesos programados afectados. Si encuentra una variable nueva que nadie ha apuntado en la tarjeta, ahí hay una conversación pendiente antes de subir.</p>



<p class="wp-block-paragraph">Y el paso siguiente es que todo esto no dependa de que alguien se acuerde de pedírselo. Las herramientas de IA para desarrollo ya permiten empaquetar un procedimiento en una <em>skill</em>, unas instrucciones que la IA sigue siempre igual: qué leer, qué preguntar y qué plantilla rellenar. O encargárselo a un agente especializado. Es algo que ya uso en mis proyectos personales, donde tengo el control sobre cómo se hacen las cosas, y es donde he comprobado que funciona. Con <em>skills</em> y agentes, los pasos de este artículo se pueden automatizar también:</p>



<ul class="wp-block-list">

<li><strong>Notas de despliegue.</strong> Al cerrar una tarea, una <em>skill</em> lee el diff y la tarjeta, rellena la plantilla y marca lo que no cuadra: una variable que el código lee y la tarjeta no menciona, una migración sin plan de vuelta atrás.</li>


<li><strong>Documento de la release.</strong> Antes de desplegar, junta las notas de todas las tareas que entran, las ordena en antes, durante y después, y las contrasta con el <code>svn log</code> o el <code>git log</code> para avisar si sube algo que no está en el tablero.</li>


<li><strong>Revisión previa.</strong> Un agente repasa la release completa con la lista de comprobaciones y deja escrito qué ha verificado y qué no ha podido verificar.</li>

</ul>



<p class="wp-block-paragraph">Lo que no cambia es quién decide. La IA prepara, contrasta y avisa; la decisión de desplegar y la responsabilidad siguen siendo de una persona. Bien usada, la IA no sustituye ese control, sino que le quita el trabajo tedioso que hacía que nadie lo hiciera.</p>



<h2 class="wp-block-heading">Lo que no haría</h2>



<p class="wp-block-paragraph">No empezaría cambiando de herramientas. Si ya usas Git, el problema no es Git: es no usar lo que la plataforma ya ofrece. Y si estás en Subversion, migrar a Git, implantar Scrum o montar un clúster puede tener sentido más adelante, pero en un equipo pequeño que ya va justo, meter todo eso a la vez suele acabar en un proceso nuevo que nadie sigue, junto al antiguo, que sigue funcionando por debajo.</p>



<p class="wp-block-paragraph">Lo que funciona es lo poco y constante: la plantilla en la tarjeta, la release escrita y la regla en el repositorio, sea un <em>hook</em> o una rama protegida. Son cosas que se pueden implantar en una semana y que cambian la pregunta de «¿alguien se acuerda de lo que había que hacer?» a «¿dónde lo pone?».</p>



<h2 class="wp-block-heading">Para cerrar</h2>



<p class="wp-block-paragraph">Durante años el objetivo era programar más rápido, y ya lo estamos consiguiendo. Pero un cambio no está terminado cuando se escribe, sino cuando está en producción, se ha comprobado que funciona y se sabe cómo deshacerlo.</p>



<p class="wp-block-paragraph">Si tu equipo se reconoce en lo que he contado, mi consejo es empezar por la plantilla de notas de despliegue en las tarjetas.</p>

<p>La entrada <a href="https://saseformacion.es/ia-acelera-codigo-controlar-despliegues/">La IA acelera el código. ¿Quién controla el despliegue?</a> se publicó primero en <a href="https://saseformacion.es">SASE Formación</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://saseformacion.es/ia-acelera-codigo-controlar-despliegues/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guía de arranque: lo que se repite en todos los ciclos de informática</title>
		<link>https://saseformacion.es/guia-de-arranque-lo-que-se-repite-en-todos-los-ciclos-de-informatica/</link>
					<comments>https://saseformacion.es/guia-de-arranque-lo-que-se-repite-en-todos-los-ciclos-de-informatica/#respond</comments>
		
		<dc:creator><![CDATA[David Torres]]></dc:creator>
		<pubDate>Thu, 24 Sep 2026 17:30:00 +0000</pubDate>
				<category><![CDATA[Informática y FP]]></category>
		<category><![CDATA[ASIR]]></category>
		<category><![CDATA[DAM]]></category>
		<category><![CDATA[DAW]]></category>
		<category><![CDATA[FP]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[SMR]]></category>
		<category><![CDATA[Universidad]]></category>
		<guid isPermaLink="false">https://saseformacion.es/?p=5821</guid>

					<description><![CDATA[<p>Empiezas un ciclo de informática y no sabes por dónde. Estas tres ideas se repiten en todos: el árbol de carpetas, el historial y la ruta hasta una web.</p>
<p>La entrada <a href="https://saseformacion.es/guia-de-arranque-lo-que-se-repite-en-todos-los-ciclos-de-informatica/">Guía de arranque: lo que se repite en todos los ciclos de informática</a> se publicó primero en <a href="https://saseformacion.es">SASE Formación</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Empiezas SMR, DAW, DAM o ASIR y la primera semana llega de golpe: módulos con nombres largos, un profesor que abre una terminal negra y escribe cosas, otro que dice «subidlo al repositorio», y un tercero que da por sabido lo que es una IP.</p>



<p class="wp-block-paragraph">La buena noticia es que debajo de esos cuatro ciclos hay <strong>tres ideas que se repiten en todos</strong>, y que no dependen del título que estudies. Si las traes entendidas, el resto del curso deja de ser una sucesión de sorpresas.</p>



<p class="wp-block-paragraph">Esta guía no es un temario. Es lo mínimo que conviene tener claro —y probado en tu equipo— antes de que la asignatura lo dé por supuesto.</p>



<h2 class="wp-block-heading">Lo único que necesitas para seguir esta guía</h2>



<p class="wp-block-paragraph">Un ordenador y quince minutos. Nada de instalar entornos enormes: una terminal (la tienes ya) y Git, que es lo único que quizá debas descargar.</p>



<ul class="wp-block-list">
<li><strong>Windows</strong>: abre <em>PowerShell</em> o <em>Windows Terminal</em>.</li>



<li><strong>macOS</strong>: abre <em>Terminal</em>.</li>



<li><strong>Linux</strong>: ya sabes dónde está.</li>
</ul>



<h2 class="wp-block-heading">1. Tu equipo es un árbol de carpetas</h2>



<p class="wp-block-paragraph">Todo lo demás se apoya aquí. Un sistema de archivos es un árbol: una raíz, carpetas que cuelgan de ella y archivos en las ramas. Cuando un programa «no encuentra el archivo», casi siempre es que le has dado mal la dirección dentro de ese árbol.</p>



<h3 class="wp-block-heading">Absoluta o relativa: la diferencia que rompe todo</h3>



<p class="wp-block-paragraph">Una <strong>ruta absoluta</strong> empieza en la raíz y funciona siempre, estés donde estés:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/home/ana/proyectos/web/index.html      (Linux y macOS) 
C:\Users\ana\proyectos\web\index.html   (Windows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">/home/ana/proyectos/web/index.html</span><span style="color: #ABB2BF">      (Linux </span><span style="color: #98C379">y</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">macOS</span><span style="color: #ABB2BF">) </span></span>
<span class="line"><span style="color: #61AFEF">C:\Users\ana\proyectos\web\index.html</span><span style="color: #ABB2BF">   (Windows)</span></span></code></pre></div>



<p class="wp-block-paragraph">Una <strong>ruta relativa</strong> empieza donde estás ahora mismo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>web/index.html      dentro de la carpeta proyectos 
../index.html       una carpeta hacia arriba
./index.html        aquí mismo</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">web/index.html</span><span style="color: #ABB2BF">      </span><span style="color: #98C379">dentro</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">de</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">la</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">carpeta</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">proyectos</span><span style="color: #ABB2BF"> </span></span>
<span class="line"><span style="color: #56B6C2">.</span><span style="color: #ABB2BF">./index.html       </span><span style="color: #98C379">una</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">carpeta</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">hacia</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">arriba</span></span>
<span class="line"><span style="color: #61AFEF">./index.html</span><span style="color: #ABB2BF">        </span><span style="color: #98C379">aquí</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">mismo</span></span></code></pre></div>



<p class="wp-block-paragraph">La relativa es más corta y más portable —funciona en el equipo de tu compañero, donde tu carpeta personal se llama distinto—, pero depende de <strong>dónde estés parado</strong>. Esa es la causa número uno del «a mí me funcionaba».</p>



<h3 class="wp-block-heading">Los tres comandos que se usan todos los días</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pwd     # ¿dónde estoy?   (en PowerShell también vale: pwd) 
ls      # ¿qué hay aquí?  (en CMD: dir)
cd web  # entra en la carpeta web
cd ..   # sube una carpeta</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #56B6C2">pwd</span><span style="color: #ABB2BF">     </span><span style="color: #7F848E; font-style: italic"># ¿dónde estoy?   (en PowerShell también vale: pwd) </span></span>
<span class="line"><span style="color: #61AFEF">ls</span><span style="color: #ABB2BF">      </span><span style="color: #7F848E; font-style: italic"># ¿qué hay aquí?  (en CMD: dir)</span></span>
<span class="line"><span style="color: #56B6C2">cd</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">web</span><span style="color: #ABB2BF">  </span><span style="color: #7F848E; font-style: italic"># entra en la carpeta web</span></span>
<span class="line"><span style="color: #56B6C2">cd</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">..</span><span style="color: #ABB2BF">   </span><span style="color: #7F848E; font-style: italic"># sube una carpeta</span></span></code></pre></div>



<p class="wp-block-paragraph">Pruébalos ahora. No hace falta entender nada más: solo moverte y saber siempre en qué rama del árbol estás.</p>



<h2 class="wp-block-heading">2. Tu trabajo necesita historial, no copias</h2>



<p class="wp-block-paragraph">El patrón que todos hemos hecho alguna vez:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>practica.zip
practica_v2.zip 
practica_v2_BUENA.zip
practica_v2_BUENA_final.zip</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">practica.zip</span></span>
<span class="line"><span style="color: #61AFEF">practica_v2.zip</span><span style="color: #ABB2BF"> </span></span>
<span class="line"><span style="color: #61AFEF">practica_v2_BUENA.zip</span></span>
<span class="line"><span style="color: #61AFEF">practica_v2_BUENA_final.zip</span></span></code></pre></div>



<p class="wp-block-paragraph">Ese sistema falla en tres cosas a la vez: no sabes qué cambió entre una y otra, no puedes volver a un punto concreto, y si trabajáis dos, alguien pisa el trabajo del otro.</p>



<p class="wp-block-paragraph"><strong>Git</strong> resuelve exactamente eso. Guarda <em>cambios</em> en lugar de copias, y cada guardado —un <strong>commit</strong>— lleva fecha, autor y una frase explicando qué hiciste.</p>



<h3 class="wp-block-heading">El primer repositorio, en cuatro órdenes</h3>



<p class="wp-block-paragraph">La primera vez, y solo la primera, dile a Git quién eres. Si te lo saltas, el primer <code>commit</code> fallará con un «Author identity unknown» que desconcierta a medio aula:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git config --global user.name "Tu Nombre" 
git config --global user.email "tucorreo@ejemplo.com"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">config</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">--global</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">user.name</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;Tu Nombre&quot;</span><span style="color: #ABB2BF"> </span></span>
<span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">config</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">--global</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">user.email</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;tucorreo@ejemplo.com&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">Y ya, en la carpeta de tu práctica:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git init                      # crea el repositorio 
git add .                     # prepara los cambios
git commit -m "Primera versión de la práctica"
git log --oneline             # mira tu historial</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">init</span><span style="color: #ABB2BF">                      </span><span style="color: #7F848E; font-style: italic"># crea el repositorio </span></span>
<span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">add</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">.</span><span style="color: #ABB2BF">                     </span><span style="color: #7F848E; font-style: italic"># prepara los cambios</span></span>
<span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">commit</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">-m</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">&quot;Primera versión de la práctica&quot;</span></span>
<span class="line"><span style="color: #61AFEF">git</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">log</span><span style="color: #ABB2BF"> </span><span style="color: #D19A66">--oneline</span><span style="color: #ABB2BF">             </span><span style="color: #7F848E; font-style: italic"># mira tu historial</span></span></code></pre></div>



<p class="wp-block-paragraph">Cuatro líneas y tienes historial. La cuarta es la que engancha: ahí está tu trabajo con su fecha y su frase, y podrás volver a ese punto cuando quieras.</p>



<h3 class="wp-block-heading">Git no es GitHub</h3>



<p class="wp-block-paragraph">Se confunden constantemente y conviene separarlo desde el primer día:</p>



<ul class="wp-block-list">
<li><strong>Git</strong> es el programa que llevas instalado. Funciona sin internet, en tu equipo.</li>



<li><strong>GitHub</strong> (o GitLab, o Bitbucket) es una web donde puedes <em>alojar</em> una copia de tu repositorio para compartirlo o tenerlo a salvo.</li>
</ul>



<p class="wp-block-paragraph">Puedes usar Git toda la carrera sin abrir GitHub. Al revés no.</p>



<h2 class="wp-block-heading">3. Tus máquinas hablan por la red</h2>



<p class="wp-block-paragraph">Escribes un nombre, pulsas enter y aparece una web. Por debajo pasan tres cosas, y son las mismas tanto si acabas administrando servidores como si programas la web que vive en ellos.</p>



<h3 class="wp-block-heading">La dirección, la puerta y la traducción</h3>



<ul class="wp-block-list">
<li><strong>La dirección es la IP.</strong> Dentro de tu casa, cada aparato tiene una IP privada (<code>192.168.1.37</code> y parecidas, los rangos los fija la RFC 1918). De cara a internet, todos comparten una sola IP pública.</li>



<li><strong>La puerta es el router.</strong> Une tu red local con internet y traduce las direcciones privadas a la pública al salir. Eso es NAT: veinte aparatos dentro, una sola IP fuera.</li>



<li><strong>La traducción es el DNS.</strong> Nadie memoriza números: el DNS convierte <code>saseformacion.es</code> en la IP donde está. Y tu equipo guarda la respuesta un rato en caché, así que la segunda visita no vuelve a preguntar.</li>
</ul>



<h3 class="wp-block-heading">Míralo en tu propio equipo</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#abb2bf;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ipconfig                        # Windows: tu IP privada y la puerta de enlace 
ifconfig                        # macOS
ip a                            # Linux
nslookup saseformacion.es       # qué IP hay detrás de un nombre</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki one-dark-pro" style="background-color: #282c34" tabindex="0"><code><span class="line"><span style="color: #61AFEF">ipconfig</span><span style="color: #ABB2BF">                        </span><span style="color: #7F848E; font-style: italic"># Windows: tu IP privada y la puerta de enlace </span></span>
<span class="line"><span style="color: #61AFEF">ifconfig</span><span style="color: #ABB2BF">                        </span><span style="color: #7F848E; font-style: italic"># macOS</span></span>
<span class="line"><span style="color: #61AFEF">ip</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">a</span><span style="color: #ABB2BF">                            </span><span style="color: #7F848E; font-style: italic"># Linux</span></span>
<span class="line"><span style="color: #61AFEF">nslookup</span><span style="color: #ABB2BF"> </span><span style="color: #98C379">saseformacion.es</span><span style="color: #ABB2BF">       </span><span style="color: #7F848E; font-style: italic"># qué IP hay detrás de un nombre</span></span></code></pre></div>



<p class="wp-block-paragraph">La «puerta de enlace predeterminada» que sale en <code>ipconfig</code> es la IP de tu router. Normalmente, <code>192.168.1.1</code>.</p>



<h2 class="wp-block-heading">Y entonces, ¿qué distingue a cada ciclo?</h2>



<p class="wp-block-paragraph">Las tres ideas anteriores las vas a usar en los cuatro títulos. Lo que cambia es hacia dónde profundizas:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Ciclo</th><th>Grado</th><th>A qué se dedica</th></tr></thead><tbody><tr><td><strong>SMR</strong> · Sistemas Microinformáticos y Redes</td><td>Medio</td><td>Montar, mantener y reparar equipos y redes pequeñas</td></tr><tr><td><strong>DAW</strong> · Desarrollo de Aplicaciones Web</td><td>Superior</td><td>Aplicaciones que se usan en el navegador, del front al servidor</td></tr><tr><td><strong>DAM</strong> · Desarrollo de Aplicaciones Multiplataforma</td><td>Superior</td><td>Aplicaciones de escritorio y móvil</td></tr><tr><td><strong>ASIR</strong> · Administración de Sistemas Informáticos en Red</td><td>Superior</td><td>Servidores, redes y servicios de una organización</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Dos detalles que ahorran disgustos al elegir:</p>



<ul class="wp-block-list">
<li><strong>DAW y DAM comparten casi todo el primer curso.</strong> Si dudas entre los dos, el primer año te sirve igual.</li>



<li><strong>El reparto de módulos entre 1.º y 2.º lo decide cada comunidad autónoma</strong>, no el título estatal. Dos centros pueden dar el mismo módulo en cursos distintos, así que la guía buena es la de <em>tu</em> centro.</li>
</ul>



<h2 class="wp-block-heading">Los cinco errores del primer mes</h2>



<ol class="wp-block-list">
<li><strong>Confundir ruta absoluta con relativa.</strong> El archivo existe; lo que falla es desde dónde lo buscas.</li>



<li><strong>Usar carpetas con copias en vez de commits.</strong> <code>_final_BUENA</code> no es una versión, es una esperanza.</li>



<li><strong>Creer que Git y GitHub son lo mismo.</strong> Uno es el programa; el otro, una web donde dejar una copia.</li>



<li><strong>Pensar que el DNS es el hosting.</strong> El hosting es donde vive la web; el DNS solo dice en qué IP está. Cambiar uno no mueve el otro.</li>



<li><strong>Copiar comandos sin saber dónde estás.</strong> Antes de ejecutar nada, <code>pwd</code>.</li>
</ol>



<h2 class="wp-block-heading">Ejercicio de cinco minutos</h2>



<p class="wp-block-paragraph">Hazlo entero, en este orden. Si los cuatro pasos te salen, llegas al primer día con más base que la mayoría de la clase:</p>



<ol class="wp-block-list">
<li>Abre la terminal y ejecuta <code>pwd</code>. Crea una carpeta <code>practicas</code>, entra en ella y vuelve a ejecutarlo. ¿Ves cómo cambia la ruta?</li>



<li>Dentro, crea un archivo de texto cualquiera. Ejecuta <code>git init</code>, <code>git add .</code> y <code>git commit -m "Primer commit"</code>.</li>



<li>Ejecuta <code>git log --oneline</code>. Ese es tu historial.</li>



<li>Ejecuta <code>nslookup saseformacion.es</code> y <code>ipconfig</code> (o <code>ip a</code>). Localiza tu IP privada y la IP pública del sitio.</li>
</ol>



<h2 class="wp-block-heading">Por dónde seguir</h2>



<p class="wp-block-paragraph">Cada una de las tres ideas tiene su vídeo de un minuto, por si prefieres verlo antes de leerlo:</p>



<ul class="wp-block-list">
<li><a href="https://youtube.com/shorts/IqE0veP0OEk" target="_blank" rel="noreferrer noopener"><strong>Qué estudiarás en SMR, DAW, DAM y ASIR</strong></a> — los módulos reales de cada ciclo, uno por uno.</li>



<li><a href="https://youtube.com/shorts/tEK1CEbQOsI" target="_blank" rel="noreferrer noopener"><strong>Git: qué problema resuelve</strong></a> — los commits en movimiento, y la diferencia con GitHub.</li>



<li><a href="https://youtube.com/shorts/7Fd4wZgBbto" target="_blank" rel="noreferrer noopener"><strong>IP, router y DNS</strong></a> — la cadena completa desde que pulsas enter.</li>
</ul>



<p class="wp-block-paragraph">Y si algo de esto se te atraganta ya en septiembre, en SASE Formación damos clases de informática y programación, presenciales y online. <strong>La primera clase de prueba es gratuita</strong>, y en informática las clases son individuales. Escríbenos y nos cuentas por dónde vas: teléfono y WhatsApp <strong>656 251 438</strong>.</p>
<p>La entrada <a href="https://saseformacion.es/guia-de-arranque-lo-que-se-repite-en-todos-los-ciclos-de-informatica/">Guía de arranque: lo que se repite en todos los ciclos de informática</a> se publicó primero en <a href="https://saseformacion.es">SASE Formación</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://saseformacion.es/guia-de-arranque-lo-que-se-repite-en-todos-los-ciclos-de-informatica/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
