The other side of innovation.

Tu app la van a usar 50 personas. ¡Relájate!

Confesiones de un ex adicto a los design patterns.
Tu app la van a usar 50 personas. ¡Relájate!

Confesiones de un ex adicto a los design patterns


Ayer encontré código que escribí en 2020. Creé un sistema de notificaciones con Event Sourcing, CQRS y 3 microservicios para una app de recordatorios personales.

Usuarios totales: yo.

Ni siquiera la usé. Era más fácil poner alarmas en el celular.

El momento en que todo de jode

Hay un punto exacto en la carrera de todo dev donde el cerebro se rompe. Generalmente ocurre 2 semanas después de terminar un curso de "Clean Architecture".

De repente, esto:

const total = price * quantity;

Se convierte en esto:

// calculator.module.ts
// calculator.service.ts  
// multiplication.strategy.ts
// calculation-context.dto.ts
// i-arithmetic-operation.ts

const strategy = this.factory.create(OperationType.MULTIPLY);
const context = this.contextBuilder.build({ price, quantity });
const total = strategy.execute(context);

40 líneas de arquitectura para multiplicar dos números.

En algún momento entre el curso y el código, se perdió la capacidad de escribir a * b.

Código real que he visto (y escrito)

El Logger Empresarial™

// Solo quería hacer console.log("Usuario creado")

@Injectable()
class LoggingService {
  constructor(
    private readonly config: LogConfig,
    private readonly formatter: LogFormatter,
    private readonly transport: LogTransport,
    private readonly sanitizer: LogSanitizer,
  ) {}
  
  log(level: LogLevel, message: string, meta?: LogMeta): void {
    const sanitized = this.sanitizer.sanitize(message);
    const formatted = this.formatter.format(level, sanitized, meta);
    this.transport.send(formatted);
  }
}

// Uso:
this.logger.log(LogLevel.INFO, "Usuario creado", { userId: user.id });

// Lo que necesitaba:
console.log("Usuario creado:", user.id);

¿El proyecto? Un script interno que corría una vez al mes.

La validación de email "Escalable"

// email-validator.ts
// email-validation-rule.interface.ts
// email-format-rule.ts
// email-domain-rule.ts
// email-validation-chain.ts
// email-validator.factory.ts

// 6 archivos para esto:
const isValid = email.includes("@");

"Pero qué pasa si necesitamos validaciones más complejas..."

Spoiler: No las necesitamos. Han pasado 3 años.

La regla de oro

Antes de crear una abstracción, pregúntate:

¿Tengo más de una implementación AHORA MISMO?

No "algún día". No "por si acaso". Ahora.

Si la respuesta es no, escribe el código más simple y aburrido que funcione.

El futuro que imaginas no va a llegar. Y si llega, será tan diferente que tu "preparación" será inútil.

La verdad incómoda

El código más mantenible que he visto parece escrito por un junior. Funciones cortas. Nombres obvios. Cero magia.

El código menos mantenible parece un paper académico. Hermoso en diagramas. Un infierno a las 3am.

Tu código no necesita escalar a millones. Necesita:

  • Funcionar
  • Ser entendible
  • No hacerte llorar en 6 meses

La arquitectura es deuda. La complejidad es interés compuesto.

La mayoría de apps solo necesitan funcionar.

Suscribe to my newsletter

No spam, no sharing to third party. Only you and me.

Member discussion