jueves, febrero 26, 2009

Lo que Paul Graham ha aprendido con Hacker News

Hacker news es un sitio de envío y comentario de noticias muy al modo de reddit (o digg o menéame), pero con temática muy definida (temática técnica, hacker en el sentido MIT ), con editores estrictos y con políticas severas de ontopic. Pues Paul Graham, su creador ha escrito What I've Learned from Hacker News, o sea, lo que ha aprendido con el sitio. Se puede estar de acuerdo o en desacuerdo en algunas cosas, pero es sin duda interesante. Extracto, lo que me ha llamado la atención:

Recuerda, la motivación original pata Hacker News fue testear un lenguaje nuevo, uno centrado en experimentar con el diseño de lenguajes, no en el rendimiento. Cada vez que el sitio se vuelve lento, me refuerzo a mi mismo recordando la famosa cita de McIlroy y Bentley:
La clave del rendimiento es la elegancia, no un batallón de casos especiales.

Y busco los cuellos de botella que puedo eliminar con menos código. Así he sido capaz de mantener un rendimiento mediocre a pesar de que el crecimiento se ha multiplicado por catorce.


Probablemente lo más importante que he aprendido acerca de la "disolución" es que se mide más por comportamiento que por usuarios. Es el mal comportamiento lo que hay que mantener alejado más que a las malas personas. El comportamiento de los usuarios es sorprendentemente maleable. Si se espera de la gente que se comporte bien tiende a hacerlo. Y viceversa.


Lo más peligroso de la portada son las que es demasiado fácil votar positivo. Si alguien prueba un nuevo teorema, le lleva tiempo al lector decidir si vota positivo o no.Un cómic divertido cuesta menos. Una crítica con un slogan como título cuesta cero, porque la gente lo vota sin ni siquiera visitar el enlace.


La forma más peligrosa de de comentario estúpido no es el argumento largo pero equivocado sino el chiste tonto. Los argumentos largos pero equivocados son bastante raros. Hay una gran correlación entre la calidad y la longitud del comentario.


[...]Visitar un foro online sólo cuesta un clic y se parece mucho superficialmente a trabajar. Puedes estar gastando tu tiempo, pero no estás parado. Alguien esta equivocado en Internet, y tú estás arreglando el problema.


Digg es conocido por su falta de trasparencia. La raíz del problema no son los tipos que llevan Digg sean especialmente furtivos, sino que usan un algoritmo equivocado para generar la portada. En lugar de subir conforme van teniendo más votos, como en Reddit, las historias empiezan arriba y las nuevas que van llegando las van empujando hacia abajo.

La razón de la diferencia es que Digg deriva de Slashdot mientras que Reddit de delicious/popular. Digg es Slashdot con votos en lugar de editores y Reddit es delicious/popular con votos en lugar de agregar a favoritos (Aún se pueden ver los fósiles de sus orígenes en sus diseños gráficos.)


Otra cosa que he aprendido de este experimento es que si vas a distinguir a las personas, hazlo bien. Este es uno de esos problemas en los que no funciona al prototipado rápido.

De hecho este es el argumento intelectualmente honrado para no discriminar a varios tipos de personas. La razón no es que todo el mundo es igual, sino que es malo hacerlo de modo incorrecto y es difícil hacerlo bien.
Yo particularmente estoy de acuerdo en casi todo. Sólo puntualizaría que hay honrosas excepciones en la correlación entre longitud y calidad. Un enlace relevante, una cita, a veces es breve pero muy relevante en la discusión. De todos modos por eso habla de correlación :)

La misma entrada y más comentarios en Lo que Paul Graham ha aprendido con Hacker News en barrapunto

martes, febrero 17, 2009

¿Varios pájaros de un tiro?

Vía intertwingly, el blog de Sam Ruby, me encuentro con una cita extraída de una de las listas del W3C que traduzco sin más:
Un error muy común que los ingenieros de software cometen al diseñar una arquitectura es fijarse en cinco problemas, ver lo que tienen en común e intentar resolver los cinco a la vez. El resultado es casi siempre una solución por debajo de lo estándar para todos ellos.

Sí, una tendencia común, más acusada curiosamente en los desarrolladores que se intentan preocupar por la calidad de su trabajo. Para no caer inercialmente en ella habría que evaluar lo económico del desarrollo con lo limitado de las soluciones, algo que demasiadas veces no se hace.

Me ha recordado además a un "cartel motivador" sobre el principio de responsabilidad única que vi hace poco en reddit (Aquí se pueden ver todos los carteles, por si a alguien le son de utilidad :)

Ah, ya que estoy aquí, recomiendo la lectura del blog de Sam y de las listas relativas al HTML5 para ver flames de altura :)


Actualización egórica: A través de una detección automática de referencias Sam se ha enterado de mi enlace y le ha gustado mi referencia al "cartel motivador", que le da más argumentos en el flame. Y me ha enlazado en un comentario. Nunca lo hubiera pensado :)

La misma entrada y más comentarios en ¿Varios pájaros de un tiro? en barrapunto

jueves, febrero 05, 2009

Epigramas sobre programación

Siguiendo un enlace en technovelty he llegado a un artículo de Alan J. Perlis en el que a través de ciento treinta epigramas trató, en 1982, de capturar algunos de los aspectos más curiosos, desconcertantes y antiintuitivos de la computación en general y la programación en particular. Han pasado más de veintiséis años, pero mucha de su naturaleza creo que sigue intacta. Algunos creo haberlos leído en otra parte y supongo que al que lea esto le pueden sonar, pero me gustan, así que aquí van. Traduzco los que me han parecido mejores:

Epigramas:

7. Es más fácil escribir un programa incorrecto que entender uno correcto.

8. Un lenguaje de programación es de bajo nivel cuando sus programas requieren atención sobre lo irrelevante.

9. Es mejor tener 100 funciones operando sobre una estructura de datos que 10 funciones sobre 10 estructuras de datos.

14. A la larga cualquier programa se vuelve rococó. Después escombros.

15. Todo debería desarrollarse de arriba a abajo, excepto la primera vez.

17. Si alguien parece que está asintiendo cuando le explicas tu programa, despiértale.

19. Si un lenguaje no cambia el modo en el que ves la programación es que no merece la pena.

21. La optimización dificulta la evolución.

31. La simplicidad no precede a la complejidad, la sigue.

40. Hay dos modos de escribir programas sin errores. Sólo la tercera funciona.

57. Es más fácil cambiar la especificación para que se ajuste al programa que al contrario.

58. Los locos ignoran la complejidad. Los pragmáticos la sufren. Algunos pueden evitarla. Los genios la eliminan.

63. En computación, los invariantes son efímeros.

65. No te equivoques: los ordenadores procesan números, no símbolos. Medimos nuestro conocimiento (y control) de una actividad en la medida en la que podemos arimetizar.

75. Debido a su vitalidad la informática está a la busca desesperada de nuevos clichés: la banalidad calma nuestros nervios.

93. Cuando alguien diga "Quiero un lenguaje de programación en el que sólo tenga que decir lo que deseo hacer", regálale una piruleta.

95. No tengas buenas ideas si no eres capaz de responsabilizarte de ellas.

104. La prueba del valor de un sistema es su existencia.

115. Mucha gente encuentra el concepto de programar obvio, pero hacerlo les resulta imposible.

MetaEpigramas:

124. Los epigramas son macros, porque son ejecutados en tiempo de lectura.

125. Los epigramas cristalizan incongruencias.

127. Los epigramas desdeñan los detalles y lo hacen con intención: son una documentación de alto nivel excelente.
El lector atento verá que si se juntan la 8 y la 93 no existen lenguajes de alto nivel. Pero si se mezcla con la 125 ya no está tan claro. Bueno, para pensar un rato. Pero no demasiado, que luego hay que codificar :)


La misma entrada y más comentarios en Epigramas sobre programación en barrapunto

miércoles, febrero 04, 2009

5 Secrets To Ninja Writing

5 Secrets To Ninja Writing. (Vía reddit)

Es mucho más recomendable pinchar en el enlace anterior si conoces el blog de Jeff Atwood, Coding Horror.

Está muy logrado, sobre todo la parodia del abuso de la autorreferencia, un vicio muy de blogstar, muy feo :)

La misma entrada y más comentarios en 5 Secrets To Ninja Writing en barrapunto

miércoles, enero 28, 2009

El sistema de plugins cada vez más cerca de GCC

Hace bastante tiempo que se viene discutiendo el porqué de la falta de sistema de plugins en el compilador libre por excelencia, GCC. Al parecer el principal problema era legal, es decir, el miedo fomentar la proliferación de plugins propietarios. Pues bien, ya se ha establecido el marco de licencias que pueden regir ese sistema, que es la nueva versión de la GCC Runtime Library Exception y con ello su desarrollo está cada vez más cerca. Además esta nueva versión de la licencia permitirá la actualización a la licencia GPLv3 de algunas librerías del propio GCC. La FSF ha proporcionado un documento con las razones para esta licencia y las preguntas más frecuentes sobre ella. Más comentarios en Slashdot: Plug-In Architecture On the Way For GCC.

Actualización: Drizzt se ha puesto de acuerdo, otra vez casualmente, para hablar del mismo tema, con algunos comentarios sobre el cambio de la licencia: El valle del Viento Helado: La arquitectura de plugins del GCC y las licencias.

La misma entrada y más comentarios en El sistema de plugins cada vez más cerca de GCC en barrapunto

miércoles, enero 14, 2009

Trucos gcc-céntricos y porqué no usarlos

En el estupendo blog Coding Relic el autor, Denton Gentry, ha publicado recientemente dos trucos muy espectaculares pero gcccéntricos. Bueno en realidad uno es específico de la glibc y el otro sí es una extensión de gcc:
  • printf-acular en el que se describe cómo personalizar printf para que admita más tipos de datos que los que normalmente admite, en el ejemplo sacar direcciones MAC formateadas.
  • Variable Scoping with gcc, en el que se explica el (espectacular) funcionamiento de __attribute__(cleanup), que permite funcionalidades del tipo RAII de C++
Y ahora, después de ver un par de extensiones tan útiles, potentes y elegantes es cuando me toca desrecomendarlas :) Creo firmemente en el valor de los estándares y en desarrollar siempre en el nivel más estricto de estándar o visto de otro modo en el nivel más amplio de disponibilidad, siempre y cuando las soluciones sean comparables. Además, es bueno pensar en la gente que retocará el código y cabe la posibilidad de que si no se documenta resulte de sólo escritura. Yo sólo lo vería admisible en un hack puntual documentado como mínimo con neones. No obstante, hay gente que no opina lo mismo como se puede leer en Uso de extensiones del GCC en (el kernel) Linux.


La misma entrada y más comentarios en Trucos gcc-céntricos y porqué no usarlos en barrapunto

miércoles, enero 07, 2009

La ley de Postel y los programadores

El otro día leí un comentario acerca de las diferencias en la admisión de parámetros entre los comandos en BSD y GNU. Según se comentaba, los segundos son menos estrictos y se tragan más cosas. El comentarista añadía sobre el comportamiento de la GNU userland: "me gusta a pesar del programador que hay en mi".

Y, por lo que sea, me ha parecido muy revelador: a los programadores no nos gusta, desde un punto de vista egoísta, lo que nos supone la ley de Postel, el principio de robustez. Aquello de ser liberal con lo que se admite como válido da repelús. Y creo que hay más de un motivo:
  • Nos gusta la precisión. Si somos estrictos en lo que generamos ¿No vamos a exigir lo mismo?
  • Se suele generar más código para tener el cuenta el ser liberal: más trabajo y más testeo
  • El comportamiento de nuestro soft no es tan rígido lo que choca con nuestro gusto por las especificaciones precisas, sencillas y breves.
Lo que a veces no vemos es que ser menos estricto mejora la robustez y eso al usuario final, como es normal, le encanta aunque le de igual si se es estricto, si Postel o Dracón, los estándares y todo lo demás.

Este efecto se nota más en ecosistemas heterogéneos con lo que la integración de ese software puede ser más fácil en entornos menos controlados. Así que otra cosa más a pensar antes de desarrollar ¿Nos compensará a la larga el esfuerzo de ser menos estrictos?

La misma entrada y más comentarios en La ley de Postel y los programadores en barrapunto

sábado, diciembre 13, 2008

Facebook publica su versión modificada de memcached

[Vía reddit] Facebook acaba de publicar su versión de memcached, el sistema de cachés genéricas más usado en aplicaciones web, tras hacer modificaciones para afrontar sus necesidades de rendimiento y escalabilidad. Las modificaciones principales han sido entre otras la eliminación de un buffer por conexión en favor de un pool, reducción de bloqueos innecesarios para un mejor rendimiento en máquinas multicore y el uso intensivo de UDP. El resultado final ha sido la posibilidad de gestionar 200.000 peticiones UDP por segundo con una latencia media de 173 microsegundos. Han subido los cambios a GitHub: facebook-memcached y esperan que los cambios sean incorporados al memcached oficial. Curiosamente hemos hablado recientemente por aquí de memcached en Un vistazo al interior de memcached.

Actualización: Olvidé mencionar que habían toqueteado el kernel :/ JAM hace muy bien resumen de esos apaños
Parece relevante también comentar lo que dicen en High Scalability sobre el memcached de Facebook y las conclusiones que se pueden sacar:
A summary of potential strategies:
  • Profile everything. Problems are always specific. The understanding of the problem must be specific. The fix must be specific.
  • Burn profiling into your regression tests. Detect when and where performance tanks as a regular part of your build.
  • Use resources in proportion to what grows slowest. This requires multiplexing, but at least your resource usage is more predictable and bounded.
  • Batch work. When you have the CPU do all the work you possibly can in the quantum or the whole system grinds to a halt in processing overhead.
  • Do work and maintain resources per task. Otherwise locking for shared resources takes more and more time when there's less and less time to do the work that needs to be done.
  • Change algorithms. Sometimes you simply need to do things differently. Tweaking will only get you so far.


La misma entrada y más comentarios en Facebook publica su versión modificada de memcached en barrapunto

martes, diciembre 09, 2008

El código fuente como documento definitivo del diseño

Se trata, cómo no, de Code as Design: Three Essays by Jack W. Reeves. Son unos ensayos muy ilustrativos de la naturaleza particular del desarrollo de software, que por usar la palabra diseño de un modo no usual acaban resultando muy polémicos, pero a mi me parecen más bien esclarecedores. Se recomienda leer enteros antes de opinar :P

Suelo aprovechar cualquier mención para volver a enlazarlo y esta vez ha sido Ricardo Galli en "Los problemas derivados del abuso de las analogías" quien me da la oportunidad de volver a hacerlo :)

Se ha hablado de ellos por aquí en El código fuente visto como diseño y POO, el código como diseño y más cosas.

La misma entrada y más comentarios en El código fuente como documento definitivo del diseño en barrapunto

jueves, noviembre 27, 2008

Memoria transaccional ¿Sólo un juguete para investigadores?

En Software Transactional Memory: why is it only a research toy? de Calin Cascaval et al. se repasan algunas de las razones por las que, tras unos años de investigación, la memoria transaccional no ha dado el salto para ser usada en otros entornos. Se nombran sobre todo razones de rendimiento, de usabilidad (semántica confusa) y de interacción con sistemas que no la usan. No obstante no todo el mundo se da por vencido y por ejemplo Larry O'Brien escribe en Cascaval et al.'s skepticism on transaction memory una visión un poco más optimista indicando que aún queda espacio para la investigación y la optimización. ¿Acabaremos usando STM o morirá antes de nacer?

La misma entrada y más comentarios en Memoria transaccional ¿Sólo un juguete para investigadores? en barrapunto