Proyectos complejos para que los programadores aprendan cosas nuevas / Sudo Null IT News

Principalmente aprendí programación por mi cuenta. Cuando tuve una idea interesante, descubrí lo que se necesitaba para resolver el problema. Por ejemplo, cuando me interesé en cómo funcionan los motores de búsqueda, comencé a leer sobre la eficiencia computacional de los conjuntos. Así descubrí el problema de “¿cómo sé si ya he rastreado esta URL?” cuando ya había miles de ellos. Para acelerar la respuesta a esta pregunta, utilicé un conjunto que toma O(1) para buscar en lugar de O(n).

Aprender lo que necesitas para resolver un problema es divertido, pero seguir tu propio camino de codificación deja lagunas en tu conocimiento. Me parece que si constantemente te propones tareas difíciles, estos vacíos se irán llenando en el camino. (Incluso si lleva más tiempo que tomar el curso. El interés es un motivador importante para seguir adelante; persiga lo que le interese).

En el momento en que comencé a comprender la eficiencia computacional y a esforzarme por acelerar mis programas, estaba resolviendo un problema relacionado con un motor de búsqueda. Desde entonces, a veces me pregunto: ¿qué debo hacer a continuación? ¿Cuál será mi próxima tarea desafiante? Esto depende en gran medida de los conocimientos que tengas actualmente; Algunas ideas tienen sentido, otras aún no son realizables. Así es como aprendemos.

Decidí hacer mi propia lista de proyectos que respaldan mi interés por la programación. Esta es una lista de estilos de serie. Proyectos desafiantes que todo programador debería probar Austin Henley.

Crear un rastreador de búsqueda

Un rastreador es un robot que rastrea páginas web y almacena su contenido. Los motores de búsqueda utilizan rastreadores para explorar la web. El contenido de las páginas web está “indexado”. Esto significa que las páginas se guardan en algún lugar para realizar búsquedas posteriores.

Decidí crear un buscador para una pequeña comunidad en la que participo. La comunidad conocía una lista de alrededor de mil sitios compilados por personas que colaboraban en la wiki general. Lo usé como lista de rastreo. Puedes crear tu propia lista de sitios y escribir tu propio motor de búsqueda. Digamos que puedes crear un motor de búsqueda para tus blogs de anime favoritos. O sitios de fans de Taylor Swift. Cualquier cosa, cualquier cosa, siempre que esté en Internet.

El descubrimiento más importante para mí en este proceso fue que la Web es el Salvaje Oeste. Nunca puedes esperar que la página web de alguien sea exactamente lo que deseas. Crear un rastreador de búsqueda es un ejercicio que nos enseña cómo recuperar de manera confiable tantos sitios web como sea posible sin bloquearlos.

Al crear un rastreador de búsqueda, aprenderá:

  1. Cómo descargar una página web

  2. Estándares de rastreo de contenido (robots.txt, metaetiquetas para contenido “para adultos”)

  3. Acerca de los límites de la tasa de votación

  4. Acerca de las velocidades de obturación exponenciales

  5. Cuándo rastrear y volver a rastrear sitios

  6. О negociación de contenidos

  7. Acerca de Etag

  8. Y mucho más

La web es verdaderamente el Salvaje Oeste. Pero este Salvaje Oeste tiene muchos desafíos deliciosamente técnicos que resolver. Esta tarea ocupó mi cerebro durante varios meses. Aunque mi motor de búsqueda ya no está activo, este proyecto me dio la confianza de que puedo hacer más que escribir pequeños scripts en Python.

Crear un sistema de finalización automática

Imagina que estás escribiendo una publicación de blog. ¿Cómo se pueden completar palabras automáticamente basándose en una secuencia de letras? Tomemos este artículo como ejemplo. Si comencé una palabra con “exponencial”, ¿cómo puedo sugerir efectivamente “exponencial” como una palabra ya preparada? Aquí es donde radica la dificultad. No entraré en detalles sobre el funcionamiento interno de este proyecto, ¡pero me divertí mucho haciéndolo!

Una vez que entiendes cómo completar palabras automáticamente, surge otro desafío: cómo recomendar, cual la palabra se completa automáticamente. Si ingreso “exponente”, ¿cómo sabe el algoritmo de autocompletar si debe recomendar “exponente” o “exponencial”?

Escribir un programa para comprimir archivos.

Existen muchas herramientas excelentes de compresión de archivos, pero ¿alguna vez te has preguntado cómo hacen esos archivos más pequeños?

Aquí tienes una tarea: descargar artículo original como un archivo HTML. Escriba un programa que produzca una versión comprimida de un archivo HTML. Su programa debe poder reproducir el archivo exactamente. Todo debe seguir igual, incluidos los espacios y las mayúsculas.

Éstos son algunos de los temas que pueden resultarle útiles para aprender sobre esta área (aunque si está interesado en esta tarea, le recomiendo que intente escribir un programa de compresión sin leer demasiado sobre él):

  • Teoría de la información

  • Método de compresión mediante un diccionario (un método para describir información)

  • Código Huffman (algoritmo de compresión popular)

  • Entropía (una medida de la cantidad de “información” en un archivo; la “información” se pone entre comillas intencionalmente)

Implementar BitCask

BitCask es un algoritmo para almacenar claves y valores. Las tiendas clave-valor asignan claves (nombres) a valores (bloques de información). Por ejemplo, podría almacenar información sobre publicaciones en mi blog de esta manera:

{"title": "(Even more) challenging programming projects you should try", "published": "2024-02-28"}

Donde título y publicado son nombres asociados a valores.

BitCask solo funciona usando su sistema de archivos. Las claves y los valores se guardan en archivos. Sólo puedes agregar información a cada archivo. Puede eliminar claves, pero esto redefine la clave anterior en lugar de eliminar explícitamente el valor. La documentación de BitCask es un artículo breve y útil., quien me ayudó a implementar el algoritmo. Tarea para ti:

  1. Crear barril (almacenamiento clave-valor basado en el algoritmo BitCask)

  2. Agregar elementos al barril

  3. Recuperar elementos del barril.

  4. Quitar elementos de la barrica

  5. Cerrar barrica

Cuando se cierra el barril, se realiza una operación de fusión, fusionando todos los archivos del barril en uno.

Escribir un lenguaje de programación

¡Guau! ¿Lenguaje de programación? ¡Sólo los especialistas serios son capaces de hacer esto! Yo también pensé lo mismo. ¡Pero resultó que esto no es cierto! Tú también puedes crear un lenguaje de programación. Y ni siquiera necesitas leer cientos de páginas de teoría antes de comenzar (sin embargo, cuanto más leas, más información tendrás para diseñar tu lenguaje).

Diseñar un lenguaje de programación te permite decidir exactamente cómo quieres escribir el código. Puedes usar patrones ya hechos o crear los tuyos propios. Las reglas las escribes tú mismo.

Hay muchos tipos de lenguajes de programación, pero el mejor lugar para comenzar es escribir un lenguaje que no requiera un compilador. Tal vez sea parcial porque así es como aprendí, pero la idea de tener que escribir un compilador antes de tener un poco más de experiencia con la teoría del lenguaje de programación me parecía desalentadora. Entonces escribí un lenguaje “interpretado”. El archivo se lee, se analiza y luego se ejecuta; sin compilación.

Un lenguaje interpretado consta de varios elementos básicos:

  1. “Gramática”, que determina la estructura del idioma;

  2. Un “analizador léxico”/“analizador” que toma texto arbitrario (por ejemplo, una escritura escrita en su idioma) y lo convierte en un árbol de sintaxis abstracta (AST) basado en su gramática;

  3. Un sistema de expresiones simbólicas que lee un árbol de sintaxis y realiza algunas operaciones sobre él.

Cada uno de los tres componentes enumerados anteriormente presenta un desafío técnico separado. Recomiendo comenzar escribiendo una gramática y un analizador. Su gramática definirá cómo funciona el lenguaje (es decir, cómo declarar variables, la lista de caracteres permitidos y deshabilitados, cómo funciona o no el anidamiento). Para interpretar la gramática, puede utilizar un analizador léxico ya preparado. Usé Lark para Python. Un sistema de expresión simbólica tomará un árbol de sintaxis y aplicará la lógica del programa (es decir, almacenará variables, hará cálculos, manipulará cadenas y valores booleanos, y hará cualquier otra cosa que desee que haga el lenguaje).

PD: ¡También es una buena idea comenzar con Lisp!

La lista en sí y otras ideas que pueda haber en ella.

La lista anterior no es una lista de verificación obligatoria, sino más bien una fuente de inspiración para elegir sus proyectos. Quizás uno de los puntos te inspire a hacer algo. Quizás ninguno de ellos te interese. Esto también es normal. Si esto sucede, recomiendo mantener esta publicación en algún lugar profundo de su mente. Quizás llegue el día en que alguna de las ideas le atraiga. Hace cinco años probablemente habría considerado la lista anterior demasiado compleja. Hace un año hubiera soñado con realizarlo.

Recomiendo buscar ideas interesantes en artículo de Austin Henley. Fue gracias a su post que escribí el mío.

Si implementas algo después de leer esta publicación, ¡házmelo saber! Escriba una carta a los lectores (arroba) del blog jamesg (punto). Además, si necesita ayuda con las ideas presentadas anteriormente, escríbanos también, estaré encantado de ayudarle. He completado todas las tareas enumeradas aquí; continúan cultivando mi fascinación infantil por la codificación; Espero que sea lo mismo contigo.

Ahora la pregunta es: ¿qué otras ideas deberían estar en esta lista? ¿Cuál crees que sería un gran desafío para los programadores?

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *