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:
- Suicidio
- 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:
- A pensar
- Identificar los algoritmos y estructuras de datos, y ser capaz de elegir apropiadamente cuando usarlos
- Punteros
- Recursión
* De hecho es muy probable que estés por tomar la opcion 1 luego de terminar de leer esto.