Introducción

Utilizar GitHub Copilot con instrucciones personalizadas y archivos de prompt reutilizables en Visual Studio Code puede marcar una gran diferencia en la calidad del código generado. A lo largo de esta guía, te mostraré cómo implementar esta técnica dentro de proyectos .NET aumentar la productividad y facilitar la colaboración en equipo.

¿Por qué es importante?

Las guías de codificación ayudan a mantener un código limpio, coherente y fácil de mantener. Son fundamentales para equipos de desarrollo, y aún más ahora que las herramientas de IA, como Copilot, participan activamente en la escritura y revisión de código.

Sin reglas claras, es fácil que estas herramientas introduzcan inconsistencias o aumenten la deuda técnica sin querer.

¿Qué es la Ingeniería de Prompts en este contexto?

En GitHub Copilot y VS Code, la ingeniería de prompts permite crear instrucciones reutilizables y específicas para tareas comunes como escribir código, generar pruebas, revisar fragmentos o redactar mensajes de commit. Esto se traduce en una experiencia más controlada y adaptada a tus necesidades reales.

Enlaces interesantes

Configurando Copilot

Para adaptar Copilot a tu estilo y convenciones, puedes usar su sistema de instrucciones personalizadas y activar los archivos de prompt reutilizables.

Ajusta tu configuración

Edita el archivo .vscode/settings.json e incluye lo siguiente y recuerda que debes añadirlo al repositorio de git para poder compartirlo con el equipo:

{
  "chat.promptFiles": true,
  "chat.promptFilesLocations": {
    ".github/prompts": true,
    ".vscode/prompts": true
  },
  "github.copilot.chat.codeGeneration.instructions": [
    { "file": ".vscode/rules/csharp/coding-guidelines.md" },
    { "file": ".vscode/rules/csharp/coding-style.md" }
  ],
  "github.copilot.chat.reviewSelection.enabled": true,
  "github.copilot.chat.reviewSelection.instructions": [
    { "file": ".vscode/rules/csharp/coding-guidelines.md" },
    { "file": ".vscode/rules/csharp/coding-style.md" }
  ],
  "github.copilot.chat.testGeneration.instructions": [
    { "file": ".vscode/rules/csharp/testing-xunit.md" }
  ],
  "github.copilot.chat.commitMessageGeneration.instructions": [
    { "file": ".vscode/rules/git-message.md" }
  ]
}

Puedes añadir más archivos a la carpeta .vscode/rules según lo necesites, y escribirlos en Markdown para una mejor organización.

Ejemplo: Guía de codificación personalizada

Un archivo como .vscode/rules/coding-guidelines.md podría tener el siguiente contenido:

---
description: 🧼 Guía para escribir código en C# que sea limpio, mantenible y alineado con patrones de diseño reconocidos. Este documento proporciona principios claros y recomendaciones prácticas para desarrollar software de alta calidad y fácil evolución.
---

# 👥 Roles involucrados

- 🏗️ **Arquitecto de Software**  
  Diseña estructuras escalables y garantiza la alineación con principios de arquitectura.

- 💡 **Experto en C#**  
  Aplica buenas prácticas específicas del lenguaje y se mantiene actualizado con sus características más modernas.

- 🔍 **Especialista en Calidad de Código**  
  Promueve estándares de codificación, revisa la calidad y asegura legibilidad y sostenibilidad.

- 🌱 **Promotor de Software Sostenible**  
  Se enfoca en prácticas que reduzcan la deuda técnica, fomenten la evolución del sistema a largo plazo y consideren la eficiencia en el uso de recursos computacionales.

---

# 🧭 Principios generales

## 👁️ Legibilidad y claridad

- ✅ Priorizar código autoexplicativo mediante **nombres descriptivos** para clases, métodos y variables.
- 🧠 Reducir la necesidad de comentarios gracias a una estructura clara y lógica.

## ⚙️ Uso de características modernas de C#

- ⬆️ Utilizar la **versión más actual** del lenguaje disponible en el proyecto.
- 🧵 Incorporar características como `async/await`, **pattern matching** (switch avanzado) y **colecciones inmutables**, siempre que sean adecuadas.

## 🔗 Gestión de dependencias

- 🚫 Evitar dependencias innecesarias que dificulten el mantenimiento o aumenten la complejidad.
- 🔄 Aplicar principios como **Inversión de Dependencias** para desacoplar módulos y facilitar pruebas.

## 🧊 Inmutabilidad y simplicidad

- 🔒 Favorecer el uso de **objetos inmutables** para evitar errores por efectos secundarios.
- ✂️ Diseñar métodos y clases con **baja complejidad ciclomática** para facilitar su lectura y pruebas.

## 🧱 Patrones de diseño

- 🧩 Aplicar **patrones reconocidos** (Repositorio, Fábrica, Estrategia...) cuando sean relevantes.
- ⚖️ Evitar la sobreingeniería: los patrones deben ser **herramientas útiles, no reglas absolutas**.

---

✨ **Esta guía busca ayudarte a escribir código que no solo funcione, sino que sea un activo sostenible y comprensible para cualquier miembro del equipo.**

Ejemplo: Guía de estilo personalizada

Un archivo como .vscode/rules/csharp/coding-style.md podría tener el siguiente contenido:

# 🎨 Guía de Estilo de Código C#

## 📦 Organización del código

- 📄 Una clase por archivo (salvo excepciones justificadas).
- 🧭 Orden recomendado de elementos:
  1. Campos estáticos
  2. Campos de instancia
  3. Constructores
  4. Propiedades
  5. Métodos públicos
  6. Métodos privados

## 🧹 Formato y espaciado

- 🔲 Indentación de 4 espacios.
- 📏 Líneas de máximo 120 caracteres.
- ➖ Línea en blanco entre métodos.
- 📐 Llaves en nueva línea:

```csharp
  if (condition)
  {
      DoSomething();
  }
```

## 🐪 Convenciones de nombres

- 🧱 Clases, interfaces, métodos públicos → PascalCase

- 🔧 Campos privados → _camelCase

- 💬 Parámetros y variables locales → camelCase

- 📐 Interfaces → prefijo I (e.g., IUserService)

## ⏱️ Métodos asíncronos

- ➕ Terminar con Async:

```csharp
public async Task<User> GetUserAsync(int id)
```
  
## 🧠 Uso de var
 - 👍 Solo cuando el tipo es evidente:

```csharp
  var order = new Order(); // Bien
  string name = "Carlos";  // Mejor explícito
```
##🔍 Usings
  
- 🧽 Eliminar usings no utilizados.
- 🧾 Agrupar por bloques:

```csharp
using System;
using System.Collections.Generic;

using Microsoft.Extensions.DependencyInjection;

using MyApp.Core.Repositories;
```

Reutilizando Prompts para Revisiones de Código

Los archivos .prompt.md también pueden ayudarte a estandarizar y automatizar partes del proceso de revisión de código. Aquí tienes algunos ejemplos pensados específicamente para reducir los comentarios repetitivos o evitar errores comunes antes de subir tu rama:

  • Revisión automatizada de pull requests (code-review.prompt.md): define un prompt que revise tu código antes de abrir el PR. Este prompt puede verificar convenciones, detectar patrones problemáticos (como funciones muy largas, nombres ambiguos o lógica duplicada) y sugerir mejoras directamente en base a tus reglas.
  • Checklist de calidad previa al PR (pre-push-checklist.prompt.md): Crea un archivo con una lista de verificación personalizada que Copilot puede seguir antes de que hagas push. Esto puede incluir: asegurar pruebas unitarias, confirmar que no hay TODOs, revisar nombres de commits, o comprobar si se respetaron las guías de estilo.
  • Generación de comentarios de revisión (review-comments.prompt.md): Genera comentarios automáticos que podrías usar durante una revisión de PR. Por ejemplo, Copilot puede ayudarte a detectar problemas en bucles anidados, posibles nulls no controlados o errores típicos al trabajar con LINQ o async/await.
  • Evaluación de cambios significativos (impact-analysis.prompt.md): Este prompt puede ayudarte a identificar rápidamente qué áreas del sistema podrían verse afectadas por tus cambios, sugiriendo qué deberías testear o documentar antes de subir tu código.

Aquí tienes un archivo .prompt.md pensado como checklist previa al push para evitar problemas comunes antes de abrir un Pull Request. Este archivo puede vivir como .vscode/prompts/pre-push-checklist.prompt.md:

---
description: Checklist de calidad previa al push
---

# Definición:

Antes de hacer *push* o abrir un Pull Request, realiza una revisión automática de la rama actual siguiendo esta checklist. El objetivo es asegurar calidad, coherencia con las guías del equipo, y evitar errores frecuentes en revisiones de código.

## Reglas y Validaciones

✅ **Estructura del código**
- El código sigue las guías de estilo definidas en `.vscode/rules/coding-style.md`.
- No hay bloques de código comentado innecesario ni `Console.WriteLine` o `Debug.WriteLine` olvidados.
- No hay `TODO`, `FIXME` o anotaciones temporales sin resolver.

✅ **Nombrado y legibilidad**
- Los nombres de clases, métodos y variables son claros y expresivos.
- No hay abreviaciones crípticas ni nombres genéricos como `data`, `temp`, `obj`.

✅ **Pruebas**
- Se han actualizado o agregado pruebas unitarias si el cambio lo requiere.
- Todas las pruebas pasan localmente (xUnit/NUnit/MSTest según corresponda).

✅ **Mensajes de commit**
- Los mensajes siguen la convención definida en `.vscode/rules/git-message.md`.
- Cada commit tiene un propósito claro y es autocontenible.

✅ **Impacto**
- Se ha evaluado el impacto del cambio en otras capas del sistema (servicios, controladores, persistencia).
- Se ha actualizado la documentación si el cambio lo amerita (README, comentarios, Wiki).

## Estructura esperada del análisis

- **Resumen general del estado del checklist**
- **Items cumplidos**
- **Items no cumplidos o con observaciones**
- **Recomendaciones para corrección**
- **Conclusión general (¿Es seguro hacer push?)**

✋ Si alguno de los puntos no se cumple, sugiere una acción concreta para corregirlo.

Algunas capturas del funcionamiento

Estructura del proyecto

Usando las Reglas

Usando prompts

Para terminar

Centralizar reglas de codificación y prompts personalizados en proyectos de desarrollo, representa una forma inteligente de escalar calidad y eficiencia en los equipos. Este enfoque no solo sirve para mantener la coherencia del código, sino también para guiar y potenciar el trabajo colaborativo, automatizar buenas prácticas y acelerar los flujos de trabajo técnicos y de revisión.

Cuando los prompts están bien diseñados —por ejemplo, para code review, generación de funcionalidades repetitivas, escribir el Readme.md o análisis de decisiones— permiten a los desarrolladores/as trabajar de forma más alineada, reduciendo el esfuerzo cognitivo y estandarizando procesos que suelen estar sujetos a interpretación o experiencia individual. Además, al facilitarle contexto a herramientas como GitHub Copilot, se maximiza su potencial para producir código útil, limpio y con menor necesidad de retrabajo.

En los equipos de desarrollo, esto se traduce en una menor fricción en los pull requests, menos discusiones subjetivas sobre estilo, y una cultura más transparente y orientada a la mejora continua. Los nuevos miembros pueden adaptarse más rápido, y los errores comunes se reducen al mínimo gracias a una guía clara y activa.

Sin embargo, también hay que tener cuidado: si las reglas son demasiado rígidas, extensas o mal comunicadas, pueden generar resistencia, limitar la creatividad o provocar que Copilot genere resultados incoherentes. El equilibrio está en definir estándares útiles, comprensibles y realistas, que sirvan tanto a humanos como a máquinas, y que evolucionen junto al proyecto.