25 julio 2007

Leyes del desarrollo de software

Paseando por la web, he encontrado una recopilación por Joey DeVilla en GlobalNerdy, que incluye algunas de las leyes, axiomas y reglas que se pueden aplicar al desarrollo del software.

Me ha parecido interesante y no he encontrado ninguna recopilación similar en español, así que me he tomado la libertad de traducirla, para que pueda llegar también a los hispanoparlantes. Más de una de estas leyes viene de la biología pero aun así es totalmente aplicable al software.

(Traducción libre. La lista está ordenada por nombre del autor)

La ley
Atribuida a
Lo que dice
Ley de Amdahl Gene Amdahl La velocidad que se puede ganar ejecutando un programa en un ordenador paralelo está limitada por la fracción de programa que no se puede paralelizar.
Segunda ley de sociociencia de Augustine Norman Augustine Para cada acción científica (o ingenieril) existe una acción social igual y opuesta.
Ley de Brooks
Fred Brooks Añadir más gente a un proyecto que tiene retraso provoca que tenga aún más retraso.
Primera ley de Clarke Arthur C. Clarke Cuando un distinguido científico de una cierta edad afirma que algo es posible, casi seguro que está en lo cierto. Cuando afirma que algo es imposible, muy probablemente se equivoca.
Segunda ley de Clarke Arthur C. Clarke La única forma de descubrir los límites de lo posibl es aventurarse un poco más allá, hasta llegar a lo imposible.
Tercera ley de Clarke Arthur C. Clarke Cualquier tecnología suficientemente avanzada es indistinguible de la magia.
Ley de Conway Melvin Conway Cualquier fragmento de software refleja la estructura organizacional que lo produjo.
Regla de Cope Edward Drinker Cope En la evolución hay una tendencia general hacia el aumento de tamaño.
Principio de Dilbert
Scott Adams Los trabajadores más ineficientes son desplazados sistemáticamente hacia el lugar donde menos daño pueden hacer: la gerencia.
Ley de Ellison de criptografía y usabilidad Carl Ellison La base de usuarios para la criptografía fuerte desciende a la mitad con cada pulsación de tecla o clic de ratón adicional que es necesario para hacerla funcionar.
Ley de los datos de Ellison Larry Ellison Una vez que los datos de una empresa se han centralizado e integrado, el valor de la base de datos es mayor que la suma de las partes existentes anteriormente.
La ley de las falsas alertas George Spafford A medida que la cantidad de alertas erróneas aumenta, disminuye la confianza del operador en los avisos subsiguientes.
Teorema fundamental de Fisher R. A. Fisher Cuanto más se adapta un organismo, menos adaptable es a los nuevos cambios.
Ley de Fitts
Paul Fitts El tiempo para alcanzar un objetivo es función de la distancia y el tamaño del objetivo.
Axioma de Flon Lawrence Flon No existe ni existirá un lenguaje de programación en el que sea difícil escribir malos programas.
Ley de Gilder
George Gilder El ancho de banda crece al menos tres veces más rápido que la potencia de los ordenadores.
Ley de Godwin
Mike Godwin Cuando una discusión en linea crece, la probabilidad de que aparezca una comparación que incluya Nazis o Hitler se acerca a uno.
Ley de Grosch
Herb Grosch El coste de los sistemas computacionales crece como la raíz cuadrada de su potencia computacional.
Ley de Hartree
Douglas Hartree Sea el que sea el estado de un proyecto, el tiempo que el gestor de proyecto estimará hasta que se complete es constante.
Principio de incertibumbre de Heisenbug Jim Gray La mayoría de los bugs del software son blandos: se van cuando los miras.
Ley de Hick William Edmund Hick El tiempo para tomar una decisión es función de las elecciones posibles.
Ley de Hoare de los grandes problemas C. A. R. Hoare Dentro de cada gran problema hay un pequeño problema luchando por salir.
Ley de Hofstadter Douglas Hofstadter Una tarea siempre lleva más tiempo de los que esperabas, incluso cuando tienes en cuenta la ley de Hofstadter.
Ley de Jakob de la experiencia de los usuarios en Internet Jakob Nielsen Los usuarios pasan la mayor parte de su tiempo en otros sitios web. Esto quiere decir que los usuarios prefieren tu sitio para trabajar, de igual modo que todos los demás sitios que conocen.
Ley de Joy Bill Joy No importa quien seas, la mayoría de la gente inteligente trabaja para algún otro.
Principio de Kerckhoffs Auguste Kerckhoffs En criptografía, un sistema debería ser seguro, incluso si todo acerca del sistema, excepto un pequeño fragmento de información -la clave- fuera conocido por todos.
Ley de Linus Eric S. Raymond, que le dio el nombre por Linus Torvalds Con suficientes ojos, todos los fallos (bugs) son superficiales.
Ley de Lister Timothy Lister La gente bajo presión de tiempo no piensa más rápido.
Ley de Metcalfe Robert Metcalfe En teoría de redes, el valor de un sistema crece aproximadamente como el cuadrado del número de usuarios del sistema.
Ley de Moore Gordon Moore El número de transistores en un circuito integrado se duplica aproximadamente cada 18 meses.
Ley de Murphy Captain Edward A. Murphy Si hay dos o más formas de hacer algo, y una de ellas puede resultar en una catástrofe, entonces alguien usará esa forma.
Primera ley de Nathan Nathan Myhrvold El Software es un gas; se expande hasta llenar el recipiente que lo contiene.
Ley de Noventa-noventa Tom Cargill El primer 90% del código lleva el primer 10% del tiempo de desarrollo. El 10% de código restante absorbe el 90% del tiempo de desarrollo.
Cuchilla de Occam William of Occam En igualdad de condiciones, la solución más sencilla suele ser la mejor (original en latín: "entia non sunt multiplicanda praeter necessitatem", que se podría traducir por "las entidades no deberían multiplicarse más allá de lo necesario").
Ley de Osborn Don Osborn Las variables no lo serán; las contantes no lo son.
Ley de Postel (segunda cláusula del principio de robustez) Jon Postel Sé conservador en lo que envías y liberal en lo que aceptas.
Principio de Pareto (a.k.a. “La regla del 80-20”) Sugerida por Joseph Juran, nombre debido a Vilifredo Pareto Para muchos fenómenos, el 80% de las consecuencias procede del 20% de las causas.
Ley de Parkinson
C. Northcote Parkinson El trabajo se expande hasta llenar todo el tiempo disponible para completarlo.
La paradoja del pesticida Bruce Beizer Cualquier método que se use para prevenir o encontrar bugs deja un residuo o bugs más sutiles, contra los que ese método no es efectivo.
El principio de Peter
Laurence J. Peter En una jerarquía, cada empleado tiende a crecer hasta su nivel de incompetencia.
Ley de Reed
David P. Reed La utilidad de las grandes redes, particularmente de las redes sociales, aumenta exponencialmente con el tamaño de la red.
Ley de Rock
Arthur Rock El coste de una planta de fabricación de chips basados en semiconductores se duplica cada cuatro años.
Regla del sesenta-sesenta Robert Glass El sesenta por ciento del dinero empleado en desarrollo de software se gasta en mantenimiento, y el sesenta por ciento de ese mantenimiento es mejora.
Ley de Spector Lincoln Spector El tiempo que tu aplicación favorita tarda en completar una tarea se duplica con cada nueva revisión.
Regla de adopción de Spafford George Spafford Para casi cualquier tecnología, sea un sistema operativo, una aplicación o una red, cuando se alcanza un nivel de adopción suficiente, esa tecnología se convierte en un factor de riesgo.
Revelación de Sturgeon Theodore Sturgeon El noventa por cien de todo es basura.
Ley de Tesler de conservación de la complejidad Larry Tesler No se puede reducir la complejidad de una tarea más allá de cierto punto. Una vez que se ha alcanzado ese punto, sólo puedes desplazar la complejidad de una parte a otra.
Ley de Weibull Waloddi Weibull El logaritmo de la tasa de errores crece linealmente con el logaritmo de la edad del programa.
Ley de Wirth Niklaus Wirth El software se hace más lento, a más velocidad que la que el hardware se hace más rápido.





(Nota: me he tomado la libertad de corregir y ampliar la "cuchilla de Occam", que estaba expresada de forma un tanto confusa, y la ley de 90/90, que tenía una errata).

(Recuerda: aquí tienes la una recopilación por Joey DeVilla en GlobalNerdy, en inglés).

24 julio 2007

Jugando con Perl (3)

Ahora vamos a ver un poco sobre cómo manejar arrays (matrices, vectores) desde Perl.

La primera idea importante es que para declarar un array, el nombre de la variable no se precede con el símbolo de dolar ($) sino con la arroba (@), y los valores se detallan entre paréntesis, separados por comas:

@lista = (4, 3, 2, 1);

Se puede acceder a los valores individuales usando corchetes: el primer elemento sería @lista[0] y el cuarto sería @lista[3]. También se puede contar "hacia atrás": el último dato sería @lista[-1] y el penúltimo sería @lista[-2].

El tamaño se puede saber simplemente asignando el valor de un array a una variable "normal" (una variable "escalar", siguiendo la nomenclatura de Perl):

$longitud = @lista;

También existe una orden que permite recorrer una array de forma más sencilla que un "for". Se trata de "foreach", que se usa

foreach variable (lista) {
órdenes
}


por ejemplo

foreach $nombre (@listaNombres) {
print $nombre . "\n";
}


Este sería un ejemplo completo de todo ello:

@listaNumeros = (10,20,30,35);
@listaNombres = ("Juan", "Pedro", "Alberto");

print "Los numeros son: ";
for ($i=0; $i<=3; $i++) {
print @listaNumeros[$i] . " ";
}

print "\nLos numeros (de otra forma) son: ";
foreach $i (@listaNumeros) {
print $i . " ";
}

print "\nLos nombres son: ";
foreach $j (@listaNombres) {
print $j . " ";
}

print "\nEl primer nombre es: ".
$listaNombres[0] . "\n";

print "El ultimo numero es: ".
$listaNumeros[-1] . "\n";

$cantidadNumeros = @listaNumeros;
print "La cantidad de numeros es: ".
$cantidadNumeros . "\n";

@listaNumeros = ();
print "Ahora la cantidad de numeros es: ".
@listaNumeros . "\n";


que tendría como resultado:

Los numeros son: 10 20 30 35
Los numeros (de otra forma) son: 10 20 30 35
Los nombres son: Juan Pedro Alberto
El primer nombre es: Juan
El ultimo numero es: 35
La cantidad de numeros es: 4
Ahora la cantidad de numeros es: 0


El próximo día... las variantes en el manejo de if, while, etc...

18 julio 2007

Carta de derechos de un programador

Echando un vistazo al blog de Jeff Atwood (Coding Horror) he encontrado otro artículo que me gusta, como viene siendo frecuente. En este caso se trata de algunas de las condiciones básicas que todo programador debería tener (aquí está el original en inglés); incluyo los apartados del post original, junto con algún comentario mío indicado en cursiva:

1.-Todo programador tiene derecho a dos monitores (la ganancia en productividad -y por tanto en dinero para la empresa- es grande, desde luego mucho mayor que el coste de una segunda tarjeta gráfica y un segundo monitor; hay mucha gente que prefiere trabajar incluso con tres monitores, para que la zona central, justo enfrente de los ojos, no esté dividida).

2.-Todo programador tiene derecho a un pc rápido. Un desarrollador necesita ejecutar mucho software a la vez: entornos de desarrollo, bases de datos, maquinas virtuales, servidores web y mucho más. Cuanto más rápido sea el equipo, menos tiempo se perderá en ciclos de compilación y depuración. (También es deseable contar con un equipo "lento" en el que probar nuestro software, no sea que luego sólo funcione correctamente en equipos de gama alta, algo que es tristemente frecuente).

3.-Cada programador podrá elegir su teclado y ratón (qué menos que permitir que las herramientas con las que interaccionas continuamente sean de tu agrado).

4.-Todos los programadores tienen derecho a una silla confortable: pasamos 8 horas al día (o más) sentados en una silla, así que debería ser cómoda. No sólo hay que cuidar el cerebro.

5.-Todos los programadores tienen derecho a una conexión rápida: un buen programador no escribe el código que pueda reutilizar (y casi siempre, la pregunta a la que nosotros no encontramos solución... alguien se la ha hecho antes; Internet es una gran herramienta para un desarrollador, especialmente valiosa cuando nos enfrentamos a algo nuevo o cuando aparece alguna dificultad imprevista).

6.-Todos los programadores tienen derecho a tener un sitio de trabajo tranquilo: la programación requiere concentración mental, un entorno con distracciones continuas no permite trabajar de forma efectiva.


(Por supuesto, la lista se podría extender muuucho. Por ejemplo, poder usar unas buenas herramientas de desarrollo sería casi tan básico como los puntos anteriores, pero eso ya es algo que depende más de las tecnologías que se empleen, y en tecnologías novedosas a veces hay poca elección posible).


(Nota: esto no es una traducción estricta; si quieres leer más, o tener referencias a detalles como el uso de múltiples pantallas, deberías echar un vistazo al artículo original en inglés).

17 julio 2007

Jugando con Perl (2)

Ahora vamos a ver alguna de las características básicas de Perl como lenguaje, para poder comparar con otros como C.

Un ejemplo de cómo dar valores a variables y mostrar estos valores podría ser éste:

$x = 1;
$nombre = 'Nacho';
print "Hola, $nombre. x vale $x\n";


Como se puede ver, las variables "normales" (lo que en Perl se suele llamar "variables escalares") tienen un nombre que comienza por el símbolo $, y no es necesario declararlas ni indicar qué tipo de datos almacenarán, sino que se deduce a partir del contexto.

Por ejemplo, $x = 1 hará que la variable "x" almacene un número entero, de valor 1. De igual modo, $nombre='Nacho' guarda la cadena de texto "Nacho" en la variable "nombre".

Las cadenas de texto se pueden delimitar entre comillas dobles o comillas simples. La diferencia es que si se encierra entre comillas dobles, se sustituirán las variables que haya en su interior, escribiendo el valor de la variable en vez del nombre.

Estas tres órdenes se podrían teclear en un fichero llamado ejemplo1.pl, y pondríamos este programa en funcionamiento con

perl ejemplo1.pl

El resultado que obtendríamos sería

Hola, Nacho. x vale 1

(Al igual que en C, existen ciertos caracteres especiales, como el \n que nos permite avanzar de línea).


Eso de que no sea necesario declarar variables tiene su parte negativa: en este programa

$nombre = 'Nacho';
print "Bienvenido, $nombr.";

lo que se muestra en pantalla no es "Bienvenido, Nacho." sino "Bienvenido, .", porque hemos escrito mal el nombre de la variable.

(para evitar estos problemas, se puede obligar a que haya que declarar variables, ya veremos cómo).


Muchas de las estructuras básicas (comparaciones, bucles) recuerdan mucho a las de otros lenguajes como C. Un ejemplo podría ser:

$x = 5;
if ($x == 5) { print "x vale 5\n"; }

print "La tabla de multiplicar del 2 es:\n";
for ($i=1; $i<=10; $i++) {
print "2 x $i es " . $i*2 . "\n";
}

print "Y la tabla de multiplicar del 3 es:\n";
$i = 1;
while ($i<=10) {
print "3 x $i es " . $i*3 . "\n";
$i++;
}

La principal diferencia es que las llaves { y } después de las órdenes como "if" o como "for" son obligatorias, aunque sólo haya una orden en su interior. Por otra parte, el punto (.) se usa para crear una cadena formada por otras dos: $saludo = "Hola" . "Nacho"; haría que la variable "saludo" contuviese el texto "HolaNacho".

(Existen más variantes, como "unless" o "until", que veremos en la próxima entrega).

16 julio 2007

Paz entre Intel y OLPC?

Hablé con anterioridad del proyecto OLPC (One Laptop Per Child), que pretende ayudar al desarrollo de zonas deprimidas mediante el acercamiento de la tecnología, para lo que propone unos portátiles un tanto atípicos, con un precio cercanos a los 100 dólares. Pero había problemas. No se han pedido tantos como se esperaba, no se ha podido rebajar costes y el precio actual ronda los 175 dólares por equipo. Además, está la competencia de Intel, con su "Classmate Pc", que ofrece una arquitectura un poco más convencional por un precio no muy superior.


Ahora parece ser (según informa ABC news) que Intel ha decicido "hacer las paces" con el proyecto OLPC. Seguirá vendiendo su "ClassmatePC", cuyo precio ha bajado de los 400 dólares iniciales hasta entrar en el rango de los 200$, pero, a la vez, aportará dinero y experiencia técnica para OLPC.


La verdad es que los dos proyectos no son "competencia estricta", desde el punto de vista de que el OLPC puede funcionar sin estar conectado a la corriente eléctrica (recargándolo con su peculiar "manivela"), algo imposible en el "Classmate PC", de modo que este último nunca podría llegar a ciertas zonas en las que no haya fluido eléctrico.

Pero el hecho de que Intel se interese en un proyecto para el que su competidor AMD suministra los procesadores... y los podría vender a millones... quizá no sea del todo altruista... ;-)

Sea con la ayuda de Intel o sea a pesar de su competencia, esperemos que proyectos como OLPC ayuden al desarrollo de los lugares que más lo necesitan.

Para más detalles:

12 julio 2007

Jugando con Perl (1)

Perl no es el lenguaje que más de moda esté en este momento, pero sigue ahí. Y dicen que es un lenguaje potente, adecuado para automatizar tareas en un servidor, para crear CGIs o para integrarlo con Apache en un servidor web, por ejemplo. Y de hecho, muchos servidores de Internet lo incluyen, además de otros lenguajes que actualmente se oyen mencionar más, como PHP, o como Python (otro que aprenderé pronto... ;-) )

El caso es que, aprovechando las vacaciones, he decidido dedicar algo de tiempo a aprender cosas "nuevas". Y una de las que tenía en la lista es Perl. Cuento con la ayuda del libro "Perl in a Nutshell", que adquirí hace ya algún tiempo y que hasta ahora no había mirado más que por encima.

Iré avanzando y practicando, y dejando constancia de mis avances, por si a alguien más le resultaran útiles.

Hoy toca el primer acercamiento. Un primer vistazo a la sintaxis básica del lenguaje y al uso del intérprete bajo Windows.


Primer paso: descargar (e instalar) la versión "lista para usar" bajo Windows, desde

http://www.activestate.com/Products/ActivePerl/

Se trata de una descarga de unos 15 Mb de tamaño. En concreto, la versión que he descargado es la 5.8.8, en formato MSI (instalador de Windows). La instalación es poco más que hacer 3 clics en el botón "Siguiente". El resultado ocupa unos 78 Mb en el disco duro, y él mismo se encarga de situarlo en el Path (o eso se supone), para que podamos usarlo desde cualquier otra carpeta de nuestro ordenador.


Segundo paso: probar que funciona. Abro un intérprete de comandos (Inicio / Ejecutar / "cmd", o bien Inicio / Todos los programas / Accesorios / Símbolo del sistema, en ambos casos bajo XP).

Está instalado de c:\Perl así que voy hasta esa carpeta (concretamente hasta su subcarpeta "bin", que es donde se encuentra el intérprete):

c:
cd \perl\bin
dir


Y efectivamente, en esa carpeta hay 106 ficheros, en su mayoría ficheros EXE o ficheros BAT.

La sintaxis básica de Perl es muy parecida a la de C. Podemos escribir programas completos (eso mañana), pero también pedir al intérprete que ejecute una única orden, usando la opción "-e", así:

perl -e "print 'hola' "

Esto escribiría la palabra "hola" (sin las comillas, claro) en pantalla. Pero también podemos hacer algo ligeramente más complejo, como

perl -e "for ($i=0; $i<5; $i++) { print 'hola '; } "


que escribiría "hola hola hola hola hola " en pantalla.


Mañana más...

05 julio 2007

Correo yahoo ilimitado y potenciado

Allá por el mes de febrero comenté que Yahoo pretendía permitir acceso a su messenger desde el correo, lo que sería una forma más cómoda de poder acceder desde cualquier ordenador, sin necesidad de instalar software adicional, algo que desde hace mucho tiempo permitía MSN con su "webmessenger".

Hace cerca de una semana encontré por fin esa posibilidad en mi correo Yahoo.es. Ha tardado más de 4 meses en llegarnos a los hispanoparlantes, pero algo es algo. Ahora ya puedo usarlo desde Linux, o desde un ordenador que no sea el mío. Por fin Yahoo ha ganado el comodidad (de hecho, me gusta más el messenger integrado en Yahoo que el WebMessenger de MSN).

Pero no es sólo eso. también aparece ya el cartel de "Capacidad ilimitada en Correo Yahoo!". Ya han saltado del 1Gb que ofrecían (y que, dentro de todo, no era una mala cantidad) para ofrecer espacio ilimitado para almacenar los mensajes.

Si fuera algo más rápido, y permitiera usar distintas direcciones de correo (verificadas) como ya hace Google con su GMail, sería una alternativa muy interesante a éste. También debería estar mejor traducido. Pero bueno, con estas últimas mejoras se adelanta a GMail en dos facetas puntuales. Si a eso le añadimos que Flickr pertenece a Yahoo y que por ahora está mucho más extendido que el equivalente de Google basado en Picasa, la competencia está servida.

Y en este sector es muy bueno que haya competencia, ayuda a que todos los competidores se esfuercen por mejorar, y eso nos repercute a nosotros como usuarios.

Así que... que Yahoo siga mejorando... ;-)