Consejos para estudiantes de Ciencias de la Computación

From The Joel on Software Translation Project

Jump to: navigation, search

Por Joel Spolsky
Domingo 2 de Enero de 2005
Artículo original: Advice for Computer Science College Students
Traducido por: Matías Bellone
Traducción corregida y completada por: Mariano Ruggiero


A pesar de que hace a penas uno o dos años atrás estaba balbuceando sobre que los clientes ricos de Interfaz Gráfica de Usuario (GUI) de Windows eran el futuro, algunos estudiantes me envían e-mails de tanto en tanto pidiendo consejos para su carrera y, como es época de reclutamiento, pensé en escribir mis consejos estándar para que los lean, se rían de ellos y los ignoren.

La mayoría de los estudiantes, afortunadamente, son lo suficientemente impetuosos como para nunca molestarse en pedirle consejos a aquellos con más experiencia; lo que, en el campo de las ciencias de la computación, es algo bueno ya que sus mayores pueden decir cosas tontas y antediluvianas como "la demanda de operadores de tecleo excederá los 100.000.000 para el año 2010" y "las carreras sobre Lisp están que arden en este momento".

Yo tampoco tengo idea de qué estoy hablando cuando doy consejos a estudiantes. Estoy tan desactualizado que realmente no puedo entender el AIM y aún uso (¡horror!) ese vejestorio llamado e-mail que era popular en los días en los que la música venía en platillos planos llamados "CDs".

Por lo que estarán mejor ignorando lo que digo aquí y, en su lugar, creando algún tipo de cosa de software en línea que le permita a otros estudiantes encontrar gente con la cual tener citas.

Aún así.

Si disfrutas programando computadoras, siéntete dichoso: eres parte de una minoría de gente afortunada que puede vivir muy bien trabajando en algo que disfrutan. La mayoría de las personas no tiene tanta suerte. La simple idea de "amar el trabajo" es un concepto moderno. Se supone que el trabajo es algo desagradable que hay que hacer para obtener el dinero necesario para hacer las cosas que realmente disfrutas... cuando tengas 65 y te puedas retirar... si es que puedes costearlas... y no eres demasiado viejo o decrépito para hacerlas... y si no necesitan de rodillas confiables, buena vista y la habilidad de caminar 10 metros sin perder el aliento, etc.

¿De qué hablaba? Ah, cierto: consejos.

Es un placer presentarles, entonces, los 7 Consejos Gratuitos de Joel para los estudiantes de Ciencias de la Computación (valen hasta el último centavo que pagaron por ellos):

  1. Aprende a escribir antes de graduarte
  2. Aprende C antes de graduarte
  3. Aprende microeconomía antes de graduarte
  4. No descartes cursos no relacionados sólo porque son aburridos
  5. Toma cursos que incluyan mucha programación
  6. Deja de preocuparte porque todos los trabajos se están yendo a India
  7. Sin importar lo que hagas, consíguete una buena pasantía de verano

Ahora las explicaciones, a menos que seas lo suficientemente confiado como para hacer todo eso sólo porque yo lo digo; en cuyo caso agrego: 8.Busca ayuda profesional para ese problema de autoestima.

Contents

Aprende a escribir antes de graduarte

Nota de la traducción: En esta sección, el autor habla del idioma inglés, refiriéndose al lenguaje natural del estudiante, no al inglés como lengua extranjera. Preferí dejar "inglés" en lugar de traducirlo por "español" porque creo que para quienes no somos angloparlantes nativos lo dicho es válido tanto con respecto a nuestro propio idioma como respecto de aprender inglés como lenguaje internacional de la informática.

¿Habría triunfado Linux si Linus Torvalds no lo hubiese evangelizado? Por mucho que sea un hacker brillante, fue su habilidad para transmitir sus ideas en inglés escrito a través de e-mail y listas de correo lo que atrajo hacia Linux a una brigada mundial de voluntarios.

¿Has escuchado sobre la última moda: Extreme Programming? Bueno, sin entrar en detalles sobre lo que pienso del tema, la razón por la que escuchaste al respecto es porque está siendo promovido por personas que son escritores y oradores muy talentosos.

Aún a pequeña escala, cuando ves cualquier organización dedicada a la programación, los programadores con mayor poder e influencia son aquellos que pueden hablar y escribir en inglés de forma clara, convincente y cómoda. También ayuda ser alto, pero no podemos hacer nada sobre eso.

La diferencia entre un programador promedio y un excelente programador no es la cantidad de lenguajes de programación saben, ni si prefieren Python o Java. Es su capacidad de comunicar ideas. Es convenciendo a otras personas que ellos toman la ventaja. Escribiendo comentarios claros y especificaciones técnicas le permiten a muchos otros programadores entender su código, lo que significa que otros programadores lo podrán utilizar y trabajar con él en lugar de reescribirlo. Sin eso, su código es inútil. Al escribir documentación técnica clara para los usuarios finales, permiten a la gente entender qué es lo que se supone que hace su código, que es la única forma en la que el usuario puede apreciar el valor del código. Hay mucho código maravilloso y útil enterrado en Sourcefourge que nadie utiliza porque fue creado por programadores que no escriben muy bien (o no escriben en absoluto) de modo que nadie sabe qué hicieron y su brillante código agoniza.

Yo no contrataría a un programador a menos de que sepa escribir, y bien, en inglés. Si sabes escribir, donde sea que te contraten, pronto descubrirás que te pedirán que escribas especificaciones y eso implica que ya estás tomando la ventaja con tu influencia y haciéndote notar por la gerencia.

La mayoría de las universidades designan ciertas clases como "de escritura intensiva", lo que signigica que tienes que escribir muchísimo texto para aprobarlas. ¡Busca esas clases y cúrsalas! Busca clases en cualquier campo que tenga entregas diarias o semanales.

Crea un diario o un blog. Mientras más escribas, más fácil te será escribir y, mientras más fácil te sea escribir, más escribirás. Es un círculo virtuoso.

Aprende C antes de graduarte

Parte dos: C. Nota que no dije C++. Aunque C se está volviendo cada vez más inusual, aún es la lingua franca de los programadores. Es el lenguaje que utilizan para comunicarse entre ellos y, lo que es más importante, es mucho más cercano a la máquina que los lenguajes "modernos" que aprenderás en la universidad como ML, Java, Python o la basura de moda que estén enseñando en el momento. Necesitarás al menos un semestre acercándote a la máquina o jamás serás capaz de escribir código eficiente en lenguajes de más alto nivel. Nunca podrás trabajar en compiladores y sistemas operativos, que son de los mejores trabajos de programación que hay. Jamás se te confiará la creación de arquitecturas para proyectos a gran escala. No importa cuánto sepas acerca de continuaciones, clausuras o manejo de excepciones: si no puedes explicar por qué while (*s++ = *t++); copia una cadena, o si esa no es la cosa más natural en el mundo para ti, bueno, estás programando basándote en supersticiones según mi opinión: un médico clínico que no sabe anatomía, dando recetas basándose en lo que la chica linda de ventas del laboratorio farmacéutico dijo que servía.

Aprende microeconomía antes de graduarte

Repaso súper-rápido si no has tomado ningún curso de economía: la economía es uno de esos campos que arrancan con toda la fuerza, con muchas teorías y hechos útiles que tienen sentido y pueden ser probados en la práctica, etc., y desde allí es todo cuesta abajo. Todo lo útil del comienzo es microeconomía, que es la base de literalmente todas las teorías de negocios que importan. Luego de que la cosa se comienza a deteriorar, nos estamos metiendo en macroeconomía (saltea esta parte si quieres) que son teorías interesantes acerca de cosas como la relación entre tasas de interés y el desempleo... que son desacreditadas más frecuentemente que lo contrario y luego se pone peor aún por lo que muchos estudiantes de economía se cambian a física, lo que les da mejores trabajos en Wall Street de todas formas. Pero asegúrate de cursar microeconomía porque debes saber acerca de la oferta y la demanda, debes saber sobre la ventaja competitiva, y tienes que entender el VAN y la utilidad marginal y descontada antes de que tengas una idea de por qué los negocios funcionan de la forma en que lo hacen.

¿Por qué debería un estudiante de ciencias de la computación estudiar economía? Porque un programador que entiende los fundamentos de los negocios será más valioso como programador a una empresa que aquél que no los entiende. Es tan simple como eso. No puedo contar la cantidad de veces que me frustré con programadores con ideas locas que tienen sentido en código pero no en el capitalismo. Si entiendes sobre estas cosas, eres un programador más valioso, y obtendrás tu recompensa por eso, por razones que también aprenderás en microeconomía.

No descartes cursos no relacionados sólo porque son aburridos

Dejar de lado los cursos no relacionados con las ciencias de la computación es una forma excelente de obtener un promedio más bajo.

Nunca subestimes la importancia del promedio. Demasiados gerentes de personal o de recursos humanos, yo incluido, van derecho a los promedios cuando miran un currículum, y no nos disculparemos por eso. ¿Por qué? Porque el promedio, más que cualquier otro número, refleja la suma de lo que docenas de profesores, sobre un largo período de tiempo en muchas situaciones diferentes, piensan de tu trabajo. ¿La puntuación del SAT (examen estandarizado de admisión a universidades en EEUU)? ¡Ja! Ese es sólo un examen de unas horas. El promedio refleja cientos de trabajos, finales y participaciones de clases durante los estudios. Si, tiene sus problemas. Ha habido inflación de calificaciones en los últimos años. Nada en el promedio dice que lo obtuviste tomando clases de economía hogareña en la Universidad del Fracaso o estudiando mecánica cuántica avanzada en Caltech. Eventualmente, luego de filtrar todos los promedios debajo de 2.5 de la Universidad del Fracaso, pediré transcripciones y recomendaciones. Y después buscaré calificaciones consistentemente altas, no sólo calificaciones altas en ciencias de la computación.

¿Por qué debería yo, como un empleador buscando desarrolladores, preocuparme por las calificaciones que obtuviste en Historia Europea? Después de todo, estudiar historia es aburrido. Ah, ¿entonces estás diciendo que debería contratarte porque no trabajas muy duro cuando el trabajo es aburrido? Bueno, hay cosas aburridas en la programación también. Todo trabajo tiene sus momentos aburridos. Y no me interesa contratar gente que sólo quiere hacer la parte divertida.

Yo tomé un curso llamado Antropología cultural porque pensé: ¿por qué no?, necesito aprender algo acerca de antropología y este aparentaba ser un curso de encuestas interesantes.

¿Interesante? ¡Ni cerca! Tuve que leer libros increíblmente monótonos sobre indios en la selva tropical brasileña y sobre los isleños de las Islas Trobriand, quienes, con el debido respeto, no son demasiado interesantes para mí. En un momento, la clase era tan pesada que deseaba hacer cualquier cosa más entretenido, como ver crecer el césped. Había perdido el interés completamente en lo que a la clase se refería. Completa y totalmente. Mis ojos lagrimeaban porque estaba demasiado cansado de las discusiones eternas sobre el acopio de batata. No sé porqué los isleños de Trobriand pasaban tanto tiempo acopiando batatas, y ya no lo recuerdo, era demasiado aburrido pero iba a estar en el examen final así que resistí. Al final decidí que Antropología cultural sería mi Desafío de Aburrimiento: mi propia carrera de obstáculos de tedio. Si podía obtener una A en una clase donde los exámenes me requerían aprender todo acerca de mantas ceremoniales, podría aguantar lo que fuese sin importar cuan aburrido. La siguiente vez que me quede accidentalmente atrapado en el Lincoln Center viendo las 18 horas completas del ciclo de Wagner agradeceré a mis estudios de los Kwakiutl por hacer que eso parezca placentero en comparación.

Obtuve una A. Y si yo pude hacerlo, tú también.

Toma cursos que incluyan mucha programación

Recuerdo el momento exacto en el que juré nunca volver a la universidad.

Fue en un curso de Lógica Dinámica, enseñada por el dinámico Lenore Zuck en Yale, uno de los más brillantes de un grupo de muy brillantes profesores de Ciencias de la Computación.

Ahora, mi oxidada memoria no le hará el honor que se merece a este campo, pero trataré de explicar. La idea de la Lógica Formal es que demuestres que ciertas cosas son verdaderas porque otras cosas son verdaderas. Por ejemplo, gracias a la Lógica Formal "Todos los que tienen buenas calificaciones son contratados" más "Johnny obtuvo buenas calificaciones" te permite descubrir un nuevo hecho verdadero: "Johnny va a ser contratado". Es todo muy pintoresco y sólo le tomaría diez segundos a un deconstruccionista destrozar todo lo útil en la Lógica Formal con lo que te queda algo divertido pero inútil.

Bueno, la lógica dinámica es lo mismo, pero con el agregado del tiempo. Por ejemplo, "luego de prender la luz, puedes ver tus zapatos" más "La luz fue encendida en el pasado" implica "puedes ver tus zapatos".

La Lógica Dinámica es atractiva para los teóricos brillantes como el Profesor Zuck porque sostiene la esperanza de que podrías ser capaz de probar formalmente cosas acerca de programas de computadoras, lo que sería muy útil si, por ejemplo, pudieras probar formalmente que la tarjeta flash del Mars Rover no se reiniciará una y otra vez debido a un desbordamiento cuando se supone que debe estar dando vueltas por el planeta rojo buscando a Marvin el Marciano.

Sucede que el primer día de clases, el Dr. Zuck llenó dos pizarras completas y bastante de las paredes a los costados de las pizarras para probar que si tienes un interruptor de luz y la luz está apagada y uno activa el interruptor, la luz se encenderá.

La demostración era desquiciadamente complicada y muy inestable. Era más complicado demostrar que la prueba era correcta que convencerse a uno mismo del hecho que al activar un interruptor de luz se enciende la luz. Por cierto que las múltiples pizarras incluían pasos que habían sido omitidos porque eran demasiado tediosos de escribir formalmente. Muchos pasos se alcanzaban con el conocido método de Prueba por Inducción, otros por reducción al absurdo y otros utilizando la demostración por parte estudiantes graduados.

De tarea, debíamos probar la recíproca: si la luz estaba apagada y ahora está encendida, demostrar que alguien activó el interruptor.

Lo intenté, realmente lo intenté.

Pasé horas en la biblioteca intentando.

Luego de unas horas encontré un error en la prueba original del Dr. Zuck que estaba intentando emular. Probablemente había copiado algo mal, pero me hizo dar cuenta de algo: si toma tres horas llenar pizarras completas para probar algo trivial, permitiendo cientos de oportunidades de introducir errores, este mecanismo nunca sería capaz de demostrar cosas interesantes.

No es que eso les importe a los lógicos dinámicos: no están en eso por su utilidad, sino por el puesto.

Dejé la clase y juré jamás volver a ir a una escuela de Ciencias de la Computación.

La moraleja de la historia es que ciencias de la computación no es lo mismo que desarrollo de software. Si eres realmente afortunado, tu escuela puede llegar a tener una currícula decente en desarrollo de software, pero pueden no tenerlo porque las escuelas de elite piensan que enseñar habilidades prácticas es mejor para los institutos vocacionales/técnicos y los programas de rehabilitación de las prisiones. Programación se puede aprender en cualquier lado. Nosotros estamos en la Universidad de Yale y Formamos a los Futuros Líderes del Mundo. ¿Piensas que los 160.000 dólares de matrícula son para sobre los bucles while? ¿Qué crees que es esto, un seminario de Java al paso en el Airport Marriot? Si, claro.

El problema es que no tenemos realmente escuelas profesionales en desarrollo de software, por lo que si quieres ser un programador seguramente estudiaste Ciencias de la Computación. Lo que es un buen tema para estudiar, pero es un tema distinto al desarrollo de software.

Si tienes suerte, sin embargo, podrás encontrar muchos cursos de programación intensiva en el departamento de Ciencias de la Computación, como también podrás encontrar muchos cursos en el departamento de Historia en los que escribirás lo suficiente como para aprender a escribir. Y esas son las mejores clases que puedes tomar. Si te encanta programar, no te sientas mal por no entender el sentido de los cursos sobre cálculo lambda o álgebra lineal donde nunca tocas una computadora. Busca los cursos con Practicum en el nombre. Eso es un intento de esconder un curso útil (escalofríos) de la Conservadora Administración Liberal, escondiéndolo bajo un nombre en latín.

Deja de preocuparte porque todos los trabajos se están yendo a India

Bueno, primero que nada, si ya estás en India, nunca tuviste que preocuparte por esto, así que ni siquiera comiences a preocuparte porque todos los trabajos se van a India. Son trabajos excelentes, disfrútalos con salud.

Pero sigo escuchando que la matrícula en los departamentos de Ciencias de la Computación está decreciendo peligrosamente, y una de las razones que escucho para ello es que "los estudiantes tienen miedo de entrar en un campo donde todos los trabajos están yéndose para India". Esto esta muy mal por muchas razones. Primero, tratar de elegir una carrera basándose en una moda actual de los negocios es estúpido. Segundo, saber programar es un entrenamiento increíblemente bueno para todo tipo de trabajos sumamente interesantes, como ingeniería de procesos de negocios, aún cuando cada trabajo de programación efectivamente se vaya a India o a China. Tercero, y créeme en esto, aún existe una escasez increíble de programadores realmente buenos, aquí y en India. Sí, hay un grupo de gente de TI sin trabajo haciendo un montón de ruido sobre cuánto hace que están sin empleo, pero ¿sabes qué? A riesgo de hacerlos enojar, los programadores realmente buenos sí tienen trabajo. Cuarto, ¿tienes una mejor idea? ¿Qué vas a hacer, graduarte en historia? Entonces no vas a tener otra opción que estudiar leyes. Y hay algo que sé: 99% de los abogados en actividad odian sus trabajos, cada minuto, y además trabajan 90 horas semanales. Como dije: si te gusta programar computadoras, siéntete dichoso: estás en la muy afortunada minoría de la gente que puede vivir haciendo lo que les gusta.

Igualmente, yo no creo que los estudiantes piensen sobre esto. La merma en la matrícula en computación es simplemente una vuelta a los niveles históricamente normales luego de la gran burbuja en la matrícula que provocó la manía de las punto com. Esa burbuja consistía de personas a las que en realidad no les gustaba la programación pero pensaban que los trabajos con sueldos altísimos y la oportunidad de llegar a una primera oferta pública de acciones a los 24 años estaban en el departamento de computación. Esa gente, afortunadamente, hace rato que se fue.

Sin importar lo que hagas, consíguete una buena pasantía de verano

Los empleadores inteligentes saben que la gente que ama la programación escribió una base de datos para su dentista cuando estaba en 8º grado, enseñó en el campamento de computación durante tres veranos antes de la universidad, construyó el sistema de administración de contenidos para el periódico del campus y realizó pasantías de verano en compañías de software. Eso es lo que buscan en un currículum.

Si disfrutas programar, el mayor error que puedes cometer es tomar cualquier tipo de trabajo (de verano, part-time, o cualquier otro) que no sea de programador. Lo sé, todos los chicos de 19 años quieren trabajar en el shopping doblando camisas, pero tú tienes una habilidad que es increíblemente valiosa aun cuando tienes 19 años y es estúpido desperdiciarla doblando camisas. Para cuando te recibas, realmente deberías tener un currículum que liste un montón de trabajos de programación. Los graduados de Administración y Finanzas van a trabajar en empresas de alquiler de automóviles, "ayudando a la gente con sus necesidades de alquiler". (Excepto por Tom Welling. El hace de Superman en TV).

Para hacer tu vida realmente sencilla, y para reforzar cuan completamente egoísta es este ensayo, mi compañía, Fog Creek Software, tiene pasantías de verano en desarrollo de software que se ven geniales en un currículum. "Seguramente vas a aprender más sobre codificación, desarrollo y negocios de software en Fog Creek Software que en cualquier otra pasantía por ahí", dice Ben, uno de los pasantes del verano pasado, y no sólo porque le envié un matón a su dormitorio para obligarlo a decirlo. La inscripción cierra el 1º de febrero. Apúrate.

Si sigues mis consejos, tú también puedes terminar vendiendo acciones en Microsoft muy pronto, rechazando trabajos en Google porque quieres tu propia oficina con una puerta y otras estúpidas decisiones, pero no va a ser mi culpa. Te dije que no me escucharas.

Personal tools