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?
fuente
Respuestas:
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.
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.
fuente
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.
fuente
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 .
fuente
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:
fuente
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 .
fuente
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"
fuente
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.
fuente
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:
¿Cómo se traduce eso al mundo del software? Bien,
fuente
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.
fuente
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.
fuente
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.
fuente
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.
Para mí, el estudiante no debe reinventar la rueda, sino tratar de aplicar ingeniería inversa y comprender las implicaciones.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
El Hacker Jargon Lexikon tiene un muy buen comentario sobre reinventar la rueda :
Por lo tanto, puede ser bueno reinventar la rueda, pero asegúrese de mirar las soluciones de otros antes o después de hacerlo.
fuente
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.
fuente
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 ...
fuente
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.
fuente
cp
su programa, de hecho copiarían el archivo.