Grupo Linuxero del Bajío

Los Peligros de la Universidades Java-eras

Víctor Manuel Jáquez Leal

Lo admito, soy fan de los escritos de Joel Spoisky. Y dada la impresión que me causó su último artículo y las pocas cosas que hacer, me puse a traducirlo. Helo aquí, espero que lo disfruten.

Por Joel Spoisky Traducido por Víctor Manuel Jáquez Leal

Muchachos flojos.

¿Qué ha pasado con el trabajo duro?

Un signo inequívoco de mi descenso a la senilidad son las quejas ylamentos sobre los “chicos de estos días”, y de cómo no quieren o nopueden hacer ya cualquier cosa complicada.

Cuando yo era un muchacho, aprendí a programar en tarjetasperforadas. Si cometías algún error, no tenías ninguna modernidadcomo la tecla de retroceso para corregirlo. Tirabas la tarjeta ycomenzabas de nuevo.

Cuando comencé a entrevistar programadores en 1991, permitíageneralmente que usaran el lenguaje que eligieran pararesolver los problemas de programación que les daba. El 99% deltiempo escogían C.

Hoy en día, tienden a elegir Java.

Ahora, no me mal interpreten: no hay nada malo con Java como unlenguaje de implementación.

Esperen un minuto, quiero modificar el enunciado. No estoy afirmando,en este artículo en particular, que halla algo mal en Java como unlenguaje de implementación. Tiene muchas cosas malas el lenguaje, perotendrán que esperar otro artículo.

En lugar de esto, me gustaría afirmar que Java no es, generalmente, unlenguaje de programación los suficientemente difícil como para utilizarse para discriminar a los excelentes programadores de los mediocres. Puedeser un buen lenguaje para trabajar, pero no es el tema de hoy. Megustaría ir más lejos y decir que el hecho de que Java no es losuficientemente difícil, es una característica del lenguaje, no ungazapo (bug), pero tiene este problema.

Si puedo ser temerario, en mi humilde experiencia hay dos temastradicionalmente enseñados en las universidades que son parte de unaretícula de ciencias computacionales que mucha gente simplemente nuncallegan a comprender plenamente: punteros y recursividad.

Solían iniciar la universidad con un curso de estructuras de datos,de listas enlazadas y tablas de dispersión y bolsas, con unextenso uso de punteros. Esos cursos seguido eran usados comoguadaña: eran tan difíciles que cualquiera que no pudiera con el retode mental de un grado en CC se daría por vencido, lo que era bueno, porque si creías que los punteros eran complicados, esperahasta que trataras de probar cosas como la teoría del punto fijo.

Todos los chicos que se daban a notar en la preparatoria al escribirjuegos de ping-pong en BASIC con sus computadoras Apple II, deberánentrar a la universidad, tomar el curso de CompSci 101, un curso deestructuras de datos, y cuando lleguen a los punteros, sus cerebrosexplotarán totalmente, y lo siguiente que sepas de ellos, es que estáninscritos en Ciencias Políticas porque la escuela de leyes les parecióuna mejor idea. He visto todo tipo de cifras en las tasas dedeserción en CC y están normalmente entre el 40% y el 70%. Lasuniversidades tienden a ver esto como un desperdicio; yo creo que essólo la extracción necesaria de gente que no será feliz o exitosa ensus carreras como programadores.

El otro curso difícil para muchos jóvenes estudiantes de CC era elcurso donde aprendías programación funcional, incluyendo programaciónrecursiva. El MIT fijó la barra muy alta para estos cursos, creandoun cursoobligatorio (6.001) y un libro de texto (Structureand Interpretation of Computer Programs de Abelson & Sussman), elcual es usado por docenas o aún cientos de universidades con carrerasde CC de alto nivel como la introducción de facto a las cienciascomputacionales. (Puedes, y deberías, ver una versión vieja de lasexposiciones en línea).

La dificultad de estos cursos es sorprendente. En la primerexposición tienes que haber aprendido mucho de Scheme, y deberías yaestar metido en una función de punto fijo que tome otra función comoentrada. Cuando me esforzaba a lo largo de un curso semejante, CSE121en Penn, observaba como muchos, si no es que la mayoría, de losestudiantes simplemente no podían con ella. El material es muycomplicado. Escribí un largo y sollozante correo electrónico alprofesor diciéndole No Es Justo. Alguien en Penn debió escucharme (oa algún otro quejoso), porque ese curso ahora se enseña con Java.

Deseo que no me hubieran escuchado.

En esto descansa el debate. Años de gimoteos por parte de estudiantesde CC flojos como yo, combinado con quejas de la industria sobre lospocos graduados en programas de CC de las universidadesnorteamericanas, han cobrado su derecho, y en la última década un largonúmero de otroras excelentes escuelas se ha convertido en 100% Java.Es una celada, los reclutadores que usan “grep” para evaluarcurrículos parece gustarles, y, lo mejor de todo, es que como no haynada los suficiente duro en Java para realmente podar a losprogramadores sin la parte del cerebro que entiende a los punteros ola recursividad, entonces las tazas de deserción son menores, y losdepartamentos de ciencias computacionales tienen más estudiantes, ymayores presupuestos, y todo está perfecto.

Los chicos afortunados de las escuelas Java-eras nunca van a tenerextraños fallos de segmento (segfaults) tratando de implementar tablasde dispersión basadas en punteros. Ellos nunca tendrán que delirarseveramente tratando de empaquetar cosas en bits. Nunca tendrán quemeter su cabeza en cómo, con programación puramente funcional, elvalor de una variable nunca cambia, y sin embargo, ésta cambia todo eltiempo. ¡Una paradoja!

Ellos no necesitan es parte del cerebro para obtener un 4.0 en elgrado académico.

¿Acaso solamente soy uno de esos cicateros fuera de moda, como loscuatro hombres Yorkshire, jactándome acerca de lo duro que fui parasobrevivir a toda esas dificultades?

Demonios, en 1900, el Latín y el Griego eran materias obligatorias enla universidad, no porque ellas sirvieran a algún propósito, sinoporque eran consideradas requisitos obvios para una persona educada.En un sentido mi argumento no es diferente al argumento hecho por lagente que aboga por el Latín (los cuatro). “[El Latín] entrena tumente. Entrena tu memoria. Hilvanar una oración en Latín es unexcelente ejercicio para el pensamiento, un verdadero rompecabezasintelectual, y una buena introducción al pensamiento lógico,” escribe ScottBarker. Pero no puedo hallar una sola universidad que obligue elLatín actualmente. ¿Serán los punteros y la recursividad el Latín y elGriego de las Ciencias Computacionales?

Ahora, libremente admito que programar con punteros no es necesarioen un 90% del código escrito hoy en día, y de hecho, escategóricamente peligroso en código de producción. Va. Está bien.Y la programación funcional no es muy usada en la práctica. Deacuerdo.

Pero sigue siendo importante para algunos de los trabajos deprogramación más excitantes. Sin los punteros, por ejemplo, nuncaserían capaces de trabajar en el kernel de Linux. No podrían entenderuna linea de código en Linux, o, de hecho, cualquier sistemaoperativo, sin una verdadera comprensión de los punteros.

Sin entender la programación funcional, no podrían inventar elMapReduce,el algoritmo que hizo a Google masivamente escalable. El término Mapy Reduce vienen de Lisp y la programación funcional. MapReduce es, enretrospectiva, obvio para cualquiera que recuerde de su clase deprogramación equivalente al 6.0001 que los programas puramentefuncionales no tienen efectos secundarios y son paralelizables demanera trivial. El simple hecho de que Google halla inventado elMapReduce y Microsoft no, nos dice algo acerca del por qué Microsoftsigue jugando a tratar de entender cómo conseguir que sus búsquedasfuncionen, mientras Google se ha movido al siguiente problema:construir Skynet^H^H^H^H^H^H lasupercomputadoramás masivamente paralelizada del mundo. Yo no creo que Microsoftentienda completamente qué tan lejos se encuentran detrás de estaola.

Pero más allá de la importancia Prima Facie de los punteros y larecursividad, su valor real está en que construir grandes sistemasrequiere un tipo de flexibilidad mental que obtienes aprendiendoacerca de ellos, y la aptitud mental necesaria para evitar serexpulsado de los cursos donde éstas cosas son enseñadas. Los punterosy la recursividad requirieren cierta habilidad de razonamiento, de pensarcon abstracciones, y más importante, ver un problema a diferentesniveles de abstracción simultáneamente. Y luego, la habilidad paraentender punteros y recursividad está directamente correlacionada con lahabilidad de ser un gran programador.

Nada sobre un grado académico en CC totalmente Java-ero realmente podaa los estudiantes que carecen de la agilidad mental para lidiar conestos conceptos. Como un empleador, he visto que las escuelas 100%Java han comenzado a batir a varios graduados en CC que simplemente noson lo suficientemente inteligentes para trabajar como programadores ennada más sofisticado que en Otra Aplicación Contable En Java, aunquehallan podido escapar a la nueva-estúpida-inferior retícula. Estosestudiantes jamás sobrevivirían al curso 6.001 del MIT, o el CS 323 deYale, y francamente, esta es una razón por la cual, como empleador, ungrado en CC del MIT o de Yale lleva más peso que un grado de CC enDuke, quienes recientemente fueron por el carro completo en Java, o laUniversidad de Penn, que reemplazó Scheme y ML con Java en un intentode enseñar la clase que casi mata a mis amigos y a mi, CSE121. No esque ya no quiera contratar chicos inteligentes de Duke o Penn -lohago- es sólo que me es más difícil deducir quién lo es. Solía sercapaz de descubrir a los chicos inteligentes porque ellos podíancomprender un algoritmo recursivo en segundos, o implementar funcionespara la manipulación de una lista enlazada con punteros tan rápidocomo si lo escribieran en un pizarrón. Pero los graduados de unaescuela Java-era, no puedo saber si ellos se enredan con estosproblemas porque están insuficientemente instruidos, o si se enredancon los problemas porque no tiene actualmente esa parte especial delcerebro que van a necesitar para hacer grandes trabajos deprogramación. Paul Graham los llama ProgramadoresLlorones.

Está mal ya de por sí que las escuelas Java-eras fallen al podar a loschicos que nunca van a ser grandes programadores, a lo que lasuniversidades dirán, con justificación, que no es su problema. Laindustria, o al menos, los reclutadores-que-sólo-usan-grep, son losseguros demandantes de que Java debe ser enseñado.

Pero las escuelas Java-eras también fallan al entrenar los cerebros delos chicos a ser expertos, ágiles, y los suficientemente flexiblespara hacer buenos diseños de software (y no quiero decir con estosdiseño Orientado a Objetos, donde pasas innumerables horasreescribiendo tu código para zangolotear tu jerarquía de objetos, oirritarse sobre problemas como contiene vs es-un). Necesitasentrenar tu pensamiento en cosas con múltiples niveles de abstracciónsimultáneamente, y este tipo de pensamiento es exactamente lo quenecesitas para diseñar grandes arquitecturas de software.

Probablemente estés preguntándote si la enseñanza de la programaciónorientada a objetos (OOP) es un buen sustituto a a la guadaña de losobjetos y la recursividad. La respuesta rápida es: no. Sin debatir losméritos de la OOP, no es lo suficientemente duro para podar a losprogramadores mediocres. La OOP en la escuela consiste, la mayor delas veces, en memorizar un montón de términos de vocabulario como“encapsulación“ y “herencia”, y tomando exámenes de opción múltiplecon la diferencia entre polimorfismo y sobrecarga. No más difícilque memorizar fechas y nombres famosos en una clase de historia, LaOOP tiene retos mentales inadecuados para espantar a los estudiantesde primer año. Cuando te lías con un problema de OOP, tu programa aúnfunciona, es tan sólo más difícil de mantener. Supuestamente. Perocuando te lías con punteros, tus programas producen la líneaSegmentation Fault y no tienes ni idea de qué sucede, hasta quete detienes y tomas un respiro profundo y tratas realmente de forzartu mente a trabajar a diferentes niveles de abstracción de manerasimultánea.

Los reclutadores-que-sólo-usan-grep, aprovechando, son ridiculizadosaquí, y por una buena razón. Jamás he conocido a nadie que trabajecon Scheme, Hasker o punteros en C y que no pueda trabajar con Java endos días, y crear mejor código en Java que las personas con cinco añosde experiencia en Java, pero traten de explicar eso al idiota promediode recursos humanos.

Pero ¿qué hay acerca la misión de CC en los departamentos de CC?¡Estos no son escuelas vocacionales! No debería ser su trabajoentrenar gente para trabajar en la industria. Eso déjenlo a loscolegios comunitarios y a los programas de entrenamientogubernamentales para trabajadores desplazados, ellos te lo dirán.Ellos están supuestamente para dar a los estudiantes las herramientasfundamentales para vivir sus vidas, no para prepararlos para sus primeras semanas de trabajo. ¿Correcto?

Aún así. CC es computabildad (recursividad), algoritmos (recursividad),lenguajes (cálculo lambda), sistemas operativos (punteros),compiladores (cálculo lambda) - y por tanto la última línea es que lasescuelas Java-eras que no quieran enseñar C y no quieran enseñarScheme no están enseñando realmente ciencias computacionales,tampoco. Tan inútil como el concepto de función curryficada puede ser parael mundo real, es obviamente un prerequisito para una escuela degraduados en CC. No puedo entender por qué el profesorado en loscomités de retículas en las escuelas de CC han permitido que suprogramas sean idiotizados al punto de que no solamente puedanproducir programadores de trabajo, ellos no pueden siquiera producirestudiantes graduados de CC que puedan conseguir un PhD y competir porsus puestos académicos. Ah, esperen. Olvídenlo. Tal vez ya entendí.

Actualmente si regresan y buscan la discusión que tuvo lugar en laacademia durante El Gran Cambio A Java, notarán la gran preocupaciónera si Java es lo suficientemente simple para usarse comolenguaje para enseñar.

¡Dios mio, pensé, están tratando de idiotizar aún más laretícula! ¿Por qué no les dan todo peladito y en la boca a losestudiantes? Dejemos que los tutores hagan sus exámenes por ellostambién, entonces nadie querrá cambiar de carrera. ¿Cómo es quealguien que va a poder aprender cualquier cosa, si la retícula ha sidocuidadosamente diseñada para hacer todo más fácil de lo que realmentees? Parece ser que hay una fuerza de tarea en camino (PDF)para buscar un subconjunto de Java más simple que pueda ser enseñado alos estudiantes, produciendo documentación simplificada quecuidadosamente esconde toda la basura de EJB/J2EE de sus tiernasmentes, y así no tengan que preocupar su cabecitas con clases que nonecesites hacer en tu conjunto de fáciles problemas de CC.

La interpretación más empática de por qué los departamentos de CC sontan entusiastas con su idiotización de sus cursos es que dejan así mástiempo para enseñar conceptos de CC actuales, si no tiene que gastardos exposiciones completas para explicar a los estudiantes lasdiferencias entre, digamos, un int en Java y unInteger. Bueno, este es el caso, 6.001 era la respuestaperfecta para ti: Scheme, un lenguaje de enseñanza tan simple que ellenguaje entero puede ser enseñado a los estudiantes brillantes encerca de 10 minutos; luego puedes gastar el resto del semestre enpuntos fijos.

Eh.

Regreso a mis unos y ceros.

(¿Tienes algunos? ¡Maldito bastardo! Todo lo que tenemos sonceros.)