domingo, 13 de enero de 2008

¿Dónde están los ingenieros de software del mañana?

En Slashdot publicaron una noticia sobre un artículo escrito por Robert B.K. Dewar y Edmond Schonberg, dos profesores de la Universidad de Nueva York: “Educación de Ciencias de la Computación: ¿Dónde están los ingenieros de software del mañana?“.

En ella, apuntan a Java como “dañino” en el aprendizaje de la programación, así como critican a las universidades por no enseñar lenguajes sólidos como C, C++, Lisp y Ada. En lo personal estoy totalmente de acuerdo con éste artículo. Si bien tengo que admitir que mis estudios formales (por formales quiero decir “en clase”) en programación, en su mayoría, arrastran los defectos que señala este artículo. Sin embargo, siendo conciente de ello, intento profundizar éstos temas fuera de clase, y compensar esas carencias por mi cuenta.

El artículo se hizo eco en varios sitios, y parece un verdadero referente del estado actual de la educación formal en Ciencias de la computación. Como estudiante, recomiendo a todos aquellos que estén estudiando programación (o similar) leerlo.

En su mayoría, éste post es una traducción libre resumida de dicho artículo, así como opiniones y reflexiones personales agregadas.

Según Dewar y Schoenberg, las tendencias más preocupantes que notan en los últimos años de educación, en resumen, son:
1 - Se están reduciendo los requerimientos de matemáticas en Ciencias de la Computación.
2 - El desarrollo de habilidades de programación en varios lenguajes está dando lugar a acercamientos tipo receta usando grandes bibliotecas y paquetes de prop´sito especial.
3 - El set de habilidades resultantes es insuficiente para la industria del software de hoy.

Creo que esto se coincide con otros posts en los que he hablado sobre “programadores express”. Hoy en día, para preparar a los “programadores” a salir al mercado laboral lo antes posible, se enseña lo básico para poder trabajar y listo. Éste artículo en general ataca a Java, ya que es el lenguaje usado en varias universidades para la introducción al curso, pero se aplicaría a cualquier lenguaje de alto nivel, sobre todo .NET.

En los comentarios de la noticia en Slashdot, un usuario comenta:
“desafortunadamente no llega lo suficientemente lejos al núcleo del problema, el cual es que las universidades de hoy están produciendo en masa lo que los empleadores quieren, en vez de los pensadores del mañana. Los empleadores no quieren más que zánganos reemplazables que vengan con una habilidad fácilmente definible la cual puedan reemplazar cuando aparezca una nueva palabra de moda. Esto NO ES a lo que las universidades deberían apuntar.”

Joel Spolsky (de joelonsoftware.com), aporta la idea de crear un bachillerato en artes para la programación, de ésta forma atraer estudiantes a Ciencias de la computación. Comenta cómo algunas universidades ya hacen algo similar, y plantea mientras tanto cuántos departamentos de ciencia han ganado una reputación gracias a lo que han escrito: X Window de MIT, Athena y la Lisp Machine, entre otros. “¿Dónde están esos hoy? ¿Qué nos han dado las universidades recientemente? ¿Cuál es el mejor colegio para un graduado de secundaria que ama programar pero no está emocionado con cálculo lambda?”

Respecto a Java, el artículo dice: “Debido a la popularidad en aplicaciones web y la facilidad con la que novatos pueden producir programas gráficos, Java se ha convertido en el lenguaje más usado en los cursos introductorios a la programación.”
Consideran esto “un intento desviado de hacer la programación más divertida, tal vez en reacción a la reducción de anotados a Ciencias de la computación desde la caída de las .com.”

Las observaciones fueron que “a los estudiantes les resultaba difícil escribir programas sin interfase gráfica, no sentían la relación entre el programa fuente lo que el hardware haría, y (más dañino) no entendían las semánticas de punteros en absoluto, lo que hace muy desafiante el uso de C en programación de sistemas”.

Proponen éste principio: “La irresistible belleza de programar consiste en la reducción de procesos complejos formales a un pequeño set de operaciones primitivas. Java, en vez de exponer ésta belleza, anima a los programadores a enfocar la solución de problemas como un plomero en una ferretería: buscar en una multitud de cajones (paquetes) encontraremos algún dispositivo (clase) que hace más o menos lo que queremos. Cómo lo hace no es interesante! El resultado es un estudiante que sabe cómo armar un programa simple, pero no sabe cómo programar.”

Continúan su artículo con “Un verdadero programador puede escribir cualquier lenguaje“, en mi opinión, una verdad absoluta de la programación. “Por ejemplo, un verdadero programador debería poder programar herencia y envío dinámico en C, esconder información en Lisp, bibliotecas de manipulación de árboles en Ada, y recolector de basura en cualquier cosa menos Java.” Continuan con:

Porqué C Importa
“C es el lenguaje de bajo nivel que todos deben conocer”. En muchos lugares he leído “el lenguaje fundamental”, y otras frases aludiendo a C. “Puede ser visto como un lenguaje assembly portable, y como tal, expone la máquina subyacente forzando al estudiante a entender claramente la relación entre el software y el hardware. El análisis de performance es más directo, porque el costo de cada declaración está claro. Finalmente, compiladores (GCC por ejemplo) facilitan examinar el código assembly generado, lo cual es una excelente herramienta para entender el lenguaje y arquitectura de máquina.

Porqué C++ importa
C++ trae a C los conceptos fundamentales de la ingeniería del software moderno: encapsulación con clases y namespaces, esconder información a través de operaciones y datos protegidos y privados, programar por extensión a través de métodos virtuales y clases derivadas, etc. C++ también impulsa la administración de almacenamiento lo más lejos posible sin recolección de basura completo, con constructores y destructores.

Porqué Lisp Importa
Todo programador debe estar cómodo con programación funcional y con la importante noción de transparencia referencial. Un beneficio adicional es que el programa está escrito lo que suma a sintaxis abstracta, a saber la interpretación interna que usan la mayoría de los compiladores entre parsing y generación de código. Finalmente, Lisp es manejable a una definición propia muy compacta. Ver es intérprete de Lisp completo escrito en Lisp es una revelación intelectual que todo científico de la computación debería experimentar.

Porqué Java importa
A pesar de los comentarios negativos sobre Java, creen que tiene un rol importante en la instrucción de Ciencias de la Computación. Mencionan dos aspectos del lenguaje que deben ser parte del set de habilidades del programador:
1 - Entender programación concurrente (para la cual los threads o hilos proveen un modelo básico a bajo nivel).
2 - Reflection, a saber el entendimiento de que un programa puede ser instrumentado para examinar su propio estado y para determinar su propio comportamiento en un ambiente que cambia dinámicamente.

También describen que Ada es un lenguaje importante por otras tantas características, aunque ésto puede ser tomado con pinzas, viniendo del presidente y vicepresidente de AdaCore…

Para resumir, admiten que el lenguaje de programación no lo es todo. Concluyen algo como “un buen currículum incluirá una variedad de lenguajes, entendimiento de procesos de programación, en vez de un resumen de lenguajes populares percibidos”. Se sienten un poco consternados por la popularidad de lenguajes de scripting en cursos introductorios (Javascript, PHP, Atlas) quienes cargan con los defectos que le señalan a Java: “su ausencia de tipado fuerte lleva a un estilo de programación por prueba-y-error y les impide a los estudiantes adquirir la disciplina de separar el diseño de las interfaces de la especificación”.

Finalizan con que enseñar los lenguajes correctos no es suficiente. Los estudiantes deben ser expuestos a las herramientas para construír programas confiables a gran escala. Como científico de computación, deberías tener algún conocimiento de cómo se alcanza el alto nivel de confiabilidad. “Nuestros estudiantes deben estar listos para este nuevo mundo”.

Hay que entender entonces, que el lenguaje de programación con el que se empieza, si bien probablemente influya el resto de la carrera, no debe ser lo más importante. Más que un lenguaje, hay que aprender a programar. El problema radica también en enseñar UNICAMENTE un lenguaje, que de todas formas, depende del estudiante. Si uno se queda solo con lo que aprende en clase… Si aparte de tener cursos/profesores malos, uno no intenta ir más allá de lo que le están inculcando, no va a haber mucho lugar para evolucionar como programador.

Vía : picandocodigo.net

1 comentario:

Enrique dijo...

Todo es relativo, depende del punto de vista que lo veas, el tema de C++ es altamente necesario en otros entornos donde tienen que hacer aplicaciones de sistema o tambien llamadas software base en cambio un lenguaje como C# o Java son utiles en entornos de produccion de aplicacion de negocios donde no puedes "invertir" tiempo en inventar la rueda
Saludos

Visitame http://blog.tecnocrata.com

Articulos Relacionados: