¿La frase "nunca reinventar la rueda" es adecuada para los estudiantes?

115

Me encuentro constantemente con esta expresión "no reinventar la rueda" o "nunca reinventar la rueda" cuando hago algunas preguntas sobre SO. Te dicen que uses algunos frameworks o paquetes existentes. Sé de dónde viene esta actitud, ya que no es prudente perder el tiempo en algo que otros ya han resuelto. ¿O es así?

Como estudiante, descubro que al usar algunos códigos que otros escribieron para resolver mi problema, no puedo aprender tanto como me gustaría y obtengo menos información. Y a veces creo que esa frase es principalmente para los programadores que trabajan que se enfrentan a plazos y no para estudiantes como yo.

¿Es tan malo "reinventar la rueda"? Tal vez estoy pensando mal? ¿Quizás haya una manera de evitar reinventar la rueda y al mismo tiempo aprender mucho?

Gnijuohz
fuente
51
No obtendrá muchos beneficios de unirse a un gimnasio si consigue que otras personas levanten las pesas por usted (a menos que esté aprendiendo a ser un pesebre).
Charles E. Grant
82
Está bien reinventar la rueda cuando vas a construir ruedas. Cuando construye casas, es una buena idea asumir que los fabricantes de ruedas saben lo que están haciendo mejor que usted.
zzzzBov
22
¡Al menos necesitas INTENTAR hacer una rueda! De lo contrario, no sabe por qué debería usar uno prefabricado.
59
Es no apropiado declarar un absoluto. :)
un CVn
2
Puede estar bien reinventar las ruedas cuando está creando un código extremadamente optimizado. Las bibliotecas estándar son muy útiles, pero a menudo es posible crear algo que es menos general pero más rápido.
Leo

Respuestas:

126

Creo que haces un buen punto. La mayoría de los programadores en este sitio probablemente sean profesionales que trabajan cuyo objetivo es más o menos crear un software de calidad lo más rápido posible. Reinventar la rueda falla este objetivo por dos razones.

  1. Reescribir el código que existe es un esfuerzo inútil que podría usarse en las partes únicas de su sistema y hace que el proyecto tarde más de lo necesario.
  2. La primera versión de cualquier código tiene más probabilidades de tener errores / problemas imprevistos. La mayoría de las bibliotecas y componentes reutilizables han sido probados en batalla y parcheados varias veces. Si reinventa un algoritmo de hash o intenta crear su propio RDBMS (a menos que ese sea el proyecto), la mayoría de las veces obtendrá resultados inferiores.

Dicho esto, en un entorno académico, el objetivo es aprender , no entregar software con un presupuesto. Reinventar una rueda para comprender cómo funcionan los radios o el eje es una excelente manera de lograr ese objetivo. Es por eso que muchos programas de programación incluyen una clase sobre compiladores de compilación cuando muy pocos programadores que trabajan tienen alguna razón para hacerlo.

JohnFx
fuente
37
Estoy de acuerdo con la idea de entender cómo funcionan las cosas, aunque también deseo que las escuelas de programación se tomaran un tiempo en su plan de estudios para aprender a usar bibliotecas de terceros y por qué deberían hacerlo. Constantemente encuentro programadores y desarrolladores de capacidad profesional que no pueden hacer esto y terminan reinventando la rueda.
Spoike
3
gran punto sobre compiladores
Chani
1
Creo que aprender a no reinventar la rueda es más importante. Hay muchas cosas que puede hacer que no implican crear algo que ya se creó.
Thomas Bonini
@Krelp Mientras uno es estudiante, los conceptos son la parte más importante. Muchos profesores usan ejemplos de código para permitir una teoría y aplicación de puente. Esos son los tipos de programas que van a reinventar la biblioteca, pero es para asegurarse de que los estudiantes entiendan el material.
Jetti
2
Como estudiante, debe reinventar la rueda para ver por qué va tan rápido como lo hace, pero como profesional necesita usar ruedas comerciales para poder ir lo más rápido posible. Desafortunadamente, resulta que SO es principalmente un sitio para profesionales, no para estudiantes (¿no prohibieron [la tarea] por un tiempo?)
Tacroy
19

La respuesta depende mucho del contexto. Si desea obtener una comprensión más profunda de las estructuras de datos al intentar implementar una tabla hash, "reinventar la rueda" es lo mejor que puede hacer. Si está aprendiendo a escribir compiladores y necesita una tabla de símbolos, implementar su propio mapa hash en lugar de reutilizar uno de la biblioteca estándar es una completa pérdida de tiempo.

dasblinkenlight
fuente
17

Como estudiante, esperaría que comenzara su educación de programación copiando primero una o dos ruedas para comenzar, luego aprendiendo a modificar las ruedas para ver cómo funcionan y comprender cualquier limitación. Más tarde, incluso podría crear una nueva rueda propia para ver si puede mejorar el diseño o para mostrarle a su supervisor de curso su comprensión de los conceptos involucrados.

Sin embargo, como profesional que trabaja, esperaría que haya aprendido qué rueda usar para resolver cualquier problema dado, y cuándo podría ser apropiado modificar una rueda existente si solo resuelve parcialmente su problema. Si no puede encontrar una rueda en ningún lado, entonces quizás haya identificado un nicho de mercado, o no haya explorado lo suficiente, y necesitaría tener la experiencia suficiente para saber cuándo sería apropiado crear una rueda nueva para su propio.

La cuestión de cuándo es apropiado reinventar una solución es compleja y requiere tiempo y experiencia para aprender cuándo podría ser mejor crear una nueva versión de algo que ya se ha hecho antes. Cuando solo ha estado desarrollando por un corto tiempo, es mejor simplemente usar una solución existente y pedirles a sus mentores que sugieran opciones. Cuando tiene plazos ajustados y mucha incertidumbre en un proyecto, usar algo existente puede ahorrarle mucho tiempo y siempre es su primera opción. Siempre puede refactorizar para usar otras soluciones más adelante si es apropiado hacerlo, incluso si esto significa volver a reinventar su rueda .

S.Robins
fuente
12

Como maestro o programador, lucho constantemente con el lado opuesto del problema: ¿cuándo les pido a los estudiantes que reinventen la rueda?

Tome estas situaciones simples: estamos estudiando el algoritmo de clasificación y establezco tareas para escribir un programa que clasifique algunos datos; o trabajando en la funcionalidad de la fecha, y solicito un calendario.

Para ambos, hay innumerables bibliotecas y funcionalidades listas para usar disponibles; pero quiero que los estudiantes los eviten y desarrollen su propia versión de un algoritmo de clasificación o de un calendario.

Ahora tome este otro: configuré una tarea para escribir una aplicación simple para, por ejemplo, programar citas. Es probable que esto necesite ordenar, un calendario y más. Esta vez se aplica "no reinventar la rueda": no quiero que los estudiantes luchen con problemas resueltos, sino que reúna la funcionalidad existente para obtener un resultado.

Mi dificultad es cuánto pedirle que recree lo existente, lo que lo lleva a aprender y tiene la ventaja de problemas bien solucionados con dificultades conocidas que puedo usar para hacer que practique el oficio, y cuánto debería colocar. usted en un entorno del mundo real, donde las ruedas no se reinventan?

Para responder su pregunta más directamente, dos sugerencias:

  • Si un maestro le dice que "no reinvente la rueda", probablemente lo diga porque ha diseñado su problema de esa manera. Tal vez quieran que pruebes una biblioteca, luches con la implementación de un algoritmo por parte de otra persona, en lugar de escribir el tuyo, también hay aprendizaje en eso, y la recreación es interesante pero pierde el punto.
  • Si tiene demasiados ejercicios para reunir llamadas de la biblioteca, en lugar de desarrollar algoritmos, puede plantear a sus maestros la cuestión del equilibrio entre estas actividades: resalte que nunca se le ha pedido que escriba sus propios algoritmos, por ejemplo, ordenar y fusionar. La comunicación nunca saldrá mal.
boisvert
fuente
6

Práctica Dudo que las primeras 1000 líneas de código que alguien escribe sean muy únicas.

Amplíe su conjunto de herramientas El uso de un marco tiene más beneficios cuando comprende lo que está haciendo (casi hasta el punto en que podría hacerlo usted mismo) para que sepa cómo aplicarlo.

Comprenda las "ruedas" El uso de una rueda mal construida y desgastada o una que no encaja, no es excusa para apegarse ciegamente a esta regla general. Es posible que tenga poco tiempo, fondos y experiencia, por lo que solo debe parcharlo y terminar el viaje.

Hay pocos absolutos .

JeffO
fuente
1
+ Especialmente para el último punto.
Mike Dunlavey
Las primeras 1000 líneas de código que alguien escribe tienden a ser muy únicas en términos de errores creativos.
Leftaroundabout
@leftaroundabout: supongo que debería limitar esa declaración a líneas de código que puedan compilarse.
JeffO
3

Los estudiantes no tienen presupuestos de dinero para completar las tareas, pero hay fechas de vencimiento para considerar.

Como alguien que era estudiante hasta hace poco, creo que la cantidad de reinvención de la rueda que sea apropiada depende de la clase para la que está haciendo la tarea. No desea escribir su propia biblioteca de sockets para una clase de diseño y desarrollo web (si puede hacer eso y entregar la tarea a tiempo, ¿qué hace tomando una clase así de fácil?), Pero se estaría perdiendo mucho si fuera una tarea para una clase de redes. Por supuesto, los profesores suelen tener en cuenta estas cosas cuando crean tareas, por lo que en su mayoría harás un trabajo relacionado con la clase, pero a veces, saber lo que no debes escribir tú mismo también es importante.

Dicho esto, una vez que dejas la escuela, es difícil encontrar el tiempo para construir cosas que ya existen. Aproveche todas las oportunidades que pueda cuando pueda, mientras todavía está en la escuela.

Si obtiene el pincel "Usar biblioteca X / framework Y" en SO, prefacio su pregunta con "Estoy escribiendo X por mí mismo para obtener más información al respecto"

Arrendajo
fuente
Prefacio su pregunta con "Estoy escribiendo X por mí mismo para obtener más información al respecto". Esta. +1.
boisvert
2

Si no tiene una fecha límite establecida para su proyecto, en mi opinión, es mejor reinventar la rueda. Si no tiene un trabajo, o simplemente está buscando aprender a programar, no ganar dinero programando, ¿cuál es el punto de usar atajos que no lo convertirán en un mejor programador, los que simplemente harán que su proyecto se haga más rápido? Aunque esto es cierto, definitivamente es una buena habilidad saber cómo usar bibliotecas, marcos y el código de otras personas.

Billjk
fuente
Esta es la idea detrás del concepto de Code Katas, reescribir código una y otra vez para mejorar y aprender de él. Yo diría que incluso en el trabajo reescribir su código repetidamente es bueno, y poder implementar muchos patrones si es necesario es aún mejor.
Bill K
2

En la vida real, la rueda se reinventa una y otra vez. Si buscamos las razones, podríamos encontrar una idea de cuándo necesitamos reinventar la rueda en la programación.

Desde la época sumeria, muchas cosas han cambiado:

  • El material utilizado para construir ruedas: de piedra, madera, metal, carbono, ...
  • del tamaño de los objetos que necesitan ruedas: del tamaño de nanómetros para instrumentos médicos y ruedas para obtener lignito, 100 m de tamaño
  • El entorno de producción: producción artesanal o industrial.
  • la precisión de las ruedas que se necesitan
  • La situación correcta alrededor de tu rueda. Puede haber una rueda perfecta para su trabajo, pero podría estar patentada.
  • El brillo y el pulido de tu rueda. Un Cadillac podría merecer otra rueda que un VW Golf.
  • La rueda óptima para un cochecito de bebé depende de muchos parámetros: tamaño y peso del cochecito (más bebés), circunstancias climáticas, precios de los recursos para el aceite o el caucho natural, máquinas para construir ruedas y artesanos, disponibles para la producción. En pocas palabras: economía mundial.

¿Cómo se traduce eso al mundo del software? Bien,

  • Puede haber un servidor web, pero desafortunadamente está escrito en PHP. Preferiría tenerlo en un idioma que domine
  • un algoritmo de clasificación puede ser demasiado grande para 10 elementos, pero no escala hasta 1T de elementos
  • Es posible que necesite una solución generada por un segundo programa
  • La precisión es con frecuencia una pregunta digital en software, si un algoritmo ordena una lista, está ordenada, en su mayoría no ordenada. Pero además del rendimiento, el tamaño del código, el uso de memoria u otras restricciones pueden ocurrir
  • Las patentes no necesitan más explicaciones, supongo.
  • La apariencia es una razón constante para reinventar algo: piense en dropDownList (ComboBox).
  • La situación económica global puede influir en su rueda de software: ¿será una rueda de nube, una rueda de código abierto, una rueda de navegador o una rueda de aplicaciones?
  • Y, por supuesto, la razón más famosa para construir tu propia rueda: te gusta aprenderla.
usuario desconocido
fuente
2

Soy un estudiante recién educado. En la escuela estábamos "aprendiendo" asp.net y C #, esos 2 años que llevó la educación, nunca tratamos de crear nuestro propio sistema de correo electrónico, sistema de inicio de sesión o CMS. Todo estaba simplemente arrastrando y soltando el control en la vista de diseño .

Comenzamos 102 estudiantes, 23 completaron. 4 personas tiene un trabajo. ¿La razón ?: Esas 4 personas (incluyéndome a mí) sabían programar antes de que empezáramos la educación.

El resto de la gente está perdida. Porque nunca 'reinventamos la rueda'. Nunca supimos cómo funciona realmente el código. Es bastante simple crear un sistema de inicio de sesión completo, con administración de usuarios, pero los estudiantes de mi educación no saben cómo hacerlo. Porque no saben cómo funciona realmente un sistema de inicio de sesión.

Me siento triste, que en algún momento, realmente desperdicié 2 años, sin aprender nada. - Deseo que los maestros de todo el mundo digan: Sí, sabemos que hay marcos, donde existe el código, puedes usarlos en la vida real ... Pero en esta educación aprenderás a programar.

Muchas educaciones de programación son muy cortas, por lo que las educaciones deben cubrir muchas cosas dentro de ese tiempo. Creo que sería mejor que la lista de cosas se redujera a la mitad y dedicara más tiempo a la programación. Las personas pueden "inventar un nuevo tipo de rueda" si saben cómo construir una "rueda" normal. Las personas no son estúpidas si tienen un poco de conocimiento, pero no se le puede pedir a un hombre que no sabe nada de automóviles, que construya un automóvil ... Pero pedirle a un hombre que sepa cómo construir una bicicleta, sería mucho más fácil con realmente construir el auto.

Zerpex
fuente
1

Realmente depende de lo que estés haciendo. Si está tratando de entender las ruedas, es una buena idea reinventarlas usted mismo. Sin embargo, si está tratando de entender los automóviles, reinventar la rueda o los motores de combustión interna generalmente es un desperdicio y una distracción.

Entonces, por ejemplo, cuando esté interesado en comprender cómo podría funcionar un índice de búsqueda de texto completo, es una buena idea intentar crear el suyo propio. Si está tratando de crear una aplicación para la gestión de documentos, es mejor reutilizar una biblioteca existente, porque la mayor parte de su trabajo consiste en obtener la arquitectura de la aplicación y la experiencia del usuario correctas al mismo tiempo.

back2dos
fuente
1

Sí, es apropiado decirles a los estudiantes que no reinventen la rueda. Pero debe haber una comprensión clara de lo que significa para un estudiante: escriba lo que corresponde a la tarea. No significa que si la tarea es escribir un bubbleort, lo copia de Wikipedia, ni significa usar array.sort o equivalentes si su marco o idioma lo proporciona. Pero después de que haya cubierto los diversos algoritmos de clasificación, haya escrito su propio bubbleort y quicksort, no se moleste en reescribirlo para cada nueva asignación, use la clasificación integrada o lo que escribió, no vuelva a hacer lo mismo de siempre. .

Reinventar la rueda se trata de no perder el tiempo, lo cual es tan aplicable a los estudiantes como a los profesionales: la diferencia radica en cuáles son los objetivos. Los estudiantes deberían estar aprendiendo, por lo que algo que no fomenta su comprensión es una pérdida de tiempo: después de haber escrito una burbuja, sabes lo que hace, sabes por qué no quieres usarlo en un conjunto grande, y reescribirlo una y otra vez es una pérdida de tiempo. No vas a aprender nada nuevo en la reescritura 25.

Para los estudiantes, no significa no escribir lo que otros han escrito, significa no rehacer lo que ya ha dominado, ese tiempo que podría gastarse mejor en lo que no ha dominado.

jmoreno
fuente
Excepto si la reescritura número 25 es una práctica para algún lenguaje de programación que estás aprendiendo recientemente.
Leftaroundabout
1

Se han dedicado muchos pensamientos y esfuerzos a crear una rueda. El consejo es "no reinventar la rueda", pero puede seguir adelante y aplicar ingeniería inversa a la rueda y comprender por qué ciertas cosas se hacen de la manera en que se hacen. Después de esto, puede intentar implementar la rueda a su manera, lo que podría resultar en cualquiera de los tres extremos lógicos.

  1. O bien entiendes por qué las cosas son como son.
  2. Puede optimizarlo y mejorarlo
  3. Podrías arruinarlo y aprender a no hacer eso.

Para mí, el estudiante no debe reinventar la rueda, sino tratar de aplicar ingeniería inversa y comprender las implicaciones.

Ramesh
fuente
1

Diría que depende de si está reinventando para ver cómo funciona la rueda o reinventando la rueda en el proceso de realizar alguna otra tarea. Ciertamente, hay ruedas que cada estudiante necesita implementar al menos una vez por su cuenta. Debe saber cómo funcionan algunas estructuras de datos elementales y algoritmos para comprender cómo afectarán el rendimiento de su código o elegir cuáles usar en diversas circunstancias.

Las pilas, los montones, las listas enlazadas, los árboles, etc. definitivamente valen la pena en tiempo para implementar una vez; luego, siempre después de usar los proporcionados por el marco. Todos los que usan un complemento jQuery deben escribir al menos uno, pero no tiene que escribir cada tipo diferente de uno que usará alguna vez. Yo diría que es útil, pero no necesario, escribir un pequeño programador de procesos o un mini-SO para que pueda entender lo que sucede debajo del capó en una computadora. Sin embargo, debe comprender cómo funcionan los procesos, subprocesos, etc.

Una vez que tenga un buen conocimiento práctico, también puede ser importante (y divertido) volver e implementar nuevas estructuras / algoritmos para tener una idea de ellos. A menos que sea su trabajo o que sea realmente bueno en eso, me quedaría con el uso de los existentes en su código.

tvanfosson
fuente
1

La respuesta depende de si deseas aprender o crear.

Si el objetivo es aprender, "reinventar la rueda" puede brindarle una mayor comprensión y una mejor comprensión que el uso de las ruedas existentes (funciones de biblioteca).

Pero si el objetivo es crear un producto complicado, entonces "reinventar la rueda" puede ser una práctica que requiere mucho tiempo y ayudará poco a la creación del producto.

Sin embargo, si el objetivo del alma es aprender con suficiente tiempo y resistencia, "reinventar la rueda" es la mejor opción, ya que ayuda a personalizar cada característica.

CoolEulerProject
fuente
1

Bueno, hay dos aspectos para esto.

En primer lugar, si está tratando de aprender, puede ser útil hacer algunas cosas desde cero o utilizar interfaces de nivel inferior de lo necesario. Sin embargo, aún es necesario identificar lo que está aprendiendo: si desea aprender sobre el protocolo HTTP, no necesita hacer la programación del socket usted mismo. Solo reinventa las cosas que estás aprendiendo , y solo hazlo para explorarlas y comprenderlas realmente.

Pero, una de las habilidades más importantes de un programador profesional es seleccionar, aprender y usar software preexistente. Esto es algo que también debes aprender. Una gran proporción de las preguntas sobre SO parece provenir de personas incapaces de leer la documentación.

Finalmente, la programación se basa en una base teórica sustancial. Necesitará usar ambos ejercicios prácticos, junto con la lectura, para aprender la teoría.

Marcin
fuente
Estoy de acuerdo. Es por eso que hay tantos nuevos marcos de software y bibliotecas preexistentes que se crean todo el tiempo :)
gbjbaanb
0

Me he enfrentado a la misma situación. Se debe a la diferencia de percepción en la industria y el mundo académico.

Si no "reinventa la rueda", entonces absolutamente no puede estudiar nada en la escuela o entender cómo funciona algo.

Mientras que en una industria, el objetivo es presentar un producto en menos tiempo y esfuerzo.

Personalmente, me gusta ir por el agujero del conejo y detesto la filosofía de la industria, pero así es como se hacen los negocios y no te puedes quejar.

John
fuente
0

El Hacker Jargon Lexikon tiene un muy buen comentario sobre reinventar la rueda :

Diseñar o implementar una herramienta equivalente a una existente o parte de una, con la implicación de que hacerlo es una tontería o una pérdida de tiempo. Esto es a menudo una crítica válida. Por otro lado, los automóviles no usan rodillos de madera, y algunos tipos de ruedas tienen que reinventarse muchas veces antes de hacerlo correctamente. Por otro lado, las personas que reinventan la rueda tienden a encontrar el equivalente moral de un trapecio con un eje desplazado.

Por lo tanto, puede ser bueno reinventar la rueda, pero asegúrese de mirar las soluciones de otros antes o después de hacerlo.

Hans-Peter Störr
fuente
0

Respuesta A: Reinventa la rueda. Profundiza su comprensión de las estructuras de datos y algoritmos y hace MUCHO más probable que escriba cosas buenas. Estoy seguro de que cuando Guido van Rossum estaba comenzando en Python, la gente le dijo que no reinventara la rueda. Ya había muchos idiomas. ¿Por qué escribir google cuando ya existía Yahoo! ¿Qué tal el sonido metálico? Aprende todo Se un gigante. No dejes que las personas pequeñas te limiten. Respuesta B: Si un instructor te dice qué hacer, dale lo que quiere, o solo un poco más, incluso si parece tonto. Si TAMBIÉN quieres volverte loco haciendo una solución sorprendente y darle un enlace, adelante. En primer lugar, sin embargo, cumpla con los requisitos establecidos como se indica para que esté contento.

phorgan1
fuente
-1

Si eres estudiante y, por lo tanto, no tienes una fecha límite establecida para tu proyecto, es mejor "reinventar la rueda". Si está programando ahora simplemente para aprender a programar y no para ganar dinero, ¿por qué tomar atajos que no lo ayudarán a aprender? ¿Por qué no hacerlo de la manera difícil? Pero, cuando te conviertes en un programador que trabaja, la gente se mostrará escéptica si no sabes cómo usar frameworks o bibliotecas ...

Billjk
fuente
10
No sé a qué escuela asististe, pero a dónde fui, los plazos para la asignación eran comunes.
un CVn
-2

Haz lo que la tarea / pregunta / examen te pide que hagas.

Hace años era un TA para una clase de programación C. Una pregunta del examen fue "Escribir un programa para copiar un archivo". Varios estudiantes hicieron el mismo tipo de pregunta: ¿pueden generar un proceso y ejecutar el comando cp del sistema operativo?

Lo que les preguntamos fue "¿Copiaría su programa el archivo?"

La pregunta del examen les pidió que escribieran código para copiar un archivo. Si la respuesta no tenía el código C que copiaba el archivo (por ejemplo, entrada abierta, salida abierta, un bucle para leer / escribir bytes, cerrar entrada, cerrar salida), entonces no copiaba el archivo.

Si el profesor dice que use un marco o una biblioteca (por ejemplo, una clase de gráficos puede decirle que use una biblioteca 3D), entonces use lo que le dicen que use. No inventes el tuyo ni uses uno diferente. Cualquier cosa diferente dificultará que el maestro califique su trabajo.

En una entrevista de trabajo, el conocimiento de los marcos populares lo ayudará a responder preguntas. Crea tus propios proyectos para aprender. Buena suerte con sus estudios.

jqa
fuente
Sí, pero si generaran cpsu programa, de hecho copiarían el archivo.
Marcin