Dos anuncios importantes

Primero, como ya adivinan, he decidido retomar mi blog. Sí, otra vez. No prometo escribir con mucha frecuencia, pero sí prometo no volver a abandonarlo por casi un año.

Segundo, voy a escribir también en inglés. Quiero llegar a una audiencia más grande y, de paso, mejorar mi inglés escrito.

Fonts gratuitos de iA Writer

Los de iA Writer han liberado tres fuentes (fonts) de forma gratuita. iA Writer es el editor de Markdown que uso en mi smartphone. Me gustan sus fuentes porque son bien legibles y cuidadas; fue una grata sorpresa poder descargarlos y usarlos en mi computadora.

Mi Journal Comic: 2019

Este 2019 me he propuesto volver a actualizar regularmente mi Journal Comic. El 2017 no publiqué ni un solo comic y me tiene descontento. No volverá a ocurrir.

He estado implementando mejoras al motor detrás de todo Retrazos, ahora es una aplicación Zend Framework 3 en lugar del obsoleto Ruby on Rails 1.6. Ha sido una buena oportunidad para hacer refactoring y ordenar todo: la separación de secciones (antes todos compartían las mismas tablas), Unit Testing, una mejor arquitectura, etc.

Aún tengo tareas pendientes, pero mi enfoque está en tener mi Journal Comic funcional, tanto en la parte pública como en la sección privada de administración.

He hecho un cambio que va a romper muchos enlaces pero lo veía necesario: he renombrado varios tags según reglas específicas y claras a fin de mantener una consistencia. Tenía tags en singular, plural, en distintos tiempos gramaticales, etc.

Por si alguien lo encuentra útil, copio y pego mis reglas:

  • All tags are in lowercase, separated by spaces.
  • Use international characters: thalía, déjà vu.
  • Use dashes or other characters proper to the name: wreck-it ralph, sandwich.com.
  • Proper Names are in singular: batman, bible, ankylosaurus, php.
  • Prefer the English spelling over the Spanish one: peru vs perú.
  • Subjects and nouns are in plural: bees, kids, apps, songs. Exception to the rule: when inherently there’s only one: grammar, syntax, literature, music. Think: “show me posts with tags of ___”.
  • Adjectives should complete the sentence “I’m ___” or “I’m feeling ___”: poor, tired, burnt-out, weary, moved, blue.
  • Verbs are in singular, present participle tense: running, burning out, falling, walking, reading.
  • The rationale for adjectives and verbs is that they’re actively happening in the comic.

Un detalle del cual nunca me había percatado es que ¡mis imágenes no tenían fecha! Sin el contexto del post, no había forma de saber de cuándo es el comic, haciendo irrelevantes diálogos como “last Tuesday” o “three days ago.” Desde el 2019 todos los comics tienen la fecha al pie de la imagen.

Lo que no me gusta de Laravel

He estado leyendo, probando y viendo un poco de cerca Laravel, buscando agilizar los desarrollos que hacemos en Nodos.

Estas son algunas cosas que no me han gustado de Laravel. Quizás en algunas esté equivocado, dado que sólo he construido algo pequeño con el framework para tener un hands-on experience y no tengo un conocimiento a profundidad de éste. Corríjanme si me equivoco.

NOTA: Al momento que escribo esto, la versión más reciente de Laravel es 5.6.

La magia

Este es un código de ejemplo copiado del manual de Laravel acerca de validación:

/**
 * Store a new blog post.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid...
}

Lo que se puede ver es que hay una llamada a $request->validate().

Lo que no se ve es que si validate() encuentra contenido inválido, arroja una Excepción y se redirige automáticamente a la página anterior (con toda otra funcionalidad detrás de cámaras para preparar los errores y la persistencia de los valores antiguos).

Este comportamiento “mágico” no es visible ni intuitivo en el código, violando el Principle of Least Surprise. Solamente alguien con conocimientos de Laravel sabe lo que va a suceder.

Por otro lado, los Exceptions están siendo usados para controlar el flujo de la aplicación, lo cual es una mala práctica. Citando a Philip Brown:

An exception is basically an exceptional circumstance that is often unrecoverable from. This means something went wrong and we can’t proceed with running the application because the program is unable to carry on executing.

For example, I see a lot of code where the developer is using exceptions to control the flow of logic.

Exceptions should only be used in exceptional circumstances and therefore should be used sparingly.

Los famosos “Façades”

Mathias Verraes lo sabe decir mejor:

Laravel’s Facades have global state, which is precisely the thing you *shouldn’t* do. It is bad design and should be deprecated. They are nothing more than an elaborate $_GLOBALS.
(And they are a misnomer, as they are not Facades in the OOP meaning.)

Los formularios

Zend Framework 2 y 3 tienen Forms, que son colecciones de Form Elements con validación. Puedes crear nuevas clases de Form Elements como por ejemplo, “DNI” que incluye validadores, filtros, atributos, etc.
Laravel no tiene un concepto similar, estas funcionalidades están dispersas. Menos que eso, los helpers para renderizar los elementos de formulario fueron retirados del framework. No hay una base sobre la cual crear elementos reutilizables.

Service Container y PSR-11

Debido a requerimientos de clientes, en Nodos seguiremos usando tanto Zend Framework como Laravel. Revisando la interoperabilidad de Laravel en relación a su Service Container, veo que no se ajusta al PSR-11 — tampoco al ahora obsoleto container-interop.

Quizás tengamos que usar zend-servicemanager o algún otro Container PSR-11 para los Layers framework-agnostic.

Coda

Sobre el tema de la magia, cabe mencionar lo obvio: todo framework, por definición, trae consigo cierta medida de magia. Desde Rails, esto viene siendo un debate; y como ex-Rails developer, tengo tolerancia a cierta medida de magia pero ahora estoy gravitando más hacia lo explícito.

Hay “magia buena” (e.g. convention-over-configuration) y “magia mala” (e.g. leaky abstractions). La primera es aceptable, la segunda no.

Es mi sentir (y meramente mi opinión personal) que Laravel sacrifica mucho por darle prioridad al aspecto “beautiful code” y el “developer as an Web Artisan.” Para que Laravel pueda ser más interoperativo y desacoplado tendría que cambiar mucho estructuralmente, pero dudo que formen parte de las metas de Taylor Otwell. Mientras no pretenda convertirse en omakase, estamos bien.

Para equilibrar la balanza, en un próximo post haré una lista de las cosas que me gustan de Laravel.

Thalía’s Theme

Esta es una pieza de piano que compuse, dedicada para el amor de mi vida, mi esposa Thalía. Doy gracias al Señor por ser tú mi ayuda idónea y madre de mis hijos.

Interpretada y editada en un Korg Kross; mastering usando Renoise.

One Year, One Second Every Day 2016-2017

Yep, lo hice de nuevo. Desde el 28 de Agosto 2016 hasta el 28 de Agosto 2017 estuve grabando un segundo de video todos los días. La primera vez que hice esto fue en el 2013-2014.

Inicié este proyecto al tener un nuevo smartphone, un Huawei P8. Todos los videos han sido grabados con este equipo. Esta vez no lo armé a mano sino que usé la app 1 Second Everyday de César Kuriyama et al. ¡No tuve la menor intención de repetir el descomunal trabajo del año pasado!

Usé Apple iMovie para la edición de música y títulos. Mi plan era componer una pieza sencilla de piano, pero a falta de tiempo tuve que elegir otra canción. El tema es “Leaving all behind” de Karsten Koch.

El Calendario al poder

Me ha llamado la atención una serie de artículos de diversas personas acerca de una estrategia muy interesante: agendar en el calendario todo lo que se va a hacer en el día, es decir, no solamente las tareas sino también descansos, tiempo de recreación y ocio, etc. Mi calendario consta de ciertas entradas accionables (e.g. pagos, reviews), de notificación (e.g. vencimientos, cumpleaños) y alguno que otro bloque de tiempo (reuniones, visitas). La idea es ahora definir cada minuto de tiempo.

Lo leí primero en el libro Deep Work de Cal Newport, donde respaldaba el beneficio de hacer esto así:

[…] the motivation for this strategy is the recognition that a deep work habit requires you to treat your time with respect. A good first step towards this respectful handling is the advice outlined here: Decide in advance what you’re going to do with every minute of your workday.

A pesar de la explicación en el libro, no me quedaba del todo claro. Probé varios formatos diversos sin ningún éxito, hasta que encontré un artículo de Cal donde publicó una foto de su calendario. Una imagen vale más que mil palabras.

Hay una diferencia sustancial en el definir deliberadamente lo que uno va a hacer en el día. Tengo una larguísima lista de tareas pendientes, pero al intentar esta estrategia inmediatamente me di cuenta de dos cosas: (1) que el tiempo es de veras escaso y (2) que malgasto mi tiempo terriblemente. ¿En serio? ¿Tienes poquísimo tiempo y aún así te das el lujo de malgastarlo? Me sentí terrible y culpable.

Y eso es bueno.

Así que manos a la obra. Está claro ahora que esta estrategia es superior. Todavía estoy en proceso de hacer que este nuevo sistema funcione, estoy aún en la etapa de try-and-fail, pero no quería esperar más para escribir sobre ello.

Uso Google Calendar. Encontraba difícil definir cada bloque de tiempo, pues estaba intentando definir cada tarea, así tome cinco minutos o quince minutos. Pero la UI de Google Calendar no está diseñada para mostrar rectángulos de tiempo con esa granularidad, los rectángulos se superponen y quedan ilegibles. Y si ocurre un cambio, mover todos esos bloquecitos se vuelve tedioso. Demasiada fricción.

Ya encontré una mejor forma: defino un bloque de tiempo de una hora o media hora y en mi cuaderno Circa anoto las tareas que haré en ese bloque de tiempo. Así tengo tareas de quince o diez minutos que hago en conjunto, y cualquier cambio inesperado es fácil de manejar en papel.

Como bonus, una foto de mis fallidos intentos:

Si les interesa leer más, este artículo de Drew Coffman es un buen punto de partida con enlaces a lo que otros han estado escribiendo y opinando.

It’s an eye-opening exercise: you’ll probably find that it’s tough — if not impossible — to find a place for everything. But this is the reality of your life. You’ve simply used the calendar to paint a true picture of the time commitments you have on your plate. And whether or not you make these commitments visible, they’re there. After all, if you’re going to be run over by a truck, you might as well get its license plate.