2011/05/18

"Tú no sabes javascript"

He encontrado la transcripción de un artículo que mete el dedo en la llaga sobre la gente que hace con el javascript igual que con el "nivel alto de inglés" y que si fuera al extranjero se moriría de hambre :P

Lo mejor de todo son los enlaces a cada uno de los apartados apra ampliar información sobre el tema (y también algo de alivio porque la mayoría de los temas ya los he tratado yo en entradas anteriores jejeje)

Bueno, sin más dilación os dejo el artículo.

Tú no sabes Javascript
Con este llamativo título, Michael Woloszynowicz escribía recientemente una entrada en su blog a modo de llamada de atención para los desarrolladores Javascript.

Al estilo del artículo Los programadores que no programan, Michael denunciaba que muchos desarrolladores están engordando sus currículums afirmando ser expertos en lenguajes que realmente no conocen. Esta preocupante tendencia parece agudizarse cuando nos referimos a la familia de lenguajes web: HTML, CSS y, especialmente, Javascript.

La falsa sensación de dominio total
El motivo de todo esto es doble: por un lado, los lenguajes web están de moda y todo desarrollador debe ser capaz de programar sin dificultad en cualquiera de ellos; por otro, suelen ser consideradoslenguajes fáciles y muy asequibles: en realidad, tanto HTML como CSS podrían no considerarse estrictamente como lenguajes ya que apenas participan de una lógica computacional seria. Con tan solo un puñado de palabras reservadas y estructuras repetidas hasta la saciedad, es relativamente sencillo construir un sitio.

Pero nada más lejos de la realidad. Conocer el marcado HTML y la semántica que hay detrás no resulta tan trivial como le puede parecer a quien se acerca por primera vez: con solo ojear el código fuente de cualquier proyecto web, podremos  ver cómo las normas más básicas o recomendaciones del W3C son pasadas por alto. En cuanto a las CSS, el argumento es similar: aquellos que realmente las dominen sabrán la complejidad que algunos maquetados (desgraciadamente) encierran. En definitiva, es extremadamente raro encontrar a un desarrollador web que haya reparado en leerse las especificaciones de los lenguajes que utiliza a diario…

En el caso de Javascript, el error no puede ser mayor: la mayoría de los programadores necesitan recurrir a este lenguaje en uno u otro momento. Cuando apenas se conocen sus conceptos básicos, la tendencia más común es lanzarse a buscar ejemplos de códigos (snippets) que puedan ser implementados ràpidamente a través de un sencillo copy/paste. Dada la gran flexibilidad de algunosscripts, esta técnica suele funcionar, especialmente cuando se trata de plugins para bibliotecas tipo jQuery o Mootools. El principal problema de esta metodología de aprendizaje es que realmente no se llega a comprender el comportamiento que hay detrás de cada uno de esos bloques de código dando una falsa sensación sobre nuestro dominio del lenguaje.

Cuando llegan los encargos para construir aplicaciones complejas, los tutoriales en la web comienzan a mostrar conceptos exóticos como módulos, herencia prototípica, patrones de diseño, delegación, constructores o clausuras y con ellos, nuestra falsa idea inicial de dominio del lenguaje comienza a difuminarse.

Comienzan así las pruebas a ciegas donde echamos mano del patrón copy/paste; pero ahora las piezas no encajan: los errores se multiplican, nuestros conocimientos en otros lenguajes como por ejemplo Java o PHP no sirven pues la naturaleza de Javascript es diferente y la aplicación no funciona como se espera. Terminamos maldiciendo al lenguaje y comentándole al cliente que su proyecto no es consistente, que Javascript no ofrece la potencia, flexibilidad o seguridad necesaria para llevarlo a cabo y tratamos de sugerir alternativas en las que nos sintamos más cómodos… Y es que, por supuesto, es difícil terminar admitiendo que no conocemos el lenguaje: Javascript es un lenguaje web y, como tal, tiene que ser fácil y debemos dominarlo sólo por el hecho de haber implementado alguna vez un plugin jQuery con un bonito slideshow…

Niveles de conocimiento
Para poder crear un rasero con el que medir nuestro conocimiento real del lenguaje, podemos dividir sus conceptos en tres niveles diferentes: básico, intermedio y avanzado.

Cada una de estas categorías recogería las siguientes habilidades:
 
Un nivel básico de Javascript requiere:
  • Conocer la sintaxis básica de programación: bucles, condicionales, try/catch, etc…
  • Entender cómo se declaran las funciones (incluyendo las diferentes formas posibles para hacerlo así como las llamadas funciones anónimas).
  • Entender los principios básicos de los distintos ámbitos (scopes): ámbito global vs ámbito de objeto. Excluímos aquí las clausuras.
  • Entender el rol de los distintos contextos y el uso de la palabra reservada this en cada uno.
  • Entender las diferentes maneras de declarar o instanciar un objeto así como las formas de convertir las funciones en éstos.
  • Entender los operadores de comparación Javascript como ‘<’, ‘>’, ‘==’, ‘===’; valores falsy y cómo funciona la comparación entre objetos y cadenas así como el cambio de tipos (casting).
Un nivel intermedio debería requerir:
  • Entender los tiempos de ejecución, cómo funcionan, y cuándo/cómo pueden ser útiles. También incluimos los métodos de ejecución asíncronos.
  • Conocimiento profundo de los callbacks y de los métodos call y apply para controlar el contecto y los argumentos que se envían a las funciones.
  • Comprender en profundidad la notación JSON y el funcionamiento de eval.
  • Entender las clausuras, cómo afectan al rendimiento del código, y cómo pueden ser usadas para crear variables privadas mediante el patrón módulo.
  • AJAX y serialización de objetos.
Un nivel avanzado de conocimiento incluye:
  • Conocer el valor arguments y cómo puede ser utilizado para sobreescribir funciones: recursividad.
  • Clausuras avanzadas como los patrones memoization, curry y aplicaciones parciales.
  • Prototipos, cadena prototípica y cómo usar estos conceptos para minimizar el tamaño de nuestro código.
  • Tipos de objetos y el uso de instanceof y typeof.
  • Expresiones regulares.
  • Qué expresiones no deben utilizarse (bad patterns)
  • Y, finalmente, cómo combinar todo lo anterior para construir aplicaciones sólidas, limpias, rápidas, mantenibles y compatibles.
El punto final, es especialmente importante porque puede darse el caso de que conozcamos los anteriores en mayor o menor medida pero no la forma de integrarlos en un todo. Este aspecto es el que finalmente denominaríamos arquitectura Javascript y corresponde a los cimientos en los que tiene que asentarse todo proyecto serio. Es el camino opuesto a un código tipo spaghetti realizado sin ninguna planificación previa.

Conclusión
Como puede comprobarse a través de todos los aspectos mencionados anteriormente, Javascript es algo más que manejar eventos con nuestra biblioteca favorita o validar un formulario. Es cierto que podemos solventar muchos de estos puntos utilizando nuestro tradicional copy/paste; sin embargo, con esta técnica, podemos llegar muy fácilmente a un callejón sin salida donde continuar avanzando resulte simplemente imposible.

La mejor garantía para afrontar un proyecto de envergadura es, como con cualquier otro lenguaje, conocer el comportamiento de las herramientas que utilizamos lo mejor posible. De este modo, si no encontramos el snippet adecuado o tenemos que modificar el comportamiento de uno concreto, estaremos en disposición de hacerlo nosotros mismos sin mayores problemas.

No hay comentarios:

Publicar un comentario