Etiqueta: Ingeniería de Software

Ingenieria del Software: principios y conceptos

Ingenieria del Software: principios y conceptos

En el nuevo milenio, la humanidad asiste a profundas transformaciones contextuales cuyas implicaciones, antes que presentarse como mutaciones de carácter evolutivo, representan  salt os y rompimientos, que en la mayoría de los casos conllevan al desmonte de viejos paradigmas y a su sustitución abrupta.

Uno de los más significativos lo constituye la tecnología,  y dentro de ella,  sin duda  alguna, la gerencia informática, la electrónica, las telecomunicaciones, y el desarrollo de la ingeniería de software que juega un papel importante en las organizaciones. Se avanza   hacia una nueva cultura: La cultura de la información, y en consecuencia un nuevo tipo de sociedad. Organizaciones que para su desarrollo informático requieren formación en el área de la ingeniería del software.

En la era de la economía de la información y la inteligencia social en los servicios de la informática se preparan profesionales en las distintas áreas del conocimiento, con capacidad de planear, diseñar, implementar, y liderar proyectos, que apliquen técnicas modernas de la ingeniería de software, en sus diversos campos, que permitan asegurar su calidad, con base en estándares reconocidos mundialmente.

Hoy en día, las computadoras están presentes en todas las áreas de la actividad humana. En la mayoría de casos es necesario que haya intercambio de información con otras computadoras. Esto significa que para el diseño  del  hardware  y  software  es  importante tener en cuenta la evolución y el desarrollo de la ingeniería de software y la informática en general.

La primera versión del presente texto de ingeniería del software fue presentada a inicios del presente siglo, cuando fue ofertado en calidad de texto de lectura preliminar para la materia del mismo nombre en la Universidad Mayor de San Andrés. Con el advenimiento acelerado de las tecnologías web, se publicó el texto en el sitio web de la UMSA. Aún es posible obtener una descarga gratuita del contenido en este sitio: www.umsanet.edu.bo\docentes\gchoque \M426texto.htm.

Cargador Cargando...
Logotipo de EAD ¿Tarda demasiado?

Recargar Recargar el documento
| Abrir Abrir en una nueva pestaña

Descargar [953.38 KB]

 

Ingeniería del software libre (segunda parte)

Ingeniería del software libre (segunda parte)

En la tesis de maestría de Turner, publicada el año 2012 con el título “Software libre y abierto: Comunidades y redes de producción digital de bienes comunes”, se indica que los programas y aplicaciones que no permiten el acceso a ninguno de los componentes del código fuente, privando de ésta y otras libertades a los usuarios, son conocidos como software privativo. En general, se puede decir que la mayoría del software que se comercializa a gran escala es software privativo. Este tipo de programas utilizan licencias que siempre estipularán que el usuario no puede modificar el producto adquirido, tampoco distribuirlo haciendo copias del mismo, entre otras muchas restricciones avaladas por las leyes de derecho de autor, conocidas generalmente por su término en inglés, copyright. Se dice que un programa es de fuente abierta, cuando permite al usuario observar el código fuente. La apertura de códigos de programación es condición necesaria, aunque no suficiente, para calificar a una aplicación como software libre. Si un programa muestra su código fuente, permite dos de las libertades fundamentales que son características del software libre: Estudiar y modificar el código; pero para ser verdaderamente libre, además, debe permitir la distribución y el uso libres. Richard Stallman, en el libro publicado el año 2004 con el título “Software libre para una sociedad libre”, menciona que no necesariamente se trata de que las aplicaciones sean gratuitas, pero que sí otorguen la libertad al usuario de hacer uso del programa y de redistribuirlo virtualmente. Dado que se hace referencia a la libertad y no al precio, no existe contradicción alguna entre la venta de copias y el software libre. De hecho, la libertad para vender copias es crucial: Las colecciones de software libre a la venta en formato de disco compacto son bastante importantes para la comunidad y venderlas es una forma de recaudar fondos para el desarrollo de software libre.

En el artículo del investigador Robles, publicado el año 2002 con el título “Ingeniería del Software Libre. Una visión alternativa a la ingeniería del software tradicional” se menciona que uno de los grandes problemas de la ingeniería del software ha sido y es que no ha sabido adaptarse consecuentemente a su propia definición. Esto es algo que se puede considerar como una especie de traición a sí misma, a sus propios fundamentos. El enfoque sistemático y cuantificable ha tenido siempre como barreras las propias de las formas en las que el software se ha desarrollado y distribuido. El formato binario del software, la opacidad en los modelos de negocios, los secretos y barreras comerciales se encuentran entre las principales causas que han imposibilitado estudios cuantitativos y cualitativos a gran escala del software cuyos resultados pudieran ser verificados sistemáticamente por equipos de investigación independientes. Y es aquí donde el software libre puede dar nuevos aires a la ingeniería del software. Desde hace más de una década, el software libre ha venido experimentando un gran auge en cuanto a uso, aceptación y, por supuesto, desarrollo. La emergencia de Internet junto con las características de las licencias que “invitan” a todos a formar parte del equipo de desarrollo, han propiciado que no sólo se pueda contar con el código fuente, sino tomar medidas de los archivos de las listas de correo donde viene plasmada la comunicación del proyecto, los repositorios de versiones gracias a los cuales es posible ver la evolución, etc. De todas estas fuentes se puede extraer una gran cantidad de información de interés, en la mayoría de casos incluso de manera automática. Por tanto, el software libre ofrece la oportunidad de conocer más a fondo el proceso de concepción del software, aportando nuevas evidencias y experiencias.

En el reporte técnico sobre ingeniería del software, el investigador Callejas, en el reporte publicado el año 2006 con el título “La ingeniería del software libre y sus herramientas aplicadas a proyectos informáticos”, señala que la ingeniería del software libre permite que la metodología para el desarrollo de aplicaciones se lleve a cabo de manera amplia, ya sea utilizando un enfoque estructurado de análisis y diseño, un enfoque orientado por objetos o algún otro tipo de paradigma; además no limita a los analistas y diseñadores a utilizar una técnica de modelado y diagramación, como el lenguaje de modelado unificado o el modelado estructurado, ni ofrece recomendaciones que permitan evaluar el nivel de calidad de una organización, como lo promueve el modelo de madurez y capacidad del software. Más bien se fundamenta en que se debe trabajar en equipo, con el fin de fomentar una mayor participación de elementos para el desarrollo óptimo de aplicaciones, sin dejar de lado la utilización de técnicas y herramientas. Además, se debe tener en cuenta el tiempo y los recursos asignados para cumplir con las tareas involucradas, evitando la pérdida de tiempo o abandono de los proyectos. Con la ingeniería del software libre se pretende promover el uso de sistemas operativos, lenguajes de programación, bases de datos y demás herramientas de software de carácter libre para la creación de aplicaciones.

Robles, en el artículo mencionado en párrafos anteriores, menciona que la ingeniería del software libre no sólo pretende ser beneficiosa para la ingeniería del software tradicional, también pretende ser en gran medida, para el software libre. Si los cálculos de plazos y de costos en los proyectos de software estudiados tradicionalmente son difícilmente cuantificables, dentro del mundo del software libre son prácticamente utópicos. En cierta medida, la ingeniería del software libre pretende despojar de esa “magia” que parece que es intrínseca a los desarrollos de software libre y cuantificar unos parámetros que permitan predecir con exactitud costos, plazos y talento humano. Como consecuencia, aunque se pueda considerar que el software libre adolece de estos métodos en contraposición a las formas de desarrollo tradicionales, también es cierto que, por los motivos que se están desarrollando, no le falta precisamente potencial para que esta situación cambie en el futuro. La comparación entre diferentes proyectos de software libre, así como el análisis de aquéllos que tienen éxito también debe servir para que la experiencia en la creación de software libre quede plasmada en conocimiento para proyectos futuros. En este sentido, paradójicamente, la ingeniería del software libre puede ser la puerta de entrada de métodos auspiciados por la ingeniería del software tradicional que se muestren exitosos o eficaces en proyectos de software libre.

 

Guillermo Choque Aspiazu
https://www.eldiario.net
27 de Junio de 2016

Ingeniería del software libre (primera parte)

Ingeniería del software libre (primera parte)

En el contexto digital del siglo veintiuno, las tecnologías de la información y comunicación, se están convirtiendo en parte fundamental de la organización social. Estas tecnologías funcionan gracias a programas y aplicaciones que permiten la conectividad y el acceso, además del uso de la información y el conocimiento. En el libro de Winner, publicado el año 1987 con el título “La ballena y el reactor: Una búsqueda de los límites en la era de la alta tecnología”, se menciona que acercarse a estos programas, aplicaciones y sistemas implica tener control o no sobre la tecnología que se utiliza y sobre la información propia de las personas. Una época rica en información electrónica puede lograr maravillosas oportunidades sociales a cambio de meter a la libertad, quizás sin advertirlo, en un congelador.

En la tesis de maestría de Turner, publicada el año 2012 con el título “Software libre y abierto: Comunidades y redes de producción digital de bienes comunes”, se indica que la diferencia entre saber, más allá de lo que se puede ver, lo que ocurre en una computadora y no saberlo está en la posibilidad de tener acceso o no a todas las instrucciones que se encuentran detrás de las interfaces de los programas que se utilizan. Probablemente, no se tiene el conocimiento o la voluntad para leer y entender los códigos que le indican a la máquina lo que debe hacer, pero el asunto es si se tiene o no la libertad de aprender el lenguaje con el que es posible interactuar con las maquinas. Al hablar de software se hace referencia a aplicaciones computacionales; de manera más adecuada, se habla de códigos, de lenguaje de programación, de órdenes escritas de forma lógica que hacen funcionar de determinada manera lo que se observa en el monitor de la computadora o la pantalla del teléfono celular.

El Estándar 729 del Instituto de Ingenieros Eléctricos y Electrónicos, publicado el año 2003 en el “Glosario de terminología de la ingeniería del software”, indica que según las definiciones más formales, se entiende como software al conjunto de los programas de cómputo, procedimientos, reglas, documentación y datos asociados que forman parte de las operaciones de un sistema de computación. Turner, en la tesis de maestría mencionada en párrafos precedentes, menciona que de esta manera software refiere, no sólo a las aplicaciones, tomando en cuenta su código fuente, archivo binario e interfaz gráfica, sino también a los sistemas operativos. En sí, se entiende como software aquellos programas de cómputo que hacen funcionar el hardware, es decir, la estructura física, material, tales como el monitor y el teclado de la computadora. Para simplificar la definición, se puede decir que software, es el conjunto de algoritmos que guían a los circuitos electrónicos para que hagan o dejen de hacer determinado proceso. Ostrom y sus colegas, en el artículo publicado el año 2007 con el título “Entender el conocimiento como un bien común. De la teoría a la práctica”, completa la idea señalando mientras que no siempre se considera la programación de computadoras como un esfuerzo científico, de hecho, el desarrollo de software es una forma de ciencia, y el software como producto es una forma de propiedad intelectual.

Turner, en la tesis de maestría mencionada en párrafos precedentes, señala que para que una computadora haga cualquier tarea, incluso “iniciarse” y pedir la identificación de usuario y la respectiva clave de entrada, necesita algún tipo de software. Actualmente, ya no es necesario saber algún lenguaje de programación para iniciar cualquier proyecto o aplicación, la computadora recibe las instrucciones para funcionar sin que las personan tengan que hacer aparentemente nada. Sin darse cuenta, las personas transmiten qué hacer al presionar los botones del ratón o las claves del teclado. Lo que se observa en la pantalla es una interfaz que presenta de manera “amable” y comprensible de las acciones encargadas a la máquina. Sin embargo, detrás de la interfaz las órdenes se generan en lenguaje lógico y son recibidas en lenguaje binario; es decir, se trata de software compuesto exclusivamente de ceros y unos.

En la tesis de maestría de Reingart, publicada el año 2014 con el título “Desarrollo rápido de software libre de alta calidad: Ingeniería de software asistida por computadora, enfocada en tareas, para agilizar el ciclo de vida de las aplicaciones, mediante mejora continua disciplinada a nivel personal”, menciona que si no se puede recortar el alcance y el presupuesto es limitado, para que los proyectos terminen en buen puerto quizás se deberían explorar otras alternativas, analizando desde el punto de vista del software libre: (1) Buscar nuevas tecnologías. Lenguajes dinámicos y herramientas de desarrollo más avanzadas permiten aumentar la productividad. Si bien en la mayoría de los casos la mejora no va a ser “espectacular”, sí se puede esperar un incremento del rendimiento entre tres y cinco veces, por lo que reduciría los tiempos lo suficiente, sobre todo comparados con un proyecto que use tecnologías “tradicionales”. (2) Reusar paquetes existentes. Seguramente haya algún proyecto de software libre con funcionalidades similares al que se debe desarrollar, la mayoría de las veces es mejor basarse en algo existente que “reinventar la rueda”. Solo con no desarrollar desde cero ya se gana bastante, por más que haya que dedicarle tiempo a estudiar el trabajo que realizaron otros. Además, contribuir con un proyecto de la comunidad generalmente es bien visto, ayuda a no cometer los mismos errores, e incluso puede llegar a recibir aportes externos. (3) Expertos. En lugar de aumentar el equipo, y suponiendo que se puede usar nuevas tecnologías, se podría buscar profesionales con experiencia. Ciertos autores indican que la diferencia de productividad y conocimiento entre los mejores programadores y la media es importante.

 

Guillermo Choque Aspiazu
https://www.eldiario.net
20 de Junio de 2016

Modelo de Madurez de la Capacidad del Software

Modelo de Madurez de la Capacidad del Software

Para llevar los proyectos informáticos a buen término no basta con aplicar ingeniería del software. Hay que hacerlo racionalmente, sin despilfarrar recursos y utilizando en cada momento las técnicas más adecuadas. El Modelo de Madurez de la capacidad del Software desarrollado por el Instituto de Ingeniería del Software, en la prestigiosa Universidad Carnegie Mellon de los Estados Unidos es la referencia más solvente para ponderar el grado de adecuación del proceso del software en una organización cuya meta normal, en estos tiempos, es contar con un producto software de calidad.

Cargador Cargando...
Logotipo de EAD ¿Tarda demasiado?

Recargar Recargar el documento
| Abrir Abrir en una nueva pestaña

Descargar [2.47 MB]

Diseño Ágil y Programación Extrema

Diseño Ágil y Programación Extrema

Actualmente la programación extrema es una de las materias de mayor discusión en la comunidad para el desarrollo del producto software. Pero ¿cuáles son las características centrales de la programación extrema? y ¿cómo se involucra la programación extrema en el nuevo mundo de las metodologías ágiles? Este artículo intenta establecer el apuntalamiento de las metodologías ágiles y explica las razones por las cuales uno debe involucrarse en esta temática. Posteriormente se observa como la programación extrema utiliza un conjunto de prácticas para construir un equipo eficiente para el desarrollo del software que produzca software de calidad de una manera predecible y repetida.

Cargador Cargando...
Logotipo de EAD ¿Tarda demasiado?

Recargar Recargar el documento
| Abrir Abrir en una nueva pestaña

Descargar

Prototipado del Software

Prototipado del Software

En este articulo se presentan los fundamentos sobre los cuales se edifica la teoría del prototipado, se define un prototipo del software de manera inicial y se indican los resultados a los cuales se puede conducir el prototipado, reconociendo que existen algunos términos que colaboran en la búsqueda de la definición adecuada del termino prototipado, incluyéndose la revisión de los prototipos de diseño, evolucionario, maqueta, armazón, entre otros. luego se identifican las estrategias del prototipo y una clasificación primaria de su topología, para finalmente mostrar un modelo de construcción de prototipos y los métodos y herramientas necesarios para este cometido.

Cargador Cargando...
Logotipo de EAD ¿Tarda demasiado?

Recargar Recargar el documento
| Abrir Abrir en una nueva pestaña

Descargar [35.00 KB]

Ingeniería de requerimientos

Ingeniería de requerimientos

En este trabajo se presenta una visión de lo que constituye la ingeniería de requerimientos, se ofrece las definiciones iniciales de  requerimiento y se introduce el proceso asociado con los pasos de: identificación, análisis y negociación, especificación, modelado, validación y gestión del requerimiento.
Luego se presentan las técnicas principales de elicitación de requerimientos, desde las entrevistas, pasando por el desarrollo conjunto de aplicaciones, la tormenta de ideas y los casos de uso.

Seguir leyendo Seguir leyendo

Bases de la ingeniería del software

Bases de la ingeniería del software

Según el investigador J. Leite, en sus notas de cátedra escritas en 1997, el mundo moderno depende cada día más de los sistemas de software. Los sistemas computacionales están en todas partes, desde los sistemas de freno de los autos, hasta el control de los hornos de microondas. Hoy en día, las grandes corporaciones conocen la importancia estratégica de sus políticas en relación con las tecnologías de información y el papel fundamental del software como parte de esas tecnologías. Roger Pressman complementa la idea, en su famoso libro sobre ingeniería del software escrito en su sexta edición el año 2005, menciona que, en los años cuarenta y cincuenta del siglo veinte, ya era común el hardware de propósito general. El software, sin embargo, era diseñado a medida para cada aplicación y tenía una distribución relativamente limitada. El software como producto, es decir, programas desarrollados para ser vendidos a uno o más clientes estaba en su infancia. La mayoría del software era desarrollado y finalmente usado por la misma persona u organización. El diseño era un proceso implícito llevado a cabo en la cabeza de alguien y la documentación era en general inexistente.
En el afán de comprender lo que es el software, y consecuentemente la ingeniería del software, es importante examinar las características del software que lo diferencian de otras cosas que las personas pueden construir. Cuando se construye hardware, el proceso creativo humano se traduce finalmente en una forma física. El software en cambio es un elemento del sistema que es lógico, en lugar de físico. Según Roger Pressman, el software tiene características considerablemente distintas a las del hardware: (1) El software se desarrolla, no se fabrica en un sentido clásico. Aunque existen similitudes entre el desarrollo del software y la construcción del hardware, ambas actividades son fundamentalmente diferentes. En ambas actividades la buena calidad se adquiere mediante un buen diseño, pero la fase de construcción del hardware puede introducir problemas de calidad que no existen, o son fácilmente corregibles, en el software. Ambas actividades dependen de las personas, pero la relación entre las personas dedicadas y el trabajo realizado es completamente diferente para el software. Ambas actividades requieren la construcción de un “producto” pero los enfoques son diferentes. (2) El software no se estropea. El software no es susceptible a los males del entorno que hacen que el hardware se estropee. Sin embargo la implicación es clara, el software no se estropea. ¡Pero se deteriora!. (3) Aunque la industria tiende a ensamblar componentes, la mayoría del software se construye a medida. En el mundo del hardware, la reutilización de componentes es una parte natural del proceso de ingeniería. En el mundo del software es algo que sólo ha comenzado a lograrse en una escala amplia.
Para los investigadores M. Dorfman y R. Thayer, en un artículo sobre ingeniería del software publicado en 1997, un programa era considerado exitoso si: (a) ejecutaba, (b) ejecutaba rápidamente y (c) daba una respuesta aceptable, donde la calidad dependía altamente de la habilidad del programador. Hacia fines de los años 1960 comenzaron a producirse problemas recurrentes en el desarrollo de sistemas que se conoce como la “crisis del software”, caracterizada por problemas en el desarrollo de software, que provocaban demoras en los plazos de entrega, altos presupuestos, falta de respuesta a los requerimientos de los clientes o usuarios, y dificultad para usar, mantener y mejorar los sistemas. Complementando lo que antecede, Roger Pressman, en la obra ya citada menciona, a medida que los sistemas se hacían más grandes, su calidad era sospechosa. La gente responsable del desarrollo de software tenía limitados datos históricos para usar como guías y menos control sobre el curso de un proyecto. En el año 1969, un conjunto de técnicas, llamadas “ingeniería del software”, surgió como respuesta a esa crisis. Estas técnicas ven al software como un producto de ingeniería que requiere planificación, análisis, diseño, implementación, pruebas y mantenimiento.
Según los investigadores Nauer y Randall, en un artículo sobre ingeniería del software escrito el año 1969, el término ingeniería del software significa “el establecimiento y uso de principios de ingeniería para obtener en forma económica, software confiable y que trabaje eficientemente en máquinas reales”. En los estudios que realiza Carl Hoare, en especial en el artículo en el que cuestiona si la programación es brujería o ciencia, menciona que durante casi veinte años, hubo grandes debates sobre si la creación del software era un arte, una ciencia o disciplina. El término “ingeniería del software” ha tenido cierto nivel de aceptación dentro de la comunidad de software. Sin embargo, lo que significa exactamente, sigue algo confuso. Los escritores Guezzi, Jazayeri y Mandrioli, en el libro “fundamentos de la ingeniería del software, escrito el año 1991, definen la ingeniería del software como “el campo de la ciencia de la computación que trata la construcción de sistemas de software que son tan grandes o tan complejos que tienen que ser construidos por un equipo o equipos de ingenieros”.
Por su parte el investigador Alan Davis, en el libro sobre ingeniería de requerimientos escrita en año 1990, menciona que la ingeniería del software es “la aplicación de principios científicos a: (1) la transformación ordenada de un problema en una solución de software, y 82) el mantenimiento subsiguiente de ese software hasta el final de su vida útil”. Roger Pressman establece de manera clara y simple los objetivos de la ingeniería del software: “Los objetivos clave de la ingeniería del software son definir, crear y aplicar (1) una metodología bien definida dirigida a un ciclo de vida de planeamiento, desarrollo, y mantenimiento; (2) un conjunto establecido de componentes de software que documenta cada paso en el ciclo de vida y muestra un seguimiento paso a paso, y (3) un conjunto de hitos predecibles que pueden ser revisados a intervalos regulares a través del ciclo de vida del software”.
A medida del avance de los años, se han producido grandes avances en la tecnología de la ingeniería del software en todas las áreas que la conforman: Análisis de requerimientos, estrategias de implementación, modelos de costos, etc. Sin embargo, la ingeniería del software aún está por debajo de las necesidades de calidad demandadas por sistemas cada vez más complejos. En este contexto, existen considerables esfuerzos de investigación y desarrollo con el objetivo de perfeccionar el proceso de producción del software, tanto a través de estudios teóricos, como de estudios aplicados. Cuando la ingeniería del software ingresa en su cuarta década, tiene muchas de las fortalezas y debilidades que son experimentadas por los seres humanos de la misma edad. Roger Pressman menciona que la inocencia y el entusiasmo de sus primeros años han sido reemplazados por expectativas más razonables, y aún por un saludable cinismo, basados en bastantes años de experiencia. La ingeniería del software llega a su edad adulta con muchos logros, pero con abundante trabajo aún por hacer.
El Dr. Windston Royce enfatizó esta situación, en su obra ingeniería del software aeroespacial del año 1991, mencionando lo siguiente: “La construcción de nuevo software a gusto del usuario o cliente y sin errores es un problema inesperadamente difícil. Es tal vez el problema más difícil de la ingeniería hoy en día, y ha sido reconocido como tal durante más de quince años. La “crisis del software”, se ha convertido en la crisis más larga en el mundo de la ingeniería, y aún continúa. A pesar de la creciente participación del software en el mundo actual, y de los avances producidos, el software como producto aún utiliza procesos de producción bastante insatisfactorios. Son varios los casos en que errores en el software han traído problemas no sólo financieros, sino también en vidas humanas. Es función de la ingeniería del software evitar que estos errores ocurran, produciendo productos de software más robustos y proveyendo procesos de producción más confiables. Durante mucho tiempo, la literatura y la investigación en ingeniería del software centraban sus esfuerzos en el modelado, procurando desarrollar lenguajes y técnicas de representación.”
Una de las tendencias definidas y ampliamente aceptadas de la ingeniería del software, en el plano académico, es la que proporciona Roger Pressman en su libro ingeniería del software un enfoque practico, donde se menciona que la ingeniería del software es una tecnología estratificada, donde la base que soporta la ingeniería del software, es un enfoque en la calidad que fomenta una cultura de mejora continua del proceso. La base propiamente dicha de la ingeniería del software es el estrato del proceso. El proceso de la ingeniería del software es el elemento que mantiene juntos los estratos de la tecnología y que permite el desarrollo racional y a tiempo del software de computadora. Los métodos de la ingeniería del software proporcionan los “cómo” técnicos para construir software. Los métodos abarcan un amplio espectro de tareas que incluyen la comunicación, el análisis de requerimientos, el modelado del diseño, la construcción del programa, la realización de pruebas y el soporte. Las herramientas de la ingeniería del software proporcionan el soporte automático o semiautomático para el proceso y los métodos. La ingeniería del software se ha utilizado en una gran diversidad de aplicaciones por ejemplo de negocios, de medicina, de producción, de bancos, de control de tráfico, de derecho, en la milicia, en aplicaciones de gobierno, de transporte etc.

Referencias Bibliográficas

  • Davis, A. (1990) Software Requirements: Analysis and Specification. Prentice Hall.
  • Dorfman, M., Thayer, R. (1997) Software Engineering. IEEE Computer Society Press.
  • Guezzi, C., Jazayeri, M., Mandrioli, D. (1991) Fundamentals of Software Engineering. Prentice Hall.
  • Hoare, C. (1984) Programming: Sorcery or Science?, IEEE Software, Vol. 1, Nº 2, April 1984.
  • Leite, J.C.S.P. (1997) Ingeniería de Requisitos. Notas de Cátedra.
  • Nauer, P., Randall, B., eds. (1969) Software Engineering. NATO Scientific Affairs Division, Brussels, Belgium.
  • Pressman, R. (2005) Software Engineering: A Practioner´s Approach. Sixth Edition. McGraw-Hill, Inc.
  • Royce, W., Current Problems in “Aerospace Software Engineering: A Collection of Concepts”. edited by Anderson, Ch., Dorfman, M., American Institute of Aeronautics, Inc., Washington DC, 1991.
Guillermo Choque Aspiazu
http://www.eldiario.net/
Enero 16 de 2012
Tecnología estratificada

Tecnología estratificada

El software de la computadora, se ha convertido en el alma mater. Es la máquina que conduce a la toma de decisiones comerciales. Sirve como la base de investigación científica moderna y de resolución de problemas de ingeniería. Es el factor clave que diferencia los productos y servicios modernos. Está inmerso en sistemas de todo tipo: de transportes, médicos, de telecomunicaciones, militares, procesos industriales, entretenimientos, productos de oficina, etc., la lista es casi interminable. A medida que transcurra el siglo veintiuno, será uno de los pilares que conduzca a grandes cambios, desde la educación elemental hasta la ingeniería genética.

Según la definición del Instituto de Ingenieros Eléctricos y Electrónicos, “software es la suma total de los programas de computadora, procedimientos, reglas, la documentación asociada y los datos que pertenecen a un sistema de cómputo”. Según la misma organización, “un producto software es un producto diseñado para un usuario.” En este contexto, la ingeniería del software es un enfoque sistemático del desarrollo, operación, mantenimiento y retiro del software”, que en palabras más llanas, se considera que “la ingeniería del software es la rama de la ingeniería que aplica los principios de la ciencia de la computación y las matemáticas para lograr soluciones costo-efectivas, eficaces en costo o económicas, a los problemas de desarrollo del software”, es decir, “permite elaborar consistentemente productos correctos, utilizables y costo-efectivos”.

El proceso de ingeniería del software se define como “un conjunto de etapas parcialmente ordenadas con la intención de lograr un objetivo, en este caso, la obtención de un producto software de calidad”. El proceso de desarrollo del software “es aquel en que las necesidades del usuario son traducidas en requerimientos del software, estos requerimientos transformados en diseño y el diseño implementado en código, el código es probado, documentado y certificado para su uso operativo”. Concretamente “define quién está haciendo qué, cuándo hacerlo y cómo alcanzar un cierto objetivo”. El proceso de desarrollo del software requiere por un lado un conjunto de conceptos, una metodología y un lenguaje propio. A este proceso también se le llama el ciclo de vida del software que comprende cuatro grandes fases: concepción, elaboración, construcción y transición.

En la actualidad cada vez son más complejos los problemas que buscan una solución en el software. Dicha complejidad ha sobrepasado la habilidad de desarrollar y mantener el software por parte de las organizaciones que se dedican a esta actividad, por lo que las empresas desarrolladoras de software necesitan lograr una evolución hacia la cultura de excelencia en la ingeniería y la administración del software, para ser capaces de desarrollar y entregar software confiable, a tiempo y apegado al presupuesto acordado con el cliente, además los clientes quieren saber con certeza que todo acuerdo se cumplirá. Por esta razón, ya no sólo basta medir la calidad del producto terminado sino también, medir la calidad del proceso en el que se desarrolla el producto.

Lo anterior conduce a definir el término calidad del software, que para el “Instituto de Ingenieros Eléctricos y Electrónicos” es: “El grado en que un sistema, componente o proceso cumple con los requerimientos especificados y las necesidades del cliente o el usuario”. De acuerdo al investigador Tom DeMarco, en una definición establecida el año 1982, la calidad del software está directamente relacionada con su proceso de desarrollo, considera que un proceso bien conocido y ampliamente utilizado, sustentado en medición y predicción de eventos, permite controlar en buena medida la producción de software y en consecuencia software de calidad. Roger Pressman, el gurú de la ingeniería del software, el año 2005, menciona que: “La calidad del software es el cumplimiento de los requisitos de funcionalidad y desempeño explícitamente establecidos, de los estándares de desarrollo explícitamente documentados y de las características implícitas que se esperan de todo software desarrollado profesionalmente”.

La ingeniería del software es una tecnología estratificada, cualquier enfoque de la ingeniería, incluyendo a la ingeniería del software, debe estar sustentado en un compromiso con la calidad, la base que soporta la ingeniería del software es un enfoque de calidad. La gestión de calidad total, Six Sigma y enfoques similares fomentan una cultura de mejora continua del proceso. Un proceso define quién hace qué, cuándo y cómo para alcanzar cierto objetivo. En general, el éxito de las empresas u organizaciones depende en gran medida de la definición y seguimiento adecuados de sus procesos. En el caso de una empresa que se dedica al desarrollo del software, un proceso de software se define como un conjunto de actividades técnicas y administrativas realizadas durante la adquisición, desarrollo, mantenimiento y retiro de software, en estos procesos de software se requieren procesos especializados que abarquen desde la creación hasta la administración y mantenimiento de software. Un modelo de proceso del software define como solucionar la problemática del desarrollo de sistemas de software, ya que para esta actividad se requiere resolver ciertas fases de su proceso, las cuales se conocen como ciclo de vida del desarrollo de software. Un modelo de proceso debe considerar una variedad de aspectos, como el conjunto de personas, reglas, políticas, actividades, componentes de software, metodologías y herramientas utilizadas.

La ingeniería del software se caracteriza por ser una tecnología estratificada, los diferentes enfoques conducen a las siguientes definiciones. (1) Según Fritz Bauer “La ingeniería del software es el establecimiento y uso de principios robustos de la ingeniería a fin de obtener económicamente software que sea fiable y que funcione eficientemente sobre máquinas reales”. (2) Una definición más completa desarrollada por el “Instituto de Ingenieros Eléctricos y Electrónicos” es: “La ingeniería del software es la aplicación de un enfoque sistemático, disciplinado y cuantificable hacia el desarrollo, operación y mantenimiento del software”. (3) La ingeniería del software se define como la disciplina tecnológica y administrativa dedicada a la producción sistemática de productos de software, que son desarrollados y modificados a tiempo y dentro de un presupuesto definido. (4) Es la disciplina cuyo fin es la producción de software libre de fallas, entregado a tiempo, dentro del presupuesto y que satisfaga las necesidades del cliente. La ingeniería del software es una tecnología multicapa. Los cimientos que son la base de la ingeniería del software están orientados hacia la calidad. La gestión de calidad total y las filosofías similares fomentan una cultura continua de mejora de proceso, y es esta cultura la que conduce últimamente al desarrollo de enfoques cada vez más robustos para la ingeniería del software.

El fundamento de la ingeniería del software es el estrato proceso. El proceso es la unión que mantiene juntas las capas de tecnología y que permite un desarrollo racional y oportuno de la ingeniería del software. Las áreas clave del proceso forman la base del control de gestión de proyectos del software y establecen en contexto en el que se aplican los métodos técnicos, se producen resultados del trabajo, se establecen hitos, se asegura la calidad y se gestiona el cambio de manera adecuada. Los métodos indican cómo construir de manera técnica el software. Los métodos abarcan una gama de tareas que incluyen análisis de requisitos, diseño, construcción de programas, pruebas y mantenimiento. Los métodos dependen de un conjunto de principios básicos que gobiernan cada área de la tecnología e incluyen actividades de modelado y otras técnicas descriptivas. Las herramientas proporcionan un soporte automático o semi-automático para el proceso y para los métodos. Cuando se integran herramientas para que la información creada por una herramienta la pueda utilizar otra, se establece un sistema de soporte para el desarrollo de software denominada ingeniería del software asistida por computadora.

Los métodos de la ingeniería de software proporcionan las características técnicas para construir el software, por otro lado “un método es un procedimiento que define tareas o acciones a realizar, donde cada tarea incluye condiciones de entrada y salida que se deben satisfacer antes y después de completarse”. Y el estrato más elevado que corresponde a las herramientas proporciona un soporte automatizado o semi-automatizado para el proceso y los métodos. Cuando las herramientas se integran de forma que la información que crea una de estas pueda ser utilizada por otra herramienta, se dice que se ha establecido un sistema para el soporte del desarrollo del software, que con frecuencia se denomina ingeniería del software asistida por computadora. Las herramientas varían en su apoyo a los procesos integrando componentes como editores de texto, generadores de modelos gráficos, generadores de código, compiladores, depuradores, administradores de configuración y administradores del proyecto.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Octubre 25 de 2010.
Ingeniería de rendimiento del software

Ingeniería de rendimiento del software

La ingeniería del software se podría definir como el establecimiento y aplicación de principios de la ingeniería para obtener un producto denominado software. Teniendo en cuenta factores tan importantes como el costo económico, la fiabilidad del sistema y un funcionamiento eficiente que satisfaga las necesidades del usuario. Como concepto de software se entienden las aplicaciones, toda aquella parte de la informática que se desarrolla, y que posee un difícil mantenimiento debido al corto período de tiempo en el que queda obsoleto. La ingeniería del software se preocupa de la fiabilidad y el rendimiento, tratando de reducir costos y complejidad. Los modelos que utiliza están basados en teorías matemáticas bastante sólidas.

La ingeniería del rendimiento al interior de la ingeniería del software, abarca el conjunto de roles, habilidades, actividades, prácticas, herramientas y resultados aplicados a cada fase del ciclo de vida del desarrollo de sistemas, hecho que asegura que una solución sea diseñada, implementada y que cuente con el apoyo operativo para cumplir con los requerimientos de desempeño de funciones definidas para la solución. Desde la tradicional ingeniería del software, el rendimiento es mucho más que sólo el desarrollo del producto software, la ingeniería de rendimiento, a diferencia de la ingeniería del software es preferible a largo plazo. El cumplimiento de los requisitos no funcionales se valida mediante la supervisión de los sistemas de producción. La ingeniería de rendimiento se ha convertido en una disciplina independiente en una serie de grandes corporaciones, y puede ser afiliada con el grupo de arquitectura empresarial. Es bastante persuasivo, lo invade todo, recabando la colaboración de múltiples unidades de la organización, pero sobre todo dentro de la tecnología de la información propia de la organización.

Típicamente las aplicaciones del software de múltiples capas son bastante complejas y están basadas en muchos componentes y varias tecnologías que abarcan desde la interfaz del usuario hasta la base de datos y varias capas intermedias. Estas capas pueden estar basadas en marcos de trabajo, hechos internos o sistemas de terceros, bien sea comerciales o de dominio público. Respecto a las aplicaciones basadas en la “arquitectura orientada a servicios” crean complejidades adicionales. Encontrar el balance perfecto entre alto rendimiento y elevado consumo de recursos tiende a ser un gran reto tecnológico.

La ingeniería de rendimiento es parte integral del proceso creativo del diseño y arquitectura de aplicaciones del software. Como tal, puede ser descrita como la verificación y validación de varias opciones que emergen durante el diseño de la aplicación, donde se hacen y prueban prototipos para tomar la decisión más apropiada basada en las prioridades y restricciones definidas para la aplicación. De esta manera se puede encontrar el balance ideal y el más alto rendimiento posible. El análisis riguroso del rendimiento, al principio del proceso de diseño de la aplicación, es un paso crítico en la arquitectura del software para garantizar que los componentes que se van a crear satisfagan los requerimientos operacionales.

Generalmente la ingeniería de rendimiento es un proceso interactivo, donde el arquitecto trabaja de manera cercana con los desarrolladores y el ingeniero de rendimiento para obtener un conocimiento detallado de las opciones que incrementen el rendimiento y la seguridad de la aplicación. Este proceso de investigación, por el cual el equipo de profesionales va analizando y diseñando la aplicación permite desarrollar un nivel de entendimiento tan detallado, que trae como resultado la configuración ideal de todos los componentes que forman parte de la solución total para lograr el más alto rendimiento en el ambiente de producción con la carga de trabajo esperada y con capacidad de crecimiento.

Se está en presencia del cambio que se experimenta en el paradigma de gestión del rendimiento del software, con la solución de problemas a las mejores prácticas que tienden a la excelencia en el rendimiento. Con el enfoque de la ingeniería del rendimiento se producen las siguientes prácticas: (1) Los arquitectos conocen que su arquitectura soportará requerimientos de rendimiento antes de solamente comprometerse con el desarrollo del código. (2) Los gerentes de proyecto pueden continuar con el estado de resultados, de manera paralela al desarrollo del software. (3) Los especialistas de rendimiento tienen el tiempo suficiente para ejecutar las pruebas de carga y de estrés sin encontrarse con algunas “sorpresas”. (4) Los riesgos para el logro de los requisitos de desempeño son identificados y direccionados al principio del proceso, ahorrando tiempo y dinero. (5) El software que cumple con los requisitos de rendimiento se entrega a tiempo y dentro de lo presupuestado.

La ingeniería de rendimiento del software es un enfoque cuantitativo, y sistemático de la evolución del costo-eficacia de los sistemas de software, útil para satisfacer los requisitos de desempeño. Este tipo de ingeniería es una tendencia orientada al software, se enfoca en las opciones de arquitectura, diseño e implementación del software. La ingeniería del rendimiento proporciona la información necesaria para construir software que satisface los requisitos de desempeño de manera adecuada y, como se dijo anteriormente, se encuentra dentro de lo presupuestado.

El concepto básico de la ingeniería de rendimiento del software es la separación del modelo de software de su entorno o modelo de hardware. El modelo de software captura los aspectos esenciales del comportamiento del software; sino que puede ser representado por medio de “grafos de ejecución”. Un grafo de ejecución es un grafo cuyos nodos representan los componentes del software de carga de trabajo y cuyas aristas representan las transferencias de control. Cada nodo se pondera mediante el uso de un vector de demanda que representa el uso de los recursos del nodo, es decir, la demanda de cada recurso.

Los modelos de hardware representan la plataforma de maquinaria y se basan en modelos de red de colas. Para especificar una red de colas, se tiene que definir: los componentes, es decir los centros de servicios; la topología, referida a las conexiones entre los centros y algunos parámetros relevantes, tales como las clases de trabajo, las tareas de enrutamiento entre los centros, la planificación de la disciplina en el servicio y la demanda en los centros de servicio). Los componentes y la especificación de la topología se realizan según la descripción del sistema, mientras que la especificación de los parámetros se obtiene de la información generada por los grafos de ejecución y del conocimiento de los recursos y capacidades. Esta distinción, por un lado, permite definir modelos de software y modelos de hardware por separado además de la solución de su combinación, por otra parte mejora la portabilidad de los modelos, por ejemplo, el rendimiento de un sistema de software específico puede ser evaluado en diferentes plataformas, y el rendimiento de una plataforma específica puede ser validado en diferentes sistemas de software. Después de haber establecido los objetivos de rendimiento, los modelos de software y hardware son construidos y por lo tanto, evaluados por un método de análisis adecuado para calcular la predicción del rendimiento.

Los objetivos de la ingeniería del rendimiento son: (1) Aumentar los ingresos comerciales al garantizar que el sistema puede procesar las transacciones dentro de los plazos necesarios. (2) Eliminar la falla del sistema que requiere de la cancelación de las actividades de desarrollo del sistema debido a falta objetiva de rendimiento. (3) Eliminar la implementación del sistema con retraso debido a problemas de rendimiento. (4) Eliminar el reproceso del sistema disponible debido a problemas de rendimiento. (5) Eliminar esfuerzos evitables del sistema de afinación. (6) Evitar costos adicionales e innecesarios en adquisición de hardware. (6) Reducir el aumento de los costos de mantenimiento del software, debido a los problemas de rendimiento en la producción. (7) Reducir los altos costos de mantenimiento del software debido al software afectado por costos fijos para un desempeño ad hoc. (8) Reducir gastos generales operativos adicionales para el manejo de problemas en el sistema debido a los problemas de rendimiento

Para obtener un buen rendimiento de las aplicaciones de software, es necesario seguir algunas reglas que garantizan la buena ejecución del software: (1) La primera medida consiste en encontrar los cuellos de botella del software y enfocar los esfuerzos en esos lugares. (2) Los patrones de uso eficiente de acceso a los datos, también conocido como entrada-salida, su uso eficiente, la reducción de la lentitud y otros accesos. (3) Diseñar los argumentos para reducir la baja concurrencia de los recursos compartidos. (4) Aprender cómo se supone que deben utilizarse la interfaz de programación de aplicaciones y los componentes de terceros. (5) Utilizar una cantidad realista de datos y usuarios para las pruebas de rendimiento, también conocido como “no prueba” con una base de datos vacía. (6) Hacer el trabajo de ingeniería de rendimiento de todo el proyecto, empezando por la capacidad de planificación de base. (7) No dedicarse solamente a “optimizar el código programado”, debido a que casi nunca es útil para el rendimiento, si no tiene un proceso de ingeniería asociado.

 

Guillermo Choque Aspiazu
http://www.eldiario.net/
Junio 7 de 2010

Translate »