Criterios para que un desarrollador junior que trabaja solo en una startup termine un sprint sin horas extra
Al desarrollar frontend solo, sin un mentor, uno se siente perseguido por la incertidumbre técnica. Se repite un patrón en el que se tiene el libro de Clean Code al lado, se piensa en una abstracción perfecta y, al final, se sufre un desgaste (burnout) justo antes de la fecha límite del sprint. Lo que se necesita no es una arquitectura impecable, sino criterios realistas para entregar un producto que funcione a tiempo.
La abstracción incorrecta es más costosa que la duplicación de código
Sandy Metz, experta en diseño de software, señala que el costo de eliminar una abstracción incorrecta es mucho mayor que el costo de mantener código duplicado. De hecho, Dan Abramov también advirtió que la eliminación excesiva de duplicación arruina la flexibilidad de los componentes.
Los problemas causados por una simple copia de código se pueden corregir dentro del archivo correspondiente en unos 50 minutos. Por el contrario, un hook común creado prematuramente o una estructura de herencia genera numerosas ramificaciones if-else con el más mínimo cambio en los requisitos. Al final, encontrar los errores lleva más de dos semanas.
La decisión de refactorizar se toma basándose en el cuadrante de deuda técnica de Martin Fowler y en el análisis de puntos críticos (hotspots) de Adam Tornhill.
| Área |
Criterio (Complejidad y Frecuencia de cambio) |
Forma de respuesta |
| Modificación inmediata |
Alto impacto en el negocio × Alta frecuencia de cambio |
Escribir pruebas y organizar interfaces inmediatamente después de implementar la función, luego desplegar |
| Modificación opcional |
Alto impacto en el negocio × Baja frecuencia de cambio |
Registrar como ticket de deuda en el backlog |
| Desplegar por ahora |
Bajo impacto en el negocio × Alta frecuencia de cambio |
Verificar solo el funcionamiento mínimo y desplegar, prohibida la abstracción |
| Posponer trabajo |
Bajo impacto en el negocio × Baja frecuencia de cambio |
Omitir la modificación aunque el código esté desordenado |
Orden de trabajo para la clasificación de código
- Comprueba si el componente en el que estás trabajando es una lógica central (hotspot) como pagos o autenticación, o simplemente una vista de promoción.
- Si es una vista de promoción, escríbela de manera inline dentro del componente en lugar de diseñar un custom hook común.
- Copia y pega el código hasta que el mismo comportamiento de UI se repita 3 veces o más.
Al aplicar este criterio, puedes reducir el tiempo dedicado a trabajos de generalización innecesarios y acelerar la velocidad general de desarrollo.
Configuración de análisis estático para reducir los comentarios en la revisión de código
Las observaciones de estilo como nombres de variables, saltos de línea o violaciones de reglas de lint deben filtrarse con herramientas.
Según un estudio de SmartBear que analizó 2,500 revisiones de código en Cisco Systems, entre el 70% y el 90% de los defectos se descubren cuando el volumen de código revisado a la vez es inferior a 200 líneas. Si el autor deja un comentario explicando el motivo del cambio directamente en el PR, la densidad de defectos se reduce en promedio un 30%.
Orden de análisis estático y auto-revisión
- Registra las reglas de React y TypeScript en ESLint 9 Flat Config.
- Vincula Husky y lint-staged para forzar la verificación de formato en el momento del commit.
- Antes de subir un PR, verifica que tenga menos de 300 líneas de lógica pura y deja comentarios de autorrevisión en las ramas complejas.
`javascript
// eslint.config.js
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import pluginReact from "eslint-plugin-react";
import pluginReactHooks from "eslint-plugin-react-hooks";
import eslintConfigPrettier from "eslint-config-prettier/flat";
export default tseslint.config(
{ ignores: ["dist/", "node_modules/", "build/"] },
js.configs.recommended,
...tseslint.configs.recommended,
pluginReact.configs.flat.recommended,
eslintConfigPrettier,
{
files: ["**/*.{js,jsx,ts,tsx}"],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: globals.browser,
},
plugins: {
"react-hooks": pluginReactHooks,
},
rules: {
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
},
settings: {
react: { version: "detect" },
},
}
);
`
Aplicar esta configuración al repositorio te permite reducir los comentarios de revisión relacionados con el estilo y concentrarte en la validación de la lógica real.
Timeboxing para separar la implementación de la limpieza
Modificar la estructura mientras se desarrolla una funcionalidad desorganiza el contexto del trabajo. Según investigaciones de ingeniería de Google, cuando los PR se dividen en unidades pequeñas y se especifica la intención del trabajo, el tiempo de espera para la revisión del código se reduce de 48 horas a 4 horas.
El tiempo de trabajo diario se controla dividiéndolo en sesiones.
- El 70% de la jornada se dedica a implementar funcionalidades. Se centra en garantizar que los requisitos de la pantalla y el flujo de datos funcionen correctamente, permitiendo código duplicado.
- El 20% de la jornada se dedica a limpiar el código. Solo se abordan la modificación de nombres de variables dentro del ámbito, la limpieza de importaciones no utilizadas y las mejoras de tipos; no se realizan grandes reestructuraciones.
- El 10% del tiempo de trabajo semanal se asigna los viernes por la tarde a una sesión de liquidación de deudas. Una vez finalizados los despliegues, se mejora la estructura de los módulos de puntos críticos registrados en el backlog.
Plantilla de PR que especifica el alcance de tolerancia de defectos
- Escribe los elementos de deuda técnica permitidos en el cuerpo del PR.
- Deja como lista de verificación las áreas donde el funcionamiento de la funcionalidad es correcto pero se pospuso la refactorización.
- Envía el PR después de registrar dichos elementos como tickets para la sesión de liquidación del viernes.
`markdown
개요
- 작업 내용: 유저 프로필 수정 및 API 연동
- 관련 이슈: #104
결함 허용 및 등록된 부채
- 허용된 부채: 프로필 컴포넌트 내 스타일 로직 중복 (3회 미만 중복)
- 허용된 부채: 에러 응답 시 alert 처리 (Toast 컴포넌트 연동 미룸)
- 필수 리뷰 대상: 런타임 오류 및 비즈니스 데이터 처리 로직
`
Esto induce a los revisores a centrar sus comentarios en la lógica central en lugar de en estilos secundarios, acortando el tiempo de aprobación.
Despliegue progresivo para reducir los efectos secundarios
Reescribir por completo el código existente aumenta el riesgo de que ocurran fallos en el entorno de producción. Michael Feathers aconseja que al modificar código legacy, en lugar de cambiar toda la estructura, primero se deben escribir pruebas de caracterización que fijen el comportamiento actual de entrada y salida.
Para evitar que toda la pantalla se quede en blanco cuando ocurre un error en tiempo de ejecución, se configura un límite de errores (ErrorBoundary).
`typescript
// components/ErrorBoundary.tsx
import React, { Component, ErrorInfo, ReactNode } from "react";
import * as Sentry from "@sentry/react";
interface Props {
children: ReactNode;
fallbackUI?: ReactNode;
}
interface State {
hasError: boolean;
}
export class GlobalErrorBoundary extends Component<Props, State> {
public state: State = { hasError: false };
public static getDerivedStateFromError(_: Error): State {
return { hasError: true };
}
public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
Sentry.captureException(error, { extra: { componentStack: errorInfo.componentStack } });
}
public render() {
if (this.state.hasError) {
return (
this.props.fallbackUI || (
UI 로딩 중 오류가 발생했습니다.
새로고침을 하거나 잠시 후 다시 시도해 주세요.
)
);
}
return this.props.children;
}
}
`
Procedimiento de despliegue progresivo
- Antes de tocar la lógica legacy, añade pruebas que verifiquen el valor de retorno actual y envuelve la interfaz con una capa de fachada (facade).
- Comprueba el estado de la comunicación API en un entorno de despliegue de vista previa (preview), y abre las nuevas funciones primero a un pequeño grupo de usuarios mediante un Feature Flag.
- Si la tasa de errores supera el 5% en la monitorización de Sentry tras el despliegue, ejecuta inmediatamente el comando de reversión.
`bash
git revert HEAD --no-edit
git push origin main
`
Dividir las unidades de trabajo en partes pequeñas y crear un entorno al que se pueda volver en caso de fallo permite controlar la ansiedad ante la modificación de código. Entregar a tiempo un sistema que funciona, en lugar de una estructura perfecta, es la base de la ingeniería práctica.