Los tiempos están cambiando

Hace unos meses (en mayo) hice 5 años con este blog, es decir que llevo ya más de 5 años y medio con él. Si eres de los que lleva siguiendo mis posts desde hace tiempo habrás notado que últimamente mi frecuencia de publicación ha bajado un poco. El motivo principal es que cada vez tengo menos tiempo disponible y además, como puedes comprobar si ves lo que escribo, me suelo «currar» bastante los posts, es decir, que me lleva bastante tiempo escribirlos.

Otro de los motivos es bien diferente: en los últimos meses utilizo mucho más las redes sociales y eso me quita tiempo para el blog. En realidad el uso que hago de éstas es tanto personal como profesional, pero en cualquiera de los dos casos lo que hago en ellas tiene relación directa con la temática de este blog: programación en general, tecnología, Microsoft, desarrollo Web, frikadas varias…

Con esto no estoy diciendo en absoluto que vaya a dejar de lado el blog. De hecho tengo intención de seguir metiendo muchas cosas interesantes en el futuro. Simplemente te sugiero que si tienes interés en todas estas cosas y quieres tener mucha más información interesante y con más frecuencia, lo mejor es que me sigas a mi y a mi empresa en el medio social que uses habitualmente:

· Twitter JM Alarcón: mi twitter personal con enlaces, comentarios personales, y también avisos de cuando hay nuevos posts en este blog.
· Facebook campusMVP: noticias, artículos, enlaces, videos… todo sobre .NET y Microsoft. Al menos un par de ellas al día. Nada de publicidad.
· Twitter campusMVP: Idem que el anterior pero a través de twitter, para los que os va más ese servicio.
· Scribd de Krasis Press: Aqui publicamos de vez en cuando artículos interesantes, fragmentos de libros e, incluso a veces, libros completos, como mi último libro de ASP.NET 4.0 y AJAX. La disponibilidad de nuevos artículos se anuncian en Facebook y Twitter.
· Boletín de campusMVP: boletín por e-mail mensual de campusMVP sobre tecnologías Microsoft. Todo interesante, nada de publicidad y sólo se envía una vez al mes, hacia el día 15.

Otros recursos relacionados en los que estoy involucrado de lleno y que te pueden interesar también son estos:

· Blog de e-mail marketing de Krasis: trucos, consejos, comentarios sobre el trabajo con correo electrónico y el e-mail marketing. Lo hacemos también en inglés.
· Boletín BECK: boletín mensual de Krasis (día 1 de cada mes). Poco técnico pero totalmente centrado en la actualidad de las TI.

En fin, espero que sigas siendo fiel al blog, pero ten en cuenta también todas estas otras fuentes de información para estar mejor informado 🙂

Notación asintótica para indicar la eficiencia de algoritmos

El otro día un alumno del curso de preparación del examen 70-536 en campusMVP me hizo la siguiente (interesante) pregunta:

«He revisando el tema de las coleciones y me han surgido las siguentes dudas: Al leer en el MSDN información sobre distintas colecciones a veces aparece la siguiente frase: ‘La recuperación del valor de esta propiedad es una operación O(1); el establecimiento de la propiedad también es una operación O(1).’ ¿exactamente a que se refiere con operación O(1)? El ejemplo que he puesto pertenece a ArrayList.Item (Propiedad) http://msdn.microsoft.com/es-es/library/system.collections.arraylist.item.aspx«

¿Y esto qué es?

Lo de 0(1) es una notación matemática usada en algoritmia que indica el comportamiento límite de una función. A este tipo de notación se le llama «notación asintótica», «notación Landau» o «notación Big O».

En la wikipedia hay un artículo muy completo sobre esta notación, pero básicamente lo que hay que saber para «andar por casa» es que lo que significa que un algoritmo 0(1) es que éste tarda lo mismo en ejecutarse para cualquiera de sus elementos. Bueno, en realidad lo exacto no sería decir que «tarda lo mismo», sino más bien que «en términos computacionales el esfuerzo necesario para procesarlo es el mismo», lo cual en muchos casos se traduce en el mismo tiempo.

Así por ejemplo en el caso de la pregunta, la extracción de un elemento de la lista especializada ArrayList a través de su indexador (propiedad item), lo que te indica la notación 0(1) de la documentación de MSDN es que se tarda lo mismo en obtener el primer elemento de la colección que el último o que otro cualquiera. Es decir, que da igual que la lista tenga 10 o 10.000 elementos: el tiempo que tardas en obtener una referencia a cualquiera de ellos es el mismo. ¡Lo cual es estupendo!

Sin embargo si coges otro tipo de lista (por ejemplo un SortedList) y ves alguno de sus métodos para manipular elementos (por ejemplo RemoveAt) verás que la documentación te dice que es una operación 0(n). En este caso, aunque no lo indica, ‘n’ se refiere al número total de elementos de la lista. Esto quiere decir que el esfuerzo algorítmico -que luego se traduce en tiempo- para eliminar un elemento de la lista es una proporción lineal directamente proporcional al número de elementos de la lista. Es decir, que cuanto más al final de la lista esté el elemento más cuesta obtenerlo.

Si nos encontraramos algún algoritmo que indicara que es, por ejemplo, 0(n^3), querría decir que el esfuerzo es exponencial (al cubo) al número de elementos.

Esto es muy importante a la hora de seleccioanr uno u otro algoritmo según la cantidad de elementos que deba procesar. En el caso de las listas que nos ocupa gracias a estas indicaciones sabemos que si vamos a manejar una colección con muchos elementos será mejor utilizar un ArrayList que una SortedList, ya que cualquier acceso a los elementos para su procesamiento nos costará mucho más en el segundo caso que en el primero.

Espero que a otras personas les pueda resultar útil.

La catedral y el bazar, pensamientos sobre el Open Source

Este fin de semana largo que tenemos en España he aprovechado para releer el clásico de la literatura del Open Source, «The cathedral and the bazaar» (PDF, 145KB) de Eric S. Raymond. Este ensayo -cuya primera versión data de 1997- se convirtió enseguida en una pieza de referencia para el movimiento Open Source ya que en él Eric analizaba las diferencias existentes entre el desarrollo tradicional de software en las grandes empresas, a las que comparaba con una catedral, con el desarrollo de aplicaciones Open Source a través de Internet con voluntarios, que comparaba con un bazar. Lo que lo inspiró a escribirlo fue la tremenda efectividad del desarrollo de Linux a principios de los años 90, que luego puso en marcha él mismo con el desarrollo de su conocido servidor de correo Fetchmail. En los últimos años Eric ha tenido sonadas disputas con el Free sSoftware Foundation y en especial con el grillado de Richard Stallman.

Por si alguien lo dudaba las «catedrales» son empresas como Microsoft (especialmente) y otros gigantes, que tienen una política de ocultar el código incluso internamente,  mientras que los «bazares», donde hay mucho ruido y confusión pero se hacen muchos tratos todo el tiempo, son los grandes proyectos Open Source como los mencionados.

He decidido resumir aquí los puntos principales del documento (y traducirlos) tal cual él los expone, con algún comentario propio, por si le pueden servir a alguien y para tenerlos yo mismo resumidos para futura referencia. Espero que te gusten y te resulten útiles.

Ahora bien, aunque coincido con muchas de las cosas que dice Eric en su artículo, pienso que muchas de sus premisas no son aplicables en proyectos comerciales y menos en empresas pequeñas. Además estoy convencido de que Microsoft y otras grandes empresas han aprendido mucho del Open Source y, aparte de tener muchos proyectos OS propios, han modificado sus técnicas de trabajo y han abierto mucho sus productos y el código para ser más ágiles. ¿El mercado les ha obligado? Seguro, pero eso no quita que sea así.

—–
LA CATEDRAL Y EL BAZAR – PUNTOS IMPORTANTES

  1. Todo buen trabajo de software comienza por rascar el «picor» de un buen programador —> Motivación
  2. Los buenos programadores saben qué código escribir. Los grandes programadores saben qué código rescribir —> Reutilización de código y no reinventar la rueda
  3. Planea tirar al menos una vez el trabajo. Lo harás de todos modos —> Las cosas no salen bien a la primera generalmente
  4. Si tienes la actitud correcta, los problemas interesantes te encontrarán —> La curiosidad es buena y te llevará a crear proyectos interesantes
  5. Cuando pierdes el interés en un programa, tu última obligación para con él es cedérselo a un sucesor competente —> No tires el trabajo, dáselo a alguien que le interese y lo pueda seguir llevando
  6. Tratar a tus usuarios como co-desarrolladores es el camino con menos obstáculos hacia la mejora del código y la depuración efectiva —> Involucra a otra gente en el desarrollo
  7. Libera pronto, libera a menudo y escucha a tus clientes —> mejor liberar código que no sea perfecto muy a menudo que código muy probado de muy tarde en tarde (en un mundo donde los que lo reciben son programadores, claro)
  8. Dada una base suficientemente grande de beta-testers y co-desarrolladores, casi cualquier problema será determinado rápido y la solución será obvia para alguien —> Esta la clásica teoría de que muchos ojos pueden ver cualquier error, lo cual ya he comentado en otras ocasiones que no me convence nada. Para muestra un botón, pero hay muchos ejemplos en el mundo Linux y OS engeneral. Está claro que cuatro ojos ven mejor que dos y así sucesivamente pero basar la calidad y seguridad del Open Source en que hay muchos ojos mirando es una falacia. Me gusta un corolario que sale de aquí, y que dice: «The total cost of maintaining a widely used program is typically 40 percent or more of the cost of developing it. Surprisingly this cost is strongly affected by the number of users. More users find more bugs«. Está claro: cuánto más lo use la gente más errores van a aparecer.
  9. Es mejor tener estructuras de datos  bien pensadas y mal código que al revés —> Piensa bien antes de desarrollar. serás más efectivo.
  10. Si tratas a tus beta-testers como si fueran tu recurso más valioso, responderán convirtiéndose en tu recurso más valioso —> Esto lo lleva haciendo Microsoft muchos años aunque sin cóigo fuente la mayor parte de las veces.
  11. Lo segundo mejor después de tener buenas ideas es reconocer las buenas ideas de tus usuarios. A veces esto último es incluso mejor —> No comments.
  12. A menudo las soluciones más impactantes e innovadoras vienen al darte cuenta de que tu concepto del problema estaba equivocado —> Rectificar es de sabios.
  13. La perfección (en diseño) se consigue no cuando no hay nada más que añadir, sino más bien cuando ya no hay nada más que quitar —> Totalmente de acuerdo. Es el principio KISS.
  14. Una herramienta debe ser útil en el modo esperado, pero una herramienta realmente buena suele dar usos que nunca habías esperado.
  15. Cuando escribas software de pasarela del tipo que sea, esfuérzate por entorpecer el flujo de datos lo menos posible, y nunca deseches ninguna información a menos que el destinatario te fuerce a ello —> De esto poco tengo que decir, está relacionado con su programa de e-mail, y como dice un amiguete: «Cuando tienes un martillo todo te parecen clavos» 😉
  16. Cuando tu lenguaje no es ni de lejos Turing-completo, el azucar sintáctico puede ser tu amigo —> vamos que justifica la exitencia de construcciones en los lenguajes que faciliten el trabajo.
  17. Un sistema de seguridad es sólo tan seguro como sus secretos. Ten cuidado con los pseudo-secretos —> con esto estoy totalmente de acuerdo: no bases la seguridad de tus sistemas en la ofuscación o el que no se conozca tus algoritmos. Esto es ley en programación.
  18. Para resolver un problema interesante, comienza por buscar un problema que te interese —> nuevamente la cuestión de la motivación y que los grandes programadores suelen trabajar en cosas que les interesan y motivan. Muy bonito y está bien participar en ello en un proyecto Open Source, pero en la cruda realidad hay que comer y el trabajo no siempre es tan interesante o motivador. De esta parte me gusta un párrafo en el que compara la catedral y el bazar con las leyes físicas Newtonianas y de la relatividad especial respectivamente, y dice: «This resembles the relationship between Newtonian and Einsteinian physics-the older system is still valid at low energies, but if you push mass and velocity high enough you get surprises like nuclear explosions or Linux.»
  19. Partiendo de la base de que el coordinador del desarrollo (Open Source) tiene a su disposición un medio de comunicación al menos tan bueno como Internet y que sabe como dirigir sin coerción, muchas cabezas son inevitablemente mejores que una sola —> Amén.

—–

El ensayo es todo un clásico y, a pesar de lo que pueda parecer por mi resumen, es bastante interesante y cualquier programador debería leerlo, sobre todo si debe coordinar equipos de desarrolladores. Eric tiene otros ensayos interesantes sobre Open Source que quizá comente en otra ocasión.

En fin, cada uno que saque sus conclusiones…