Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
INSTITUTO TECNOLOGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY CAMPUS ESTADO DE MEXICO METODOLOGIA PARA LA ASIMILACION DE INGENIERIA DE SOFTWARE EN MEXICO TESIS QUE PRESENTA LUIS HUMBERTO CRUZ AGUILAR MAESTRIA EN SISTEMAS DE INFORMACION ENERO, 1999 INSTITUTO TECNOLOGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY CAMPUS ESTADO DE MEXICO METODOLOGIA PARA LA ASIMILACION DE INGENIERIA DE SOFTWARE EN MEXICO TESIS QUE PRESENTA LUIS HUMBERTO CRUZ AGUILAR MAESTRIA EN SISTEMAS DE INFORMACION ENERO, 1999 INDICE INTRODUCCION 7 CAPITULO l. INGENIERIADE SOFTWARE 13 l ¿ QUE ES INGENIERIADE SOFTWARE? 15 1.1.1 DEFINICIÓN DE SOFTWARE 15 1.1.2 DEFINICIÓN DE INGENIBRÍA DE SOFTWARE 17 1.1.3 SOFTW ~~ DE CALIDAD 18 1.2 APLICACIONES DE LA INGENIBRÍA DE SOFTWARE 21 1.3 TECNICAS DE INGENIERIA DE SOFTWARE 22 1.3.1 TÉCNICAS DE LA FASE DE PLANEACIÓN 23 1.3 .2 TÉCNICAS DE LA FASE DE ANÁLISIS 24 1.3.3 TÉCNICAS DE LA FASE DE DISEÑO 24 1.3.4 TÉCNICAS DE LA FASE DE PROGRAMACIÓN 25 1.3.5 TÉCNICAS DE LA FASE DE PRUEBAS 26 1.3.6 TÉCNICAS DE LA FASE DE MANTENIMIENTO 27 1.4 HERRAMIENTAS DE INGENIBRIA DE SOFTWARE 27 1.4.1 HERRAMIENTAS PARA AD:MINISTRACIÓN DE PROYECTOS 27 1.4.2 HERRAMIENTAS PARA ANÁLISIS DE SISTEMAS 28 1.4.3 HERRAMIENTAS CASE 29 1.4.4 HERRAMIENTAS PARA PROGRAMACIÓN, PRUEBAS 29 1.4.5 HERRAMIENTAS PARA CONSTRUCCIÓN DE PROTOTIPOS 30 CAPITULO 2. LA INGENIERIA DE SOFTWARE EN MÉXICO 33 2.1 ANTECEDENTES DE APLICACION EN MÉXICO 34 2.1.1 ANTECEDENTES DE LA INGENIBRÍA DE SOFTWARE 34 2.1.2 :MERCADO NACIONAL DE BIENES Y SERV. INFORMÁTICOS 36 2.1.3 :MERCADO DE PROGRAMACIÓN (SOFTWARE) 37 2.1.4 DEMANDA DE BIENES Y SERVICIOS 39 2.1.5 FORMACIÓN DE RECURSOS HUMANOS 40 2.2 CARACTERISTICAS DE LAS EMPRESAS QUE USAN INGENIBRIA DE SOFTWARE 2.3 TECNICAS Y HERRAMIENTAS MAS UTILIZADAS 2.4 PROBLEMATICADE ASIMILACION CAPITULO 3 :METODOLOGIA PARA LA ASIMILACION DE INGENIERIA DE SOFTWARE 3 .1 ESTUDIO DEL AREA DE SISTEMAS 3 .1.1 INVENTARIO DE HARDWARE Y SOFTWARE 43 46 48 53 54 55 3.1.2 NIVEL DE PREPARACIÓN Y EXPERIENCIA DEL PERSONAL 56 3.1.3 TÉCNICAS YHERRAMIENfAS UTILIZADAS ACTUALMENTE 57 3 .1.4 ORGANIZACIÓN DEL ÁREA DE SISTEMAS 59 3.2 PLANEACION DEL PROYECTO DE ASIMILACION 62 3.2.1 DEFINICIÓN DEL OBJETIVO DEL PROYECTO 63 3.2.2 ACTIVIDADES Y TIEMPO 64 3.2.3 EQUIPO DE TRABAJO 64 3.2.4 COSTO DEL PROYECTO 65 3 .2.5 HARDWARE A UTILIZAR 66 3.2.6 METODOLOGÍA SELECCIONADA 67 3.2.7 SELECCIÓN DE HERRAMIENTAS Y TÉCNICAS 68 3.2.8 APROBACIÓN DEL PROYECTO DE ASIMILACIÓN 70 3.3 DESARROLLO DEL PROYECTO 71 3.3.1 CAPACITACIÓN DEL PERSONAL 71 3.3.2 DESARROLLO DE UNA PRUEBA PILOTO 72 3.3.3 EJEMPLO DE UNA METODOLOGÍA PARA PRUEBA PILOTO 73 3.3.3.1 Requerimientos del sistema 75 3.3.3.2 Diseño 78 3 .3 .3 .3 Construcción 79 3 .3 .3 .4 Aceptación 81 3.3.3.5 Soporte 82 3.3.4 REGISTRO DE ESTADÍSTICAS DEL PROYECTO 83 3.4 EV ALUACION DE RESULTADOS 84 3.4.1 PROCESAMIENTO DE DATOS Y ESTADÍSTICAS 84 3.4.2 COSTO DEL PRODUCTO 85 3.4.3 CALIDAD DEL PRODUCTO OBTENIDO 86 3.4.4 OBJETIVOS INICIALES 86 3.4.5 PRESENTACIÓN DE RESULTADOS DEL PROYECTO 87 3.5 IMPLANTACIÓN DE INGENIERÍA DE SOFTWARE 87 3.5.1 ESTRATEGIA DE IMPLANTACIÓN 88 3.5.2 CAPACITACIÓN DE TODO EL PERSONAL 89 3.5.3 COSTO DE LA IMPLANTACIÓN 89 3.6 SEGUIMIENTO 90 3.6.1 CONSIDERACIONES TÉCNICAS 90 3.6.2 CONSIDERACIONES ECONÓMICAS 91 3.6.3 CONSIDERACIONES DE ORGANIZACIÓN 91 3.7 CONCLUSION 92 CAPITULO 4. FUTURO DE LA INGENIERIA DE SOFTWARE EN MÉXICO 95 4.1 CASE (COMPUTER AIDED SOFTWARE ENGINEERING) 97 4.1.1 DEFINICIÓN DE CASE 98 4.1.2 HISTORIA DE CASE 98 4.1.3 OBJETIVOS DE CASE 99 4.1.4 BENEFICIOS DE CASE 99 4.1.5 CASE WORKBENCH 4.1.6 INTEGRACIÓN DE CASE EN EMPRESAS 4.2 LENGUAJES DE CUARTA GENERACION (4GL) 4.2.1 MÓDULOS QUE FORMAN UN 4GL 4.2.3 USOS DE LOS 4GL 4.3 REINGENIERIA 100 100 101 102 102 103 4.3.1 USODEREINGENIERÍAPARARECONSTRUIRSOFTWARE 104 4.3.2 SERVICIOS DE REINGENIERÍA 105 4.4 NUEVAS TÉCNICAS DE INGENIERIA DE SOFTWARE 107 4.5 EL FUTURO DE LA INTEGRACION 107 CONCLUSIONES Y RECOMENDACIONES 11 O ANEXO A. GLOSARIO DE TÉRMINOS 117 ANEXO B. HERRAMIENTAS CASE 129 BIBLIOGRAFIA 136 INTRODUCCION Son las cuatro de la tarde en la oficina principal de McMaster Carr Supply Company, con sede en Chicago. Una de las cincuenta y dos operadoras con ayuda de una terminal de computadora, atiende un pedido por teléfono de un cliente en Pittsburgh, mientras tanto en otra estación de trabajo se proporciona información de donde se encuentra el embarque enviado ayer a Denver. Otro operador verifica que las órdenes de compra depositadas por una empresa automotriz de Detroit en el sistema a través de modem, estén correctas. Al mismo tiempo, en otra terminal, el operador atiende a un cliente que define las políticas de recibo y pago a las que se debe ajustar McMaster al venderle mercancía. Todo esto se realiza en el mismo instante gracias a una red local de computadoras conectadas en algunos casos a las de los clientes principales y un poderoso sistema o programa de software desarrollado exclusivamente para cumplir con el más mínimo requerimiento. Es muy compleja la operación y así es el software por medio del cual se maneja todo. Este sistema es una de las armas estratégicas con la que se vale esta comercializadora de productos que vende a plantas de manufactura, para ganar más clientes, no sólo en Estados Unidos, sino en todo el mundo. Sin las facilidades y flexibilidad que proporciona dicho sistema, la operación cotidiana seria un caos. Las computadoras rivalizan con la invención de la escritura como una de las más profundas innovaciones de la historia humana y están "rehaciendo el mundo a velocidad fenomenal", según apuntó el connotado astrónomo y autor, doctor Carl Sagan. [23] Por otra parte, la información es una parte importante en la vida de todo ser humano, es necesaria en todos los aspectos, tanto en los cotidianos como en los laborales. Si la información es oportuna, completa y exacta, mejora la toma de decisiones y proporciona el poder para enfrentar cualquier tipo de situación. Los sistemas de información existen desde hace siglos, algunos entregaban información inexacta, incompleta y sin actualizar. La informática provee nuevos conceptos para mejorar el funcionamiento de dichos sistemas, dando respuestas más rápidas y cubriendo mayor número de aspectos que los sistemas tradicionales. Los datos proporcionan una base de la cual se deriva la información y que sirve para el análisis cuantitativo. La información ensamblada por la recopilación y el manejo de los datos, da las bases para tomar decisiones. 8 Los recursos de la administración, frecuentemente son mencionados como las tres M (Manpower, Money y Materials) fuerza laboral, dinero y materiales. La infonnación puede ser considerada un cuarto recurso, porque tiene los atributos de un recurso fisico: • Tiene valor como el dinero, las materias primas o la mano de obra. • Tiene características que penniten su medición, en ténninos de uso, duración y efecto sobre otros recursos. • Puede ser valorada en términos de recolección, almacenamiento y recuperación. • Puede ser presupuestada y controlada. • Puede evaluarse en ténninos de costo y valor de uso con fines de administración. Uno de los principales problemas que en la actualidad enfrenta el gobierno, la industria y el público, es la constante aceleración de la demanda de datos e infonnación. Las nuevas tecnologías de computación y comunicaciones penniten la rápida manipulación y almacenamiento masivo de datos. Se han publicado numerosos artículos técnicos que pronostican con seguridad el curso del desarrollo del hardware en los próximos diez años, sin embargo, sobre el desarrollo de software no se encontrará ese tono de confianza en los escasos artículos que lo mencionan. Y tal vez esto se debe al hecho de que el desarrollo de software continuará siendo más lento, mucho más costoso y dificil que elhardware, debido a que ahora son más complejas las funciones del software (y continuarán siéndolo) que las del hardware. El software es una parte muy delicada que en ocasiones no se le da la importancia adecuada, debido a la proliferación de equipos de cómputo personales y programas que atacan áreas generales (paquetes de productividad como hojas de cálculo y procesadores de texto) y que relativamente pueden resolver casi todo problema. Pero en un mundo tan cambiante debido a la cantidad infinita de infonnación que se maneja actualmente, una empresa del mismo giro que otra, tiene necesidades de sistemas de información diametralmente diferentes, porque cada una ataca sus problemas desde distintos puntos de vista. En estos casos los paquetes de software ayudan un poco pero no son la solución completa, es necesario entonces crear programas que satisfagan las necesidades complejas de operación de cada organización. El desarrollo de complejos sistemas especializados es una tarea que requiere de bastantes recursos, que no se ejecuta con los mismos procedimientos de veinte años atrás. La evolución tecnológica del hardware y el avance en materia de comunicaciones, ha hecho aún más compleja la tarea de desarrollar software. Y la tendencia a crear computadoras más poderosas continua, no así por parte del software. Por esto se han comenzado a difundir los principios de la Ingeniería de Software con ayuda de técnicas y herramientas, que poco a poco se vuelven estándares, para la creación de productos de software. 9 Desde el inicio de los sistemas de infonnación basados en computadoras, ha surgido gran variedad de problemas que con el paso del tiempo se han solucionado. En el presente, algunas dificultades se manifiestan en el desarrollo de este tipo de sistemas van desde el usuario confundido que no sabe como definir los requerimientos de su sistema hasta la completa carencia de documentación de dichos sistemas que impide la labor de mantenimiento. Tantos cambios han sacudido la nación en los últimos años que las ondas de choque de los temblores de 1985 parecen haberse continuado en el ámbito social, económico, político e industrial, hasta 1995 con la peor crisis económica del país. Planes y enfoques visualizados desde hace años, y otros más de nueva elaboración, han sido puestos en marcha por la presente administración gubernamental. La informática ha ganado importancia en México porque se aprecia su utilidad como palanca de desarrollo. La denominada Reconversión Industrial incluye en gran medida la modernización a través de la computación o los microprocesadores; no hay equipo moderno que no incorpore componentes electrónicos en su diseño. La modernización va de la mano de las computadoras y el ejecutivo debe tener una actitud de cambio. La información es el combustible de la modernización y el activo más valioso de las empresas, sin embargo, el principal factor negativo, es la falta de cultura informática en una gran parte de los actuales ejecutivos y funcionarios de las organizaciones. Las nuevas generaciones aún en las aulas o en los niveles bajos de las organizaciones habrá de vencer esta barrera, sin embargo, cada institución debe pugnar por culturiz.ar a sus ejecutivos y hacerles comprender que sin la tecnología informática la modernización no se puede dar. La tendencia a la modernización en los negocios descansa en la infonnática y el proceso de culturiz.ación es el mayor agente de cambio. En la aurora de la apertura comercial, la empresa que no ha logrado ser eficiente actualmente es posible que sea avasallada por la competencia global. La eficiencia empieza con el flujo de la información. En muchas empresas del país hay islas de automatización, la parte administrativa automatiza sus aplicaciones desde hace tiempo, pero aún tiene que reunir la información del resto de la planta por medios manuales. El piso de manufactura se automatiza a medida que sus equipos se modernizan, éstos cuentan ya con componentes electrónicos que controlan los procesos y generan información valiosa, que se reúne también manualmente. Esto requiere de la elaboración de sistemas de información eficientes y de calidad, desarrollados en corto tiempo para inmediatamente ponerlos a disposición de los usuarios, además deben integrarse dentro de todos los niveles de la organización. La tendencia es hacia un sistema de información global abarcando interfases para permitir aprovechar de manera automatizada la información resultante de cada área, de manera que fluya junto con el producto sin interrumpir los procesos por la espera de la infonnación manual. F onnar un todo con las aplicaciones administrativas, dará al directivo los parámetros necesarios y oportunos para la toma de decisiones. 10 Ante esto, el profesional de infonnática habrá de convertirse en un hombre de negocios que entienda de administración, finanzas, producción y comercialización, por otra parte deberá estar a la vanguardia en la evolución tecnológica en hardware con el propósito de contar con los más recientes adelantos en la materia, y en cuanto a técnicas de Ingeniería de Software, se requiere que domine y maneje las que le permitan hacer desarrollos de sistemas en menor tiempo; todo esto para armar la estructura computacional que soporte el esquema descrito. Pero aún así, existe rez.ago en el ámbito de desarrollo de programas si este se compara con el progreso del equipo de cómputo, aunque en países como Estados Unidos, este atraso es menor comparado con el nuestro, debido a que constantemente se generan nuevas técnicas para elaborar software. Aquí en México se tienen diferentes formas de atacar el problema, tal vez sin el apoyo de instituciones y empresas dedicadas a la investigación que se ofrece en aquel país, pero sí en ocasiones con las núsmas herranúentas usadas por los vecinos del norte. Los comentarios de personas que ingresan a laborar a áreas de desarrollo o manteninúento de sistemas, es casi siempre los núsmos en referencia a la falta de documentación de los programas en operación, la carencia de estándares de desarrollo, la poca productividad dentro del medio y sobre todo, el nulo interés de utilizar nuevas metodologías que normen la actividad de desarrollo y manteninúento de software. El cuadro lo completan los usuarios insatisfechos con sistemas ineficientes, directivos molestos por el derroche de recursos y personal del área de sistemas que trabajan como lo apuntó el Prof R. M. Graham en la División Científica de la OTAN en 1989: "Hacemos sistemas como los hermanos Wright construían aviones. Se arman, se lanzan, se estrellan y empezamos otra vez ". [ 15] Estos y otros problemas graves se mantienen desde hace tiempo en empresas mexicanas, que no desempeñan correctamente sus actividades por no contar con sistemas y software que proporcionen los elementos adecuados para la toma de decisiones. Si en todas las empresas de México se realiza un esfuerzo para incorporar a sus organizaciones no solo los más avanzado en tecnología sino también los procedinúentos, técnicas y metodologías para su explotación, entonces si será nuestro país un protagonista del progreso mundial. Una de las principales alternativas de solución para resolver los problemas citados anteriormente, es el uso de técnicas y herranúentas de Ingeniería de Software en cualquier tipo de sistema de información para su desarrollo y manteninúento, de manera que se aumente la productividad en este aspecto dentro de las organizaciones. El profesor Vicente López Trueba en su clase de Tópicos de Computación apuntó: "Las empresas mexicanas no podrán estar a la par en cuanto a desarrollo de hardware con sus similares americanas, pero en software es diferente, con el ingenio del mexicano y las herranúentas adecuadas se puede crear software inclusive que pueda comercializarse a nivel mundial". Por todo lo anterior se desarrolló el presente trabajo, con el objetivo de proporcionar a losprofesionales del área de sistemas que están preocupados por aumentar la productividad en el desarrollo y manteninúento de software a la medida de sus empresas, buscando eliminar vicios y problemas relacionados con tal actividad, fomentando el cambio de mentalidad, disciplinando al personal para que use técnicas modernas y herranúentas poderosas. 11 Para efectuar este trabajo se emplearon técnicas de investigación documental ( detallada en la bibliografia proporcionada al final), entrevistas a personal de diferentes empresas y la observación directa. El desarrollo del presente estudio se inicia en el capítulo 1, con la definición del término Ingeniería de Software, además de sus aplicaciones en el campo del desarrollo de sistemas. También se proporciona un resumen de las más importantes técnicas para desarrollo de software conocidas aplicables en el ciclo de vida de un sistema, dando ejemplos de algunas, así como una lista y breve descripción de las principales herramientas que existen para apoyarlas. El capítulo 2 denominado "La Ingeniería de Software en México" trata de la importancia de contar con técnicas para desarrollo de sistemas, presenta una breve sembla.nz.a estadística de como ha evolucionado el mercado de bienes y servicios informáticos en nuestro país, así como el crecimiento de los recursos humanos especializados. Se dan las características administrativas, organiz.acionales y ambientales que deben tener las empresas que deseen integrar Ingeniería de Software en sus operaciones. Se incluye además los resultados de un estudio llevado a cabo en diez empresas para conocer la problemática actual en el área. Posteriormente, en el capítulo 3, se cita la situación actual de muchas áreas de sistemas dentro de las compañías, dando ejemplos de problemas cotidianos. También se propone una metodología que permite, mediante un proyecto piloto, demostrar a la gerencia las ventajas de utilizar técnicas y herramientas de Ingeniería de Software para que en este nivel precisamente, se impulse y apoye su uso. Enseguida, en el capítulo 4, se describen tres de las más importantes estrategias que impactarán decididamente en el uso de Ingeniería de Software en los próximos años, estas son: • . CASE ( Computer Aided Software Engineering) o Ingeniería de Software Asistida por computadora. • 4GL (F ourth Generation Language) o lenguajes de cuarta generación. • Reingeniería. De cada una se proporcionan dentro de este trabajo, algunas definiciones y formas de operar de manera que se conozca un poco más a detalle que son y para que se usan. Por último, se incluyen dos anexos. El primero se refiere a un glosario de términos técnicos dentro de este trabajo, que permita una mejor referencia de lo tratado en todos los capítulos. El segundo anexo contiene una lista de las principales herramientas CASE mencionadas en el capítulo 4, así como una breve descripción y nombre de la empresa que las desarrolló. Este trabajo es una buena oportunidad para reconocer que se ha comenzado a impulsar la Ingeniería de Software en México y que con ayuda de quienes participan día a día en las labores propias de desarrollo y mantenimiento de software para las empresas, se asimilará y aplicará mayormente para beneficio del país. CAPITULO 1 INGENIERIA DE SOFTWARE Durante las tres primeras décadas de la informática, el principal desafio era desarrollar el hardware de las computadoras de manera que se redujera el costo de procesamiento y almacenamiento de datos. A lo largo de la década de los 80, los avances en microelectrónica han dado como resultado una mayor potencia en el cálculo a la vez que una reducción de costos. Hoy el problema es diferente. El principal desafio es reducir el costo y mejorar la calidad de las soluciones basadas en computadoras, soluciones que se implementan con el software. La disciplina de Ingenieria de Software se caracteriza por su habilidad de repetirse y la aplicación de herramientas y técnicas para la producción de software de alta calidad. Para beneficiarse al utilizar un enfoque formal de desarrollo de software, se debe ser claro al desarrollar un sistema. La habilidad de repetición implica que se puede usar el mismo método para construir varios sistemas y que otras personas pueden entender y utilizar ese método. La habilidad de medición significa que al seguir una serie de pasos se puede medir el mejoramiento mediante productividad y calidad. En el libro "Control de proyectos de Software", Tom DeMarco indica: ''No se puede controlar lo que no se puede medir". En muchas empresas en México actuaJrnente no se tiene un control al 100°/o del desarrollo de productos de software. Si se desea una discusión entre quienes trabajan dentro de un área de desarrollo de sistemas, profesionales en computación, solo es necesario pedir que definan calidad. Seguro que nadie va estar de acuerdo con los demás. Desde tres puntos de vista, se puede definir calidad. Para el directivo o gerente de la empresa, el software debe ser económico y permitir que se logren los objetivos institucionales en un futuro. El usuario requiere software fácil de usar, eficiente y libre de errores. El encargado de dar mantenimiento demanda un producto sencillo de modificar. 14 Aunque muchos piensan que siempre han desarrollado productos de software de alta calidad para sus usuarios, el hecho es que existen muchos elementos en el mundo real que se deben considerar y que requiere que se cambie la forma de construir software. Gracias a las actuales computadoras de escritorio, el poder disponible solo en grandes macrocomputadoras se ha distribuido a los usuarios del área de sistemas. Pero la experiencia en desarrollo de sistemas no ha acompañado al hardware que ha migrado del centro de cómputo. Como consecuencia, los departamentos de usuarios que crean y mantienen sus propias aplicaciones están en peligro de repetir los mismos errores del pasado. Características como documentación del sistema, mantenimiento y confiabilidad deben ser comunes en todo sistema computacional, sin importar si fue desarrollado por programadores experimentados o por novatos. La pobre calidad no es resultado de falta de información. Los consultores y educadores como Larry Constantine, Edward Yourdon y Tom DeMarco, han escrito y enseñado desde hace 15 años sobre los problemas resultantes del desarrollo de software. Las organizaciones que han adoptado métodos formales han producido software de alta calidad. Pero no fue facil. Las presiones de directivos de niveles medios más preocupados por la fecha de entrega, continuamente obstaculizaron los mejores esfuerzos de aquellos que trataron de adoptar control de calidad. Los problemas no desaparecieron al pasar las aplicaciones de las macrocomputadoras a computadoras de escritorio. El mayor problema es que la mayoría de los desarrolladores de software, no importando en el ambiente en que trabajen, no han considerado los conceptos de Ingeniería de Software. Otro problema que se enfrenta al migrar aplicaciones hacia los usuarios es que se han sofisticado y demandan soluciones de software que hagan más. La interfase gráfica de usuario es la más visible manifestación del incremento de complejidad. La información se está convirtiendo en un recurso estratégico para muchas corporaciones. El acceso oportuno a la información para utiliz.arla posteriormente es crucial para las organizaciones que intentan responder rápidamente a los cambios en el mercado global. Esta flexibilidad y adaptabilidad no se logra facilrnente sin el conocimiento total de la empresa. Frecuentemente los requerimientos de las compañías son tantos y tan diversos que se necesita dividir los esfuerzos de desarrollo de sistemas entre varios programadores. La comunicación de los requerimientos del usuario y el desarrollo de las interfases del sistema se puede convertir en un importante elemento para cumplir con las metas del proyecto. Las aplicacionesbasadas en computadoras personales se están volviendo más complejas en la medida que sustituyen a sus predecesoras que operaban en macrocomputadoras. Consecuentemente, los proyectos de multiprogramación se convertirán en estándar para los desarrolladores de aplicaciones en computadoras personales. Y como apuntó Fred Brooks en "El Mítico Hombre-Mes", el agregar personal al proyecto puede ser menos productivo, debido al tiempo en que las personas que dominan el problema pasan más tiempo explicando a los otros como funciona, en lugar de trabajar en la solución. Los principios de Ingeniería de Software, particularmente las herramientas de análisis, pueden ayudar a los equipos de programación a minimizar los conflictos de comunicación que existen al llevar a cabo un proyecto. 15 La potencia de las grandes computadoras de ayer está hoy disponible en un simple circuito integrado. Las imponentes capacidades de procesamiento y almacenamiento del hardware moderno representan un gran potencial de cálculo. El software es el mecanismo que nos facilita utiliz.ar y explotar ese potencial. 1.1 ¿ QUÉ ES INGENIERÍA DE SOFTWARE? En los primeros días de la informática, los sistemas basados en computadoras se desarrollaban usando técnicas orientadas al hardware. Los encargados de proyectos se centraban en el hardware, debido a que era el factor principal del presupuesto en el desarrollo del sistema. Para controlar los costos del hardware se instituyeron controles formales y estándares técnicos. Se exigía un análisis y diseño completo antes de que algo se construyera. Se media el proceso para determinar donde podían hacerse mejoras. Dicho sencillamente, se aplicaban los controles, métodos y herramientas que reconocemos como ingenieria al hardware. Desgraciadamente, el software era solo un añadido. En esos días, la programación se veía como un arte. Existían pocos métodos formales y pocas personas los usaban. El programador aprendía normalmente su oficio mediante prueba y error. Los desafios de la construcción del software de computadoras crearon una mística que pocos ejecutivos se preocuparon por penetrar. El mundo del software era virtualmente indisciplinado. Hoy, la distribución de costos para el desarrollo de sistemas de información ha cambiado dramáticamente. El software, en vez del hardware, es el elemento principal del costo. Los problemas como la determinación del tiempo de terminación del software, el alto costo, los errores en el producto terminado y la medición del progreso del desarrollo del software, son una manifestación del porque se ha adoptado la práctica de la Ingenieria de Software. Para definir lo que es lngenieria de Software, es necesario describir que se entiende por software. 1.1.1 DEFINICIÓN DE SOFTWARE. Para propósitos del presente trabajo, software son las instrucciones dentro de un programa de computadora que cuando se ejecutan realizan cierta función y proporcionan un resultado deseado. Para entender mejor lo que es el software (y finalmente la Ingenieria de Software), es importante examinar las caracteristicas del software que lo hacen diferente de otras cosas que los hombres pueden construir. Cuando se construye el hardware, el proceso creativo humano (análisis, diseño, construcción, prueba) se traduce finalmente en una forma fisica. Si se construye una nueva computadora, el boceto inicial, diseño formal y prototipo de prueba, evolucionan a un producto fisico integrado por circuitos, tarjetas, cables, etc. 16 Para comprender mejor como se clasifica el software, es necesario definir en que se utiliz.a. El software puede aplicarse en cualquier situación en la que se haya definido previamente un conjunto específico de pasos (un algoritmo). La determinación y contenido de la información son factores importantes para determinar la naturale:za de una aplicación de software. El contenido se refiere al significado y la forma de la información de entrada y salida. Por ejemplo, muchas aplicaciones comerciales hacen uso de datos de entrada muy estructurados ( una base de datos) y producen reportes en cierto formato. El software que controla una máquina automática (por ejemplo, un control numérico) actúa sobre elementos de datos discretos con una estructura limitada y produce órdenes individuales de la máquina en rápida sucesión. La determinación de la información se refiere a la necesidad de predecir el orden y tiempo de llegada de los datos. Un programa de ingeniería acepta datos que están en un orden predefinido, ejecuta el algoritmo sin interrupción y produce los datos resultantes en un informe o gráfica. Tales aplicaciones están determinadas. Un sistema operativo multiusuario, por otra parte, acepta entradas que tienen un contenido variado y se producen en un tiempo arbitrario, ejecuta algoritmos que pueden ser interrumpidos por condiciones externas y produce una salida que depende de la función que se solicita y del tiempo. Las aplicaciones con estas caracteristicas son indeterminadas. Algunas veces es dificil desarrollar una clase específica de software. Conforme crece la complejidad, es más dificil establecer de que tipo de software se trata. En este sentido, la Ingenieria de Software debe usarse para desarrollar software de cualquier clase. Existen distintas clasificaciones de software a saber: • SOF1W ARE DE SISTEMAS. Es una colección de programas escritos para servir a otros programas. Algún software de sistemas ( como compiladores, editores, utilerias y manejadores de archivos) procesa estructuras complejas de la información, aunque determinadas. Otras aplicaciones de sistemas (por ejemplo, componentes del sistema operativo, utilerías de manejo de periféricos, procesadores de comunicaciones) manejan datos en gran medida indeterminados. • SOFTWARE DE TIEMPO REAL. Es el software que mide, analiz.a y controla sucesos del mundo real conforme ocurren. El término tiempo real significa que debe responder en un tiempo muy corto ( en el rango de 1 milisegundo a 1 minuto) y es diferente al tiempo compartido, donde se pueden esperar respuestas en más tiempo sin que ocurran desastres. • SOFTWARE DE APLICACIONES. El procesamiento de información comercial constituye la mayor de las áreas de uso de software. Los sistemas "discretos" (por ejemplo, nómina, cuentas por pagar/cobrar, inventario, etc.) han evolucionado hacia software de sistemas de información de aplicaciones, que tiene acceso a una o más bases de datos grandes que contienen información comercial. 17 • SOFTWARE DE INGENIERIA Y CIENTIFICO. Se ha caracterizado por los algoritmos de "manejo de números". Las aplicaciones van desde la astrononúa y la vulcanología, desde el análisis de presión de motores hasta la dinámica orbital de las naves espaciales. • SOFTWARE INSTALADO DE FABRICA. El software instalado reside en memoria de sólo lectura (ROM - Read Only Memory) y se utiliza para controlar productos y sistemas de los mercados industriales y de consumidores. El software instalado puede ejecutar funciones muy limitadas (por ejemplo, el control de un horno de microondas) o suministrar una función significativa y capacidad de control ( tal como funciones digitales de un automóvil, tales como control de gasolina, sistema de frenado, etc.). • SOFTWARE DE COMPUTADORAS PERSONALES. El mercado del software de las computadoras personales ha crecido en la década de los 80. El procesamiento de palabras, las hojas de cálculo, las gráficas por computadora, juegos, manejo de bases de datos y redes de comunicación son solo unos cuantos de los cientos de aplicaciones. De hecho el software de computadoras personales continúa representando uno de las áreas más creativas en el campo del software. • SOFTWARE DE INTELIGENCIA ARTIFICIAL. El software de inteligencia artificial (IA) hace uso de algoritmos no numéricos para resolver problemas complejos que no son adecuados para el cálculo o análisis directo. Actualmente, el área más activa de la IAes la de sistemas expertos. Otras áreas de aplicación son el reconocimiento de patrones (imágenes y voz), prueba de teoremas y Juegos. 1.1.2 DEFINICIÓN DE INGENIERÍA DE SOFTWARE. La primera definición de lngenieria de Software fue propuesta por Fritz Bauer en 1969 en la primera conferencia dedicada al tema por la OTAN. Para Bauer, Ingenieria de Software es el establecimiento y uso de principios de ingenieria robustos, orientados a obtener económicamente software que sea fiable y funcione eficientemente sobre máquinas reales. [21] Para Fairley, la Ingenieria de Software se define como la disciplina tecnológica preocupada de la producción sistemática y mantenimiento de los productos de software que son desarrollados y modificados en tiempo y dentro de un presupuesto definido. [8] Otra definición más reciente, de Jalote, indica que Ingenieria de Software es el diseño y desarrollo de software de alta calidad. [14] El diccionario Newton Telecom define a la lngenieria de Software como una disciplina ampliamente definida que integra muchos aspectos de programación, desde la elaboración de código hasta el ajustarse a un presupuesto, con el objetivo de producir software adecuado que funcione. [ 18] 18 Sybil P. Parker define la Ingeniería de Software como la aplicación sistemática del conocimiento científico y tecnológico por medio de sólidos conocimientos de ingeniería, a la producción de programas informáticos y a la definición de requerimientos, especificación funcional, descripción de diseños, implementación de programas y métodos de prueba que conducen al código. [21] Y como las anteriores, se pueden obtener varias definiciones más, en donde se mencionan elementos como disciplina, ingeniería, diseño, desarrollo, elaboración de código, etc., que implican la integración de distintos campos del conocimiento para poder lograr software de calidad. Para el presente trabajo, la definición de Ingeniería de Software que propongo y que se adoptará es la siguiente: Ingeniería de Software es la disciplina que comprende un conjunto de metodologías y técnicas multidisciplinarias, que se utilizan para desarrollar software de alta calidad, libre de errores, que cumpla con las expectativas del usuario, que se elabore bajo un presupuesto y un tiempo definidos. Para entender como la Ingeniería de Software se integra al mundo real, es necesario usar un ejemplo de otra ciencia. Considérese el estudio de la química y su uso para resolver problemas. El ingeniero químico investiga compuestos químicos, su estructura, interacción y la teoría respecto a su comportamiento. El ingeniero aplica los resultados de los estudios sobre química a una infinidad de problemas. La química es vista por los ingenieros químicos como un objeto de estudio. Por otra parte, la química es usada como herramienta para solucionar problemas generales. La computación se puede ver de manera similar. Se pueden usar las computadoras y los lenguajes de programación como herramientas útiles para diseñar y resolver problemas. La Ingeniería de Software en lugar de investigar el diseño de hardware o probar teoremas acerca de como trabaja un algoritmo, se enfoca en la computadora como una herramienta para solucionar problemas. El ingeniero de software trabaja con las funciones de una computadora como parte de la solución general del problema, en vez de usar la estructura o la teoría de la computadora misma. Igual que un fabricante busca formas de asegurar la calidad de los productos que elabora, el ingeniero de software cuenta con métodos que aseguran que sus productos son útiles y de calidad. 1.1.3 SOFTWARE DE CALIDAD. La Ingeniería de Software es una estrategia para desarrollar software de calidad. Es importante entonces, entender que significa software de calidad, y que distingue el buen software del malo. Las características del software de calidad dependen de quien analice el software. Los usuarios buscan que el software haga lo que ellos quieren, que sea facil de aprender y usar. Para quienes diseñan 19 y escriben el código y para quienes deben mantener los programas, el software de calidad es entendible, sencillo en su fonna y mantenible, además debe estar documentado. El software de calidad para Boehm debe tener ciertas caracteristicas. Estas no solo se enfocan al buen rendimiento de hardware y software, sino que deben cumplir con las expectativas del usuario. [8] Estas caracteristicas son: • UTILIDAD. El software debe ser útil. Si no lo es, entonces su desarrollo ha sido una pérdida de tiempo, dinero y esfuerzo. La utilidad es la medida de éxito del software para quienes se suponen van a usarlo. La utilidad del software se puede considerar en tres formas, correspondiendo a los tres tipos de usuarios que se involucran una vez que el software es entregado. El usuario original es el primero que estará complacido si el software hace lo que él quiere. • PORTABILIDAD. Pueden existir otras personas que quieran usar el sistema en otras computadoras o en otro lugar. En este caso, el sistema debe ser portátil, de manera que pueda utiliz.arse en otra computadora funcionando apropiadamente. El software también debe permitir usarse en diferentes modelos y versiones de hardware sin perder su funcionabilidad. De igual forma, si se cambia el compilador por otro para el mismo lenguaje de programación, las funciones del software no deben degradarse. Así, el segundo tipo de usuario de un sistema es quien está involucrado con las actualiz.aciones y cambios del sistema. • MANTENIBILIDAD. Es el programador quien mantiene el sistema, haciendo cambios que se requieren conforme se van modificando los requerimientos de quien usará el software o cuando se detectan errores. Un buen programa permite a otras personas distintas a los creadores, entender la lógica y encontrar los problemas. Los programadores con un sistema mantenible deben ser capaces de localiz.ar el error, encontrar los módulos que ejecutan cierta función, entender el código y modificarlo. • CONFIABILIDAD. Por confiabilidad se entiende que el software proporcione el resultado correcto con un apropiado grado de exactitud. En este caso se dice que el software tiene integridad. Más aún, si el mismo conjunto de datos es alimentado al software varias veces bajo las mismas condiciones, los resultados deben ser iguales. Esto es llamado consistencia de función. • EFICIENCIA. El software debe ser eficiente, esto es, debe producir los resultados o realizar su función en un tiempo adecuado, determinado por las necesidades del usuario. De tal forma, los datos deben estar disponibles cuando se necesiten, y el software debe responder al usuario en un tiempo razonable. • EXACTITUD. El software necesita cumplir con el requisito de exactitud, esto es, la especificación de ausencia de error. La medida cuantitativa de la magnitud del error se debe expresar como una función de error relativo. En otras palabras, es la diferencia entre la condición o valor calculado y la condición real, especificada, o valor correcto teórico. 20 • SOLIDEZ. El software debe ser sólido, donde la solidez significa el grado con el que un producto puede continuar operando correctamente, a pesar de la introducción de datos no válidos. • CORRECCION. Esta se refiere al grado en que un producto está libre de defectos de diseño y programación. Es también el grado con que cumple con los requisitos especificados, o también con las expectativas del usuario. • FACILIDAD DE ENTENDIMIENTO. El software debe ser facil de entender y usar para los usuarios y los programadores. Este aspecto también es llamado ingenieria humana y puede ser en ocasiones el más crítico. El software debe ejecutar perfectamente la función por la que fue creado, pero si los usuarios no entienden como usarlo, el software no sirve. Las metas y los requisitos de alto nivel se pueden expresar en ténninos de atributos de calidad que el sistema deberá poseer. Estos atributosde calidad de alto nivel pueden, a su vez, expresarse en términos de atributos que se pueden obtener en los productos finales. Por ejemplo, la confiabilidad puede expresarse en términos de exactitud, solidez, integridad y consistencia del código fuente. Cada uno de estos parámetros debe definirse con cuidado en ténninos de atributos más específicos del código fuente. Por ejemplo, la precisión puede describirse como la proporción con la que los resultados producidos por el código son suficientemente precisos para satisfacer el uso que de ellos se pretende. Esto se puede traducir en requisitos específicos para cualquier problema en particular. De esta manera, software de calidad es aquel que satisface las necesidades de los usuarios y de los programadores que lo utilizan. En resumen, la alta calidad se consigue sí el software: • Hace lo que debe hacer. • Hace uso de los recursos de la computadora de manera eficiente. • Es facil de usar y aprender. • Los desarrolladores del software lo pueden diseñar, codificar, probar y mantener con relativa facilidad. Para producir software de calidad, no es necesario conocer los principios involucrados al construir una computadora o al desarrollar un lenguaje de programación, más bien se deben aprender conceptos, técnicas y herramientas qué ayuden a diseñar y desarrollar software de calidad. La Ingeniería de Software provee todos los elementos para construir exitosamente software de calidad. qqo:ft ,11~v-- - .,. ... ~!,:·,¡¡ ¡.. "'-· ..... ,. _ _. 21 1.2 APLICACIONES DE LA INGENIERÍA DE SOFTWARE. Como se ha definido anteriormente, la Ingeniería de Software es una disciplina para desarrollar software para sistemas basados en computadora. Por lo tanto, la Ingeniería de Software se aplica primordialmente a la elaboración de software de calidad. Para desarrollar un software es necesario seguir una serie de pasos, en cada uno se pueden emplear técnicas y herramientas de Ingeniería de Software para asegurar el óptimo uso de recursos y tiempo. Específicamente, las aplicaciones más comunes de la Ingeniería de Software son las siguientes: En la planeación del proyecto de desarrollo de software, con metodologías que permiten estimar, organizar y controlar todos los aspectos relevantes de manera que exista un camino bien definido a seguir, para conocer de antemano la cantidad de recursos y tiempo requeridos para la puesta en marcha del proyecto. Se puede decir entonces que la Ingeniería de Software se aplica para: • Estimar el tiempo empleado para desarrollar software con la ayuda de técnicas de administración de proyectos que permiten dividir el tiempo en etapas, establecer actividades criticas, y fijar fechas de revisión y entrega. • Analiz.ar el esfuerzo de recursos humanos, es decir, cuantas personas deben trabajar en el proyecto considerando la complejidad, tamaño y tipo del software a desarrollar. • Calcular los costos involucrados en la producción de software, costos fijos y variables involucrados, consideraciones de costo de lineas de código según complejidad y costo de documentación. • Definir las funciones del sistema estableciendo requisitos y proporcionando guías para describir claramente los limites y objetivos del software que se desarrollará. • Organizar el proyecto mediante lineamientos que permiten estructurar la forma en que trabajará el personal encargado de desarrollar el software de manera que exista mayor interrelación y comunicación entre ellos, el usuario y la gerencia. • Seleccionar la metodología de desarrollo del software al definir las diferencias de enfoque que existen en cada una, de tal forma que los encargados de la elaboración del sistema puedan utilizar la más adecuada según sus necesidades. 22 En la actividad propiamente dicha de desarrollo del sistema, se aplican las técnicas y herramientas de Ingeniería de Software para asegurar que el usuario y el personal de sistemas encargados de desarrollar el software tienen la misma percepción del sistema. También se aplica para especificar claramente que y cómo se va a elaborar el software al proporcionar metodologías precisas que se pueden utiliz.ar en todos los pasos de su realiz.ación. La Ingeniería de Software se aplica entonces para: • Analiz.ar el sistema o el software que se va a desarrollar, mediante técnicas que permiten especificar concretamente los objetivos y requisitos que debe tener. • Diseñar el sistema de tal forma que cumpla oon los objetivos propuestos en el análisis. En esta fase la Ingeniería de Software permite definir el modelo que se va a utilizar para desarrollar fisicamente el sistema y proporciona lineamientos a seguir para asegurar que el sistema funcionará antes de programarlo. • En la fase de programación se aplica la Ingeniería de Software suministrando guías generales aplicables con diferentes lenguajes de programación que lleven a desarrollar programas de computadora eficientes y óptimos. • Al probar y revisar el software ya programado, la Ingeniería de Software provee diferentes tipos de enfoques de pruebas que sirven para comprobar si funciona adecuadamente y que se seleccionan según su tamaño y tipo. • Para mantener el software después de que ha sido liberado para su uso, la Ingeniería de Software proporciona estándares y directrices que se deben seguir para que esta actividad de mejoramiento de los programas se lleve a cabo en forma organizada. En resumen, la Ingeniería de Software se debe aplicar en forma primaria en todos los aspectos de la actividad de desarrollo de software, porque proporciona los lineamientos necesarios para que se pueda realizar adecuadamente garantiz.ando que el sistema que finalmente se va a entregar será de alta calidad. 1.3 TECNICAS DE INGENIERIA DE SOFTWARE. El ingeniero de sistemas utiliza el conocimiento que tiene de las computadoras y de la computación para resolver problemas. Algunas veces el problema que resuelve se relacionado a una computadora o a un sistema de computadoras, pero algunas veces los problemas no tienen nada que ver con su uso. Por lo tanto, es importante entender que para resolver un problema primero es necesario entender la naturalez.a del mismo. En particular, se debe tener cuidado en imponer la tecnología de la computación a todo tipo de problemas. Es necesario primero resolver el problema, y 23 luego, si se estima conveniente, utiliz.ar la computadora como herranúenta para lograr una solución automatizada. Para resolver un problema es necesario primero analizarlo, esto es, descomponer el problema en partes manejables que puedan entenderse y tratarse. Después se ataca cada problema por separado para después construir una solución total. Para resolver un problema, es necesario utiliz.ar técnicas y herranúentas. Se le llama técnica al procedinúento formal o método que se usa para producir cierto resultado. Por ejemplo, un chef de cocina puede preparar una ensalada usando una secuencia de ingredientes combinándolos cuidadosamente, dándoles tiempo para que se mezclen apropiadamente y acomodándolos en cierto orden de manera que tienen un sabor y consister,cia especial. El procedinúento de elaboración de la ensalada involucra tiempo e ingredientes pero no depende del tipo de equipo de cocina usado. Lo que hace a la ensalada más sabrosa es la técnica, no el recipiente o la cuchara usada por el chef El ingeniero de sistemas busca utiliz.ar técnicas de forma eficiente y productiva para crear soluciones efectivas a sus problemas. A continuación se mencionan las principales técnicas de Ingeniería de Software y la fase de desarrollo donde se utilizan. 1.3.1 TÉCNICAS DE LA FASE DE PLANEACIÓN. La falta de planeación es la causa principal de los retrasos en programación, incremento de costos y altos costos de mantenimiento en los desarrollos de productos de programación. Para evitar estos problemas se requiere de una planeación cuidadosa, tanto en el proceso de desarrollo como enla operación del producto. Con frecuencia, se dice que es imposible una planeación inicial, porque la información precisa sobre las metas del proyecto, necesidades del usuario y restricciones del producto no se conocen al comenz.ar el proyecto de desarrollo, sin embargo, uno de los principales propósitos de esta fase es aclarar los objetivos, necesidades y restricciones. Se debe reconocer también que los planes prelinúnares se modificarán según vayan evolucionando los productos, la planeación para el cambio es uno de los aspectos clave con la que se logra el éxito. Las técnicas para planear desarrollo de software nacieron como parte de otras disciplinas de administración e ingeniería, no son fundamentalmente del área de computación, pero son muy útiles debido a las actividades propias de la fase de planeación. A continuación se mencionan algunas de las más importantes: • Administración por objetivos. [8] • Organización de grupos de trabajo. [8] 24 • Administración de proyectos. [21] • Ingeniería económica. [7] • Estimación del nivel de contratación. [8] • Métricas para la productividad y la calidad del software. [21] 1.3.2 TÉCNICAS DE LA FASE DE ANÁLISIS. Esta fase es la especificación de requisitos para la producción de software. Se basa en la definición clara y correcta del sistema. Los requisitos de alto nive~ los cuales se especifican durante la planeación inici~ se detallan y se hacen más específicos para definir las características que el producto de programación debe tener. En teoría, el análisis del sistema o producto de software establecerá "que" es el producto sin implicar "como" es éste. El diseño del producto se refiere a como va a proporcionar las características deseadas. Las técnicas de Ingeniería de Software relacionados con el análisis del software proporcionan lineamientos y permiten que el analista del sistema tenga una idea más clara de todos los elementos necesarios y sus interrelaciones que sirven para que comprenda el funcionamiento y así se establezcan las especificaciones que debe cumplir para convertirse más tarde en un software de calidad. Algunas técnicas que se utiliz.an en esta fase son: • Análisis estructurado (Y ourdon, De Marco, Constantine ). [21] • SADT-Structured Analysis and Design Technique (Ross). [8] • SSA-Structured System Analysis (Gane & Sarson). [8] • Análisis orientado a objetos. [21] • Construcción de prototipos. [ 1] • Factores críticos de éxito (Rockart). [21] • Diagramas definidos por usuario. [17] 1.3.3 TÉCNICAS DE LA FASE DE DISEÑO. El diseño es el primer paso en el desarrollo de cualquier producto o software. El objetivo del diseñador es producir un modelo o representación de una entidad que será construida más adelante. El proceso por el cual se desarrolla el modelo combina: intuición y criterios basándose en la experiencia de construir entidades similares, un conjunto de principios y/o heurísticas que guían la forma en que se 25 desarrolla el modelo, un conjunto de criterios que facilitan discernir sobre la calidad y un proceso de iteración que conduce finalmente a una representación del diseño final. El diseño de software para computadoras, como los métodos de diseño de ingeniería de otras disciplinas, cambia continuamente, conforme aparecen nuevos métodos, mejores análisis y un más amplio conocimiento. A diferencia del diseño mecánico o electrónico, el diseño de software está en una etapa relativamente temprana de su evolución. El diseño de software apartado a la programación, se ha tomado en serio desde hace dos décadas. Por tanto, a las metodologías de diseño de software les falta profundidad, flexibilidad y la naturaleza cuantitativa asociada normalmente con las disciplinas de diseño de ingeniería más clásicas. Sin embargo, las técnicas existentes de diseño proveen criterios para lograr productos de alta calidad. Algunas son: • Diagramas Warnier-Orr. [21] • Desarrollo de sistemas (Jackson). [21] • Diagramas de entidad-relación (Chen & Martin). [21] • Diseño estructurado (Yourdon). [21] • Tablas y árboles de decisión. [8] • Diseño orientado a objetos (DOO). [21] • Diseño tiempo real. [21] • Diseño de bases de datos. [21] 1.3.4 TÉCNICAS DE LA FASE DE PROGRAMACIÓN. El objetivo de todo el esfuerzo del análisis y diseño de software se verá reflejado en la programación, la codificación de las especificaciones en instrucciones de computadora. Es importante entonces, que esta actividad se ejecute con un apego estricto a lo definido en las fases anteriores. Sin técnicas para auxiliarse, la programación se puede convertir en una fase sola de mera traducción, es necesario no solo traducir todo a lenguaje de programación, sino hacerlo de una forma que el código resultante sea eficiente, esté en la medida libre de errores y listo para integrarse en forma completa para formar un sistema completo. Aunque hoy en día se comienza a difundir el uso de herramientas y lenguajes de cuarta generación ( 4GL }, que no requieren de la especificación del procedimiento, todavía existe un gran nümero de aplicaciones que se desarrollan en lenguajes de tercera generación, COBOL, Pascal, ADA, 26 Basic e inclusive FORTRAN. Por esto es conveniente tener en cuenta técnicas que fomenten la disciplina de la planeación, verificación y desarrollo de programas que funcionen bien desde su creación. Algunas técnicas que son útiles: • Programación estructurada. [21] • Diagramas de flujo de programas.[8] • Diagramas Nassi-Schneiderman (N-S) o Chapin. [21] • Pseudocódigo. [8] • Refinamiento sucesivo de programas (Wirth). [8] • Top down, bottom up y sandwich. [8] • Diagramas tipo HIPO. [8] 1.3.5 TÉCNICAS DE LA FASE DE PRUEBAS. La importancia de la prueba de software y sus implicaciones con la calidad del producto no se pueden sobre valorar. La prueba es un elemento crítico para la garantía del software y representa un último paso para las especificaciones. La prueba representa una interesante anomalía para el ingeniero de software. Durante las fases anteriores de definición y desarrollo, el ingeniero intenta construir software partiendo de un control abstracto y llegando a una implantación tangible. A continuación llega la prueba que intenta "demoler" el software que ya ha sido construido. De hecho, la prueba es uno de los pasos de la lngenieria de Software que se puede ver como destructivo en lugar de constructivo. A continuación se presentan algunas de las técnicas para pruebas de software y diseño de casos de prueba. • Recorridos estructurados e inspecciones. [8] • Pruebas de caja blanca. [21] • Pruebas de caja negra. [21] • Pruebas de Sistema y de unidad. [8] • Depuración. [8] 27 1.3.6 TÉCNICAS DE LA FASE DE MANTENIMIENTO. El mantenimiento, la última fase del proceso de ingeniería del software, se lleva la mayor parte de todo el dinero gastado en el software de computadora. A medida que se desarrollan más programas, surge una tendencia problemática debido a la cantidad de esfuerzo y de recursos gastados en el mantenimiento de software que siempre crece y crece. Finalmente, algunas organiz.aciones de desarrollo de software pueden llegar a la barrera del mantenimiento, incapaces de embarcarse en nuevos proyectos debido a que tienen todos sus recursos dedicados al mantenimiento de antiguos programas. El mantenimiento ordenado, bajo ciertos lineamientos y usando técnicas adecuadas, permite que esta actividad sea ejecutada en el mínimo de tiempo y sin la derrama de recursos tan importante que usualmente se realiz.a. Las técnicas más importantes son: • Mantenimiento de Software. [21] • Administración de la configuración. [21] 1.4 HERRAMIENTAS DE INGENIERIA DE SOFTWARE. Algunas veces el uso de un procedimiento o método (pero no necesariamente una herramienta) puede ser similar a utilizar un instrumento. Una herramienta es un instrumento o un sistema automatizado que permite realiz.ar con una considerable mejoríacierta actividad. Esta mejoria significa que la herramienta permite que la actividad se realice de manera más precisa, más eficiente, más productiva o que resalte la calidad del producto resultante. Por ejemplo, se usa una máquina de escribir para hacer cartas porque las letras que pone en el papel son más fáciles de leer que la escritura a mano. También se usan tijeras como herramienta porque se puede cortar más rápido y con mayor precisión el papel que sí sé troz.a con las manos. El ingeniero en sistemas utiliz.a herramientas para resaltar la calidad del software que produce. Ejemplos de este tipo de herramientas son: 1.4.1 HERRAMIENTAS PARA ADMINISTRACIÓN DE PROYECTOS. Estas herramientas automáticas de estimación permiten al planificador estimar costos y esfuerzos así como llevar a cabo análisis del tipo "que pasa si" con importantes variables del proyecto tales como la fecha de entrega o la selección de personal. Algunos ejemplos son: • Programas para la administración de proyectos para computadoras personales como Timeline, MS Project y Mac Project entre otros. 28 • Programas elaborados especialmente para resolver problemas de programación lineal que pueden usarse conjuntamente con los anteriores. 1.4.2 HERRAMIENTAS PARA ANÁLISIS DE SISTEMAS. Se han desarrollado varios lenguajes de aplicación especial y paquetes para permitir el establecimiento conciso y el análisis automático de las especificaciones de los productos de programación. Algunos lenguajes de especificación eran de naturaleza gráfica, mientras que otros emplean texto; todos eran de naturaleza relacional, además se usaban en forma manual y otros tenían paquetes de programación para su uso. Las herramientas para el análisis automatizado de requerimientos, hacían uso de una notación especial ( en la mayoría de los casos esto es un lenguaje de especificación de requerimientos) que era procesada de una manera automática. Los requerimientos se describían con un lenguaje de especificación, que combinaba indicadores de palabras clave con explicaciones en lenguaje natural como el inglés. El lenguaje se mandaba a un procesador que producía una especificación de requerimientos y, más importante, un conjunto de informes de diagnósticos sobre la consistencia y organización de la especificación. En la actualidad y gracias a la tecnología computacional, existen una serie de paquetes y programas que ayudan al analista de sistemas a efectuar su trabajo de una manera más sencilla, permitiéndole además obtener productos como diagramas, diccionario de datos, lista de procesos, almacenamientos de información y diversas especificaciones, que le serán de utilidad para las fases posteriores del desarrollo de un producto de software. A continuación se presentan ejemplos de algunas herramientas y su área de aplicación: • APPLICATION ANAL YSIS&DESIGN: Análisis y diseño estructurado de sistemas. • CASFJ4/0: Reingeniería de procesos de negocios, análisis de sistemas, diseño e implementación. • OBJECT IF: Análisis y diseño de sistemas, técnicas orientadas a objetos. • ORCIDS: Herramientas para análisis funcional usando la técnica SADT. • PAC DESIGN: Análisis y diseño mediante el modelamiento de negocios, metodología de Yourdon. • P ARADIGM PLUS: Análisis y diseño orientado a objetos en tiempo real. • PROMOD-PLUS: Herramientas CASE para análisis y diseño estructurado. • TEAMWORK: Conjunto de herramientas para análisis y diseño estructurado. 29 1.4.3 HERRAMIENTAS CASE. Estas herramientas han sido diseñadas para automatizar la generación y mantenimiento de lo que era originalmente un método manual. Normalmente hacen uso de una ayuda a la subdivisión del problema, mantiene una jerarquía de información sobre el sistema y aplica heuristicas para descubrir problemas con la especificación. Más importante, las herramientas facilitan al analista actualizar la información y anotar las conexiones entre las nuevas y antiguas representaciones del sistema. Por ejemplo, el sistema CASE 2000 de Nastec, ayuda al analista la generación de diagramas de flujo y de diccionario de datos, además mantiene a éstos en una base de datos que puede ser analiz.ada para comprobar la corrección, consistencia y no redundancia. De hecho, el verdadero beneficio de esto, y de la mayoría de las herramientas de requerimientos automatizados, está en el procesamiento inteligente que estas herramientas aplican a la especificación del problema. De las herramientas CASE más conocidas, se tienen las siguientes: • ANAL YST/DESIGNER TOOLKIT: CASE que utiliz.a la metodología de Yourdon. • CASE 2000: Generación de diagramas de flujo y diccionario de datos. • CRADLE: Herramienta para aplicar en el ciclo completo de vida de los sistemas. • DISCOVER: Conjunto de herramientas para desarrollo de sistemas de información. • EIFFEL CASE: Ingeniería de Software interactiva. • ERWIN: Modelamiento de datos, creación de aplicaciones cliente-servidor. • EXCELERA TOR 11: Análisis y diseño de sistemas, diagramas y definición de programas. • IEF: CASE de Texas Instruments para macrocomputadoras. • MAC A&D: Manejo de varias metodologías, para computadoras Macintosh. • MAGEC: Aplicable en todo el ciclo de vida del sistema, genera código en COBOL. • MEGA Juego de herramientas CASE para todo el ciclo de vida de un sistema. • OBJECT WORKS \ C++: CASE orientado a objetos con interfase para lenguaje C++. • P ACBASE: Generación de código, útil para todo el ciclo de vida del sistema. 1.4.4 HERRAMIENTAS PARA PROGRAMACIÓN, PRUEBAS Y MANTENIMIENTO. Las herramientas de esta categoria son a menudo las únicas disponibles para el desarrollo de software ( una situación que no es ideal), están orientadas al código e incluyen compiladores de lenguajes de programación, editores, enlazadores y cargadores, ayudas para la depuración y una amplia serie de utilerias específicas del lenguaje de programación que se esté utilizando. Actualmente muchos lenguajes de programación comerciales integran herramientas para programación y pruebas al proveer depuradores de código (debuggers) y rastreadores (tracers). 30 Es conveniente resaltar que la documentación del software es una parte muy importante. Todo lo realizado en el análisis, diseño, programación, pruebas y mantenimiento debe estar claramente definido. Por esto es importante contar con herramientas que permitan la modificación de la documentación de manera sencilla., es recomendable usar para tal efecto: procesadores de texto, diagramadores, programas para graficación, para presentación y hojas de cálculo. Actualmente, existen herramientas que permiten realizar la labor de documentación casi automáticamente a través del código del programa., también existen probadores y generadores de casos de prueba, el único inconveniente es que muchos de estos son específicos para ciertos lenguajes de programación y su costo es elevado. Algunos ejemplos de herramientas para documentación y pruebas de sistemas son: • DOC EXPRESS: Automatización de documentación y publicación. • DOC/SW: (parte de DISCO VER) documentación de código y de objetos. • IMAGIX 40: Ingeniería reversa y documentación para lenguaje C y C++. • OEW FOR C++: Diagramas de relaciones, explorador de código y documentación. • PROCEDURE DESIGN: Editor de diagramas de flujo, generador de documentación. • TESTDESIGNER Conjunto de herramientas para hacer pruebas en sistemas. • TESTPLAN: Administración de las pruebas del sistema como un proyecto. • VISUAL TESTING TOOLSET: Cobertura de las pruebas al código. 1.4.5 HERRAMIENTAS PARA CONSTRUCCIÓN DE PROTOTIPOS. Para conseguir una construcción rápida de prototipo, existen tres clases genéricas de métodos y herramientas: técnicas de cuarta generación, componentes de software reusables y entornos de construcción de prototipos. Las técnicas de la cuarta generación o 4GT comprenden un amplio repertorio de lenguajes de informes (Report Generator) y consultas de base de datos(Query), generadores de programas y aplicaciones y otros lenguajes no procedimentales de muy alto nivel. Debido a que las 4GT facilitan a quién las usa, la programación general y código ejecutable rápidamente, son ideales para la construcción rápida de prototipos. Desafortunadamente, el dominio de aplicación de las 4GT está actualmente limitado a sistemas de información comerciales. Otro método para la construcción rápida de prototipos es ensamblar, en vez de construir, el prototipo usando un conjunto de componentes de software existente. Un componente de software puede ser una estructura de datos ( o base de datos) o una componente arquitectónica de software (por ejemplo un programa) o una componente procedimental (es decir, un módulo). En cada caso, la componente de software debe ser diseñada de forma que facilite el ser reusada sin conocer los detalles de su funcionamiento interno. Debe observarse que un producto de software existente puede ser utilizado como un prototipo más adelante, para crear un nuevo sistema mejorado y competitivo. De alguna manera, esto es una forma de reutilización para la construcción de prototipos de software en la cual se requieren herramientas como bases de datos para llevar un control de las bibliotecas de módulos reusables. 31 Por otra parte, en las pasadas dos décadas se desarrollaron varios lenguajes de especificación fonnal para reemplaz.ar las técnicas de especificación en lenguaje natural. Los lenguajes de especificación como PSL, RSL, IORL, GYPSY, OBJ y muchos otros, eran acompañados de entornos interactivos en un esfuerzo por conseguir un paradigma de Ingenieria de Software automatizada. Estas y otras herramientas fueron mejorando para hacer el desarrollo de prototipos una labor más eficiente. En la actualidad, se ha buscado el llamado desarrollo rápido de aplicaciones (RAD) mediante lenguajes orientados a objetos, mediante el uso de prototipos que puedan irse mejorando paulatinamente. A continuación se dan ejemplos de algunas herramientas que son útiles para el desarrollo sistemas manejando prototipos: • OBJECT PROTOTYPE: Generación de objetos mediante prototipos. • PRINCIPIAIRAD: Creación de prototipos mediante el lenguaje Visual Basic. • PERTS: Ambiente para la elaboración de sistemas en tiempo real mediante prototipos. • GLG TOOLKIT: Animación y simulación de sistemas de misión critica, usando prototipos en C++y Java. • LOCANA Herramienta CASE para generación de prototipos orientados a objetos. En el anexo B del presente trabajo, se presenta una lista más detallada de las herramientas CASE que se manejan en el mercado hoy en día y que se utilizan en diferentes fases del desarrollo de un sistema o producto de software. CAPITUL02 LA INGENIERIA DE SOFTWARE EN MÉXICO El desarrollo de software está lentamente convirtiéndose en un proceso estructurado, altamente controlado e incrementando su estandarización. Las empresas que no entienden como administrar el desarrollo y mantenimiento de grandes sistemas de software que se requieren para aplicaciones actuales y futuras se verán rezagadas en este cambio. La solución a este problema tiene tres componentes: primero, un gran compromiso en la educación; segundo, los sistemas deberían diseñarse para mantenerlos, extenderlos y reusarlos~ y tercero, utilizar un enfoque orientado a objetos para desarrollar sistemas. Un estudio del Instituto de Ingeniería de Software (SEI) de la Universidad Camegie Mellon en 1988 de 200 empresas en EUA mostró que el 86% considera su esfuerzo de Ingeniería de Software en un nivel 1, el inicial, donde la programación se realiza utilizando algunas técnicas; 13. 5% se manifestaron en el nivel 2, el nivel de repetición, en que los esfuerzos de una o dos personas permite que los proyectos se concluyan exitosamente; una empresa mencionó estar en nivel 3, el nivel de maduración, donde la Ingeniería de Software está bien definida e institucionalizada. Ninguna empresa está en nivel 4, el de administración, donde se maneja y se mide la lngenieria de Software. En el nivel 5, el de optimización, no se encontró ninguna empresa, en este punto se tiene un conocimiento profundo y experiencia en la Ingenieria de Software que se aplica a nuevos proyectos. [20] En México no existe información actualizada de la utilización de lngenieria de Software dentro de las empresas, no existen estudios que indiquen el grado en que se han asimilado las técnicas desde su aparición e inicios de los años 70. En general, las empresas mexicanas utilizan métodos y procedimientos que distan mucho de aumentar la productividad en el medio de desarrollo de software, donde la falta de comunicación entre quienes desarrollan sistemas y los usuarios, la baja cultura informática entre los ejecutivos de alto rango, el desarrollo de las telecomunicaciones, la inadecuada elaboración de planes de estudio en las universidades con respecto a lo que se requiere en las empresas y otras, son causas que han detenido el progreso de la informática como herramienta para el avance del país. 34 Es necesario reconocer que la asimilación de las técnicas y herramientas de lngenieria de Software aunado con una buena organiz.ación y administración tanto de la empresa en general como del área encargada del desarrollo de software dentro de la misma, permitirá que exista el ambiente adecuado para crear software y sistemas de alta calidad. 2.1 ANTECEDENTES DE APLICACION EN MÉXICO. La lngenieria de Software en nuestro país depende mucho de la evolución que tiene en el vecino EUA, debido a la relación que existe de comercio y además que la mayoria de los equipos de cómputo provienen de esa nación, de igual manera las metodologías y técnicas que se usan son traídas por los proveedores de computación. En México no existen antecedentes de creación de una técnica de lngenieria de Software propia, las pocas que son utiliz:adas fueron desarrolladas en las universidades o empresas norteamericanas, y después de cierto tiempo, son divulgadas a través de seminarios, cursos, conferencias u otro tipo de eventos a las personas que lo solicitan, de tal manera que algunos las conocen y en ocasiones las llegan a aplicar. Por otra parte, muchas empresas transnacionales asentadas en nuestro país, envían sistemas desarrollados para ser explotados en sus instalaciones y otras manejan metodologías propias que les permiten tener un control sobre la operación del área de desarrollo de sistemas. No importando la situación, es notable el poco uso que se le da a la lngenieria de Software en la mayoria de las empresas, sin embargo, este enfoque va cambiando paulatinamente según el avance que tienen en un grupo selecto de compañías que están a la cabeza en este punto en nuestro país. 2.1.1 ANTECEDENTES DE LA INGENIERÍA DE SOFTWARE. La necesidad de enfoques sistemáticos para el desarrollo y mantenimiento de productos de software se patentizó en la década de los años 60. Durante ésta, aparecieron las computadoras de la tercera generación y se desarrollaron técnicas de programación como la multiprogramación y el tiempo compartido. Estas nuevas capacidades aportaron la tecnología necesaria para el establecimiento de sistemas computacionales interactivos, de multiusuario, en linea y en tiempo real; así surgieron nuevas aplicaciones para la computación, como las reservaciones aéreas, bancos de información, tiempo compartido para diversas aplicaciones, control de procesos y otras. Aunque mucho de estos sistemas fueron desarrollados y producidos adecuadamente, gran parte de los sistemas intentados nunca se produjeron; de los producidos muchos quedaron sujetos a sobrecosto, entrega tardía, poca confiabilidad, ineficiencia y ante todo, a poca aceptación por parte de 35 los usuarios. Confonne las computadoras crecieron haciéndose más complejas, resultó obvio que la demanda por los productos de software creció en mayor cantidad que la capacidad de producir y mantener dichosproductos. Para considerar el creciente problema de la tecnología de software, se convocó en 1968 a una reunión de trabajo en Garmisch, Alemania Oriental~ en esa junta así como la siguiente, celebrada en Roma, Italia en 1969, se estimuló el interés general hacia los aspectos técnicos y adnúnistrativos utilizados en el desarrollo y mantenimiento de software. El ténnino lngenieria de Software en inglés "Software Engineering" fue utiliz.ado por primera vez en esas reuniones. [8] La siguiente evolución de los sistemas computacionales comenzó a mediados de los años 70 y continúa hoy. Los sistemas distribuidos donde se comunican unas computadoras con otras, incrementaron notablemente la complejidad de los sistemas informáticos. Las redes de área local y global, comunicaciones digitales de alto ancho de banda y creciente demanda de acceso en linea a los datos, supusieron una fuerte presión sobre los desarrolladores de software. Esta etapa también se caracteriza por la llegada y amplio uso de los microprocesadores. La computadora personal apareció a principios de los años 80 y ha sido el agente de crecimiento de muchas compañías de software. El hardware de este tipo de computadoras se ha convertido rápidamente en un producto estándar, mientras que el software marca la gran diferencia. De hecho, mientras las ventas de computadoras personales se estabiliz.aron a mediados de los años 80, las ventas de software continuaron creciendo. Mucha gente de la industria y también en forma particular gasta más dinero en software (sin tomar en cuenta el problema de la piratería) de lo que gastaron en la computadora sobre la cual se utiliz.a. La nueva era en el software de computadoras está ahora comenzando. Autores tales como Feigenbaum y McCorduck en su obra "La quinta generación", predijeron que las computadoras y su correspondiente software tendrán un profundo impacto en el equilibrio de la potencia política e industrial de todo el mundo. Las técnicas para el desarrollo de software que se están usando actualmente han cambiando la forma en que algunos segmentos de la comunidad informática construyen los programas para computadora. Los sistemas expertos y el software de inteligencia artificial se han trasladado finalmente del laboratorio a aplicaciones prácticas, en un amplio rango de problemas del mundo real. [21] · 36 2.1.2 MERCADO NACIONAL DE BIENES Y SERVICIOS INFORMÁTICOS. Para tener una idea clara de como han incursionado la lngenieria de Software en México, es necesario conocer la evolución del mercado general de la infonnática. Los datos que aparecen a continuación provienen de una publicación del INEGI (Instituto Nacional de Estadística Geografia e Infonnática) elaborado en 1993 (el único y más reciente) llamado ''La situación de la Infonnática en México". [13] El tamaño del mercado de bienes y servicios infonnáticos constituye un indicador del nivel alcanz.ado por la actividad infonnática, ya que permite detectar, en cierta medida, la evolución que ha presentado el sector en los últimos años. En 1986, el valor del mercado de cómputo en México fue de 498 millones de dólares, que correspondió al 0.35% del valor del mercado internacional, valor calculado con base a cifras la revista Datamation 100 de junio de 1987. Durante el periodo 1973 a 1986 la dinámica fue acelerada, multiplicando su valor casi cinco veces desde 1973 y creciendo a una tasa promedio anual de 22.9%. La tasa promedio de crecimiento anual entre 1989 y 1990 fue del 33.1% y se estima que permanecerá así hasta 1993, para 1995 el mercado se estimó alcamaria aproximadamente 3 mil 227.4 millones de dólares. La estructura pronosticada para 1995 en el mercado de cómputo es la siguiente: • Sistemas multiusuario (Minis/Macros) 32% • Sistemas Personales (PC's/Otros) 64% • Comunicaciones 4% Conforme a datos de 1991, el valor del mercado computacional mexicano representó aproximadamente el 0.53% del PIB y la densidad de computadoras corresponde a 12 computadoras por cada mil habitantes. Para fines de 1992 se espera que este último indicador corresponda a 15 computadoras por cada mil habitantes. A pesar de la dinámica mostrada por el mercado interno, sus dimensiones con respecto a las de los países industrializ.ados, son aún pequeñas. Por ejemplo, en 1987 el valor del mercado de equipo de procesamiento y periférico en México, representó sólo el O .11 % del que había en EUA; 3 .5%, respecto al de Japón; 3.7, al de Alemania; 4.8%, al de Gran Bretaña; 5.3% al de Francia; y 8.6%, al de Italia. En la industria de hardware, el segmento de microcomputadoras fue el que mostró mayor crecimiento en los últimos años, al representar el 68% del mercado total. Una de las principales tendencias observadas en este mercado es, precisamente, la migración hacia sistemas abiertos y el uso de redes de computadoras. En este punto, las redes de tipo Ethernet son las que cuentan con mayor participación en el mercado de redes (66%) comparado con Token Ring (13%) y Arcnet (21%) en 37 1991. Los sistemas operativos como UNIX y OS/2 se pronosticó que para 1995 tendrían en México una participación del 75% del mercado de sistemas abiertos. En México, la banca comercial es el usuario más importante de computadoras, equipos y servicios asociados, con una cantidad estimada en 1989, de 302.90 millones de dólares, correspondiente al 35% del mercado infonnático nacional, seguido por el gobierno. Otros usuarios importantes en el país son las casas de bolsa, cadenas comerciales, tiendas departamentales, supermercados, industria automotriz, química y de la construcción, así como el sector servicios y educativo. Al parecer, existe cierto grado de asimilación tecnológica ya que algunos productos que se comercializ.an en el extranjero, sobre todo en EUA, son lanzados en México sin que existan rez.agos importantes. Dentro de este grupo de productos, que se difundieron rápidamente, cabe considerar a las microcomputadoras que utiliz.aban microprocesadores del tipo Intel 80286 o similares, y trabajaban con sistema operativo MS DOS o UNIX, que aparecieron en aquel país en 1984 y en el mercado nacional en 1985. 2.1.3 MERCADO DE PROGRAMACIÓN (SOFTWARE O SOPORTE LÓGICO). En 1991 el mercado de software en México fue de 180.2 millones de dólares. Se estima que para 1995 el mercado nacional alcance la cifra de 496.4 millones de dólares. Entre 1989 y 1990, la venta de software se incrementó aproximadamente en un 18% anual, y se esperaba que de 1990 a 1995 creciera a una tasa promedio anual de 28.8% como se muestra en la figura 2.1 u "D III III U u .. e • ..2 :o = "D :E 500 400 300 200 Mercado de Software en México 1989 1990 1991 1992 1993 1994 1995 Afio Figura 2.1 Crecimiento del Mercado de Software en México De acuerdo con datos de 1991 de la Asociación Nacional de la Industria de Programas para Computadoras (ANIPCO), se estima que alrededor del 700/o de los productos son de origen extranjero, 38 principalmente norteamericanos. De este porcentaje se calcula que la mitad es por importación directa y la otra parte por la venta de las representaciones locales de los productos. La producción local de software se ha incrementado en los últimos años, principalmente en el nivel de aplicaciones y dentro de estas las especializ.adas o verticales. En la actualidad existen diversos tipos de distribuidores de software en México, que van desde las pequeñas compañías locales que desarrollan software y ofrecen productos de manufactura casera hasta compañías transnacionales que ofrecen paquetes de software, manufactura de equipo y venta de servICIOS. En relación con empresas de software, ANIPCO contaba con 160 casas registradas; sin embargo, se estima que existen alrededor de 500, de las cuales la mayoria son casas pequeñas de aproximadamente 1 O empleados. Actualmente, ANIPCO ha desaparecido y ha dado su lugar a AMITI (Asociación Mexicana de la Industria de Tecnología de Información)
Compartir