23. Construcción del software: código, estándares y revisión

23.1 Introducción

La construcción del software es la actividad donde las ideas, requisitos, diseños y decisiones arquitectónicas se transforman en código ejecutable, configuraciones, scripts, integraciones y componentes funcionando.

Pero construir software profesionalmente no es solo escribir código que funcione una vez. También implica escribir código comprensible, seguir estándares, revisar cambios, probar comportamientos y mantener una base técnica que pueda evolucionar.

En este tema veremos prácticas fundamentales para construir software con calidad interna: código claro, estándares, convenciones, revisión de código y disciplina técnica.

23.2 ¿Qué incluye la construcción del software?

Construir software incluye varias tareas relacionadas con la implementación de la solución:

  • Escribir código fuente.
  • Crear estructuras de datos y bases de datos.
  • Implementar reglas de negocio.
  • Construir interfaces de usuario.
  • Integrar APIs o sistemas externos.
  • Configurar ambientes y dependencias.
  • Escribir pruebas técnicas.
  • Corregir defectos.
  • Preparar scripts de compilación, migración o despliegue.
Idea clave: construir software profesionalmente significa producir una solución que funcione y que además pueda leerse, probarse, modificarse y mantenerse.

23.3 Código claro

El código no solo lo interpreta una computadora. También lo leen personas: el equipo actual, futuros mantenedores y nosotros mismos tiempo después. Por eso, la claridad es una característica de calidad.

Un código claro suele tener:

  • Nombres significativos.
  • Funciones con responsabilidades concretas.
  • Estructura coherente.
  • Baja duplicación.
  • Reglas ubicadas en lugares esperables.
  • Comentarios útiles cuando el motivo no es evidente.
  • Consistencia con el resto del proyecto.

La claridad reduce el tiempo necesario para entender, corregir y extender el sistema.

23.4 Nombres significativos

Los nombres comunican intención. Un buen nombre evita tener que adivinar qué representa una variable, función, clase, módulo o archivo.

Nombre débil Problema Nombre más claro
dato No indica qué contiene. clienteSeleccionado
procesar No explica qué procesa. procesarPago
validar Es demasiado general. validarDisponibilidadDeTurno
manager No comunica responsabilidad concreta. gestorDeReservas

Un nombre no debe ser largo sin motivo, pero sí suficientemente preciso para comunicar intención.

23.5 Funciones y responsabilidades

Una función, método o procedimiento debería tener una responsabilidad clara. Cuando una función hace demasiadas cosas, es más difícil de leer, probar y modificar.

Señales de una función con demasiadas responsabilidades:

  • Es muy extensa.
  • Mezcla validaciones, cálculos, persistencia y presentación.
  • Necesita muchos parámetros sin relación clara.
  • Su nombre requiere palabras como "y", "también" o "general".
  • Modificar una parte puede romper otra no relacionada.

Dividir una función puede mejorar claridad, pero dividir sin criterio también puede dificultar la lectura. El objetivo es separar conceptos, no fragmentar artificialmente.

23.6 Estándares de código

Un estándar de código define reglas y convenciones que el equipo sigue al escribir software. Su objetivo es lograr consistencia y evitar discusiones repetitivas sobre estilo.

Puede incluir acuerdos sobre:

  • Nombres de archivos, clases, funciones y variables.
  • Formato e indentación.
  • Organización de carpetas.
  • Uso de comentarios.
  • Manejo de errores.
  • Estructura de pruebas.
  • Convenciones para mensajes de cambios.
  • Reglas de seguridad o validación.

Los estándares deben ser conocidos, razonables y, cuando sea posible, automatizados con herramientas.

23.7 Consistencia

La consistencia hace que un proyecto sea más predecible. Cuando el equipo sigue patrones similares, es más fácil encontrar archivos, entender decisiones y trabajar en partes nuevas del sistema.

La consistencia se aplica a:

  • Estructura de módulos.
  • Forma de nombrar elementos.
  • Estilo de código.
  • Manejo de errores.
  • Organización de pruebas.
  • Formato de respuestas de APIs.
  • Mensajes visibles para usuarios.
  • Documentación técnica.

Un proyecto consistente reduce carga mental porque el equipo no debe aprender una forma distinta de trabajar en cada archivo.

23.8 Comentarios útiles

Los comentarios deben aportar información que el código por sí solo no expresa con claridad. No deberían repetir literalmente lo que una línea ya dice.

Comentarios útiles suelen explicar:

  • Por qué se tomó una decisión no evidente.
  • Qué regla de negocio justifica una condición.
  • Qué limitación externa se está contemplando.
  • Qué riesgo o caso especial se evita.
  • Qué comportamiento temporal debe revisarse luego.

Si un comentario explica algo que podría aclararse con mejores nombres o mejor estructura, quizá conviene mejorar el código en lugar de agregar más texto.

23.9 Manejo de errores

El manejo de errores es parte esencial de la construcción. Un sistema profesional no solo debe funcionar cuando todo sale bien; también debe responder adecuadamente ante entradas inválidas, fallas externas, datos inconsistentes o permisos insuficientes.

Buenas prácticas iniciales:

  • Validar entradas en puntos adecuados.
  • Mostrar mensajes comprensibles al usuario.
  • Registrar detalles técnicos útiles para diagnóstico.
  • No exponer información sensible en mensajes de error.
  • Distinguir errores esperados de fallas inesperadas.
  • Definir respuestas consistentes en APIs.
  • Considerar reintentos o alternativas cuando fallan servicios externos.

23.10 Revisión de código

La revisión de código es una práctica en la que una o más personas revisan cambios antes de integrarlos definitivamente. Su objetivo es mejorar calidad, detectar defectos, compartir conocimiento y mantener consistencia.

Una revisión puede detectar:

  • Errores lógicos.
  • Falta de casos de prueba.
  • Duplicación innecesaria.
  • Problemas de seguridad.
  • Inconsistencias con estándares del proyecto.
  • Diseño difícil de mantener.
  • Nombres poco claros.
  • Impactos no considerados.

Una buena revisión no busca culpar, sino mejorar el resultado y distribuir conocimiento.

23.11 Qué revisar en un cambio

Al revisar código conviene mirar más que formato. Algunos puntos importantes son:

Aspecto Preguntas útiles
Correctitud ¿Cumple el requerimiento? ¿Maneja casos normales y excepciones?
Claridad ¿Se entiende la intención? ¿Los nombres son adecuados?
Diseño ¿Las responsabilidades están bien ubicadas? ¿Hay acoplamiento innecesario?
Pruebas ¿Existen pruebas relevantes? ¿Cubren casos importantes?
Seguridad ¿Hay validaciones, permisos y protección de datos?
Mantenibilidad ¿Será razonable modificar esto dentro de meses?
Consistencia ¿Sigue patrones y estándares del proyecto?

23.12 Revisión automatizada

Algunas verificaciones pueden automatizarse para ahorrar tiempo y reducir errores repetitivos. Esto permite que las personas se concentren en diseño, lógica y riesgos.

Ejemplos de revisión automatizada:

  • Formateo automático de código.
  • Reglas de estilo mediante linters.
  • Análisis estático para detectar problemas comunes.
  • Pruebas unitarias e integración.
  • Verificación de cobertura.
  • Escaneo de dependencias vulnerables.
  • Validación de tipos en lenguajes o herramientas que lo soportan.

Automatizar no reemplaza el criterio humano, pero sí evita revisar manualmente aspectos mecánicos.

23.13 Pruebas durante la construcción

Las pruebas no deben aparecer únicamente al final. Durante la construcción, el equipo puede escribir y ejecutar pruebas para obtener retroalimentación rápida.

Algunas pruebas habituales en esta etapa son:

  • Pruebas unitarias para funciones o clases específicas.
  • Pruebas de integración entre módulos.
  • Pruebas de componentes.
  • Pruebas de contrato para APIs.
  • Pruebas manuales enfocadas en casos recién implementados.
  • Pruebas de regresión sobre funcionalidades existentes.

Probar durante la construcción reduce el costo de corrección porque los problemas se detectan cerca del momento en que se introducen.

23.14 Integración frecuente

Integrar frecuentemente significa combinar los cambios del equipo en una base común con regularidad. Esto reduce el riesgo de acumular diferencias grandes y conflictos difíciles.

Beneficios:

  • Detectar incompatibilidades temprano.
  • Reducir conflictos grandes de código.
  • Validar que el sistema sigue construyéndose correctamente.
  • Ejecutar pruebas automáticas con frecuencia.
  • Dar visibilidad al avance real.
  • Evitar ramas de trabajo demasiado largas sin validar.

La integración frecuente se relaciona con control de versiones e integración continua, que veremos en temas posteriores.

23.15 Calidad interna

La calidad interna se refiere a características del código y la estructura que quizá el usuario no ve directamente, pero que afectan mantenimiento, evolución y confiabilidad.

Ejemplos de calidad interna:

  • Código claro y organizado.
  • Baja duplicación.
  • Pruebas relevantes.
  • Dependencias controladas.
  • Reglas de negocio ubicadas coherentemente.
  • Errores manejados correctamente.
  • Configuración separada del código.
  • Documentación mínima útil.

Descuidar la calidad interna puede no notarse al principio, pero vuelve más costoso cada cambio futuro.

23.16 Ejemplo: implementar cancelación de reserva

Supongamos que se implementa la funcionalidad "cancelar reserva". Una construcción profesional debería considerar:

  • Requisito: el usuario puede cancelar hasta dos horas antes.
  • Regla de negocio: no se permite cancelar reservas ya utilizadas.
  • Diseño: la regla vive en el módulo de reservas, no en la pantalla.
  • Código: nombres claros como cancelarReserva y validarPlazoDeCancelacion.
  • Errores: mensaje claro si la cancelación no está permitida.
  • Pruebas: cancelación válida, fuera de plazo, reserva inexistente y reserva ya cancelada.
  • Revisión: verificar que no se dupliquen reglas y que se actualice el cupo.
  • Trazabilidad: relacionar código y pruebas con el requerimiento.

Esto muestra que construir no es solo escribir la operación principal, sino cuidar reglas, diseño, pruebas y mantenimiento.

23.17 Errores comunes

Durante la construcción suelen aparecer errores como:

  • Programar directamente sin revisar requisito ni diseño.
  • Duplicar lógica porque parece más rápido.
  • Ignorar estándares del proyecto.
  • Escribir nombres genéricos que no comunican intención.
  • Mezclar presentación, negocio y acceso a datos sin necesidad.
  • No manejar errores esperados.
  • Dejar pruebas para el final.
  • Revisar solo formato y no lógica o diseño.
  • Integrar cambios grandes demasiado tarde.

23.18 Buenas prácticas

Algunas prácticas recomendables son:

  • Comprender el requerimiento antes de implementar.
  • Seguir estándares y patrones del proyecto.
  • Escribir código claro y consistente.
  • Ubicar responsabilidades en módulos adecuados.
  • Automatizar formato, análisis y pruebas cuando sea posible.
  • Revisar código con foco en calidad y aprendizaje.
  • Integrar cambios con frecuencia.
  • Refactorizar cuando el código empieza a dificultar cambios.
  • Registrar decisiones relevantes si no son evidentes.

23.19 Qué debes recordar de este tema

  • Construir software profesionalmente implica más que escribir código que funcione.
  • El código debe ser claro, consistente, verificable y mantenible.
  • Los estándares de código reducen discusiones repetitivas y mejoran consistencia.
  • La revisión de código ayuda a detectar problemas y compartir conocimiento.
  • Las pruebas deben acompañar la construcción, no quedar solo para el final.
  • La calidad interna afecta directamente el costo de mantenimiento.
  • La automatización ayuda a controlar aspectos mecánicos de calidad.

23.20 Conclusión

La construcción del software convierte requisitos y diseños en una solución ejecutable. Pero su calidad no depende solo de que el código funcione hoy, sino de que pueda entenderse, probarse, revisarse y modificarse mañana.

Para quien comienza, la idea principal es esta: el código profesional debe resolver el problema y al mismo tiempo cuidar la claridad, la consistencia y la mantenibilidad del sistema.

En el próximo tema veremos control de versiones y trabajo colaborativo, una práctica fundamental para coordinar cambios y sostener el desarrollo en equipo.