¿Y si todo es una engañifa?

Cuando entré en la universidad tenía una visión de lo que era ser científico e investigar, y con los años esa visión se ha tornado en algo muy distinto. En vez de explicar yo mismo cuál es el problema de esta transformación, recomiendo la lectura de dos artículos que lo explican muy bien:

¿Y si la ciencia no es eso que tú crees?:

http://sociedad.elpais.com/sociedad/2013/12/11/actualidad/1386797483_412515.html

Por qué revistas como ‘Nature’, ‘Science’ y ‘Cell’ hacen daño a la ciencia:

http://sociedad.elpais.com/sociedad/2013/12/11/actualidad/1386798478_265291.html

Este último lo podéis leer en inglés:

How journals like Nature, Cell and Science are damaging science:

http://www.theguardian.com/commentisfree/2013/dec/09/how-journals-nature-science-cell-damage-science

Y por otro lado, recientemente Elsevier publicó una explicación sobre sus avisos “takedown”: si detectan que has publicado en tu web un artículo que ha sido publicado con ellos, te envían un aviso para que lo retires:

A comment on takedown notices (with update):

http://www.elsevier.com/connect/a-comment-on-takedown-notices

Un principio básico de la ciencia es el compartir los resultados y sin embargo hay gente que te prohíbe que lo hagas. El sistema está totalmente pervertido…

¿Se puede decir que quien escribe esto sabe programar?

Hace tiempo escribí la entrada No está mal, funciona, en la que mostraba la actitud de algunos alumnos a los que sólo les importa que su código funcione, no se molestan en pensar si el código está realmente bien o mal.

Para que lo entienda todo el mundo, es algo parecido a “excrivir un testo con faltas de hortografia”. Se entiende, ¿verdad? Pues está bien, diría alguno de mis alumnos.

Recientemente, mis alumnos (tercer curso) tenían que escribir un código en PHP para permitir el acceso de un usuario a la parte privada de una aplicación web: el típico login con nombre de usuario y contraseña. Más de un alumno (¿un 20%?) escribió lo siguiente o algo parecido:

$sentencia = "SELECT * FROM Usuarios";
$resultado = mysqli_query($link, $sentencia);
while($fila = mysqli_fetch_assoc($resultado)) {
 // $_POST["user"] y $_POST["password"] provienen del formulario de login
 if($fila["User"] == $_POST["user"] && $fila["Password"] == $_POST["password"]) {
   $_SESSION["Id"] = $fila["Id"];
   $_SESSION["Name"] = $fila["Name"];
 }
}
if(!empty($_SESSION["Id"])) {
 // Redirección página principal parte privada
}
else {
 // Redirección página principal parte pública
}

No nos fijemos en que no hay ninguna comprobación de los posibles errores que pueden ocurrir… eso es muy importante, pero no es lo que quiero destacar. ¿Cuál es el problema principal de este código?

Para un ojo educado en la programación, el código anterior es como “ber uvo escrito sin ache y con ube”.

¿Cómo competir con esto?

Recientemente recibí este correo:

Quería aprovechar la ocasión para hacerle una pregunta que me ronda por la cabeza. A partir, de los anteriores videos y usando el framework de Bootstrap realice pruebas diseñando una página Web. Tras esto, y en el punto en el que debía incorporar código para la validación de los usuarios contra la BD, cargar noticias, es decir, darle funcionalidad me surgió la siguiente duda. Existen herramientas como Joomla basadas en templates que automatizan todo el desarrollo de páginas Web añadiendo módulos sobre las plantillas que hacen mucho del trabajo que debemos realizar a la hora de desarrollar una Web, ¿Cómo competir con esto?, Cual es su opinión sobre este tema. (Al final el usuario valora lo que ve no lo que hay detrás)

¿Cómo competir con esto?

Esta es una cuestión que me plantean incluso mis alumnos alguna vez, ¿por qué estudiar HTML, CSS, JavaScript y PHP? ¿Por qué no estudiar un gestor de contenidos como Joomla, Drupal o WordPress? Se pueden hacer webs mejores, en menos tiempo, etc.

En primer lugar, tanto en mis clases en la universidad como en el curso iDESWEB, yo lo que enseño es a desarrollar aplicaciones web. Lo que yo enseño te permitiría crearte tu propio framework, como Codeigniter o Symfony, o incluso tu propio gestor de contenidos como Joomla, Drupal o WordPress. Aunque existan esas herramientas, también tiene que existir alguien que cree y mantenga esas herramientas. Por tanto, aprender a programar con HTML, CSS, JavaScript y PHP es necesario, hace falta gente que sepa.

Un gestor de contenidos no es la panacea, no es la solución para todos los problemas. Desgraciadamente, mucha gente aprende algo y se cree que eso es la solución para todo. El one size fits all pocas veces existe en ingeniería. Sí, existen plugins para los gestores de contenidos que te permiten hacer muchas cosas sin tener que bajar a bajo nivel, sin tener que programar, pero otra vez volvemos a lo mismo: alguien tiene que programar esos plugins. Y muchas veces el plugin no se adapta exactamente a lo que necesitas y tienes que implementar ciertas modificaciones o adaptaciones.

Un gestor de contenidos es muchas veces matar moscas a cañonazos. En la entrada sobre efectividad en la Wikipedia lo explican muy bien:

La efectividad es la capacidad de lograr un efecto deseado, esperado o anhelado. En cambio, eficiencia es la capacidad de lograr el efecto en cuestión con el mínimo de recursos posibles viable.
Ejemplo: matar una mosca de un cañonazo es eficaz (o efectivo: conseguimos el objetivo) pero poco eficiente (se gastan recursos desmesurados para la meta buscada). Pero acabar con su vida con un matamoscas, aparte de ser eficaz es eficiente.

Con los conceptos de eficaz y efectivo llegamos a la madre del cordero: un gestor de contenidos, como Joomla, Drupal o WordPress, consume muchos recursos. ¿Cuántos? Muchos… Una vez encontré una página web en la que se comparaba el tiempo de mostrar un mensaje como “Hello world!” con un HTML estático, con un PHP que ejecuta echo “Hello world!” y con WordPress que tiene una entrada que muestra “Hello world!”. La diferencia de consumo de recursos y de tiempo de ejecución era abismal entre WordPress y las otras dos opciones.

Desgraciadamente, no puedo encontrar esa página otra vez, pero sí que conozco algunas páginas que hacen la misma comparativa pero a nivel de frameworks de PHP (ya hablé de ello en ¿Es lento PHP?):

Por ejemplo, en el último tenemos:

  • Apache static file: 2991.65 Requests/sec with a time per request of 0.334ms.
  • PHP on Apache: 2518.25 requests/sec with a time per request of 0.397.
  • Symfony: 32.21 requests/sec with a time per request of 31.048ms.
  • CakePHP: 34.90 requests/sec with a time per request of 28.657ms.

Solamente utilizar un framework de PHP añade una penalización brutal al tiempo de ejecución. No digamos ya el uso de un gestor de contenidos…

Sí, el tiempo de ejecución de un framework o de un gestor de contenidos se puede mejorar, se puede optimizar, pero en el fondo, siempre existirá una diferencia importante.

Volviendo a la pregunta que se me planteaba, “¿cómo competir con esto?” y “al final el usuario valora lo que ve, no lo que hay detrás”, eso forma parte de los requisitos que se tienen que tener en cuenta a la hora de afrontar un trabajo. ¿El cliente quiere algo exclusivo, único, que sea eficiente, seguro, hecho a medida? Lo veo difícil con un gestor de contenidos.

Esto me recuerda los tres tipos de trabajos que se pueden hacer:

  • Un buen trabajo rápido (no saldrá barato).
  • Un trabajo barato y bueno (no será rápido).
  • Un trabajo barato rápido (no será bueno).

trs-tipos-de-trabajo

Está claro que en el segmento de las webs a 300€ en una semana, plantearse un desarrollo a medida realizado desde cero es un sinsentido. En ese segmento, una web realizada con un gestor de contenidos es una muy buena opción. Pero para alguien que está dispuesto a gastarse varios miles o varios cientos de miles de euros, lo que se pueda hacer con un gestor de contenidos seguramente no le será suficiente.

En realidad, todo esto no es un problema exclusivo del desarrollo web. El mismo problema aparece en otros contextos y se podría encuadrar en problemas que existen en la sociedad actual, como por ejemplo la McDonaldization.

¿Soy un buen programador?

Esta es una pregunta que seguramente todo programador se hace a lo largo de su vida más de una vez (yo diría que por lo menos una vez por año). Desgraciadamente, el vertiginoso ritmo de la informática origina un “estado de ansiedad” que te hace pensar que no sabes nada, lo cual, en realidad, es verdad. Pero una vez que se asume eso, el siguiente “estado de ansiedad” lo causa la sensación de que tu amigo o compañero de trabajo sí que sabe, lo cual, en realidad, es mentira.

En el artículo Overcoming Impostor lo explican muy bien. Dos párrafos que definen muy bien la causa de este problema y de otros problemas de la informática:

There are two characteristics of coding that can make programmers feel like they’re really struggling, when actually they could be doing just fine. The first thing with programming is that you’re almost guaranteed to have to learn new things as you’re doing it. The rate at which technology is changing is incredible. This can have the effect that one is constantly feeling behind, and that there is an ever-growing amount of stuff to learn.

The second characteristic that’s somewhat unique to programming is that it consists of near constant failure. Unlike learning other skills where one can expect to be reasonably competent after sufficient practice, programming largely consists of constantly failing, trying some things, failing some more, and trying more things until it works. One of the biggest differences between experienced and novice programmers is that experienced programmers know more things to try. Watching people who are just starting to code made me realize how extremely defeating this phenomenon can be.

Las reuniones, la multitarea y la programación

Hay días que no paro y sin embargo tengo la sensación de que no he hecho nada. Esa sensación la tengo porque no he creado nada, que es muy distinto de no hacer nada.

Esto me ocurre cuando tengo que contestar muchos correos, consultar a otras personas para tomar decisiones, atender a los alumnos, “hacer papeles”, etc. Acaba el día y no he podido escribir ni una sola línea de código, no he podido escribir ni una línea de un artículo, no he podido crear ni una escena para un vídeo o no he podido leer ni un párrafo de un artículo.

Una de las razones de esta situación son las constantes interrupciones y el constante cambio de una tarea a otra. Ya he escrito varias veces sobre lo malo que es la multitarea en el trabajo (y en casi todo), ya que añade una sobrecarga de trabajo para cambiar de una tarea a otra, que se traduce en una pérdida de eficiencia:

Ahora, un alumno me ha pasado el artículo Maker’s Schedule, Manager’s Schedule que añade una pieza más al problema de la multitarea en el trabajo.

El artículo comienza con una “verdad absoluta”: a los programadores no nos gustan las reuniones, las consideramos una pérdida de tiempo (otro tema es lo mal que se organizan y realizan las reuniones, pero eso es tema para otro artículo). Si un programador te dice que le gusta tener reuniones, entonces es un falso programador 🙂

One reason programmers dislike meetings so much is that they’re on a different type of schedule from other people. Meetings cost them more.

A partir de ahí se presentan dos perfiles que se pueden encontrar en el ámbito laboral: los makers, los creadores, los que hacen cosas (el artículo se centra en los programadores, pero también indica que este problema se da entre otros grupos de personas, como por ejemplo los escritores: en realidad, un programador también es un escritor), y los managers, los gestores o gerentes, los que mandan a otros (a los makers) a hacer cosas.

Los makers y los managers conviven en el trabajo y de vez en cuando se tienen que juntar, tienen que tener reuniones para organizar el trabajo. El problema es que los makers y los managers tienen calendarios/horarios (schedule) diferentes.

Un manager está constantemente de reunión en reunión. Para un manager, una reunión es simplemente eso, una reunión más: el manager espera que después de una reunión haya otra reunión, sólo tiene que consultar su agenda para ver dónde, para qué y con quién tiene la reunión.

That’s no problem for someone on the manager’s schedule. There’s always something coming on the next hour; the only question is what.

Sin embargo, el maker trabaja de otra forma. Un maker no puede escribir un texto o programar algo en una hora o en menos tiempo. Un maker trabaja en unidades de tiempo más grandes, como por ejemplo medio día.

They generally prefer to use time in units of half a day at least. You can’t write or program well in units of an hour. That’s barely enough time to get started.

Una hora o menos no es tiempo suficiente para hacer nada creativo (creativo = capaz de crear algo). Si tengo que escribir un artículo, en una hora no puedo escribir nada que valga la pena: necesito tiempo para releer lo que había escrito, conectar las ideas, pensar lo que voy a escribir, consultar algunas fuentes de información, escribirlo, revisarlo y finalmente darlo por bueno. Si tengo que escribir un programa o corregir un programa, en una hora no puedo hacerlo correctamente: necesito tiempo para recordar lo que voy a hacer, revisar lo que ya tengo hecho, decidir lo que voy a escribir, consultar alguna documentación, escribirlo, probarlo y finalmente darlo por bueno.

Para un maker, una reunión es una interrupción en su actividad. Para un maker, una reunión de media hora supone más de media hora en su tiempo de trabajo efectivo e incluso puede afectar a toda su jornada laboral.

For someone on the maker’s schedule, having a meeting is like throwing an exception. It doesn’t merely cause you to switch from one task to another; it changes the mode in which you work.

El artículo también introduce un concepto del que huyen espantados los makers: las “reuniones especulativas” (speculative meetings), que creo que es mejor llamar “reuniones imprevistas”. Las reuniones especulativas son aquellas que no se han programado previamente: el manager tiene un hueco en su agenda una mañana y lo completa con una reunión más a la que convoca a los makers. Para el manager no supone ningún coste (por eso lo hace, y piensa que para el resto de los trabajadores tampoco les supone un coste). Sin embargo, para un maker, esa reunión es terrible, le supone un coste enorme en su productividad. El artículo sólo habla de reuniones, pero yo añadiría más cosas: una llamada de teléfono, un correo electrónico o la visita de un compañero, aunque sólo sean cinco minutos (eso es lo que siempre te dicen, y luego no son cinco minutos), pueden tener un impacto terrible en el trabajo de un maker. Y esto no sólo ocurre en el corto plazo del mismo día, sino que lo podemos alargar a varios días, la interrupción puede durar varios días.

Por ejemplo, en la universidad tienen la malsana costumbre de pedir cosas con la coletilla de “urgente”: “esto lo necesito para hoy, esto lo necesito para mañana… esto es muy urgente, lo necesitaba para ayer, se me olvido pedirlo con una semana de antelación (esto no lo dice la gente y creo que ni lo piensan) así que te lo pido ahora y lo necesito ¡¡ya!!”. Estas interrupciones me destrozan completamente mi plan de trabajo: tengo que dejar parado lo que estoy haciendo y cuando vuelvo una horas o días después, tengo que dedicar mucho tiempo para saber por dónde iba. Y además, estas interrupciones introducen un factor de error, pero eso es tema para otro artículo. Más de una vez me he quejado del abuso del “urgente”, pero a la gente parece que le da igual.

Yo iría un poco más allá, y más que makers, hablaría de creativos: el trabajo de un programador, de un escritor o de un periodista es altamente creativo, eso es lo que los conecta y eso es lo que hace que una reunión o una interrupción sea tan perjudicial. Salvo en ciertas ocasiones, el trabajo de un programador no es mecánico, necesita “inspiración”. Y para que la inspiración aparezca, se necesita conocimiento, tiempo y concentración.

El artículo ofrece una sencilla solución a este problema: agrupar todas las horas de las reuniones al final de la jornada laboral. De este modo, las reuniones no son una interrupción para el maker.

Several times a week I set aside a chunk of time to meet founders we’ve funded. These chunks of time are at the end of my working day, and I wrote a signup program that ensures all the appointments within a given set of office hours are clustered at the end. Because they come at the end of my day these meetings are never an interruption.

El artículo termina de forma optimista: empezar a entender el problema puede ser el comienzo de su solución.

Till recently we weren’t clear in our own minds about the source of the problem. We just took it for granted that we had to either blow our schedules or offend people. But now that I’ve realized what’s going on, perhaps there’s a third option: to write something explaining the two types of schedule. Maybe eventually, if the conflict between the manager’s schedule and the maker’s schedule starts to be more widely understood, it will become less of a problem.

Y tú, ¿eres un maker o un manager? ¿Qué opinas?

Los mitos de la multitarea

Hace unos meses escribí la entrada El intercambio de tareas es perjudicial para el trabajo, en la que me hacía eco de un artículo en el que se alertaba de los peligros de la multitarea sobre el cerebro humano.

Por ahí fuera hay muchos defensores de la multitarea (multitasking, en inglés) y lo ensalzan como una gran capacidad de las nuevas generaciones, frente a las viejas generaciones que “sólo saben hacer una cosa detrás de otra”. Mucha gente tiende a creer que lo nuevo, lo último, siempre es mejor que lo viejo, lo anterior. Pero eso es una falacia.

La verdad es que las nuevas tecnologías están produciendo cambios en la forma de actuar y de pensar que pueden conducir a una forma de actuar y pensar muy distintas de la actual, y que no tienen que ser obligatoriamente mejores. Recomiendo la lectura del artículo Is Google Making Us Stupid? de Nicholas Carr para tener una idea del problema. Su hipótesis la desarrolló con más detalle en su libro “Superficiales. ¿Qué está haciendo Internet con nuestras mentes?” (The Shallows: What the Internet Is Doing to Our Brains). Este libro fue finalista del premio Pulitzer en el año 2011. Pero si no tienes tiempo ni ganas para leer el artículo en inglés o su libro (porque tu cerebro ya ha cambiado), puedes leer Un mundo distraído.

Ahora acabo de encontrar unos artículos sobre los mitos de la multitarea:

No está mal, funciona

“No está mal, funciona”, es lo que me dicen muchos de mis alumnos cuando les reviso su código y les señalo algunos errores. Sí, funciona, pero eso no es lo único importante. Por ejemplo, veamos el siguiente fragmento de código escrito en PHP:

if(($fichero = @file("testimonios.txt")) == false)
  echo "No se ha podido abrir el fichero";
else
{
  $num = rand(1, count($fichero));
  $i=1;
  foreach($fichero as $numLinea => $linea)
  {
    if ($i==$num)
    {
      list($titulo, $fecha, $contenido) = explode('###', $linea);
      echo "<fieldset><legend><h2>".htmlspecialchars($titulo) ."</h2></legend>";
      echo htmlspecialchars($contenido)."<br /><br />".htmlspecialchars($fecha);
      echo "</fieldset>";
    }
    $i = $i+1;
  }
}

El propósito de este código es leer un fichero (“testimonios.txt”) que tiene el siguiente formato, en el que cada línea es un testimonio de una persona:

titulo###fecha###contenido
titulo###fecha###contenido
titulo###fecha###contenido

Se tiene que elegir una línea al azar y mostrarla.

¿Qué problemas tiene este código?

  1. Utiliza un bucle para localizar en el array el testimonio a mostrar: los arrays son estructuras de acceso directo, si tienes una posición ($num), accedes y punto, no necesitas un bucle para acceder a una posición.
  2. Parece que tampoco entiende el manejo de foreach(): necesita $i para saber en qué posición está, cuando $numLinea ya le valdría.
  3. Cuando por fin encuentra el testimonio y lo muestra ($i==$num), no finaliza el bucle, sigue y sigue buscando en el array hasta llegar al final.
  4. Utiliza el fieldset y el legend, cuyo propósito es agrupar controles en un formulario, para mostrar el testimonio en una “caja bonita” con borde.

Esto no lo ha hecho un alumno de primero, es de un alumno de tercero.

La ingeniería del software es distinta de la ingeniería del hardware

Esto es un “secreto a voces”. Recomiendo la lectura del artículo ¿”Ingeniería” del software? Ahora vienen los mea culpa, de Ricardo Galli.

Y también recomiendo el siguiente vídeo, en inglés, Engineering Software is Different from Engineering Hardware:

[kml_flashembed movie=”http://www.youtube.com/v/miak8SvQeuM” width=”560″ height=”315″ wmode=”transparent” /]

En este vídeo se comentan algunos fracasos famosos de la ingeniería del software. Uno más reciente es BBC scraps £98m digital archive project as DG admits licence money wasted.

¿Hay que contestar directamente las preguntas de los alumnos?

Pues no, porque entonces no aprenden. Lo más fácil, tanto para el profesor como para el alumno, sería que el profesor respondiese siempre con la solución que buscan los alumnos, pero eso no ayudaría nunca a su aprendizaje.

Por fin he encontrado un artículo de alguien que piensa como yo: Why I never give straight answers. El artículo está escrito por Daniel Lemire, un profesor de informática de Canadá.