¿Por qué Laravel?
¿Por qué elegir Laravel para construir este proyecto?
Nota: este es un artículo técnico.
Después de presentar Monica en Hacker News, recibí muchas preguntas sobre por qué había escrito la herramienta con PHP y con Laravel en particular. Me sorprendió recibir tantas preguntas sobre el tema, porque considero que el lenguaje no importa: solo cuenta lo que haces con él.
En este artículo explicaré por qué elegí PHP y Laravel y qué dificultades tuve que superar para construir la primera versión del producto. Este texto no pretende iniciar una guerra entre lenguajes.
PHP tiene una historia interesante. Muchos grandes desarrolladores web, que probablemente ya no usan PHP, aprendieron con él las bases de la programación. Era sencillísimo de usar y de empezar y, aunque no era un lenguaje elegante, abrió el camino a muchas carreras en desarrollo web. Con el tiempo PHP fue perdiendo cariño, hasta el punto de que casi daba vergüenza usarlo o incluso decir en un meetup que tu empresa lo utilizaba. Otros lenguajes, sin duda más elegantes, ganaron mucha popularidad (Python, Ruby) gracias a frameworks estupendos construidos sobre ellos. Al mismo tiempo aparecieron nuevos frameworks PHP. Symfony, por ejemplo. Pero Symfony seguía siendo difícil de aprender y de usar. Y entonces PHP murió. O eso decía la gente, ignorando al parecer que muchísimas empresas seguían usándolo y disfrutándolo. Después llegó PHP 5.5, seguido de PHP 7, y apareció un framework con un nombre raro: Laravel. Y la mentalidad cambió por completo. PHP sigue sin ser tan elegante como otros lenguajes populares, pero las cosas mejoraron mucho. Además se volvió rápido.
Aun así, PHP sigue siendo el lenguaje que la gente adora odiar, sobre todo en Hacker News. Dicen que PHP no escala. Probablemente por eso Facebook y Mailchimp, entre otros grandes nombres, usan PHP hoy, y a gran escala.
Con ese contexto en mente, ¿por qué elegí PHP y Laravel?
- PHP es sencillo de aprender y sencillo de usar.
- Hay muchísimos desarrolladores de PHP y, si alguien quiere trabajar conmigo en el proyecto, el grupo potencial de desarrolladores de PHP es mayor, al menos donde yo vivo, que el de desarrolladores de Ruby o Python. Además, hay mucha gente en GitHub que usa PHP y, si quería que este proyecto de código abierto tuviera recorrido, tenía que escribirlo en un lenguaje en el que personas con niveles muy distintos pudieran contribuir con facilidad.
- Lo más importante al elegir una pila tecnológica para un proyecto nuevo es lo fácil que será mantenerlo a largo plazo. PHP es simple. Es fácil de depurar (aunque podría serlo más) y fácil de escalar (aunque ahora mismo no es mi preocupación en absoluto).
- Laravel es con diferencia el mejor framework PHP que he usado. Hace que las cosas complejas resulten muy sencillas. Se nota que se creó para arrancar aplicaciones web muy rápido y es un verdadero placer usarlo. Pero su gran diferencia es la calidad de la documentación, comparada con otros frameworks PHP e incluso con muchos frameworks de otros lenguajes. Todo está documentado de forma excelente. No puedo insistir lo suficiente en lo importante que es una buena documentación (lo que me recuerda que debería documentar Monica todavía más).
- Hay una enorme comunidad alrededor de PHP y de Laravel en particular: Laracasts, Forge, Envoyer y una comunidad de Slack muy activa, por citar solo algunos. Si necesitas ayuda, hay mucha gente dispuesta a echarte una mano.
¿Qué retos me encontré durante el desarrollo del proyecto?
En general no tuve demasiados retos al desarrollar la versión actual de Monica. No es una aplicación compleja y no tengo problemas de escalado, ya que la base de usuarios sigue siendo pequeña (unos 7800 usuarios en total y 4300 activos). Pero hay detalles de implementación que hice mal, no por mala práctica, sino porque mis conocimientos técnicos no daban para resolver esos problemas a corto plazo. Espero que enumerar esos errores ayude a otros a no cometerlos, o que gente amable me escriba para contarme cómo podría haberlos arreglado.
- En versiones anteriores usaba muchos eventos y listeners. El concepto es estupendo, pero por su culpa tuve muchos problemas para hacer pruebas unitarias de las clases base. Además, cuanto más los usaba, más magia ocurría entre bastidores. Pensé que quien entrara en el código tendría dificultades para entender por qué pasaban ciertas cosas al crear un objeto, por ejemplo. En mi cabeza, los eventos y los listeners hacían la aplicación más difícil de entender, así que decidí quitarlos todos (bueno, el 99 %, todavía quedan dos listeners de los que tengo que deshacerme).
- Al principio la base de datos estaba cifrada por completo. Por razones que todavía no entiendo, de vez en cuando había errores en el descifrado que dejaban datos que no podía recuperar. Como no quería lidiar con ese problema en esa etapa, decidí quitar el cifrado. Además, tener los datos cifrados hacía imposible cualquier ordenación o búsqueda en mis consultas, lo que habría sido problemático a la larga. Seguro que hay soluciones para ambos problemas, pero quería centrarme en crear funcionalidades nuevas en lugar de arreglar ese único asunto.
- No escribí pruebas unitarias antes de lanzar la aplicación. Eso me dolió de verdad. No creo que haya que aspirar al 100 % de cobertura, pero al menos hay que tener alguna prueba de las funcionalidades principales de tu sitio. Si no, acabas con un montón de errores en los que no habías pensado y, mientras intentas arreglarlos, tu solución afecta a otras partes de la aplicación. Eso se convierte rápidamente en una pesadilla. Laravel hace que las pruebas unitarias sean muy fáciles: debería habérmelo tomado más en serio. A partir de la próxima versión, no se fusionará ninguna pull request si no trae pruebas unitarias y quizá incluso funcionales.
Conclusión
Estas son algunas razones por las que elegí Laravel. Como decía al principio, tu proyecto no va del lenguaje. A menos que tu proyecto consista precisamente en aprender un lenguaje nuevo, no deberías pasar semanas eligiendo lenguaje o framework. Quédate con lo que conoces y construye algo. A tus usuarios no les importa que tu código sea feo o que hayas elegido Python en lugar de Ruby.