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

113

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 marcos 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 eso es todo?

Como estudiante, al usar un código que otros escribieron para resolver mi problema no puedo aprender todo lo que me gustaría, y obtengo menos información. Y a veces creo que esa frase es principalmente para programadores que trabajan con fechas límite y no para estudiantes como yo.

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

    
pregunta Gnijuohz 11.04.2012 - 05:43
fuente

20 respuestas

125

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

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

Dicho esto, en un entorno académico el objetivo es aprender , no entregar el software en 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 planes de estudio de programación incluyen una clase sobre compilación de compiladores cuando muy pocos programadores que trabajan tienen alguna razón para hacerlo.

    
respondido por el JohnFx 11.04.2012 - 05:25
fuente
19

La respuesta depende mucho del contexto. Si desea obtener un conocimiento más profundo 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 reutilizarlo de la biblioteca estándar es una pérdida total de tiempo.

    
respondido por el dasblinkenlight 11.04.2012 - 05:02
fuente
17

Como estudiante, espero que comiences tu educación de programación copiando primero una rueda o dos para comenzar, luego aprendes a modificar ruedas para ver cómo Trabajar, y entender cualquier limitación. Más tarde, incluso puede crear una nueva rueda propia para ver si puede mejorar el diseño o para mostrarle a su supervisor del curso su comprensión de los conceptos involucrados.

Sin embargo, como profesional que trabaja, esperaría que supieras qué rueda usar para resolver cualquier problema dado, y cuando sea apropiado modificar una rueda existente Si solo soluciona parcialmente tu problema. Si no puede encontrar una rueda en cualquier lugar, tal vez haya identificado un nicho de mercado, o no haya explorado lo suficiente, y tendría que tener la experiencia suficiente para saber cuando sería apropiado crear una nueva rueda propia.

El problema de cuándo es apropiado reinventar una solución es complejo, y requiere tiempo y experiencia para saber cuándo sería mejor crear una nueva versión de algo que ya se haya hecho antes. Cuando solo ha estado desarrollando durante un breve periodo de tiempo, es mejor utilizar una solución existente y pedir a sus mentores que sugieran opciones. Cuando tiene plazos ajustados y mucha incertidumbre en un proyecto, usar algo existente puede ser un gran ahorro de tiempo y siempre es su primera opción. Siempre puede refactorizar el uso de otras soluciones más adelante si es apropiado hacerlo, incluso si esto significa volver a reinventar su rueda .

    
respondido por el S.Robins 11.04.2012 - 05:56
fuente
11

Como profesor 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 configuro tareas para escribir un programa que ordene algunos datos; o trabajando en la funcionalidad de fechas, y pido un calendario.

Para ambos, hay innumerables bibliotecas y funcionalidades listas para usar; 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: configuro una tarea para escribir una aplicación simple para, por ejemplo, programar citas. Es probable que esto necesite una clasificación, un calendario y más. Esta vez se aplica "no reinventar la rueda": no quiero que los estudiantes luchen con los problemas resueltos, sino que reúnan la funcionalidad existente para obtener un resultado.

Mi dificultad es cuánto pedirte que recrear lo existente, lo que te ayude a aprender, y tiene la ventaja de problemas trillados con dificultades conocidas que puedo usar para hacerte practicar el oficio, y cuánto Debería colocarte en un entorno del mundo real, donde las ruedas no se reinventan.

Para responder a su pregunta de manera más directa, dos sugerencias:

  • Si un maestro te dice que "no reinventes la rueda", probablemente lo digan porque han 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 la tuya propia. También hay aprendizaje en eso, y la recreación es interesante pero no entiende el punto.
  • Si tiene demasiados ejercicios para reunir las llamadas de la biblioteca, en lugar de desarrollar algoritmos, podría plantear a sus profesores la cuestión del equilibrio entre estas actividades: resalte que nunca se le pidió que escribiera sus propios algoritmos para, por ejemplo. ordenar y fusionar. La comunicación nunca saldrá mal.
respondido por el boisvert 11.04.2012 - 13:42
fuente
6

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

Amplíe su conjunto de herramientas El uso de un marco tiene más beneficios cuando entiende lo que está haciendo (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 que no encaja, no es una excusa para adherirse ciegamente a esta regla general. Es posible que le falte tiempo, fondos, experiencia, por lo que solo debe parchearlo y terminar el viaje.

Hay pocos absolutos .

    
respondido por el JeffO 11.04.2012 - 13:59
fuente
2

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

Como alguien que fue estudiante hasta hace poco, creo que la cantidad de reinventar la rueda que es apropiada depende de la clase para la que estás 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 para entregar la tarea a tiempo, ¿qué está haciendo para tomar una clase tan fácilmente?) , pero te perderías mucho si fuera una asignación para una clase de redes. Por supuesto, los profesores generalmente toman en cuenta estas cosas cuando están creando tareas, por lo que la mayoría de las veces hará trabajos relacionados con la clase, pero a veces, es importante saber lo que no debe escribir por sí mismo. también.

Dicho esto, una vez que sales de la escuela, es difícil encontrar el tiempo para construir cosas que ya existen. Aproveche cada oportunidad que tenga cuando pueda, mientras todavía está en la escuela.

Si obtienes la opción "Usar la biblioteca X / framework Y" en SO, comienza tu pregunta con "Estoy escribiendo X por mi cuenta para obtener más información"

    
respondido por el Jay 11.04.2012 - 07:57
fuente
2

Si no tiene una fecha límite establecida para su proyecto, OMI, es mejor reinventar la rueda. Si no tiene un trabajo, o simplemente está buscando aprender para programar, no para ganar dinero programando, ¿cuál es el punto de usar atajos que no lo harán un mejor programador? simplemente hacer su proyecto 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.

    
respondido por el Billjk 11.04.2012 - 17:21
fuente
2

En la vida real, la rueda se reinventa una y otra vez. Si buscamos las razones, podríamos encontrar algo de información como cuando necesitamos reinventar la rueda en la programación.

Desde los tiempos sumerios, muchas cosas han cambiado:

  • El material utilizado para construir ruedas: de piedra, madera, metal, carbono, ...
  • el tamaño de los objetos que necesitan ruedas: en el tamaño de los nanómetros para instrumentos médicos y las ruedas para obtener carbón marrón, 100 m de tamaño
  • el entorno de producción - hecho a mano, o producción industrial
  • la precisión de las ruedas que se necesitan
  • La situación correcta alrededor de su rueda. Puede que haya una rueda perfecta para su trabajo, pero podría estar patentada.
  • El brillo y pulido para 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 de aceite o caucho natural, máquinas para fabricar ruedas y artesanos, disponibles para la producción. Poco hablado: 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 sea fluido
  • un algoritmo de clasificación puede estar sobredimensionado para 10 elementos, pero no escala hasta 1T de elementos
  • es posible que necesite una solución generada por el segundo programa
  • la precisión es más a menudo una pregunta digital en el terreno del software, si un algoritmo ordena una lista, se ordena, en su mayoría no. Pero además del rendimiento, el tamaño del código, el uso de la memoria u otras restricciones pueden ocurrir
  • Las patentes no necesitan más explicaciones, supongo.
  • La apariencia es una razón constante para reinventar algo: think 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 aplicación?
  • Y, por supuesto, la razón más famosa para construir tu propia rueda: te gusta aprenderlo.
respondido por el user unknown 12.04.2012 - 03:25
fuente
2

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

Empezamos 102 estudiantes, 23 lo completaron. 4 personas tiene un trabajo. ¿El motivo ?: Esas 4 personas (incluyéndome a mí) sabían cómo programar antes de que realmente empezáramos con la educación.

El resto de la gente se pierde. Porque nunca 'reinventamos la rueda'. Nunca llegamos a saber cómo funciona realmente el código. Es bastante sencillo 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, en realidad perdí 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 cómo hacer programación ...

Muchas enseñanzas 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 pasara más tiempo programando. Las personas pueden "inventar un nuevo tipo de rueda" si saben cómo construir una "rueda" normal. La gente no es estúpida si tiene un poco de conocimiento, pero no puedes pedirle a un hombre que no sabe nada sobre automóviles, que construya un automóvil ... Pero preguntar a un hombre que sabe cómo construir una bicicleta, sería mucho más fácil con realmente construir el coche.

    
respondido por el Zerpex 13.04.2012 - 08:59
fuente
1

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

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 rodar el suyo. Si está intentando 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 al mismo tiempo.

    
respondido por el back2dos 11.04.2012 - 09:19
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: escribir lo que es pertinente a la tarea. No significa que si la asignación es escribir una burbuja, la copia fuera de Wikipedia, ni significa usar array.sort o equivalentes si su marco o lenguaje lo proporciona. Pero después de haber cubierto los diversos algoritmos de clasificación, ha escrito su propia burbuja y rápida, no se moleste en volver a escribirla para cada nueva asignación, use la clasificación integrada o lo que escribió, no vuelva a hacer lo mismo otra vez .

Reinventar la rueda se trata de no perder tiempo, que es tan aplicable a los estudiantes como a los profesionales: la diferencia radica en cuáles son los objetivos. Los estudiantes deben estar aprendiendo, por lo que algo que no les ayude a comprenderlo es una pérdida de tiempo: después de que haya escrito una burbuja y sepa lo que hace, sabrá por qué no quiere usarlo en un conjunto grande. y reescribirlo una y otra vez es una pérdida de tiempo. No vas a aprender nada nuevo el 25 de reescritura.

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

    
respondido por el jmoreno 11.04.2012 - 09:29
fuente
1

Se han dedicado muchos pensamientos y esfuerzos para crear una rueda. El consejo es "no reinventar la rueda", pero puede seguir adelante y hacer ingeniería inversa de la rueda y entender 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. Puedes arruinarlo y aprender a no hacer eso.

Para mí, el estudiante no debería reinventar la rueda, sino intentar hacer ingeniería inversa & entender las implicaciones.

    
respondido por el Ramesh 11.04.2012 - 10:58
fuente
1

Yo diría que depende de si se está reinventando para ver cómo funciona la rueda o reinventar 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 y algoritmos elementales para comprender cómo afectarán el rendimiento de su código o elegir cuáles usar en diversas circunstancias.

Las pilas, pilas, listas enlazadas, árboles, etc. definitivamente valen la pena invertir en tiempo para implementarlas una vez; entonces nunca más utilizar los proporcionados por el marco. Todos los que usan un complemento de jQuery deben escribir al menos uno, pero no tiene que escribir cada tipo diferente de uno que jamás usará. Yo diría que es útil, pero no es necesario, escribir un programador de procesos pequeño o un mini-sistema operativo para que pueda comprender lo que sucede debajo de la computadora 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 atrás e implementar nuevas estructuras / algoritmos para familiarizarse con ellos. A menos que sea su trabajo o usted sea realmente bueno en eso, me quedaría con el uso de los existentes en su código.

    
respondido por el tvanfosson 11.04.2012 - 14:16
fuente
1

La respuesta depende de si desea aprender o crear.

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

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

Sin embargo, si el objetivo del alma es el aprendizaje con suficiente tiempo y resistencia, "reinventar la rueda" es la mejor opción, ya que ayuda a personalizar cada una de las funciones.

    
respondido por el CoolEulerProject 11.04.2012 - 18:34
fuente
1

Bueno, hay dos aspectos de esto.

En primer lugar, si está intentando aprender, puede ser útil hacer algunas cosas desde cero o usar interfaces de nivel inferior a las necesarias. Sin embargo, aún es necesario identificar lo que estás aprendiendo: si quieres aprender sobre el protocolo HTTP, no necesitas hacer la programación del socket tú mismo. Solo reinvente las cosas sobre las que está aprendiendo , y solo hágalo 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 necesita aprender. Una gran proporción de las preguntas sobre SO parece provenir de personas que no pueden leer la documentación.

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

    
respondido por el Marcin 13.04.2012 - 15:25
fuente
0

He enfrentado la misma situación. Es debido a la diferencia en la percepción en la industria y los académicos.

Si no "reinventas la rueda", no puedes estudiar nada en la escuela ni entender cómo funciona algo.

Mientras que en una industria, el objetivo es sacar 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 las empresas y no puedes quejarte.

    
respondido por el John 11.04.2012 - 08:20
fuente
0

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

  

Para diseñar o implementar una herramienta equivalente a una existente o parte de   uno, con la implicación de que hacerlo es una tontería o una pérdida de tiempo.   Esto suele ser una crítica válida. Por otro lado, los automóviles no lo hacen.   Utilice rodillos de madera, y algunos tipos de ruedas tienen que reinventarse muchos   veces antes de que tengas razón. Por el contrario, las personas que reinventan.   La rueda tiende a idear el equivalente moral de un trapezoide   con un eje desplazado.

Por lo tanto, podría ser bueno reinventar la rueda, pero asegúrate de ver las soluciones de otros antes o después de hacerlo.

    
respondido por el Hans-Peter Störr 16.04.2012 - 21:16
fuente
0

Respuesta A: Reinventa la rueda. Profundiza tu comprensión de las estructuras de datos y los algoritmos y hace que sea MUCHO más probable que escribas cosas buenas. Estoy seguro de que cuando Guido van Rossum estaba empezando 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 clang? Aprende todo Se un gigante. No dejes que la gente pequeña te limite. 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, crea una solución asombrosa y dale un enlace para que siga adelante. Sin embargo, primero, cumpla con los requisitos establecidos para que esté (s) contento (s).

    
respondido por el Patrick 17.04.2012 - 15:26
fuente
-1

Si eres un estudiante y, por lo tanto, no tienes un plazo establecido para tu proyecto, es mejor "reinventar la rueda". Si está programando ahora solo 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 más difícil? Pero, cuando te conviertas en un programador que trabaja, la gente será escéptica si no sabes cómo usar marcos o bibliotecas ...

    
respondido por el Billjk 11.04.2012 - 05:36
fuente
-2

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

Hace años fui asistente de asistencia para una clase de programación en 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 pedimos de vuelta fue "¿Su programa copiará el archivo?"

La pregunta del examen les pidió que escribieran un 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, entrada cerrada, salida cerrada), entonces no se copió el archivo.

Si el profesor dice que usa un marco o biblioteca (por ejemplo, una clase de gráficos puede pedirte que uses una biblioteca 3D), entonces usa lo que te dicen que uses. No inventes el tuyo o usa uno diferente. Cualquier cosa diferente hará que sea más difícil para el maestro calificar su trabajo.

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

    
respondido por el jqa 12.04.2012 - 04:13
fuente

Lea otras preguntas en las etiquetas