Como programador principiante, ¿debería favorecer la construcción de mis propias bibliotecas en lugar de usar bibliotecas de terceros?

12

Como programador principiante de Python, ¿es una buena idea construir y comprender mis propias bibliotecas antes de saltar a bibliotecas avanzadas de terceros que contienen la funcionalidad que necesito?

Algunos proyectos (por ejemplo, marcos web como Django) son probablemente demasiado grandes para este enfoque. Pero otros proyectos (por ejemplo, rastreadores web, bibliotecas de gráficos, analizador HTML) parecen ser factibles.

Me preocupa que la dependencia temprana de bibliotecas de terceros obstaculice mi crecimiento.

Nota: esta pregunta y esta pregunta parecen centrarse más en programadores experimentados, que probablemente estén más centrados en la eficiencia de la reutilización que en el beneficio de aprendizaje. Mi pregunta, creo, se centra en los principiantes.

MikeRand
fuente
55
"nada más que un integrador de biblioteca en lugar de un programador": los clientes quieren que sea productivo. Ser capaz de evaluar e integrar las bibliotecas existentes es una habilidad importante que necesita para ser productivo. Si no hay una biblioteca disponible que se adapte a sus necesidades ... de lo contrario, concéntrese en resolver el problema comercial que su aplicación está abordando
Hamish Smith
2
¿Qué distinción hace entre "integrador de biblioteca" y "programador"? En 30 años, incluso haciendo controladores de dispositivos integrados a nivel de chip, nunca he trabajado sin bibliotecas. ¿Puedes explicar esta distinción?
S.Lott
Mal formulado. Han editado
MikeRand
Prefiero contratar un integrador de bibliotecas. ¿Por qué concentrarse en el cómo, mientras que podría concentrarse en las características? Después de ver unas pocas docenas de bicicletas mal reinventadas, me estremezco ante la idea de ver otra. El diseño de la biblioteca es un trabajo duro y un acto de equilibrio. Una tienda de software típica que no se especializa en diseño de bibliotecas no tiene las habilidades, los recursos y la paciencia adecuados para hacerlo correctamente. Cuidado con las reescrituras. Es mejor usar código que haya sido probado por otros que comenzar desde cero. Solo cuando hay un vacío se debe inventar, OMI.
Trabajo

Respuestas:

12

Esto siempre es una compensación.

Como programador principiante, debe hacerse dos preguntas al considerar la reutilización del código frente a la reinvención de la rueda cuadrada:

  1. ¿Aprenderé más sobre el problema que quiero resolver escribiendo todo desde cero o enfocándome en el dominio del problema y dejando de lado la complejidad que no es crítica para el problema que me interesa?
  2. ¿Es más importante para mí resolver el problema en cuestión o es más importante que comprenda algunos conceptos fundamentales?

Si no tiene que terminar su proyecto, está bien hacer girar sus ruedas sobre problemas complejos que otras personas ya han resuelto, porque aprenderá algo. Pero probablemente pasarás a otra cosa antes de "terminar", lo que puede o no importarte. Otros proyectos comenzarán a verse brillantes rápidamente cuando entres en un dominio complejo que parece simple hasta que comiences a tratar de resolverlo tú mismo.

No te obsesiones con ceder el control porque te estás refiriendo a la forma de pensar de otra persona; concéntrate más en lo que estás tratando de lograr.

Si su objetivo es escribir un analizador HTML porque desea comprender cómo funcionan los analizadores, hágalo. Si su objetivo es escribir un analizador HTML porque desea desinfectar la entrada del usuario o transformar algunos bits aleatorios de HTML, probablemente esté centrado en lo incorrecto, porque probablemente esté más interesado en la aplicación del análisis en lugar del análisis en sí . Si tiene ganas de escribir un analizador HTML porque no quiere tomarse el tiempo para comprender la biblioteca de otra persona, probablemente esté perdiendo el tiempo, porque, al menos en este caso, le garantizo que otra persona ha pasado más tiempo descubriendo cómo para resolver este problema de manera efectiva de lo que tendrás. En casos realmente triviales, puede ahorrar tiempo al no reutilizar el código, pero en los complejos, a menos que la biblioteca que usa sea mala o su capacidad para leer documentación y muestras de código sea mala,

Por otro lado, diría que vale la pena escribir su propia biblioteca de gráficos, ya que estará más enfocado en algoritmos y estructuras de datos fundamentales y transferibles que podrá aplicar a otros dominios, incluso si termina usando la biblioteca de otra persona cuando trabajas en esos problemas.

JasonTrue
fuente
Fantástico marco para pensar sobre el problema. Muy apreciado.
MikeRand
8

La mayoría de los programadores principiantes subestiman enormemente la complejidad de un problema. Esto lleva a muchas situaciones desagradables, pero me enfocaré en una sola: descartan muchas bibliotecas de terceros por estar "hinchadas" o "demasiado complicadas". Luego intentan escribir su propio código para hacer el mismo trabajo, y hacer un lío completo, porque no anticiparon todas las cosas que tendrían que manejar.

Tome el rastreo web y el análisis de HTML. Parece que tienes una actitud bastante informal hacia esas tareas, lo que me lleva a creer que nunca intentaste hacerlas en otra cosa que no sea una escala muy pequeña. Aquí hay una lista breve y no exhaustiva de los problemas potenciales que un rastreador web real debe resolver:

  • HTML mal formado.
  • Múltiples codificaciones de caracteres (el mundo entero no se ejecuta en ASCII).
  • Enlaces generados o modificados por JavaScript.
  • Enlaces a archivos binarios de varios gigabytes.
  • Tipos de mimo incorrectos.
  • Chocando en medio de una sesión de rastreo.
  • Pozos de alquitrán.
  • Consultores SEO.
  • Microsoft
Mike Baranczak
fuente
6

Me preocupa que la dependencia temprana de las bibliotecas de terceros obstaculice mi crecimiento y no me haga más que un integrador de bibliotecas en lugar de un programador.

Eso es falso

La confianza temprana en bibliotecas de terceros enseñará cómo funcionan las buenas bibliotecas.

El desarrollo prematuro es siempre una pérdida de tiempo. Escribir sus propias bibliotecas sin estudiar cuidadosamente (es decir, usar) las bibliotecas existentes lo condena a reinventar la rueda, mal, para el resto de su carrera.

He pasado muchas horas facturables limpiando esos líos.

S.Lott
fuente
No estoy seguro de estar totalmente de acuerdo con eso. A veces, las bibliotecas de terceros están mal escritas y pueden enseñar malos hábitos. Si los algoritmos subyacentes se comprenden bien, reinventar la rueda puede ser una buena idea y luego compararlos con otras bibliotecas para ver qué tan bien o mal se compara el suyo con los demás. En cualquier caso, obviamente alguna forma de tutoría es enormemente beneficiosa :)
Demian Brecht
Dicho esto, es beneficioso estudiar el API existente :)
Demian Brecht
2
@Demian Brecht: "A veces, las bibliotecas de terceros están mal escritas y en realidad pueden enseñar malos hábitos" Si bien esto podría ser cierto, la mayoría de los proyectos de código abierto son investigados en gran medida por una comunidad de usuarios y las malas ideas no resisten la sabiduría de la multitud. Además, "mal escrito" es un juicio que n00b no puede hacer de manera efectiva.
S.Lott
@ S.Lott: Bien dicho (re: n00b) :) Y supongo que tendrías que tener cuidado con las bibliotecas de terceros que miras, ya que algunas tienen comunidades muy pequeñas (si las hay). Esquivar proyectos aleatorios en github, por ejemplo, puede comenzar a llevarlo por el camino equivocado.
Demian Brecht
2
@Demian Brecht: No puedes desarrollar ningún juicio hasta que hayas visto una variedad de bibliotecas. No hay forma posible de "prefiltrar" las bibliotecas para que las use un n00b. Es todo bibliotecas o no bibliotecas.
S.Lott
4

Esta oración, que es la primera, es lógicamente problemática para mí:

Como programador principiante de Python, ¿es una buena idea construir y comprender mis propias bibliotecas antes de saltar a bibliotecas avanzadas de terceros que contienen la funcionalidad que necesito?

¿Cómo puede creer que puede escribir efectivamente bibliotecas de funcionalidad avanzada (su palabra) como principiante que serán tan correctas, completas y probadas como las bibliotecas existentes?

Esto ni siquiera menciona la gran cantidad de tiempo que desperdiciarías reinventando una rueda que no entiendes como principiante, que finalmente abandonarás cuando, si tienes suerte, te das cuenta de que estás loco y tienes que aprender el saliendo de la biblioteca de todos modos.

Tomemos como ejemplo el análisis HTML, mencionas esto como factible, no hay forma de que puedas hacer un mejor trabajo que Beautiful Soup como principiante. Claro y simple, fracasarás. Las cosas que crees que son factibles tienen problemas de gran complejidad que no estás teniendo en cuenta, no conoces el dominio del problema con suficiente detalle para comprender la complejidad, estás condenado al fracaso solo por eso.

Mi opinión es aprender lo que otras personas han hecho y ya han resuelto su problema por usted, hasta que no pueda encontrar algo que solucione su problema.


fuente
1

Esta es solo mi opinión, pero sugeriría crear sus propias bibliotecas para un código bastante simple y reutilizable. Para cualquier cosa más compleja, puede usar bibliotecas de terceros, que se han creado y probado exhaustivamente (¡con suerte!). Crear una biblioteca robusta puede llevar mucho tiempo, dependiendo de lo que sea. ¡Estoy seguro de que obtendrás mucha práctica de programación con solo construir tu aplicación!

Jon Onstott
fuente