Recuerdo claramente el momento en que escribí mi primer programa ( y eso que yo tengo una memoria malísima; les cuento que no me acuerdo ni la mitad de las cosas importantes de mi vida como el primer beso que le di a una chica o el momento en que nació mi hijo o el día que me pusieron amonestaciones en el cole..bueno cosas como esas).
Supongo, ahora que miro hacia atrás en ese momento, que era un programa bastante complicado para alguien como yo (20 o 30 líneas, creo). Pero como yo estudiaba matemática en la facultad se suponía que era bueno en cosas como “pensar lógicamente”. Entonces fui a la sala de computadoras de la facu, armado solamente con un libro sobre programación y mi ego, me senté en una de las computadoras y empecé. Bueno, “empecé” no seria la palabra correcta. O tampoco “programar”. Digamos que me senté delante de la computadora y me sentí increíblemente tonto. Luego me sentí avergonzado. Y luego enojado hasta que finalmente me sentí pequeño hasta que después de 8 horas desesperantes el programa estaba terminado y andando. El hecho de que funcione no importaba mucho…era un momento de gloria.
Ya paso mas de una década de ese momento, pero todavía siento el estrés y la humillación en mi estomago cuando me acuerdo. Claramente, esa no es la forma de aprender a programar. Pero porque fue tan difícil? Digo, ahí estaba yo, alguien medianamente lucido y capaz con entrenamiento matemático-vos pensarías que yo debería poder haberlo hecho! Y seguí con mi vida haciendo de esto de programar un trabajo e incluso llegue a escribir un libro, así que no era que yo no “tenia lo que hacia falta” ni nada parecido. De echo, encuentro programar como algo relativamente sencillo, en su mayoría.
Entonces, porque fue tan difícil decirle a una computadora que haga algo medianamente complicado? Bueno, la parte difícil no es la “medianamente complicado” sino la parte de “decirle a una computadora”
En cualquier comunicación entre humanos, uno puede dejar muchas cosas sin decir, saltearse pasos y conceptos y entenderse. Claro que uno deja que la otra persona “complete” lo que falta. En realidad, uno tiene que saltearse cosas! Si no lo hiciésemos, no podríamos hacer nada! El ejemplo típico es el armarse un sándwich de jamón, queso y mayonesa. Normalmente, uno diría tranquilamente, “Che, me haces un sándwich de jamón y queso con mayonesa?” En cambio, si se lo tenés que pedir a alguien que nunca hizo uno, como un robot, tendrías que decirle como:
- Agarra 2 rodajas de pan (y deja el resto)
- Saca queso, jamón, mayonesa y un cuchillo.
- Unta en 1 pan un poco de mayonesa
- Pone arriba de la mayonesa 2 fetas de jamón y 1 de queso
- Pone las otra rodaja de pan arriba, pone todo en un plato y tráemelo! Gracias!
Me imagino que esas instrucciones son suficientes para un niño de 7 años. Pero un niño de 7 años es bastante inteligente como para hacer eso. En cambio, que habría que decirle a una computadora? Concentrémonos solamente en el primer paso:
- Agarra 2 rodajas de pan (y deja el resto)
- Localizar la bolsa pan lactal
- Ir a una mesa
- Dejar bolsa de pan en la mesa
- Abrir la bolsa
- Agarrar 2 fetas de adentro de la bolsa…
Bueno, lamentablemente estas instrucciones no alcanzan para nada. Por ejemplo: como es “localizar la bolsa de pan”? Bueno, tendríamos que tener una especie de base de datos donde se asocien las cosas con su ubicación. La base de datos debería también tener las coordenadas del jamón, heladera, mesa, cuchillo, plato, yo mismo….
Ah! Y que pasaría si la bolsa de pan esta en una panera? Entonces habría que abrir la panera? O por ahí esta detrás de algo? O arriba de la heladera? Entonces tendríamos solamente para localizar la bolsa de pan lactal:
- Localizar la bolsa pan lactal
- Buscar coordenadas de la panera
- Esta la bolsa de pan en la panera
- 1. Abrir la panera
- 2. Meter la mano dentro de la panera
- 3. Agarrar bolsa de pan lactal
- 4. Sacar la mano de la panera
- 5. Cerrar la panera
- Si el pan esta arriba de la heladera
- 1. Ir hasta la puerta de la heladera
- 2. Estirara la mano hacia arriba de la heladera
- 3. Agarrar la bolsa de pan
- 4. Sacar la mano de arriba de la heladera…
- Esta la bolsa de pan en la panera
- Buscar coordenadas de la panera
Y así sigue y sigue. Además, que pasa si no hay cuchillo? O si la mesa esta llena de cosas y no hay lugar para preparar el sándwich? Y además, habría que rezar al Santo que te parezca más apropiado, para que el pan este en buen estado! Aun los pasos mas sencillos como abrir la panera deberían ser explicado y es por eso que todavía no hay robots que hagan sándwich para nosotros!: no es que los robots no puedan ser construidos, sino que no podemos programarlos para que nos hagan sándwichs! Y eso es porque aunque no lo parezca, preparar un sándwich de jamón, queso y mayonesa es algo muy difícil de describir (pero fácil de hacer para criaturas inteligentes como nosotros, los humanos) y las computadoras solo son buenas para las cosas que son fáciles de describir. Y por eso para mi fue tan difícil hacer mi primer programa: las computadoras son mas tontas de lo que creía!
Que es programar?
Cuando uno le explica a alguien como hacer un sándwich, el trabajo es mucho mas fácil porque esa persona ya sabe lo que es un sándwich. Es común que la gente sepa de “sandwicheria” y por eso esa persona puede llenar los espacios de nuestra pobre explicación. El paso 3 dice “Unta en 1 pan un poco de mayonesa” pero no dice que no lo unte en los dos lados. Tampoco dice cuanta mayonesa ni de que manera untarlo ( si poner mas en el medio, o en los costados) ni aclara de usar el cuchillo para hacerlo y no las manos. Uno asume que esas cosas ya se saben. Bueno, creo que esta realidad ayudaría a explicar que quiere decir programar o por lo menos dar una definición informal.
Programar es decirle a tu computadora como hacer algo. Las tareas grandes tienen que se divididas o descompuestas en tareas mas chicas, las cuales tienen que ser descompuestas en tareas aun mas chicas y así seguir hasta que las tareas son tan chiquititias y simples que no tienen que ser divididas porque la computadora sabe hacerlas. Estas tareas son cosas muy básicas como imprimir un texto en la pantalla o sumar 2 números. Mi problema mas grande cuando yo estaba aprendiendo a programar fue que yo estaba aprendiendo al revés. Yo ya sabia lo que quería que la computadora y trataba de ir dividiendo en eso hasta llegar a tareas que de repente la computadora entendiese. Muy mala idea. En realidad yo no sabia lo que realmente la computadora podía hacer entonces no sabia bien en que tareítas descomponer mi tarea grande o lo que la computadora tenia que hacer. Por eso vos vas a aprender a programar en forma diferente. Primero vas a aprender estas tareítas básicas que la computadora puede hacer (algunas nomás) y después encontrar tareas simples que puedan ser descompuestas en esas tareítas. Tu primer programa va a ser tan fácil que solamente te llevara menos de un minuto.
Lenguajes de Programación
De manera de poder decirle a tu computadora que haga algo tenemos que usar un lenguaje programación. Un lenguaje de programación es parecido al lenguaje que usamos para hablar en el sentido que esta formado por cosas básicas como palabras ( verbos y sustantivos) y por maneras de combinar esas palabras para dar sentido ( oraciones, párrafos, novelas). Hay muchos lenguajes para elegir (C, Java, Ruby, Perl…) y cada uno tiene su conjunto de elementos básicos. Algunos tienen mas que otros. Ruby tiene un conjunto sencillo pero elegante y es uno de los mas fáciles para aprender así que vamos a usar ese. Probablemente la mejor razón para usar Ruby es que los programas en Ruby suele ser cortos. Por ejemplo aquí hay un pequeño programa en Java.
[sourcecode language='java']
public class HolaMundo {
public static void main(String []args) {
System.out.println(”Hola Mundo”);
}
}
[/sourcecode]
Y acá esta el mismo programa pero en el lenguaje Ruby:
[sourcecode language='ruby']
puts ‘Hola Mundo’
[/sourcecode]
Este programa, en ambos casos, escribe las palabras Hola Mundo en la pantalla de la computadora. En la versión en Ruby uno podría adivinar, pero en la versión de java adivinar esto no es tan sencillo.
El arte de programar
Una parte importante de programar es, claramente, que el programa haga lo que se supone que tiene que hacer y no otra cosa. En otras palabras el programa no debería tener errores o bugs (se pronuncia bags). Claro que cuando uno se concentra mucho en no tener errores uno se pierde la gran mayoría de las cosas buenas de la programación. Programar no es solamente acerca del producto final o del programa sino acerca del proceso que lleva a él. Los programas no se escriben de una como los puentes. Sino que los programadores charlan sobre él, piensan, discuten, escriben un poco, lo arreglan, lo estiran, juegan con el, lo cambian, lo mejoran, lo prueban, lo borran, lo vuelven a escribir…
Un programa no se arma: crece.
Dado que un programa siempre esta creciendo y evolucionando siempre esta cambiando y tiene que estar escrito pensando en que va a cambiar. Se que esto no puede quedar muy claro hablando en términos prácticos pero este tema ira surgiendo durante todo el libro. Probablemente, la primera regla de un buen programador es evitar duplicar código. Esto a veces se llama la regla de: “No vuelva a escribir lo mismo”. Si la vemos de otra manera, es como la ley del mínimo esfuerzo. Un buen programador tiene que ser un poco vago: pero no ser vago de no hacer nada, sino ser vago en forma inteligente para no tener que hacer nada después!!! Ahorrate trabajo siempre que puedas!! Si hacer cambios ahora significa ahorrarte trabajo mas adelante, hacelo!
Trata de que tu programa haga lo menos posible para hacer lo que tiene que hacer . De esta manera programar no solo es mucho mas interesante porque es muy aburrido hacer lo mismo una y otra vez sino que además el programa tiene menos errores y es mas rápido! Es una situación donde todos ganan!
De cualquier manera, la idea es la misma: trata de que tus programas sean flexibles Así, cuando hay que hacer los cambios ( y te aseguro que siempre vienen) entonces vas a pasar menos y mejor tiempo haciéndolos.
Bueno, creo que con eso ya estamos. Otros libros sobre programas tienen un apartado que dice quienes debería leer este libro o como deberías leer este libro y esas cosas. Yo creo que el libro lo puede leer cualquier y de adelante para atrás ( los capítulos están ordenados por algo! ). Bueno, vamos a programar!
Mostrar un programa
Les mostramos un programa hecho en Ruby de los robots.
En este capitulo proponemos un role-play con un robot. Los chicos tienen que escribir los pasos del robot y el robot (uno de los instructores) tiene que repetirlo
Fede Says:
Muy bueno, sobretodo la parte:
Programar no es solamente acerca del producto final o del programa sino acerca del proceso que lleva a él. Los programas no se escriben de una como los puentes. Sino que los programadores charlan sobre él, piensan, discuten, escriben un poco, lo arreglan, lo estiran, juegan con el, lo cambian, lo mejoran, lo prueban, lo borran, lo vuelven a escribir…
Un programa no se arma: crece.
Se me puso la piel de gallina.
La parte mas dificil de la programacion, es la simpleza. Una persona que no sepa programar puede pensar que es muy complicado, en realidad, lo necesario para que el programa funcione y sea “flexible”, tiene que ser simple.
Simple significa usar la logica de la programacion para lograr un codigo compacto y entendible, legible, siempre que haya algo para cambiar, que no sea necesario modificar mas de la cuenta.
Para programar hay que tener paciencia y sobretodo saber que a veces no funciona, y hay que buscar la manera.
Los humanos tambien estamos programados para muchas cosas, como apagar la luz, o no apagarla, agarrar la llave 15 pasos antes de la puerta, entre otras.
Es evidente como la gente usa cada vez mas las computadoras, tal vez tengamos muchas cosas en comun con un conjunto de objetos, que a fin de cuentas estan basados en 0 o 1, SI o NO.
Saludos.
Posted on December 24th, 2009 at 12:21 pm