DesarrolloBásico

Hardcoded

Valores fijos escritos dentro del código en vez de leerse de configuración o base de datos. Encarece cada cambio y es una mala práctica conocida.

Pronunciación

/hɑːrd koʊdɪd/
"jard-codid"
Escuchar en:Forvo Cambridge

Qué es

Hardcoded (o “hardcodeado” en spanglish) significa escribir valores fijos directamente en el código fuente, en lugar de obtenerlos de una fuente externa como:

  • Variables de entorno
  • Archivos de configuración
  • Base de datos
  • Entrada del usuario

Es una de las malas prácticas más comunes en desarrollo de software.

Errores comunes de pronunciación

  • ❌ “ar-coded” (la ‘h’ no es muda en inglés)
  • ❌ “hard-codead” (no termina en ‘ead’)

Variantes aceptadas:

  • Hard-coded (con guión)
  • Hardcoded (junto)
  • Hard coded (separado)

Ejemplo: El Número de Teléfono que Nadie Puede Cambiar

Código hardcodeado (MAL)

// ❌ MAL: Número hardcodeado
function enviarSMS(mensaje) {
  const telefono = "+52-555-123-4567";  // 😱 Hardcodeado
  smsService.send(telefono, mensaje);
}

// ❌ MAL: URL hardcodeada
function obtenerUsuarios() {
  const url = "https://api.miempresa.com/users";  // 😱 Hardcodeado
  return fetch(url);
}

// ❌ MAL: Credenciales hardcodeadas (PELIGROSO)
function conectarDB() {
  const password = "admin123";  // 🚨 NUNCA hagas esto
  return db.connect("admin", password);
}

Código correcto (BIEN)

// ✅ BIEN: Desde variable de entorno
function enviarSMS(mensaje) {
  const telefono = process.env.SMS_PHONE_NUMBER;
  smsService.send(telefono, mensaje);
}

// ✅ BIEN: Desde configuración
function obtenerUsuarios() {
  const url = config.api.usersEndpoint;
  return fetch(url);
}

// ✅ BIEN: Credenciales desde entorno
function conectarDB() {
  const password = process.env.DB_PASSWORD;
  return db.connect(process.env.DB_USER, password);
}

Por qué es un problema

Problema Consecuencia
Difícil de cambiar Hay que modificar código, recompilar y redesplegar
Inseguro Credenciales expuestas en repositorios
No escalable Diferentes valores para dev/staging/producción
Difícil de mantener Valores dispersos por todo el código
Rompe pruebas No puedes usar valores de prueba fácilmente

Por qué importa para tu empresa

Para quien contrata o evalúa software, esto no es un detalle técnico: es lo que hace que un cambio trivial cueste caro.

  • Un cambio de un minuto tarda días. Subir un precio, cambiar el correo de notificación o el porcentaje de un impuesto debería ser editar un campo. Si está fijo en el código, hay que modificarlo, probarlo y desplegar una versión nueva.
  • Te ata a quien lo escribió. Si solo se puede cambiar tocando el código, dependes de ese proveedor, de su agenda y de su tarifa.
  • Es un riesgo de seguridad. Las contraseñas y llaves escritas en el código terminan copiadas en cada respaldo y en cada equipo que tenga una copia del repositorio.
  • Encarece cada ambiente. Probar en un entorno de pruebas obliga a duplicar y editar código, en vez de cambiar una configuración.

La pregunta que conviene hacer antes de aceptar una entrega: ¿qué puedo cambiar yo sin llamar al proveedor? Si la respuesta es “nada”, cada ajuste futuro llegará como una cotización.

Es una de las formas más comunes de deuda técnica y un punto fijo de revisión en nuestro trabajo de modernización de sistemas legacy.

Caso Práctico: La Pizzería y sus Precios

Imagina que tienes un sistema de pedidos para tu pizzería.

Enfoque hardcodeado (problemas garantizados)

# precios.py - ❌ MAL
def calcular_total(pizzas, bebidas):
    precio_pizza = 150  # 😱 Hardcodeado
    precio_bebida = 35  # 😱 Hardcodeado
    iva = 0.16          # 😱 Hardcodeado

    subtotal = (pizzas * precio_pizza) + (bebidas * precio_bebida)
    return subtotal * (1 + iva)

Problemas:

  1. El IVA sube a 17% → Hay que buscar todos los “0.16” en el código
  2. Promoción de pizzas a $120 → Modificar código, probar, desplegar
  3. Sucursal en otro país con precios e impuestos diferentes → Hay que duplicar o bifurcar el código

Enfoque con configuración (flexible)

# config.py
import os

PRECIOS = {
    "pizza": float(os.getenv("PRECIO_PIZZA", 150)),
    "bebida": float(os.getenv("PRECIO_BEBIDA", 35)),
    "iva": float(os.getenv("IVA", 0.16)),
}

# precios.py - ✅ BIEN
from config import PRECIOS

def calcular_total(pizzas, bebidas):
    subtotal = (pizzas * PRECIOS["pizza"]) + (bebidas * PRECIOS["bebida"])
    return subtotal * (1 + PRECIOS["iva"])

Beneficios:

  1. Cambiar precios sin tocar código (basta con reiniciar o redesplegar con otra configuración)
  2. Diferentes precios por ambiente (dev/prod)
  3. Para valores que cambian a menudo, como promociones, lo ideal es guardarlos en base de datos

Cuándo SÍ es aceptable hardcodear

A veces tiene sentido tener valores fijos:

// ✅ Constantes matemáticas
const PI = 3.14159265359;

// ✅ Valores que NUNCA cambian
const DIAS_SEMANA = 7;
const HORAS_DIA = 24;

// ✅ Valores por defecto (con opción de override)
const TIMEOUT = config.timeout || 5000;  // Default: 5 segundos

// ✅ Enums o estados fijos
const ESTADOS = {
  PENDIENTE: "pending",
  COMPLETADO: "completed",
  CANCELADO: "cancelled"
};

Cómo identificar código hardcodeado

Señales de alerta en tu código:

🚨 Strings con URLs completas
🚨 Números mágicos (42, 1000, 3600)
🚨 Credenciales o tokens
🚨 Rutas de archivos absolutas
🚨 Direcciones de email
🚨 Nombres de servidores
🚨 Puertos específicos

Cómo solucionarlo

1. Variables de entorno

# .env  (no lo subas al repositorio: agrégalo a .gitignore)
DATABASE_URL=postgres://user:pass@localhost:5432/mydb
API_KEY=sk-1234567890
MAX_CONNECTIONS=100

2. Archivos de configuración

// config.json
{
  "api": {
    "baseUrl": "https://api.example.com",
    "timeout": 5000
  }
}

3. Constantes nombradas

// constants.js
export const MAX_RETRY_ATTEMPTS = 3;
export const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos

Términos relacionados

  • Refactoring - Proceso de mejorar código sin cambiar su comportamiento
  • Environment Variables - Variables configuradas fuera del código
  • Configuration Management - Gestión de configuración de aplicaciones

Recuerda: Si alguna vez piensas “esto nunca va a cambiar”, probablemente cambiará. Mejor usar configuración desde el inicio.