¿Alguna vez ha construido un proyecto de codificación desde cero? Si es así, ¿qué construiste?

Oh yay! Me encantan este tipo de preguntas.

No sé si esto cuenta, ya que comencé a compilarlo en Visual Studio y todavía estoy trabajando en ello, pero quería escribir un conjunto de páginas web que ayuden a las personas a aprender sobre expresiones regulares y un poco sobre autómatas finitos y gramáticas formales.

Para hacer eso, quería proporcionar algo que proporcione una traducción de texto sin formato de las expresiones regulares a medida que las personas las escriben (difícil, pero no tan difícil), puede intentar analizar una expresión regular de una frase de texto sin formato ( mucho más difícil) , y tiene la opción de recorrer lo que hace el motor de expresiones regulares en tiempo real con la visualización, para que los estudiantes de expresiones regulares puedan verlo en funcionamiento (ouch).

Hasta ahora, terminé el primer objetivo y agarré el código del motor de expresiones regulares en C #. Estoy ocupado reflejándolo y adaptándolo para lograr el segundo objetivo (escribir un motor que pueda analizar una expresión regular de una frase de texto sin formato) antes de comenzar con el tercero.

Los objetivos posteriores incluyen terminar los artículos que van en las páginas de autómatas finos y gramáticas formales, y crear una página que le permita ensamblar un autómata a través de una interfaz de arrastrar y soltar y aplicarlo a una gramática formal predefinida para que pueda avanzar mucho en ese proceso como lo harías en una conferencia de CS.

He estado en esto por un tiempo ahora, alrededor de otras cosas que suceden en mi vida, diría que alrededor de cinco meses, hasta ahora. Tuve que parar para trabajar en mi sitio personal, pero tan pronto como termine lo que estoy haciendo en mi sitio personal, volveré a trabajar en el proyecto de expresiones regulares.

En cuanto a lo que he aprendido … ¡solo toneladas ! Tenía una comprensión mucho más básica de lo que estaba haciendo el motor de expresiones regulares que ahora, y una comprensión mucho más básica de lo que sucede cuando una expresión se alimenta a través de ese comando. Debido a que he tomado el código, ahora puedo seguirlo a través de todo el proceso carácter por carácter. Es sorprendente lo que logra esa cosa, considerando lo simples que son los procesos básicos.

También sé mucho más sobre Javascript, y un poco más (aunque no me halagaré y diré mucho) sobre cómo se dividen las tareas entre el cliente y el servidor.

Puede ser que estoy siendo demasiado ambicioso con este proyecto, pero realmente no me importa, el proceso es tan genial como puede ser. La libertad de perseguir esto para mi propio placer, así como la satisfacción de pensar que puedo ayudar a un estudiante de CS con algo que probablemente encuentren frustrante, realmente me hace feliz.

No volvería a hacer esto de nuevo, planeo pasar toda mi vida trabajando en algo ambicioso en el fondo para la alegría de aprender (aunque sé que de vez en cuando me va a volver loco). *

En varios puntos, para el trabajo del curso, también escribí juegos desde cero en editores como VIM o entornos de desarrollo como Eclipse; reescribimos Space Invaders en Java, una versión GUI del Juego de la Vida en Java, un solucionador de Sudoku en C, varios programas de cifrado / descifrado de juguetes en C, y cualquier cantidad de otras cosas tontas.

Si está buscando un proyecto y recién comienza a programar, los proyectos como pequeños juegos desde el principio del software son un excelente punto de partida. No puedo recomendar elegir un proyecto de hobby lo suficiente, ¡cualquier excusa vieja para ensuciarse las manos!


* Yo y todos los demás en la vecindad general, como me juro vivamente, la computadora, el código fuente, la documentación y el imbécil que escribió el código o la documentación que estoy leyendo.

A veces, esto también incluye gestos, lo que puede ser preocupante.

Otros son quisquillosos en la parte “desde cero”. Pero como dijo Carl Sagan: “Si deseas hacer un pastel de manzana desde cero, primero debes inventar el universo”.

A los fines de esta respuesta, definiré “desde cero” para que signifique tomar una idea y desarrollarla en un proyecto de trabajo, utilizando todas las herramientas a su disposición.

Como un “casi graduado” de la Escuela Flatiron, tengo algunos proyectos que hice. El plan de estudios se construye de tal manera que a medida que avanzas en los cursos construyes proyectos de “estilo libre” utilizando el conocimiento que acabas de aprender.

Estos son algunos de los que realmente disfruté hacer:

  • Tic Tac Toe con una IA que funciona

El primer proyecto que nos hicieron construir fue un juego CLI Tic Tac Toe en funcionamiento construido con Ruby. Este proyecto no es completamente “desde cero”, ya que Flatiron proporcionó la estructura del archivo, y gran parte del código fue copiado / pegado de lecciones anteriores en el curso. Sin embargo, el jugador de IA era completamente nosotros (bueno, no tanto una IA como un montón de declaraciones elsif , pero aún así fue divertido de codificar), y me elsif mucho personalizando el juego y dándole personalidad. Todavía lo considero uno de los proyectos más divertidos que hice.

Puede encontrar el código aquí (incluido un archivo Léame con instrucciones sobre cómo ejecutarlo) y una publicación de blog que escribí sobre cómo codificarlo. Consejos Tic Tac.

  • DansDeals

El primer proyecto que fue realmente desde cero fue al final de la sección OO Ruby del plan de estudios. Los requisitos del proyecto fueron que hagamos una gema CLI Ruby que raspe un sitio web o API para obtener datos con los que un usuario pueda interactuar a través de la línea de comandos.

Elegí raspar un sitio de ofertas llamado DansDeals (de ahí el nombre de la gema), y sorprendentemente la gema todavía funciona al momento de escribir esta respuesta (eso dice menos de mis habilidades como desarrollador que del hecho de que ese sitio web no se ha actualizado desde que implementé la gema).

Esta gema se ha implementado en RubyGems, y cualquiera puede jugar con ella (suponiendo que tenga Bundler) ejecutando gem install dansdeals en su línea de comando y luego ejecutando dansdeals .

Puede encontrar el código para este proyecto aquí, y mi publicación de blog gem install swim

  • Freddit

El siguiente proyecto llegó cuando terminamos la sección que abarca Sinatra. Para este proyecto, elegí hacer un pequeño tablero de mensajes llamado Freddit (por supuesto, no hay relación con Reddit).

Este fue un proyecto bastante divertido de codificar, incluía conceptos más avanzados, como la autenticación y validación de usuarios, presentaba usuarios administradores que podían bloquear o prohibir a otros usuarios. Lo más importante, al menos con respecto a la pregunta, ¡fue aún más “desde cero” que otros proyectos que hice, ya que el marco que utilicé para construirlo, Corneal, es un marco de código abierto en el que contribuí y ayudé a construir!

Puede encontrar el código de Freddit aquí, y mi publicación de blog I Challenge You Sinatra

  • FlyLog

Luego vino Rails, y cuando llegó el momento del proyecto, decidí elegir algo que me apasionara, ¡volar!

FlyLog es el libro de registro de un piloto construido completamente con Rails, donde los pilotos pueden registrar sus horas, llevar la cuenta de los aviones que han volado y ver la cantidad total de horas de vuelo que tienen.

Este proyecto en realidad llegó hasta la implementación, puede encontrarlo en FlyLogger.herokuapp.com

Puede encontrar el código aquí y mi publicación de blog Fly Off The Rails

  • Freddit revisado

Después de Rails, cambiamos a JavaScript y algunas bibliotecas básicas como jQuery. El siguiente desafío fue crear una aplicación Rails que use llamadas JavaScript AJAX para representar el contenido de la página. Los instructores sugirieron que solo agregáramos JavaScript a nuestro proyecto Rails, pero decidí hacer algo un poco más desafiante y reescribir Freddit en Rails.

En el proceso, agregué más funciones, como la capacidad de los lectores de responder directamente a los comentarios, anidar los comentarios y sus respuestas, un poco más cerca de su homónimo.

Este proyecto también se implementó en Heroku, puedes verlo en Freddit-JQ.herokuapp.com

El código está en GitHub aquí, y mi publicación de blog Desafíos revisados

  • App-Tracker

Finalmente, pasamos a marcos más avanzados como React, y luego llegó el momento del proyecto final. Los requisitos para el proyecto final fueron que usamos una API REST de Rails para el back-end y usamos React para la aplicación del lado del cliente.

Mi idea para este proyecto era crear una aplicación que me permitiera hacer un seguimiento de todas las solicitudes de empleo que enviaría después de que termine con Flatiron, actualmente estoy en el medio de la aplicación, por lo que no publicaré enlaces. sin embargo, esperaré hasta que termine y luego actualizaré la respuesta (bueno, en realidad, no debería ser demasiado difícil de encontrar en mi página de GitHub, es mi último repositorio ocupado 🙂

Editar: el proyecto está casi terminado ahora, puedes encontrarlo en app-tracker-react.herokuapp.com, el repositorio de GitHub está aquí y la publicación del blog aquí: Time To OverReact A Bit .

Esos son algunos de los proyectos que disfruté haciendo. Puedes leer más sobre mi codificación en mi blog Coding Hassid

¡Feliz codificación!

¿Te refieres a usar interruptores en el panel frontal de una computadora para alternar el código de la máquina?

Cualquier cosa pasada que esté usando algo, al menos un ensamblador (lo que significaría un sistema operativo y escribir el proyecto en ensamblador, un lenguaje).

Claro, he cambiado de arranque muchas veces (en el día en que 2708 ROMS eran demasiado caras, y no podíamos permitirnos el lujo de lámparas UV para borrarlas). Pero nada más grande que eso no es posible, porque estás usando algo .

Si estás hablando del mundo real, escribir un sistema en ensamblaje y ensamblarlo, sí. Si alguna vez estás en Hong Kong, asiste a un espectáculo en el planetario del Museo del Espacio. Es automatizado Fue escrito, en asamblea, en 1978-1979. No hay un “sistema operativo” real (aunque había una especie de firmware detrás del software de control del planetario), no hay bibliotecas, sino lenguaje ensamblador y un ensamblador. Casi 200k de código: en un sistema con CPU que solo podía manejar 64k cada uno.

Definir los significados de “desde cero”. La mayoría de los programadores dependerán de algún tipo de marcos, ya sea SDK de sistemas operativos o bibliotecas de terceros como Boost o libevent. Si eso no se ajusta a su definición de “desde cero”, entonces diría que muy pocos programadores profesionales lo harán.

Hace unos 15 años, una vez construí un proyecto de codificación completamente a partir de un archivo .cpp en blanco, para una máquina Linux ARM incrustada sin cabeza. En ese momento, ARM Linux integrado no es tan popular. El kernel no está completo y no hay muchas opciones de cadenas de herramientas. Después de que no pudimos portar el libevent recién lanzado (en ese momento) a nuestra plataforma de destino, reescribimos nuestra propia biblioteca para E / S de red asíncrona desde cero, basada en select () fiel antiguo.

Me llevó unos 4 meses codificar la biblioteca, desde el controlador de errores autodefinido, el controlador de eventos basado en objetos múltiples y funcionales (también conocido como bind () si está familiarizado con Boost), grupo de hilos para tareas select () y sockets de servidor / cliente / host. Del proceso aprendí muchos conceptos abstractos de C ++ y muchos trucos de herencia virtual; También aprendí cómo enviar plantillas de spam en todas partes y cómo detenerlo.

Es divertido, pero espero no tener que volver a hacerlo.

¿Qué quieres decir desde cero?

Cada proyecto de pago en el que he trabajado involucraba algún tipo de herramienta o marco de scafforlding.

Cuando era un principiante en desarrollo web. A menudo usaba herramientas de andamiaje como las plantillas de Visual Studio .net y demás. Entonces me quedaría atascado rápidamente y tendría que comenzar de nuevo. Solo después de construir algunos desde cero, pude avanzar. Pero aún en esos casos todavía estaba usando frameworks.

He creado sitios web sin marcos. Solo mi propio CSS y HTML y js. Al principio me llevaría días rendirme. Por lo general, trabajaría durante unos días, superaría un obstáculo importante y luego abandonaría el proyecto. A medida que mejoré se hizo más fácil. Pero todavía codifiqué por unos días y luego me rendí. Esto se debe a que seguí abordando cosas más complejas. Así que pasé de un simple juego de adivinanzas a un clon de ruptura. A un juego de ritmo. Simulaciones fluidas. Jugadores de juegos. Todo desde cero en JS.

Hoy en día podría escribir un prototipo funcional de un juego de apuntar y hacer clic basado en el navegador desde cero en aproximadamente una hora. Así que cosas como tic-tac-toe y mine sweeper. Estoy bastante seguro de que podría hacer un breakout u otros juegos de acción simples en unas pocas horas. Pero si tuviera que hacer un juego de plataformas, usaría un marco como box2D o liquidfun.

En resumen, si por “rascar” quiere decir que no hay herramientas de andamios. Luego lo hago todo el tiempo y continuaré porque tengo que entender lo que está haciendo una herramienta de andamiaje para estar cómodo de poder construir aplicaciones reales con ella.

Si por cero quiere decir que no hay marcos (más allá de las bibliotecas estándar), entonces lo he hecho y probablemente lo volveré a hacer, pero solo como un ejercicio de aprendizaje. Para cosas comerciales, estoy bastante seguro de que hay bibliotecas para hacer lo que mis clientes necesitan. Estarían mejor documentados y más robustos que cualquier cosa que pueda construir en una fecha límite por mí mismo, así que solo usaré uno de esos.

¿Qué tal un programa de 15000 líneas de código “Hola, mundo”, o más exactamente, una IA de preguntas y respuestas conversacionales con capacidades de aprendizaje e inferencia.
Desde cero en C ++, sin contar la biblioteca de gráficos Allegro y las bibliotecas básicas para la manipulación de texto y archivos. Apenas investigé lo que estaba programando, porque no podía superar la jerga y solo quería probar si podía llegar a algo diferente.

Tiempo total empleado: aproximadamente 4800 horas más o menos, repartidas en 5 años.
Cosas aprendidas: mucho. Cómo programar un grado de sentido común, detección de sarcasmo, métodos de resumen, las complejidades del idioma inglés, algo de psicología, conceptos básicos de visión por computadora, automatización de tareas, lo que sea. Simplemente no pregunte si tengo algún uso real para ello.
Lo volvería a hacer, pero omita la programación del lenguaje y use un analizador de gramática existente. La programación de las reglas gramaticales tomó la mayor parte del tiempo, siendo el aspecto menos valioso. Además, debería haber aprendido a usar punteros en C ++ anteriormente. Resulta que pueden ser bastante útiles.

Implementé un analizador de paquetes Ethernet en un TI DSP (Procesador de señal digital). En ese momento, era un desafío obtener una cobertura del 100% de paquetes interminables de longitud mínima consecutivos. Lo codifiqué en ensamblador. No utilicé ninguna biblioteca. Usé todo tipo de trucos para hacerlo más rápido, incluyendo:

  • Organizar sentencias “if” para que generalmente fallaran (no saltaran) porque un salto volaría la cola de instrucciones.
  • Desenrollar bucles cortos en secuencias de instrucciones individuales. Por ejemplo, en lugar de “Haz esto 3 veces”, codificaría “Haz esto, haz esto, haz esto” … porque no solo una instrucción de prueba llevaría tiempo, sino que los saltos volarían la cola de instrucciones.
  • Convertir subrutinas de un solo uso en macros en línea, porque las operaciones de apilamiento eran caras.
  • Analizando cuidadosamente qué registros se estaban utilizando realmente y presionando SOLO esos registros. Este fue el truco más difícil y más propenso a errores.
  • Intentando MUY duro obtener la mayoría del código por paquete en el caché de 64 instrucciones.

El producto fue un éxito. Y fue muy divertido. Un compañero ingeniero levantó el pseudocódigo de mi reconocedor de paquetes, lo recodificó en C y lo pegó en otro producto. Me sentí halagado.

Sí, he sido programador profesional durante casi 20 años, por lo que he construido muchos proyectos desde cero, pero hablaré sobre uno por el bien de esta pregunta …

Flujo

The Escapers: Flux

Para aquellos que se estén preguntando, sí, lleva el nombre del condensador de flujo en Regreso al futuro …

Flux es una aplicación de diseño web, al igual que DreamWeaver, admite codificación y diseño WYSIWYG.

¿Cuánto tiempo tomó?

Bueno, comenzó hace más de 10 años, y todavía se está trabajando ahora, pero por supuesto, esa es una versión tras otra … Ahora está en la versión 7. No fue un trabajo constante durante 10 años.

La primera versión, probablemente tomó alrededor de un año, pero se veía un poco diferente …

¿Que aprendi?

Mucho Todo No creo que realmente pueda expresar con palabras cuánto creces como programador trabajando en un gran proyecto.

Fue lo primero que escribí en Obj-C, así que aprendí eso. También tiene unos pocos miles de líneas de Swift ahora.

Aprendí Cocoa y algunos otros marcos de Mac.

¿Lo volvería a hacer?

¡Ciertamente, es mi trabajo!

Bueno, tenías que preguntar, así que ahora tengo que decírtelo. ..

El proyecto más divertido que escribí desde cero fue un detector de caos que escribí en la universidad. En ese momento estaba tomando un curso de estudio independiente en Sistemas dinámicos caóticos, y un curso obligatorio en Programación de microcomputadoras. Decidí juntarlos e intentar replicar los resultados que acababa de leer en Chaos, Scientific American (1986) de Robert Shaw. Una de las ideas más atractivas en el artículo es donde describe la detección de la transición al caos observada en un grifo que gotea. Cuando leí eso, pensé para mí mismo: “¡Oye! ¡Tengo un grifo que gotea! ¡Quizás también pueda detectar un sistema dinámico caótico! ”. Esto fue en el día, mucho antes de que la ingeniería de software alcanzara el elevado pináculo de la abstracción del hierro informático en bruto que vemos hoy.

En el lado del microprocesador, tenía una PC 8086 con MS-DOS. Hoy en día la gente simplemente se ríe del DOS como sistema operativo de juguete, pero le diré que hay un verdadero procesador de interrupción en tiempo real oculto en el BIOS, y con un poco de inteligencia puede cronometrar eventos hasta una granularidad de aproximadamente 10 microsegundos. Así es como funcionó. Escribí un programa de ensamblaje que primero deshabilitó la interrupción del reloj del sistema porque con esa granularidad era solo una fuente de error de tiempo, y luego comencé a sondear el chip serie 8250 UART. El circuito de sondeo era tan apretado que podía cronometrar las gotas de agua en función de los microsegundos por instrucción multiplicado por el número de ciclos entre gotas. Para detectar las gotas, conecté un LED detector de movimiento al TX y RX de las líneas de chips en serie para detectar el inicio y el final de cada gota, y escribí los ‘tiempos’ (iteraciones de bucle multiplicadas por microsegundos más una constante para el procesamiento de detección de gotas ) a una matriz en la memoria. Después de aproximadamente 30 segundos, detendría el programa y procesaría los datos. Para manejar los datos, puse una jarra de café (el agua no dispararía de manera confiable el LED) y usé un tubo de goma para dejar que goteara a través del detector de LED. Demasiado lento, y era aburridamente regular. Demasiado rápido, y fue un flujo sólido. Para ajustar el flujo al caos, utilicé una pequeña abrazadera en el tubo. El sistema era tan sensible que tuve que esperar hasta altas horas de la noche y pedirle a mi esposa que por favor no caminara por la casa, mientras hacía el experimento.

En el lado de las matemáticas , mi profesor de dinámica, (quien por cierto, era el cónyuge de mi profesor de microcomputadora, ¿cómo podría no hacer este proyecto ?), Me explicó el punto del Sr. Shaw sobre hacer un gráfico de serie temporal de un variable única en un sistema de ecuaciones diferenciales, que podría, para bajas dimensiones, mostrar una aproximación del espacio de estado subyacente y, potencialmente, el sistema caótico en la naturaleza. Dado que (explicó) los grifos que gotean son esencialmente resortes (cada gota se estira … y luego se suelta, dependiendo de la tensión superficial y la masa entrante del flujo), teníamos expectativas razonables de un sistema de baja dimensión. Ahora, fui un poco rápido en esa última parte, así que permítanme repetirlo en caso de que no les moleste su mente en la primera lectura. Puede tomar un sistema de ecuaciones diferenciales de un número desconocido de variables y medir una sola variable repetidamente a lo largo del tiempo, y utilizando una serie de tiempo, extraer información sobre todo el sistema. Puedes hacer esto con cosas reales en el mundo real. Es increíble, creo que es una de las ideas matemáticas más bellas que he escuchado.

¿Pero cómo visualizar los resultados? Como era una serie temporal, con suerte de baja dimensión, podría tomar (t0, t1, t2) como mi primer punto en el espacio 3D, (t1. T2, t3) como el segundo punto, y así sucesivamente. En consecuencia, escribí un programa para mi confiable impresora de matriz de puntos que proyectaba los puntos 3D en el espacio 2D, y justo al lado, dibujaba otro gráfico que proyectaba en un ángulo ligeramente diferente los mismos puntos. Bueno, resulta que si cruzas los ojos, las imágenes se fusionan, y si hay una estructura 3D, saltará de la página hacia ti.

Si bien mis resultados no fueron tan elegantes como los del Sr. Shaw, pude detectar patrones complejos en algunos de los gráficos y pude ver la transición a un sistema dinámico caótico a partir de pequeñas gotas de café.

Ese fue el programa más divertido en el que he trabajado. No estoy seguro de que me haya enseñado algo, excepto que tal vez no fui tan malo en esta cosa de programación después de todo (tenía 34 años en ese momento y mi experiencia laboral previa consistía en ser un cocinero de corta duración y trabajar en un aserradero ) Si hay estudiantes universitarios importantes de CS, EE o matemáticas que lean esto, te animo a que encuentres una manera de divertirte y programar el hierro de estas maravillosas máquinas.

sí … Convirtió un canal de cable de acceso local en una revista de video.

Monitores duales con memoria asignada. (una pantalla de edición, una pantalla de salida con un convertidor NTSC en la pantalla de salida)

Entrada sin bloqueo para que la pantalla de salida no se detenga.

Gráficos en tiempo real

interrumpir el acceso de módem controlado.

Control IR para ejecutar una videograbadora (bajo control de software)

tomó alrededor de 10,000 líneas de código para hacerlo …

¡Hola!

Bueno, en mi mundo de programación es muy poco lo que puedes hacer sin bibliotecas o compiladores … pero hice algo así, una vez, hace muchos años … ¡en MS-DOS!

Era la animación de un cuadro, usando solo comandos y aplicaciones estándar del sistema operativo.

Utilicé un comando dir para retrasar, cls para borrar la pantalla y editar para crear los diversos marcos 🙂

Solo un poco de diversión 🙂

Más de 100 proyectos que se han proporcionado como productos de alguna manera: integrados en hardware, a través de tiendas de aplicaciones, para clientes, para mi propio uso, etc.

Mi sitio enumera algunos de los menos embarazosos: Experiencia del producto cuando lo necesita (Propiedades y referencias).

¿Qué quieres decir con “desde cero”?

¿Escribir mi propio compilador? ¿En que idioma? ¿Construir mi propia computadora? ¿Hacer mis propios microchips?

¿Y qué quieres decir con “proyecto”? ¿Cuenta “Hello World”?

Esta pregunta sufre de ambigüedad terminal.