26 marzo 2007

Calidad en programas pequeños

Cuando uno empieza a programar, muchas veces confunde un programa de calidad con un programa "vistoso". Por eso, voy a repasar algunos de los factores de calidad más frecuentes, y lo apoyaré con algún ejemplo aplicado a programas de pequeño tamaño (menos de 300 líneas de código, por ejemplo). Estos ejemplos en la mayoría de los casos los acercaré a lenguajes como C y C++.

Corrección
El programa es correcto si hace lo que el usuario quería que hiciera.
Un ejemplo: Tengo que calcular las soluciones de una ecuación de segundo grado. Aplico la fórmula x1 = (- b + sqrt(b*b - 4*a*c) ) / 2 * a ... Pero debería dividir entre (2*a), he olvidado un paréntesis, así que la solución es incorrecta. Si no hago suficientes pruebas (por ejemplo, sólo miro la ecuación x2 - 4 = 0), es fácil que se me escape.

Fiabilidad
El programa es fiable si se comporta correctamente, incluso en situaciones inesperadas. Esto incluye los casos en que los datos que recibimos no sean los correctos.
Ejemplo: ¿Qué hace mi programa si no existe el fichero de datos? ¿Y si el usuario teclea una texto en vez de un número?

Eficiencia
Un programa es eficiente si la cantidad de recursos y de código que necesita para realizar una función son razonables.
Ejemplo: voy a abrir un fichero de configuración, pero no sé manejar memoria dinámica, así que reservo espacio para 10.000 líneas... por si acaso.

Seguridad
Es el grado en el que se controla el acceso al programa o los datos por usuarios no autorizados.
Ejemplo: Mi programa tiene un interfaz web. ¿Puede un usuario entrar directamente a la pantalla de visualización de datos, sabiendo su URL, sin haber pasado antes por la pantalla de validación?

Facilidad de uso
Indica el esfuerzo necesario para aprender, manejar, preparar entradas e interpretar la salida de un programa.
Ejemplo: ¿Tiene el usuario información en pantalla sobre las teclas que debe usar? ¿Hay ayuda disponible? ¿Se puede salir pulsando ESC o hay que pulsar Ctrl+Alt+Mays+S?

Mantenibilidad
Es el esfuerzo requerido para localizar y corregir un error en un programa en funcionamiento (el programa debería ser fácil de leer, fácil de modificar)
Ejemplo: ¿Uso siempre variables de una sola letra, o nombres más significativos? ¿Pongo comentarios en lo que no es evidente? ¿Tengo funciones de 300 líneas o de 20 líneas? ¿Están disponibles los diagramas de diseño?

Facilidad de prueba
Es el esfuerzo necesario para probar un programa (cuando se quiere garantizar que realiza la función deseada).
Ejemplo: ¿He creado una función que recibe parámetros y devuelve resultados, de forma que pueda hacer pruebas repetitivas, contrastando los resultados obtenidos con resultados conocidos? ¿O está todo dentro de "main" y sólo puedo hacer pruebas tecleando valores?

Flexibilidad
Indica si es fácil modificar un programa que ya está en funcionamiento.
Ejemplo: si decido que la variable "contador" no debería ser un "int", sino un "long", ¿tendré que modificar muchas partes de mi programa?

Portabilidad
Es el esfuerzo requerido para trasferir un programa de una configuración hardware o entorno software a otro.
Ejemplo: He creado mi programa de prueba con Windows, que es lo que tengo en casa. ¿Funcionará en el Linux que hay instalado en mi centro de estudios, o he usado funciones exclusivas de Dos/Windows, como getch o clrscr?
Y otro caso "más profesional": voy a crear pequeño programa con interfaz gráfico. ¿Todos los usuarios lo manejarán siempre desde Windows? ¿O me puede interesar usar una biblioteca multiplataforma como Qt o Gtk, por si algún usuario prefiere (o necesita) usar Linux o MacOs X?

Reusabilidad
Es el grado en que lo que se ha desarrollado para un programa se puede utilizar en otras aplicaciones.
Ejemplo: Voy a hacer un programa parecido, pero con ciertas posibilidades nuevas. ¿Podré aplicar lo que he hecho o tendré que volver a crear muchas cosas que ya hice?

Interoperatividad
Es una medida del esfuerzo necesario para acoplar un sistema con otro.
Ejemplo: ¿Podré hacer que mi utilidad lea los ficheros de datos que manejaban las demás aplicaciones del sistema? ¿Y los ficheros de datos que genere se podrán manipular directamente desde aquellas? ¿Podré incluso pasar datos "al vuelo", sin necesidad de usar ficheros intermedios?


Como se puede ver, todo son "puntos a tener en cuenta", pero en la mayoría de los casos no existe una forma clara de "medir" hasta qué punto se ha conseguido aplicar un cierto criterio. Aun así, aunque no se pueda decir "ahora mi programa es el doble de portable que antes", deberíamos considerar estos puntos cuando programamos, para acercarnos a ese "programa de calidad" que pretendemos hacer.

Referencias (hay muchas fuentes de información en Internet; éstas son sólo por citar unas cuantas):

Breves notas sobre la Medición de los Atributos Externos del Software
http://www.sc.ehu.es/jiwdocoj/mmis/externas.htm

La importancia de las buenas prácticas en el desarrollo de aplicaciones Java
http://www.als-es.com/home.php?location=recursos/articulos/buenas-practicas-java

Aspectos de Calidad en el Desarrollo de Software Basado en Componentes
http://www.lcc.uma.es/~av/Publicaciones/02/CalidadDSBC.pdf

A Pattern Framework for Software Quality Assessment And Tradeoff
www.eelke.com/research/literature/SQTRF.pdf

Food for Thought: How Do You Define Software Quality?
www.swqual.com/newsletter/vol1/no4/vol1no4.html

21 marzo 2007

Vuelve el Google Summer of Code

¿Te apetece trabajar durante el verano en un proyecto Open Source, ganando 4.500 dólares, y teniendo a Google como mentor?

Pues el tiempo se acaba. Hasta el 26 de marzo está abierto el plazo de solicitudes para el Google Summer of Code 2007. Este es el tercer año. En 2005 se admitieron cerca de 400 estudiantes, que aumentaron hasta unos 600 en 2006, y esa es la previsión de admisiones para este año.

No es una oferta de trabajo, pero a nadie se le escapa que si el estudiante resulta bueno en su trabajo, tiene posibilidad de incorporarse en la empresa con la que haya colaborado. Y es que hay que recordar que el hecho de que un proyecto sea Open Source no quiere decir que no genere dinero. Muchas empresas generan una buena cantidad de dinero a partir de la consultoría sobre productos Open Source, o en algunos casos con versiones "profesionales", que ofrecen más prestaciones.

Puedes colaborar en proyectos como Gnome, KDE, OpenOffice.org, Apache, Mono, FreeBSD, OpenSolaris, Ubuntu, Gentoo, MySQL, PostgreSQL, Firefox, Wine, WxWidgets, WordPress, Moodle, ... Si te animas, la lista completa la tienes disponible (en inglés, "por supuesto") en:

http://code.google.com/soc/

Y recuerda: las solicitudes sólo se admiten durante 10 días... y ya han pasado 5...

10 marzo 2007

Un PC de 26.000 dolares

Los de PC-Welt deben aburrirse.

El caso es que se les ha ocurrido montar un "Super-PC". Y les ha salido una maquinita de unos 26.000 dólares.



Su nombre es Höllenmaschine II (algo así como "máquina del infierno 2"). Incluye "detallitos" como:
  • Dos procesadores Xeon DP 5355 de cuádruple núcleo a 2,67 Ghz.
  • Nueve discos duros SAS (Serial Attached SCSI) con un total de 4,3 Terabytes (incluyendo un extraible de 750 GB).
  • 4 módulos de memoria dual channel Corsair CM73DD1024R-667, de 1 Gb cada uno.
  • Dos tarjetas gráficas basadas en Nvidia Geforce 8800 GTX, con soporte para DirectX 10.
  • Una unidad de Blu-Ray 2x (capaz de grabar un disco 25 Gb en 45 minutos, además de leer y grabar CD y DVD).
  • Una fuente de alimentación de 1.000 W (qué menos, con tanta maquinaria dentro).
  • Una pantalla Benq de 24" que soporta hasta 1920 x 1200 puntos... acompañada por una pantalla táctil de 8".
  • Una tarjeta de sonido Sound Blaster X-Fi Fatality FPS acompañada de un conjunto de altavoces inalámbricos envolventes.
  • Una caja echa a medida por uno de los modders más prestigiosos, y acabada con pintura de coche Porsche. Sólo la pintura cuesta cerca de 1000 dólares.

¿Quien se atreve a hacerse uno similar para casa...? ;-)

El artículo completo (en inglés) en www.pcwelt.de/news/englishnews/Hardware/74058/index.html

01 marzo 2007

Taglines para informaticos

Hay muchas "frases simpáticas" de esas que sólo un informático puede entender. Aquí van unas cuantas...

(Versión 1.1)
  1. Dios no hace programas. Yo no hago milagros.
  2. A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos de leer manuales.
  3. La programación demuestra que la selección natural es cierta: cada vez que hago un programa a prueba de tontos, aparece un tonto mejor.
  4. Me encantaría cambiar el mundo, pero ellos no quieren darme el código fuente.
  5. La documentación es como el sexo: cuando es buena, es muy muy buena;
    cuando es mala, todavía es mejor que nada.
  6. Mi software nunca tiene bugs. Solamente desarrolla características al azar
  7. Un ordenador puede cometer tantos errores en dos segundos como 20 hombres trabajando durante 20 años. (Ley de Murphy)
  8. To see tomorrow's PC, look at today's Macintosh. (BYTE, Oct. 1995.)
  9. Los viejos ordenadores acaban en los museos; los viejos programas
    acaban en producción. (Eric Bush)
  10. WINDOWS VISTA - From Microsoft, the makers of the 640K Barrier
  11. A computer without Windows is like a fish without a bicycle
  12. En los CDs de Microsoft, si los pones al reves escuchas un mensaje satanico. Pero eso no es lo peor, al derecho, te instala windows
  13. WARNING: cannot run this virus - Windows required
  14. WARNING: You're trying to multitask from Windows!
  15. WINDOWS ERROR 44: File Not Found, Wanna play Solitaire?
  16. Windows no es un virus: un virus hace algo!
  17. WIN95: From the People who brought you Edlin
  18. Error de Windows: Teclado no detectado, pulse cualquier tecla
  19. Use The Best... Linux for Servers, Mac for Graphics, Palm for Mobility, Windows for Solitaire
  20. La inteligencia artificial es incapaz de hacer sombra a la estupidez natural.
  21. ¿Quieres que Windows vaya más rápido? ¡Tíralo con más fuerza!
  22. Shouldn't Microsoft's slogan be, "Where do you want to [reboot/GPF/BSOD] today?"
  23. 1f u c4n r34d th1s u r34lly n33d t0 g37 l41d
  24. No soy antisocial; Soy de interfaz poco amigable
  25. Las contraseñas son como la ropa interior: Nunca tienes que dejarlas donde la gente pueda verlas, tienes que cambiarlas regularmente y no tienes que dejarselas a extraños.
  26. Las rosas son #ff0000 las violetas son #0000ff.
  27. Unix, Dos y Windows, el bueno, el feo y el malo
  28. Las chicas son como los nombres de dominio, todos los que me gustan están ya pillados
  29. Eso parece un típico problema PETS (el Problema está Entre el Teclado y la Silla)
  30. If at first you don't succeed; call it version 1.0
  31. Never underestimate the inability of Microsoft to do things properly. ("Nunca infravalores la incapacidad de Microsoft de hacer las cosas bien", Michael Hedberg)
  32. In a world without fences, who needs Gates?
  33. If you hate someone get them a Zune, Vista, and DRM protected hardware...
  34. Yo solía tener una vida... Ahora tengo un ordenador!
  35. Multitarea real: 3 ordenadores y una silla con ruedas.
  36. Recuerda, para un ordenador 1 + 1 = 10.
Y una cita sin número, porque es un hecho totalmente verídico: desde hace pronto, mi ordenador del trabajo dice "Esta versión de Windows ya no es segura". Y se queda tan tranquilo. Como si hubiera sido segura alguna vez...


Sí, es cierto, Muchas de estas citas critican a Windows (o a Microsoft). Pero es que Windows es tan criticable que la tentación es grande... ;-)

(Ligera ampliación el día 08/03: de 25 a 36+1 citas).

Entre ellas, por supuesto, unas cuantas contribuciones del sr. Ubuntero Errante