Las buenas costumbres no hay que perderlas. Es por ello que sigo jugando al fútbol y la pachanga del lunes forma parte de un ritual al que no se puede faltar. Como toda buena pachanga, no vamos con un portero fijo sino que nos vamos rotando cada 7 minutos con un orden que sorteamos al llegar. Aquí se pueden aplican distintos métodos para realizar el sorteo:

  • Cada jugador saca un número del 0 al 5 con una mano, se suman todos, se comienza a contar en sentido horario y al que le toque va primero y el resto de posiciones se deciden en orden horario.
  • Lo mismo pero en orden anti-horario.
  • 25 y la pirula, o lo que es lo mismo, uno cuenta mentalmente hasta que alguien le hace parar en el número que toque, empieza a contar en voz alta en sentido anti-horario hasta 25 y uno más de regalo (la pirula).
  • Lo mismo pero la pirula se silabea (la pi-ru-la) lo que hacen 25 + 4.
  • Lo mismo que lo anterior pero el que cuenta hace trampa y dice el número que le hace ser el último.
  • Cuencos de cristal con bolas calientes.
  • (Regla transversal) El que llega tarde va primero.

Seguramente existan más variantes pero para el objetivo que nos ocupa es suficiente. La cuestión que hoy nos trae es que cualesquiera de estos métodos consumen un tiempo que podríamos emplear en jugar al fútbol. Así que pretendemos que la tecnología nos ayude a crear una aplicación que nos genere al azar el orden en el que los jugadores se turnan como portero antes del partido. Ya que estamos aprendiendo a programar, qué mejor que buscar un problema sencillo y abordable con el que empezar en este mundillo.

Como decía en capítulos anteriores, saber programar es cuestión de saber expresar un problema en unos términos que entienda un computador. Imaginaos que tenéis que aterrizar un avión sin tener ni idea y que tenéis a un piloto dándoos instrucciones por teléfono. En este caso no haréis nada a menos que se os den instrucciones muy precisas y actuaréis como máquinas tontas sin capacidad tomar decisiones autónomas. En ambos casos el lenguaje empleado no es lo esencial sino que simplemente es el medio para comunicar un mensaje que debe conducir a que se realice una determinada acción. En este contexto y para poder expresar nuestro mensaje de forma que un ordenador, un móvil o cualquier dispositivo con capacidad de computación lo entienda, debemos tener en cuenta las siguientes características de los computadores:

  • Son máquinas muy tontas que sólo tienen la capacidad de realizar operaciones aritméticas básicas (sumas, restas, divisiones, multiplicaciones y módulo) y lógicas (que por ahora vamos a ignorar).
  • No se acuerdan de los datos por arte de magia, necesitan apuntarlos en algún sitio: la memoria.
  • Serán máquinas muy tontas, pero puede hacer la misma tarea muchas veces sin quejarse y por tanto hacer una "jartá" de cálculos por segundo.
  • Los computadores no son máquinas creativas. Hacen lo que les decimos y en el orden que les indicamos. Ni más ni menos.
  • Son deterministas, es decir, no se toman la libertad de hacer lo que les da la gana en función de cómo se levantan. Si le damos unos datos para que haga un cálculo siempre va a devolvernos lo mismo. Por eso sospecha de un programador que dice "Esto ayer funcionaba".
  • Ya que son deterministas, el azar no existe. Si queremos que exista, hay que crearlo.

Dicho todo esto, os planteo un reto que puede parecer hasta más simple que el "Hola Mundo" y que está al alcance de todo el mundo: Describir paso a paso qué tiene que hacer una computadora para realizar un sorteo aleatorio que defina el orden en el que 7 u 8 jugadores deben turnarse como porteros. Para ello podéis comentar esta entrada (mira más abajo) proponiendo un orden numerado de acciones que indique a una computadora qué debe hacer paso a paso. Cada acción debe estar definida en lenguaje natural, nada de lenguajes de programación, ni pseudo-código, ni lenguas muertas. Y cuanto más detallado sea el proceso, más cerca estaremos de que una máquina lo entienda y estaremos mejor preparados para construir nuestra pequeña aplicación por fin en un lenguaje de programación. ¿Te atreves?

Nota: a fin de evitar el Spam y los Trolls los comentarios están moderados. La primera vez que realices un comentario, tendré que aceptarlo. A partir de ahí puedes comentar y automáticamente será aceptado siempre que utilices la misma dirección de correo.

 

 

16 Septiembre, 2014

Posted In: Aprendiendo a programar, Tecnologería

Leave a Comment

Imaginaos que un día os levantáis y decidís que queréis aprender a programar. Os puede parecer absurdo, pero ¿acaso no es absurdo que haya personas que fotografíen una tostada y la cuelgue en Instagram?

Lo primero es elegir un objetivo a largo plazo, una visión en la que nos imaginemos creando la reencarnación del PCFútbol, mi propia mascota virtual en el móvil o una web para colgar fotos de tostadas. Claro que a día de hoy no tenemos ni idea, pero esa visión será la que nos ayude a navegar entre las enormes cantidades de información, a superarnos y a elegir en cada momento las batallas adecuadas.

Tu visión personal será la que te ayude a aprender a programar.

Lo segundo es equiparse con todo lo necesario para programar. No queremos que por una mala planificación no podamos avanzar, y no sabemos qué otro día nos levantaremos con ganas. Para programar se necesitan 4 cosas:

1. Un ordenador

Un ordenador adquirido en los últimos 10 años te vale. Y no tengas miedo, la programación no se va a cargar tu ordenador. Descargar películas y libros piratas sí.

2. Un lenguaje y un entorno de desarrollo

La primera decisión de calado es elegir el lenguaje. Muchos habréis escuchado frases del tipo "Java es mejor que C++", "Javascript es el nuevo Java", "Lo mejor para empezar es Haskell" o "Yo programo en Excel". Paparruchas. Los que ya estén familiarizados con el mundo de la informática seguramente conozcan a E.W. Dijkstra [2], una de las voces más influyentes en la informática al que se le recuerda más por su chorrada de algoritmo [3] que por su apasionada obsesión por hacer programas que funcionen correctamente y su postura frente a la enseñanza de la programación. Detrás de los cientos de lenguajes de programación que existen, se encuentran no más de 5 paradigmas diferentes. Dijkstra defendía que el aprendizaje debía dirigirse hacia los paradigmas de programación en lugar de centrarse en los lenguajes. Cuando una persona aprende un segundo lenguaje, empieza ver las relaciones entre ambos y establece patrones comunes. Esos patrones son los que definen un paradigma. De esta manera, un programador que no aprende al menos dos lenguajes que siguen el mismo paradigma es un programador incompleto; y un programador que conoce un paradigma puede aprender un lenguaje en horas.

El objetivo debe ser aprender un paradigma de programación, no un lenguaje.

El primer objetivo en la formación de un programador debe ser el aprendizaje del paradigma de la programación estructurada. Aquí encajan lenguajes clásicos como C o Pascal. Sin embargo el paradigma predominante hoy en día es una evolución de la programación estructurada denominada programación orientada a objetos. Lenguajes como C++, Java, C#, Ruby o Scala siguen este paradigma. Como es deseable aprender varios lenguajes y la programación orientada a objetos introduce elementos innecesarios para las primeras etapas del aprendizaje, el lenguaje elegido será C.

El entorno de desarrollo es la aplicación (o conjunto de aplicaciones) que nos permitirá escribir código en un lenguaje y que de forma mágica consiga ejecutarlo. Será el encargado de hacer realidad nuestros sueños y de darnos a la vez muchos quebraderos de cabeza. Existen multitud de entornos de desarrollo y elegir el adecuado puede ser una tarea ardua. Yo os recomiendo que comencéis a utilizar Eclipse [1]. Escucharéis opiniones en contra y a favor. Mi consejo es que os evitéis debates espúreos y que lo descarguéis y lo instaléis. Es gratuito, está disponible en todos los sistemas operativos y soporta múltiples lenguajes. Así si un día cambiáis de ordenador o aprendéis un nuevo lenguaje, el trauma por cambiar de entorno será casi inexistente.

3. Un buen libro

La definición de "buen libro" puede ser tan subjetiva como la de "mejor equipo de fútbol" o la de "mejor plato". Hay muchas posibles decisiones y cada persona recomendará uno distinto (algunos incluso a sabiendas de que es malo). Sólo hay una cosa peor que tomar una mala decisión y es no tomarla. Así que dejémonos de debates estériles y vayamos a hablar de EL LIBRO [4] de Herbert Schildt, para mi gusto el mejor escritor de libros didácticos de programación. Un libro con más ejemplos que texto no puede ser malo. Además obliga al lector a poner en práctica los conocimientos y a relacionarlos de forma constante, ofreciendo soluciones a todas las preguntas que plantea. Tiene libros de otros muchos lenguajes como C++, Java o C# que siguen la misma metodología y que son realmente buenos.

4. Motivación

Este aspecto es más importante que cualquiera de los anteriores. Debes creerte capaz de hacer cosas y pensar en que algún día realizarás tu visión. Pronto aprenderás que los retos más difíciles pueden resolverse con facilidad y la mayor chorrada puede suponerte un enorme obstáculo. Pero al final todos los problemas se resuelven y la recompensa debe merecer la pena. Invierte tiempo en buscar tu motivación.

¿Y qué hago ahora?

Muy fácil: equípate. Hazte con un ordenador, instala Eclipse CDT [1], localiza ese libro y dibuja tu visión. Pronto volveré con retos que espero que os motiven.

Referencias

[1] Eclipse CDT.
[2] Puedes leer algo más sobre E.W. Dijkstra aquí.
[3] Si quieres saber qué es y para qué sirve el algoritmo de Dijsktra echa un vistazo aquí.
[4] Herbert Schildt. "C: Guía de autoenseñanza". Ed. McGraw-Hill 2001, ISBN 9788448132040. Lo podéis encontrar en la mayoría de bibliotecas universitarias.

6 Septiembre, 2014

Posted In: Aprendiendo a programar, Tecnologería

One Comment