La alegría de crear software de juguete
(blog.jsbarretto.com)- Crear software de juguete es una forma de recuperar la alegría esencial y la creatividad del desarrollo de software
- En una época en la que la alegría pura de desarrollar software se está perdiendo por la IA y la industrialización, hacer programas de juguete simples como proyectos personales puede convertirse en una oportunidad para obtener conocimientos útiles en el trabajo y una comprensión más profunda
- El software de juguete sigue la regla 80:20, implementando la mayor funcionalidad posible con el mínimo código, y la clave está en evitar el diseño excesivo o la obsesión por la perfección
- La experiencia misma de construir por cuenta propia, enfrentándose a los problemas sin depender de herramientas de IA como los LLM, es la alegría esencial del aprendizaje y el crecimiento
Por qué deberíamos hacer más programas de juguete
- La cita de Richard Feynman, “Lo que no puedo crear, no lo entiendo”, muestra que la experiencia de construir algo por uno mismo conduce a una comprensión profunda
- A diferencia del consejo habitual de “no reinventes la rueda”, la experiencia de construir la rueda uno mismo enseña más que la lectura o el aprendizaje puramente teórico
- Últimamente, la IA y la industrialización del software están amenazando la alegría y la artesanía del desarrollo
- Crear software de juguete ayuda a recuperar la simple alegría de volver a engancharse con la computadora
Principios de los programas de juguete: Keep it simple
- El software de juguete sigue el principio 80:20: lograr el 80% de la funcionalidad con el 20% del esfuerzo
- El objetivo no es el producto final, sino la simplicidad y la implementación directa de los principios fundamentales
- Se advierte contra el over-engineering y se enfatiza escribir solo el código estrictamente necesario
- Se recomienda dejar todas las rutas de código aún sin implementar e ir ampliando la implementación a medida que haga falta
- Incluso los sistemas que parecen pequeños pueden resultar sorprendentemente fáciles de construir cuando uno realmente lo intenta
Beneficios adicionales del software de juguete
- El conocimiento obtenido en proyectos de juguete suele ayudar más de lo esperado en el trabajo real para rastrear problemas, resolver bugs y prevenir errores
- Experimentar directamente las restricciones al enfrentarse a los problemas da una visión más profunda sobre la esencia del software y puede llevar a descubrir soluciones innovadoras
Ejemplo: lista de distintos proyectos de software de juguete
Se organizan los tipos de proyectos de juguete implementados personalmente durante los últimos 15 años por nivel de dificultad y tiempo estimado. Cada proyecto incluye una breve explicación y material adicional de referencia
- Motor de regex (dificultad 4/10, 5 días): análisis de expresiones regulares estilo POSIX e identificación de cadenas coincidentes; ayuda a comprender a fondo el funcionamiento interno de las regex
- Kernel de SO x86 (dificultad 7/10, 2 meses): incluye CLI, drivers simples y administrador de memoria; se puede ampliar con sistema de archivos en memoria, ejecutables ELF, GUI, aislamiento de procesos y más
- Emulador de GameBoy/NES (dificultad 6/10, 3 semanas): permite entender un conjunto simple de instrucciones y el hardware, además de implementar PPU, PSG y formatos de cartucho peculiares
- Juego para GameBoy Advance (dificultad 3/10, 2 semanas): juego simple basado en sprites; la comunidad de desarrollo de GBA es activa y la estructura del sistema es totalmente abordable en solitario
- Motor de física 2D (dificultad 5/10, 1 semana): mecánica newtoniana básica y manejo simple de colisiones; puede extenderse a figuras complejas, inercia, algoritmos de resolución, soft bodies e interacciones compuestas
- Intérprete dinámico (dificultad 4/10, 1~2 semanas): intérprete de recorrido de árboles; crear tu propio lenguaje da una alegría tanto técnica como creativa
- Compilador tipo C (dificultad 8/10, 3 meses): diseño de un sistema de tipos simple y entorno objetivo, con optimizaciones y arquitectura para soportar múltiples backends
- Editor de texto (dificultad 5/10, 2~4 semanas): empieza con entrada/salida de archivos simple; se pueden usar toolkits de UI (QT/GTK, etc.), aunque se prefiere consola, y agregar Unicode, resaltado de sintaxis, multibuffer, LSP y otras funciones
- Runtime async (dificultad 6/10, 1 semana): en Rust, procesamiento de tareas con
impl Futuree implementación de concurrencia, con opción de añadir activación por I/O - Hash Map (dificultad 4/10, 3~5 días): permite aprender el funcionamiento interno, closed y open addressing, la regla de Robin Hood, además de entender el rendimiento y cuándo conviene usarlo
- Rasteriser / Texture Mapper (dificultad 6/10, 2 semanas): aprendizaje de la estructura del pipeline gráfico 3D, matemáticas vectoriales, Z-buffer, mapeo de texturas y algoritmos de shading
- Renderizado con Signed Distance Field (dificultad 5/10, 3 días): representación matemática del espacio, visualización simple y comprensión de shaders y matemáticas vectoriales
- Motor de vóxeles (dificultad 5/10, 2 semanas): es fácil de entender si ya se tiene experiencia en gráficos 3D o desarrollo de juegos; puede ampliarse con texturas, generación procedural y red
- Máquina virtual threaded (dificultad 6/10, 1 semana): intérprete rápido y optimizado sin generación de código por arquitectura; puede ofrecer una experiencia de rendimiento comparable a la de un compilador
- Toolkit de GUI (dificultad 6/10, 2~3 semanas): tras crear herramientas básicas de UI, se pueden implementar directamente funciones avanzadas como motor de layout, text shaping y accesibilidad
- Simulador de mecánica orbital (dificultad 6/10, 1 semana): implementación simple del modelo gravitacional newtoniano, con posibilidad de ampliar a interacción entre múltiples cuerpos, algoritmos de integración, visualización e incluso datos de NASA
- Bitwise Challenge (dificultad 3/10, 2~3 días): juego reproducido usando solo un estado de 64 bits; sirve para entrenar la gestión creativa del estado, y las reglas detalladas pueden consultarse en GitHub
- Framework ECS (dificultad 4/10, 1~2 semanas): implementación directa de la estructura Entity-Component-System, integrándola con el sistema de tipos del lenguaje y adaptándola a restricciones y alto rendimiento
- Emulador de CHIP-8 (dificultad 3/10, 3~6 días): máquina virtual simple de los años 70, rápida de implementar, con posibilidad de observar y ejecutar varios fan games
- Motor de ajedrez (dificultad 5/10, 2~5 días): se empieza por las reglas y se va mejorando gradualmente; perder contra un motor hecho por uno mismo es una etapa del crecimiento como desarrollador
- Shell POSIX (dificultad 4/10, 3~5 días): permite entender los principios y límites de un shell basado en POSIX, además de lograr una comprensión profunda y conocer muchos trucos al implementar compatibilidad con el lenguaje real de shell
Consejos sobre el uso de herramientas como los LLM
- Las herramientas avanzadas como los LLM son útiles, pero el aprendizaje verdadero se vuelve más profundo cuando uno explora por sí mismo
- En lugar de mirar soluciones existentes, se puede obtener una sensación de logro más profunda durante el proceso de explorar territorios desconocidos y encontrar una respuesta propia
- Al hacer proyectos de juguete sin LLM, al principio puede resultar difícil por falta de costumbre, pero con el tiempo se empieza a sentir una alegría técnica única y una gran sensación de logro
- Si te desplazas en auto, no puedes sentir el ‘runner’s high’ de quien corre: la alegría profunda se obtiene a partir de la experiencia directa, no del atajo
3 comentarios
Entiendo totalmente lo de intentar hacerlo sin LLM. Si no se necesita desarrollo rápido, parece más divertido y gratificante ir construyéndolo mientras entiendes cada parte una por una.
Ah, se refería a un proyecto de juguete. Solo por el título, pensé que se trataba de crear software para juguetes. Jaja
Opiniones de Hacker News
Me pregunto cuánta gente usa los LLM como si fueran motores de búsqueda. Antes buscaba en Google cosas como “pros cons mysql mongodb”, y terminaba leyendo documentación oficial, foros, blogs y hasta Stack Overflow, lo cual tomaba bastante tiempo. Pero ese tiempo de lectura y aprendizaje siempre fue bienvenido. Ahora le doy al LLM prompts más específicos, tipo “ventajas y desventajas de mysql vs mongodb para guardar fotos, con enlaces de referencia”. Así capto rápido lo esencial y además tengo links, así que no dependo solo de alucinaciones. A veces también le pido cosas concretas como “diseñame un data schema en postgres para guardar metadatos de fotos; quiero separar X en otra tabla”, pero eso solo lo uso cuando tengo muy claro qué tipo de resultado debería salir. Es más bien para no perder tiempo tecleando o cuando se me olvida momentáneamente el nombre exacto de un tipo, como
intvsinteger/src/fooy explícame cómo está implementadobarFeature. Ahora mira el proyecto/src/bazy explícame por qué el enfoque de foo sería difícil de aplicar en baz”. No le pido que haga algo nuevo; lo uso para traducir lo que ya existe dentro de un proyecto a mis propias ideas. El desarrollo realmente nuevo y desafiante me gusta codificarlo yo mismoUna de las mejores decisiones de mi carrera fue tomarme 6 meses entre trabajos para hacer proyectos personales. Tenía muchas ideas para empezar, pero como no tenía restricciones, el alcance siempre crecía y al final muchas veces no terminaba nada. Así que decidí dedicar solo 1 semana a cada proyecto. Hacía únicamente lo que se pudiera en ese tiempo. Empezar desde cero y, en una semana, construir algo utilizable con un lenguaje o framework nuevo, o en un área desconocida, me dio una confianza enorme. También me ayudó a recordar por qué me gustaba programar desde un principio. Si alguna vez tienes unos meses libres entre trabajos, en vez de prepararte para entrevistas de Silicon Valley, hacer toy projects puede hacerte darte cuenta de cuánto ya sabías
Hacer software de juguete se parece a darle mantenimiento a una bicicleta, un auto o un bote. Es divertido. Pero arreglar la bicicleta para ir al trabajo sí estresa. Hacer toy software es divertido, pero cuando en algún momento quiero usarlo de verdad, termino encontrando todos los bugs y ya no tengo tiempo para corregirlos; ahí aparece el dilema
Me sorprende que haya tantas opiniones negativas sobre los LLM. Los LLM te dan la información servida en bandeja. Cuando empiezas un proyecto nuevo, obviamente no arrancas sabiendo todo. Haces tu mejor intento, fallas, luego estudias, entiendes por qué no funcionó y ajustas con un enfoque nuevo; ahí está el aprendizaje real. Si solo sigues un tutorial porque “ya sabes todo”, no llegas a experimentar las limitaciones ni las ventajas y desventajas reales de cada método. Por ejemplo, si intentas hacer un parser con expresiones regulares y descubres por ti mismo que no puedes manejar expresiones recursivas, también aprendes de primera mano sobre estructuras más complejas y problemas de complejidad temporal. Si implementas tu propio compilador optimizador y te frustras con toda clase de trucos de optimización, terminas entendiendo por qué los compiladores reales están diseñados como están. Si escribes tu propio motor de layout, incluso el concepto de
widthse vuelve una lucha muy concreta. No hay mejor experiencia que aprender a base de ensayo y error. Aunque el LLM te ayude a evitar errores, ojalá eso no te haga perder oportunidades de aprendizaje valiosasYo también pasé años haciendo incontables proyectos raros en fines de semana y madrugadas para aprender computer graphics. No gané ni un centavo, pero gracias a eso conseguí el trabajo de mis sueños. Algunos trabajos representativos:
Siento que de verdad hace falta ese espíritu de “la diversión de programar” que propone este texto. En la era del coding con agentes de IA, vale aún más. Pero sí creo que el autor se queda muy corto con los tiempos estimados para esos toy projects. No digo que yo sea una referencia promedio, pero aun así, para la mayoría de esa lista no me parece que sean proyectos de unos cuantos días si asumes que solo trabajas 2 o 3 horas por día. Siento que solo la investigación previa ya lleva bastante tiempo. Como ejemplo, hace poco reemplacé mi blog de Pelican por un sitio estático personal generado con Odin, y aun dedicándole solo 2 o 3 horas al día, me tomó dos semanas. Y eso que era más fácil que varios otros proyectos de la lista
24*Xhoras, la lista se vuelve bastante razonableTambién coincido con el consejo de “no uses LLM para este tipo de proyectos”, pero no creo que deba tomarse de forma tan extrema. Me parece interesante que el consejo sobre cómo recibir ayuda de la IA se sienta distinto a pedir ayuda a una persona. Si al final del blog dijera “si tienes un amigo que programa bien, jamás le pidas ayuda”, sonaría raro. Un amigo experto entiende el contexto y te ayuda a que lo resuelvas tú mismo. Apostaría a que casi nadie le ha pedido realmente a la IA: “no me resuelvas el problema; guíame como si fueras un amigo experto”. Claro, tal vez todavía no pueda hacerlo bien, o le falte mucho, pero en 1 o 2 años esa clase de guía podría volverse de lo más natural. Por eso creo que conviene desarrollar el hábito de expresar claramente qué tipo de ayuda quieres. No hace falta cargar con la idea fija de que un LLM solo te va a dar respuestas incorrectas
Gracias al vibe coding con Claude, por fin volví a empezar side projects divertidos después de muchísimo tiempo. Una vez que aprendí las herramientas y el proceso, en pocas semanas he estado armando rápido varias apps: un dashboard familiar de calendario y clima, una app de lectura para Bluesky (que oculta posts ya vistos), un dashboard gamificado de PM para la empresa, una extensión de Chrome que esconde posts de Reddit después de cierto tiempo, y una app para reemplazar un plugin de WordPress sin mantenimiento, entre otras. Al principio le pedía mucho a Claude, sobre todo para mejorar la UI, pero ahora ya aprendí a conformarme con un 90% de acabado y a enfocarme en nuevas funciones en vez de pulir de más
Esta lista me pareció realmente impresionante. Muchos de los proyectos que al autor le parecen fáciles a mí me resultarían de una dificultad muchísimo mayor. Aun así, sí me motivó mucho a querer retomar mis propios toy projects. Eso sí: la conclusión sobre aprendizaje con LLM me parece más matizada. Depende por completo de cómo lo uses. Por ejemplo, pedirle “impleméntame este problema” es pésimo para aprender, pero pedirle “explícame la estructura de ELF al nivel más alto de abstracción, enfocándote en el porqué” puede ser un acelerador de aprendizaje enorme. Es cierto que dejar de investigar todo por tu cuenta puede ser una desventaja, pero si de verdad mantienes una actitud intelectual activa, tener siempre disponible una conversación de preguntas y respuestas al estilo socrático es una ayuda potentísima para aprender
Estos proyectos que presentan aquí son muy buenas ideas, pero a mí no me interesa ninguno. En momentos así me pregunto si de verdad alguna vez me gustó programar