Desarrollo Básico

Hardcoded

Valores fijos escritos directamente en el código fuente en lugar de obtenerlos de configuración, base de datos o entrada del usuario. Una práctica generalmente desaconsejada.

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.

Pronunciación

IPA: /hɑːrd koʊdɪd/

Suena como: “jard-codid” - dos palabras, la ‘h’ se aspira suavemente

Errores comunes:

  • ❌ “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

ProblemaConsecuencia
Difícil de cambiarHay que modificar código, recompilar y redesplegar
InseguroCredenciales expuestas en repositorios
No escalableDiferentes valores para dev/staging/producción
Difícil de mantenerValores dispersos por todo el código
Rompe pruebasNo puedes usar valores de prueba fácilmente

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 diferentes → Imposible

Enfoque con configuración (flexible)

# config.py
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
  2. Diferentes precios por ambiente (dev/prod)
  3. Promociones instantáneas cambiando variables de entorno

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
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.