Volver a la portadaCultura Digital · 3º de Preparatoria · Físico-Matemáticas · Cambiar asignatura
Empezar gratis
Prepa 3º Tec · Cultura Digital
Sistemas informáticos · Programación textual

El proceso de desarrollo de un programa

Te conviene dominar: Programación textual (1er año de preparatoria (semestres 1 y 2))
Te conviene dominar: Algoritmos y pensamiento computacional (1er año de preparatoria (semestres 1 y 2))

Imagina que una tienda de colonia estrena un sistema de cobro en la computadora y, el primer día, a doña Rosa le cobra $\$30$ de más en una compra. Ningún programa nace terminado ni funciona a la primera. Entre la idea y el programa confiable hay un proceso con etapas que se repiten. Al final de la página verás cómo se habría evitado ese cobro de más.

El ciclo de desarrollo

Un bug es un error en el programa. Depurar es buscar la causa de ese bug y corregirla. Por ejemplo, si el programa de un cajero automático resta dos veces el monto de un retiro, el usuario verá que le descuentan el doble: ese es un bug con consecuencias reales.

Diagrama de flujo del ciclo de desarrollo con las etapas de editar, ejecutar y probar, decisión de si funciona bien, depurar y publicar. Editar el código Ejecutar y probar ¿funciona bien? Depurar el error Publicar el programa no sí
Practica★☆☆Sin empezar
Estas fases del desarrollo de un programa están desordenadas: (a) probar el programa con distintos datos, (b) editar el código fuente, (c) depurar los errores…

Estas fases del desarrollo de un programa están desordenadas: (a) probar el programa con distintos datos, (b) editar el código fuente, (c) depurar los errores encontrados, (d) ejecutar el programa. Ordénalas de forma razonable y explica qué se hace en cada una, teniendo en cuenta que al probar puede ser necesario volver atrás.

Resolver
Practica★☆☆Sin empezar
Explica qué es un «bug» en un programa y qué es depurar. Pon un ejemplo sencillo de error que podría tener el programa de un cajero automático y qué consecuencia tendría…

Explica qué es un «bug» en un programa y qué es depurar. Pon un ejemplo sencillo de error que podría tener el programa de un cajero automático y qué consecuencia tendría para el usuario.

Resolver
Practica★☆☆Sin empezar
La figura muestra el ciclo de trabajo del desarrollo de un programa, pero una de sus etapas está tapada con un signo de interrogación, como se muestra en la figura.…

La figura muestra el ciclo de trabajo del desarrollo de un programa, pero una de sus etapas está tapada con un signo de interrogación, como se muestra en la figura.

Editar el código Ejecutar y probar ¿funciona bien? ? Publicar el programa no sí

Indica qué etapa falta dentro del ciclo, en qué consiste y por qué la flecha de «no» devuelve el trabajo a la edición del código.

Resolver

Tipos de error

También se distingue por el momento en que aparece. Un error de compilación se detecta antes de ejecutar (el programa ni siquiera arranca; por ejemplo, falta un paréntesis). Un error de ejecución aparece con el programa ya en marcha, a veces solo con ciertos datos (por ejemplo, dividir entre 0).

Comparación entre error de sintaxis y de lógica: con un fallo de forma el programa no arranca; con un fallo de razonamiento (dividir entre 4 en vez de entre 3) se ejecuta y da 5.25 en lugar de 7. error de sintaxis no arranca media ← (a + b + c / 3 ! error de lógica arranca, resultado erróneo media ← (a + b + c) / 4 5.25 esperado: 7
Practica★☆☆Sin empezar
Distingue entre un error que aparece al compilar (el programa ni siquiera arranca) y un error que aparece en ejecución (arranca pero falla con ciertos datos), con un…

Distingue entre un error que aparece al compilar (el programa ni siquiera arranca) y un error que aparece en ejecución (arranca pero falla con ciertos datos), con un ejemplo de cada tipo.

Resolver
Practica★★☆Sin empezar
Explica la diferencia entre un error de sintaxis y un error de lógica, con un ejemplo de cada uno en un programa que calcula la media de tres notas. ¿Cuál de los dos…

Explica la diferencia entre un error de sintaxis y un error de lógica, con un ejemplo de cada uno en un programa que calcula la media de tres notas. ¿Cuál de los dos tipos impide ejecutar el programa y cuál deja ejecutarlo pero da resultados incorrectos?

Resolver

Diseñar casos de prueba

Recta numérica con los casos de prueba: un valor erróneo fuera del rango, dos valores límite en los extremos del rango válido y un valor normal en su interior. erróneo límite normal límite rango de valores válidos

Por ejemplo, para un programa que suma dos números: un caso normal es $3 + 4$ con resultado esperado $7$; uno especial es $0 + 0$ con resultado $0$, o un número negativo como $-5 + 5 = 0$.

Un plan de pruebas se puede organizar en una tabla. Ejemplo para una división:

Caso Entrada (a, b) Resultado esperado
Normal (10, 2) 5
Normal con decimales (7, 2) 3.5
Límite (0, 5) 0
Negativo (-9, 3) -3
Erróneo (8, 0) Mensaje: «no se puede dividir entre 0»
Erróneo («x», 2) Mensaje: «dato no válido»
Practica★☆☆Sin empezar
Explica qué es un caso de prueba y escribe dos casos para un programa que suma dos números: uno con valores normales y otro con algún valor especial, indicando la…

Explica qué es un caso de prueba y escribe dos casos para un programa que suma dos números: uno con valores normales y otro con algún valor especial, indicando la entrada y el resultado esperado de cada uno.

Resolver
Practica★★☆Sin empezar
Un programa que divide dos números funciona bien en casi todas las pruebas, pero falla cuando el divisor es 0. Explica qué son los valores límite o casos especiales en…

Un programa que divide dos números funciona bien en casi todas las pruebas, pero falla cuando el divisor es 0. Explica qué son los valores límite o casos especiales en las pruebas, por qué hay que probarlos siempre y cita otros dos valores con los que probarías este programa.

Resolver
Practica★★☆Sin empezar
Para probar un programa que aplica un descuento a personas de 65 años o más, define tres casos de prueba: uno con un valor normal, uno con el valor límite exacto y uno…

Para probar un programa que aplica un descuento a personas de 65 años o más, define tres casos de prueba: uno con un valor normal, uno con el valor límite exacto y uno con un valor erróneo (edad negativa o imposible), con el resultado esperado de cada uno. Justifica tus elecciones.

Resolver
Practica★★★Sin empezar
Un compañero de equipo te muestra la siguiente función en C++ para calcular el precio final con IVA y aplicar un descuento si el cliente es socio, asegurando: «Si…

Un compañero de equipo te muestra la siguiente función en C++ para calcular el precio final con IVA y aplicar un descuento si el cliente es socio, asegurando: «Si compila sin errores ni advertencias, es imposible que falle en ejecución; no hace falta probarla»:

float calcularPrecioFinal(float base, bool esSocio) {

    float total = base;

    if (esSocio = true) {

        total = total * 0.90f;

    }

    total = total * 1.21f;

    return total;

}
  1. Predice razonadamente la salida de la función para un cliente no socio (esSocio = false) con una base de 100.00 pesos. ¿Coincide con el comportamiento esperado? Explica por qué el compilador no lo rechaza como error.

  2. Justifica, a partir de este ejemplo, la diferencia entre lo que garantiza la verificación sintáctica del compilador y lo que demuestran las pruebas dinámicas de software.

  3. Propón la corrección del código y escribe un caso de prueba concreto que evidencie el fallo si la corrección no estuviera aplicada.

Resolver
Practica★★★Sin empezar
Diseña un plan de pruebas para un programa que pide dos números y muestra su división: haz una tabla con al menos seis casos de prueba (pares de valores de entrada,…

Diseña un plan de pruebas para un programa que pide dos números y muestra su división: haz una tabla con al menos seis casos de prueba (pares de valores de entrada, incluyendo valores normales, límite y erróneos), el resultado esperado de cada uno y qué debería hacer el programa si la entrada no es válida. Justifica la elección de cada caso.

Resolver
Practica★★★Sin empezar
La intranet del centro educativo implementa un módulo de autenticación con los siguientes requisitos: Nombre de usuario: de 4 a 12 caracteres alfanuméricos, insensible a…

La intranet del centro educativo implementa un módulo de autenticación con los siguientes requisitos:

  • Nombre de usuario: de 4 a 12 caracteres alfanuméricos, insensible a mayúsculas/minúsculas.

  • Contraseña: entre 8 y 16 caracteres, sensible a mayúsculas/minúsculas, con al menos un dígito y un carácter especial.

  • Seguridad: bloqueo temporal de la cuenta durante 15 minutos tras tres intentos fallidos consecutivos.

Diseña un plan de pruebas riguroso mediante una tabla con al menos seis casos de prueba diseñados por ti. Para cada caso debes especificar: identificador, valores de entrada (usuario y contraseña), estado previo del sistema, resultado esperado y qué riesgo específico de lógica, frontera o seguridad estás validando.

Resolver
Practica★★★Sin empezar
Un programador sostiene que «una función de una sola línea no necesita pruebas porque es autoevidente» y presenta esta función escrita en C++: 1. Predice la salida de la…

Un programador sostiene que «una función de una sola línea no necesita pruebas porque es autoevidente» y presenta esta función escrita en C++:

bool esImpar(int n) {

    return (n % 2 == 1);

}
  1. Predice la salida de la función para n = 7, n = 0 y n = -7. Explica técnicamente por qué se produce un resultado inesperado en uno de ellos basándote en cómo implementa el operador módulo (%) los operandos negativos en este lenguaje.

  2. Corrige la expresión para que la función sea matemáticamente correcta con cualquier número entero.

  3. Apoyándote en este caso, rebate con dos argumentos técnicos la idea de prescindir de pruebas unitarias en algoritmos breves o aparentemente triviales.

Resolver

Técnicas de depuración

Algunos errores son no deterministas: fallan solo a veces (por ejemplo, por números aleatorios o por respuestas de un servicio en línea) y no se repiten al ejecutar paso a paso. Para estudiarlos conviene guardar registros de cada ejecución, fijar la semilla del generador aleatorio y simular respuestas del servicio, de modo que el fallo se pueda reproducir a voluntad.

Para analizar datos de un sistema que falla, compara lo esperado con lo obtenido en cada registro y busca qué tienen en común los casos que fallan. Si el total sale mal solo cuando hay descuento y recargo, o cuando hay una devolución (monto negativo), la hipótesis apunta a cómo se procesan esos conceptos.

Practica★☆☆Sin empezar
Explica qué es un mensaje de traza o registro (log) en un programa y cómo ayuda a encontrar un error (permite ver por dónde pasó el programa y con qué valores).

Explica qué es un mensaje de traza o registro (log) en un programa y cómo ayuda a encontrar un error (permite ver por dónde pasó el programa y con qué valores).

Resolver
Practica★★☆Sin empezar
Un bucle de un programa no se detiene nunca. Explica dónde colocarías mensajes de escritura temporales para diagnosticarlo (dentro del bucle, mostrando la variable de…

Un bucle de un programa no se detiene nunca. Explica dónde colocarías mensajes de escritura temporales para diagnosticarlo (dentro del bucle, mostrando la variable de control en cada vuelta) y qué observarías en esos mensajes para encontrar la causa.

Resolver
Practica★★★Sin empezar
En el sistema de cobro de una cooperativa escolar se ha detectado que, al emitir la factura mensual, el total a pagar de algunos socios es erróneo. Dispones de los…

En el sistema de cobro de una cooperativa escolar se ha detectado que, al emitir la factura mensual, el total a pagar de algunos socios es erróneo. Dispones de los siguientes registros del sistema:

  • Socio 101: 2 compras de 15.00 pesos -> Total cobrado: 30.00 pesos (esperado: 30.00 pesos).

  • Socio 102: 1 compra de 50.00 pesos con descuento promocional del 10 % (5.00 pesos) y recargo por gastos de gestión de 3.00 pesos -> Total cobrado: 47.50 pesos (esperado: 48.00 pesos).

  • Socio 103: 1 compra de 20.00 pesos y devolución de 1 artículo de 5.00 pesos (-5.00 pesos) -> Total cobrado: 25.00 pesos (esperado: 15.00 pesos).

  • Formula una hipótesis justificada sobre el fallo lógico o de orden de operaciones que explica el error en el Socio 102 y en el Socio 103.

  • Diseña la estrategia de depuración para confirmar tus hipótesis: indica qué datos de prueba mínimos introducirías para aislar el fallo, en qué puntos del flujo situarías puntos de interrupción (breakpoints) y qué variables concretas deberías inspeccionar paso a paso.

Resolver
Practica★★★Sin empezar
Un script de simulación meteorológica falla aproximadamente una de cada veinte ejecuciones lanzando una excepción inesperada, pero al ejecutarlo manualmente paso a paso…

Un script de simulación meteorológica falla aproximadamente una de cada veinte ejecuciones lanzando una excepción inesperada, pero al ejecutarlo manualmente paso a paso nunca reproduce el fallo (el programa utiliza peticiones a una API en tiempo real y una función de generación de números aleatorios).

  1. Justifica por qué este error se clasifica como no determinista (heisenbug) e identifica las dos fuentes de variabilidad que impiden reproducirlo a voluntad.

  2. Diseña un plan de actuación técnico para forzar la reproducción controlada del fallo sin esperar pasivamente a que ocurra al azar (explica cómo tratarías el generador de números pseudoaleatorios y cómo desacoplarías las llamadas de red externas).

  3. Una vez localizado y corregido el defecto, ¿qué procedimiento de prueba aplicarías para certificar que el error ha desaparecido por completo y no ha sido simple casualidad estadística?

Resolver

Modularizar, refactorizar y documentar

Esquema de modularización: una función gigante de 400 líneas se divide en cuatro funciones: leer_datos, validar_datos, calcular_resultado y mostrar_resultado. función gigante de 400 líneas se divide en leer_datos validar_datos calcular_resultado mostrar_resultado cada función, una tarea concreta

Dos refactorizaciones típicas:

  • Renombrar variables: cambiar x, y2 y zzz por precio, iva y total. El código se explica solo y se cometen menos errores.

  • Extraer una función: si el mismo cálculo del IVA ($16\,\%$) aparece en cinco lugares, se escribe una vez como calcular_iva(precio) y se llama cuando haga falta.

También ayuda documentar: explicar al menos qué hace el programa y cómo se usa. Sin documentación, cuando un integrante del equipo se va, nadie entiende bien el código y el programa «envejece» mal.

Y conviene guardar versiones (1.0, 1.1, 2.0…) del código: si la versión nueva funciona peor que la anterior, puedes volver a la anterior y comparar qué cambió.

Practica★☆☆Sin empezar
Los programas tienen versiones (1.0, 1.1, 2.0...). Explica para qué sirve guardar versiones del código y qué puedes hacer si la última versión funciona peor que la…

Los programas tienen versiones (1.0, 1.1, 2.0...). Explica para qué sirve guardar versiones del código y qué puedes hacer si la última versión funciona peor que la anterior.

Resolver
Practica★☆☆Sin empezar
La documentación acompaña al programa. Explica qué dos cosas debería explicar como mínimo (qué hace el programa y cómo se usa) y por qué un programa sin documentar…

La documentación acompaña al programa. Explica qué dos cosas debería explicar como mínimo (qué hace el programa y cómo se usa) y por qué un programa sin documentar «envejece» mal cuando trabaja un equipo.

Resolver
Practica★★☆Sin empezar
Explica qué es la modularización de un programa (dividirlo en funciones o módulos) y analiza dos ventajas que aporta cuando el desarrollo lo hace un equipo de varias…

Explica qué es la modularización de un programa (dividirlo en funciones o módulos) y analiza dos ventajas que aporta cuando el desarrollo lo hace un equipo de varias personas: piensa en el reparto del trabajo, en las pruebas y en la localización de errores.

Resolver
Practica★★☆Sin empezar
Explica qué es refactorizar (mejorar el código sin cambiar lo que hace) y describe dos refactorizaciones típicas (renombrar variables con nombres claros, extraer una…

Explica qué es refactorizar (mejorar el código sin cambiar lo que hace) y describe dos refactorizaciones típicas (renombrar variables con nombres claros, extraer una función a partir de código repetido), con un ejemplo de cada una.

Resolver
Practica★★☆Sin empezar
Un fragmento de código usa las variables x, y2 y zzz para guardar el precio, el IVA y el total. Reescribe esos nombres de forma significativa y explica por qué la…

Un fragmento de código usa las variables x, y2 y zzz para guardar el precio, el IVA y el total. Reescribe esos nombres de forma significativa y explica por qué la elección de nombres es una herramienta contra los errores (el código se autodocumenta).

Resolver
Practica★★☆Sin empezar
Dos personas de un equipo editan a la vez el mismo fichero del proyecto y, al unir los cambios, aparece un conflicto. Explica qué es un conflicto de fusión, cómo se…

Dos personas de un equipo editan a la vez el mismo fichero del proyecto y, al unir los cambios, aparece un conflicto. Explica qué es un conflicto de fusión, cómo se resuelve (revisar ambas versiones y decidir) y qué dos hábitos de trabajo en equipo lo previenen (repartir el trabajo por módulos, integrar los cambios a menudo).

Resolver
Practica★★★Sin empezar
El sistema de supervisión de un invernadero se ha programado en un único archivo dentro de una sola función de 400 líneas. El código lee de forma secuencial tres…

El sistema de supervisión de un invernadero se ha programado en un único archivo dentro de una sola función de 400 líneas. El código lee de forma secuencial tres sensores analógicos de humedad de suelo, calcula el promedio, evalúa umbrales, acciona una electroválvula mediante un pin digital, guarda el registro histórico en un archivo de texto y envía un correo de alerta si la humedad cae por debajo del 30 %.

  1. Justifica detalladamente tres problemas técnicos graves que genera esta arquitectura cuando se necesita depurar un fallo intermitente o realizar pruebas unitarias automatizadas.

  2. Diseña una refactorización modular del programa: descompón la función en al menos cuatro funciones independientes. Para cada una define su nombre, parámetros de entrada con tipo, valor devuelto y su responsabilidad única.

  3. Explica cómo permitiría tu diseño probar el algoritmo de decisión de riego mediante simulación de datos, sin tener los sensores físicos conectados a la placa.

Resolver

Aplicación: probar un sistema del Internet de las cosas

Todo lo anterior se aplica a los programas que viven dentro de objetos conectados. El Internet de las cosas (IoT) conecta objetos físicos a la red: sensores que miden el mundo, comunicaciones que llevan los datos y aplicaciones que los convierten en decisiones. Piensa en un sensor de humedad en una milpa que avisa al celular de un agricultor cuándo regar.

Cuatro elementos de un sistema de Internet de las cosas en cadena: sensores, comunicación, plataforma y aplicación. 1. Sensores miden 2. Comunicación protocolos 3. Plataforma guarda y procesa 4. Aplicación decide y avisa

Un protocolo de comunicación es el conjunto de reglas con que dos dispositivos se entienden. Se pueden clasificar por su alcance inalámbrico: corto (Bluetooth, Zigbee), medio (Wi-Fi) y largo (redes de telefonía celular 4G/5G, LoRa). Un protocolo de mensajes ligero muy usado en IoT es MQTT.

Probar un sistema así es más difícil que probar un programa en tu computadora, porque los fallos pueden estar en cualquiera de los cuatro elementos:

  • Casos de prueba: además de humedad normal, prueba los valores límite (por ejemplo, el umbral exacto de riego) y los erróneos (un sensor desconectado que manda $-999$).

  • Trazas: registra la lectura, la hora y si el mensaje llegó. Así distingues un sensor que mide mal de una red que pierde datos.

  • Modularización: separa leer, enviar y decidir, para probar la decisión sin necesidad de sensores reales.

  • Seguridad: las credenciales de acceso no deben estar escritas dentro del código que compartes con el equipo.

Practica★★★Sin empezar
Un grupo de tres estudiantes va a desarrollar durante diez semanas una aplicación de control de asistencia para el centro educativo. Para evitar retrasos y entregas…

Un grupo de tres estudiantes va a desarrollar durante diez semanas una aplicación de control de asistencia para el centro educativo. Para evitar retrasos y entregas fallidas de última hora, debes estructurar la metodología de trabajo del equipo:

  1. Diseña un cronograma organizado en cuatro hitos o entregables verificables, explicando qué criterios objetivos deben cumplirse antes de autorizar el paso al hito siguiente.

  2. Define un protocolo formal de revisión por pares (code review): establece quién revisa el código de quién, qué lista de comprobación de calidad mínima debe superarse antes de aceptar cualquier cambio y cómo se gestionan los desacuerdos.

  3. Establece y justifica una política de «congelación de código» (code freeze): en qué semana debe activarse, qué tipo de modificaciones quedan terminantemente prohibidas a partir de ese momento y qué tareas exclusivas debe asumir el equipo hasta la entrega final.

Resolver

Vuelve al principio: el cobro de más a doña Rosa se habría detectado probando el sistema con casos normales, límite y erróneos antes de usarlo en la tienda.

Resumen

Ver todos los ejercicios de este apartado