snap & flatpack - tragedia de comunidades

Advertencia de Longrid: Has sido advertido, muchas cartas.


Durante mucho tiempo ha estado desarrollando un formato de distribuci贸n para aplicaciones que estaban "libres" de dependencias de todo el sistema. Ubuntu es muy, muy activo en la promoci贸n de su complemento, gnome - flatpack. Ambos prometen para铆so y libertad de rpm / deb. Pensemos en el problema que quieren resolver y el precio que solicitan para solucionarlo.


Bibliotecas


Nadie en el mundo moderno puede escribir una aplicaci贸n sin usar el c贸digo de otra persona. Hay varias razones:


  • Muchas bibliotecas son tan serias que escribir su funcionalidad desde cero es una tarea desalentadora. Ejemplos: soporte para unicode, renderizado de fuentes, matem谩tica.
  • Otras bibliotecas ofrecen un conjunto de funciones bastante modesto, pero est谩n tan bien escritas que escribir al menos tan bien es casi imposible. Bibliotecas est谩ndar de lenguajes de programaci贸n, diversas implementaciones de libc, etc.
  • El costo de trabajar con el c贸digo de otra persona (al que se dedica esta secci贸n) a menudo es m谩s bajo que el costo de mantener su c贸digo. Es probable que la densidad de "errores por l铆nea de c贸digo" sea comparable, y usted debe detectar sus propios errores. Es probable que las bibliotecas extranjeras (populares) sean depuradas y corregidas por las manos equivocadas.

La clave es que incluso si podemos escribir la funcionalidad de una sola biblioteca desde el principio, el n煤mero total de funciones necesarias (y dependencias) da un aumento casi exponencial en el n煤mero de tareas que deben resolverse, posponiendo el tiempo de inicio del trabajo en el c贸digo del programa en s铆. en la distancia inalcanzable.


Un ejemplo para darse cuenta de la escala del drama: digamos que su aplicaci贸n toma dos l铆neas de entrada como argumentos opcionales y las muestra juntas despu茅s de la normalizaci贸n. Si est谩 escribiendo una aplicaci贸n industrial (una aplicaci贸n que se parece a una "real"), entonces:


  • Necesita un analizador de l铆nea de comando
  • Que debe aceptar unicode
  • Y quiz谩s le d茅 al usuario una pista de que ha sellado el nombre del argumento
  • Lo que requiere comparaci贸n fon茅tica
  • Y tal vez expresiones regulares
  • En general, tendr谩 que admitir no solo Unicode sino tambi茅n otros entornos locales, lo que requiere una biblioteca de soporte de entorno local y TODO lo que la gente crea en el contexto de entornos locales.
  • La concatenaci贸n de cadenas con la normalizaci贸n es otro uso de una biblioteca Unicode separada; usted mismo no implementa esto.
  • Es probable que la visualizaci贸n en la pantalla (ayuda de la l铆nea de comandos, su resultado) requiera soporte para ncurses, una biblioteca que admite diferentes terminales (puede hacerlo con el modo de texto, pero las aplicaciones a menudo usan capacidades de color).
  • Las pruebas implican el uso de un marco de prueba, posiblemente una biblioteca para moks.

Est谩 claro que tal complejidad para la tarea de "dos l铆neas" es una ingenier铆a excesiva, pero tan pronto como comienzas a hacer algo m谩s, la idea de "todo por ti mismo" comienza a ir m谩s all谩 de los l铆mites de lo observable y lo realizado.


驴Cu谩ntas bibliotecas cree que son necesarias para garantizar que curl http (s): // ... funcione? Mucho Utilizar谩 uno, pero las dependencias de sus dependencias son sus dependencias.


Copiar y vender VS enlace din谩mico


Si bien el uso de bibliotecas es inevitable, el uso en s铆 mismo puede variar en la implementaci贸n. Tenga en cuenta que tenemos dos palabras importantes: "uso" e "implementaci贸n de uso". 驴Qu茅 significa el uso? En su forma m谩s grosera: la capacidad de llamar al c贸digo de la biblioteca cuando sea necesario. Y aqu铆 est谩n las implementaciones de esto:


  • Podemos copiar el c贸digo que realiza las operaciones que necesitamos. En forma de c贸digo (copiar y pegar), como un m贸dulo separado en un lenguaje de programaci贸n (archivo de objeto para lenguajes compilados), o como un m贸dulo separado (para lenguajes interpretados). En alg煤n lugar justo al lado est谩 "copie el archivo fuente de la biblioteca a su directorio con la aplicaci贸n". 驴Qu茅 problemas crea esto? El principal problema principal es que perdemos (para siempre) la conexi贸n con el original. Incluso si el autor de la biblioteca original corrige el error, no lo sabremos. Adem谩s, si solo copiamos el c贸digo, la siguiente persona que trabaje en el programa ni siquiera podr谩 descubrir que este c贸digo es "ajeno". De hecho, cortamos el camino en la pregunta "escribir desde cero" y tomamos el de otra persona. Sin embargo, cortamos solo una parte, porque si hay errores en este c贸digo (pero no estar谩n all铆 , est谩n all铆 ), entonces su correcci贸n requerir谩 que el corrector vaya y comprenda la esencia del problema hasta el fondo. Incluso si la prueba requiere leer varios cientos de miles de l铆neas de c贸digo fuente y cientos de RFC (as铆 como comentarios de que las implementaciones son diferentes a las RFC), no tenemos otra manera. El error clave en este lugar es que hemos perdido informaci贸n de que este c贸digo es extra帽o. Tener comentarios en un archivo puede ayudar, pero requiere la participaci贸n activa y profunda de una persona, porque si escribimos en un comentario "tomado de libfoobar, src / lib / foo.c versi贸n 364a51577f3782dbf8e5d2482ab941980357c492", entonces alguien tendr谩 que ver d贸nde se encuentra libfoobar, qu茅 versi贸n es y qu茅 ha cambiado desde la versi贸n anterior ". Para simplificar este proceso, necesitamos metainformaci贸n legible por m谩quina.
  • Si acompa帽amos el "c贸digo de otra persona" con metainformaci贸n y usamos programas para administrar este c贸digo (en lugar de copiar y pegar), esto se llama venta , es decir inclusi贸n controlada del c贸digo de otra persona en su c贸digo. T茅cnicamente, la venta puede ocurrir en la etapa del texto fuente, vinculando objetos a un archivo ejecutable, importando m贸dulos (en int茅rpretes) desde la aplicaci贸n, o incluso vinculando din谩micamente con "su" versi贸n de la biblioteca (m谩s sobre esto m谩s adelante).
  • Finalmente, podemos realizar enlaces din谩micos en la etapa de inicio de la aplicaci贸n. Para los idiomas compilados, estos son so'hks comunes; para los idiomas interpretados, hay un m贸dulo en la importaci贸n de todo el sistema. Si varias aplicaciones pueden importarlo, entonces esta es una biblioteca compartida. Si la aplicaci贸n "trajo su m贸dulo", entonces la biblioteca es "propia", incluso si su interfaz implica una "biblioteca compartida". Por ejemplo, si una aplicaci贸n utiliza su "propia" versi贸n de la misma, independientemente de si difiere de la general o no, entonces esto es vending. Y si el sistema se importa, entonces esta es una biblioteca compartida.

驴Cu谩l es la diferencia entre estos m茅todos? Dar茅 breves argumentos; se han discutido muchas veces en muchos art铆culos. Cada uno de estos argumentos sigue siendo v谩lido a pesar de la presencia de contraargumentos vecinos:


  • Ahorro de memoria (RAM y disco) para so'sh, reduciendo el tama帽o del sistema instalado. Cuantas m谩s aplicaciones usen lo mismo, mayor ser谩 el ahorro de memoria. En consecuencia, por el contrario, cuanto m谩s "sus" bibliotecas trae una aplicaci贸n, m谩s "gorda" es.
  • El debate sobre qui茅n monitorea las vulnerabilidades es el sistema (que proporciona actualizaciones de la biblioteca) o el autor de la aplicaci贸n (que la actualiza a tiempo).
  • Resoluci贸n de conflictos de dependencias (la venta resuelve este problema ya que las bibliotecas compartidas requieren atenci贸n y precisi贸n de todos los participantes en el proceso, a veces creando dificultades insuperables), el mismo infierno legendario.
  • Nuevas versiones de las bibliotecas: aparecen a pedido de los autores de la aplicaci贸n o por decisi贸n de los autores de la distribuci贸n. En un caso, el autor puede aportar la nueva caracter铆stica que necesita, en otro caso, la distribuci贸n puede aportar una mejora a la aplicaci贸n existente al admitir algo nuevo en la biblioteca (por ejemplo, las pantallas hidpi comenzaron a funcionar correctamente en todas las aplicaciones vinculadas din谩micamente a bibliotecas qt / gtk) .

Todos estos problemas se han tratado muchas veces antes. En cambio, quiero centrarme en los aspectos sociales de la cuenca hidrogr谩fica "todo m铆o" y "todo com煤n".


Contrato social y mantenedores de poder


Las bibliotecas compartidas son cooperaci贸n, poder y responsabilidad. Las personas que determinan qu茅 bibliotecas compartidas est谩n disponibles en el sistema operativo dictan a los fabricantes de software qu茅 bibliotecas compartidas pueden usar. Una gran cantidad de software puede usar diferentes bibliotecas, y la indicaci贸n de qu茅 versi贸n exacta usar se deja a discreci贸n del vinculador (para los idiomas compilados) o el controlador de archivos de dependencia (pip, bundler, etc.). Si todas las aplicaciones en la distribuci贸n se crean con los mismos requisitos, entonces aparece la gracia: si hay un error en alguna biblioteca, el responsable de esta biblioteca actualiza la versi贸n y la correcci贸n se aplica autom谩ticamente a todas las aplicaciones. Incluso si la aplicaci贸n se lanza cada dos a帽os, la correcci贸n en el openssl condicional se aplicar谩 dentro de una semana. Si en un sistema operativo particular se toma la decisi贸n de abandonar el protocolo anterior, algunas modificaciones (por ejemplo, la interfaz de usuario), estos cambios tambi茅n se aplicar谩n a todos. Look & feel en un estilo general que (quiz谩s) puede ser cambiado por el usuario de una vez por todas. 驴No es esto gracia?


El poder y la lucha por 茅l.


... Esta gracia requiere que todas las aplicaciones puedan funcionar con la versi贸n seleccionada de la biblioteca. Pero, 驴qu茅 pasa si alguna aplicaci贸n quiere una funci贸n muy, muy nueva de la biblioteca, y todas las dem谩s aplicaciones no quieren usarla, porque esto, por ejemplo, no es una versi贸n LTS de la biblioteca, es decir? 驴No es lo suficientemente estable? Pero el kit de distribuci贸n puede negarse a cambiar a nuevas versiones "por principio", porque les prometimos a los usuarios solo correcciones de errores, y nuevas versiones solo en la pr贸xima versi贸n del sistema operativo, que (como) se lanzar谩 en medio a帽o. Y esto provoca resistencia por parte de los autores de la aplicaci贸n. 驴Qui茅n eres para decirme con qu茅 versiones debo trabajar? Soy autor, lo veo as铆. Necesito libfoobar 3.14-pre2 o anterior, no tu antiguo libfoobar aburrido 3.10.


... En este punto, el autor simplemente escribe en los requisitos de la aplicaci贸n libfoobar>=3.14-pre2 . El mantenedor toma y aplica parches a la solicitud, adem谩s de eliminar el c贸digo que depend铆a de esta biblioteca. Tal vez O simplemente se niega a aceptar una nueva versi贸n con dicha dependencia hasta que esta dependencia (libfoobar 3.16) est茅 en la nueva versi贸n de la distribuci贸n.


Si el autor realmente necesita que los usuarios usen la nueva versi贸n (por ejemplo, porque el autor no quiere admitir la versi贸n anterior), entonces busca soluciones alternativas para enviar la aplicaci贸n al usuario.


Lo mismo sucede cuando hay varias distribuciones, algunas m谩s nuevas, otras m谩s antiguas. Mantener distribuciones antiguas, probar con diferentes bibliotecas es dif铆cil. Entonces, la opci贸n "enviar con sus bibliotecas" aparece casi de inmediato.


Tragedia comunitaria


Esto crea los requisitos previos para el surgimiento de una tragedia comunitaria:


  • Cada fabricante (autor del software) quiere enviar lo que necesita. Adaptarse a las reglas (versiones) de otras personas es una p茅rdida de tiempo y esfuerzo, sobre todo porque hay muchas distribuciones diferentes en el mundo
  • Los usuarios quieren nuevas versiones.

Al mismo tiempo, cuantas m谩s aplicaciones vengan con sus bibliotecas, menor ser谩 el uso de las bibliotecas del sistema. 驴Te acuerdas de Grace? Cuanto menos es "universal", menos es gracia. Si 5 bibliotecas diferentes usan una biblioteca compartida de otras 995, entonces el beneficio de esta biblioteca es 0.5%. Es una pena, s铆. Adem谩s, perjudica a todos los usuarios, incluso a aquellos que, en principio, no tienen una gran necesidad de una nueva funci贸n, pero si la aplicaci贸n solo est谩 disponible en forma expendedora, el usuario no tiene opciones.


Resulta que tenemos un extremo global: todas las aplicaciones usan solo bibliotecas compartidas (m谩xima gracia com煤n, inconvenientes para los autores de aplicaciones individuales) o "cada una por s铆 misma" (una distribuci贸n gruesa con un mont贸n de aplicaciones que pueden tener vulnerabilidades no detectadas pero ampliamente utilizadas, comiendo un mont贸n de memoria, pero el autor de cada aplicaci贸n es conveniente).


Aqu铆 es donde llegamos a la disputa rpm / deb VS snap / flatpack


驴Libertad o esclavitud?


Ubuntu aboga muy, muy fuertemente por Snap'y. GNOME conf铆a en que el futuro est谩 en los paquetes planos. Cada uno de ellos es un marco para aplicaciones profundamente individualistas. Todo tipo de electrones, que llevan consigo no solo el cap贸 del compartimento del motor, sino tambi茅n el sistema operativo del compartimento del motor. Propia libc, propia libssl, propia regexp, propia ncurses, etc. Solo el n煤cleo act煤a como com煤n, es decir de hecho, esta es la misma aplicaci贸n en contenedor, pero para el escritorio. D茅 a cada uno su propio n煤cleo y obtendr谩 un dispositivo en forma de m谩quina virtual. Agregue los metadatos y obtendr谩 un contenedor Docker.


El individualismo de las aplicaciones (autores de la aplicaci贸n) es comprensible, pero 驴qui茅n representa el bien com煤n? Una mejora local importante se compensa con una ligera degradaci贸n general de la distribuci贸n multiplicada por aplicaciones puramente. Si todos hacen mejoras locales por s铆 mismos, la cantidad de discapacidad se vuelve mayor que el beneficio de la cantidad de mejora.


Parecer铆a que en este lugar los creadores de distribuciones deber铆an actuar como custodios de inter茅s com煤n. Sin embargo ...


Pol铆tica


Ubuntu depende de Debian mucho m谩s de lo que Canonical (la compa帽铆a Ubuntu) quisiera. El valor de Ubuntu no est谩 en los esfuerzos de los mantenedores de Ubuntu, sino en un enorme repositorio de software proveniente de Debian en una forma en que todas las aplicaciones funcionan bien juntas a trav茅s de los esfuerzos de miles de mantenedores de los paquetes individuales que poseen la distribuci贸n de Debian. Adem谩s, Canonical agrega sus esfuerzos para pulir el resultado, y por eso algunos lo aman. Agregue un poco de marketing y un ciclo de vida fijo, que es del agrado de la empresa, y obtenemos un excelente producto.


... Lo que depende de la voluntad de miles de voluntarios en alg煤n lugar.


Lo que no se adapta a casi ninguna empresa comercial. 驴C贸mo romper esta adicci贸n? Eso es correcto al hacer su propio paquete de aplicaciones. Cuantas m谩s aplicaciones haya, menos ventajas tendr谩 en la empresa. Baste recordar la historia cuando un voto en Debian en systemd enterr贸 al advenedizo, desarrollado por Canonical.


Pero mantenga varias decenas de miles de aplicaciones, algunas de las cuales son su propio espacio (erlang, go, perl, python, R, julia, etc.), y algunas son monstruos en el 谩rea tem谩tica correspondiente (navegadores, emacs, tex, marcapasos, etc.). trabajo pesado No es de extra帽ar que estos sean miles de mantenedores.


... Y hay una idea. Y, dejemos, los autores de la aplicaci贸n mantienen las aplicaciones. D茅mosles a todos una caja de arena, d茅jenlos cavar. Los autores obtienen libertad, Canonical: aplicaciones que no dependen de Debian y que al menos alguien mantiene de forma gratuita. Los usuarios obtienen ...


... aplicaciones que son gordas, pesadas, con actualizaciones irregulares y que pueden mantener f谩cilmente las vulnerabilidades sin corregir durante a帽os ... Pero algunas de ellas son nuevas y brillantes.


Entonces, 驴qu茅 sigue?


Imagina un mundo en el que todos llevan todo consigo ... 驴Sabes c贸mo se ve? Echa un vistazo a chefsdk. Se env铆a consigo mismo dentro de su postgresql (con sus dependencias), su rabbitmq (que depende de su erlang), adem谩s el chef-servidor tambi茅n est谩 en erlang, por lo que tambi茅n tiene su propio erlang. De repente, tenemos dos erlangs y docenas de copias de las mismas bibliotecas dentro de la misma aplicaci贸n, ligeramente diferentes en la versi贸n. Esta no es la opci贸n final, ya que adentro, todav铆a hay bibliotecas comunes entre los componentes. Si los cortamos m谩s, obtenemos varias docenas de copias de openssl y libc para una aplicaci贸n. Ni siquiera en su forma final, parece 600MB por aplicaci贸n.


... Que, por supuesto, es mucho m谩s grande que la aplicaci贸n electr贸nica promedio ... Y 12 veces m谩s que todo el servidor mariadb (隆todo el DBMS!), O krita o gimp (grandes aplicaciones de gr谩ficos).


驴Y si todos ser谩n as铆? Tengo 2000 paquetes instalados en mi computadora (sin contar -dev y lib) ... 2000 * 300 = 600GB (Para el tama帽o promedio del resultado, tom茅 la mitad de chefsdk, porque no todos son tan terribles por dependencias). Ahora ocupan alrededor de 7 GB (incluidos recursos, como documentaci贸n, editores de texturas, plantillas CAD, etc.).


Si esto se convierte en 600 GB, 驴no es eso una pura tragedia de las comunidades? En cada momento, observamos la optimizaci贸n local (y la soluci贸n de los inconvenientes de otra persona), pero en conjunto, la suma de estas optimizaciones locales reduce la optimizaci贸n general del sistema. En mi opini贸n, m谩s que la ganancia local de cada uno de los participantes.


Entiendo por qu茅 Canonical empuja a presi贸n. Entiendo esto y no lo apruebo.

Source: https://habr.com/ru/post/es433052/


All Articles