Cómo lidiar con el miedo a tomar dependencias

54

El equipo en el que estoy crea componentes que pueden ser utilizados por los socios de la compañía para integrarse con nuestra plataforma.

Como tal, estoy de acuerdo en que debemos tener mucho cuidado al introducir dependencias (de terceros). Actualmente no tenemos dependencias de terceros y tenemos que permanecer en el nivel API más bajo del marco.

Algunos ejemplos:

  • Nos vemos obligados a permanecer en el nivel API más bajo del marco (.NET Standard). El razonamiento detrás de esto es que podría llegar un día una nueva plataforma que solo admita ese nivel API muy bajo.
  • Hemos implementado nuestros propios componentes para (des) serializar JSON y estamos en el proceso de hacer lo mismo para JWT. Está disponible en un nivel superior de la API de marco.
  • Hemos implementado un contenedor alrededor del marco HTTP de la biblioteca estándar, porque no queremos depender de la implementación HTTP de la biblioteca estándar.
  • Todo el código para mapear a / desde XML está escrito "a mano", nuevamente por la misma razón.

Siento que lo estamos llevando demasiado lejos. Me pregunto cómo lidiar con esto, ya que creo que esto tiene un gran impacto en nuestra velocidad.

Bertus
fuente
20
¿Existe alguna justificación para esto (por ejemplo, un requerimiento externo) o se hace por ignorancia?
Blrfl
66
Haga un experimento con una pequeña parte de la base de código, cree una capa de aislamiento que no intente ser una biblioteca genérica, sino que defina una interfaz abstracta que modele sus necesidades; luego coloque su propia implementación y una dependencia de terceros detrás de ella, y compare cómo funcionan / funcionan las dos versiones. Considere los pros y los contras, evalúe cuán fácil (o difícil) sería intercambiar implementaciones y luego tome una decisión. En resumen, pruebe las cosas de una manera relativamente de bajo riesgo, vea qué sucede y luego decida.
Filip Milovanović
73
"Actualmente no tenemos dependencias de terceros" Esto siempre me hace reír cuando la gente dice esto. Por supuesto que sí. No ha escrito su propio compilador, IDE, implementación de ninguna biblioteca estándar. No ha escrito ninguna de las bibliotecas de objetos de fragmentos que usa indirectamente (o directamente). Cuando te das cuenta de cuánto software y bibliotecas de terceros de los que dependes, puedes abandonar la idea de "las dependencias son malas", y simplemente disfrutar de no reinventar la rueda. Simplemente marcaría las dependencias que tiene y luego le preguntaría por qué son aceptables, pero el análisis json no lo es.
UKMonkey
8
Dicho esto, existen los inconvenientes alternativos, como nunca terminar proyectos. Pero sí promover el empleo de software y el empleo :)
nave Mariscal
55
Tiene razón en que está desperdiciando esfuerzos reinventando el software básico. Te equivocas en que esto no está ni cerca de "evitar todas las dependencias". El equipo de Excel en Microsoft escribió una vez su propio compilador de C para evitar depender del equipo de C en Microsoft . Está tomando enormes dependencias de los sistemas operativos, marcos de trabajo de alto nivel, etc.
Eric Lippert

Respuestas:

94

... Nos vemos obligados a permanecer en el nivel API más bajo del marco (.NET Standard) ...

Esto para mí resalta el hecho de que, no solo se están restringiendo demasiado, sino que también se dirigen hacia una desagradable caída con su enfoque.

.NET Standard no es, y nunca será " el nivel API más bajo del marco ". El conjunto más restrictivo de API para .NET se logra mediante la creación de una biblioteca de clases portátil que se dirige a Windows Phone y Silverlight.

Dependiendo de la versión de .NET Standard a la que se dirija, puede terminar con un conjunto muy rico de API que son compatibles con .NET Framework, .NET Core , Mono y Xamarin . Y hay muchas bibliotecas de terceros que son compatibles con .NET Standard que, por lo tanto, funcionarán en todas estas plataformas.

Luego está .NET Standard 2.1, que probablemente se lanzará en el otoño de 2019. Será compatible con .NET Core, Mono y Xamarin. No será compatible con ninguna versión de .NET Framework , al menos en el futuro previsible, y muy probablemente siempre. Entonces, en un futuro cercano, lejos de ser " el nivel API más bajo del marco ", .NET Standard reemplazará al marco y tendrá API que no son compatibles con este último.

Por lo tanto, tenga mucho cuidado con " El razonamiento detrás de esto es que podría llegar un día una nueva plataforma que solo admita ese nivel API muy bajo ", ya que es muy probable que las nuevas plataformas admitan un API de nivel más alto que el marco anterior.

Luego está el problema de las bibliotecas de terceros. JSON.NET, por ejemplo, es compatible con .NET Standard. Cualquier biblioteca compatible con .NET Standard está garantizada, API-sabia, para trabajar con todas las implementaciones de .NET que sean compatibles con esa versión de .NET Standard. Por lo tanto, no logra una compatibilidad adicional al no usarla y crear su biblioteca JSON. Simplemente crean más trabajo para ustedes e incurren en costos innecesarios para su empresa.

Entonces sí, definitivamente estás llevando esto demasiado lejos en mi opinión.

David Arno
fuente
16
"Simplemente crean más trabajo para ustedes e incurren en costos innecesarios para su empresa". - y obligaciones de seguridad. ¿Su codificador JSON se bloquea con un desbordamiento de pila si le da un objeto recursivo? ¿Su analizador maneja los caracteres escapados correctamente? ¿Rechaza los caracteres sin escape que debería? ¿Qué hay de los personajes sustitutos no apareados? ¿Se desborda cuando el JSON codifica un número mayor que 2 ^ 64? ¿O es solo una pequeña evalenvoltura con algunos controles de cordura que se pueden pasar por alto fácilmente?
John Dvorak
44
"El conjunto más restrictivo de API para .NET se logra mediante la creación de una biblioteca de clases portátil que se dirige a Windows Phone y Silverlight". Me arriesgaré y afirmaré que hay al menos algunas API en ese subconjunto que no son compatibles con todas las implementaciones posibles que alguna vez existieron (ya nadie le importa WinPhone o Silvernight, ni siquiera Microsoft). Usar .NetStandard 2.0 como objetivo para un marco moderno parece muy prudente y no particularmente limitante. Actualizar a 2.1 es una historia diferente, pero no hay indicios de que lo hagan.
Voo
Además de las plataformas futuras que probablemente admitan más en lugar de menos, desarrollar todas las cosas que podrían suceder es increíblemente costoso (y es probable que se pierda algo de todos modos). En su lugar, el desarrollo sin reinventar la rueda va a ahorrar más tiempo del que adaptarse a una nueva situación en la que se necesita va a costar.
Jasper
51

Nos vemos obligados a permanecer en el nivel API más bajo del marco (estándar .net). El razonamiento detrás de esto es que podría llegar un día una nueva plataforma que solo admita ese nivel API muy bajo.

El razonamiento aquí es bastante al revés. Los niveles de API más antiguos y más bajos tienen más probabilidades de volverse obsoletos y no admitidos que los más nuevos. Si bien estoy de acuerdo en que mantener una posición cómoda detrás de la "vanguardia" es razonable para garantizar un nivel razonable de compatibilidad en el escenario que menciona, nunca avanzar es más que extremo.

Hemos implementado nuestros propios componentes para (des) serializar JSON, y estamos en el proceso de hacer lo mismo para JWT. Está disponible en un nivel superior de la API de marco. Hemos implementado un contenedor alrededor del marco HTTP de la biblioteca estándar porque no queremos depender de la impedancia HTTP de la biblioteca estándar. Todo el código para mapear a / desde XML está escrito "a mano", nuevamente por la misma razón.

Esto es una locura . Incluso si no desea utilizar las funciones de biblioteca estándar por cualquier razón, existen bibliotecas de código abierto con licencias comercialmente compatibles que hacen todo lo anterior. Ya han sido escritos, ampliamente probados desde un punto de vista de funcionalidad, seguridad y diseño de API, y se han utilizado ampliamente en muchos otros proyectos.

Si sucede lo peor y ese proyecto desaparece, o deja de mantenerse, entonces tiene el código para construir la biblioteca de todos modos, y asigna a alguien para que lo mantenga. Y es probable que todavía esté en una posición mucho mejor que si hubiera creado el suyo, ya que en realidad tendrá un código más probado, más limpio y más fácil de mantener.

En el escenario mucho más probable de que el proyecto se mantenga y se encuentren errores o vulnerabilidades en esas bibliotecas, usted sabrá sobre ellas, por lo que puede hacer algo al respecto, como actualizar a una versión más nueva de forma gratuita o parchear su versión con la solución si ha tomado una copia.

berry120
fuente
3
E incluso si no puede, cambiar a otra biblioteca es aún más fácil y mejor que rodar la suya.
Lightness compite con Monica el
55
Excelente punto de que cosas de nivel inferior mueren más rápido. Ese es el objetivo de establecer abstracciones.
Lightness compite con Monica el
"Los niveles de API más antiguos y más bajos tienen más probabilidades de volverse obsoletos y no admitidos que los más nuevos". ¿Eh? Los NetSTandards están construidos uno encima del otro hasta donde yo sé (lo que significa que 2.0 es 1.3 + X). También los Estándares son simplemente eso ... estándares, no implementaciones. No tiene sentido hablar de que un estándar deja de ser compatible, en la mayoría de las implementaciones específicas de ese estándar podrían estar en el futuro (pero vea el punto anterior por qué eso tampoco es una preocupación). Si su biblioteca no necesita nada fuera de NetStandard 1.3, no hay absolutamente ninguna razón para cambiarla a 2.0
Voo
11

En general, estas cosas son buenas para sus clientes. Incluso una biblioteca de código abierto popular podría ser imposible de usar por alguna razón.

Por ejemplo, pueden haber firmado un contrato con sus clientes prometiendo no usar productos de código abierto.

Sin embargo, como usted señala, estas características no están exentas de costo.

  • Hora de comprar
  • Tamaño del paquete
  • Actuación

Plantearía estos inconvenientes y hablaría con los clientes para saber si realmente necesitan los niveles súper de compatibilidad que están ofreciendo.

Si todos los clientes ya usan Json.NET, por ejemplo, usarlo en su producto en lugar de su propio código de deserialización, reduce su tamaño y lo mejora.

Si presenta una segunda versión de su producto, una que utiliza bibliotecas de terceros, así como una compatible, puede juzgar la aceptación de ambas. ¿Los clientes utilizarán a terceros para obtener las últimas funciones un poco antes o se quedarán con la versión 'compatible'?

Ewan
fuente
11
Sí, obviamente estoy de acuerdo, y agregaría "seguridad" a su lista. Existe la posibilidad de que pueda introducir una vulnerabilidad en su código, especialmente con cosas como JSON / JWT, en comparación con los marcos bien probados y definitivamente la biblioteca estándar.
Bertus
Sí, es difícil hacer la lista porque obviamente cosas como la seguridad y el rendimiento podrían ir en ambos sentidos. Pero hay un conflicto de intereses obvio entre las características de acabado y el aseguramiento de que los componentes internos están completamente presentados / entendidos
Ewan
12
"Es posible que hayan firmado un contrato con sus clientes prometiendo no usar productos de código abierto". Están utilizando .NET Standard, que es de código abierto. Es una mala idea firmar ese contrato cuando basa todo su producto en un marco de código abierto.
Stephen
Y todavía la gente lo hace
Ewan
7

La respuesta corta es que debe comenzar a introducir dependencias de terceros. Durante su próxima reunión, dígales a todos que la próxima semana en el trabajo será la más divertida que hayan tenido en años: reemplazarán los componentes JSON y XML con soluciones de bibliotecas estándar de código abierto. Dígales a todos que tienen tres días para reemplazar el componente JSON. Celebra después de que esté hecho. Tener una fiesta. Vale la pena celebrarlo.

Doble Visión Stout Grasa Pesada
fuente
2
Esto puede ser la lengua en la mejilla, pero no es poco realista. Me uní a una empresa donde un desarrollador "senior" (senior solo por educación) había encargado a un desarrollador junior escribir una biblioteca de máquinas de estado. Tenía cinco meses de desarrollador y todavía tenía errores, así que lo arranqué y lo reemplacé con una solución llave en mano en cuestión de un par de días.
No U
0

Básicamente todo se reduce a esfuerzo vs. riesgo.

Al agregar una dependencia adicional o actualizar su marco o utilizar una API de nivel superior, reduce su esfuerzo pero asume riesgos. Por lo tanto, sugeriría hacer un análisis FODA .

  • Fortalezas: Menos esfuerzo, porque no tiene que codificarlo usted mismo.
  • Debilidades: No es tan personalizado para sus necesidades especiales como una solución artesanal.
  • Oportunidades: el tiempo de comercialización es menor. Puede beneficiarse de desarrollos externos.
  • Amenazas: puede molestar a los clientes con dependencias adicionales.

Como puede ver, el esfuerzo adicional para desarrollar una solución artesanal es una inversión para reducir sus amenazas. Ahora puedes tomar una decisión estratégica.

Dominic Hofer
fuente
-2

Divida sus bibliotecas de componentes en un conjunto "Core", que no tiene dependencias (esencialmente lo que está haciendo ahora) y un conjunto "Común", que tiene dependencias en sus bibliotecas "Core" y de terceros.

De esa manera, si alguien solo quiere la funcionalidad "Core", puede tenerla.

Si alguien quiere la funcionalidad "Común", puede tenerla.

Y puede administrar lo que es "Core" versus "Common". Puede agregar funcionalidad más rápidamente a "Común", y moverla a su propia implementación "Principal" si / cuando tiene sentido proporcionar su propia implementación.

Tortuga1363
fuente