¿Debería usar una biblioteca cuando puede hacer la tarea sin ella? [cerrado]

33

Estoy en una situación en la que puedo usar un complemento de JavaScript de código abierto para realizar una tarea. Pero cuando traté de usarlo, descubrí que tenía que rediseñar muchas cosas de lo que ya había hecho, y agrega una cierta complejidad, en mi humilde opinión, al proyecto. Mientras que puedo lograr la misma tarea con un código limpio, puedo crearlo yo mismo y sin necesidad de cambiar lo que he hecho hasta ahora.

¿Debería optar por una biblioteca de todos modos en esta situación (como por el código de mejor calidad?)

Billal Begueradj
fuente
3
¿Cómo estás midiendo la "calidad"? ¿Por el número de líneas de código? Clases? ¿Complejidad? Mantenibilidad? ¿Resistencia?
Laiv
3
La respuesta es NO, no importa lo que considere calidad o no. Pero si nos proporciona su idea de calidad, las respuestas abordarán su razonamiento para explicar por qué la cantidad de bibliotecas no mejora lo que usted considera calidad. Es una mera cuestión de precesión. Como es ahora, un simple NO responderá la pregunta sin necesidad de explicación.
Laiv
44
No es una respuesta directa a su pregunta, pero la idea de que "este número" garantiza inevitablemente una "mejor calidad" no se da cuenta de las dificultades de aumentar la calidad del código. No hay una solución rápida para garantizar la calidad. Si existiera, el problema no existiría. Cualquiera que afirme que un cierto enfoque simple es la solución integral es (en el mejor de los casos) sobregeneralizar o (en el peor) impulsar su idea defectuosa como una verdad.
Flater
3
¿Qué te hace pensar que usar la biblioteca aumentaría la calidad del código?
Deja de dañar a Monica
1
Se votó para cerrar porque la pregunta parece haber sido reformulada significativamente, y las respuestas superiores responden a la versión anterior ... mejor vuelva a publicar la pregunta tal como está ahora (además agregue los detalles para evitar el "tablero demasiado" "votos) ...
AnoE

Respuestas:

54

Como ingeniero, tal vez sea conveniente pensar en esto como un problema de optimización. Naturalmente, debemos tener un objetivo de optimización . Una situación común en este tipo de situación sería minimizar el costo total de propiedad .

Si cree que agregar el componente de terceros ahorrará costos a largo plazo, debe usarlo. Si no lo haces, no deberías. Asegúrese de considerar el costo del mantenimiento continuo (por ejemplo, cuando se lanza una nueva versión de O / S, o se encuentra una falla de seguridad, o se lanza alguna nueva especificación W3C).

Para muchos problemas triviales, será más económico hacer crecer el suyo propio, pero para problemas moderadamente complejos fuera de la competencia central de su organización, a menudo tendrá sentido ser un tercero.

También hay otros objetivos a considerar (por ejemplo, riesgo) pero el TCO es el más grande.

John Wu
fuente
1
Creo que esta respuesta necesita más votos a favor. - La fiabilidad a largo plazo con las bibliotecas puede ser un gran problema. E incluso si existe una biblioteca, ¿quién sabe si las API cambiarán? Las bibliotecas son fáciles a corto plazo, pero pueden causar problemas a largo plazo. (Nota al
margen
66
@DetlevCM La respuesta también dice que puede ser muy fácil al revés. Las bibliotecas no triviales tendrán costos de mantenimiento adjuntos que usted, como usuario de la biblioteca, no tiene que pagar, y tal vez no podría pagar si fuera necesario (es decir, si fuera el propietario de la biblioteca).
Cubic
Estoy de acuerdo, pero no olvide considerar también el costo de la biblioteca: errores, cambios de diseño fuera de su control y grupos de código que no está utilizando solo para incorporar una sola función. Además, la biblioteca a menudo no es tan expresiva como su solución podría ser para su problema dado. TAMBIÉN no puede depurar una biblioteca externa tan fácilmente y si lo hace, tendrá que lidiar con más problemas de fusión más adelante. ¡No asuma que una solución de biblioteca es más liviana, considere todos los factores y no tenga miedo de codificar su propia solución si la biblioteca no encaja bien!
Bill K
36

Bill Gates dijo una vez:

"Medir el progreso de la programación por líneas de código es como medir el progreso de la construcción de aeronaves por peso".

Me viene a la mente esta cita porque, en última instancia, podría decirse lo mismo para el número de bibliotecas. Como regla, no uso bibliotecas a menos que:

  1. No hay otra forma de hacerlo. Prescindir ya no sería económicamente viable para producir el producto a tiempo y dentro del presupuesto.
  2. Me ahorraría una gran cantidad de tiempo, ya que requeriría muchas de las características de dicha biblioteca
  3. La biblioteca está bien utilizada y cualquier problema potencial que pueda tener estaría bien documentado.

Idealmente se cumplen las tres condiciones, pero me conformaría con dos. La conclusión es que no debería agregar una biblioteca a su programa a menos que tenga un propósito. Si tiene que preguntar cuál es ese propósito, probablemente no debería agregarlo a su programa. La calidad del código del de su programa se beneficia porque invoca con elegancia cada biblioteca sin verse agobiada por la necesidad de reescribir necesariamente las bibliotecas dentro de su programa.

¡Buena suerte!

Neil
fuente
44
@BillalBegueradj Cita significativa, sí. Adecuado, no. No estamos hablando de progreso, estamos hablando de la calidad del software, y las líneas de código tienen una correlación muy fuerte con la cantidad de defectos encontrados. Consulte el documento El efecto de confusión del tamaño de la clase sobre la validez de las métricas orientadas a objetos que muestra que todas las otras métricas no tienen poder predictivo sobre los defectos encontrados después de ajustar por LOC, lo que significa que LOC es el mejor predictor de defectos (o era en ese momento: 2001). Y, por cierto, el artículo científico supera la famosa cita.
Theraot
55
@Theraot ¿Está sugiriendo que, dado que la cantidad de líneas determina la cantidad de defectos, los programas más grandes tienen peor calidad de código que los programas más pequeños? No estoy de acuerdo con tu métrica, lo siento. Además, si la cita realmente te molesta, no dudes en ignorarla.
Neil
3
@Neil para ser claro, el número de líneas no determina el número de defectos, tiene una fuerte correlación con el número de defectos encontrados. Esto es fácil de entender: cuanto más grande es el código, más oportunidades hay de que se introduzcan defectos. Por supuesto, el número de defectos disminuirá después de que se encuentren y reparen. Esto es solo correlación después de todo. Anexo: LOC supera muchas métricas comunes, consulte el documento para más detalles.
Theraot
55
@Theraot Mi argumento no fue con la correlación de defectos con el número de líneas. Mi argumento fue con la gran cantidad de defectos equivalentes a la mala calidad del código. Chrome ha tenido su parte de defectos a lo largo de los años, pero argumentaría la legitimidad de cualquier reclamo que sugiera que está escrito peor que un plugin jQuery de 10 líneas mal escrito en github.
Neil
3
@Theraot "el artículo científico supera la cita famosa". - Parece que su trabajo realmente admite la cita en lugar de
superarla
14

(Nota: la pregunta original era: ¿El número de bibliotecas mejora la calidad del código?)

Probablemente pueda responder esa pregunta usted mismo: no, por supuesto, el solo hecho de usar bibliotecas no mejora su código. Si lo hiciera, sería fácil escribir un gran código para todo sin esfuerzo.

Lo que las personas quieren decir cuando recomiendan la reutilización sobre roll-your-own es que el código en una biblioteca conocida es probablemente más correcto, eficiente y / o utilizable de lo que usted podría pensar, simplemente porque los autores han pasado mucho más tiempo en un área particular de funcionalidad que usted (con su fecha límite para todo el proyecto) puede permitirse.

Pero eso es solo una tendencia, no una ley. Ciertamente puede haber bibliotecas que no son tan útiles para usar como lo sería roll-your-own. A menudo esto sucede cuando la biblioteca realmente hace mucho más de lo que necesita, y lo hace de una manera que lo obligaría a adaptar su propia base de código a sus convenciones mucho más de lo razonable. Parece que esto es exactamente lo que has encontrado en esta instancia.

Kilian Foth
fuente
4

Si bien el uso de las bibliotecas correctas puede ahorrarle mucho trabajo, también hay muchos costos ocultos:

  • Las bibliotecas deben mantenerse actualizadas. Regularmente debe verificar si obtuvieron actualizaciones (¡lo que podría ser relevante para la seguridad!) Y aplicarlas. Cada actualización de la biblioteca podría romper algo en su aplicación. Eso significa que debe realizar una prueba de integración completa después. Por lo tanto, cada biblioteca de la que depende su proyecto aumenta la sobrecarga de mantenimiento a largo plazo.
  • Algunas bibliotecas Javascript son tan poderosas y usan patrones tan únicos que las personas comienzan a percibirlas como áreas técnicas separadas de especialización. Por lo tanto, cada biblioteca adicional que agregue podría ahuyentar a los desarrolladores que no se sienten seguros al editar código que se basa en un marco con el que no están familiarizados. La contratación de nuevos programadores de mantenimiento que estén familiarizados con todas las bibliotecas que utiliza puede ser un desafío.
  • Agregar una biblioteca a su sitio web aumenta los tiempos de carga, porque el usuario necesita cargar toda la biblioteca, incluso si solo usa una pequeña parte de ella. Algunas bibliotecas populares le permiten descargar compilaciones personalizadas con solo la funcionalidad que necesita, pero incluso así, generalmente incluirá una gran cantidad de código que nunca se ejecutará (o peor aún: código que se ejecuta, pero no hace nada útil, porque solo prepara estructuras de datos para la funcionalidad que no usa).

Entonces, antes de agregar otra dependencia a su proyecto para incluir algo que también podría escribir usted mismo, haga un análisis de costo / beneficio.

Philipp
fuente
Y repita ese análisis cuando realmente tenga datos reales. Es posible que haya subestimado el costo / sobreestimado el beneficio, o la situación podría haber cambiado.
Deduplicador
1

Esto no tiene por qué ser una decisión binaria: solo use una biblioteca OSS o programe una nueva solución desde cero. Otra opción puede ser reutilizar partes de la biblioteca, si la licencia lo permite.

Por ejemplo, en mi campo (software numérico) una biblioteca puede tener módulos básicos finos y algunos módulos especializados con los que estoy solo un 80% satisfecho. Así que usaría los módulos principales y escribiría un contenedor para los módulos especializados. O puedo desarrollar mis propios módulos especializados utilizando el diseño y el código de los módulos OSS. Los bits algorítmicos más difíciles generalmente se reutilizan de ellos, con solo el código de andamio modificado. También puedo limpiar parte del código original. Esto ha demostrado ser una buena experiencia de aprendizaje y un ahorro de tiempo, en comparación con el desarrollo desde cero.

Tupolev._
fuente
0

Si alguien ya ha hecho el trabajo por usted, por supuesto, debe usarlo.

La excepción a la regla es javascript. Donde habrán importado una docena de otras bibliotecas (versiones obsoletas, por supuesto) para agregar las funciones de idioma que desean usar y luego hicieron el trabajo por usted.

Elige tu marco y quédate dentro de él. Si la biblioteca funciona con su framework o js simple, está bien. Pero si necesita un marco diferente, busque otra opción.

Ewan
fuente
44
Muchos fanáticos de JavaScript aquí
FCin
0

Las bibliotecas y cuándo usarlas es una decisión complicada.

Por un lado, ha probado bien, cosas casi estándar (en mi campo, FFTW, por ejemplo, cae en esta categoría, o algo así como libsndfile), que generalmente se reconoce que solo funcionan, y han sido cosas estándar durante los últimos 20 años que Todos lo usan.

Por otro lado, tiene cosas aleatorias de github, sin un conjunto de pruebas y solo alrededor de 1 mantenedor, en general, ¿por qué molestarse?

La prueba de fuego para mí es, en primer lugar, que la biblioteca encaja en mi arquitectura (a veces, si sabes que quieres usar una biblioteca determinada, terminas diseñando eso), y creo que voy a terminar depurando el código de la biblioteca de otra persona ? Un buen proxy para la segunda pregunta es "¿Existe un conjunto de pruebas automatizadas y cómo es la documentación?".

Un poco de depuración no es un problema importante, pero en ese momento el código de la biblioteca comienza a contar en relación con el tamaño de mi propio código desde una perspectiva de mantenimiento (más aún si mis arreglos no se pueden impulsar hacia arriba por alguna razón).

También diferenciaría entre bibliotecas y marcos, ya que la distinción a veces no es tan clara, los marcos en mi mundo (núcleo pequeño, pesado DSP) tienden a ser una molestia, especialmente si estás tratando de fusionar más de uno o hacer algo un poco fuera de las líneas, las bibliotecas a veces son útiles. Soy consciente de que esto se ve de manera muy diferente en la escena de desarrollo web.

Al final del día, es una decisión que se reduce al gusto y la experiencia, e incluso los experimentados a veces eligen mal, al menos con una biblioteca, siempre puedes arrancarlo y escribir tu propia implementación si se vuelve demasiado molesto.

Decisiones decisiones....

Dan Mills
fuente