[This entry is also available in English|English PDF|PDF en castellano]
Los excépticos del movimiento FLOSS suelen decir que el Software Libre tiene, en general, menos bugs explotados que el software privativo, solamente porque es menos popular que este. Argumentan que, como el FLOSS tiene menos usuarios, los crackers estarán menos interesados en malgastar su tiempo intentando explotar los bugs que pudiera tener. La mayor base de usuarios del software privativo darÃa además, según ellos, una mayor publicidad a sus bugs, y sus modos de explotación se difundirÃan más rápido. El corolario a esta teorÃa serÃa que la popularización de aplicaciones FLOSS (p.e. Firefox), lleverÃa a un incremento en el número de bugs descubiertos y explotados, llegando eventualmente a un estado similar al del software privativo actual (p.e. “Cuando Firefox sea tan popular como Internet Explorer, tendrá tantos bugs como Internet Explorer.”).
El objetivo de este artÃculo es demostrar matemáticamente la total insensatez de tal teorÃa. EspecÃficamente, argumentaré que un aumento en el tamaño de la comunidad de un proyecto FLOSS lo mejora de al menos 3 formas:
- Desarrollo acelerado
- Menor vida media de bugs abiertos
- Menor vida media de bugs explotados
Una explicación más extensa está disponible en formato PDF. Lamento que las fórmulas matemáticas en HTML sean de calidad francamente pobre, pero no tengo ni tiempo ni habilidad para mejorarlas. Si el lector está interesado en fórmulas bonitas, recomiendo acudir al PDF.
Este blog, y el PDF que enlazo, están liberados bajo la siguiente licencia:
Esta obra está bajo una licencia de Creative Commons.
Lo que esto significa, básicamente, es que eres libre para copiar y/o modificar este trabajo como gustes, y redistribuirlo cuanto quieras, con dos únicas limitaciones: que no le des uso comercial, y que cites a su autor (o al menos enlaces a este blog).
1 – Proposiciones y derivación
Tenemos un proyecto FLOSS P, nuevas versiones del cual se liberan cada T tiempo. Cada versión se asume que incorpora G nuevos bugs, y las sucesivas versiones serán liberadas cuando todos los bugs de la anterior sean parcheados. En un momento determinado habrá B bugs abiertos (de los G originales).
Asumo que la velocidad de parcheo es proporcional al tamaño de la comunidad de usuarios (U):
dB/dt=-KpU
1.1 – Desarrollo acelerado
De arriba, la dependencia temporal del número de bugs abiertos:
B = G – Kp U t
El tiempo entre versiones (T), de B = 0:
T = G/KpU
De manera que el tiempo entre versiones se acorta para U creciente.
1.2 – Menor vida media de bugs abiertos
En un perÃodo de tiempo dt, se parchean (-dB/dt)dt bugs, siendo su edad t. Si llamamos Ï„ a la vida media de los bugs, tenemos la definición:
τ = (∫t(-dB/dt)dt)/(∫dB)
De ahà se deduce:
Ï„ = T/2
Esto es: la vida media de los bugs es siempre la mitad del tiempo entre versiones, el cual (como se ha mencionado) tiene una proporcionalidad inversa con U.
1.3 – Fracción de bugs explotados antes de ser parcheados
Definimos la siguiente velocidad de explotación de bugs, donde Bx es el total de bugs explotados, Kx es la “eficiencia de explotación” de los crackers (cuya cantidad se asume proporcional a U), y Bou es la cantidad de bugs abiertos y sin explotar:
dBx/dt = Kx U Bou
También definimos α = Box/B, donde Box es la cantidad de bugs abiertos y explotados.
Se puede derivar la evolución temporal de α:
α(t) = 1 – exp(-Kx U t)
Tras ello definimos γ = Kp/KxG, y derivamos la fracción de los bugs G que terminan siendo explotados para un tiempo t:
Bx(t)/G = 1 – γ + (γ – 1 + t/T)exp(-Kx U t)
Resolviendo para t=T, y tomando en cuenta que T=G/KpU, obtenemos la fracción de los bugs totales que son explotados en algún momento durante el perÃodo entre versiones (Fx):
Fx = 1 – γ + γ exp(-1/γ)
Nótese que Fx es independiente de U, esto es, aunque aumente el tamaño de la comunidad de usuarios, no aumenta la fracción del total de bugs que acaban siendo explotados (aunque un crecimiento de la comunidad traiga asociado un aumento colateral del número de crackers).
1.4 – Menor vida media de bugs explotados
Deseamos saber cuánto tiempo permanecen sin parchear los bug explotados, y llamamos a este tiempo τx. Tras un desarrollo ligeramente complejo, pero derivando siempre de equaciones previamente definidas (ver la versión PDF), obtenemos una expresión realmente simple para τx:
τx = Fxτ
Esto es, el tiempo medio de explotación de los bugs explotados es proporcional a τ, el cual a su vez es proporcional a T, o inversamente proporcional a U.
2 – Conclusiones
El eslogan “Más popularidad = más bugs” es un non sequitur. De acuerdo con el simple modelo que bosquejo aquÃ, cuanto más amplia sea la comunidad de usuarios de un programa FLOSS, más rápido serán parcheados los bugs, incluso admitiendo que a más usuarios, más crackers entre ellos, dispuestos a acabar con él. Incluso para crackers que sean más efectivos en su desempeño que los usarios de buena fe en su trabajo de parcheo (Kx >>> Kp), aumentar el tamaño de la comunidad reduce el tiempo que los bugs permanecen abiertos y también cuánto tiempo tardan en parchearse los bugs ya explotados. No importa cuán torpes sean los usuarios, y cuán rapaces los crackers, el modelo libre (por medio del cual se da acceso al código a los usuarios, dándoles asà poder para contribuir al programa) asegura que la popularización es positiva, tanto para el programa como para la propia comunidad.
Comparemos esto con un modelo cerrado, en el que una base de usuarios mayor puede incrementar el número de crackers atacando a un programa, pero ciertamente añade poco o nada a la velocidad con que el código es parcheado y corregido. Es de hecho el software privativo el que debe temer su popularización. Es fácil de ver que cuando una pieza determinada de software privativo alcanza una cierta “masa crÃtica” de usuarios, los crackers pueden potencialmente desmoronar su evolución (digamos, haciendo Ï„x = T, Fx = 1), porque (a diferencia del FLOSS), G, P, y por lo tanto T, son constantes (ya que dependen únicamente de los vendedores del software).