Con qué programar?

Como ya puse en otro posteo anterior, la idea del blog es que sea como un tutorial para aprender a programar dirigido a quienes quieran empezar “de cero”. Lógicamente, esto supone un orden de los posteos, si bien el orden no es necesarioamente total: es decir puede ser que haya una dependencia de alguno respecto de algún otro (sin el cual no se pueda entender), así como puede haber posteos independientes entre sí en este sentido. Para que sea más fácil para mí, voy simplemente a ir subiendolos a medida que los escriba, aunque tratando de hacer esto respetando ese orden, y también de indicar esas dependencias con enlaces. Si tiene sentido veo de poner un índice.

Y como este es el punto de partida voy a empezar con lo que me pareció lo más básico de todo: ¿con qué programar? Porque si alguen va a empezar tiene que saber qué necesita y si está pensando en si hacerlo o no, también. Como puede que me extienda un poco en esto probablemente haga varios posteos al respecto. Por el momento me interesa destacar que la respuesta a esta pregunta, como tantas otras, depende del momento en que se haga.

Con el paso del tiempo se va haciendo más fácil aprender a programar. Recuerdo cuando trajeron la primera computadora a mi casa sin que existiera conexión a internet. Al prenderla se veía algo como:

C:\>_

El vendedor les había explicado a mis padres como abrir los programas que traía y sólo teníamos un manual que en la tapa decía IBM y que no se entendía nada (al menos para mí en ese entonces, con alrededos de 10 años). El principal uso que yo le daba era jugar una truco que tenía que se caracterizaba por el sonido de “la cumparsita”. La verdad que no era tan común tener una computadora en esa época y menos todavía gente que aprenda a programar.

Foto De MBlairMartin – CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=50244059

Lo que hizo que todo cambie y permitió que surgieran tantos programadores es sin duda no solo que se abarataron las computadoras si no que cada vez es más fácil obtener los conocimientos necesarios para aprender. Este punto es clave: no es tan importante lo que uno sepa como la accesibilidad de lo que uno necesite saber.

Y esto se ve reflejado no sólo en qué permitió el crecimiento del número de programadores. También, por ejemplo, en la velocidad con que cambian las cosas. En pocos años se empieza a adoptar un lenguaje mientras otro se va usando menos, o aparecen formas nuevas de hacer las cosas. También surgen nuevas “tecnologías” que es necesario aprender o programas y herramientas se empiezan a usar y hay que aprender a hacerlo.

Así, esto de ir asimilando nuevos conocimientos es clave para programar, incluso más que la capacidad de retener conocimientos ya adquiridos.

Por otra parte, por su puesto, existen aquellos conocimientos que no cambian, y son las teorías que permitieron y permiten el desarrollo de la computación. Incluyo acá a cosas como la computación cuántica, las maquinas de Turing, la complejidad algorítmica, etc. Por su puesto para aprender todo esto en profundidad conviene ir a la universidad en vez de simplemente buscar posteos en internet (aunque muchas veces ayudan eh).

El enfoque que voy a adoptar, entonces, es práctico y tiene por objetivo orientar con las condiciones básicas que necesita un programador para empezar. Entre estas condiciones hay unas subjetivas, como la disposición a aprender y a resolver los problemas y las cuestiones que van surgiendo. También hay objetivas, como tener una computadora y tener internet.

Así que bueno, vamos a asumir que la disposición a aprender existe, y que hay una conexión a internet y una computadora.

De esas tres condiciones es la más importante sin duda la primera. Por ejemplo, uno podría programar sin internet buscando información en otro lugar. Incluso sin una computadora uno podría aprender a programar. De hecho hay algoritmos famosos que se inventaron antes que las computadores como el algoritmo de Euclides y la criba de Eratóstenes. Y sin ir más lejos el método de multiplicación que aprendemos en el colegio es un algoritmo que ejecutábamos nosotros mismos usando el papel como memoria ram y nuestra memoria (de las tablas) como procesador… Y aprender sobre algoritmos también es aprender a programar.

Algoritmos y programas

Existe una (quizá sutil) diferencia entre lo que es un programa y lo que es un algoritmo. Un programa es algo que puede ejecutar una máquina, tan simple como eso. Si configuro (o seteo usando un anglicismo común) el lavarropas para que extienda el lavado durante cierta cantidad de tiempo y a cierta temperatura, con (o sin) centrifugado, estoy, claramente, programando.

De la misma manera, las computadoras suelen tener un set de instrucciones y los programas que corren básicamente le van diciendo qué instrucción ejecutar en cada momento. Sin embargo, son muy pocos los programadores que conocen todas las instrucciones que tiene la maquina, que son realmente muuchas ver, por ejemplo esto.

Los programadores, hoy por hoy, usan lenguajes de programación que son muy distintos al set de instrucciones de la computadora (llamado assembly) y muchos más fáciles de entender. En realidad, algunos se parecen más y otros menos, pero ninguno se parece demasiado. De hecho, uno podría decir que apretar Ctrl + f para buscar una palabra en una página de internet es darle una instrucción a la computadora para que haga algo, y uno lo hace sin tener ni idea de cuáles son las instrucciones del set de instrucciones que se están usando para eso.

Este último punto es muy importante: no es necesario saber cómo funciona internamente algo para poder usarlo. Hay que conocer sólo su funcionalidad. Si aprendemos, por ejemplo, python, no necesitamos aprender el instruction set de lo procesadores de intel, porque esto ya está hecho y resuelto en otro nivel, adentro del lenguaje mismo. Y esto aplica a todo.

Por otra parte, un algoritmo no necesariamente está escrito para poder correr en una computadora. Por ejemplo, uno cuando hace una multipliación con lapiz y papel está siguiendo un algoritmo, y no hay ninguna computadora involucrada. Pero el algoritmo es una sucesión de pasos a seguir que sirven para resolver un problema. Entonces, podemos escribir un programa para que una computadora resuelva un problema siguiendo un algoritmo.

Una cosa más, porque hoy en día se usa mucho la palabra algoritmo en un sentido que es un poco distinto: por ejemplo en “el algoritmo me sugiere cosas que no me gustan”. Bueno, acá estaríamos suponiendo que la computadora (el celular) está corriendo un programa que sigue un algoritmo que determina que recomendar. Pero en este caso estamos probablemente hablando de machine learning. Y si bien esos programas son programas como cualquier otro que terminan dando una a una una serie de instrucciones a la computadora, esos algoritmos muchas veces son algoritmos heurísticos y se diferencias porque a veces resignan la solución exacta a un problema por una aproximación.

Nosotros vamos a empezar (como es habitual) con los algoritmos que simplemente dan los pasos para la solución correcta de un problema (léase pregunta) y después hablaremos, quizá, de las heurísticas.

Así, programar es para nosotros hacer que la computadora resuelva algo: primero tenemos un problema, por ejemplo, dados dos números, obtener la suma de ambos. Después el algoritmo que lo resuelve. Por ejemplo:

1. Disponer los números uno arriba del otro
   alineados a la derecha.
   Por ejemplo si los números son 42 y 1359:
//   42
// 1059
2. Recorer los dígitos de derecha a izquierda
   de la siguiente manera:
2.a Sumar los dos dígitos (si hay uno solo
    tomar ese)
2.b Si la suma es menor a 10 (o sea es un sólo
    digito) entonces en la fila del resultado
    escribir ese número en la column aque va.
    Si la suma es mayor que 9 (en tal caso es
    entre 10 y 18), entonces sumar uno a la
    columna siguiente y dejar el digito de la
    derecha en la fila con el resultado en la
    columna correspondiente.

   Usando el mismo ejemplo:
//  11 <-- "carry" o lo que me llevo
//   42
// 1059
// ----
// 1101

Acá en los libros de ciencias de la computación suele venir la parte donde se demuestra que el algoritmo es correcto, es decir, que computa exactamente la respuesta buscada. En la práctica del programador esto suele ser menos habitual. Primero porque a veces se usan algoritmos ya demostrados, a veces porque la demostración “formal” sería muy engorrosa y es muy fácil convencerse intuitivamente de que es correcto, a veces porque tenemos tests que prueban ese algoritmo que nos dan un poco de seguridad.

Estos tests básicamente consisten en correr el programa alimentándolo con distintos valores para los cuales ya sabemos la respuesta (o sea, la conocemos independientemente del programa, porque lo calculamos a mano o usamos otro programa que ya está chequeado) y entonces comparamos el resultado esperado con el resultado del programa. Esto no nos garantiza un ciento por ciento que el programa es correcto (como sí lo haría una demostración formal) pero es la práctica habitual en la industria.

Con esto no sólo podemos detectar si un algoritmo es incorrecto (un resultado positivo no nos garantiza que esté bien, pero uno negativo nos garantiza que está mal), también no advierte muchos errores en el programa que no son del algoritmo, si no que tipeamos algo mal, o al llevarlo a un lenguaje de programación particular una parte no quedo reflejando exactamente lo que el algoritmo decía que había que hacer. Es decir, por más que se haya demostrado que el algoritimo es correcto, al implementarlo podemos hacer algo mal.

Esto es importante. Además del problema y el algoritmo, necesitamos el lenguaje de programación. Dependiendo del lenguaje el programa va a ser muy diferente. Pero antes de empezar a hablar de los lenguajes (los más habituales hoy en día) vamos a considerar algunas otras cuestiones “preliminares” en la siguiente sección como qué usar para escribir esos programas, qué usar para ejecutaros…

En fin, además de una computadora e internet, es necesario algo en qué aplicar la programación. Si no puede que resulte muy aburrido. Y como al aprender uno hace cosas “de juguete” estamos hablando de aplicaciones simples, no rocket science. Y entre los requerimientos más concretos, aparte de la compu e internet, incluiría el sistema operativo (q por lo general viene con la máquina), un editor de texto, un compilador (o un intérprete si el leguaje es “interpretado”), un control de versiones y, por qué no, un debbuger. Así que en los próximos posteos seguimos con los preparativos…


Una respuesta a “Con qué programar?”

Deja un comentario

Diseña un sitio como este con WordPress.com
Comenzar