¿Por qué otro libro sobre programación estructurada y programación orientada a objetos, si existen varios de excelente calidad? Todos los trabajos que hasta hoy hemos encontrado se dirigen hacia las instrucciones de código y los algoritmos: se explican las sentencias y las soluciones, para luego dar uno o varios ejemplos de uso (el inicio típico es un programa que despliega la frase “Hola, mundo”). En términos generales, este método puede formar buenos codificadores. Sin embargo, se pierden varios puntos esenciales en el camino de formar un verdadero profesional en las áreas de desarrollo de software y sistemas de información, cuyas bases se encuentran dispersas entre libros de programación, ingeniería de software, bases de datos y pedagogía, en unidades de aprendizaje y documentación que rara vez se relacionan explícitamente entre sí.

Esta situación fue detectada desde hace algún tiempo en las asignaturas de Lógica de Programación y Programación Orientada a Objetos de la Unidad Profesional Interdisciplinaria de Ingeniería y Ciencias Sociales y Administrativas (UPIICSA) del Instituto Politécnico Nacional (IPN), lugar en donde hemos buscado dar un enfoque integral a la enseñanza de la programación y de donde surge la presente obra. Aunque debemos aclarar que no es un problema local: existen indicios de que es una necesidad nacional e internacional. Por ello, este libro trata de la programación estructurada y programación orientada a objetos, pero al mismo tiempo reflexiona sobre cómo aprender y enseñar programación.

Lo que intentamos es una obra que aborde aspectos básicos de programación, pero que muestre las ligas indispensables hacia la ingeniería de software y señale recomendaciones —siempre expuestas a verificación y crítica— sobre aspectos de enseñanza y aprendizaje. Seamos honestos en este sentido: hay más dudas que certezas. Debemos reconocer que aunque son opiniones con un sustento relativamente firme, pueden coincidir o no con la situación concreta de cada escuela. Nuestra pretensión no es tener una realidad universal, sino mover a la reflexión sobre la enseñanza de la programación, un aspecto por lo común descuidado. La programación estructurada abarca los capítulos 1 a 3 con base en el lenguaje de programación C. En ellos se establece una metodología de trabajo básica para programación estructurada a fin de que el estudiante codifique de manera disciplinada. La adaptación del método de cascada que proponemos tiene como aspectos principales: 1. Partir de una petición explícita de un usuario final, la cual incluye un ejemplo de cálculo en caso necesario.

Esto evita que el estudiante resuelva ambigüedades en los requerimientos. Desde nuestro punto de vista, este es uno de los “pecados capitales” que se suelen cometer en la enseñanza cotidiana de los cursos de programación: el estudiante suele ser su propio usuario, “suplantando” al usuario final, costumbre que suele llevar después al campo profesional. 2. Diseñar un lote de pruebas antes de elaborar el algoritmo, el cual debe considerar tanto las situaciones normales como los casos excepcionales. En este punto se reitera la importancia de las pruebas de escritorio antes de llevar el programa a la codificación y al equipo de cómputo. No es trivial el asunto: la mayoría de los estudiantes reprueba un examen de prueba de escritorio en la primera oportunidad. 3. Conformar la documentación “sobre la marcha”, la cual debe entregarse de manera completa: desde el requerimiento hasta la pantalla final. De esta manera se pretende disminuir, aunque sea de manera muy modesta, uno de los problemas más fuertes en el área de sistemas de información: la falta de una documentación completa y actualizada que facilite la operación y el mantenimiento del software.

También es conveniente señalar las mejoras que necesitaría el programa para “crecer” hacia una aplicación profesional, acercándose intuitivamente a temas como portabilidad del código, robustez, eficiencia y facilidad de mantenimiento. Con este propósito se proporcionan ejemplos diversos y programas completos para cada tema, además de actividades de interpretación de código o seudocódigo para que el estudiante practique las pruebas de escritorio. Una novedad más: a lo largo del libro hay ejercicios de «clínica de programación», en los cuales se parte de la mayor parte del programa para que el alumno lo complete o corrija. Esto tiene la intención de acostumbrarlo a trabajar con la lógica y el estilo de otro programador, situación por demás común en el mercado laboral cuando se le da mantenimiento a sistemas elaborados por otro desarrollador (la refactorización de código). En los capítulos 4 a 6 se pretende abordar los aspectos principales de la programación orientada a objetos (POO) a través de C++ y Java. Nos atrevimos a entremezclar la parte conceptual —la misma en términos generales—, con programas mostrados en ambos lenguajes. Aquí se propone que el estudiante perciba que el requerimiento en POO se refiere a la creación de componentes de software (clases) que deben ser probadas de manera independiente (a través de su TestClase) para que se integren en forma posterior al sistema integral.

Hacemos «focos» con su respectivo «probador de focos»; la instalación eléctrica completa y la casa vendrán luego. Los diagramas de clase sustituyen en gran parte al seudocódigo o los diagramas de flujo de la programación estructurada. Por último, en el capítulo 7 se abordan aspectos básicos sobre el desarrollo de software desde el punto de vista metodológico, ejemplificando con casos prácticos que vivimos en nuestra experiencia profesional (como actores o como testigos cercanos). La intención es que el estudiante pueda relacionar de manera natural la ingeniería de software con la programación: no son mundos separados. Conviene aclarar que este libro puede ser empleado por dos tipos de estudiantes: en primer lugar, quienes comienzan su carrera en informática o disciplinas afines y en un futuro se harán profesionales del área. En segundo término, puede servir para alumnos de otras carreras que llevan un curso introductorio de programación y desean realizar después trabajos interdisciplinarios con el área de desarrollo de sistemas.

En cualquier caso, parte del supuesto de que no tienen antecedentes en el área de programación. Por otra parte, esta obra no está dirigida únicamente a estudiantes; pretendemos que sea un material interesante para egresados y docentes, quienes sin duda encontrarán afirmaciones coincidentes o polémicas que los retarán a reflexionar sobre su campo profesional. Porque es necesario hacer hincapié en que difícilmente se puede fomentar una forma de trabajo disciplinada si el propio docente y el egresado no están convencidos de ello. Digámoslo de manera directa: la mayoría de las ambigüedades de la especificación de requerimientos proviene de la forma en que el profesor o el profesional plantean el problema. Nos hemos topado con tareas de programación que pueden entenderse de cuatro o cinco formas distintas, y profesores y egresados a quienes esta situación se les hace natural. Como maestros, a veces no solemos dar la importancia que se merece a los aspectos metodológicos y esto parece ser una situación a nivel nacional e incluso internacional.

El análisis de las formas más adecuadas para enseñar desarrollo de software es un área que se ha abordado muy poco. En muchos países no existen diplomados ni posgrados sobre la enseñanza de la programación, como en matemáticas, química y física. Por ello, a lo largo del libro se irán expresando «puntos de reflexión» en torno a mejoras didácticas en la enseñanza de la programación, que parten del supuesto de una participación activa de estudiantes y profesores dentro de una experimentación permanente en el aula. Desde luego, estas propuestas deben ser corroboradas en el propio contexto de la cotidianidad, pues la realidad siempre tiene la última palabra.