Introducción
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 considerados lenguajes 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 algunos scripts, 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.

Al final, todo es cuestión de tiempo y dinero. He visto ya algún que otro proyecto que empieza con un planteamiento correcto o casi correcto de Javascript y luego a medida que avanza, se piden tal cantidad de cambios y en ocasiones en tampoco tiempo que es cuando se empiezan a hacer modificaciones independientemente si sea la más adecuada o no… ya que la cuestión es que acabe funcionando.
un saludo
Cuanta razón, pero creo que es algo que pasa mucho en este mundo, no sólo a nivel web si no en cualquier lenguaje o tecnologÃa.
Yo por mi parte considero que tengo una nociones intermedias del lenguaje, y la verdad es que leyendo la clasificación que comentas, se confirma, pero he visto mucho casos de desarrolladores “front” que están sólo saben copypastear y que al mÃnimo problema se vienen abajo y empiezan a quejarse de JavaScript como si fuera lo peor del mundo, cuando la realidad es que no saben como usarlo (yo reconozco que me faltan muchos conocimientos, pero lo se e intento entender las cosas y mejorar en vez de quejarme) y como bien dices no sólo JavaScript, también HTML, CSS pueden ser malentendidos si no sabes como funciona, aunque sea muy pesado, hay que leer las especificaciones de los lenguajes para conocerlo realmente.
De todas formas bien es cierto que JavaScript es un lenguaje complejo y con muchas cosas mal implementadas, acabo de terminado de leerme JavaScript: The Good Parts y ahà se pueden leer muchÃsimas de las cosas que están mal o deficientemente implementadas (imagino que lo mismo pasa con muchos otros lenguajes). Lo bueno del libro es que te explica cuales son, como evitar lo problemas, y cómo usar la mejores “partes” del lenguaje.
Un saludo.
yo creo que es un problema de formacion, te imaginas que a un medico le dijesen: mañana operas a alguien de corazon, como no sabes, busca algo en internet y aprende sobre la marcha…
Pues a mi eso me pasa un dia si y otro tambien, cosas imposibles, en plazos ridiculos, solo porque el comercial de turno queria su comision del mes.
Es cierto que es muy facil no saber cual es tu nivel real con respecto a la media, pero…¿quien es la media? porque yo he trabajado para carnicerias con un monton de licenciados (en fisica, quimica, historia) y daba risa, tambien he trabajado en empresas que “solo” aceptaban informaticos con carrera (bueno sin contarme a mi que me quede en segundo
) y si, sabian mas de matematicas que yo, pero seamos serios, el nivel de programador que te dan 5 años de carrela lo cojes programando 8 horas al dia en 1 año
Jo que agusto me he quedao, bueno lo importante, si yo quisiese comprobar mi nivel ¿como lo hago? ¿me gasto 6.000€ en un papel que dice tienes un master?
porque la verdad soluciones pocas, leer libros llega un momento en el que no progresas mas, y en el trabajo tampoco es que puedas experimentar mucho rato, con los plazos que se manejan como para andar practicando ¿en casa? como que paso de sacrificar mi vida social
¿sugerencias?
Pues no queda otra que hacerlo por nuestra cuenta Guzmán; no se trata de sacrificar nuestra vida social sino de ser responsables para/con lo que hacemos. Siguiendo tu ejemplo, ¿te imaginas a un médico que no leyera los artÃculos más recientes de su disciplina? ¿o que desconociera cuáles son las nuevas técnicas para operar ese corazón con el menor riesgo para el paciente?
Creo que la clave es siempre la autoformación: leer libros, artÃculos y estar siempre al dÃa. Con lo aprendido una vez no vale. El trabajo no es un buen escenario para experimentar porque siempre sueles tener plazos y criterios de calidad que no podemos comprometer por querer aplicar el patrón de diseño más puntero. Las pruebas hay que hacerlas en casa, con calma…
Al menos yo es asà como lo hago: cada dÃa (o dos) reviso la actualidad mediante los canales de noticias y las páginas que las recogen; miro qué es interesante y qué no. Luego trato de aplicarlo o al menos retener la idea por si la puedo necesitar más adelante.
Con respecto a todo lo demás que has comentado, estoy plenamente de acuerdo.
Un saludo y gracias por tu interesante aportación!
muy buen articulo, yo antes toqueteaba con javascript y en si era un lenguaje que odiaba, me parecÃa que estaba mal diseñado (en realidad si tiene problemas de diseño) que era limitado y no servÃa para proyectos grandes, asi que cuando escuche de nodejs me parecÃo un poco ilogico que se usara javascript.
con el paso del tiempo he aprendido nodejs y he tenido que aprender javascript, la verdad es que es un lenguaje mañoso aunque con el tiempo se le agarran los trucos y es magnifico, si bien tiene algunos “errores” de diseño, es un lenguaje muy flexible, bastante expresivo y con mucho potencial, las cosas que odiaba antes de javascript ahora son casi las que mas me agradan y las que mas encuentro utiles.
El problema es que javascript es el lenguaje menos entendido del mundo, en realidad no es un lenguaje orientado a objetos aunque tiene objetos, no es un lenguaje funcional aunque tiene caracterÃsticas de este, a la final es una mezcla bastante rara de ideas diferentes, el problema viene cuando alguien con solo conocimientos de orientación a objetos intenta usarlo, entonces se da cuenta que no tiene orientación a objetos sino algo similar aunque a primera vista, menos poderoso y mal implementado, lo mismo pasa si vienes de un lenguaje funcional como lisp, donde encuentras cosas muy buenas de lenguajes funcionales pero le faltan otras cuantas, a la final para entender bien js necesitas conocer muchos paradigmas…
algo que es bueno destacar es que javascript es mas que un lenguaje para manipular el DOM, creo que una de las desventajas que ha tenido javascript es que se le relaciona solo con esto, además existen muchos libros de mala calidad donde ofrecen a enseñarte javascript, cuando en realidad solo te enseñan las cosas básicas y como manipular el DOM, para manipular el DOM, ahora que javascipt tambien esta del lado del servidor, donde toda la logica del sitio se tiene que escribir en puro js…es cuando la mayorÃa notará que sus conocimientos de js no eran tan solidos, además espero que aparezcan libros mas completos donde se adentren en la construccion del lenguaje….
¡Que titulo!, desde el principio sentà que el articulo era dirigido a personas como yo. Yo solÃa, y todavÃa lo hago (honestamente), el recurrir al “copy & paste” para completar proyectos, aunque actualmente ya he estado metiéndome a las entrañas de JavaScript; aprendiendo todo lo que debe ser aprendido sobre este útil lenguaje en la web. Ciertamente el recurrir a la pedaceria de código, se tiende a conseguir aplicaciones lentas, llenas de errores y aveces hasta de difÃcil mantenimiento.
Suscribo casi cada palabra de GUZMAN:
Solo quiero enfatizar que lo de ser autodidacta está muy bien cuando eres estudiante y gozas de más tiempo libre; pero cuando estás trabajando diez horas para una empresa ni se me pasa por la cabeza ponerme a aprender por mi cuenta, simplemente por satisfacción personal de generar buen código para que luego se aproveche la empresa de turno y esta ni siquiera te dé las gracias, porque no sabe distinguir un buen código de una mierda pinchada en un palo. Los que curramos seguro que tenemos el culo pelado de que nos digas “me da igual cómo lo hagas, solo quiero que funcione”.
Las empresas deberÃan considerar que realizar cursos de reciclaje y formación no solo ayudan al trabajador, sino a la empresa.
Mi opinión personal es que el trabajo y sus exigencias no son excusa para no continuar la formación. Yo lo veo como nuestra obligación profesional siempre que realmente te guste lo que haces.
Yo he trabajado a esos ritmos y con una carga de criticidad que podrÃamos considerar extrema. De hecho, si ojeas el artÃculo Programando para la Administración Pública, entenderás que no se trata de un relato ficticio.
No se me ocurre peor escenario que el dado en un Ministerio: tiempos de entrega absurdos con la peor calidad de código imaginable. Pero aún asÃ, sacaba tiempo para continuar investigando en los ratos libres.
Gracias a eso, hoy por hoy ya no trabajo ahÃ, sino donde yo he elegido hacerlo.
Creo que la recompensa compensa el esfuerzo, pero es solo mi opinión
La tuya me parece también correcta y en nada reprochable.
Saludos!!
Excelente artÃculo.
Es cierto que hoy en dia existe la sensación de dominio del lenguaje por muchas personas que a duras penas pueden entender el API de jQuery.
Siendo honestos, hay que reconocer que (por desgracia) el 90% del desarrollo web existente no requiere mucho más que eso.
Disiento en los requisitos que planteas para hablar de nivel avanzado, el cual en mi opinión requiere un mÃnimo conocimiento de la especificación, base fundamental para poder entender el detrás de escena de las interacciones que se dan en nuestro código.
En cuanto al nivel de analÃsis y coherencia del código a nivel proyecto, tengo que admitir, que en mi experiencia llegue a cumplir todos los requisitos que definÃs para un nivel avanzado sin llegar a determinar un modelo de sistema claro. Lo cual demostraba que lo que yo no sabÃa no era JavaScript, sino conceptos básicos (y no tan básicos) de programación y analÃsis.
Saludos.
Hola ValentÃn!
Haces una reflexión muy interesante que ciertamente habrÃa que destacar: en la programación avanzada, muchos de los requisitos exigibles a un desarrollador no son tanto conceptos del lenguaje en sÃ, como ideas generales de programación y análisis.
Es por esto que además lenguajes concretos, tenemos que estudiar y manejar conceptos como patrones de diseño, arquitectura de software y otras materias generales de programación que son siempre aplicables.
Saludos!
Excelente post, tenes mucha razón.
Ya te estoy siguiendo en mi reader!
Saludos,
Jonathan
Simplemente genial! Seguiré este blog.
Tienes razón en que el método copy-paste no es el mejor para comprender realmente un lenguaje. Hace que uno se meta en jardines complejos sin haber entendido realmente lo básico. En mi caso conozco partes de los 3 niveles que mencionas pero no domino ninguno de ellos al completo y eso me lleva a situaciones de confusión al programar o al analizar el código de otras personas.
¿Cuándo vas a escribir un libro sobre JS? PodrÃas estructurarlo en esos tres niveles y explicando los conceptos esenciales de cada uno… Asà no tendrÃa que ir saltando de un artÃculo a otro
Gracias y un saludo,
Diego.
Creo que tienes razón, solo basta utilizar algún motor de búsqueda, casi cualquier tema y verificar el código de alguno de los Sitios Web o incluso de aplicaciones Web y se encuentra errores de validación de HTML, XHTML, etc. O en las Hojas de Estilo en Cascada (CSS) en su mayorÃa la versión 2.1, en las cuales incluyen atributos que no son parte de esa versión o no son ni siquiera una recomendación del W3C. Y que solo se agrega por los efectos visuales, irrumpiendo las reglas de los Estancares Web: Lo cual causa la falta de Accesibilidad, Usabilidad, Internacionalización, Independencia de dispositivo, entre otras.
En lo que es JS, es raro que se utilice puro, casi siempre se usan las derivaciones como Jquery, prototype, mootools. Y creo que esta bien pero no excederse solo por crear efectos bonitos, si no para darle mejor Usabilidad a los Sitios y Aplicaciones Web.
En lo personal, no utilizo las cosas solo por ahorrar trabajo, prefiero analizar los códigos, para ver como se usa el lenguaje, leo las guÃas y las mejores practicas e investigo que ventajas y desventajas tiene el uso del cogido. Por ejemplo cuando uso Jquery, analizo la manera de agregar lo pero sin que comprometa las funciones del Sitio y/o Aplicación Web, es decir, si me deshabilitan JavaScript (JS) deberÃa de poder seguir usando las funciones.
De entrada, muchas felicidades Carlos BenÃtez por un estupedo blog, y por fin encuentro el gurú que he andado buscado, y no me decepcionas con el “utliza los framework q ya estan echos”, en cambio me invitas y me demuestra el poco conocimiento que tengo de JS, bueno en realidad no es poco, creo que le tiro a medio avanzado, trato de hacer experimentos en mis proyecto y de implementar lo que leo en cuanto lo descubro. Llegué a tu blog tratando de buscar como se llama JSLit y te encontré por tu artÃculo de JSHint, estuve vagando por tu blog y me pareció excelente y encotré una persona que merece mi respeto profesional como colega….
Ahora.. a tratar el tema, en lo personal trabajo en desarrollo web desde el 2005, lo estudio desde el 2002, en mi carerra técnica(conalep), SOLO me enseñaron C y un poco de C++, mi especialidad es en PHP, JS y Java, ¿quién me los enseñó? en definitiva no lo aprendà en una escuela lo aprendà de Internet, blog, libros, practicar, tomar esto como un hobbie mas, no como una tarea o un trabajo, hoy trabajo en mi hobbie, me da $$$ y eso está de lujo y económicamente no me puedo quejar… creo que el “no me lo enseñaron en la escuela no cabe”, nunca saldrás preparado para todo, “las novedades” no son tan nuevas, solo que los verdaderos desarrolladores llegaron a JavaScript, estas técnicas no soy de hoy ni de ayer, son de hace años pero apenas se están conociendo y aun hay muy pocos manejan JS de manera decente, la gran mayorÃa utilizan jQuery y de mas herramientas y ya se sienten gurus U.u.. que no está mal, pero creo que tampoco es el mejor camino, sobretodo cuando quieres llegar al nivel avanzado o experto, no ser un usuario de jQuery si no un partner alguien que aporta y propone, no solo el que consume.. últimamente me he divertido desmenuzando jQuery =D..(es algo interesante).
y por último creo que el decir, no tengo tiempo, ¿y mi vida social?, son sacrificios, y aun asà se puede combinar, yo me tomo una o dos horas de mi dÃa laboral (cuando hay tiempo) para leer las novedades o libros y busco la forma de implementarlo inmediatamente en el próximo proyecto o incluso en el que se está realizado, proyecto a proyecto he tenido mis prácticas y mi codificación ha evolucionado, hoy no tiene nada que ver el JS que hago con el que hacÃa en mi primer trabajo.. además que JS lo aprendà solito sin un profe, solo leyendo y practicando… creo que es el camino y el compromiso profesional que tenemos con nuestra carrera, un profesional no solo es pasar las materias en la universidad y salir a “trabajar” y ganar dinero.. es una carrera de todos los dÃas…. vamos es una Carrera… que termina cuando te retiras…
se java y se lo que es la orientación a objetos desde C++, y creo que JS es orientado a objeto, solo que bajo distinto paradigma (el prototipado), pero es clásico que el que viene de java y C diga que JS no es orientado por que lo quieren ver con el paradigma de OOP con Clases y no aquà se manejan Prototipos(es casi lo mismo, pero no es lo mismo).. algo que con la practicas y al entender que estas en JavaScript y no en otro lenguaje se llega a comprender y te das cuenta que puedes hacer casi todo lo que te propones en cuanto a OOP se refiere… si falta algunas cosillas pero… no por que Java carezca de Herencia múltiple ya no es un lenguaje Orientado a Objetos…
Maestro… sinceramente es todo tal cual comentas en el artÃculo, además tus conocimientos son realmente dignos de admiración.