Cómo contratar diseño web sin hacer el ridículo

Capítulo 4

Desmitificando la programación.

En este capítulo aprenderás…

  1. Qué es un lenguaje de programación
  2. Qué es el código fuente
  3. Qué es un bug
  4. Qué exactamente es una versión alpha y una versión beta
  5. A pensar como un programador y a diseñar programas
  6. A escribir tus primeros programas
  7. Qué es una librería y qué es un framework
  8. Qué hace a un programa ser más eficiente
  9. Qué hace a un programador ser más económico
  10. Qué es un algoritmo
  11. Qué es el software libre
  12. Modelos de negocio en la comercialización de software

¿Qué es un lenguaje de programación?

Todo el rollo que te he contado hasta ahora ha sido para poder contestar a la pregunta “¿qué es la programación?” sin tener que incluir la palabra “magia” en mi respuesta. A estas alturas ya sabes que un ordenador es una máquina que recibe, almacena, procesa y devuelve información; y que esa información son unos y ceros.

Con la programación somos capaces de enviarle información a un ordenador para que él se encargue de almacenarla, procesarla y devolvernos otra información. Sin embargo, no verás a los informáticos escribiendo unos y ceros delante de la pantalla, para eso existen los lenguajes de programación. Los lenguajes de programación son una forma, comprensible por humanos, de dar órdenes a los ordenadores.

A través de sentencias de texto que siguen unas reglas sintácticas y semánticas, enviamos datos y órdenes a un ordenador. Al conjunto de dichas sentencias de texto se le denomina código fuente o source code. Al proceso de escritura, prueba y depuración del código fuente se le llama programación. En el contexto informático, desarrollo es sinónimo de programación.

—¿Hacéis programación?

—Sí, claro, tal y como pone en este folleto.

—Ah… sí que había visto que hacéis desarrollo, pero programación no estaba seguro.

(Conversación real que mantuve con un visitante a una feria de marketing online).

El código fuente se convierte a unos y ceros por medio de otros programas informáticos (que no voy a explicar en este libro) llamados compiladores o intérpretes.

Algunos lenguajes de programación son: Ada, PHP, Java, JavaScriptRuby, Python, Perl, Lisp, B, C, C#, C++, D, Cobol, Pascal, DelphiActionScript, BASIC, Visual Basic, AppleScript … existen cientos de lenguajes de programación.

PHP es el lenguaje de programación más usado en internet. Nació como las siglas de Personal Home Page, que significa “Página de Inicio Personal”, pero en la actualidad se refiere a “PHP: Hypertext Preprocessor“, un retroacrónimo que se traduce como “PHP: Preprocesador de Hipertexto”. Facebook está programado en PHP.

Java y JavaScript son dos lenguajes de programación diferentes y sin relación entre ellos, a excepción del nombre.

Cada lenguaje de programación tiene distintas características, carencias, eficiencia, facilidad de aprendizaje, velocidad de escritura, programadores en el mercado, costes de mantenimiento o producción, o es más adecuado para unos u otros propósitos. Existen fuertes rivalidades entre los defensores de diferentes lenguajes de programación.

El sitio web 99 Bottles of Beer contiene un mismo programa escrito en 1.500 lenguajes de programación diferentes. El programa se limita a mostrar la letra de la canción 99 Bottles of Beer (“99 Botellas de Cerveza”).

Bugs y parches

Un bug es un error en el código fuente. Todos (sí, todos, absolutamente todos) los programas tienen bugs en su código fuente (y si no, que se lo digan a Microsoft, que tardó 20 años en detectar un bug crítico en Windows). Es por eso que es habitual que se publiquen sucesivas versiones de cualquier programa informático, cada versión corrigiendo errores de versiones anteriores. A la detección y corrección de bugs se le denomina debugging. Bug es una palabra inglesa que significa bicho.

Polilla pegada en una página de la bitácora donde se recogía la actividad realizada en la computadora Harvard Mark II, junto a la frase:

Imagen 4.1. Sorprendentemente, el término bug ya existía cuando, el 9 de septiembre de 1947, se encontró una polilla en los circuitos de la computadora Harvard Mark II –una de las primeras de la historia–, que estaba causando errores de funcionamiento. En el diario que se puede ver en la imagen quedó reflejado con la frase: “Primer caso en el que realmente se encuentra un bug.”
(Imagen de dominio público cortesía del Naval Surface Warfare Center )

Un parche (o patch en inglés) es la actualización de software que soluciona uno o varios bugs de dicho software. El término proviene de de la época en la que se usaban tarjetas perforadas, pues se usaban parches adhesivos para tapar agujeros perforados por error en las tarjetas.

Papel continuo perforado en el que se observa que algunos de los agujeros han sido cubiertos con una pequeña pieza de cinta adhesiva.

Imagen 4.2. Código fuente en un papel continuo perforado que alguien ha corregido cubriendo algunos de los agujeros con cinta adhesiva. Pertenece a la computadora Harvard Mark I.
(Imagen bajo licencia CC BY-SA 3.0 cortesía de ArnoldReinhold)

Los términos alpha y beta se utilizan para referirse a las primeras versiones de un software. Típicamente, las versiones alpha van destinadas al uso de otros desarrolladores y programadores, y las versiones beta al uso de un pequeño grupo de usuarios finales (los beta testers o beta users), con el objetivo de que éstos localicen los primeros bugs.

Algunas empresas, como Google o United Airlines, recompensan económicamente a quienes encuentran bugs en su software (no es para menos, hubo un día en el que United Airlines tuvo que suspender todos sus vuelos durante dos horas debido a un fallo informático).

Lógica condicional

A diferencia de los lenguajes HTML o CSS, un lenguaje de programación permite expresar lógica condicional, es decir, que los resultados producidos por la ejecución de un programa sean distintos según cuáles sean los datos de entrada.

Pensando como un programador

Puede que no conozcas el vocabulario y la sintaxis de ningún lenguaje de programación, pero si sabes dar órdenes en tu idioma ya tienes todo lo necesario para diseñar un programa.

Para implementar los programas que diseñes sí necesitarás a un programador, que es alguien que sí conoce el vocabulario y sintaxis de un lenguaje de programación, pero para entender cómo funciona un programa no necesitas nada de eso.

Para diseñar un programa primero establecerás un objetivo, que será ejecutar una tarea. Con ese objetivo en mente deberás pensar qué pasos tomarías, si fueras tú en lugar del ordenador, el que debe cumplimentar esa tarea:

  • Paso 1: imagina cuál es el proceso para ejecutar la tarea que tienes encomendada.
  • Paso 2: deconstruye el proceso en los pasos más pequeños posibles.
  • Paso 3: escribe, de manera secuencial, los pasos en el orden necesario para que la tarea se ejecute satisfactoriamente.
  • Paso 4: (un programador) traduce tus instrucciones a un lenguaje de programación.

En este capítulo diseñarás algunos programas, y de distintas formas, de la misma manera en que lo haría un programador. Como no conoces ningún lenguaje de programación utilizaremos pseudo-código. El pseudo-código es un lenguaje de programación ficticio, fácil de aprender, que usa el lenguaje natural. El pseudo-código no tiene unas reglas estrictas, y aunque se parece a un lenguaje de programación real, es suficiente con que sirva para que se entiendan entre sí las personas que están trabajando con él.

Al final del capítulo traduciremos parte del pseudo-código que escribiremos a continuación a un lenguaje de programación real.

En programación, una variable es un elemento que puede adoptar distintos valores durante la ejecución del programa.

Captura de pantalla del juego

Imagen 4.3. Juegos web como Lightbot o juegos para dispositivos móviles como Cargo-Bot inculcan, de una manera divertida, la forma de pensar para programar.
(La imagen superior es una captura de pantalla del juego Lightbot, que es una marca registrada.)

Captura de pantalla del vídeo de code.org para promocionar

Imagen 4.4. code.org es un movimiento que pretende enseñar a todo el mundo a programar. Una vez al año organizan el evento Hour of Code (“Hora del Código”) donde invitan a que cualquiera dedique una hora de ese día a aprender a programar.
Bill Gates, Mark Zuckeberg (en la imagen anterior), Ashton Kutcher, Barack Obama o LeBron James son sólo algunos de los personajes conocidos que promueven esta iniciativa. Apple también lo hace, cediendo sus ordenadores y empleados para enseñar, gratuitamente durante una hora, programación a cualquiera que acuda a una tienda suya.
(Imagen bajo licencia CC BY-NC-SA 4.0 cortesía de code.org.)

Según code.org, de aquí a 2020 se crearán 1,4 millones de puestos de trabajo para programadores, pero para entonces sólo se habrán licenciado como programadores 400.000 personas.

Multitud de jóvenes con sus ordenadores sentados alrededor de varias mesas

Imagen 4.5. Eventos llamados hackathons juntan a programadores para construir ideas o resolver un reto. La imagen superior corresponde a la hackathon anual de Wikimedia de 2013. Wikimedia es la organización sin ánimo de lucro detrás de la Wikipedia, entre otros proyectos.
(Imagen bajo licencia CC BY 2.0 cortesía de Sebastiaan ter Burg.)

Tu primer programa: un sumador de dos números

  • Enunciado: escribe un programa que sume dos números.
  • Pasos:
    1. Pedirle al usuario el primer número de la suma.
    2. Memorizar ese primer número.
    3. Pedirle al usuario el segundo número de la suma.
    4. Memorizar ese segundo número.
    5. Sumar el primer número con el segundo y almacenar el resultado.
    6. Mostrar el resultado al usuario.
  • Resolución en pseudo-código:
    imprimir("Introduce un número y pulsa enter");
    	
    leer(numero_1);
    	
    imprimir("Introduce otro número y pulsa enter");
    	
    leer(numero_2);
    	
    resultado_suma = numero_1 + numero_2;
    	
    imprimir(resultado_suma);
  • ¿Qué se aprende con este ejercicio?
    • Todas las órdenes se escriben en minúsculas (ej.: imprimir, leer).
    • Usamos la orden imprimir cuando queremos mostrar algo por pantalla.
    • El contenido de la orden va entre paréntesis junto a la sentencia de la orden, por ejemplo: imprimir("Introduce un número y pulsa enter");
    • El texto a mostrar por pantalla va entrecomillado, las variables numéricas (como numero_1, numero_2 y resultado_suma) no.
    • Escribimos una orden por línea.
    • Declaramos el final de cada orden con punto y coma (;).
    • Usamos la orden “leer” para memorizar un dato.
    • Guardamos los datos con los que trabajamos en variables (ejemplos: numero_1, numero_2, resultado_suma).
    • Los nombres de las variables o de las órdenes no pueden contener espacios.
    • Podemos realizar operaciones aritméticas (suma, resta, división, multiplicación, …).
    • Podemos guardar un dato en una variable usando el signo =, ej.: resultado_suma = numero_1 + numero_2;.

Nota: estas reglas sintácticas y semánticas son normas de nuestro particular pseudo-código, aunque también son así en muchos lenguajes de programación.

Fotografía de la parte de la Máquina Analítica que se expone en el Museo de Ciencia de Londres, que Charles Babbage llegó a construir casi por completo. Se trata de una máquina de metal y madera de enormes proporciones y peso.

Imagen 4.6. El matemático británico Charles Babbage (1791—1871) diseñó la primera computadora programable (a la que llamó máquina o motor analítico). También fue él quien pensó en el uso de tarjetas perforadas para este propósito. La hazaña es mayor de lo que parece, pues se trata de una máquina mecánica (la electrónica analógica apareció más de 30 años después de la muerte de Babbage, y la electrónica digital, que permite la construcción de CPUs o memorias no llegaría hasta casi un siglo más tarde).
Pese a diseñarla, problemas de financiación impidieron a Babbage concluir su construcción.
(Imagen bajo licencia CC BY-SA 2.5 cortesía de Bruno Barral (ByB).)

Babbage se inspiró en los telares del comerciante francés Joseph Marie Jacquard para crear las tarjetas perforadas. Con el propósito de optimizar el proceso de producción, Jacquard inventó un sistema de tarjetas perforadas para que sus máquinas tejieran con mayor facilidad que hasta entonces diferentes patrones en la tela.

Fotografía en blanco y negro de Charles Babbage

Imagen 4.7. Babbage intercambió correspondencia con Ada Lovelace durante la construcción de su máquina analítica y hasta nuestros días ha llegado la polémica acerca de en qué medida Ada se basó en las ideas de Babbage para programar el primer algoritmo de la historia.

El inimaginable ingenio detrás de los ordenadores mecánicos:

Tu segundo programa: aprendiendo a comparar

  • Enunciado: determina cuál es el mayor de dos números.
  • Pasos:
    1. Pedirle al usuario el primer número.
    2. Memorizar ese primer número.
    3. Pedirle al usuario el segundo número.
    4. Memorizar ese segundo número.
    5. Comparar el primer número con el segundo.
    6. Si el primer número es mayor que el segundo, mostrar el primer número.
    7. Si el primer número es menor que el segundo, mostrar el segundo número.
  • Resolución en pseudo-código:
    imprimir("Introduce un número y pulsa enter");
    	
    leer(numero_1);
    	
    imprimir("Introduce otro número y pulsa enter");
    	
    leer(numero_2);
    	
    si(numero_1 > numero_2) imprimir(numero_1);
    	
    sino_si(numero_2 > numero_1) imprimir(numero_2);
    	
    sino imprimir("Los dos números son iguales");
  • ¿Qué se aprende con este ejercicio?
    • Con las órdenes si, sino_si y sino podemos condicionar el resultado de un programa.
    • Es posible hacer comparaciones entre números: mayor que (>), menor que (<), mayor o igual que (>=), menor o igual que (<=) o igual que (==).

“Todo el mundo debería aprender a programar porque enseña cómo se debe pensar.” —Steve Jobs (1955—2011; co-fundador de Apple).

Países como España, Reino Unido o Estonia ya enseñan programación desde los primeros años del colegio.

Coche Tesla blanco, de frente, dentro de un tunel.

Imagen 4.8. El software forma parte de cada aspecto de nuestras vidas. Todo lo que nos rodea está programado o la programación ha sido necesaria para su fabricación. El fabricante de automóviles Tesla soluciona bugs y mejora los coches de sus clientes a través de actualizaciones de software.
(Imagen bajo licencia CC BY 2.0 cortesía de CONCAVO WHEELS.)

Tu tercer programa: vectores, bucles y condiciones

  • Explicación inicial:
    • Vectores: un vector o array es una variable que en lugar de un solo dato puede almacenar varios. Por ejemplo, el siguiente vector, al que he llamado lista_numeros, es el vector que necesitarás para resolver este ejercicio:
      Índice 1 2 3 4 5
      Valor 40 0 8 32  92

      Tabla 4.9. Vector de 5 posiciones, cada una con un número entero como valor.

    • Este vector tiene 5 posiciones (de la 1 a la 5) y en cada una de ellas se almacena un valor. A las posiciones de un vector se les llama índice.
    • Así es como mostraríamos el valor almacenado en una posición concreta de un vector: imprimir(lista_numeros[4]);. Esta línea mostraría en la pantalla el valor 32.
    • Si quisiéramos sustituir el valor almacenado en la posición 3 escribiríamos la siguiente sentencia: lista_numeros[3] = 53;
    • Si quisiéramos comparar los dos primeros valores del vector haríamos lo siguiente: si(lista_numeros[1] > lista_numeros[2]);
    • Puedes incrementar el valor de una variable en una unidad de la siguiente forma: nombre_de_la_variable = nombre_de_la_variable + 1;.
    • Los bucles permiten que un grupo de órdenes se ejecuten repetidamente mientras se cumple una condición.
  • Enunciado: tienes un vector con 5 números enteros almacenados. Los números han sido generados de manera aleatoria. Debes mostrar por pantalla el mayor de ellos.
  • Pasos:
      1. Almacenar el primer número del vector en una variable.
      2. Comparar el primer número del vector con el segundo número del vector.

        Trabajamos con un vector llamado

        Imagen 4.10. Representación gráfica de la comparación del primer elemento del vector con el segundo elemento.

      3. Almacenar en una variable el mayor de los números recién comparados.

        De los dos números comparados en el paso anterior, 40 y 0, 40 es el mayor, y se almacena en la variable llamada

        Imagen 4.11. El mayor de los dos primeros elementos del vector se almacena en una variable.

      4. Comparar el número almacenado en la variable con el número del vector que sigue al último número leído en el vector.

        Se compara el valor almacenado en la variable, 40, con 8, que corresponde al valor de la siguiente posición del vector respecto al valor de la última posición del vector leída.

        Imagen 4.12. En la imagen superior, el tercer elemento del vector se compara con el número almacenado en la variable.

      5. Si el número recién leído en el vector es mayor al almacenado en la variable, sustituir el valor de la variable por el último número recién leído en el vector, si no es así, pasar al siguiente paso.
      6. Si el número recién leído en el vector no es mayor que el almacenado en la variable, volver al punto 3.
  • Resolución en pseudo-código:
    
    lista_numeros = [40, 0 , 8, 32, 92];
    
    indice = 1;
    
    numero_mayor = lista_numeros[indice];
    
    repetir_bucle_mientras(indice < longitud(lista_numeros)) {
    
      si(lista_numeros[indice+1] > lista_numeros[indice]) numero_mayor = lista_numeros[indice+1];
    
        indice = indice + 1; }
    
    imprimir(numero_mayor);
    
  • ¿Qué se aprende con este ejercicio?
    • Un vector es una variable que puede almacenar varios datos.
    • A los distintos valores de un vector se accede a través del índice.
    • Podemos refererirnos al índice con una variable, en lugar de directamente con el valor.
      • Por ejemplo: lista_numeros[indice] en lugar de lista_numeros[1].
    • Es posible conocer el tamaño de un vector con la función longitud, de la siguiente manera: longitud(nombre-del-vector), que en el programa anterior es longitud(lista_numeros).
    • Existen bucles (o loops en inglés) que se repiten mientras se cumple una condición. En el ejemplo anterior hay un bucle que se repite mientras que el valor de la variable indice sea menor al de la variable tamano_vector. El valor de la variable indice se incrementa en una unidad cada vez que se ejecuta el bucle. El inicio y fin de un bucle se indica con la apertura y cierre de llave ({ y }), respectivamente.
    • Podemos hacer operaciones aritméticas usando el índice de un vector, ej.: lista_numeros[indice+1].
  • Reflexiones
    • ¿Qué ocurrirá cuando dos valores almacenados en el vector sean iguales? ¿Qué resultado mostrará el programa?

De momento no resolveremos esa pregunta, sólo se trata de una muestra de la dificultad en la programación y de cuánto influye en los resultados la calidad del programador.

Un programa similar a este se podría usar en una tienda online para mostrar el producto más caro o más barato de una base de datos.

Captura de pantalla de la opción en el sitio web de Amazon que permite ordenar productos desde el más caro al más barato.

Imagen 4.8. Amazon y otras muchas tiendas online permiten al usuario ordenar los productos por precio.

Placa en la entrada a las oficinas centrales de Apple. Dice:

Imagen 4.14. Las oficinas centrales de Apple se encontraban en el número 1 de la calle Infinite Loop (bucle infinito). Un bucle infinito es un problema que ocurre en programación cuando un programa entra en un bucle y por un error del programador nunca se dan las condiciones para que el programa salga de dicho bucle.
(Imagen bajo licencia CC BY-SA 3.0 cortesía de Joe Ravi.)

Librerías

Una librería es un software reutilizable en el desarrollo de otro software. Una librería consiste en un conjunto de funciones pre-programadas.

El uso de librerías ahorra trabajo a los programadores y, teóricamente, produce software con menos fallos de programación y de seguridad (aunque una librería puede introducir fallos de los que el programador no es consciente).

jQuery y mootools son librerías muy populares para el lenguaje de programación JavaScript. Apache Hibernate es una librería muy usada para programar en Java.

Un cuarto programa: comparador de números usando una librería

  • Enunciado: tienes un vector que contiene 5 números enteros. Debes mostrar por pantalla el mayor de ellos. Lo resolveremos usando una librería ficticia.
  • Resolución en pseudo-código, usando un librería ficticia:
    <insertar libreria_ficticia>
    
    lista_numeros = [40, 0 , 8, 32, 92];
    
    numero_mayor = obtener_valor_mayor(lista_numeros);
    
    imprimir(numero_mayor);
  • ¿Qué se aprende con este ejercicio?
    • Una librería contiene funciones de uso común “pre-programadas”.
    • El uso de una librería permite ahorrar tiempo.
    • Usar una librería requiere que el programador aprenda nuevos términos.
    • Lo normal es que el programador no profundice en entender qué es exactamente lo que está haciendo una librería para producir un resultado, lo que conlleva que puedan existir fallos no detectados.
    • Al reducir la cantidad de código, el uso de una librería puede reducir los costes y tiempos necesarios para su mantenimiento y depuración, por contra puede requerir programadores con mayor cualificación.

Frameworks

La palabra framework es traducible como “marco de trabajo” y su definición y utilidad podría parecer idéntica a la que hace unos párrafos usaba para explicar qué es una librería, sin embargo existen grandes e importantes diferencias.

En una librería el programador usa el lenguaje de programación para acceder a las funciones que dicha librería proporciona. En un framework el programador no usa el lenguaje de programación, sino que usa exclusivamente un conjunto de reglas sintácticas y semánticas establecidas por el framework para acabar generando código en el lenguaje de programación. Un framework crea una capa por encima del lenguaje de programación, una capa que permite al programador abstraerse de lo que está ocurriendo a nivel de lenguaje de programación.

Es decir, en el caso de las librerías el programador usa el lenguaje de programación para acceder a ellas. En el caso de los frameworks el programador usa el lenguaje del framework para generar código en el lenguaje de programación.

Ruby on Rails es un entorno de programación muy popular. Ruby es un lenguaje de programación, y Rails un framework para Ruby que permite desarrollar software a una velocidad mayor a la que se desarrollaría ese mismo software usando únicamente Ruby, sin el framework Rails. Sinatra es otro framework para Ruby.

Otros frameworks populares son Django para el lenguaje de programación Python; Symfony, Laravel o Zend para el lenguaje de programación PHP; o muchos de los que existen para el lenguaje de programación Java, como Grails, Apache Struts, Spring o Apache Wicket.

Twitter está programado en Ruby on Rails y Java. Además, Twitter es el creador de Bootstrap, un framework muy popular para el diseño y desarrollo de interfaces gráficas.

Programando con un lenguaje de programación real

Recordemos el pseudo-código del tercer ejercicio:

lista_numeros = [40, 0 , 8, 32, 92];

indice = 1;

numero_mayor = lista_numeros[indice];

repetir_bucle_mientras(indice < longitud(lista_numeros)) {

  si(lista_numeros[indice+1] > lista_numeros[indice]) numero_mayor = lista_numeros[indice+1];

  indice = indice + 1;
}

imprimir(numero_mayor);

Ahora transformaremos este pseudo-código a dos lenguajes de programación: PHP y C. Pero antes de nada, un breve diccionario inglés-castellano:

  • array: vector
  • while: mientras
  • if: si
  • print: imprimir
  • count: contar
  • main: principal
  • integer: número entero, se abrevia como int
  • size of: tamaño de

Código en PHP

$lista_numeros = array(40, 0 , 8, 32, 92);

$indice = 1;

$numero_mayor = $lista_numeros[indice];

while($indice < count($lista_numeros)) {

  if($lista_numeros[$indice+1] > $lista_numeros[$indice]) {

    $numero_mayor = $lista_numeros[$indice+1];

    }

    $indice = $indice + 1;
}

print $numero_mayor;
  • ¿Qué se aprende de PHP con este ejercicio?
    • Las variables se establecen y utilizan con el signo del dólar ($) al inicio del nombre de éstas.
    • count es la función que sirve para conocer el tamaño de un array.
    • El contenido dentro de la sentencia if va entre llaves ({}).

Lo único que falta para que este código se convirtiera en un programa es abrir un editor de texto, crear un nuevo documento, pegar este código en dicho documento y guardarlo con un nombre como contador.php. Más adelante en el libro explico cómo se ejecutan los programas en PHP.

Código en C

#include <stdio.h>

void main() {

  int lista_numeros[5] = { 40, 0 , 8, 32, 92 };

  int indice = 1;

  int numero_mayor = lista_numeros[indice];

  while(indice < sizeof(lista_numeros)/sizeof(lista_numeros[0])) {

    if(lista_numeros[indice+1] > lista_numeros[indice]) {

      numero_mayor = lista_numeros[indice+1];

    }

    indice = indice + 1;
  }

  printf("%i", numero_mayor);

}
  • ¿Qué se aprende de C con este ejercicio?
    • #include es una directiva y sirve para incluir un archivo dentro de nuestro programa. El archivo stdio.h es donde está definida la función printf que usamos al final del código anterior. Es una librería.
    • void main() es el nombre de la función principal del programa. Todos los programas de C tienen al menos una función principal.
    • El contenido de la función void main() va entre llaves ({}).
    • Es requisito especificar el tipo de dato que almacenarán las variables (por ejemplo int, del inglés integer, que significa “número entero”).
    • sizeof(lista_numeros)/sizeof(lista_numeros[0]) puede parecer algo complejo, pero simplemente sirve para obtener el número de elementos del array lista_numeros.
    • El contenido dentro de la sentencia if va entre llaves ({}).
    • Para mostrar el resultado por pantalla se usa la sentencia printf.
    • La penúltima línea del código (printf("%i", numero_mayor);) es necesaria para mostrar por pantalla el resultado de la ejecución del programa. printf es el comando “imprimir” (que significa mostrar por pantalla), el texto entrecomillado indica que se imprimirá una variable de tipo i (integer) y lo que sucede a la coma (numero_mayor) es el nombre de la variable cuyo contenido se imprimirá.

PHP es un lenguaje para escribir aplicaciones web, mientras que con C se escriben aplicaciones de escritorio.

Objective-C es un lenguaje de programación evolución de C que sirve para programar aplicaciones para iPhone y iPad y con el que también se pueden programar aplicaciones de escritorio para Mac OS X. C es, a su vez, una evolución de B, lenguaje con el que se programó la primera versión de UNIX.

El ingeniero informático Dennis Ritchie creó el lenguaje de programación C basándose en el lenguaje de programación creado previamente por Ken Thompson, que fue con quien anteriormente había co-creado la primera versión del sistema operativo UNIX. Las aportaciones de Dennis Ritchie a la informática son tales que existe un movimiento para declarar el 30 de octubre como el día de Dennis Ritchie.

Bill Clinton (a la derecha) estrecha la mano de Dennis Ritchie mientras Kenneth Thompson contempla la escena. De los cuellos de Ritchie y Thompson cuelga una medalla dorada.

Imagen 4.15. Kenneth Thompson (izquierda) y Dennis Ritchie (derecha) recibiendo la Medalla Nacional de Tecnología de manos del presidente Bill Clinton, en 1999.

Swift es otro lenguaje de programación creado por Apple para desarrollar aplicaciones para sus dispositivos.

Las aplicaciones para Android se programan en Java, lenguaje que también sirve para programar aplicaciones web o de escritorio para casi cualquier sistema operativo. Java fue creado por la empresa Sun Microsystems, actualmente propiedad de Oracle Corporation.

.NET es un framework creado por Microsoft y que sirve, cómo no, para programar aplicaciones web y de escritorio para Windows. Una aplicación web escrita con .NET funcionará en cualquier navegador y sistema operativo, pero el sistema operativo del servidor que aloja la aplicación deberá ser Windows. Esto se entenderá mejor cuando lleguemos al Capítulo 7. ¿Cómo funciona una página web?.

Google también cuenta con su propio lenguaje de programación, Go.

Lenguajes compilados y lenguajes interpretados

Para convertir este código en C en un programa ejecutable deberías instalar en tu ordenador un compilador de C, abrirlo, crear un nuevo documento, pegar el código fuente en dicho documento y hacer clic en el botón de compilar programa. Eso generaría un archivo con un nombre como, por ejemplo, programa.exe, y haciendo doble clic en él, el programa se abriría y mostraría el mayor número de los almacenados en el vector.

Como has visto, la forma de ejecutar un programa escrito en C es distinta a la forma de hacerlo en PHP. El programa de C hay que compilarlo, y ejecutarlo es tan fácil como hacer doble clic sobre él desde un ordenador cualquiera. Como veremos en el capítulo 7, el programa en PHP será ejecutado por un servidor y no será necesario compilarlo, pues PHP es un lenguaje interpretado, a diferencia de C, que es un lenguaje compilado.

La compilación de un programa produce un archivo ejecutable que contiene las órdenes escritas en el código fuente dispuestas de una manera más óptima para el procesador y, por tanto, los programas compilados son más eficientes que los interpretados. Por contra, los lenguajes interpretados permiten ver de manera inmediata el resultado de un cambio en el código, ahorrando al programador el tiempo de compilar el programa tras cada modificación del código.

Esta es una explicación básica y divulgativa de las diferencias entre lenguajes compilados e interpretados. La compilación e interpretación de programas es una de las áreas más complejas (e interesantes) de la programación.

Primer plano de Grace Murray Hopper, vestida de militar, luciendo sus condecoraciones, con 78 años.

Imagen 4.16. No voy a entrar en los detalles de las diferencias entre los lenguajes compilados e interpretados, pero es obligado contar que fue una mujer, Grace Murray Hopper (1906—1992), militar estadounidense, la programadora del primer compilador, en 1952.
(Imagen de dominio público cortesía de James S. Davis.)

Programador bueno, programador malo

Dos programas aparentemente idénticos pueden estar escritos con códigos muy diferentes. Uno puede requerir de 20 operaciones para realizar una tarea mientras que otro consigue el mismo resultado en tan sólo 5 operaciones. El segundo programa consumirá menos recursos del ordenador donde se ejecute y, por tanto, funcionará más rápido, consumirá menos energía (batería), y será más económico de mantener.

“No hay talento más valioso que el de no usar dos palabras cuando basta una.” —Thomas Jefferson (1743—1826) .

Si quieres compararlos con algo, lo más parecido a los programadores son los escritores.

Algunos escritores pueden escribir un adictivo libro que venderá millones de copias, mientras otros crearían algo tan aburrido ¡que sería capaz de apagar el fuego al que lo eches!

Aun así, ambos habrán producido un libro y, por tanto, ambos son escritores, y tú no serías capaz de notar la diferencia a menos que te pongas a leer el libro.

—Piet Handermann, Good vs Bad Developers

En un estudio […] con un grupo de programadores con experiencia, la diferencia entre los mejores y peores programadores resultó de 10 a 1 en productividad y de 5 a 1 en la velocidad del programa.

—Fred Brooks, The Mythical Man-Month

Este es el motivo principal por el que es un grave error limitarse a valorar la cuantía de distintos presupuestos a la hora de emprender un proyecto que requiere desarrollo de software. Por muy barato que sea un presupuesto, nada será más caro que acabar con un código ineficiente y difícil de mantener.

Spaguetti code o código espaguetti es una expresión que se usa en el mundo informático para referirse al código fuente de baja calidad.

El juego de Pinball que venía con Windows XP fue eliminado de la siguientes versiones de Windows porque cuando hubo que actualizarlo para que funcionase con el nuevo sistema operativo nadie en Microsoft entendía el código fuente del juego.

Un problema, muchas soluciones

  • Enunciado: una universidad paga una beca de 200 €/mes a los alumnos con una nota media superior a 6. Tras los últimos recortes en educación se han visto obligados a reducir la cuantía de la beca en un 13% a aquellos alumnos con una nota media inferior a 8.
    Las notas de los alumnos se almacenan en un vector y la cuantía de las becas en otro, por ejemplo:

    Número de expediente (índice de los vectores) 1 2 3 4 5
    Vector notas 5,1 8,2 5,9 7,8 6,3
    Vector becas 0,00 € 200,00 € 0,00 € 200,00 € 200,00 €

    Tabla 4.17. Beca recibida por cada estudiante.

Escribe un programa que modifique la cuantía del vector_becas según las nuevas necesidades.

  • Resolución 1 en pseudo-código:
    	indice = 1;
    	
    	repetir_bucle_mientras(indice < longitud(vector_notas)) {
    	
    		si(vector_notas[indice] < 8.0) vector_becas[indice] = 87% * vector_becas[indice];
    	
    		indice = indice + 1;
    	}
  • Aclaraciones:
    • No creamos los vectores (vector_notas y vector_becas), entendemos que son parte del programa y escribimos un programa que sea válido cualesquiera que sean los valores de dichos vectores.
    • En la línea 2 del código obtendríamos el mismo resultado escribiendo longitud(vector_becas) en lugar de longitud(vector_notas).
    • En la línea 3 del código obtenemos la cuantía de la nueva beca multiplicando la cuantía anterior por 87 %. Dado que la rebaja en la beca es del 13 %, la cuantía resultante será el 87 % de la cuantía anterior: 100 % – 13 % = 87 %.
  • ¿Qué está ocurriendo en el programa?
    1. El programa recorre el vector vector_notas.
    2. Cuando el programa encuentra una nota menor de 8 en el vector vector_notas se reescribe el valor de la beca en el vector vector_becas multiplicando el valor de la cuantía de la beca por 87 %.

Con este planteamiento, si existen 500 alumnos a los que se les debe rebajar la cuantía de la beca, el programa hará 500 multiplicaciones. ¿Se te ocurre una manera de reescribir el programa para que sea más eficiente (es decir, para que haciendo menos operaciones consiga el mismo resultado)?

  • Resolución 2 en pseudo-código:
    	beca_crisis = 87% * 200.00 €;
    	
    	indice = 1;
    	
    	repetir_bucle_mientras(indice < longitud(vector_notas)) {
    	
    		si(vector_notas[indice] < 8.0) vector_becas[indice] = beca_crisis;
    	
    		indice = indice + 1;
    	}
  • ¿Qué está ocurriendo en el programa?
    • En esta segunda resolución la cuantía de la nueva beca se calcula fuera del bucle, y el resultado se almacena en la variable beca_crisis. El resto del programa es idéntico al de la primera resolución, pero de esta forma, en lugar de realizar una operación aritmética por cada alumno que cumpla las condiciones de rebaja de beca, se realiza una sola multiplicación, resultado en un programa que consumirá menos recursos del procesador y la memoria del ordenador donde se ejecute.
      Esto, llevado a por ejemplo un sitio web, podría repercutir en una mayor velocidad de carga, menores costes de alojamiento, mejor posicionamiento natural en buscadores, mayor facilidad para ampliar el sitio web en el futuro o mayor facilidad para que otro programador se encargue del mantenimiento del código.

Un problema de huevos

A continuación un programa que ayuda a entender la dificultad de escribir código de calidad y cómo debe funcionar la mente de un programador:

Enunciado

Te encuentras en un edificio de 100 plantas y tienes 2 huevos. Debes encontrar cuál es la planta más alta desde la que puedes tirar un huevo a la calle sin que se rompa el huevo.

Si tiras un huevo y no se rompe, puedes volverlo a usar. Si se rompe no puedes volver a usar ese huevo.

Si un huevo se rompe al tirarlo desde una planta, entonces también se hubiera roto si se hubiera tirado desde cualquier planta superior.

Si un huevo sobrevive a la caída desde una planta, entonces también sobreviviría la caída desde cualquier planta inferior.

¿Cuál es la solución que requiere el mínimo número de lanzamientos? ¿Cuál es ese número?

Solución 1

Se tira un huevo desde la planta 1, luego desde la planta 2, … y así hasta que un huevo se rompe. En este caso el mayor número de tiradas sería 100, pero podemos hacerlo mejor:

Solución 2

Se tira un huevo desde la planta 50. Si no se rompe, se hace la operación descrita en la solución anterior, pero empezando desde la planta 50.

Si el huevo se rompe al tirarlo desde la planta 50, volveremos a tirar el huevo restante desde la planta 1, luego la 2 y así sucesivamente hasta que el huevo se rompa.

En este caso el número máximo de lanzamientos sería de 50, con lo que hemos mejorado mucho la solución anterior, pero todavía podemos hacerlo mejor:

Solución 3

Tiramos el primer huevo desde la planta 10. Si el huevo no se rompe lo tiramos desde la planta 20, luego desde la 30, la 40, … así hasta que el huevo se rompa. En el momento en el que el huevo se rompe ya sabemos que la solución se encuentra entre la planta en la que se ha roto el primer huevo y las 9 inferiores.

En este caso el número máximo de tiradas sería de 19. Hemos mejorado muchísimo, pero… ¿podemos mejorarlo?

¿Qué ocurriría si en lugar de tirar de 10 plantas en 10 plantas el primer huevo probamos a ir de 11 en 11? ¿O de 12 en 12?

Solución 4

Tiramos el primer huevo desde la planta 12, el segundo desde la planta 24, luego desde la 36, desde la 48, la 60, la 72, la 84 y la 96.

En este caso tiraríamos el primer huevo un máximo de 8 veces (que ya es menos que las 10 del apartado anterior), y el segundo huevo lo tiraríamos un máximo de 11 veces más. Es decir, en el peor escenario necesitaríamos 19 tiradas (8 + 11). ¡El mismo resultado que en el ejercicio anterior!

Además, tanto con la solución 3 como con la solución 4, si la planta donde el huevo se rompe está por abajo, el número de lanzamientos necesarios es mucho menor que cuando el huevo se rompe en una de las plantas superiores. Eso, llevado a la programación, es un problema. Existe un factor desconocido que puede producir que el programa tarde mucho o tarde poco en encontrar la solución. Debemos plantear una estrategia que unifique los recursos necesarios para llegar a cualquier posible resultado.

Solución 5: minimización del máximo arrepentimiento

Una idea para conseguir que el número de lanzamientos necesarios para averiguar la planta desde la que se rompe un huevo sea similar tanto si el resultado se haya en las plantas superiores como en las inferiores es la siguiente:

  • Se tira el primer huevo desde la planta n.
  • Si el huevo no se rompe el segundo lanzamiento se realiza desde la planta (n + (n – 1)) (porque con el propósito de unificar los resultados sea cual sea la altura de la planta nos queda un tiro menos para cuando luego tengamos que probar a tirar el huevo de una planta en una planta).
  • Siguiendo la misma lógica, el tercer lanzamiento se realizaría desde la planta (n + (n – 1) + (n – 2)), y así sucesivamente hasta que ya sólo podamos subir un piso más:

    n + (n-1) + (n-2) + (n-3) + (n-4) + … + 1 ≥ 100

¿Cuál es ese número óptimo que se esconde detrás de la incógnita n?

La anterior inecuación se simplifica hasta:

n · (n+1) / 2 ≥ 100

Una inecuación de segundo grado cuyo resultado positivo (redondeando) es 14. Es decir, que el primer tiro del huevo debería empezar en la planta 14 y continuar así:

Tiro Planta Número máximo de tiros
1 14 1 + 13 = 14
2 27 2 + 12 = 14
3 39 3 + 11 = 14
4 50 4 + 10 = 14
5 60 5 + 9 = 14
6 69 6 + 8 = 14
7 77 7 + 7 = 14
8 84 8 + 6 = 14
9 90 9 + 5 = 14
10 95 10 + 4 = 14
11 99 11 + 3 = 14
12 100 12 + 0 = 12

Tabla 4.18. Máximo número de veces que sería necesario tirar los huevos según dónde se encontrara la solución.

En esta solución el número máximo de tiros necesarios serían 14, con lo que hemos conseguido mejorar el resultado de las resoluciones anteriores. Además, el número de lanzamientos necesarios sería muy similar independientemente de donde se encontrara la solución.

A esto se reduce la programación, a la resolución de un problema matemático. Cuanto más breve, eficiente y fácil de entender sea la resolución del problema, mejor será el programa escrito.

Según estiman en la web informationisbeautiful.net, un juego sencillo para iPhone contiene en promedio alrededor de 15.000 líneas de código, Google Chrome 5 millones de líneas, un Boeing 787 14 millones, Windows 7 40 millones, 45 millones para Microsoft Office 2013, Facebook 60 millones y 100 millones de líneas de código es lo que contiene un coche actual.

Hay quien, ante la falta de otro mejor criterio, valora positivamente que un programador haya trabajado en un determinado sector. Como seguro entenderás a estas alturas, el sector en el que haya trabajado un programador no guarda relación con su capacidad para hacer un desarrollo en otro sector ni con la calidad del desarrollo resultante. Tampoco existen lenguajes de programación más adecuados para uno u otros negocios.

El artículo If Carpenters Were Hired Like Programmers (Si a los carpinteros se les contratara como se contrata a los programadores) es una famosa sátira de esta extraña creencia.

Matemáticas para programadores

El Instituto Tecnológico de Massachusetts o MIT (Massachusetts Institute of Technology), probablemente la universidad de ciencias más prestigiosa del mundo, ofrece acceso online gratuito a sus clases de matemáticas para ciencias informáticas.

Dos libros que te ayudarán a superar las clases del MIT son Discrete Structures for Computer Science: Counting, Recursion, and Probability y Mathematics for Computer Science.

Si te falta base de matemáticas para enfrentarte a las clases del MIT, empieza por los cursos de matemáticas de la Universidad de Carleton.

Todavía más básicas son las lecciones de matemáticas de KhanAcademy.

Si quieres ser un buen programador, más pronto que tarde te hará falta aprender álgebra. Uno de los mejores recursos para empezar es el curso de Introducción al Álgebra de Classmill, que deberás continuar con el curso de álgebra lineal del MIT.

Encontrarás más recursos para continuar con tu aprendizaje en el hilo Mathematics for Computer Science, en Hacker News.

Qué es un algoritmo

El matemático británico Alan (Mathison) Turing (1912—1954) es una de las personas que más ha influido en la informática moderna. Entre sus muchas aportaciones formalizó los conceptos de “algoritmo” y “computación”.

Un algoritmo es la sucesión de operaciones que permite hallar la solución de un problema. Por tanto, un programa informático está construido a base de algoritmos, o es un algoritmo en sí mismo. ¡No confundir con la función matemática logaritmo!

Algoritmo: palabra que usan los programadores cuando no les apetece explicar lo que han hecho.

Primer plano de Alan Turing

Imagen 4.19. Turing fue perseguido por su homesexualidad por el mismo gobierno al que había apoyado. En 1952 aceptó la castración química como alternativa a ir a la cárcel, lo que desencadenó en una depresión que le llevó a cometer suicidio dos años después mediante la ingesta de una manzana envenenada con cianuro.

La faceta más conocida de Turing fue la que desempeñó durante la Segunda Guerra Mundial trabajando para el gobierno británico, donde resultó vital en el desarrollo de técnicas para desencriptar los mensajes del bando alemán, como quedó reflejado en la película Breaking the Code.

La Asociación para la Maquinaria Computacional otorga todos los años el premio Turing a una o varias personas que hayan hecho contribuciones destacables al mundo de la informática. El creador del lenguaje de programación C, Dennis Ritchie, fue galardonado en 1983.

Con el propósito de equipararlos a los premios Nobel, desde 2014 Google aporta 1 millón de dólares como galardón al ganador del premio Turing.

El test de Turing

En la introducción decía que un ordenador no es capaz de deducir, razonar, juzgar, pensar u obtener conclusiones por sí mismo, y que todo lo que hace un ordenador lo hace porque antes alguien le ha indicado cómo actuar ante ciertas circunstancias.

La inteligencia artificial (o AI, del ingles Artificial Intelligence) no es más que una enorme colección de normas que le indican al ordenador cómo proceder según lo que suceda. A mayor número de normas, mayor sensación de que el ordenador piensa por sí mismo.

El test de Turing es una prueba propuesta por Alan Turing que consiste en que un juez converse, por escrito, con un ordenador y con una persona. Si el juez no es capaz de diferenciar quién es el ordenador y quién la persona, entonces, el ordenador ha pasado el test de Turing.

Desde 1990 se celebra el Premio Loebner, que cada año concede 100.000 dólares al programa que mejor pase el test de Turing. La primera vez que se consiguió confundir a un juez fue en 2010, y en 2014 el robot Eugene Goostman convenció al 33 % de los miembros del jurado de que era humano.

Poema a Alan Turing Traducción al castellano
Here’s a toast to Alan Turing, He aquí un brindis a Alan Turing
born in harsher, darker times, nacido en tiempos más duros y oscuros
who thought outside the container, que pensó fuera de lo establecido
and loved outside the lines, y amó fuera de la norma
and so the code-breaker was broken, y así el que rompía códigos se rompió
and we’re sorry, y lo sentimos
yes now the s-word has been spoken, y ahora que la palabra que empieza por s [suicidio] ha sido mencionada
the official conscience woken, la conciencia oficial se ha despertado
– very carefully scripted but at least it’s not encrypted –, –muy cuidadosamente planeado pero al menos no encriptado–
and the story does suggest, y la historia sugiere
a part 2 to the Turing Test:, una segunda parte al Test de Turing
1. can machines behave like humans?, 1. ¿pueden las máquinas comportarse como humanos?
2. can we? 2. ¿podemos?

Poema escrito por Matt Harvey.

codeacademy es un curso interactivo de programación en el que programas desde el minuto uno.

stackoverflow es el foro de desarrollo más importante. Los programadores que participan en él reciben votos de los demás usuarios por sus preguntas o respuestas.

Si te interesa la figura de Turing disfrutarás con los siguientes libros:

El primer programa de la historia

Augusta Ada Byron (1815—1852) también llamada Augusta Ada King, condesa de Lovelace o Ada Lovelace, hija del poeta inglés Lord Byron, fue la autora del primer programa de la historia.

Ada estudió en profundidad el funcionamiento de la máquina de Babbage, y como parte de su estudio describió un algoritmo para calcular los números de Bernoulli empleando la máquina de Babbage. Es por este algoritmo que Ada es considerada la primera programadora de la historia.

[Retrato a acuarela de Ada Lovelace sujetando un abanico, con un velo, vestido elegante, guantes, y diadema dorada. Lo propio de una condesa inglesa del siglo XIX.

Imagen 4.20. El retrato del primer programador de la historia no defrauda, no se podía esperar menos de una condesa inglesa del siglo XIX.
(Imagen de dominio público cortesía de Science & Society Picture Library.)

El libro Ada’s Algorithm: How Lord Byron’s Daughter Ada Lovelace Launched the Digital Age (“El algoritmo de Ada: cómo la hija de Lord Byron lanzó la era digital”) cuenta la historia de esta pionera de la informática.

En su honor, en 1979 el Departamento de Defensa de Estados Unidos bautizó con el nombre de Ada a un lenguaje de programación basado en el lenguaje Pascal, nombrado a su vez en honor al matemático francés Blaise Pascal.

Caja metalica y dorada en la que se pueden apreciar seis reudas que parecen servir para seleccionar números en unas ruedas superiores.

Imagen 4.21. Blaise Pascal (1623—1662) construyó, en 1642 (¡con 19 años!), la primera calculadora mecánica, a la que bautizó como Pascalina.
(Imagen bajo licencia GNU Free Documentation License, Version 1.2 o cualquier versión posterior publicada por la Free Software Foundation cortesía de David.Monniaux.)

Margaret Hamilton, con 31 años y vistiendo un vestido a rayas y gafas, posa ante un montón de libros que suman su misma altura.

Imagen 4.22. Margaret Hamilton, programadora líder del proyecto Apolo 11 posa junto a los datos obtenidos resultado de las simulaciones del software que ella misma, con sólo 31 años, escribió para dicho proyecto.
Gracias a Margaret, el Apolo 11 consiguió poner por primera vez a hombres en la luna, los estadounidenses Neil Armstrong y Buzz Aldrin, el 20 de julio de 1969.

Plano de medio cuerpo de Marissa Mayer en el evento DLD en 2009.

Imagen 4.23. La historia de la informática está llena de mujeres exitosas. Una de las más populares actualmente es Marissa Mayer, empleada número 20 y primera ingeniera de Google y actualmente presidenta de Yahoo!.
(Imagen bajo licencia CC BY-SA 2.0 cortesía de Eirik Solheim.)

Software de código abierto y software propietario

Existen desarrolladores de software que publican el código de sus programas. Dicho código queda a disposición de todo aquel que quiera consultarlo, estudiarlo, modificarlo o reutilizarlo. Se dice que dicho software es software de código libre o abierto.

Logotipo consiste en un círculo verde, grueso, abierto por abajo formando la forma de una cerradura en su interior.

Imagen 4.24. Logotipo de la Iniciativa de Código Abierto (“Open Source Initiative” en inglés), entidad dedicada a la promoción del código abierto.

En inglés, al software libre se le denomina free software, en la acepción en la que free significa libre, no gratis. Para evitar malentendidos se suele hablar de open source software o open source a secas, lo que se traduce como “software de código abierto” o “código abierto”, respectivamente.

El adjetivo libre aplicado al software significa que el código de dicho software es accesible, modificable y utilizable por cualquiera. No confundir software libre con la contratación de un desarrollo de software a medida que haga lo que tú quieras. Libre, en el contexto del software no significa a medida. Un desarrollo a medida podrá ser publicado o no como software libre, o contener o no partes de otro software libre.

A través de ciertas licencias legales los desarrolladores de software de código abierto determinan lo que permiten o no permiten que se haga con su código fuente.

Existe multitud de software de código abierto que es mejorado, mantenido y versionado por una comunidad mundial de desarrolladores. Linux es el máximo exponente de software de código abierto.

Plano de medio cuerpo de Linus Torvalds posando en polo gris y de brazos cruzados

Imagen 4.25. Linus Torvalds, creador de Linux. Linus empezó a crear Linux como un hobby y según sus propias palabras nunca imaginó que podría convertirse en algo más.
(Imagen bajo licencia CC BY-SA 3.0 cortesía de PL Przemek.)

Si el código fuente de un programa no es publicado se dice que dicho software es propietario. Microsoft Windows o Mac OS X son ejemplos de software propietario. Android es software de código abierto.

Ordenador Altair 8800. Consiste en una caja con una parte frontal con 36 LEDs (salida) y 25 interruptores (entrada).

Imagen 4.26. El Altair 8800 es un ordenador sin pantalla ni teclado en el que la salida de datos consiste en unos LEDs en su parte frontal.
Sus diseñadores estimaban vender unos pocos cientos de unidades desmontadas a aficionados pero en enero de 1975, su primer mes a la venta, vendieron varios miles de unidades, convirtiéndose en el precursor del mercado de los ordenadores personales.
El primer lenguaje de programación para esta máquina fue el Altair BASIC, el primer producto de Microsoft, desarrollado por sus fundadores, Bill Gates y Paul Allen, cuando ambos tenían 19 años.

Que un software sea gratuito o de pago es independiente de si es libre o propietario. Existe software libre tanto gratuito como de pago y lo mismo ocurre con el software propietario.

Las empresas que desarrollan software libre pueden generar ingresos de diversas fuentes, como el mantenimiento, la asesoría o la venta de versiones más completas a la versión publicada como software libre. Además, la distribución de software libre suele ser una excelente forma de promoción y captación de usuarios.

Portada del libro de Richard Stallman

Imagen 4.27. Richard Stallman es el activista defensor del uso de software libre más conocido y, probablemente, radical.
En la imagen, su libro Free as in Freedom, lo que se traduce como “Libre como en Libertad”, aclarando un error común respecto al software libre puesto que en inglés se usa la misma palabra para referirse a “gratis” que para referirse a “libre” (free).
Stallman es el fundador de la Free Software Foundation (“Fundación de Software Libre”) y del Proyecto GNU que, entre otras cosas, establece las directrices que debe seguir una distribución Linux para que sea completamente libre.
(Imagen bajo licencia CC BY-SA 3.0 cortesía de Iradigalesc.)

Logotipo del Proyecto GNU, que consiste en la ilustración de un ñu.

Imagen 4.28. El logotipo del Proyecto GNU es un ñu, que es lo que significa GNU en inglés. Además, GNU es el retroacrónicmo de “Gnu’s Not Unix“, lo que se traduce como “Gnu No es Unix”, dado que a diferencia de éste, no contiene software propietario.

Modelos de negocio en venta de software

Además de las licencias tradicionales de software, en las que se paga una cuantía fija por adquirir un programa informático, cada vez es más común el software que se comercializa como servicio o SaaS, del inglés “Software as a Service“.

El modelo de SaaS requiere el pago de una cuota periódica para el uso del software. Spotify, Dropbox o Evernote son modelos de negocio basados en SaaS.

Otro término cada vez más popular es freemium, que proviene de la combinación de las palabras inglesas “free” (gratis) y “premium” (alta calidad), y se usa para referirse al modelo de negocio que ofrece una versión básica y/o basada en publicidad, y gratuita, del producto o servicio que se comercializa, y otra versión del mismo producto o servicio, más completa y/o sin publicidad, y de pago. SpotifyDropbox o Evernote ofrecen un producto con un modelo freemium.

El desarrollo web no se compra

Según un estudio de psicología diferencial, en un mismo equipo, los mejores programadores son hasta 28 veces mejores que los peores programadores. Dado que su sueldo no es proporcional a su productividad, los buenos programadores son los mayores chollos en el sector del software.

—Rober L. Glass, Fact and Fallacies of Software Engineering

Escribiendo menos código que hace más, y escribiendo código fácil de mantener y con menos bugs, un buen desarrollador le quita trabajo al departamento de calidad, a sus compañeros, a los directivos, e incrementa la productividad de todo el que le rodea. Es por eso que datos como que un buen programador es 28 veces más productivo son posibles e incluso pueden parecer bajos cuando consideras todas sus repercusiones.

—Phil Haak, 10 Developers for the Price of One

A estas alturas ya es fácil entender por qué no tiene sentido que el departamento financiero o el de compras intervenga en la contratación de servicios de desarrollo web, o que ésta contratación se haga a través de licitaciones, concursos o solicitud de propuestas a potenciales proveedores; los famosos RFP.

RFP son las siglas de los términos anglosajones “Request For Proposals“, lo que se traduce como “Solicitud De Propuestas”.

Se trata de un procedimiento que una persona o entidad que desea contratar un producto o servicio puede hacer para que varios proveedores de dicho producto o servicio elaboren y/o presenten ofertas.

En el lenguaje habitual se usa la palabra RFP como sinónimo del documento o solicitud que forma parte del mencionado proceso.


Resumen

Los lenguajes de programación consisten en sentencias de texto que nos permiten dar órdenes a los ordenadores, que procesarán dichas órdenes y nos devolverán un resultado.

Los programas contienen lógica condicional, es decir, el resultado obtenido tras la ejecución de un programa depende de condiciones y variables de entrada.

El código fuente de un programa es el conjunto de sentencias de texto que contienen las órdenes que enviamos a los ordenadores.

La detección y depuración de fallos (bugs) en el código fuente es parte del proceso de programación. Para ello los programas pasan por las versiones alpha (para desarrolladores) y beta (para usuarios de prueba). Aun así, la detección y corrección de errores es parte inseparable de la vida de cualquier software.

Lo primero que debemos hacer antes de escribir un programa es deconstruir la tarea a ejecutar en los pasos mínimos, aunque librerías y frameworks nos pueden solucionar problemas enteros en una sola línea de código.

Un programa es una sucesión de algoritmos. Un algoritmo es la sucesión de operaciones que permiten hallar la solución a un problema.

Dos programas que produzcan el mismo resultado pueden estar codificados de maneras muy distintas, llevando a que un programa que ha sido más barato de desarrollar resulte en un programa más inseguro, ineficiente y caro de mantener.

El software de código libre es aquel que permite el acceso a su código fuente.

Existen distintos modelos de monetización de software, como el mantenimiento, la asesoría, la venta de licencias o el alquiler de su uso, entre otros. Freemium es un modelo de comercialización que ofrece una versión básica y gratuita de una aplicación más completa.

Lo más importante de saber cómo funciona un ordenador y qué es la programación es que ahora puedes entender algunos geniales chistes informáticos. Qué mejor motivo para continuar aprendiendo qué son las bases de datos y los gestores de contenidos.