Hoy un viejo conocido me hizo esta pregunta:
Estuve a punto de contestar pero me di cuenta que soy incapaz, y que tampoco debería. Lo haré al final, como una cuestión muy personal y después de un rant de matizaciones.
Hace cinco años habría respondido sin dudar (de hecho varias veces lo hice) Python con Django. No es que me hayan dejado de gustar pero el mundo cambió bastante. Hay nuevas tecnologías como Javascript sobre node.js (y sus versiones multihilos) y Go por citar un par. Además Django se volvió un framework muy grande que quizás sea un overkill para muchos proyectos.
Pero tampoco es lo más importante, creo que la edad y la experiencia me hace ser mucho más escéptico de los lenguajes metodologías toolkits y frameworks que «solucionan todos los problemas». Fui testigo de los problemas de cada silver bullet y hype de los últimos años. Luego están los problemas derivados de usar herramientas cada vez más complejas, llegamos a tal punto de complejidad e interdependencia de los diferentes frameworks y toolkits que hacer una actualización de versión de algunos de ellos ya es considerado un gran peligro, por lo que tienen que desarrollarse herramientas para congelar proyectos (por ejemplo los dockers).
Cuando comencé a programar Menéame (ya se cumplirán 10 años) dominaba y estaba actualizado en C, C++, Perl y PHP. A Python lo usé académicamente (hay muchas librerías matemáticas y de grafos) pero no lo controlaba. C y C++ estaban descartados para desarrollo web, Perl también porque ya estaba decayendo mucho y en aquellos años ya se había comenzado a discutir el cambio radical al Perl 6 (un lenguaje diferente y sin comunidad ni herramientas maduras). Comencé a programar en Python, pero no había frameworks, había que hacer casi todo, me pasaba más tiempo leyendo que escribiendo. Creo que a las pocas horas lo dejé, no acabaría nunca y sólo había pensado dedicarle dos semanas (que es lo que me tomó publicar la primera versión) y empecé con PHP (aunque luego hice cosas más complejas en Python para web y me encantó).
Como lenguaje PHP es muy malo, tiene montón de inconsistencias y era bastante peor hace diez años que ahora (el soporte de clases era más que rudimentario y lento -no había ni constructores-, no había funciones lambda, anónimas ni clausuras, todavía pasa objetos por referencias pero arrays por copia, etc.), ahora hay muy buenos frameworks (en aquellos años sólo había Smarty), el sistema de caché por defecto (OPCache) es excelente y hay herramientas para verificación y desarrollo de test de unidades. Ha cambiado mucho, pero sigue con sus problemas de que no ha tenido un diseño elegante y coherente desde el principio. No sigo, aquí tenéis un artículo de todos los problemas de PHP como lenguaje.
Lo anterior significó que en ese momento tuvimos que implementar desde cero módulos que hoy los incluye cualquier framework básico: autentificación de usuarios, capa de acceso a la base de datos de bajo nivel, una abstracción mínima de active record (es el patrón que se usaba), sistemas de plantillas eficientes edición de tablas de la base de datos, url router, etc. Pero no ha sido tan malo, de hecho fue una experiencia muy enriquecedora, me forzó a aprender cada una de esas técnicas y al final tiene una gran ventaja: no hay casi dependencias con módulos externos (sólo el mysqli, memcache y GD del propio PHP). Dado que siempre me limité a los «estándares» del lenguaje y que refactorizo continuamente para solucionar mis propias (e inmensas) deudas tecnológicas no tuve problemas en hacer funcionar el código en las últimas versiones disponibles de PHP (hoy la 5.5.9 de la Ubuntu 14.04 LTS).
Es decir, reconozco todas las carencias de PHP y las mías propias, pero no ha sido una mala experiencia. En lo que toca al lenguaje no me limitó nada a la hora de solucionar ningún problema (aunque en la parte de scripts del backend enseguida empecé a usar Perl y desde hace varios años exclusivamente Python).
¿Es válido sacar conclusiones de mi experiencia y aplicarlas a la mayoría de proyectos de desarrollo? Por supuesto que no.
¿Recomendaría PHP? Lo dudo, pero con las herramientas que hay hoy y la evolución de PHP (además de su excelente documentación) es una apuesta segura. Ningún proyecto va a fracasar por culpa de PHP, y hay muchos programadores disponibles.
¿Qué elegiría como cuestión personal? Todavía no, ya lo diré al final 😉 pero como norma general diría que un lenguaje y las tecnologías asociadas deben cumplir las siguientes características básicas:
- Gustos e intereses personales o del grupo: Es lo más importante, si personalmente te apetece hacerlo en un lenguaje en particular y tienes el tiempo para dominarlo, adelante. Si tu grupo de desarrollo tiene mucha experiencia en uno y no tienen motivaciones importantes para cambiar, que sigan con el mismo.
- Libres: A estas alturas no puedo comprender que un particular o empresa desarrolle sobre herramientas tan básicas como el lenguaje en uno que no sea libre. No tiene sentido, he visto como todas han terminado pagando el error.
- Disponibilidad de frameworks o toolkits: Ambos son ya herramientas básicas que permiten desarrollar tanto para web como para backend de aplicaciones móviles. Con la madurez y variedad que hay es impensable comenzar desde cero como hice yo. Eso sí, buscaría lo más sencillo y ligero que se adecue al proyecto.
- Con comunidad: Así estarás seguro que las herramientas que uses evolucionarán, estarán disponibles y mantenidas muchos años y que encontrarás alguien que tuvo antes los mismos problemas y te ayudará con la solución.
- Lenguajes que ayuden sin burocracia exagerada: No hace falta que añada nada a lo que explica Rob Pike en el siguiente vídeo. Sólo recalcar que un lenguaje que tiene libros con 71 patrones diferentes que debes usar y que además cada conjunto de ellos tiene detractores y teólogos no es un lenguaje divertido. Si además es un lenguaje con el que no puedes desarrollar cómodamente desde cualquier editor de texto sino que requiere de un complejo IDE para hacerlo tampoco es un lenguaje que permita soluciones simples a problemas complejos y menos aún soluciones simples a problemas sencillos.
Me juego
- Python, Ruby, PHP (y sus respectivos frameworks) son apuestas seguras, maduras y divertidas.
- Java es lo mismo quitada la diversión y con demasiada burocracia, pero Scala y Clojure le agregan diversión y te quitan de encima tantos teólogos y promotores de ritos y patrones.
- Javascript (sobre node.js o sus versiones multi hilos) es una apuesta segura y prometedora.
- Go es muy prometedor, me encanta, la sencillez y potencia de un C del siglo XXI.
¿Qué elegiría hoy para un proyecto desde cero? Go. Aunque no sé qué framework usaría, hay mucho debate.
¿Qué piensas de Laravel? ¿Lo recomendarías? A mi me han convencido y estoy empezando un nuevo proyecto con Laravel…
@emoticonos
No lo conozco, pero tiene buena pinta. Si tiene comunidad por detrás y os gusta, adelante 😉
A mí me fascina Go (y creo que en cuanto a lenguajes o plataformas «molonas» es de lo mejor que ha aparecido últimamente) pero tengo mis dudas de que a día de hoy sea la solución más efectiva para hacer una web como Meneame.
Veo que el «estado del arte» en desarrollo web con Go está bastante crudo, bastante lejos de cosas como Django/Rails/Grails, etc. Así que aunque está claro que se podría programar un sitio como Meneame en Go parece una tarea formidable (al menos en comparación con lo que llevaría hacerlo con framework web más avanzado)
Mi duda aquí es si aparecerá un framework tipo Django/RoR para Go. Por un lado creo que el lenguaje no se presta demasiado a ello (en mi opinión, lo que hace a Python y Ruby más aptos para esto es la orientación a objetos y la metaprogramación) pero por otro lado a JavaScript le pasa lo mismo y esto no es obstáculo para que pasen cosas como Node.js si la gente pone suficiente empeño en ello.
En fin, que vienen tiempos interesantes 🙂
@juan lupión
Pero hay ya varios frameworks prometedores (por eso no les puse como «seguros»): Revel, Martini, Gorilla, Gin-Gonic…
El problema más importante es que tienen que resolver el tema de un único binario o la carga dinámica de módulos.
Hola Ricardo, ¿crees que un framework como Spring con herramientas como Spring Boot puede ser una buena solución si se quiere utilizar Java? ¿O no recomiendas Java en ningún caso? Me refiero más a la productividad y a la calidad del código, más que a la diversión, a la que veo que haces referencia varias veces. Gracias.
@xisco
Sí, claro que sirve. Y no digo que Java no sirva (obviamente es útil), sólo que ya está lleno de burocracia y sobrecarga. Tampoco hay que confundir «divertido» con «mala calidad», intenta corregir código en Java como hago un centenar de veces cada año y te darás cuenta que la «calidad» es casi un mito 😉
Creo que no me he explicado bien. Me refería a que mi pregunta de si no recomendarías utilizar Java en un proyecto web iba más orientada a una valoración en términos de calidad de código. De todas maneras te he entendido. Gracias. ¿Crees que la mala calidad de la que hablas cuando corriges es inherente a esa burocracia del lenguaje o a los hábitos adquiridos en la programación procedural, y que la gente no consigue cambiar al programar con un lenguaje OO? Gracias.
Uno de los puntos interesantes de Go es que, aunque pudieras reescribir todo menéame como si de un Python+Django se tratara, donde se le sacaría más jugo sería en usar una arquitectura orientada a microservicios. Pero allí la cuestión no es en qué lenguajes si no también en como diseñar aplicaciones sin que el mantenimiento ni los costes de integración superen la flexibilidad de tener distintos módulos altamente independientes.
Ricardo, ¿has tenido ocasión de usar recientemente alguna aplicación desplegada con microservicios, ya sea via ReST o con un bróker de mensajería?
@Pau Rul·lan
No entiendo ¿qué beneficios nos daría lo de microservicios? Tenemos un único backend al que consultar, la base de datos, y desagregar esto en «micros» sería agregar nuevas capas que no beneficiaría nada todo lo contrario (y no se podría hacer esto https://gallir.wordpress.com/2011/02/02/optimizando-obsesivamente-las-consultas-al-mysql/ aprovechando la base de datos relacional) y agregraría todavía más latencias, carga de red (que es cuello de botella importante en la «nube») y consultas a la base de datos.
No digo que no sirva para cosas más grandes con servicios sin dependencia y backends independientes, ¿pero para Menéame? Tampoco es tan grande ni tan complejo. A ver si eres un buzzword-victim 😉
@gallir: no no, todo lo contrario de buzzword-victim: hace tiempo que estoy estudiando el tema de los microservicios y me está costando encontrar casos de uso en entornos cercanos o con los que haya trabajado. Por eso preguntaba si crees que te beneficiaría de algún modo una arquitectura de este tipo frente al clásico Django.
@Pau Ruŀlan
En un caso como Menéame sólo tendría sentido si la página se arma completamente en el cliente vía javascript con mucha consulta ajax. No es el caso, y aún así es para dudar, sobre todo lo de montar páginas que necesiten muchas consultas desde el cliente (no sólo latencias molestas, también un consumidor de ancho de banda y batería en móviles).
Me sorprende la mala fama que acarrea Perl. En mis aventuras con PHP, Javascript, Python o Ruby no he visto que sean mejores en ningún sentido. Scala si que es un lenguaje que parece más interesante.
(Me sorprende hasta cierto punto, creo que el marketing ha sido muy mejorable)
En cuanto a la calidad del código me parece que los lenguajes con cierta rigidez, Java o Pyhon por ejemplo, contribuyen a que el código parezca que este bien. Que este bien es otra cosa, creo que para eso hace falta buenos programadores, independientemente del lenguaje.
Pingback: Las cosas que no soporto que las diga un programador | Ricardo Galli, de software libre