h1

Millones de líneas de código

12/06/2013

Wizdoc [Icon By Buuf]  Reflexiones.

Medir el avance de un programa mediante líneas de código es como medir el progreso de la construcción de un avión por el peso.

Bill Gates (n. 1955), empresario y filántropo estadounidense, cofundador de Microsoft.

Cuando el peso de la documentación equivale al peso de la aeronave, el avión está listo para volar.

— Regla estándar de ingeniería en Boeing.

Durante los inicios de la era de las computadoras, programar era algo muy complicado, pues las instrucciones o rutinas de los programas debían ingresarse mediante tarjetas perforadas. Éstas eran un método de almacenamiento heredado de la revolución industrial, cuando en el siglo 19 se inventaron telares que generaban diseños en base a este paradigma.

En los 1950’s IBM ya había estandarizado el formato y dimensiones de las tarjetas: cada una de ellas tenía 10 renglones por 80 columnas; al perforar una combinación particular, la computadora ejecutaba una instrucción, como se muestra en la siguiente imagen:

Pic: Punching Card

Tarjeta perforada utilizando el estándar de codificación EBCDIC de 1964. La combinación de números en cada columna equivale a un carácter alfanumérico o número de instrucción en su correspondiente valor de 8 bits. (Fuente: English Wikipedia)

Debido a que uno de los primeros lenguajes de programación era el ensamblador, el esfuerzo de un desarrollo se solía medir en base al número de tarjetas que lo integraban, pues cada tarjeta equivalía exactamente a 80 instrucciones. Ya que era necesario introducir una tarjeta de forma secuencial y presionar un botón (en inglés line-feed) para que el intérprete del lenguaje ejecutara las instrucciones correctamente, cada tarjeta se consideraba como una línea de código. Y es así como nació el concepto de línea de código fuente.

En la década de los 1960’s, cuando todavía existían pocos lenguajes de programación y éstos eran ocupados para aplicaciones muy específicas – por ejemplo, COBOL para sistemas empresariales o FORTRAN para cálculos científicos – el número de tarjetas o líneas de código era un buen indicador de la complejidad de una aplicación o sistema, ya que éste se desempeñaba en ambientes mainframe, donde se ejecutaban los binarios resultantes de compilar el código introducido por las tarjetas. Así, programas de 1,000-2,000 líneas de código fuente eran considerados un esfuerzo “estándar”, pues ese número era común en programas de reporteo o consolidados; para sistemas transaccionales, de 10 a 30 mil líneas de código eran la norma. Por ejemplo, el sistema de navegación del módulo lunar del Programa Apolo consistía de aproximadamente 6,600 líneas en ensamblador.

Una vez que hicieron su aparición los lenguajes de alto nivel como BASIC o C, se perdió el concepto de línea de código original, pues en vez de perforar tarjetas, las instrucciones se programaban en una pantalla a manera de procesador de texto. Ya que se esperaba un código legible para otros programadores que no fuesen el autor, se distorsionó el concepto de línea, creyendo erróneamente que equivalía a una línea de texto en un archivo fuente:

Fragmento A:


for(i=0;i<100;i++)printf("hola mundo");/* A cuantas lineas equivale esto?*/

Fragmento B:


/* Y a cuantas equivale esto? */
for (i = 0; i < 100; i++)
{
  printf("hola mundo");
}

En los fragmentos de código anterior, el primer ejemplo consiste de una sola línea de código, mientras el otro posee 5; ambos valores sólo reflejan indentación y no tienen ningún sentido desde el punto de vista de estimación de esfuerzo; esto es conocido como líneas físicas de código. Ahora bien, ambos fragmentos poseen dos declaraciones: un for y un printf. La métrica basada en estructuras de control y asignaciones que ignora comentarios y llaves es conocida como líneas lógicas de código. En este caso, ambos fragmentos posen exactamente dos de éstas.

En la actualidad, la medición de esfuerzo en base a líneas de código está en desuso, ya que las comparaciones entre proyectos son difíciles si no imposibles, pues el número depende del tipo de industria, lenguaje implementado, herramientas utilizadas, y hasta la habilidad del programador: por nombrar un par de ejemplos, el código del sistema de navegación Apolo mencionado más arriba no puede traducirse en una cantidad concreta de líneas en Java. Por otro lado, con relativa frecuencia lo que un desarrollador novato podría hacer en 5 o 10 líneas de código, un master de masters lo logra en tan solo 3. Por estas y otras tantas desventajas, en la actualidad se utilizan otras técnicas de estimación, como puntos de función o la complejidad relativa hallada en proyectos ágiles.

Algunas comparaciones

Dejando de lado la posible incoherencia entre diferentes códigos fuente, hace un par de semanas circuló la noticia de que el sitio gubernamental norteamericano healthcare.gov era un claro ejemplo de las fallidas políticas del Obamacare, impulsado por el actual presidente estadounidense: un monstruoso y complejo sitio con más de 500 millones de líneas de código, supuestamente cinco veces el tamaño de un core bancario de una institución grande. Esto dejó pensando a muchos: ¿Qué significan 500 millones de líneas? ¿Es grande comparado con qué?

Es así como la semana pasada, los amigos del sitio Information is Beautiful publicaron una infografía que muestra la cantidad de líneas de código para diferentes aplicaciones, sistemas operativos y software embebido: desde el firmware de un marcapasos, pasando por Google Chrome, hasta el Debian 5.0, la información contenida en la gráfica nos deja saber “qué tanto es tantito”:

Pic: Codebases: Millions of lines of code ~ informationisbeautiful

Comparación entre diferentes códigos fuente, incluyendo aplicaciones, sistemas operativos, software embebido e incluso el genoma de organismos vivientes. Dar click en la gráfica para ver la infografía original. (Fuente: informationisbeautiful.net)

Vale la pena mencionar que en la gráfica, las desventajas de medir en base a líneas de código se hacen aparentes: el software embebido del transbordador espacial es de 400,000 líneas de código. Y sin embargo, resulta que una de las máquinas más sofisticadas construidas por el hombre palidece considerablemente contra Android (12 millones de líneas), un sistema operativo localizado en los dispositivos móviles.

Como conclusión: con todo y los enormes avances en la ingeniería de software que se han dado en los últimos años, seguimos en pañales, pues hasta ahora la humanidad no ha desarrollado nada más allá de 100 millones de líneas de código en el software embebido y de diagnóstico de un automóvil de lujo – un Mercedes o un Audi del 2013. ¿Por qué es trivial el nivel alcanzado? Porque todos estos números son insignificantes contra el tamaño de código fuente necesario para “construir” el dispositivo más sofisticado de todos: un cerebro humano con tres mil trescientos millones de líneas de código (pares-base en nuestro ADN). ¿Qué pasará cuando desarrollemos software con semejantes dimensiones? ¿Y qué pasará cuando el software pueda hacerlo solo, sin necesidad de nuestra intervención? Supongo que en ese momento, habremos llegado a la última invención de la humanidad.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: