Source: http://libro.cleverconsulting.net/capitulo-4-desmitificando-la-programacion/
Timestamp: 2018-11-20 07:49:57+00:00

Document:
¿Qué es la programación? | Cómo contratar desarrollo web sin hacer el ridículo
Capítulo 1 – Glosario.
Capítulo 1 - Glosario.
Desmitificando la programación.
A pensar como un programador
A programar (como lo oyes)
Qué es una librería y qué es un framework
Qué hace que un programador sea bueno (o malo)
Modelos de negocio en la comercialización de software
Todo el rollo que te he contado hasta ahora era necesario para poder contestar a la pregunta ¿qué es la programación? sin tener que incluir la palabra magia en la respuesta. A estas alturas ya sabes que un ordenador es una máquina que recibe, 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 y decirle qué debe hacer con ella, 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 tecnología).
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, JavaScript, Ruby, Python, Perl, Lisp, B, C, C#, C++, Objective C, D, Cobol, Pascal, Delphi, ActionScript, BASIC, Visual Basic, AppleScript… existen miles 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. 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) 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). Por eso 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 o depuración. Bug es una palabra inglesa que significa bicho.
Imagen 4.1. 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.
Los términos alpha y beta se utilizan para referirse a las primeras versiones de un software. Las versiones alpha van destinadas a otros desarrolladores y programadores, y las versiones beta a unos pocos 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).
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.)
A diferencia de los lenguajes HTML o CSS, un lenguaje de programación permite expresar lógica condicional, es decir, que el resultado producido por la ejecución de un programa sea distinto 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 tienes todo lo necesario para diseñar un programa.
Para implementar los programas que diseñes sí necesitarás a un programador, 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 elegirás una tarea a ejecutar. Después escribirás los pasos necesarios para ejecutar dicha tarea si fueras tú, en lugar del ordenador, quien debe hacerlo.
Paso 1: imagina el proceso para ejecutar una tarea.
Paso 2: deconstruye el proceso en los pasos más pequeños .
Paso 3: escribe dichos pasos de manera secuencial.
Paso 4: (un programador) traduce tus instrucciones a un lenguaje de programación.
En este capítulo diseñarás algunos programas de la misma manera 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 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 de este pseudo-código 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.
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.)
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 superior), 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 de sus tiendas.
(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 sólo se habrán licenciado 400.000.
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.
Pedirle al usuario el primer número de la suma.
Memorizar ese primer número.
Pedirle al usuario el segundo número de la suma.
Memorizar ese segundo número.
Sumar el primer número con el segundo y almacenar el resultado.
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 (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 ‘=‘, por ejemplo: resultado_suma = numero_1 + numero_2;.
Nota: estas reglas sintácticas y semánticas son normas de nuestro particular pseudo-código, y de la mayoría de lenguajes de programación.
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 las tarjetas perforadas que el comerciante francés Joseph Marie Jacquard había inventado para optimizar el tejido de patrones en tela.
Imagen 4.7. Durante la construcción de su máquina analítica Babbage intercambió correspondencia con Ada Lovelace, lo que sirvió para que Ada se convirtiera en la primera programadora 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.
Pedirle al usuario el primer número.
Pedirle al usuario el segundo número.
Comparar el primer número con el segundo.
Si el primer número es mayor que el segundo, mostrar el primer número.
Si el primer número es menor que el segundo, mostrar el segundo número.
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");
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.
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:
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.
Almacenar el primer número del vector en una variable.
Comparar el primer número del vector con el segundo número del vector.
Imagen 4.10. Representación gráfica de la comparación del primer elemento del vector con el segundo elemento.
Almacenar en una variable el mayor de los números recién comparados.
Imagen 4.11. El mayor de los dos primeros elementos del vector se almacena en una variable.
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.
Imagen 4.12. En la imagen superior, el tercer elemento del vector se compara con el número almacenado en la variable.
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.
Si el número recién leído en el vector no es mayor que el almacenado en la variable, volver al punto 3.
lista_numeros = [40, 0 , 8, 32, 92];
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];
imprimir(numero_mayor);
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).
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, por ejemplo: lista_numeros[indice+1].
¿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 un programador en la calidad del programa.
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.
Imagen 4.8. Amazon y otras muchas tiendas online permiten al usuario ordenar los productos por precio.
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.)
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 en teoría, produce software con menos fallos (aunque una librería puede introducir fallos de los que el programador no es consciente).
jQuery y mootools son librerías populares para el lenguaje de programación JavaScript. Apache Hibernate es una de las muchas librerías que existen 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>
numero_mayor = obtener_valor_mayor(lista_numeros);
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é ocurre dentro de las librerías, lo que conlleva que puedan existir fallos no detectados.
Al reducir la cantidad de código el uso de librerías puede reducir los costes y tiempos de programación y mantenimiento, por contra puede requerir programadores con mayor cualificación.
La palabra framework es traducible como “marco de trabajo” y aunque su definición y utilidad podría ser idéntica a la de librería, no tiene nada que ver.
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 del 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:
Ahora transformaremos este pseudo-código a dos lenguajes de programación: PHP y C, pero para eso, un breve diccionario inglés-castellano:
array: vector
integer: número entero, se abrevia como int
size of: tamaño de
$lista_numeros = array(40, 0 , 8, 32, 92);
$numero_mayor = $lista_numeros[indice];
while($indice < count($lista_numeros)) {
if($lista_numeros[$indice+1] > $lista_numeros[$indice]) {
$numero_mayor = $lista_numeros[$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.
El programador establece el nombre de las variables.
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 (‘{‘ y ‘}‘).
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 te cuento cómo se ejecutan los programas en PHP).
int lista_numeros[5] = { 40, 0 , 8, 32, 92 };
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];
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 (‘{‘ y ‘}‘).
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 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 ((‘{‘ y ‘}‘)).
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 valor 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, iPad y Mac OS X. El ingeniero informático Dennis Ritchie creó C basándose en el lenguaje de programación B creado por Ken Thompson. Juntos, en B, crearon 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.
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.
Para convertir este código en C en un programa debes 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á 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. La forma de ejecutar el programa escrito en PHP es diferente. Como veremos en el capítulo 7, el programa en PHP será ejecutado por un servidor sin necesidad de compilarlo.
La compilación de un programa produce un archivo que contiene las órdenes dispuestas de una manera más óptima para el procesador, y por tanto, los programas compilados son más eficientes que los interpretados. Los lenguajes interpretados, como PHP, 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 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.
Imagen 4.16. Grace Murray Hopper (1906—1992), militar estadounidense, programó el primer compilador en 1952.
(Imagen de dominio público cortesía de James S. Davis.)
Programador bueno, programador malo
Los códigos fuente de dos programas aparentemente idénticos pueden ser 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, lo que significa que 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) .
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 leas los libros.
—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
Por este motivo es un error comparar presupuestos para contratar desarrollo de software. Un código barato puede ser ineficiente y difícil de mantener… ¡y uno caro también!
En informática usamos la expresión spaguetti code o código espagueti para referirnos al código fuente de baja calidad.
El juego de Pinball que venía con Windows XP fue eliminado de las 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.
Enunciado: una universidad paga una beca de 200 €/mes a los alumnos con una nota media superior a 6. Debido a los últimos recortes en educación van 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)
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:
repetir_bucle_mientras(indice < longitud(vector_notas)) {
si(vector_notas[indice] < 8.0) vector_becas[indice] = 87% * vector_becas[indice];
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?
El programa recorre el vector vector_notas.
Cuando el programa encuentra una nota menor de 8 en el vector vector_notas 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, que necesite menos operaciones para producir el mismo resultado?
Resolución 2 en pseudo-código:
beca_crisis = 87% * 200.00 €;
si(vector_notas[indice] < 8.0) vector_becas[indice] = beca_crisis;
En esta segunda resolución calculamos la cuantía de la nueva beca fuera del bucle y la almacenamos en la variable beca_crisis. De esta forma, en lugar de realizar una operación aritmética por cada alumno que cumpla las condiciones de rebaja de beca, el programa realiza una sola multiplicación, resultado en un programa que consumirá menos recursos del procesador y la memoria del ordenador donde se ejecute.
Esto, en 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
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 también se romperá si lo tiras desde cualquier planta superior.
Si un huevo sobrevive a la caída desde una planta también sobrevivirá 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?
Tiramos 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 es 100, pero podemos hacerlo mejor:
Tiramos un huevo desde la planta 50 y…
Si el huevo no se rompe, tiramos un huevo desde la planta 51, luego la 52… hasta que un huevo se rompe.
Si el huevo se rompe al tirarlo desde la planta 50, tiramos el huevo restante desde la planta 1, luego la 2 y así hasta que el huevo se rompa.
En este caso el número máximo de lanzamientos es de 50, con lo que hemos mejorado la solución anterior, pero todavía no lo suficiente.
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… y así hasta que el huevo se rompe. 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 es de 19. ¿Es este el mejor resultado posible? ¿Qué ocurre 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?
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 tiramos el primer huevo un máximo de 8 veces (que ya es menos que las 10 del apartado anterior) y el segundo huevo un máximo de 11 veces más. Es decir, en el peor escenario necesitamos 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. En programación eso es un problema. Existe un factor que no controlamos que hace que el programa tarde mucho o poco en encontrar la solución. Debemos plantear una estrategia que unifique los recursos necesarios para llegar a cualquier resultado.
Solución 5: minimización del máximo arrepentimiento
Una idea para que necesitemos los mismos lanzamientos tanto si el huevo se rompe en las plantas superiores como en las inferiores:
Tiramos el primer huevo desde la planta n.
Si el huevo no se rompe, el segundo lanzamiento lo hacemos desde la planta (n + (n – 1))
Hacemos esto porque deseamos obtener un resultado similar sea cual sea la planta desde la que se rompe el huevo. Podemos imaginar que “nos queda un tiro menos” para que una vez se haya roto el primer huevo, tengamos que probar a tirar el huevo de planta en planta.
Siguiendo la misma lógica, el tercer lanzamiento lo haremos 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
Todo esto significa que si empezamos tirando el huevo desde la planta 10, y el huevo no se rompe, el segundo lanzamiento lo haremos desde la planta 9, luego desde la 8, y así sucesivamente.
Roto el primer huevo tiraremos el segundo desde la planta inmediatamente superior a la última planta desde que tiramos un huevo y no se rompió.
La pregunta es, ¿desde qué planta debemos hacer el primer lanzamiento?, es decir, ¿qué valor se esconde detrás de la incógnita n de la inecuación anterior? 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í:
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 tiradas según dónde se encuentre la solución.
En esta solución el número máximo de tiros necesarios son 14, con lo que hemos mejorado el resultado de las resoluciones anteriores. Además, el número de lanzamientos necesarios es similar independientemente de donde se encuentre 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 la resolución, mejor.
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 valora positivamente que un programador haya trabajado en un determinado sector. Como 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 unos 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.
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.
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.
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ó 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 su trabajo para el gobierno británico durante la Segunda Guerra Mundial, donde resultó imprescindible para desencriptar los mensajes del bando alemán, como refleja 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 por sus contribuciones 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 para galardonar al ganador del premio Turing.
Un ordenador no es capaz de razonar, 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 inglés 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, 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
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 planificada pero al menos no encriptada–
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:
The Code Book, de Simon Singh, cuenta con sencillez la historia de la criptografía.
Alan Turing: The Enigma, de Andrew Hodges, una historia de matemáticas, ordenadores, criptografía y la persecución homosexual.
Alan M. Turing, es el retrato más personal de Alan Turing, escrito por su madre Sara.
The Annotated Turing, de Charles Petzold, explica en qué consiste la máquina de Turing, uno de los conceptos más importantes y complejos desarrollados por Alan Turing.
Alan Turing’s Automatic Computing Engine, de Jack Copeland, es una historia de los primeros programas informáticos modernos.
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.
Tras estudiar el funcionamiento de la máquina de Babbage describió un algoritmo para calcular los números de Bernoulli, convirtiéndose en la primera programadora de la historia.
Imagen 4.20. El retrato del primer programador de la historia no defrauda.
(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.
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.)
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 31 años, escribió para dicho proyecto.
Gracias a Margaret el Apolo 11 consiguió poner a hombres en la luna por primera vez, los estadounidenses Neil Armstrong y Buzz Aldrin, el 20 de julio de 1969.
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 para que cualquiera pueda consultarlo, estudiarlo, modificarlo o reutilizarlo. Eso es software de código libre o abierto.
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 y mantenido por una comunidad mundial de desarrolladores. Linux es el máximo exponente de software de código abierto.
Linus Torvalds, creador de Linux. Linus empezó a crear Linux como un hobby y 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 dicho software es propietario. Microsoft Windows o Mac OS X son ejemplos de software propietario. Android es software de código abierto.
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 que sea 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. La distribución de software libre puede ser una forma de promoción y captación de usuarios.
Imagen 4.27. Richard Stallman, el defensor de software libre más conocido.
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 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.)
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 nada de 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 habitual el software que se comercializa como servicio o SaaS, del inglés “Software as a Service“, modelo que requiere el pago de una cuota periódica para el uso del software, como Spotify, Dropbox o Evernote.
Otro término 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. Spotify, Dropbox 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 errores, 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 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 de cualquier software a medida), o que esta 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 la expresión anglosajona “Request For Proposals“, lo que se traduce como “Solicitud De Propuestas”. Se trata de un procedimiento que quien desea contratar un producto o servicio hace para recibir ofertas de varios proveedores. En el lenguaje habitual se usa “RFP” como sinónimo del documento que contiene los requisitos solicitados.
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 los datos 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 correcció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). Además, la detección y corrección de errores es parte de la vida de cualquier software.
Para escribir un programa empezamos deconstruyendo 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 ejecuta una tarea.
Dos programas que produzcan el mismo resultado pueden estar codificados de maneras muy distintas, llevando a que un programa más barato de desarrollar resulte 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 mejor de saber cómo funciona un ordenador y qué es la programación es que ahora puedes entender el humor informático. Qué mejor motivo para continuar aprendiendo qué son las bases de datos y los gestores de contenidos.

References: Resolución 

Resolución 

Resolución 

Resolución 
 resolución 
 resolución