7 puntos por GN⁺ 2023-12-27 | 1 comentarios | Compartir por WhatsApp

Editor de texto

  • Usas un editor de texto todos los días, pero ¿sabes realmente cómo funciona? Empieza por implementar las funciones básicas.
  • El mayor desafío es cómo almacenar un documento de texto en memoria. Usar arreglos tiene problemas de rendimiento, así que hace falta aprender varias estructuras de datos para resolverlo.
  • Aprende cómo funciona el cursor de texto y, después de implementar un editor básico, intenta añadir undo/redo y ajuste automático de línea por palabras.

Juego 2D - Space Invaders

  • Incluso un juego sencillo requiere estructuras de datos y patrones de diseño específicos. Más que enfocarte en el diseño del juego y el arte, céntrate en la implementación general del juego.
  • Aprende sobre dibujo en pantalla, bucle del juego, manejo de entrada del usuario, creación y gestión de objetos dinámicos, y aplicación de la lógica del juego.
  • Después de implementar el juego básico, puedes ampliarlo con un menú en la pantalla de título, una pantalla de game over, mantener la misma velocidad en distintas computadoras, aplicar IA, etc.

Compilador - Tiny BASIC

  • Implementar un compilador es un proyecto que exige una comprensión profunda de la programación. Empieza escribiendo un compilador para un lenguaje simple como Tiny BASIC.
  • Aprende el proceso de tokenizar el código (análisis léxico), hacer parsing (verificar la estructura y generar un árbol), análisis semántico y generación de código.
  • Después de implementar el compilador básico, puedes ampliarlo agregando una biblioteca estándar, una etapa de optimización y mejores mensajes de error.

Mini sistema operativo

  • Los conceptos básicos de un sistema operativo pueden aplicarse en muchos campos. Implementar un sistema operativo mejora la comprensión del hardware.
  • Aunque la curva de aprendizaje depende mucho del hardware, si sigues un libro o tutorial puedes crear un OS que arranque.

Hoja de cálculo

  • Una aplicación de hoja de cálculo combina los desafíos de un editor de texto y un compilador. Aprendes cómo representar el contenido de las celdas en memoria e implementar un intérprete de lenguaje de programación para las fórmulas.

Emulador de consola de videojuegos

  • Escribir un emulador combina en un solo proyecto los desafíos de los compiladores, los sistemas operativos y la escritura de compiladores. Jugar un juego real en tu emulador es una experiencia muy gratificante.
  • Emular una consola de videojuegos real significa escribir una máquina virtual que actúe como esa CPU y otros componentes de hardware.

Opinión de GN⁺

  • Para fortalecer las bases de programación, implementar un editor de texto o un juego simple ayuda mucho a entender cómo funcionan internamente los programas que usamos de verdad.
  • Los proyectos complejos como compiladores o sistemas operativos exigen una comprensión profunda de los lenguajes de programación y la arquitectura de computadoras, y eso es esencial para desarrollar habilidades avanzadas de ingeniería de software.
  • Estos proyectos ofrecen experiencias interesantes y desafiantes para que los programadores aprendan un nuevo lenguaje o framework, o profundicen los conocimientos que ya tienen.

1 comentarios

 
GN⁺ 2023-12-27
Opiniones de Hacker News
  • Trabajar en proyectos como un editor de texto, un compilador, un sistema operativo o un raytracer puede mejorar tus habilidades de programación, pero no necesariamente tus capacidades de ingeniería de software. De hecho, este tipo de proyectos puede implicar el desastroso principio de "Not Invented Here", por lo que incluso podría ser contraproducente para la ingeniería de software.

    • La capacidad de decidir si conviene traer algo de una librería o escribirlo uno mismo
    • La capacidad de identificar librerías y frameworks de alta calidad que encajen con los requisitos del proyecto
    • La capacidad de decidir dónde vale la pena optimizar y dónde no
    • La capacidad de escribir código que siga siendo legible incluso años después
    • La capacidad de pensar en un proyecto como un sistema complejo a gran escala y considerar dependencias de software y no software
    • Como reto alternativo, se propone crear un motor de búsqueda web. Como algoritmos como el string matching ya fueron resueltos por otras personas, el objetivo sería construir un motor de búsqueda real que funcione (y su crawler).
  • Para proyectos basados en UI/web, se recomiendan cosas como estas:

    • Un videojuego simple usando Unity o Unreal (como en los juegos mantener 30-60fps es importante, eso ayuda a crear interfaces con buen rendimiento también en otros contextos)
    • Un framework simple de JavaScript similar a React (ayuda a entender el flujo de datos y el manejo de eventos)
    • Un wrapper de librería HTTP alrededor de XMLHTTPRequest (aunque existe fetch, entender cómo se envían y leen las solicitudes HTTP desde cero ayuda al depurar problemas de CORS, solicitudes OPTIONS, etc.)
  • Opinión positiva sobre crear un mini sistema operativo. Como desarrollador de aplicaciones, uno depende de funciones del sistema operativo (manejo de memoria, sistema de archivos, etc.), y es natural preguntarse cómo funciona todo eso por detrás. Usar xv6 para aprender e implementar distintos algoritmos de planificación de procesos en el tiempo libre puede ser una experiencia muy útil y divertida.

  • El deseo de meter mano a cosas físicas, por ejemplo robots o drones con piloto automático, o simulaciones precisas de dinámica de vuelo de una nave espacial con parámetros GNC programables. Tiene el libro "Fundamentals of Astrodynamics" y quiere aprovecharlo en esta temporada de vacaciones. Le gustaría encontrar buena información sobre GNC (guiado, navegación y control).

  • Depende del gusto personal y de la situación de cada quien, pero si buscas ideas, esta puede ser una buena lista para empezar. Usando una Sinclair ZX Spectrum hizo un editor de pentagramas musicales y un tracker, además de juegos 2D (Space Invaders), entre otras cosas. Con su primera computadora (386) hizo un compresor Huffman, un índice B-Tree, un generador de formularios OOP, un verificador de correo para dial-up y parsers manuales.

  • Discusión sobre los editores de texto: el mayor reto es cómo almacenar un documento de texto en memoria. La primera idea fue usar un arreglo, pero el rendimiento es muy malo al insertar texto en lugares que no son el final del documento. Aun así, usando strings de JavaScript y tras más de dos años usando el editor, no hubo problemas de rendimiento. Claro, sí hubo muchos otros problemas; por ejemplo, renderizar líneas horizontales largas resultó problemático porque el enfoque de optimización asumía que renderizar una sola línea sería barato.

  • También puede ser buena idea intentar hacer un raytracer sencillo de juguete. Crear un raytracer que renderice esferas en gráficos bitmap y haga reflexión difusa y especular puede ser un proyecto relativamente acotado, siempre que no se vuelva demasiado complejo.

  • Si piensas que necesitas un "patrón factory" para escribir Space Invaders, entonces hay un problema. Difícilmente el juego original usó ese tipo de conceptos de diseño.

  • Opinión sobre un editor de texto que usa arreglos como estructura de datos. Mientras se escribe, lo importante es que sea rápido, y solo cambia una línea. Al ingresar una nueva línea, la latencia extra necesaria para reestructurar el arreglo después de presionar Enter no se nota ni siquiera con millones de líneas. La parte más desafiante de un editor de texto es asegurarse de renderizar solo lo que el usuario está viendo.