Ideas Programming

De JarfilWiki

Contenido

¿Por qué me gusta el Software Libre? (20040930-145101)

A raíz de una entrevista en la que me han hecho al pregunta, realmente me he parado a pensar en ella.
¿Por qué me gusta el software libre y no el código cerrado?...
La verdad es que me parece que siempre me ha gustado. Siempre me ha gustado hacer cosas nuevas, y me ha parecido una pérdida de tiempo ponerse con lo ya hecho si no es para mejorarlo.
¿Acaso cada vez que hago un programa debo currarme desde cero la librería de visualización? De hecho es algo básico en programación: reutilizar lo ya hecho y mejorar a partir de ahí. No perder el tiempo volviendo a hacer una y otra vez lo mismo de siempre.

El software libre lleva esa reutilización un paso más allá: ahora es posible no sólo reutilizar módulos de un mismo programa, ¡sino módulos de diferentes programas entre ellos!
¿Por qué debería de volver a hacerme un intérprete de ficheros de configuración, si hay miles de proyectos que ya hacen lo mismo? ¿No es mejor copiar&pegar y dedicarse a hacer algo que realmente aporte valor añadido, aunque sólo sea una interfaz avanzada que nadie haya hecho todavía?

Y bueno, supongo que buena parte del motivo será el tiempo que me he pasado peleándome con la MSDN Library, leyéndome la documentación de MFC de cabo a rabo para sacarle el mayor provecho a mi antigua licencia de estudiante (¡y regalaban una gorra!... ains, qué tiempos xD)
La verdad es que acabé hasta las narices cuando me dí cuenta de que existía el proyecto GNU, que lo que había pagado (por suerte no demasiado) por la licencia de marras, lo tenía libremente accesible en Internet. Aunque claro, antes de eso tampoco había "demasiado" internet... podría decirse que la banda ancha me abrió los ojos xD
Pero cuando instalé mi primer Linux "en serio" y me puse a investigar... ahí sí que decidí que el soft cerrado es basura, basura mala. Vamos, ni punto de comparación entr el bash y el 4DOS, y ¡qué rápido iba en un 486/50 cuando el mismo bash de djgpp en Windows sobre PII/233 se arrastraba que daba asco! (y se sigue arrastrando, aunque el AMD XP 2600+ sea unas 10-15 veces más rápido...)

Como anécdota recuerdo que una de las últimas cosas que quería hacer en Windows era sustituir el login por una interfaz animada en 3D. Que sí el netlogon, que si nosequé dll, que si todo protegido, que si nadie sabe nada, que si novell lo hace pero parece que ha tenido que licenciarlo aparte... vamos, imposible para los "mortales de a pié".
Imagínese la "sorpresa" al encontrarme con la secuencia de inicio de RedHat con ¡hasta comentarios en los ".bat"!

Vamos, que al software privativo, que le dén. Menudo desperdicio de tiempo y dinero (y mi tiempo, ¡que es más grave! xD )

El código cerrado es mejor... pero no sirve

No tengo acceso al código de MS, pero sí es cierto que el código debe ser bastante bueno.

Como anécdota se podría citar el Excel que había que excluir de los antivirus porque se auto-modificaba en cada ejecución (supuestamente se auto-optimizaba) y saltaban las alarmas por el checksum. O esa versión de, creo que también Excel, que llevaba como EasterEgg un mini-doom en 3D que iba perfectamente fluido en aquellos tiempos.

Y es más, teniendo en cuenta lo poco que tiene que o le deja hacer el Windows al usuario, es bastante notable lo bien que va. Sí, no me he equivocado: he dicho que Windows "va bien"... teniendo en cuenta que para cada error hay que esperar de un mes a dos años a su corrección.
Pero lo que no podrá hacer NUNCA un proyecto cerrado, es ofrecer la corrección INSTANTANEA de errores que pueden hacer los administradores/usuarios; eso de "no me va bien el arranque, así que cambio esta línea del rc.sysinit y ya va", o "no me detecta tal cosa, pero cambio tal valor en el kernel y ya como que funciona" (o "le pregunto a fulanito y me dice qué debo cambiar").

La diferencia está en que MS tiene que gastarse una fortuna para conseguir un código fabuloso que "casi siempre funciona" (léase: que falla), mientras que en software libre tenemos un código como a medio terminar al que cada uno añade el granito de arena que necesita para que _le_ funcione, aunque sólo sea notificar el fallo y que alguien lo corrija.

Libre = Y Gratis

Tal vez se pudiese enfocar el tema desde otro punto de vista.

El software libre, si no es gratis, nada impide al que lo recibe distribuirlo libremente/gratis. Teniendo en cuenta que la distribución pasa a costes mínimos (ej: p2p), y que en el software libre no se puede impedir, podría decirse que "software libre = y gratis".

PERO...

Lo que no es libre, ni gratis, ni nada parecido, son los SERVICIOS. Crear, ampliar, adaptar, instalar, distribuir, etc. un "software libre" son todo servicios, y los "servicios NO son libres NI gratis". El producto de estos servicios sí será libre (y gratis), pero el servicio en sí habrá que pagarlo, o lo tendrá que regalar alguien que lo pague. Por lo tanto "creacion de software = de pago"

O usando una analogía: el servicio de diseñar y construir un coche cuesta dinero, y el coche costará lo que haya costado... a quien haya encargado el "prototipo". Luego ya, los servicios del duplicador de materia (no los del prototipo) que los pague el que quiera sacarse una copia, libremente ;)

La GPL y la libertad, una visión comercial

Los usuarios no desarrollan software. Quien sí lo hace, son los desarrolladores (valga la redundancia) y las empresas.

La GPL, es una licencia de compromiso comercial. No hay nadie, repito: NADIE, que en su sano jucio se ponga a desarrollar una aplicación con valor comercial y la regale sin nada a cambio. Lo que permite la GPL es ofrecer algo de libertad, a cambio de una coletilla tipo "...pero no vas a poder competir contra mí".

No se trata de ofrecer libertad al usuario, sino de ofrecer garantías al desarrollador. El usuario es sólo un medio, que por el camino sale beneficiado.

Obviamente, siempre habrá software sin valor comercial, o cuyo valor esté en la venta de hardware o servicios asociados, pero el grueso de desarrollos siempre serán las aplicaciones puntuales con elementos reutilizables, y que a nadie le gustaría verlos en manos de la competencia sin recibir nada a cambio. Desde el punto de vista del desarrollador, los usuarios son sólo un medio por el que conseguir estas garantías, un "yo no te puedo obligar a seguir conmigo, pero otro tampoco... a menos que lo haga todo desde cero y a tí te salga más caro que seguir conmigo".

La idea es poder competir en servicio ofrecido, en vez de tener un mercado estancado con cada cliente bloqueado en su "proveedor habitual" y sin poder competir con este a menos que se realicen enormes inversones... por cada cliente por separado.

Lo que hace la GPL es convertir en *mercado libre* lo que de otra forma es uno restringido.

Claro que eso nos interesa a los que vendemos servicios de desarrollo (ej: programadores) en vez de "aceite de serpiente" (ej: marketing).

El futuro del software libre vs. cerrado

A ver, como lo veo yo, el software libre sólo aporta a las empresas el beneficio del "que lo haga otro". O sea, si hay 50 empresas colaborando en desarrollar el kernel, la forma para que cada una obtenga los mejores resultados es la de poner en común los desarollos e impedir que a los otros les suponga una ventaja (= GPL). En las licencias sin esa restricción puede venir alguien (ej: Apple), coger el código, desarrollarlo como quiera, y lanzar un producto que los demás no pueden tener. Con la GPL cualquier empresa puede colaborar tranquila sabiendo que todo lo que los demás puedan sacar de ventaja tendrán que hacerlo público.

Pero, nada de esto importa si sólo se trata de un programa a medida para un cliente concreto. Si la expectativa de que "otros hagan el trabajo por tí" es nula o casi-nula, no hay beneficio en hacer el software libre, salvo que el hecho en sí se use como ventaja competitiva (ej: propaganda). En estos casos, donde un programa sólo interesa a un grupo muy reducido de usuarios finales, puede que menos de 100, puede que menos de 1000, donde el número de desarrolladores de "terceras partes" sea notablemente inferior a los recursos propios de la empresa, me parece muy razonable cerrar el software y esperar el momento en que pueda ser cambiado a GPL, cuando sea la comunidad la que lo soporte mejor que la empresa en sí (ganando popularidad, etc. la empresa).

Así que, a mí me parece que los elementos esenciales (kernel, entorno gráfico, aplicaciones más populares) serán principalmente libres, que es donde la comunidad puede llegar a tener más fuerza que ninguna empresa suelta, mientras que programas más específicos, o partes (ej: plug-ins, add-ons), empezarán siendo cerrados pasando a abiertos cuando no supongan una ventaja competitiva o simplemente dejen de ser rentables, con lo que la empresa ganará imágen y clientes satisfechos que podrán seguir teniendo soporte con una mínima inversión por parte de la empresa de software. Y si lo hacen bien, puede que aparezca algún cliente que solicite otro desarrollo a medida relacionado con el código liberado.

Por el camino también quedan el OpenSource y las licencias duales, que serían pasos intermedios en la "evolución" del software, entre el cerrado recién salido de fábrica, y el GPL usado que si alguien lo amplía será mejor poderse aprovechar, o si lo amplían muchos, mejor todavía.

GPL y LGPL: Libre (y Gratis)

Para mí (que no soy abogado), la diferencia entre GPL y LGPL es que, aunque ambas son libres, la LGPL es además "parcialmente gratis"... y la BSD, gratis del todo.

Se ve mejor mirando paquetes de software, donde un mismo programa está formado por un ejecutable y un número de librerías (módulos). Si todo estuviese bajo LGPL, nada impediría a alguien venir, coger todas las librerías (ej: el 99% del programa), crear un ejecutable cerrado con los cambios que quiera y distribuirlo como producto privativo "con algunas librerías" (que en realidad serían el 99% del programa).

Por otro lado, tenemos las librerías de "uso común" (ej: glibc) que no forman parte de un programa en concreto sino más bien del "sistema". En este caso, un gran número de programas (tal vez todos) que se ejecuten en el sistema hará uso de ellas. De ser GPL, obligarían a todos los programas también ser GPL, de forma que si las librería fuese alguna esencial (ej: glibc), se daría el caso de que prácticamente se IMPEDIRIA ejecutar programas cerrados en dicho sistema.

Así que, la licencia GPL, aparte de la ideología que lleva detrás, en realidad es una forma de atraer a los desarrolladores comerciales hacia el desarrollo libre, garantizando que la competencia no podrá aprovecharse descaradamente de su trabajo salvo que también ofrezca libremente sus desarrollos. Mientras tanto, las librerías LGPL hacen de puente entre un entorno GPL (las librerías en sí) y un posible software privativo que pueda hacer más interesante el sistema entero.

Vamos, que sin GPL, incluso menos empresas que ahora se atreverían a liberar su software.

Ahora bien, si crees que vas a hacer librerías que pueden ser "parte del sistema", o no te molesta regalar tu trabajo, es cosa tuya. Yo prefiero reservarme el derecho a re-licenciar algún trozo de código como me parezca en el futuro, y mientras tanto que quien se aproveche de lo que hago juegue bajo las mismas condiciones.

Editor XML genérico

  • Ofrecer opciones de edición en base a la DTD
  • objetos / caracterizadores
  • subinclusión de objetos
  • edición de características
    • adición / sustracción
    • unión / separación
    • interesección
  • ¿meta-caracerísticas? ToDo

Gestor de inventario

  • Elementos
  • Grupos
  • subelementos/subgrupos
  • creación personalizada
    • caracterísitcas
    • acciones
    • condiciones
  • verificación formal
  • config en XML (ToDo)

Panel de Control WebHosting

  • Adaptar Gestor de inventario (ToDo)

Comparador remoto de ficheros

#define GRANUL 1000
#define MAXPARTS 3   // log10

sub check(file,part,start) {
 split -b $part bs=$part skip=$start | md5sum
 my @list = null
 foreach start in (diff local remote) {
  if ($part > GRANUL)
   @list.join(check($file,$part/10,$start))
  else
   @list.add($start)
 }
 return @list
}

main(file) {
 part10 = int(log10(file_size))+1-MAXPARTS
 part = (part10 > log10(GRANUL)) ? 10^part10 : GRANUL
 @list = check($file,$part,0)
 @list = ask_user(@list)
 do {
  transfer(@list)
  @list = check($file,GRANUL,0)
 } until (@list == null)
}

Strongly Typed Named, Positional, Default and Optional Parameters

Es lo que me gustaría tener: posicionales con tipado fuerte. ¿Es que es "tan" difícil?

PHP Named Parameters

PHP5 Type hinting

C# (WTF!!)

Java vs. PHP

FRE

CUDA

Comparar ficheros

  • tamaño - diferencia global
  • md5 - errores en bits propagados
  • similitud - ¿prepend/append a fichero igual?
    • md5 parciales (bit boundary)
    • checksum parciales con pérdida de resolución (difuminan bit boundary)
    • ¿otros?

NASAL

setprop("/controls/engines/engine[1]/reverser", 1);
Herramientas personales