Tema: coding-practice
-
Diseñar una herramienta de línea de comandos en Python: argparse, main() y códigos de salida
Colocar la interfaz en una función main(argv) -> int registrada como console script, validar con type y choices de argparse, seguir la convención de códigos de salida (0 éxito, 2 error de uso, 1 otro fallo, códigos de sysexits solo si están documentados), mantener los resultados en stdout y los diagnósticos en stderr, y gestionar SIGINT y las tuberías rotas.
-
Convenciones de inyección de dependencias en .NET: tiempos de vida, ámbitos y la trampa de la dependencia cautiva
Microsoft.Extensions.DependencyInjection registra servicios en un IServiceCollection con tiempo de vida transient, scoped o singleton, y los inyecta mediante constructores públicos; las reglas documentadas son nunca inyectar un servicio scoped en un singleton, dejar que el contenedor libere lo que creó, evitar llamadas de tipo localizador de servicios, y validar los ámbitos para que las dependencias cautivas fallen al arrancar en lugar de filtrar estado entre solicitudes.
-
Comentarios que aportan información que el código no puede dar
Escribir comentarios para explicar el porqué, las restricciones y las consecuencias no evidentes; no repetir lo que el código ya dice. Mantener los comentarios junto al código que describen, eliminarlos cuando el motivo desaparece, y preferir un mejor nombre o una prueba antes que un comentario.
-
Refactorizar en pasos pequeños y verificados
Refactorizar cambia la estructura sin cambiar el comportamiento; hacerlo en pasos diminutos con las pruebas en verde entre paso y paso, y separar los commits de refactorización de los cambios de comportamiento, lo mantiene seguro y revisable.
-
La deuda técnica como decisión consciente con contabilidad
La metáfora de Cunningham: el código que no es del todo correcto es un crédito, y cada minuto de trabajo extra que exige es el interés. La metáfora solo funciona si la deuda se contrae de forma consciente, se anota y se evalúa con regularidad; como término genérico para todo lo que resulta feo, o como excusa para el descuido, carece de valor.
-
Prácticas de trabajo para un agente de IA que modifica una base de código
Leer antes de escribir, reproducir antes de corregir, cambiar en pasos pequeños y verificados, ejecutar las comprobaciones propias del proyecto, nunca reintentar escrituras a ciegas e informar exactamente qué se probó; una metodología para agentes que editan código.
-
Estrechamiento de tipos en TypeScript: uniones, unknown y any
TypeScript reduce un tipo de unión dentro de una rama tras comprobaciones de typeof, instanceof, in, igualdad y veracidad, o tras un predicado de tipo definido por el usuario; las uniones discriminadas junto con una comprobación de never dan exhaustividad. unknown acepta cualquier valor pero prohíbe usarlo hasta que se estrecha, mientras que any desactiva la comprobación.
-
La deuda técnica como metáfora y como decisión
La deuda técnica describe el coste futuro de un atajo; la metáfora resulta útil cuando la deuda es deliberada y se registra, y engañosa cuando sirve para excusar un trabajo descuidado o para describir cualquier imperfección.
-
Nombrar identificadores para que el código se lea como intención
Elegir nombres que expresen qué es o qué hace algo en el vocabulario del dominio, con una longitud proporcional a su alcance; evitar codificaciones, abreviaturas y tipos engañosos, y renombrar a medida que mejora la comprensión.
-
Nomenclatura y capitalización consistentes de los campos JSON
Elegir una única convención de capitalización para los nombres de propiedad y aplicarla en todas partes: la guía de estilo JSON de Google y ProtoJSON usan lowerCamelCase, mientras que muchas APIs usan snake_case. Más allá de la capitalización, conviene mantener nombres con significado, los enums como cadenas, las marcas de tiempo como cadenas RFC 3339 y los enteros de 64 bits como cadenas.
-
Gestores de contexto en Python: garantizar la limpieza
La sentencia with ejecuta __enter__ y __exit__ alrededor de un bloque para que los archivos, los bloqueos y las conexiones se liberen incluso cuando ocurre una excepción; contextlib.contextmanager convierte un generador en uno de ellos.
-
Validar JSON con JSON Schema
JSON Schema describe la forma permitida de un documento (tipos, claves obligatorias, enumeraciones, formatos, límites) y permite validar entradas en cualquier lenguaje antes de procesarlas; conviene mantener additionalProperties explícito.
-
Docstrings que las herramientas y las personas lectoras pueden usar
El PEP 257 define dónde van los docstrings y cómo se formatean; un estilo consistente (Google o NumPy) con un resumen de una línea, descripciones de argumentos y de retorno y las excepciones lanzadas los hace utilizables por lectores, editores y generadores de documentación.
-
Números en coma flotante: por qué 0.1 + 0.2 no es 0.3
La coma flotante binaria representa la mayoría de las fracciones decimales de forma aproximada, por lo que la aritmética acumula error de redondeo; conviene comparar con tolerancias, sumar con cuidado, usar enteros o tipos decimales para dinero y recuentos, e imprimir con suficientes dígitos para permitir una reconversión exacta (round-trip).
-
El formateo y el linting automatizados como contrato de equipo
Delegar el formato en un formateador y las comprobaciones mecánicas en un linter elimina los debates de estilo de la revisión; EditorConfig, PEP 8 y herramientas como Ruff muestran cómo puede codificarse el contrato en el repositorio.
-
Escalado de características y codificación categórica: qué transformar, y ajustarlo solo con datos de entrenamiento
Los modelos basados en distancias y en gradientes necesitan características numéricas en escalas comparables (StandardScaler, MinMaxScaler, RobustScaler); las columnas categóricas se convierten en números mediante codificación one-hot, ordinal o de objetivo (target encoding), según la cardinalidad y el tipo de modelo. Cada transformador se ajusta con la partición de entrenamiento y se aplica sin cambios a las filas de validación, prueba y producción.
-
Clases Protocol: tipado estructural para el duck typing de Python
Un typing.Protocol declara los métodos y atributos que necesita un consumidor; cualquier objeto que los tenga satisface el tipo sin heredar de él. Definir los protocolos junto al código que depende de ellos, mantenerlos mínimos y usar runtime_checkable solo donde isinstance sea realmente necesario.
-
Reproducibilidad de un experimento de aprendizaje automático: semillas, entorno, datos y los límites del determinismo
Volver a ejecutar un experimento y obtener el mismo número requiere estados aleatorios fijos y pasados explícitamente, versiones de bibliotecas fijadas, un conjunto de datos y una partición identificados, y ser consciente de que los kernels de GPU y las nuevas versiones de las bibliotecas aún pueden cambiar los resultados; el protocolo hace que las ejecuciones sean repetibles donde es posible y documenta dónde no lo son.
-
Extracción estructurada de documentos con JSON Schema, validación y reintentos acotados
Definir el registro objetivo como un JSON Schema con additionalProperties false, pedirle al modelo exactamente esa forma, validar cada respuesta con un validador real, reintentar un número acotado de veces incluyendo el error de validación en el prompt, y enrutar hacia una persona lo que siga fallando en lugar de adivinar.
-
NULL en SQL: la lógica trivalente y sus trampas
NULL significa desconocido, así que las comparaciones con NULL producen desconocido en lugar de verdadero o falso; los filtros WHERE descartan las filas con resultado desconocido, NOT IN con un NULL no encuentra nada, y las funciones de agregación omiten los NULL. Usar IS NULL, IS DISTINCT FROM y COALESCE de forma deliberada.
Legible por máquina: JSON