jueves, 10 de diciembre de 2009

Frameworks web y lenguajes

Hace poco en la lista de correos de Ruby Argentina, alguien dijo una frase que me quedó picando en la mente: "Usar rails es la peor forma de aprender ruby :)".
Para quien no los conoce, Ruby es un lenguaje de programación muy interesante, y Ruby on Rails (o directamente Rails) es un framework para hacer aplicaciones web con Ruby (fué el que disparó a la fama al lenguaje).
(mas info sobre ruby aquí, y sobre Rails aquí)

No voy a debatir sobre las opiniones que salieron en la lista, y no voy a detenerme en qué habrá querido expresar la persona que lo dijo. Solo voy a comentar las cosas que a mí me hizo pensar.
Voy a generalizar un poco más, y "meter en la bolsa" a Django, un framework para aplicaciones web con Python bastante similar a Rails (info de Django aquí).

Me detengo solo en esos dos porque son los que usé para desarrollos reales, a los demás los conozco de vista/probar solamente.

La fiebre de la web (casi como la del oro)

La web es un terreno del desarrollo de software que está avanzando a velocidad imparable, no hace falta ser muy observador para darse cuenta (Google Docs, cloud computing, y muchas otras palabras de moda). Y por ello puede resultar tentador para alguien que nunca desarrolló web, pasarse a ese nuevo mundo de moda y con futuro.
Pero cuando la gente se pasa a una nueva tecnología esperando obtener beneficios de ella, y no solo por "amor al arte", generalmente espera resultados rápidos. Pocos estarían dispuestos a esperar un año hasta tener conocimientos como para poder hacer su primer sitio web.

Ahí es donde estos frameworks se ponen tentadores: una de las principales ventajas que ofrecen es el desarrollo rápido de aplicaciones. Rails tiene su famoso video de "un blog en 15 minutos", por ejemplo.
Y es verdad, comparados con otras tecnologías agilizan enormemente el desarrollo web. Traen resueltas un montón de problemáticas comunes. La aplicación de administración de Django es un ejemplo excelente: toda la administración del sitio ya resuelta "de fábrica" (autenticación, usuarios, permisos, ABMs de entidades, etc.).

Los caminos se separan

En este punto es donde nos encontramos con dos situaciones muy diferentes:

1) El desarrollador desktop de Python/Ruby, que aprovechando su conocimiento del lenguaje elije un framework web del mismo.

2) El desarrollador de otros lenguajes, que atraído por las ventajas de alguno de estos frameworks decide comenzar a desarrollar con él, lo que le implicará aprender también el nuevo lenguaje.

No hace falta decir que el camino para el desarrollador de la situación 1) es bastante simple. Además tengamos en cuenta que estos frameworks suelen seguir muy al pie de la letra la filosofía del lenguaje, por lo que se sentirá "como en casa".

Lo que preocupa es el camino del segundo desarrollador.
¿Por qué?

Aprendiendo a correr sin saber caminar

En primer lugar, estos frameworks asumen que uno posee conocimientos del lenguaje. Un tutorial de Django no va a explicar el manejo de listas de Python, por ejemplo.
Entonces va a ser una situación bastante normal la de encontrarse con partes de los tutoriales que no se lleguen a comprender del todo, porque al ver el código no "salta a la vista" tan fácil lo que está haciendo.
Y para empeorar la situación, muchas veces esto va a llevar a escribir código "porque estaba así en el tutorial", pero sin tener la menor idea de lo que hace. No es necesario mencionar los problemas de mantenimiento que una aplicación así puede tener...
Esa razón sola debería bastar para tener que aprender primero el lenguaje.

Y aunque logre entender dicho código, seguramente no va a conocer muchísimas cosas más que podría aprovechar del lenguaje para el desarrollo de su aplicación. Sus herramientas se van a limitar a lo que se muestra normalmente con el framework, probablemente desconociendo muchas otras facilidades que el lenguaje le brinda.
(mi post anterior habla sobre algo relacionado)

Como antes recordamos, estos frameworks también suelen seguir muy bien la filosofía de sus lenguajes respectivos. Por ende, alguien que no conoce esa filosofía tendrá un trabajo extra para "acomodarse" a la nueva manera de hacer las cosas.

Además, los frameworks toman muchas decisiones de diseño, y adoptan convenciones (muy fuertes sobre todo en Rails), que son buenas para el framework pero no necesariamente son buenas para otros entornos. El problema es que el programador que aprende el lenguaje desde dichas convenciones, seguramente asumirá que no existen otras maneras de hacer las cosas, o que si existen no son las correctas.
Este "vicio" no va a tener consecuencias directas en su etapa de desarrollador sobre ese framework, pero sí las va a tener cuando intente probar otros frameworks del mismo lenguaje, ya que no necesariamente el que aprendió es el mejor framework para todos los casos.

Conclusión

Por estas razones es que opino que antes de aprender uno de estos frameworks, es muy, muy saludable dedicar un tiempo a aprender el lenguaje a secas, sin web, como vino al mundo :D

De hecho, pude comprobarlo en mi experiencia personal:
- Intenté aprender Ruby on Rails directamente, sin conocer Ruby. Pude, pero seguramente no llegué a ver todo lo que es Ruby y a comprenderlo bien. Y me solía pasar de tener la sensación de que no sabía cómo funcionaban las cosas.
- Con Python me tomé el tiempo para aprender bien el lenguaje, y recién después comencé con Django. El pasaje fue natural, y me siento con mucho más control de lo que hago. Siento que lo entiendo y que puedo "sacarle bien el jugo".

¿Que opinan?

4 comentarios:

  1. hola...me gustaria saber tu opinion sobre django y rails, mas que a nivel del lenguaje (python vs ruby) sobre los frameworks en si...en mi caso fue muy diferente, sabia python y al entrarle a django en realidad no captaba bien lo que hacia, ademas sentia que escribia mucho y necesitaba memorizar muchas cosas, comenze con rails y me parecio todo mas sencillo y mas directo y poco a poco fui aprendiendo ruby (estudiando ruby y rails casi simultaneamente) si bien prefiero python para programar me quedo con rails para la web, quisiera saber tu opinion ya que son pocos los que han probado ambos frameworks de lleno y no se limitan a dar una opinion a primera vista...

    ResponderEliminar
  2. Hacer una comparación entre Django y Rails es algo que depende bastante de la opinión, así que aclaro que lo siguiente puede no ser verdad para todas las personas:

    Las ventajas que yo encontré en Django sobre Rails son:

    - Modelos definidos como clases en un solo lugar, con todas las declaraciones de los campos juntas y no repartidas en infinidad de migrations, como lo hace Rails.
    A quien le gustan las migrations podrá mencionar la ventaja de llevar el historial de los cambios sobre los modelos, y poder sincronizar la base de datos a cualquier momento de ese historial. Bueno, eso mismo es lo que hace cualquier sistema de versionado de código (svn, git, hg), ya que los modelos son en definitiva código, incluyendo poder sincronizar la base de datos con syncdb, volviéndola a su estado anterior. Así que no veo necesidad de que el framework haga versionado de ese código, cuando ya tengo algo que lo hace.

    - Aplicación de administración: Es simplemente mágica. Permite hacer altas, bajas y modificaciones sobre los modelos, búsquedas, ordenamiento, y todo lo que se necesite. Y es completamente dinámica, no como los scaffolds de Rails. En Rails, si al generar un scaffold nos olvidamos de un campo, tenemos que empezar a tocar todo a mano para agregarlo (incluyendo crear una migration). En Django, basta con agregarle una propiedad a la clase modelo, la aplicación de admin es completamente dinámica, en ejecución explora los modelos y determina qué campos poseen y como mostrarlos.

    - Flexibilidad: uno de los objetivos que Django se propone es el de no "interponerse en el camino del desarrollador". Propone hacer las cosas como el framework las pensó, pero también permite elegir otras formas de hacerlo sin tener que "romper" nada. Es muy sencillo utilizar otro sistema de templates, otro ORM, definir otras estructuras de archivos para la aplicación, etc.
    A diferencia de Rails, no obliga a seguir las convenciones que propone.

    - Simplicidad de estructura de una aplicación: algo que me ponía incómodo en Rails era la interminable cantidad de archivos que poseía una aplicación web. En Django es completamente lo contrario. No es lo correcto, pero hasta se podría tener una aplicación con solo 3 archivos, de los cuales 1 viene hecho y no sería necesario modificarse.
    En mi caso esta simplicidad me facilita el desarrollo, ya que no tengo que estar pasando entre tantos archivos para completar una tarea simple.

    - El lenguaje: a pesar de lo subjetivo que es, como estoy mencionando las cosas que a mí me gustaron, lo tengo que incluir. Python me gusta más que Ruby, y por eso también me agrada más trabajar con Django que con Rails. Ojo, Ruby no me parece un mal lenguaje, todo lo contrario, si no existiese Python Ruby sería mi preferido.

    ResponderEliminar
  3. Estoy de acuerdo en que primero debo conocer el lenguaje.
    Soy novato en este tema y quisiera que me ayudaras recomendandome un lenguaje para desarrollo web, especificando un poco las razones.

    gracias...

    ResponderEliminar
  4. Te recomendaría usar Python, con el framework web Django. Las razones están un poco en el comentario anterior, y en este post: http://fisadev.blogspot.com/2010/01/rails-django-web2py.html

    ResponderEliminar