# data[].attributes.body
Abstrae la información de la realidad relevante para un problema, de expresar dicha realidad en términos de algún lenguaje y proponer una solución en términos de modificaciones.

# data[].attributes.body
Son las herramientas computacionales que permiten a una persona desarrollar un programa. Se pueden considerar una implementación particular de la tecnología.

# data[].attributes.body
Aquí se incluye el ciclo de vida de un programa, los formularios, la definición de los entregables, las técnicas de inspección de código, las técnicas de pruebas de programas, etc.

# data[].attributes.body
Se basan enun vocabulario sobre la manera de trabajar en cada una de las facetas de un programa, y están constituidas por un conjunto de técnicas.

# data[].attributes.body
Son los elementos tecnológicos necesarios para expresar, en un lenguaje comprensible por una máquina, la abstracción de la realidad y el algoritmo que resuelve un problema sobre dicha abstracción.

# data[].attributes.body
Es la capacidad de utilizar un conjunto de instrucciones para expresar los cambios que se deben realizar en la abstracción de la realidad, para llegar a un punto en el que el problema se considere resuelto

# data[].attributes.body
Definen

# data[].attributes.body
la estructura de la aplicación resultante, en términos del problema y de los elementos del mundo del problema.

# data[].attributes.body
Técnicas de programación y metodologías

# data[].attributes.body
Elementos estructuradores y arquitecturas

# data[].attributes.body
Procesos de software

# data[].attributes.body
Herramientas de programación

# data[].attributes.body
Tecnología y programación

# data[].attributes.body
Algorítmica

# data[].attributes.body
Modelaje y solución de problemas:

# data[].attributes.body
Ejes Conceptuales de la Programación

# data[].attributes.attachment_link.readable_text
Objetivos

Este libro es uno de los resultados del proyecto Cupi2, un proyecto de actualización curricular de la Universidad de los Andes (Bogotá, Colombia), cuyo principal propósito es encontrar mejores formas de enseñar/aprender a resolver problemas usando como herramienta un lenguaje de programación de computadores.

Este libro tiene como objetivo servir de herramienta fundamental en el proceso de enseñaza/aprendizaje de un primer curso de programación, usando un enfoque novedoso desde el punto de vista pedagógico, y moderno desde el punto de vista tecnológico.

Queremos que el libro sea una herramienta de trabajo dentro de un proceso de aprendizaje, en el que el lector debe ser su principal protagonista. Por esta razón, a lo largo de los niveles que conforman el libro, se le irá pidiendo al lector que realice pequeñas tareas a medida que se presenta la teoría y, luego, que resuelva problemas completos directamente sobre el libro.

El Público Destinatario

El libro está dirigido a estudiantes que toman por primera vez un curso de programación de computadores, sin importar el programa de estudios que estén siguiendo. Esto quiere decir que para utilizar el libro no se necesita ninguna formación específica previa, y que las competencias generadas con este texto se pueden enmarcar fácilmente dentro de cualquier perfil profesional.

El Enfoque del Libro

La estrategia pedagógica diseñada para este libro gira alrededor de cinco pilares, los cuales se ilustran en la siguiente figura.

Aprendizaje activo: La participación activa del lector dentro del proceso de aprendizaje es un elemento fundamental en este tema, puesto que, más que presentar un amplio conjunto de conocimientos, el libro debe ayudar a generar las competencias o habilidades necesarias para utilizarlos de manera efectiva. Una cosa es entender una idea, y otra muy distinta lograr utilizarla para resolver un problema.

Desarrollo incremental de habilidades: Muchas de las competencias necesarias para resolver un problema usando un lenguaje de programación se generan a partir del uso reiterado de una técnica o metodología. No es suficiente con que el lector realice una vez una tarea aplicando los conceptos vistos en el curso, sino que debe ser capaz de utilizarlos de distintas maneras en distintos contextos.

Equilibrio en los ejes temáticos: La solución de un problema usando un lenguaje de programación incluye un conjunto de conocimientos y habilidades de varios dominios. Dichos dominios son los que en la siguiente sección denominamos ejes conceptuales. Este curso intenta mantener un equilibro entre dichos ejes, mostrando así al lector que es en el adecuado uso de las herramientas y técnicas que provee cada uno de los ejes, donde se encuentra la manera correcta de escribir un programa de computador.

Basado en problemas: El libro gira alrededor de 24 problemas completos, cuya solución requiere el uso del conjunto de conceptos y técnicas presentadas en el libro. La mitad de los problemas se utilizan como casos de estudio y la otra mitad, como hojas de trabajo.

Actualidad tecnológica: En este libro se utilizan los elementos tecnológicos actuales, entre los cuales se encuentran el lenguaje de programación Java, el lenguaje de modelado UML, el ambiente de desarrollo de programas Eclipse y las técnicas de la programación orientada por objetos

Los Ejes Conceptuales de la Programación

Para resolver un problema utilizando como herramienta un lenguaje de programación, se necesitan conocimientos y habilidades en siete dominios conceptuales (llamados también ejes temáticos), los cuales se resumen en la siguiente figura:

Modelado y solución de problemas: Es la capacidad de abstraer la información de la realidad relevante para un problema, de expresar dicha realidad en términos de algún lenguaje y proponer una solución en términos de modificaciones de dicha abstracción. Se denomina " análisis" al proceso de crear dicha abstracción a partir de la realidad, y " especificación del problema" al resultado de expresar el problema en términos de dicha abstracción.

Algorítmica: Es la capacidad de utilizar un conjunto de instrucciones para expresar las modificaciones que se deben hacer sobre la abstracción de la realidad, para llegar a un punto en el cual el problema se considere resuelto. Se denomina " diseño de un algoritmo" al proceso de construcción de dicho conjunto de instrucciones.

Tecnología y programación: Son los elementos tecnológicos necesarios ( lenguaje de programación, lenguaje de modelado, etc.) para expresar, en un lenguaje comprensible por una máquina, la abstracción de la realidad y el algoritmo que resuelve un problema sobre dicha abstracción. Programar es la habilidad de utilizar dicha tecnología para que una máquina sea capaz de resolver el problema.

Herramientas de programación: Son las herramientas computacionales (compiladores, editores, depuradores, gestores de proyectos, etc.) que permiten a una persona desarrollar un programa. Se pueden considerar una implementación particular de la tecnología.

Procesos de software: Es el soporte al proceso de programación, que permite dividir el trabajo en etapas claras, identificar las entradas y las salidas de cada etapa, garantizar la calidad de la solución, y la capacidad de las personas involucradas y estimar en un futuro el esfuerzo de desarrollar un programa. Aquí se incluye el ciclo de vida de un programa, los formularios, la definición de los entregables, el estándar de documentación y codificación, el control de tiempo, las técnicas de inspección de código, las técnicas de pruebas de programas, etc.

Técnicas de programación y metodologías: Son las estrategias y guías que ayudan a una persona a crear un programa. Se concentran en el cómo hacer las cosas. Definen un vocabulario sobre la manera de trabajar en cada una de las facetas de un programa, y están constituidas por un conjunto de técnicas, métricas, consejos, patrones, etc. para que un programador sea capaz de pasar con éxito por todo el ciclo de vida de desarrollo de una aplicación.

Elementos estructuradores y arquitecturas: Definen la estructura de la aplicación resultante, en términos del problema y de los elementos del mundo del problema. Se consideran elementos estructuradores las funciones, los objetos, los componentes, los servicios, los modelos, etc. Este eje se concentra en la forma de la solución, las responsabilidades de cada uno de los elementos, la manera como esos elementos se comunican, etc.

La Estructura del Libro

El libro sigue una estructura de niveles, en el cual se introducen los conceptos de manera gradual en los distintos ejes alrededor de los cuales gira la programación. Para hacerlo, se utilizan diversos casos de estudio o problemas, que le dan contexto a los temas y permiten ayudar a generar las habilidades necesarias para que el lector utilice de manera adecuada los conceptos vistos.

Los 6 niveles en los cuales se encuentra dividido el libro se muestran en la siguiente figura:

En cada uno de dichos niveles, se presentan de manera trasversal los elementos de los siete ejes conceptuales, dando lugar a una estructura como la que se presenta a continuación:

El contenido de cada uno de los niveles se resume de la siguiente manera:
Nivel 1. Problemas, Soluciones y Programas:
Se explica el proceso global de solución de un problema con un programa de computador. Esto incluye las etapas que deben seguirse para resolverlo y los distintos elementos que se deben ir produciendo a medida que se construye la solución. Se analizan problemas simples a través de la especificación de los servicios que el programa debe ofrecer y a través de un modelo conceptual del mundo del problema. Se explica la estructura de un programa de computador y el papel que desempeña cada uno de los elementos que lo componen. Se introduce el lenguaje de programación Java y los elementos necesarios para que el estudiante complete un programa utilizando expresiones simples, asignaciones y llamadas de métodos. Se utiliza un ambiente de desarrollo de programas y un espacio de trabajo predefinido, para completar una solución parcial a un problema.
Nivel 2. Definiendo Situaciones y Manejando Casos:
Se extienden los conceptos de modelado de las características de un objeto, utilizando nuevos tipos simples de datos y la técnica de definir constantes para representar los valores posibles de un atributo. Se utilizan expresiones como medio para identificar una situación posible en el estado de un objeto y para indicar la manera de modificar dicho estado. Se explican las instrucciones condicionales simples y compuestas como parte del cuerpo de un método, de manera que sea posible considerar distintos casos posibles en la solución de un problema. Se presenta de manera informal, una forma para identificar los métodos de una clase, utilizando para esto la técnica de agrupar los métodos por tipo de responsabilidad que tienen: construir, modificar o calcular.
Nivel 3: Manejando Grupos de Atributos:
Se explica la forma de utilizar las estructuras contenedoras de tamaño fijo como elementos de modelado de una característica de un elemento del mundo, que permiten almacenar una secuencia de valores (simples u objetos) y las estructuras contenedoras de tamaño variable como elementos de modelado que permiten manejar atributos cuyo valor es una secuencia de objetos. Se introducen las instrucciones repetitivas en el contexto del manejo de secuencias. Se extienden conceptos sobre el ambiente de desarrollo, en particular, se explica la forma de crear una clase completa en Java utilizando Eclipse. Se expone la forma de utilizar la documentación de un conjunto de clases escritas por otros y la forma de servirse de dicha documentación para poder incorporar y usar adecuadamente dichas clases en un programa que se está construyendo.
Nivel 4: Definición y Cumplimiento de Responsabilidades:
En este nivel se hace énfasis en la asignación de responsabilidades a las clases que representan la solución de un problema, utilizando técnicas simples. Se explica la técnica metodológica de dividir y conquistar para resolver los requerimientos funcionales de un problema y realizar la asignación de responsabilidades. Se estudia el concepto de contratos de los métodos tanto para poderlos definir como para poderlos utilizar en el momento de invocar el método. Se enseña la forma de utilizar la clase Exception de Java para manejar los problemas asociados con la violación de los contratos. Se presenta la forma de documentar los contratos de los métodos utilizando la sintaxis definida por la herramienta javadoc. Se profundiza en el manejo del ambiente de desarrollo y el lenguaje Java, con el propósito de que el estudiante pueda escribir una clase completa del modelo del mundo, siguiendo una especificación dada en términos de un conjunto de contratos.
Nivel 5: Construyendo la Interfaz Gráfica:
El tema principal de este nivel es la construcción interfaces usuario simples. Se presenta la importancia que tiene la interfaz de usuario dentro de un programa de computador, teniendo en cuenta que es el medio de comunicación entre el usuario y el modelo del mundo. Se propone una arquitectura para un programa simple, repartiendo de manera adecuada las responsabilidades entre la interfaz de usuario, el modelo del mundo y las pruebas unitarias. Se enfatiza la importancia de mantener separadas las clases de esos tres dominios.
Nivel 6: Manejo de Estructuras de dos Dimensiones y Persistencia:
Se explica cómo utilizar el concepto de matriz como elemento de modelado que permite agrupar los elementos del mundo en una estructura contenedora de dos dimensiones de tamaño fijo. Se identifican los patrones de algoritmo para manejo de matrices, dada la especificación de un método. Se presenta la manera de utilizar un esquema simple de persistencia para el manejo del estado inicial de un problema. Por último, se resume el proceso de construcción de un programa seguido en el libro.

Las Herramientas y Recursos de Apoyo

Este libro es un libro de trabajo para el estudiante, donde puede realizar sus tareas y ejercicios asociados con cada nivel. Consideramos la página web del curso como parte integral del mismo. Todos los casos de estudio que se utilizan en los distintos niveles están resueltos e incluidos en dicho sitio web, así como las hojas de trabajo. Además, cada una de estas soluciones contiene puntos de extensión para que el profesor pueda diseñar ejercicios adicionales con sus estudiantes. Es importante que el profesor motive a los estudiantes a consultar la página web al mismo tiempo que lee el libro.

En la página web se encuentran tres tipos de elementos: (1) los programas de los casos de estudio, (2) los programas de las hojas de trabajo y (3) los entrenadores sobre ciertos conceptos. La página ha sido construida de manera que sea fácil navegar por los elementos que lo constituyen.

Todo el contenido de apoyo, lo mismo que otros materiales de apoyo al profesor, se puede encontrar en el sitio web del proyecto: http://cupi2.uniandes.edu.co

Licencias de Uso y Marcas Registradas

A lo largo de este libro hacemos mención a distintas herramientas y productos comerciales, todos los cuales tienen sus marcas registradas. Estos son: Microsoft Windows®, Microsoft Word®, Enterprise Architect®, Java®, Mozilla Firefox®, Eclipse®, JUnit®, Adobe Acrobat Reader®, Mac Apple Inc.®.

Todas las herramientas, programas, entrenadores y demás materiales desarrollados como soporte y complemento del libro, se distribuyen bajo la licencia "Academic Free License v. 2.1" que se rige por lo definido en: http://opensource.org/licenses/

Agradecimientos

Agradecemos a todas las personas, profesores y estudiantes, que han ayudado a que este libro se vuelva una realidad. En particular, queremos agradecer a Katalina Marcos por su valiosa ayuda y apoyo a todo lo largo del proceso.

También queremos reconocer el trabajo de Mario Sánchez y Pablo Bravo, nuestros incansables colaboradores. Ellos nos ayudaron en la construcción de muchos de los ejercicios y ejemplos alrededor de los cuales gira este libro. Gracias por su ayuda y su permanente buen humor.
Una mención especial merecen los profesores y estudiantes que durante el último año participaron en las secciones de prueba, usadas para validar el enfoque pedagógico propuesto, y quienes utilizaron como material de trabajo los primeros borradores de este libro. En particular, queremos reconocer el trabajo de Marcela Hernández, quien participó activamente en la revisión del borrador del libro y quien construyó una parte del material de apoyo a profesores que se encuentra disponible en el sitio WEB del proyecto.

Agradecemos la ayuda que recibimos de parte de LIDIE (Laboratorio de Investigación en Informática Educativa de la Universidad de los Andes), en las tareas de seguimiento, validación, diseño de las estrategias pedagógicas y diseño de los iconos y figuras que ilustran este libro.

Sobre los Autores
Jorge A. Villalobos, Ph.D
Obtuvo un doctorado en la Universidad Joseph Fourier (Francia), un Master en Informática en el Instituto Nacional Politécnico de Grenoble (Francia) y el título de Ingeniero en la Universidad de los Andes (Colombia). Actualmente es profesor asociado del Departamento de Ingeniería de Sistemas de la Universidad de los Andes, en donde coordina el grupo de investigación en Construcción de Software y el proyecto Cupi2. Ha trabajado como investigador visitante en varias universidades europeas (España y Francia) y es el autor de los libros " Diseño y Manejo de Estructuras de Datos en C" (1996) y "Estructuras de Datos: Un Enfoque desde Tipos Abstractos" (1990).
Rubby Casallas, Ph.D
Obtuvo un doctorado en la Universidad Joseph Fourier (Francia), es Especialista en Sistemas de Información en la Organización de la Universidad de los Andes e Ingeniera de Sistemas de la misma Universidad. Ha sido profesora de la Universidad del Valle y del Rochester Institute Of Technology. Actualmente trabaja como profesora asociada del Departamento de Ingeniería de Sistemas de la Universidad de los Andes. Es coautora del libro "Introducción a la Programación" (1987).

A Vicky, por la alegría con la que me ha acostumbrado a vivir.

-Jorge

A Irene y Jorge Esteban por el futuro que representan.

-Rubby

# data[].attributes.attachment_link.description
Este libro es uno de los resultados del proyecto Cupi2, un proyecto de actualización curricular de la Universidad de los Andes (Bogotá, Colombia), cuyo principal propósito es encontrar mejores formas de enseñar/aprender a resolver problemas usando como herramienta un lenguaje de programación de computadores.