A raíz de un tweet que hice hace un par de días sobre un benchmark sobre diferentes lenguajes, frameworks ORMs se montó un buen revuelo en circulo de usuarios en Twitter y otros que se fueron añadiendo al debate. Lo que empezó como una discusión muy interesante con argumentos de todos bandos sobre el benchmark y los frameworks (principalmente en PHP), terminó en pelea de gallos…

Pero no me gustaría centrar todo el post a las reacciones de determinados usuarios a algunos argumentos, me gustaría extenderme un poco en la exposición de mi opinión al respecto del debate general. No me considero un experto, pero creo que pese a mis pocos años de experiencia profesional puedo formular una opinión sabiendo más o menos de que hablo.

Estoy totalmente de acuerdo en tomar el benchmark en cuestión con cautela. Como todos los benchmarks no refleja para nada la realidad puesto que se basa en unas condiciones para hacer la comparación muy controladas y determinadas. A pesar de ello, con una simple búsqueda en Google, podemos encontrar varios benchmarks más de comparaciones entre frameworks PHP donde se llega a conclusiones similares. Y esta no es otra que Symfony2 es lento.

Un framework para dominarlos a todos

Actualmente estoy desarrollando un proyecto en mi tiempo libre junto a un compañero de Atrápalo basado en Symfony2 y MongoDB. Considero que es un buen framework para estar hecho en PHP, y es que PHP es lo que es, viene de la historia que viene y de frameworks monolíticos como Symfony 1 o Zend Framework 1 donde, en mi opinión, el retraso en comparación con frameworks de otros lenguajes era notable.

Creo que Symfony2 es el mejor framework de PHP (o como me gusta decir, el menos malo) y tiene un mercado realmente potente. Veo a Symfony2 ideal para desarrollos rápidos y para empresas en su fase de inicial y de crecimiento que necesitan desarrollar a una velocidad alta. Me encanta el concepto de bundle, los componentes desacoplados, el hecho de poder utilizar un solo bundle de Symfony2 para un proyecto me parece un avance increíble dentro de los frameworks PHP. Componentes como Doctrine, DomCrawler, etc con los que he podido trabajar últimamente, ahorran muchas horas de trabajo y agilizan mucho el desarrollo.

Pero no nos engañemos, todo este ahorro de tiempo se traduce en pérdida de performance como es obvio. Symfony2 está preparado para construir sites robustos, permite a los desarrolladores abstraerse de muchas tareas repetitivas que realizamos en cada proyecto. Todas esas abstracciones, son precisamente las que aumentan la complejidad del framework. Symfony2 esconde toda esa lógica por aparentemente por arte de magia permite cubrir la gran mayoría de los casos de uso sin tener que ensuciarse las manos tocando las tripas del framework. Un framework, por definición, añade complejidad y aumenta la agilidad del desarrollo (esto último al menos en fases iniciales del proyecto).

PHP no destaca especialmente por su rapidez y no puede competir con lenguajes compilados. Los benchmarks solo hacen que constatar que Symfony2 es un “monstruo” en términos de performance y no puede compararse con otros frameworks basados en PHP como Kohana o Phalcon (pese a que éste ultimo parte con cierta ventaja arquitectural) no digamos ya con otros frameworks de otros lenguajes.

comparativa frameworks

Otra de las pruebas de la lentitud de Symfony2 es la existencia de Silex, un microframework basado en los componentes de Symfony creado por Sensio Labs, la misma empresa creadora de Symfony. Pese que Silex mejora significativamente en los benchmarks a Symfony, sigue sin poder compararse con otros microframeworks.

comparativa frameworks

También hay que decir que el framework no suele ser el cuello de botella en grandes aplicaciones, hay puntos mucho más críticos como base de datos. Hoy en día existen mucho sistemas para minimizar el impacto en la performance que te pueden generar los frameworks. No siempre se pueden aplicar, y a la hora de desarrollar el tema se vuelve un poco lento… Ultimamente que estoy desarrollando con Symfony sobre Vagrant y os puedo confirmar que en entorno de desarrollo la cosa está un poco lenta (unos 5 segundos para cargar una página sin acceso a BD). Pese a todo esto, como decía, estos problemas se ven subsanados en gran medida en producción por las cachés, la arquitectura de sistemas de la aplicación, etc.

En conclusión, Symfony2 es un gran framework, pero la Biblia no ha pasado a constar de 3 partes: antiguo testamento, nuevo testamento y blog de Fabien Potencier por mucho que les pese a algunos. Hay vida más allá de Symfony dentro de PHP y hay vida más allá del propio PHP. Por ese motivo entornos como Spring, NodeJS o hasta Rails pueden mirar por encima del hombro a Symfony2 en términos de performance. Luego podemos entrar a hablar que framework nos gusta más a cada uno, pero esto es subjetivo la mayoría de veces aunque haya gente que no lo entienda.

El framework, el medio y el fin

El mundo web es muy amplio, las posibilidades infinitas y los requisitos de los proyectos a veces un tanto surrealistas. Hay casos, en determinados sites, con determinados números el uso de un framework comercial simplemente no funciona. En mi caso personal, actualmente trabajo en una empresa donde los requisitos funcionales de la aplicación varían de un día para otro y donde la lógica de negocio es extremadamente compleja, es requisito indispensable que la base tecnológica en la que trabajamos sea flexible y se adapte a nuestras necesidades especificas. En estos casos el tener el control de lo que estás programando es extremadamente importante y, como decía antes, a veces Symfony2 me parece que hace realmente magia.

Conocer en profundidad un framework comercial es una carga pesada para un equipo de desarrollo y una tarea realmente tediosa. Además el framework comercial tiende a actualizarse periódicamente, incorporar nuevas features que pueden dar quebraderos de cabeza con tú legacy… Esto te obliga a depender de terceras personas u organizaciones en el desarrollo de tu negocio. Muchas empresas, ante estas circunstancias, se plantean la creación de un framework propio. Lo que es una buena solución para unos, no lo es para otros y viceversa.

No debemos olvidar que un framework no es más que una herramienta de trabajo, no se trata del fin sino del medio para alcanzar nuestro objetivo.

“Framework is just a delivery mechanism for the web”

Nuestro trabajo hoy y mañana

Soy ingeniero informático, me considero aspirante a ingeniero de software y por eso intento aplicar principios de ingeniería a mi trabajo. La misión de nuestra profesión es solucionar problemas aportando la mejor solución dadas unas circunstancias. Los casos ideales y fantásticos donde no hay limitaciones se dan muy pocas veces, solo las empresas jóvenes pueden presumir de no tener que tratar con legacy code, tener libertad total a la hora de elegir sus herramientas, poder montar una buena infraestructura de sistemas desde 0, etc… El resto de empresas, la mayoría, debe hacer todo lo posible para mejorar la calidad de su sistema a partir de unas condiciones, en ocasiones no demasiado favorables y llegar a estos objetivos.

Los mega-frameworks modernos, como Symfony2 o Zend Framework 2 son siempre una solución académicamente correcta a problemas en condiciones ideales y la mayoría de veces una solución perfectamente válida a problemas más reales… pero los problemas reales suelen distar de los problemas académicos.

Creo que si nos queremos considerar ingenieros no nos debemos casar con ninguna herramienta y no perder la perspectiva de que nuestro objetivo es solucionar un problema. Creo que los problemas hay que analizarlos detenidamente para encontrar la solución adecuada con la herramienta adecuada. Seguir la corriente del gurú de turno, dejarse llevar por modas debería quedar desterrad de nuestro oficio. El sentido crítico debería ser una cualidad intrínseca de nuestra profesión. Me sorprende ver en ocasiones a gente técnicamente muy buena que son auténticos talibanes de la tecnología o el gurú de turno. Ojo! que yo no digo que estén equivocados, no me preocupa su criterio para discernir una buena herramienta, me preocupa su falta de juicio crítico.

“Si en ocasiones te consideras un genio y en otras el más estupido del mundo, el desarrollo de software es tu vocación”

A veces, como gremio, nos olvidamos un poco de la segunda parte… y es que desengañemonos, en nuestra profesión abundan las personas que se quieren mucho a si mismas y desprecian todo lo que se desvíe mínimamente de su punto de vista. No querría entrar en las mismas comparaciones pesadas de siempre, pero permitidme solo una: no he visto ningún arquitecto despreciar a otro arquitecto por que usa columnas cuadradas en vez de pilares redondos. Pretender solucionar todo con la misma herramienta y no respetar a los que buscan (bajo su criterio) la mejor alternativa es una necedad.

Frases como “cuando hagáis algo de verdad con vuestros mierdas de frameworks me avisáis” (sic), ataques personales, etc deberían quedar fuera de toda discusión seria y quedarse en el ámbito de las peleas de bar y las discusiones de preadolescentes de que integrante de One Direction es más guapo. Pero a veces es imposible discutir a causa del dogmatismo.

Pese a todo…

Pese a todo el debate de ayer con las personas que aportaban su opinión respetuosamente. Hubo opiniones para todo y creo que aprendimos bastante. Me gustaría dar las gracias a la GRAN MAYORÍA de participantes en la discusión por su tono pese a no coincidir en algunas opiniones con el otros participantes.

Estaría bien montar una discusión sobre el tema un poco más estructurada que simples intercambios de tweets. Podríamos hacer una especie de debate por turnos en este blog o en otro … :) si se os ocurre algo estoy abierto a alternativas.

Estoy seguro que TODOS aprenderíamos algo.

micro frameworks benchmark | Phalconphp

Performance benchmark of popular PHP frameworks | www.systemsarchitec.net

PHP framework comparision | we-love-php.blogspot.com

PHP Framework Benchmarks | www.elefantcms.com