2016/10/31

El mito del mejor software


Hay una historia acerca de un hombre al pie de un farol, buscando sus llaves. Alguien que llega para ayudarle, después de un rato le pregunta si está seguro que las perdió allí. "No, las perdí en la esquina", le contesta, "pero aquí hay más luz".

Un absurdo similar puede ocurrir cuando se elige una tecnología arbitrariamente y no por si contribuye efectivamente al problema que se quiere solucionar.

Cuando alguien se afana en manejar la mejor tecnología, reducir su código y optimizar la carga, simplemente "porque sí", porque es "la forma correcta", en realidad está imitando a aquel hombre. Esmerarse en hacer el mejor software posible es un problema diferente. Pero buscamos ahí porque es un problema donde tenemos más luz.

Nos gusta resolver el problema del mejor software, donde tenemos más luz, que el problema que realmente tenemos que resolver, donde aún está oscuro.

Puedes notar que a muchos programadores les gusta entrar a ese juego de juzgar la virtud de una solución en función de la tecnología usada para construirla.

"¿Con qué lo hicieron?"

Un programador puede tener preferencia por las tecnologías de vanguardia, otro por las super optimizadas, otro por las escalables, etc. Siempre será posible escoger un escenario desfavorable para cualquier tecnología con la que no simpaticemos.

Es una discusión no productiva. Hacer el mejor software no garantiza que se solucione el problema. No es que esté mal buscar la excelencia técnica; simplemente se trata de otro problema.

"¿Funcionó?"

Sería una pregunta más razonable. Una vez que una solución funciona, es cuestión de iterar para llegar a las optimizaciones o solucionar problemas relacionados.

La verdadera tarea no es hacer el mejor software posible sino solucionar un problema.

Hay muchos ejemplos de buenas soluciones hechas con software que se mira por sobre el hombro (Wikipedia, WordPress, Drupal, la base de Facebook, por ejemplo, son hechos con PHP).

Una solución no es buena por el software con que se hace, sino por su oportunidad y relevancia.

Resolución Iterativa de Problemas

Hemos sido educados con un sesgo importante hacia la resolución determinista de problemas.

La forma determinista postula que hay una forma correcta de resolver un problema. Ya sea porque es la más económica, o la más veloz. La solución.

La economía o el tiempo suelen ser los criterios últimos para evaluar una solución.

La forma determinista es como resolvemos los problemas que ya sabemos cómo se resuelven.

Como cuando aprendes a resolver problemas tipo para un exámen de admisión, o los casos de actuación en un protocolo.

¿Has resuelto alguna vez el problema de los dos trenes? Uno parte de A, el otro de B, distante tantos km, a tales velocidades, averiguar a qué hora se cruzan. Un problema con una solución ya conocida. Eso es resolución determinista de un problema. La forma con la que nos han enseñado a pensar. No funciona muy bien para explorar.
La forma iterativa es como realmente resolvemos los problemas cuya solución no conocemos.

Consiste en esbozar diversas alternativas y disparar tentativamente para encontrar alguna que funcione. Una vez que se tiene una línea que llegue al otro lado, se va iterando, corrigiendo la dirección, el apoyo, el material, hasta que poco a poco se tiene un puente que permita cruzar. Una solución.

¿Has jugado Angry Birds? Tienes una honda y varios proyectiles para intentar derrumbar una estructura. Sólo tienes pesos aproximados, alguna idea del viento. ¿Cómo lo resuelves? Lanzando cosas, usando diferentes combinaciones de impulso y ángulo hasta encontrar una respuesta satisfactoria. Eso es resolución iterativa de un problema. Así es como resolvemos las cosas por descubrimiento. Algo que vale la pena aprender a hacer mejor.
La forma iterativa admite muchas soluciones. Cualquiera respuesta que satisfaga la necesidad es una solución. Esta solución puede ser iterada, para optimizarse, para que sea más económica, para que sea replicable o escalable.

La economía o el tiempo pueden ser criterios para evaluar una solución iterativa. Pero sería ingenuo limitarse a ello.

Ya que la solución se va iterando, tiene valor la mantenibilidad; qué tan facil es entender la solución, corregirla y evolucionarla.

En la resolución iterativa de problemas los intentos de optimización prematura tienen el efecto de limitar las opciones disponibles y hacer más complicada la resolución.

Cuando la solución sea muy conocida, se podría usar de modo determinista, como en los libros de texto.

Un problema de los libros de texto es que no te cuentan la forma iterativa en que se se resuelven los problemas.

Cuando las metodologías agiles proponen una forma iterativa de organizar el desarrollo de un proyecto, puede haber una resistencia social (la jerarquía vertical resistiéndose a ser horizontal), y también una resistencia cultural.

Pienso que la resistencia cultural es básicamente el pensamiento determinista resistiéndose a ser iterativo. La gente desconfía de las soluciones iterativas. Básicamente porque no ha sido educada para resolver problemas iterativamente.




2016/10/12

Posicionando el footer con Flexbox

Una forma de posicionar el footer, con Flexbox.

Cómo hacer que el footer esté siempre al fondo de la página, aún cuando el contenido sea mínimo.

Idea

  • El container usa display: flex
    • flex-direction: column para indicar disponer los elementos verticalmente
    • justify-content: space-between para que los elementos se separen hasta ocupar toda el área
      • Para que área tenga toda la altura, el html, body y el mismo container tienen height: 100%
  • Para indicar la altura de un elemento dentro del flex, se puede usar algo como flex-basis: 50px
    • Para indicar que el elemento no se pueda contraer, flex-shrink: 0
  • Para indicar que main ocupe toda la altura posible, flex: 1 (por default los demas están en 0)
 

2016/10/04

Proyectos felices


Internet y las nuevas tecnologías están ayudando a que la gente imagine formas nuevas de hacer las cosas y resuelva problemas.

La gente imagina soluciones y trata de implementarlas. A veces con éxito, a veces no tanto.

Y es que la forma de implementar una solución es también algo que tendríamos que mejorar.

Muchos provenimos de instituciones educativas que nos han formado con hábitos que no suelen ser los mejores. Una tendencia a establecer relaciones jerarquicas, en lugar de colaborativas. A competir, en lugar de cooperar. A proteger, en lugar de compartir. A culpar a las personas, en lugar de enfrentar los hechos. Y así.

Así que a la hora de realizar un proyecto con el que intentamos resolver cierto problema, encontramos un meta problema, que es la forma cómo nos organizamos.

Lo que puede hacer la diferencia no es cuánto dinero tenemos, ni qué tecnología usamos, sino cómo estamos organizados. ¿Es un organismo sano, sabemos cuándo algo le duele, sabemos curarlo, podemos caminar de modo sostenible?

Hay propuestas, como la de las metodologías agiles, que dan cierta luz en ese camino oscuro por el que siempre hemos venido transitando sin darnos cuenta.

Estas son algunas de las cosas que me parece se toman en cuenta en proyectos felices.

  • Lo más importante es la gente
    • El dinero es solo una herramienta
    • La gente no es una herramienta ni un recurso
    • Permite cultivar los verdaderos talentos, no los que necesitas.
      (la gente que encuentra su pasión es la que mejora el mundo)
    • Cuestiona los hechos, no a las personas
    • Cultiva una comunidad
    • Cada problema es de la comunidad
    • Cada victoria es de la comunidad
      (las clásicas recompensas individuales no hacen bien a la larga)
  • Disfrutar el camino
    • Cultiva la autonomía, la maestría, y el hacer algo por un propósito superior
    • Trabaja por objetivos, no por turnos
    • Reunirse cada día, para mirar cómo vamos
    • Reunirse cada semana, para mirar cómo lo hicimos
    • Preguntarse que salió bien y qué se puede mejorar
    • Celebra aquello que quieres que perdure
    • Equivocarse es parte de aprender
    • Un paso completo, aunque sea pequeño, es una victoria
    • Cada victoria te da energía para el siguiente paso
  • Honestidad
    • Saber decir que no
    • Mostrar con claridad y explícitamente el estado de las cosas
    • Debe haber un por qué para cada cosa que se quiere incluir en el proyecto

Muchas veces se desarrollan proyectos sin tener en cuenta casi ninguna de estas cosas. Es decir, sin tener en cuenta a la gente, con quienes finalmente tienes que contar para lograrlo.

Hay varias preguntas y retos al tratar de hacer estas cosas. ¿Por qué no funcionan las recompensas?, ¿Cómo se deben distribuir la ganancias?, etc. Algunas pueden parecer contra intuitivas, pero están apoyadas por evidencia objetiva y estudios en comportamiento humano (a diferencia de muchas cosas que hacemos simplemente porque siempre se ha hecho así). Algunas pueden parecer imposibles, pero ya hay organizaciones en el mundo moviéndose bajo principios como estos.

Quizás sea porque nuestros padres no sabían hacerlo y tampoco nos lo enseñaron. Pero es algo importante que pienso debemos aprender a hacer para prosperar en esta nueva era.