¿Cómo aprendo a programar en Java?

Trabajo programando en Java, y me gustaría resumir en pocas palabras toda la cultura popular detrás de esa simple pregunta. Hoy en día el que quiera aprender programación por su cuenta esta realizando una de estas dos cosas:

  1. Suicidio
  2. La mejor elección de su vida

Como te podrás imaginar, la opción 1 es clara dada variedad de respuestas totalmente opuestas y dispares que te pueden llegar a dar si le disparás a alguien esa simple pregunta*.

Al menos como yo lo veo, en ese aspecto no hay grises. Al día de la fecha hay demasiados lenguajes de programación, demasiadas tendencias y demasiados puntos de vista diferentes para poder encarar por uno mismo esa titánica tarea de aprender a programar de forma autodidacta.

Al mismo tiempo, eso es algo bueno ya que tenés infinidad de herramientas y materiales de los cuales uno puede ejercitarse.

Antes de dar una respuesta a esa pregunta, hay que tener algo en claro: aprender a programar es algo que lleva tiempo, dedicación y esfuerzo. Alguien dijo que es un arte, pero también hace falta disciplina. Y como cualquier disciplina, hay que dedicarse a aprender las cosas que realmente importan, en tiempo y forma.

Al menos si uno pretende hacerlo bien.

Dejando muchos detalles de lado, todos los lenguajes de programación son básicamente iguales. Las diferencias entre Ruby, Python y Java (e incluso con C++) no se comparan en relación a las cosas que tienen de parecidos.

¿Qué cosas realmente importan en la programación? No voy a dar un curso de programación, sino simplemente enumerar lo que yo creo que vale la pena aprender. Para todo lo demás, Google y la Wikipedia están para ayudarte. Algunas personas dicen que Yahoo es también una buena opción.

Y en el caso que uno se termine apasionando por la programación, siempre está la opción de seguir alguna carrera universitaria del tema. Ciencias de la Computación en una linda opción, al igual que cualquier otra equivalente (en mi caso, Licenciatura en Informática).

Lo más importante es aprender a pensar apropiadamente. Esto es algo duro de aceptar para algunas personas, pero la realidad es que uno se tiene que adaptar a ver el mundo de la programación de forma diferente. Hace algunos años estuve de profesor ayudante, explicándole a los alumnos de primer año de mi universidad cómo resolver ejercicios de programación, y ese era el mayor inconveniente de todos.

Muchos decían “yo tengo mi propia manera de programar”. He visto a varias personas quedarse estancadas en la carrera (y cometer crímenes en contra de la programación) por pensar de esa forma.

Los otros dos mayores inconvenientes que tenían era poder diferenciar un algoritmo de una estructura de datos, cuando algo era cada cosa, y cuando usarlas y cuándo no. En programación esa distinción es muy importante, pero no muchos le dan importancia.

Un algoritmo es la “receta” de cualquier programa, y la estructura de datos son los ingredientes de esa receta.

En el caso de un programa, un algoritmo son las operaciones que se realizan (asignar variables, operaciones matematicas, tomar desiciones con un if, hacer un while, etc), y las estructuras de datos es el lugar usado para guardar la información (variables, clases, registros, arrays, etc).

Un algoritmo muy simple es el de contar la cantidad de caracteres que se leen desde teclado, hasta llegar a un punto. En este caso, no hay muchas estructuras de datos sino simplemente las variables que se usan para leer los caracteres. Otro muy parecido es contar la cantidad de letras “x” que hay dentro de un String. En Java eso es muy sencillo:

static int contar_equis(String s)
{
int cantidad = 0, indice;

for (indice = 0; indice < s.length(); indice++)
if (s[indice] == ‘x’)
cantidad++;

return cantidad;
}

Un algoritmo más elaborado es el de ordenar números dentro de un vector. Hay diferentes métodos o técnicas, como la de inserción, selección, burbuja con o sin centinela, quick-sort, sorting by merge, etc.

En el cuarto y quinto puesto del ranking de dificultad de cualquier tarea de programación están los temas de punteros y recursión. En los exámenes de primer año de mi facultad esos dos temas eran los que marcaban si alguien aprobaba la materia o no.

Ésto era así no por un capricho de los docentes de la materia, sino porque históricamente fueron las dos herramientas más potentes a la hora de resolver un problema en un programa.

Los lenguajes de programación como Java existen para hacerle al programador la tarea más fácil, ocultando lo que hay debajo: un procesador con registros conectado a una memoria principal por medio de un bus, y muchas otras cosas que no viene al caso mencionar (por temas de espacio, son tantas que no terminaría nunca de nombrar) pero que responden a lo que Von Neumann alguna vez dijo.

Los punteros, a su vez, existen para recordarle al programador que el lenguaje de programación le está ocultando todo eso de ahí abajo; que hay algo llamado procesador y que nada funciona por arte de magia.

Los punteros te recuerdan que hay algo llamado caché, que hay diferentes modos de direcionamiento de los datos (cada uno con sus ventajas y desventajas), y que ciclo tras ciclo el contador de programa se incrementa y la ALU (UAL en castellano) por medio de la CU (UC en castellano) ejecuta cada una de las instrucciones en código máquina.

De esa forma siempre existió alguna clase de equilibrio entre lo que es la “realidad” y lo que es la facilidad de hacer un programa.

La recursión es lo que le permite a un programador, por medio de un programa, dividir un problema grande y difícil en algo mas sencillo y simple de manejar. Uno puede tener una base de datos con información de toda las personas de un país, y la recursión nos ayuda de alguna manera a encontrar la información de una sola persona dentro de todo ese gran volumen.

Eso, hasta que llegó Java. En este lenguaje no existen los punteros, y la recursión es algo que rara vez se usa ya que el 99% de los casos en los que uno debería usarla se termina eligiendo algo que el lenguaje Java o la JDK te provee.

Querer aprender Java no es lo mismo que querer aprender a programar. Mucha gente aprende Java solo para poder trabajar de eso y ganarse algún dinero, pero solo los que quieren aprender a programar pueden lograr algo interesante. De la misma forma que hoy en día Java es uno de los lenguajes de programación más populares, 25 años atrás lo era COBOL.

No tengo nada en contra de ese lenguaje. El problema es que los que se durmieron en los laureles y solo se quedaron con COBOL, a la larga perdieron su trabajo y se quedaron en el tiempo. El error de ellos no fue querer aprender COBOL: en algún momento hay que leer el manual de COBOL, aprender a usarlo y escribir código en ese lenguaje. El error fue no aprender lo que realmente importa: a pensar, y los algoritmos y estructuras de datos adecuados.

Dentro de 20 años, los que se quedaron con un simple curso de Java van a quedarse sin trabajo y todo lo que aprendieron no les va a servir para nada útil.

Lo mismo ocurrió hace 5 años con Visual Basic 6.0. Cualquiera que haya hecho un curso de ese lenguaje y haya pagado, lo estafaron. Microsoft, por una cuestión puramente monetaria, decidió no continuar con el soporte para los usuarios de ese lenguaje. Desde ese momento, todos los programadores de VB 6.0 tuvieron que aprender .Net o dedicarse a otra profesión.

Por último, la programación orientada a objetos no es más que esas tres cosas metidas dentro de una sola cosa (llamada objeto ^^), pero visto desde otro punto de vista, bastante más abstracto.

¿Querés aprender Java? La pagina de Sun es excelente:

http://java.sun.com/docs/books/tutorial/

¿Querés aprender a programar? tenés que aprender:

  1. A pensar
  2. Identificar los algoritmos y estructuras de datos, y ser capaz de elegir apropiadamente cuando usarlos
  3. Punteros
  4. Recursión

* De hecho es muy probable que estés por tomar la opcion 1 luego de terminar de leer esto.

12 Responses to “¿Cómo aprendo a programar en Java?”

  1. Fercho Says:

    Te repito te repito.. muy groso todo, te quiero.. un abrazo. :p

  2. ICeman Says:

    Justo estaba experimentando con NetBeans en forma autodidacta, haciendo cosas del tipo:
    http://www.frost-team.com.ar/iceman/programas/dummy.jnlp

  3. Gorlok Says:

    Alejo: muy lindo post.

    Me deja una reflexión: la programación va mucho más allá de los lenguajes usados circunstancialmente.

    Saber programar en el lenguaje que sea implica conocer y aplicar todos los conceptos de programación, y aprovechar los diferentes paradigmas que se han ido desarrollando durante años. “Programar” sin dominar los conceptos básicos, no es programar, es “escupir código”, y eso lo podría hacer un mono.

    Es muy fácil aprender un lenguaje. Programar es otra cosa bien distinta. Quien sabe programar puede aprender cualquier lenguaje (y es recomendable conocer varios para poder elegir el más adecuado a la situación) en cuestión de poco tiempo.

    *NUNCA* se termina de aprender a programar. Quien dice lo contrario miente o está muy confundido.

    Para hacer una analogía. Alguien puede aprender a escribir en inglés, alemán, francés… pero por más lenguajes que uno hable no por eso podrá escribir una obra maestra. Tal vez quien escribe tal obra solo sea experto en un lenguaje o en varios, pero logra escribirla no porque domine tal lenguaje, sino porque dominó conceptos que están más allá de la sintaxis, de la semántica, o de una tipografía. Excede al lenguaje, por más que el lenguaje sea el vínculo usado por el autor para su creación.

    Cuando crees haber encontrado el lenguaje definitivo e ideal que resolverá todos los problemas habidos y por haber… es hora de levantar la cabeza y buscar nuevamente el camino perdido y revisar tus ideas.

    En fin, ningún lenguaje es bueno o malo per se. Cuanto mucho será más o menos adecuado para una situación y problema. Eso es todo. Y todo siempre se reduce a nada más que bits al fin. Solo Ceros y Unos, el resto es pura abstracción pequeño saltamontes :)

    Soy un agradecido de la UNLP. Ella me enseñó a pensar mejor. Todavía aprendo programación ^^ con mucho gusto, y espero seguir aprendiendo más en el futuro!

  4. Maraxus Says:

    Muy bueno realmente Alejo, me sorprendiste con este artículo, y coincido plenamente con cada una de las palabras aquí enunciadas.

    De todos modos, agregaría un quinto punto que toda persona debe aprender si quiere programar, que está muy ligado a los puntos 1 y 2, y que conllevan innevitablemente el uso de herramientas poderosas como son la recursión y los punteros, y es el aprender técnicas de resolución de problemas.

    Cosas tan simples como un “Divide & Conquer” o “Backtracking” son herramientas fundamentales para todo programador independientemente del lenguaje que se elija, y es también un problema que encuentro sumamente frecuente en los que recién se inician en la programación. Quieren atacar problemas muy grandes y no saben como abordarlos, y esto los traba, los frustra y los lleva a desistir.

    Con este quinto punto sumado a los 4 que enunciaste con tanto detalle creo que ya uno está en condiciones de autodenominarse programador.

  5. Diego Says:

    Muy interesante el post.

    Eso es algo que siempre pensé, la facultad no debería enseñar la última herramienta de moda sino darte una base y enseñarte a pensar, porque ninguna herramienta es para siempre. No debería ser un trauma, si sabés programar si te dicen algo del estilo: “La entrega del trabajo es en C”.

    Creo que uno debería saber conocer varios lenguajes, sino también varios paradigmas y elegir el adecuado dependiendo del problema a resolver. Cada vez que escucho a alguien diciendo cosas del tipo: “Todo se hace en Java” o “La POO es lo mejor que hay”, me acuerdo de ese excelente artículo de Frederic Brooks llamado “No Silver Bullet”.

    Saludos!

    PS: Recién vi hoy el post, estuve configurando Linux.

  6. WindWalker Says:

    No está mal el artículo, pero desde luego no tiene ni idea de cómo está el mercado de soluciones informáticas.

    Decir que COBOL no es popular hoy en día cuando el 67% de las soluciones informáticas que hay en el mundo están basadas en lenguajes y/o dialectos del COBOL, que mueve una industria multimillonaría y que 5 de cada diez programadores son de COBOL…

    ejem…

  7. alejolp Says:

    Veamos… busqué en Google:

    site:jobs.joelonsoftware.com cobol

    Su búsqueda - site:jobs.joelonsoftware.com cobol - no produjo ningún documento.

    Ahora veamos con Java:

    site:jobs.joelonsoftware.com java

    Resultados 1 - 10 de aproximadamente 170 de java en el dominio jobs.joelonsoftware.com

    OK. Jobs.JoelOnSoftware.com no es TAN popular. Veamos otra: Bumeran

    site:bumeran.com cobol

    Resultados 1 - 10 de aproximadamente 69 de cobol en el dominio bumeran.com

    site:bumeran.com java

    Resultados 1 - 10 de aproximadamente 352 de java en el dominio bumeran.com. (0.19 segundos)

    Otro: ZonaJobs.com.ar

    Se han encontrado 80 ofertas de trabajo en cobol.

    Se han encontrado 258 ofertas de trabajo en java.

    Otro mas? craigslist.org!

    cobol: Found: 6 Displaying: 1 - 6

    java: Found: 1257 Displaying: 1 - 100

    Mirá que craiglist.org tiene DE TODO, EH! Otro mas? Mmm… ¿que tal Google directo?

    Resultados 1 - 10 de aproximadamente 1.240.000 de cobol jobs

    Resultados 1 - 10 de aproximadamente 216.000.000 de java jobs

    Mmm. 67% ? Es un poco EXAGERADO, ¿no te parece? O sea, al menos esa es mi opinión personal. Si a vos te parece que COBOL es una buena opcion para aprender y salir a trabajar, ¿quien soy yo para decir lo contrario?

    Saludos!

  8. alejolp Says:

    Ah, me olvidé de GetAFreeLancer.com! Veamos…

    Status: OPEN

    cobol: no projects found
    java: 10 projects found

    Status: ANY

    cobol: 2 projects found
    java: 1000 projects found

    Mmm…

  9. lordkoz Says:

    Lamentablemente COBOL si es EXTREMADAMENTE popular…
    Pero debido a las grandes cantidades necesarias de trabajo en mantenimiento de codigo arcaico…
    Yo sinceramente no entiendo como la gente que mantiene sistemas programados en COBOL hoy en dia (que si… es muchisima) puede esquivar tu opcion (1) alejo…

  10. alejolp Says:

    Flame de por medio (me precipité con la ultima respuesta :$), mi idea de este texto era hablar sobre empezar a programar. Si, como bien dijieron ambos Cobol es popular, pero nadie hace cosas nuevas o desde cero en ese lenguaje.

    Surrender is not an option.

    Hablando claro: no interesa qué lenguaje uses, sino cómo lo uses y la forma en la que enfrentás los problemas a resolver. El tema es que si hablo claro, los posts de mi blog serian 25 veces mas cortos.

    Justamente hace unos dias Jeff Atwood en su blog escribió algo sobre el tema, muy interesante:
    http://www.codinghorror.com/blog/archives/000895.html

    Saludos!

  11. Karen Says:

    Hay no, bendita sea eso de aprender a programar es un poco complicado, llevo leyendo aproximadamente tres manuales, y pues entiendo la teoría pero muy poco la practica, no se que voy a hacer.
    Pero igual quiero aprender me parece muy imprtante.

  12. Neuquino Says:

    Karen, depende a que te dediques… si estudias alguna carrera relacionada con informatica y no sabés programar (y pasaste 1er año) estás en el horno… pero sino ¿para que estamos nosotros? ahorrá una buena cantidad de $$ y contratá a alguno que sepa programar…
    Saludos…
    Neuquino

Leave a Reply

Powered by WP Hashcash