Portada ::: Ciencias ::: Humanidades ::: Mapa del Sitio ::: Contacto ::: Ayuda

Recursos del programador


El primer concepto que como estudiantes de programación nos encontramos es con el de programa, pero ¿en realidad sabemos qué es? Es con esto este concepto con lo que vamos a empezar este escrito, definiendo lo qué es un programa.

Un programa es una entidad dinámica que sólo existe al momento de ejecutarse, es aquí donde adquiere su verdadero valor. Antes o después de esto sólo es un conjunto de instrucciones que ocupan espacio en algún dispositivo del almacenamiento. Al ser una entidad dinámica, además de no poseer una característica cuantificable hace de un programa, una entidad sumamente abstracta. De ahí que para diseñar un programa requerimos de abstraer, es decir obtener las características esenciales de un objeto determinado, en nuestro caso de un programa.

El uso de la abstracción en el diseño de software (que se define como un conjunto de programas) ha permitido el uso de lenguajes de programación de alto nivel donde el programador se preocupa sólo de la solución de los problemas y no de la arquitectura de la máquina. Esto nos lleva a definir un lenguaje de programación como un conjunto de estructuras de control suficientes que permiten implantar cualquier problema que se especifique detalladamente y libre de ambigüedad paso a paso en su solución, es decir, que sea factible de expresar en un algoritmo. Con esto podemos llegar a la siguiente proposición: Si cualquier lenguaje de programación posee un conjunto mínimo y finito de instrucciones de control consideradas como fundamentales, entonces cualquier programador, al saber programar con ese conjunto finito de instrucciones, podrá implantar cualquier algoritmo con total independencia del lenguaje que utilice. Esta es el fundamento principal de la filosofía de la programación estructurada, implantar algoritmos a través de un conjunto finito de estructuras bien organizadas.

La disciplina es un aspecto importante pues un programador principiante esta siempre en busca de alguna fórmula mágica, alguna innovación tecnológica cuya aplicación inmediata le permitirá hacer fácil el proceso del desarrollo de software. Es propio de un programador profesional saber que no existe ninguna panacea. Los principiantes gustan de seguir recetas de cocina; los profesionales saben que los enfoques rígidos en el diseño sólo conducen a largos e inútiles diseños de productos que semejan una progresión de mentiras, detrás de los cuales los desarrolladores se escudan porque ninguno es capaz de admitir que las decisiones debieron tomarse en etapas tempranas y no hasta las etapas finales. De ahí que la programación estructurada surgió para resolver un problema: la creación de buenos programas la cual nos permite definir el estilo de programar, pero hay que considerar que la programación estructurada no resuelve los problemas, los previene pues no hay mejor remedio que la prevención.

Lo que hace a un programa un buen programa esta definitivamente orientado al plano económico que se ven inmersos en varios factores de calidad, los cuales son:

  1. Utilidad. Un programa debe satisfacer las necesidades del usuario.

  2. Confiabilidad. Es la capacidad de un programa para desempeñar una función requerida bajo ciertas condiciones durante un tiempo específico determinado por la relación directa con el costo de una falla.

  3. Legibilidad. Se refiere a la facilidad de lectura que tiene el programa.

  4. Estilo de programación. Consiste en planificar el programa empezando con el análisis del problema (especificaciones de entrada y salida), el proceso necesario para producir la entrada desde la salida continuando con el algoritmo (pseudocódigo). Si el programa es grande se prosigue con un diseño top-down, refinamiento sucesivo, documentación externa para terminar con la escritura del programa junto con la documentación interna todo con el fin de facilitar la corrección, actualización o modificación del programa.

  5. Eficiencia. Consiste en optimizar los recursos de la computadora y está en función del tipo de aplicación que se este desarrollando.

Un programa es un modelo de la solución de un problema el cual debe reunir un requisito importante: ser computable. Esto significa que la solución a un problema se puede representar a través de conjunto proposiciones (a esto se le conoce como diseño de un algoritmo), determinando su grado de exactitud por los límites establecidos por razones económicas, de tiempo, de recursos tecnológicos y humanos.

Diseñar un algoritmo requiere de la abstracción de las partes más importantes y características del problema: el programa y los datos. Estos interactúan entre sí, pues mientras el primero provee los procedimientos necesarios para procesar los datos y así obtener información, los datos son el insumo de estos procedimientos. Aquí es donde la programación estructurada nos ayuda a realizar una abstracción de estas dos características ya que no sólo requiere estructurar los procedimientos sino también los datos simultáneamente. Esta división en unidades estructuradas permite fragmentar la solución de un problema en módulos reduciendo esfuerzo y principalmente costos en el desarrollo de software. Para lograr esta fragmentación debemos considerar dos premisas:

  1. La resolución de un problema debe de hacer uso de algún método de abstracción.

  2. La partición del sistema en módulos redundará en un menor esfuerzo y un menor costo final del producto.

En la primera premisa hablamos de método de abstracción; dentro de la programación estructurada existen dos métodos: el diagrama de flujo y el pseudocódigo. Sus funciones son las mismas lo que cambia es la forma de representarlos ya que mientras los diagramas de flujo es una representación gráfica de un algoritmo, el pseudocódigo es un conjunto de órdenes expresadas en frases cortas en español en cada una de las cuales existe uno y sólo un verbo. Ambas herramientas, principalmente el pseudocódigo permiten no tener ninguna relación con ningún lenguaje en particular, es decir es independiente de la implantación.

La segunda premisa se sustenta en el principio de diseño modular:

  1. Las partes altamente relacionadas del problema deben de pertenecer a la misma pieza del sistema.

  2. las partes no relacionadas del problema deben residir con piezas no relacionadas del sistema.

Definamos en primera instancia con respecto a lo que es un módulo. Dentro de la programación, un módulo es un segmento de programa que posee un conjunto de entradas finito y salidas y ejecuta una sola función. El más popular de los enfoques del diseño modular es el arriba-abajo (top-down) que consiste en determinar funciones que correspondan al nivel de abstracción (detalles de la solución del problema), hasta llegar a funciones codificables hasta un nivel de detalle necesario determinado por la facilidad con la cual es posible codificar un módulo. Esto, mucho depende de la experiencia del programador o de sus conocimientos del lenguaje que se desea implantar. Esta descomposición de funciones se proyecta al programa, a esto se le conoce como refinamiento de módulos que termina cuando todas las instrucciones esta expresadas en términos del computador por supuesto, utilizando un lenguaje de programación. Hay que recordar que junto con el refinamiento de los procesos simultáneamente se hace un refinamiento de los datos.

Cada etapa del refinamiento implica decisiones de diseño para ello el programador debe ser consciente de los criterios subyacentes en las decisiones de diseño y de la existencia de soluciones alternativas, recordemos que no existe una fórmula mágica, los diseños no deben ser rígidos y debemos cuidar en no caer en este error.

Retomando el principio de diseño modular, de sus dos partes se desprenden dos metas fundamentales: el acoplamiento y la cohesión. El primero se refiere a la forma como se comunican los datos la cual esta determinada por la flexibilidad que muestren dentro del sistema para la reutilización del código para aplicaciones futuras, en otras palabras el acoplamiento es el grado de interdependencia en módulos el cual se mide dentro de una escala del más fuerte (el menos deseable) al más débil (el más deseable) de la siguiente forma:

  1. Acoplamiento por contenido. Un módulo modifica los valores locales o las instrucciones de algún otro.

  2. Acoplamiento por zonas compartidas. Los módulos están atados en forma conjunta por medio de sus zonas globales para las estructuras de datos.

  3. Acoplamiento de control. Un módulo controla la secuencia de otro a través de banderas de control.

  4. Acoplamiento por zonas de datos. Es similar al de zonas compartidas pero son los datos los que se comparten en forma selectiva entre rutinas.

  5. Acoplamiento de datos. Incluye el uso de lista de parámetros para pasar los elementos entre rutinas.

La cohesión a diferencia del acoplamiento, se mide en términos de la fuerza de unión de los elementos del dentro del mismo módulo. Al igual que la cohesión la escala de medición es de la más débil (la menos deseada) a la más fuerte (la más deseada), estas son:

  1. Cohesión coincidental. Los elementos que forman el módulo no tienen relación aparente entre cada uno de ellos.

  2. Cohesión lógica. Implica algunas relaciones entre los elementos de un módulo. Los módulos lógicamente unidos normalmente requieren de una descomposición.

  3. Cohesión temporal. Todos los elementos son ejecutados en un momento dado son requerir de ningún parámetro o lógica alguna para determinar que elemento debe ejecutarse.

  4. Cohesión de comunicación. Los elementos se refieren al mismo conjunto de datos de entrada y salida.

  5. Cohesión secuencial. Ocurre que la salida de un elemento es la entrada para el siguiente.

  6. Cohesión funcional. Es aquella que no posee ninguno de los otros tipos de cohesión. Los módulos que tiene una cohesión funcional no poseen elementos ajenos a la función que desempeña, la cual debe ser única y sencilla.

Tanto el acoplamiento como la cohesión están íntimamente relacionados, esto quiere decir que a mayor cohesión en cada módulo, menor será el acoplamiento que existirá entre ellos. De Ahí la importancia del principio del diseño modular.

Para poder instrumentar un módulo se requiere de entender, comprender el objetivo de la programación estructurada. Recordemos que esta filosofía nos sirve para implantar algoritmos a través de un conjunto finito de estructuras bien organizadas, el enfoque de estas apunta hacia una técnica primaria que consiste en la eliminación del salto incondicional y su reemplazo por sentencias bien estructuradas de bifurcación y control. Estas estructuras de basan en el Teorema de la estructura y en el principio del programa propio.

El teorema de la estructura establece que se requieren de tres bloques básicos para construir cualquier programa, estos son:

  1. Una caja de proceso.

  2. Una decisión binaria.

  3. Un mecanismo de repetición.

Como Programa propio se entiende que la estructura cumple con los siguientes requisitos:

  • Tiene un sólo punto de entrada hasta arriba.

  • Se lee de arriba hacia abajo.

  • Tiene un sólo punto de salida hasta abajo.

Con base en esto, se construyen todas las estructuras sintácticamente válidas para la programación estructurada y que se incluyen en todos los lenguajes de programación, estas estructuras son:

  1. El bloque proceso es generalmente interpretado como la estructura que se ejecuta en secuencia.

  2. La decisión binaria, en ella se pregunta por el valor lógico de una condición predeterminada y puede tener sólo dos posibles valores: verdadero y falso.

  3. Las estructuras de repetición poseen una condición determinada que se evalúa en cada ciclo de instrucciones que se ejecute. Estas son tres:

  4. La selección múltiple, consiste en evaluar una variable y en base al valor de esta seleccionar una opción entre muchas. Se puede construir son estructuras binarias o bien como se muestra a continuación:


Con estas herramientas básicas, matemáticamente suficientes para una máquina de Turing, es posible construir cualquier problema algorítmico y por tanto elaborar un modelo válido y predictible de un problema real.

Para lograr esto, las técnicas de programación que se aplican son las siguientes:

  1. Los programas no pueden considerarse correctos hasta que han sido validados utilizando un amplio rango de de datos. Hay que tener en cuenta los diferentes tipos de errores en la programación como son: los errores de sintaxis, en tiempo de ejecución y lógicos siendo estos últimos lo más difíciles de detectar.

  2. Los programas deben ser legibles y comprensibles.

  3. Utilizar comentarios significativos que describan el propósito de un programa o segmentos de programa, así como elementos importantes del programa, variables, funciones, etc.

  4. Etiquetar todas las salidas producidas por un programa.

  5. Los programas deben ser eficientes.

  6. Programas generales y flexibles.

  7. Antes de utilizar variables, asegurarse de que son inicializadas por el programa.

  8. En programación interactiva, incluya siempre una línea con un mensaje de aviso al usuario cuando desee introducir datos.

  9. Los programas deben hacer, por lo general, siempre "eco" de la entrada.

José Daniel Guerrero Gálvez.
Ciudad de México
Correo electrónico: jdguerrerog@yahoo.com.mx

Bibliografía.

Porras Ruiz, Octavio. Creatividad en Ingeniería. México, Fondo Editorial del Instituto de Ingenieros Industriales y de Sistemas, 1997.

Joyanes Aguilar, Luis. Programación en Turbo Pascal. México, McGraw Hill, 1997.

Peñaloza Romero, Ernesto. Fundamentos de programación C/C++. 4a. Edición. México, Facultad de Estudios Superiores Aragón UNAM / Alfaomega. 2004.

Pressman, Roger S., Ingeniería de Software, un enfoque práctico, 4a. edición. México, McGraw Hill, 1998.


ollin_tlatoa@yahoo.com.mx Sitios de interés