viernes, 23 de julio de 2010

Sistema experto de diagnóstico

Un diagnóstico es aquello perteneciente o relativo a la diagnosis. Este término, a su vez, hace referencia a la acción y efecto de diagnosticar, que viene a ser equivalente a recoger y analizar datos para evaluar problemas de diversa naturaleza. En medicina, el diagnóstico o propedéutica clínica es el procedimiento por el cual se identifica una enfermedad, entidad nosológica, síndrome, o cualquier condición de salud-enfermedad, el "estado de salud" también se diagnostica. En psicología clínica, el diagnóstico se enmarca dentro de la evaluación psicológica, y supone el reconocimiento de una enfermedad o un trastorno a partir de la observación de sus signos y síntomas. En enfermería, constituye la segunda etapa del proceso de enfermería, donde se analizan los datos acerca del paciente para identificar los problemas que constituirán la base del plan de cuidados. Un diagnóstico de enfermería es un problema de salud real o potencial, aquel que los profesionales de enfermería, en virtud de su formación y experiencia, tienen capacidad y derecho legal de tratar.

En términos de la práctica médica, el diagnóstico es un juicio clínico sobre el estado psicofísico de una persona; representa una manifestación en respuesta a una demanda para determinar tal estado. El diagnóstico clínico requiere tener en cuenta los dos aspectos de la lógica, es decir, el análisis y la síntesis, utilizando diversas herramientas como la anamnesis, la historia clínica, exploración física y exploraciones complementarias. El diagnóstico médico establece a partir de síntomas, signos y los hallazgos de exploraciones complementarias, qué enfermedad padece una persona. Generalmente una enfermedad no está relacionada de una forma biunívoca con un síntoma, es decir, un síntoma no es exclusivo de una enfermedad. Cada síntoma o hallazgo en una exploración presenta una probabilidad de aparición en cada enfermedad.

El sistema experto ayuda al diagnóstico de una enfermedad a partir de los síntomas y otros hallazgos que presenta el paciente si las enfermedades son mutuamente excluyentes, se conoce sus prevalencias y la frecuencia de aparición de cada síntoma en cada enfermedad. Según la prevalencia de cada enfermedad en cada población, un mismo conjunto de síntomas o síndrome puede producir un diagnóstico diferente en cada población, es decir, cada síndrome puede estar producido por una enfermedad diferente en cada población.

Las principales herramientas que se utilizan para el diagnóstico son las siguientes: (1) Síntomas. Constituyen las experiencias subjetivas negativas físicas que refiere el paciente, recogidas por el médico en la anamnesis durante la entrevista clínica, con un lenguaje médico, es decir comprensible para todos los médicos. Por ejemplo, los pacientes a la sensación de falta de aire o percepción incómoda y desagradable en la respiración, disnea, la denominan ahogo, angustia, fatiga, cansancio fácil. (2) Signos. Son los hallazgos objetivos que detecta el médico observando al paciente, por ejemplo la taquipnea a más de treinta respiraciones por minuto. (3) Exploración física o semiotécnica. Consiste en diversas maniobras que realiza el médico sobre el paciente, siendo las principales la inspección, palpación, percusión, oler y auscultación, con las que se obtienen signos clínicos más específicos. Todos los síntomas referidos en la anamnesis y los signos objetivados en la exploración física son anotados en la historia clínica del paciente. Generalmente, los signos y síntomas definen un síndrome que puede estar ocasionado por varias enfermedades. El médico debe formular una hipótesis sobre las enfermedades que pueden estar ocasionando el síndrome y para comprobar la certeza de la hipótesis solicita exploraciones complementarias.

A grandes rasgos, el problema del diagnóstico en inteligencia artificial consiste en determinar a partir del conocimiento de las leyes que rigen el comportamiento de un sistema y de un conjunto de medidas, observaciones o síntomas, cuáles son las causas, o los componentes del sistema responsables en última instancia de un posible comportamiento anómalo. Esto es válido para cualquier tipo de diagnóstico ya sea para la detección de una rotura en una pieza de un equipo o para el diagnóstico médico de enfermedades. Cuando un paciente acude al hospital con dolor o presentando ciertos síntomas, el médico debe aplicar sus conocimientos aceleradamente para prevenir un daño mayor o corregir la condición del paciente, y para esto debe recordar docenas de indicadores y buscar “rápidamente” en su memoria qué ha hecho antes, cuando un paciente en tal estado ha acudido buscando su ayuda, o qué registra la literatura médica ante un hecho similar determinando así la causa del malfuncionamiento de ser detectada alguna. Dos condiciones pueden presentarse en este ejemplo, el médico no conoce la información que precisa y no tiene en ese momento acceso a un experto que sí la tenga, segunda, el médico necesita esta información rápidamente para realizar su trabajo.

Un sistema experto es llamado así porque emula el comportamiento de un experto en un dominio concreto y en ocasiones es usado por éste. Con los sistemas expertos se busca una mejor calidad y rapidez en las respuestas dando así lugar a una mejora de la productividad del experto. Un sistema experto es una aplicación informática capaz de solucionar un conjunto de problemas que exigen un conocimiento altamente especializado sobre un determinado tema. Un sistema experto es un conjunto de programas que, sobre una base de conocimiento, posee información de uno o más expertos en un área específica. Se puede entender como una rama de la inteligencia artificial. Estos sistemas imitan las actividades de un humano para resolver problemas de distinta índole. También se dice que un sistema experto se basa en el conocimiento declarativo, referido como hechos sobre objetos o situaciones y el conocimiento de control, entendido este como información sobre el seguimiento de una acción.

Para que un sistema experto se constituya una herramienta efectiva, los usuarios deben interactuar de una forma fácil, reuniendo las siguientes dos capacidades: (1) Explicar su razonamiento o base de conocimiento. Los sistemas expertos se deben realizar siguiendo ciertas reglas o pasos comprensibles de manera que se pueda generar la explicación para cada una de estas reglas, las que a la vez se encuentran fundamentadas en hechos. (2) Adquisición de nuevos conocimiento o integrador del sistema. Son mecanismos de razonamiento que sirven para modificar conocimientos anteriores. Sobre la base de lo anterior se puede decir que los sistemas expertos son el producto de investigaciones en el campo de la inteligencia artificial ya que ésta no intenta sustituir a los expertos humanos, sino que desea ayudarlos a realizar con más rapidez y eficacia las tareas que realiza.

El año 1969 Buchanan desarrolla el sistema experto “Dendral”, que realizaba la tarea de resolver la estructura molecular de una sustancia a partir de la información que provenía de un espectrómetro de masa. Este programa funcionaba de manera aceptable para moléculas complejas, probando con esto que las técnicas de la inteligencia artificial pueden ser aplicadas a dominios reales y no solamente a casos de laboratorio. Este fue el primer programa utilizado que contenía información sobre el dominio y las reglas para resolverlas, además se lo puede ver como uno de los precursores de los sistemas expertos basados en conocimiento. Una de las primeras aplicaciones útiles fue “Mycin” de los autores Feigenbaum, Buchanan y Shortliffe, para el diagnostico de las infecciones sanguíneas. Constaba aproximadamente de cuatrocientas cincuenta reglas y se comportaba tan bien como un experto, y considerablemente mejor que un doctor recién recibido. Es una de las primeras aplicaciones que integra las incertezas dentro del dominio como una forma de emular la complejidad del dominio medico, ya que varias enfermedades pueden tener los mismos síntomas, o una enfermedad puede casi no presentar síntomas mesurables.

Los sistemas expertos son máquinas que piensan y razonan como un experto lo haría en una cierta especialidad o campo. Por ejemplo, un sistema experto en diagnóstico médico requeriría como datos los síntomas del paciente, los resultados de análisis clínicos y otros hechos relevantes, y, utilizando éstos, buscaría en una base de datos la información necesaria para identificar la correspondiente enfermedad. Un buen sistema experto no sólo realiza las funciones tradicionales de manejar grandes cantidades de datos, sino que también maneja esos datos de forma tal que el resultado sea inteligible y tenga significado para responder a preguntas incluso aquellas no completamente especificadas.

Los sistemas expertos de diagnóstico vienen de la clasificación particular que suele hacerse al interior de la función que realizan, en este entendido un sistema experto de diagnóstico es aquel que se encarga de inferir las fallas de un sistema con base en los síntomas previos que el mismo presenta. Utiliza las características de comportamiento, descripción de situaciones o conocimiento sobre el diseño del un componente para inferir las causas de una falla. Algunos ejemplos notables constituyen el diagnóstico de enfermedades con base en síntomas, la búsqueda de componentes defectuosos o fallas en los circuitos.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Mayo 17 de 2010

viernes, 16 de julio de 2010

Inteligencia artificial distribuida

La existencia de un único formalismo de representación puede no ser suficiente para capturar todos los atributos relevantes de un dominio en el que muy diferentes tareas confluyen. En problemas complejos diversas tareas han de ser aprendidas, pues la solución satisfactoria de estos problemas requiere la concurrencia de muy diversas habilidades, los métodos aplicados en unos casos pueden no ser los apropiados en otros. No es de esperar que un único sistema sea capaz de aprender funciones discontinuas. Una función discontinua puede representar diferentes comportamientos en diferentes regiones del dominio, y el conocimiento aprendido en una región, puede no ser aplicable en otras. Por consiguiente, los sistemas monolíticos están limitados a una única manera de interpretar sus entradas y producir soluciones, es decir, a una única forma de resolver problemas. Este planteamiento puede resultar inadecuado cuando los datos provienen de fuentes heterogéneas, reflejan diferentes comportamientos y llegan por flujos de entrada en paralelo.

En contraposición a los sistemas monolíticos, la inteligencia artificial distribuida integra los conceptos de dos campos del conocimiento: la inteligencia artificial y los sistemas distribuidos. El campo de la inteligencia artificial intenta comprender las entidades inteligentes, pero diferente de la filosofía y la sicología que también intentan hacer lo mismo, la inteligencia artificial intenta construir entidades inteligentes. El campo de los sistemas distribuidos estudia las propiedades de conjuntos de procesadores autónomos que no comparten memoria primaria, pero sí cooperan comunicándose por medio del envío de mensajes sobre una red de comunicación. A partir de los conceptos de inteligencia artificial y sistema distribuido mencionados, la inteligencia artificial distribuida puede ser definida como un campo del conocimiento que estudia e intenta construir conjuntos de entidades autónomas e inteligentes que cooperan para desarrollar un trabajo y se comunican por medio de mecanismos basados en el envío y recepción de mensajes.

La inteligencia artificial distribuida es un campo de la inteligencia artificial dedicada al estudio de las técnicas y el conocimiento necesario para la coordinación y distribución del conocimiento y las acciones en un entorno con múltiples agentes. Se puede distinguir dos áreas principales de desarrollo: (1) Solución cooperativa de problemas distribuidos. Estudia como unos conjuntos de módulos, o nodos, cooperan para dividir y compartir el conocimiento de un problema y en el desarrollo de la solución. (2) Sistemas multiagente. Estudia la coordinación de la conducta inteligente entre un conjunto de agentes inteligentes autónomos.

La principal diferencia entre ambas áreas estriba en la flexibilidad de la coordinación entre los agentes. En la solución cooperativa de problemas distribuidos, las interacciones y tareas que cada agente realiza, están prefijadas de antemano, hay un plan centralizado de resolución de problemas. Suele haber un miembro que ejerce un control global que centraliza los resultados parciales y datos entre el resto de los componentes del sistema. En contraposición en los sistemas multiagente, los agentes tienen un grado de autonomía mayor y pueden decidir dinámicamente que interacciones son adecuadas, que tareas deben realizar, quien realiza cada tarea y, además, es posible mantener conocimiento que no es globalmente consistente, incluso los agentes pueden mantener objetivos globales diferentes. Esta definición permite distinguir entre sistemas que se centran en el comportamiento global, con una conducta fija de los agentes, Solución cooperativa de problemas distribuidos, y sistemas que se centran en la conducta de los individuos que como resultado, obtenían una conducta del sistema, sistema multiagente. Vista como una sociedad, seria escoger entre un estado que planifica y regula las conductas de los individuos (que serán predecibles) o dejar que el sistema se resuelva por la libre iniciativa de los individuos.

La inteligencia artificial distribuida aparece en la década de los años 1980 como una nueva rama de la inteligencia artificial que tiene el fin de estudiar sistemas inteligentes formados por un conjunto de varios agentes, estos intentan resolver problemas en donde una conducta colectiva es más eficiente que una conducta individual, como lo estudia la inteligencia artificial que hace el análisis de un único agente que se encuentra en un ambiente no cambiante y que intenta resolver todo el problema con solo esta entidad. La dimensión y la complejidad de los nuevos sistemas de información son cada vez mayores, los planes para encontrar una solución global ante cierto problema necesitan integrar soluciones de problemas más pequeños. Lo anterior se asemeja a la idea de “divide y vencerás”, en la cual los planes para resolver subproblemas son más simples y precisos.

Las principales razones de transición de la inteligencia artificial hacia la inteligencia artificial distribuida son: (1) Razones epistemológicas. Las razones epistemológicas surgen principalmente cuando las propuestas para solucionar problemas mediante la inteligencia artificial se muestran insuficientes ante la aparición de otros agentes en el entorno social de agentes que es manejado por la inteligencia artificial y la consideración de que los agentes son inteligentes en gran medida en cuanto sociales. (2) Razones técnicas. La primera razón técnica es que en esta época muchos problemas son esencialmente distribuidos y la segunda es la integración de los sistemas de inteligencia artificial para mejorar la capacidad mediante la distribución del conocimiento lo que conlleva a un manejo descentralizado ofreciendo las siguientes ventajas: (a) Incremento de la flexibilidad. Se permite la adición de nuevos agentes. (b) Mejor seguridad y efectividad. Los agentes se pueden especializar en una tarea específica. (c) Mejor tiempo de respuesta. Los agentes pueden resolver sus problemas particulares al mismo tiempo. (d) Reducción de la complejidad. Una tarea puede ser descompuesta en varias subtareas y ser asignadas a los agentes. (e) Reutilización: La solución presentada por un agente en un sistema puede ser incorporada a otro.

Los problemas básicos que estudia la inteligencia artificial distribuida y que son comunes a todos los sistemas son: (1) Como formular, describir, descomponer y asignar problemas y sintetizar los resultados entre un grupo de agentes inteligentes. (2) Como capacitar a los agentes para que se comuniquen e interactúen, que lenguajes de comunicación o protocolos deben utilizarse, que y cuando deben comunicarse, etc. (3) Como asegurar que los agentes actúen coherentemente al tomar decisiones o realizar acciones, como acomodar los efectos globales de las decisiones locales y prevenir interacciones no deseadas. (4) Como capacitar a los agentes para representar y razonar sobre acciones, planes y conocimientos de otros agentes para coordinarse; como razonar sobre el estado de su proceso de coordinación, en el inicio o la terminación. (5) Como reconocer y reconciliar puntos de vista e intenciones conflictivas entre un conjunto de agentes para coordinar sus acciones; como sintetizar los puntos de vista y los resultados. (6) Como utilizar técnicas ingenieriles y desarrollar sistemas con inteligencia artificial distribuida. Como desarrollar plataformas de sistema multiagente y metodologías de desarrollo con temas de inteligencia artificial distribuida.

Los anteriores problemas básicos que intenta atacar la inteligencia artificial distribuida se solucionan mediante diferentes teorías que se ven reflejadas en distintas áreas de trabajo, las cuales se pueden descomponer en cuatro perspectivas: (1) Perspectiva de grupo. Estudia las teorías y técnicas que caracterizan a un grupo de agentes, es decir los métodos necesarios para formar una sociedad de agentes para que exista cierto grado de planeación, coordinación, comunicación y coherencia entre sus entidades. (2) Perspectiva de agente. Estudia la entidad agente, arquitecturas para desarrollo de agentes, lenguajes para desarrollo y comunicación de agentes, clasificación de tipo comercial y estructural, además como puede este cooperar en la sociedad de agentes. (3) Perspectivas particulares.

Estudia las relaciones existentes de campos de la informática como la inteligencia artificial, ingeniería del software con la inteligencia artificial distribuida. Por ejemplo sistemas de información abiertos que reaccionan a casos imprevistos, por lo que son inconsistentes, asíncronos, concurrentes, con control descentralizado; ecosistemas para evaluar un agente o la sociedad de agentes con base en una analogía ecológica y ver como esta evoluciona con el paso de las iteraciones; ingeniería de software basada en agentes los agentes encapsulan los programas y mediante la definición de unas primitivas, permiten el intercambio de órdenes y datos entre los programas. En este proyecto se utilizaran algunos campos de la inteligencia artificial para relacionarlos con los agentes como: algoritmos genéticos para desarrollar el ecosistema de agentes y la recuperación de información. (4) Perspectivas del diseñador. Estudia metodologías y herramientas para desarrollar software basado en agentes. Las metodologías asisten al desarrollador de sistemas de inteligencia artificial distribuida en el ciclo de vida, y las herramientas le sirven en la implementación de dichos sistemas.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Mayo 10 de 2010


viernes, 9 de julio de 2010

Lenguaje para marcado de hipertexto

La World Wide Web, nace el año 1989 gracias a los esfuerzos realizados por un investigador, del Centro Europeo de Investigación Nuclear, llamado Tim Berners-Lee quien inventó un sistema de intercambio de información en la red con posibilidades multimedia, que se conocería posteriormente como el servicio World Wide Web para Internet. Para ello Berner-Lee diseñó un esquema basado en tres pilares: (1) Un “Identificador Universal de Recursos” para que todos los documentos tengan un nombre único. (2) Un “Protocolo de Transferencia de Hipertexto” para la gestión de tráfico documental. (3) Un “Lenguaje para el Marcado de Hipertexto”, para la creación y edición de los documentos Web. Este sistema podía ser conceptualizado como una gran red de discos duros donde se alojarían los millones de documentos Web enlazados entre sí. En esta línea podía pensarse en Internet como un espacio de flujo incesante, en el cual permanentemente circulan representaciones simbólicas en forma de arte, dinero, conocimiento, entretenimiento, luchas sociales, etc. Es decir, es posible pensar en la red como un espacio privilegiado por donde fluye el poder, bajo una forma específica de sociabilidad. Dado que actualmente existen varios protocolos que gestionan el tráfico documental y de contenido en Internet se hace necesario estandarizar la normativa que haga posible su compatibilidad. Desde los comienzos, el “Consorcio de la World Wide Web” presidida por su creador Tim Berners-Lee, es la organización que elabora y publica los estándares que hacen posible la Web.

El “lenguaje para el marcado de hipertexto”, es el código que posibilita la creación y edición de documentos Web. Es un metalenguaje heredado del “lenguaje de marcado generalizado estándar” basado en etiquetas, que tiene como virtud entre otras, la de poder ser implementado por código de otros lenguajes como JavaScript o Visual Basic Script que amplían y mejoran su capacidad original. El código del lenguaje para el marcado de hipertexto utiliza el código ASCII puro que puede ser incorporado en cualquier editor básico para posteriormente ser interpretado secuencialmente por un objeto cliente denominado navegador, que se encarga de visualizar el resultado en pantalla. La sintaxis del lenguaje para el marcado de hipertexto está estructurada según el siguiente protocolo: (1) Una etiqueta inicial que señala el comienzo de un elemento. (2) Un número determinado de atributos y sus valores asociados. (3) Una cierta cantidad de contenido, compuesto por caracteres y otros elementos. (4) Una etiqueta que marca el final.

El lenguaje para el marcado de hipertexto es el lenguaje de marcado predominante para la elaboración de páginas Web. Es usado para describir la estructura y el contenido en forma de texto, así como para complementar el texto con objetos tales como imágenes. El lenguaje para el marcado de hipertexto se escribe en forma de "etiquetas", rodeadas por corchetes angulares (<,>). El lenguaje para el marcado de hipertexto también puede describir, hasta un cierto punto, la apariencia de un documento, y puede incluir un script, por ejemplo Javascript, el cual puede afectar el comportamiento de navegadores Web y otros procesadores del lenguaje.

La primera descripción del lenguaje para el marcado de hipertexto disponible públicamente fue un documento llamado “etiquetas del lenguaje para el marcado de hipertexto”, publicado por primera vez en Internet por Tim Berners-Lee el año 1991. El documento describe veintidós elementos comprendiendo el diseño inicial y relativamente simple del lenguaje para el marcado de hipertexto Trece de estos elementos todavía existen en las versiones estándar del lenguaje para el marcado de hipertexto. Berners-Lee consideraba al lenguaje para el marcado de hipertexto una ampliación de lenguaje de marcado general estandar, pero no fue formalmente reconocida como tal hasta la publicación de mediados del año 1993, de una primera proposición para una especificación del boceto del lenguaje para el marcado de hipertexto de los investigadores Berners-Lee y Dan Connolly, el cual incluía una “definición de tipo de documento” para definir la gramática del lenguaje. El boceto expiró luego de seis meses, pero fue notable por su reconocimiento de la etiqueta propia del navegador Mosaic usada para insertar imágenes sin cambio de línea, reflejando la filosofía basar estándares en prototipos con éxito. De modo similar, el boceto competidor de Dave Raggett denominado “formato de marcaje de hipertexto” que apareció el año 1993, sugería estandarizar características ya implementadas, tales como las tablas.

Los elementos constituyen la estructura básica del lenguaje para el marcado de hipertexto. Los elementos tienen dos propiedades básicas: atributos y contenido. Cada atributo y contenido tiene ciertas restricciones para que se considere válido al documento. Un elemento generalmente tiene una etiqueta de inicio, por ejemplo <elemento>, y una etiqueta de cierre, por ejemplo </elemento>. Los atributos del elemento están contenidos en la etiqueta de inicio y el contenido está ubicado entre las dos etiquetas.

El lenguaje para el marcado de hipertexto puede ser creado y editado con cualquier editor de textos básico, como puede ser Gedit en Linux, el Bloc de Notas de Windows, o cualquier otro editor que admita texto sin formato como GNU Emacs, Microsoft Wordpad, TextPad, Vim, Notepad++, entre los más sobresalientes. Existen además, otros editores para la realización de sitios Web con características “lo que se ve es lo que se obtiene”. Estos editores permiten ver el resultado de lo que se está editando en tiempo real, a medida que se va desarrollando el documento. Ahora bien, esto no significa una manera distinta de realizar aplicaciones Web, sino que una forma un tanto más simple ya que estos programas, además de tener la opción de trabajar con la vista preliminar, tienen su propia sección de lenguaje para el marcado de hipertexto, la cual va generando todo el código a medida que se va trabajando. Algunos ejemplos de editores “lo que se ve es lo que se obtiene” son Macromedia Dreamweaver, o Microsoft FrontPage. Existe otro tipo de editores, del lenguaje para el marcado de hipertexto, llamados “lo que ves es lo que quieres decir”, que dan más importancia al contenido y al significado que a la apariencia visual. Entre los objetivos que tienen estos editores se encuentra la separación del contenido y la presentación, que es absolutamente fundamental en el diseño Web.

El lenguaje para el marcado de hipertexto utiliza etiquetas o marcas, que consisten en breves instrucciones de comienzo y final, mediante las cuales se determinan la forma en la que debe aparecer el texto en el navegador, así como también las imágenes y los demás elementos, en la pantalla de la computadora. Toda etiqueta se identifica porque está encerrada entre los signos menor que y mayor que, y algunas tienen atributos que pueden tomar algún valor. En general las etiquetas se aplican de formas especiales: (1) Se abren y se cierran, como por ejemplo: <b>negrita</b>, lo que se observa en el navegador Web como negrita. (2) No pueden abrirse y cerrarse, como <hr> que se ve en el navegador Web como una línea horizontal.

Al interior del lenguaje para el marcado de hipertexto existen tres tipos de marcado: (1) El marcado estructural describe el propósito del texto. Por ejemplo, <h2>El Diario</h2> establece a "El Diario" como un encabezamiento de segundo nivel, mostrado en un navegador. El marcado estructural no define cómo se verá el elemento, pero la mayoría de los navegadores Web han estandarizado el formato de los elementos. Un formato específico puede ser aplicado al texto por medio de hojas de estilo en cascada. (2) El marcado presentacional describe la apariencia del texto, sin importar su función. Por ejemplo, <b>negrita</b> indica que los navegadores Web visuales deben mostrar el texto en negrita, pero no indica qué deben hacer los navegadores Web que muestran el contenido de otra manera, por ejemplo los que leen el texto en voz alta. En el caso de <b>negrita</b> e <i>itálica</i>, existen elementos que se ven de la misma manera pero tienen una naturaleza más semántica: <strong>enfásis fuerte</strong> y <em>énfasis</em>. Es fácil ver cómo un lector de pantalla debería interpretar estos dos elementos. Sin embargo, son equivalentes a sus correspondientes elementos presentacionales: un lector de pantalla no debería decir más fuerte el nombre de un libro, aunque el mismo se encuentre en itálicas en una pantalla. La mayoría del marcado presentacional ha sido desechado con el lenguaje para el marcado de hipertexto versión 4.0, en favor de las hojas de estilo en cascada. (3) El marcado hipertextual se utiliza para enlazar partes del documento con otros documentos o con otras partes del mismo documento. Para crear un enlace es necesario utilizar la etiqueta de ancla <a> junto con el atributo href, que establecerá la dirección del identificador universal de recursos a la que apunta el enlace. Por ejemplo, un enlace a la Wikipedia vendría a ser de la forma <a href=”es.wikipedia.org”>Wikipedia</a>. También se pueden crear enlaces sobre otros objetos, tales como imágenes <a href=”enlace”><img src=”imagen” /></a>.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Mayo 3 de 2010

viernes, 2 de julio de 2010

Pruebas del software

Propiciar la calidad en el software es una actividad que ha surgido como consecuencia de la fuerte demanda de sistemas de software en todos los procesos que se desarrollan en la actualidad; desde programas elementales de contabilidad hasta programas complejos como los económicos y espaciales. De allí el esfuerzo que se ha desplegado para obtener software de alta calidad. El aseguramiento de la calidad toma en cuenta todas aquellas acciones planificadas y sistemáticas necesarias para proporcionar la confianza de que un producto o servicio satisfaga los requisitos de calidad establecidos. Para que sea efectivo, se requiere una evaluación permanente de aquellos factores que influyen en la adecuación del diseño y de las especificaciones según las aplicaciones previstas. Roger Pressman, por su parte, asegura que la garantía de calidad del software es una “actividad de protección” que se aplica a lo largo de todo el proceso de ingeniería del software, la cual engloba: métodos y herramientas de análisis, diseño, codificación y prueba; revisión de técnicas formales que se aplican durante cada paso; estrategia de prueba multiescalada; control de la documentación del software y de los cambios realizados; procedimientos que aseguren un ajuste a los estándares de desarrollo del software; y mecanismos de medida y de información.

Las pruebas de software, en inglés testing, son los procesos que permiten verificar y revelar la calidad de un producto software. Son utilizadas para identificar posibles fallos de implementación, calidad, o usabilidad de un programa de computadora. Básicamente es una fase en el desarrollo del software consistente en probar las aplicaciones construidas. Las pruebas de software se integran dentro de las diferentes fases del ciclo del software dentro de la Ingeniería de software. Así se ejecuta un programa y mediante técnicas experimentales se trata de descubrir que errores tiene. Para determinar el nivel de calidad se deben efectuar unas medidas o pruebas que permitan comprobar el grado de cumplimiento respecto de las especificaciones iniciales del sistema.

La prueba del software es la fase del ciclo de vida de un desarrollo software cuyo objetivo es descubrir los fallos que se han producido en el resto de fases, de tal forma que puedan ser solucionados, mejorando así la calidad del producto y disminuyendo el costo derivado de dichos de fallos. Sin embargo esta fase es muy costosa y se estima que suele consumir entre un treinta por ciento y un cincuenta por ciento como mínimo del costo total de un desarrollo software. Una parte de esta fase que conlleva una labor intensiva es la generación de los datos de prueba utilizados en la construcción de los casos de prueba del producto software. Esta tarea es crucial para el éxito de la prueba, debido a que es imposible obtener un programa software completamente probado, debido a que el número de casos de prueba necesarios para probar un programa software es infinito, y un diseño adecuado de los casos de prueba podrá detectar un elevado número de fallos. Además la creación de los datos de prueba, al ser principalmente manual, es tal vez la tarea más costosa de la prueba del software, ya que puede suponer aproximadamente el cuarenta por ciento de su costo total. Por estas razones, los diversos métodos desarrollados para la generación automática de los datos de prueba tratan de encontrar de forma eficiente un conjunto pequeño de dichos datos que permitan satisfacer un determinado criterio de suficiencia. De esta forma se reduce el costo de la prueba del software, por lo que los productos software pueden ser probados eficientemente.

Según Edsger Dijkstra, uno de los grandes gurus de la computación, la prueba puede examinar la presencia de errores pero no la ausencia de ellos. Existen muchos planteamientos a la hora de abordar el proceso de pruebas del software, pero para verificar productos complejos de forma efectiva se requiere de un proceso de investigación más que seguir un procedimiento al pie de la letra. Una definición de "prueba” es: proceso de evaluación de un producto desde un punto de vista crítico, donde el "probador" (persona que realiza las pruebas) somete el producto a una serie de acciones inquisitivas, y el producto responde con su comportamiento como reacción. Por supuesto, nunca se debe probar el software en un entorno de producción. Es necesario probar los nuevos programas en un entorno de pruebas separado físicamente del entorno de producción. Para crear un entorno de pruebas en una máquina independiente de la máquina de producción es necesario crear las mismas condiciones que en la máquina de producción. Existen a tal efecto varias herramientas vendidas por los mismos fabricantes de hardware: IBM, Sun, HP, etc. Esas utilidades reproducen automáticamente las bases de datos para simular un entorno de producción.

En general, los informáticos distinguen entre errores de programación y defectos de forma. En un defecto de forma, el programa no realiza lo que el usuario espera. Por el contrario, un error de programación puede describirse como un fallo en la semántica de un programa computacional. Éste podría presentarse, o no, como un defecto de forma si se llegan a dar ciertas condiciones de cálculo. Una práctica común es que el proceso de pruebas de un programa sea realizado por un “grupo independiente de prueba" al finalizar su desarrollo y antes de sacarlo al mercado. Una práctica que viene siendo muy popular es distribuir de forma gratuita una versión no final del producto para que sean los propios consumidores los que la prueben. En ambos casos, a la versión del producto en pruebas y que es anterior a la versión final se denomina beta, y a dicha fase de pruebas, “prueba beta”. Puede además existir una versión anterior en el proceso de desarrollo llamada alfa, en la que el programa, aunque incompleto, dispone de funcionalidad básica y puede ser probado. Finalmente y antes de salir al mercado, es cada vez más habitual que se realice una fase de “prueba de liberación al mercado”, dónde se comprueba cada funcionalidad del programa completo en entornos de producción. La práctica común en la ingeniería del software es que el proceso de pruebas se realice desde el mismo momento en que empieza el desarrollo y continúe hasta que finaliza.

La fase de pruebas es una de las más costosas del ciclo de vida software. En sentido estricto, deben realizarse pruebas de todos los artefactos generados durante la construcción de un producto, lo que incluye especificaciones de requisitos, casos de uso, diagramas de diversos tipos y, por supuesto, el código fuente y el resto de productos que forman parte de la aplicación. Obviamente, se aplican diferentes técnicas de prueba a cada tipo de producto software. El estándar ISO/IEC 12207 liberado el año 1995, identifica tres grupos de procesos en el ciclo de vida software: (1) Procesos principales, grupo en el que incluye los procesos de adquisición, suministro, desarrollo, operación y mantenimiento. (2) Procesos de la organización, en donde se encuentran los procesos de gestión, mejora, infraestructura y formación. (3) Procesos de soporte o auxiliares, en donde están los procesos de documentación, gestión de la configuración, auditoría, resolución de problemas, revisión conjunta, aseguramiento de la calidad, verificación y validación. No define, como se observa, un proceso de pruebas como tal, sino que aconseja, durante la ejecución de los procesos principales o de la organización, utilizar los procesos de soporte. Entre éstos se encuentran los procesos de “validación y de verificación.”

El proceso de validación tiene como objetivo determinar si los requisitos y el sistema final cumplen los objetivos para los que se construyó el producto, respondiendo así a la pregunta ¿el producto es correcto?. Por su parte el proceso de verificación intenta determinar si los productos software de una actividad se ajustan a los requisitos o a las condiciones impuestas en actividades anteriores. De este modo, la pregunta a la que responde este proceso es ¿se está construyendo el producto correctamente?

Del proceso de verificación se observa la importancia de verificar cada uno de los productos que se van construyendo, bajo la suposición de que si lo que se va construyendo es del todo correcto, también lo será el producto final. Igualmente, se observa que el proceso de validación resalta la importancia de comprobar el cumplimiento de los objetivos de los requisitos y del sistema final, de suerte que podría construirse un plan de pruebas de aceptación desde el momento mismo de tener los requisitos, que sería comprobado al finalizar el proyecto. Si tras la fase de requisitos viniese una segunda de diseño a alto nivel del sistema, también podría prepararse un plan de pruebas de integración, que sería comprobado tras tener codificados los diferentes módulos del sistema. Esta correspondencia entre fases del desarrollo y tipos de prueba produce el llamado “modelo en V”.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Abril 26 de 2010