martes, 26 de enero de 2010

La parábola de la tostadora



Érase una vez, en un reino no muy lejano, un rey que convocó a dos de sus consejeros para ponerlos a prueba. Les mostró a ambos una brillante caja de metal, con dos ranuras en la parte superior, un interruptor de control y una palanca. "¿Qué pensáis que es?" -les preguntó.
Uno de los consejeros, a la sazón Ingeniero eléctrico, respondió primero. "Es una tostadora" -dijo.
El rey volvió a preguntar, "¿Cómo diseñaríais un ordenador embebido para él?"
El consejero respondió: "Usando un microcontrolador de cuatro bits, escribiría un sencillo programa que leyera el nivel de tostado que marca el interruptor y cuantificara su posición en una de 16 posiciones de oscuridad, desde el blanco nieve al negro carbón. El programa usaría ese nivel de oscuridad como índice de una tabla de 16 elementos con valores de tiempo predeterminados. Después encendería los elementos de calor y arrancaría el temporizador con el valor predeterminado seleccionado de la tabla. Una vez transcurrido el tiempo, se apagarían las resistencias y haría saltar la tostada. Si su majestad vuelve la semana que viene, le mostraré un prototipo funcional."
El segundo consejero, un desarrollador de software, reconoció inmediatamente el peligro de una perspectiva tan limitada. Y dijo "Las tostadoras no sólo convierten el pan en tostadas; también se usan para calentar tortitas congeladas. Lo que tenemos delante es en realidad una herramienta para cocinar desayunos. A medida que los ciudadanos de su reino se vuelvan más sofisticados, demandarán más capacidades. Necesitarán una herramienta para cocinar desayunos que también pueda cocinar salchichas, freír bacon y hacer huevos revueltos. Una tostadora que sólo haga tostadas quedará pronto obsoleta. Si no pensamos en el futuro, tendremos que rediseñar completamente la tostadora dentro de pocos años.

Con esta idea en la cabeza, podemos formular una solución más inteligente al problema. Primero, crearemos la clase "comidas de desayuno". Especializaremos esta clase en subclases: cereales, cerdo y aves. Este proceso de especialización debería repetirse con los cereales divididos en tostadas, magdalenas, bollos y tortas; cerdo dividido en salchichas, rodajas y beicon; y las aves se repartirían entre huevos revueltos, huevos duros, huevos escalfados, huevos fritos, y diversas clases de tortilla. La clase de tortillas de jamón y queso merece una atención especial porque debe heredar características de las clases de cerdo, queso y ave. Aún más, vemos que el problema no puede resolverse adecuadamente sin herencias múltiples. En el momento de la ejecución, el programa debe crear el objeto correspondiente y enviar un mensaje al objeto que dice "Cocina por ti mismo". La semántica del mensaje depende, por supuesto, del tipo de objeto, de forma que tendrá un significado diferente para una tostada que para unos huevos revueltos.

De hecho, revisando el proceso que llevamos hasta el momento, vemos que la fase de análisis ha revelado que el requerimiento principal es cocinar cualquier tipo de comida de desayuno. En la fase de diseño se han revelado algunos requisitos derivados. Específicamente, necesitamos un lenguaje orientado a objetos con herencias múltiples. Está claro que los usuarios no quieren que los huevos se enfríen mientras se hace el beicon, así que también se necesita un procesado concurrente. Y no debemos olvidar el interfaz de usuario. La palanca que baja la comida carece de versatilidad, y el interruptor de nivel de tostado es confuso. Los usuarios no comprarán el producto a menos que tenga un interfaz gráfico de usuario amigable. Cuando el "cocinador de desayunos" se conecte, los usuarios deberían ver una bota de vaquero en la pantalla. Los usuarios harán clic en ella y el mensaje "Arrancando UNIX v.8.3' aparece en la pantalla (UNIX 8.3 ya debería haber salido para cuando el producto se empiece a comercializar). Los usuarios podrán desplegar un menú y hacer clic en las comidas que quieran cocinar.

Habiendo tomado la sabia decisión de especificar el software en la fase de diseño, sólo resta escoger una plataforma adecuada de hardware para la fase de implementación. Un Intel Pentium con 48 MB de memoria, un disco duro de 1,2 GB, y un monitor SVGA deberían ser suficientes. Si seleccionamos un lenguaje de programación multitarea orientado a objetos que soporte las herencias múltiples y tenga un interfaz gráfico incorporado, se tardará muy poco en escribir el programa."
El rey mandó cortar la cabeza al desarrollador de software, y todos vivieron felizmente desde entonces.



Link