La gran mayoría de universidades e instituciones de educación superior poseen programas de estudio que suelen ser o más bien parecer, lo más adecuado para la educación y capacitación de los desarrolladores que la industria y gobierno necesitan para el software de hoy y mañana.
REQUERIMIENTOS DE DESARROLLO DE SOFTWARE DE CALIDAD
ESTUDIO DE CASO La empresa ABC Sistemas, S.A. de C.V. fue contratada para el desarrollo de un sistema administrativo para llevar a cabo el control de los procesos necesarios para la operación de la empresa. Los requerimientos definían que el desarrollo se hiciera en pocos meses y con poco margen de tiempo para pruebas e implementación. Acordados los puntos de requerimientos se inició el proceso para la contratación, análisis, evaluación de necesidades, diseño y modelado de negocio, diseño relacional y desarrollo del código. Al principio se presentaron los planes de trabajo y los objetivos a lograr en cada reunión, sin embargo, conforme el tiempo avanzaba, los objetivos y las metas del proyecto empezaron a desfasarse con respecto al plan original, los usuarios empezaron a molestarse, el equipo de desarrollo tuvo que liberar el producto a producción sin haberlo terminado por completo y lo que era un tranquilo desarrollo más de software se convirtió en una pesadilla para todos. De pronto todo el equipo formado por el líder de proyecto, los programadores, el personal interno de la empresa y los usuarios estaban enfrascados en la tarea de no abortar el proyecto invirtiendo grandes cantidades de tiempo para resolver las emergencias del código poco planeado y al mismo tiempo, desarrollar la funcionalidad requerida por las especificaciones del software.
Al cabo de varios meses, lo cual llegó a ser cuatro veces más del tiempo previsto, se finalizó el desarrollo y el producto en verdad supero las expectativas de casi todos. El software en su versión 1.2 cubre prácticamente la mayor parte de la funcionalidad prevista y tiene características que lo convierten en un excelente prospecto de producto comercial. La empresa que desarrolló el sistema cree que posee un producto con una calidad suficiente que puede competir fácilmente con otros productos que cubren el mismo segmento de mercado. El sistema cuenta con ventajas importantes debido a su interfase gráfica de fácil acceso y uso, es muy estable aun en condiciones críticas y las herramientas empleadas son de las mejores que existen para proyectos de esta naturaleza. Sin embargo, al realizar un análisis minucioso y muy riguroso del sistema se encontraron serias deficiencias en su diseño, desarrollo e implementación por lo que el sueño de promover un producto de clase mundial se complican enormemente debido al alto costo que tendría el rehacer gran parte del código.
Una de las muchas preguntas es ¿Cómo sucedió si todos los programadores y líder de proyecto son personas muy competentes en su área? Este caso anterior es producto de la imaginación ya que no existe la empresa ABC Sistemas pero bajo la experiencia de muchos, bien podría ser el retrato hablado de algo ya conocido.
La gran mayoría de universidades e instituciones de educación superior poseen programas de estudio que suelen ser o más bien parecer, lo más adecuado para la educación y capacitación de los desarrolladores que la industria y gobierno necesitan para el software de hoy y mañana. Este caso es demasiado similar a muchos y son muy comunes en todas partes. Si las universidades actualizan constantemente los programas de estudios y las empresas tratan de contratar a las personas más capaces ¿Dónde esta la falla? Posiblemente se deba a la forma en que se educa y capacita a las personas. Al parecer sucede algo similar a la educación musical donde en esta hipotética escuela, sólo se enseñara a tocar magistralmente un solo instrumento y nunca se les capacitara en el manejo de otros instrumentos. Es decir, les faltara conocer más cosas con mayor grado de complejidad. En el caso de desarrollo de software, existen serias deficiencias en la educación universitaria en cuanto a que los egresados conocen frecuentemente el manejo de uno o más lenguajes de programación, bases de datos, fundamentos de computadores, diseño relacional y comunicaciones. Otra pregunta obvia sería ¿Por qué no emplean estos conocimientos en el mundo real? En base a la experiencia y a los cada vez más rigurosos métodos de evaluación de los usuarios de sistemas, este conocimiento no es suficiente ya para crear software de alto nivel que cumpla con características tales como rapidez, eficiencia, seguridad, portabilidad, escalabilidad, replicación y facilidad de mantenimiento, con código reutilizable. Para cumplir con estas y otras características del software de alto nivel, el cual puede ser desde controladores para impresoras, scanners, graficadores, o grandes sistemas de información, es indispensable que los desarrolladores incorporen a su cúmulo de conocimientos, más elementos tales como: Arquitecturas de hardware y procesadores Arquitectura de sistemas operativos y compiladores Conceptos de comunicaciones y transmisión de datos Seguridad de aplicaciones y seguridad computacional Diseño relacional Administración de bases de datos, optimización de estructura de datos y optimización de código SQL Y sobre todo lo más importante, que realmente lo empleen en cada desarrollo. Cada una de estas áreas del conocimiento de las ciencias informáticas las podemos describir mejor y explorar brevemente, acerca del porque impactan en la calidad del software creado ya que los sistemas, programas o aplicaciones frecuentemente interactúan con muchos otros componentes. No tener el cuidado suficiente con alguno de estos componentes implica que el software resultante no sea el mejor, o peor aún, que tenga demasiados problemas como para ser comercializado a gran escala. Arquitectura de hardware y procesadores Los modernos procesadores que son el corazón de las computadoras y servidores distan mucho de las arquitecturas antiguas como son los procesadores Intel 286, 386 y los relativamente más contemporáneos procesadores 486. Estos avanzados microprocesadores incorporan técnicas y métodos que están mucho más allá del simple aumento casi exponencial en el número de transistores o del aumento impresionante en la velocidad medida en giga hertz. Tomemos por ejemplo que el más rápido de los procesadores Intel 486 corría a la asombrosa velocidad de 100 Mhz. Comparado con el más rápido de los procesadores Intel Pentium IV Multithreading a 3.20 Ghz. Estos procesadores emplean técnicas que permiten la ejecución de más de una instrucción por ciclo de reloj gracias a unidades de predicción especulativa, predicción de dependencias, super entubamiento de instrucciones, memorias cache L2 y L3 más grandes y rápidas y al incremento en el número de bits en los registros que ha pasado de los típicos 32 bits a 64 bits, así como a la medida más inmediata que es el incremento constante en la velocidad de operación de los procesadores. Estas características inciden de forma muy importante en el rendimiento de las aplicaciones. Los modernos sistemas operativos tratan de explotar al máximo todas las funcionalidades de estos procesadores, de tal forma que cualquier disminución en millonésimas de segundo por instrucción, implica importantes ahorros de ejecución procesando más instrucciones por unidad de tiempo, sobre todo si pensamos que una simple instrucción puede repetirse cientos de veces y cada ahorro por insignificante que parezca puede implicar muchos segundos de ganancia. Estas consideraciones deben ser tomadas muy en cuenta al momento de crear sistemas, programas o controladores ya que es común que los fabricantes de procesadores y sistemas operativos, incorporen compatibilidad binaria hacia atrás con el objeto de que exista un amplio periodo de transición y dar oportunidad a los fabricantes de software, a correr en las plataformas anteriores y las más modernas con el mismo software. Esta ventaja significa que no siempre las aplicaciones que corren en un sistema operativo y una plataforma de procesador específica lo hagan de la forma óptima ni mucho menos, que aprovechen al máximo las características disponibles. Es decir, una aplicación puede ser funcional y operativa pero de ninguna forma, lo hará de la manera más rápida y eficiente en procesadores más modernos, avanzados y rápidos. Desarrollar software eficiente y competitivo implica que también debe ser fácil de usar, intuitivo, rápido y que aproveche conexión a Internet, actualizaciones automáticas, auto verificación y auto reparación si es necesario así como muchas otras características adicionales. Estas características requieren una gran cantidad de código y éste debe correr de forma rápida y eficiente. Esto a su vez nos obliga a optimizar el código para obtener un producto verdaderamente competitivo. Para diseñar y desarrollar software de un alto nivel de calidad requiere la consideración y empleo de herramientas que permitan el aprovechamiento del potencial de cada procesador empleando los compiladores desarrollados por las empresas fabricantes de los mismos procesadores, sobre todo para los segmentos de código y rutinas que tienen un estrecho contacto con el hardware. El desarrollo de código que maneje instrucciones de bajo nivel a través del sistema operativo o directamente hacia el hardware implica un mayor nivel de cuidado y atención al diseño ya que un código mal desarrollado puede tener serias implicaciones en la estabilidad de todo el sistema operativo y comprometer operación. No basta con elaborar software en un momento del tiempo y dejarlo trabajar sin el mantenimiento y actualización correspondiente, sobre todo aquel que ha sido el de mayor demanda. Este software podría merecer un fuerte esfuerzo adicional para mantenerlo al día en cuanto a tecnología se refiere e implementar por parte de las empresas fabricantes, agresivos planes de actualización que les permita estar siempre a la vanguardia e inclusive, puedan llevar a cabo, programas de investigación y desarrollo de software basados en las nuevas características de los modernos procesadores y hardware. Resumen Los programadores modernos y competitivos que deseen crear software de clase mundial, deberán incorporar a su gran cúmulo de conocimientos, los conceptos de arquitectura de procesadores y compiladores con el objeto de crear aplicaciones que aprovechen al máximo el potencial de cada uno de ellos y ofrezcan a los usuarios, soluciones adecuadas y actualizadas a sus requerimientos. Arquitectura de sistemas operativos y compiladores Los sistemas operativos modernos como Windows XP, Windows 2000 Server, Windows 2003 Server, Linux, Novell, y sobre todo las diferentes versiones de Unix, tratan de aprovechar al máximo las características de los nuevos procesadores, para ser aprovechadas por el sistema operativo con el objeto de poder ejecutar el máximo de instrucciones por unidad de tiempo. Los sistemas operativos son la base sobre los cuales corren los controladores, aplicaciones o sistemas y todos y cada uno de ellos, incorporan funciones, métodos y mecanismos para la protección de las sesiones iniciadas y empleadas por el propio sistema y por las aplicaciones y usuarios. Uno de los objetivos en las enormes mejoras de los sistemas operativos es la de evitar o disminuir enormemente, la posibilidad de que todo el sistema colapse por una aplicación mal diseñada sin perder con ello, su alto rendimiento. El conocimiento detallado de las secuencias de inicio, carga de programas, controladores y aplicaciones que llevan a cabo los sistemas operativos por parte de un desarrollador, permitirá por un lado que se pueda evitar el uso de código o sentencias que pongan en riesgo la estabilidad del sistema y por otro lado, aprovechar esas mismas funciones para incrementar la eficiencia de la aplicación con muy poco o nulo riesgo para el sistema operativo. El desarrollador debe conocer los sistemas operativos donde las aplicaciones van a correr ya sea en servidores, clientes o ambos, así como en los asistentes digitales personales o PDA donde ya existen aplicaciones muy diversas que prometen incrementar la productividad de las personas y de las organizaciones. En el caso de los servidores y equipos de cómputo, los modernos sistemas operativos tratan de obtener el máximo provecho de la arquitectura de los procesadores con el objeto de realizar la mayor cantidad de instrucciones por ciclo de reloj y al mismo tiempo, mantener el compromiso de la seguridad y estabilidad del sistema operativo, empleando para ello, los diferentes niveles de privilegio de los procesadores. Este caso es más deivo si mencionamos por ejemplo al servidor Windows 2003 Server el cual puede correr de forma nativa en procesadores Intel de 32 bits como puede ser los procesadores Xeon y también existe una versión para los procesadores Intel Itanium II de 64 bits. Es posible que el mismo sistema operativo de 32 bits corra en procesadores de 64 bits pero es claro que no aprovechará todo el potencial disponible de los 64 bits y si a esto el agregamos que el hardware de 64 bits no cuesta lo mismo que uno de 32 bits, será evidente el desperdicio de recursos para una aplicación no optimizada al tamaño de registro del procesador. PDAs Los sistemas operativos de los asistentes digitales personales y el hardware asociado requieren de aplicaciones en extremo pequeñas y eficientes de tal forma que ocupen el menor espacio posible al mismo tiempo de ofrecer la máxima funcionalidad tomando en cuenta las serias restricciones con que se cuentan, especialmente en la velocidad de procesamiento y en la cantidad de memoria RAM instalada en estos dispositivos. Si deseamos desarrollar una aplicación altamente funcional para estos aparatos, deberemos conocer a detalle todo el hardware asociado, sus capacidades y limitaciones con el objeto de aprovechar las características de sus sistemas operativos y esto se refleje en la velocidad y utilidad de las aplicaciones creadas. Resumen La creación de aplicaciones rápidas, eficientes, en pocas palabras, óptimas para cada plataforma implica tomar muy en cuenta y aprovechar en toda la extensión de la palabra, la sociedad indivisible de arquitectura de hardware, concretamente procesadores, y los sistemas operativos que los acompañan. No es posible concebir un hardware sin un sistema operativo eficiente y un sistema operativo sin un hardware también eficiente y el desarrollador deberá conocer íntimamente estos dos elementos para ofrecer a los clientes y consumidores, soluciones de software que sean competitivos, útiles, funcionales y sobre todo rentables. Conceptos de comunicaciones y transmisión de datos Cada día más, la utilidad de los dispositivos, equipos de cómputo, servidores, aplicaciones, controladores o sistemas de información se basa en la conectividad de los mismos con otros dispositivos o equipos formando redes de diferentes magnitudes que van desde las típicas redes de área metropolitana o área muy amplia (MAN/WAN), a las redes de área local (LAN) o más recientemente a las redes de área personal (PAN) donde intervienen teléfonos celulares, asistentes digitales personales, electrodomésticos y muy pronto automóviles y sistemas de posicionamiento orbital entre muchos otros. Las aplicaciones modernas, requieren un uso amplio y óptimo de los medios de comunicación y protocolos que permiten el reconocimiento, envío y transmisión de información entre equipos. Los desarrolladores de aplicaciones, controladores o sistemas de información requieren conocer ampliamente las características de los medios de comunicación y los secretos íntimos de los protocolos con el objeto de diseñar soluciones que hagan un uso muy eficiente de las comunicaciones de tal forma que un equipo o dispositivo transmita solo la cantidad de información indispensable, con el menor número de conexiones y el menor empleo de ancho de banda. Aún cuando la tecnología pone a nuestra disposición hardware mucho más rápido, sistemas operativos más eficientes y sistemas de comunicación más veloces, es importante considerar que el empleo racional de estos recursos por las aplicaciones o sistemas, redundará en un mejor nivel de diseño y eficiencia de los desarrollos. Es frecuente que los programadores ignoren estos hechos basados en el hardware donde trabajan y que el escenario de operación de la aplicación sea muy diferente y tal vez mucho más restrictivo. Es todavía relativamente común conocer casos donde un sistema no puede procesar la cantidad de información necesaria para elaborar las consultas o reportes requeridos para la oportuna toma de decisiones. En algunos de ellos simplemente se debe a un diseño totalmente inadecuado de comunicaciones donde una aplicación o sistema de información (por ejemplo nómina y recursos humanos, o sistemas de información de cotizaciones de bolsa en línea) emplean múltiples conexiones y consultas entre el equipo cliente y el o los servidores para el llenado de una forma de registro y por lo tanto, otros usuarios pagan el precio de un pobre rendimiento de la aplicación o sistema. Como en algunos ejemplos cotidianos, menos es más y en el caso del desarrollo de aplicaciones, las comunicaciones deberán ser empleadas con discreción para usar la menor cantidad de recursos y al mismo tiempo, transmitir solo la información necesaria o indispensable. Las modificaciones que se encuentran en proceso de implementarse en los protocolos de comunicaciones tales como IPv6, Ethernet 802.11b o bluetooth ofrecerán mayores prestaciones incorporando seguridad, confidencialidad, capacidad de transporte de mucho mayor cantidad de información por unidad de tiempo y será necesario que los programadores y desarrolladores conozcan y aprovechen estas características para encontrarse preparados no solo para la elaboración de mejores aplicaciones y sistemas, sino también para estar preparados para los cambios en conectividad, transmisión y recepción de datos. Resumen En un mundo cada día más interconectado y donde los dispositivos y aplicaciones toman mayor valor en la medida en que sean capaces de conectarse con otros dispositivos y medios de información, las aplicaciones que sean eficientes en el uso de los medios y métodos de comunicación tendrán más posibilidades de competir y de ser elegidas por los consumidores sean estos individuos, grandes organizaciones o corporaciones. No importa que la aplicación sea un diccionario de idiomas en un PDA o grandes sistemas de información gubernamental o corporativa. Los segundos ahorrados debido a un excelente y bien planeado esquema de comunicaciones será posiblemente uno de los muchos elementos que hagan la diferencia entre un producto y otro y entre un producto o sistema exitoso y otro que no lo es. Seguridad de aplicaciones y seguridad computacional Desde el punto de vista del desarrollo de software, tanto para aplicaciones, herramientas de desarrollo, controladores o sistemas de información y bases de datos, la seguridad puede tener diferentes significados y es una de las áreas de mayor amplitud y profundidad de conceptos. Seguridad de protección de aplicaciones en los sistemas operativos En el caso de la seguridad relacionada a las aplicaciones o sistemas se refiere específicamente a que los sistemas operativos involucran medidas o métodos que permiten la operación continúa de todos los programas y procesos sin que el colapso de uno de ellos implique el colapso total de todo el sistema operativo. Uno de los métodos es el de aislar los procesos propietarios de un usuario, respecto de los procesos de otros usuarios, del mismo sistema operativo y los procesos de las aplicaciones. Es decir, segmentar y reservar de la forma más eficiente posible, las áreas o secciones de memoria ya usadas para evitar que un programa o proceso escriba información en zonas asignadas a otros procesos. A la hora de desarrollar una aplicación cualquiera, es indispensable que los programadores tomen en cuenta y de preferencia tengan nociones de cuales son estos métodos de protección tanto de los modernos procesadores, como de los sistemas operativos con el objeto de que sus desarrollos no involucren violaciones involuntarias y colapsen todo el sistema en un momento determinado. Estas consideraciones se convierten en críticas cuando se desarrollan aplicaciones o controladores que van a interactuar directamente con el hardware y que suplirán o complementarán algunas de las funciones de entrada, salida o escritura a dispositivos ya reconocidos por el sistema operativo. Estas consideraciones son importantes por ejemplo para el desarrollo de aplicaciones sobre la arquitectura de procesadores X86 donde el fabricante Intel ha implementado cuatro niveles de privilegio y de los cuales son dos los empleados por Microsoft mediante el nivel de privilegio de usuario y el nivel de núcleo del sistema con el objeto de incrementar la seguridad o la eficiencia de las aplicaciones. La seguridad a nivel de hardware y sistema operativo significa el tomar en cuenta las características de cada elemento con el objeto de no crear código que pueda generar violaciones a los métodos de protección tanto de los procesadores y dispositivos como de los sistemas operativos ya sea al escribir o intentar escribir en áreas reservadas, espacios de memoria, volcado de pila, etc. Es probable que estas violaciones sean controladas eficientemente por el sistema operativo, al menos al nivel de impedir el colapso de otras aplicaciones y servicios, sin embargo, nuestra aplicación desarrollada podría tener efectos negativos no solo en el sistema operativo del servidor donde corre sino también en el sistema operativo de los clientes, convirtiéndose en un dolor de cabeza tanto para usuarios como para desarrolladores. Como en muchos de los casos, la lectura detallada de los a veces oscuros callejones de la arquitectura de los sistemas operativos parece una tarea complicada y ociosa pero, el tomar en cuenta los mecanismos de protección permitirá crear sistemas y aplicaciones confiables y estables lo que significa una excelente referencia para los clientes y consumidores potenciales de nuestra aplicación. Seguridad computacional contra ataques a las aplicaciones o sistemas Actualmente con una base enorme de usuarios potenciales para cualquier sistema, y sobre todo con el crecimiento casi exponencial del empleo de Internet y la conexión obligada de todas las organizaciones a estos medios de comunicación e información, la seguridad de las aplicaciones es o debe ser, un tema de estricta atención y cuidado. Un sistema que no contemple mecanismo de seguridad a nivel del sistema operativo, de la aplicación misma y de la base de datos en contra de accesos no autorizados, se convierte en un rehén relativamente fácil de penetrar para cualquiera con suficientes conocimientos técnicos y también con las suficientes malas intenciones. La preocupación por implementar los mecanismos de control de acceso a los sistemas y aplicaciones, sobre todo para los sistemas de procesamiento de información gubernamental o corporativo, ya no es un lujo o una tarea ociosa sino una actividad y una responsabilidad de las empresas y personas dedicadas al desarrollo de software. Cada día existe mayor cantidad de información sensible y crítica en estos sistemas y cada día más, las personas y sociedades dependemos en mayor grado, de la estabilidad, seguridad y confidencialidad de estos sistemas. Por lo tanto, la implementación de los suficientes medios de protección se está convirtiendo en una obligación y responsabilidad moral de las empresas y personas para mantener segura la información en la que todos confiamos y que no deseamos por ninguna circunstancia que caiga en manos inexpertas o muy expertas en fraudes, chantajes o simplemente que se use en nuestra contra. Ante esta situación, la labor de los desarrolladores se complica suficiente ya que deberán de incorporar nuevamente a su basta necesidad de conocimientos, otra tarea adicional que es la de elevar de forma importante los niveles de seguridad en todos y cada uno de los elementos de los que depende e interactúa el sistema o aplicación, sobre todo para aquellos que se consideran de misión crítica como puede ser un sistema de tarjetas de crédito, nómina, sistemas de salud, proyectos industriales, casas de bolsa o sistemas de defensa militar. La seguridad computacional no solo se refiere a la instalación y a la buena configuración de los sistemas de muros de contención o firewalls sino también al diseño correcto de los siguientes elementos: Medios de comunicaciones y redes Sistemas operativos Sistemas de bases de datos relacionales Sistema o aplicación desarrollada Una aplicación debe ser fácil y simple de utilizar por cualquier usuario, sobre todo si se trata de una aplicación o sistema diseñada para operar en Internet (Intranet o Extranet) pero al mismo tiempo, debe incorporar todos los mecanismos posibles que permitan mantener altos niveles de seguridad, confidencialidad, disponibilidad e integridad. Esto es similar a desear el ingreso rápido y expedito a instalaciones de muy alto nivel de seguridad sin comprometer la velocidad, los mecanismos ni procedimientos para lograr el acceso. Diseño relacional de bases de datos Los modernos sistemas de administración de bases de datos relacionales poseen características importantes que permiten el almacenamiento de grandes cantidades de información sin que ello implique dificultad alguna para su recuperación bajo múltiples criterios o filtros. Sin embargo, un adecuado diseño relacional implica también un adecuado análisis del negocio de tal forma en que el modelo relacional sea un reflejo exacto del modelo de negocio y contemple todos los escenarios posibles a las que una aplicación o sistema deberá de enfrentar. Un buen diseño relacional tiene enormes ventajas en términos desarrollo, mantenimiento, rapidez en el registro de información, actualización y borrado de datos entre otras cosas más, así como en la elaboración de consultas y reportes. Un diseño relacional adecuado debe facilitar enormemente el mantenimiento del sistema a la hora de incluir columnas o tuplas que no fueron consideradas en el diseño original y esto no debe implicar cambios radicales al modelo. El empleo del diseño relacional no se aplica a todos y cada uno de los desarrollos informáticos como son controladores, sistemas de medición y otros, sin embargo, los sistemas más valiosos y comunes para la mayoría de las organizaciones se basa en sistemas de procesamiento de información y con frecuencia, se refieren a sistemas administrativos como: sistemas de producción, de ventas, logística, almacenes e inventarios, producción, nómina, contabilidad, etcétera. Y es aquí donde el diseño relacional cobra especial importancia para la buena administración de las bases de datos. A pesar de las avanzadas características de los sistemas de bases de datos relacionales de la actualidad, es muy frecuente encontrar que todavía los diseños relacionales deficientes son recurrentes en la mayoría del software desarrollado y esta falla tiene como consecuencia, altos costos de mantenimiento y sobre todo, enorme dificultad para actualizar y mejorar su rendimiento. Aún cuando las escuelas de ingeniería ponen relativa atención a la educación sobre el diseño y modelado relacional en sus programas de estudio, es común que los egresados no lo apliquen en los sistemas o lo hagan de forma incorrecta al momento de desarrollar algún sistema o aplicación que requiera el almacenamiento y recuperación de grandes cantidades de información. El conocimiento detallado de las características de los sistemas de bases de datos relacionales sean estos de software libre como pueden ser MySQL, PostgreSQL o SAP DB, así como los sistemas comerciales, Oracle, Informix, SQL Server o Sybase permitirán crear sistemas que soporten no solo a la cantidad necesaria de usuarios o cualquier número de terabytes de datos sino que también el costo por mantenimiento y adecuaciones será relativamente bajo. Otro aspecto importante e ignorado o poco apreciado en ocasiones, se refiere al adecuado diseño de las consultas o sentencias SQL generadas para proporcionar la funcionalidad necesaria de los sistemas. Existen aplicaciones con muy poco grado de optimización de las sentencias y que ocasionan dificultades a la hora de generar reportes o consultas complejas para la toma de decisiones. Estos sistemas generalmente derivan en un mayor gasto en hardware (instalar mayor cantidad de memoria, procesadores o cambiar los servidores por otros más potentes) o de plano, priorizar las sesiones de tal forma que en el día se registra la información y por la madrugada se procesa y se generan las consultas y reportes necesarios para la operación de la organización. El descuido en el diseño y pruebas del código SQL deriva en consecuencias serias de rendimiento y disponibilidad de los sistemas de información. Por ello, una revisión exhaustiva permite crear código óptimo y como consecuencia, sistemas con tiempos excelentes de respuesta aun en hardware de bajas capacidades relativamente. Resumen Los desarrolladores de alto nivel deberán poner especial énfasis en llevar a cabo un análisis vasto y reflexivo sobre las características más relevantes de la información que se desea administrar y controlar con el objeto de que el diseño resultante sea adecuado. Esto tendrá como consecuencia enormes ventajas en el mantenimiento en tiempo y costo, así como un alto rendimiento y además, será muy fácil crecer el sistema si hubiera nuevas necesidades de información. Los requerimientos del software de nueva generación son mucho más exigentes sobre todo si se desea generar software con calidad de exportación y para ello, el adecuado diseño relacional de los sistemas de información, aunado a un riguroso método de análisis y evaluación para la generación del modelo de negocio será una condición indispensable que deberán tomar en cuenta las instituciones de educación en ingeniería en sistemas, así como de las empresas que pretendan desarrollar software de alto nivel y sobre todo, de los programadores encargados del trabajo creativo de hacerlos. CONCLUSIONES Las empresa o individuos que deseen verdaderamente crear software que se encuentre entre lo mejor del mundo y con amplias capacidades de uso y exportación, requieren ampliar de forma importante, constante y permanente, la capacitación sobre los tópicos relacionados a la arquitectura de procesadores, compiladores, arquitectura de sistemas operativos, comunicaciones, seguridad, diseño relacional y bases de datos. Para crear software de alto nivel será indispensable incorporar criterios de optimización en todos y cada uno de los aspectos de su diseño y operación como son: hardware, procesadores, sistemas operativos, comunicaciones, seguridad, calidad del código, diseño relacional de la base de datos y esto implica un costo aparentemente mayor sin duda, pero permitirá estar en posición de exportar soluciones informáticas que cubran las más exigentes expectativas de usuarios y empresas. Actualmente no todas las universidades del país incorporan en sus programas de estudio, estos conocimientos a los estudiantes y tampoco las empresas se preocupan por establecer programas de capacitación en los que se eleve considerablemente, el nivel de competitividad tanto de su personal de desarrollo como de sus productos y esta falta de visión se nota en la industria nacional de desarrollo de software. Actualmente México no se distingue por ser una alto exportador de software como es el caso de Irlanda y la India. Si en verdad se desea crear un programa o programas orientados a estimular este proceso de convertirnos en un gran exportador de tecnologías de información, al menos en lo que a software se refiere, es necesario e indispensable considerar una mejor y más integral capacitación y capacidad de las empresas, organismos, organizaciones, escuelas y universidades para crear esta cultura de mayor conocimiento tecnológico y sobre todo, de mayor dominio de la tecnología. Se han hecho importantes esfuerzos en este sentido en nuestro país pero la realidad es que existen otros países que van mucho más rápido en la toma de decisiones y sobre todo en la toma de acciones que les posiciona a sus industrias en niveles de competencia suficiente para el desarrollo del software del mañana. Si no reflexionamos y actuamos en estos sentidos, cada día será más difícil alcanzarlos y al mismo tiempo, seguiremos siendo en mayor medida, dependientes de soluciones externas con la consecuente fuga de divisas y pérdida de oportunidades.