Este documento discute conceptos fundamentales de programación y resolución de problemas. Explica que un problema implica una familia de preguntas relacionadas que comparten ciertos aspectos pero difieren en otros, y que un programa proporciona una regla general para resolver dicho problema. También aborda temas como qué es la computación, los objetivos de un curso introductorio de programación y consideraciones sobre el uso de lenguajes de programación en dichos cursos.
1. Didáctica del análisis y la solución de
problemas mediante programación
Primero gráficas, luego la sintaxis
2. ¿Qué es un problema?
• ¿Cuál es el significado de la vida?
– Una pregunta no tan objetiva
• ¿Cuántos años tengo?
– Pregunta objetiva, la cual requiere información de
la que se carece
• ¿Cuál el número primo más pequeño?
– Objetiva, bien especificada, pero una vez que se
resuelve, concluye
July 5 2011 Program By Design 2011 2
3. ¿Qué es un problema?
• ¿Cuál es el equivalente Celsius de 45F?
– Otra vez, una vez que se contesta, concluye
• ¿Cuál es el equivalente Celsius de 87F?
– Igual, aunque muy relacionada
• ¿Cuál es el equivalente Celsius de ___ en
Fahrenheit?
– Generaliza infinitamente muchas preguntas
July 5 2011 Program By Design 2011 3
4. ¿Qué es un problema?
Pregunta: tiene una sola respuesta
Problema: familia enorme (o infinita) de
preguntas, compartiendo algunos aspectos y
difiriendo de otros
Programa: regla general para resolver un
problema, con entrada para los aspectos que
difieren
Cómputo: un programa operando en una entrada
particular para producir un resultado particular
July 5 2011 Program By Design 2011 4
5. ¿Qué es “computación”?
• ¿Biología = “ciencia del microscopio”?
• acerca de los microbios, no de lo microscopios
• ¿Astronomía = “ciencia del telescopio”?
• acerca de las estrellas, no de los telescopios
¡No es acerca de la herramienta, es acerca de lo que se
puede estudiar con la herramienta!
• “computación”
• tiene que ver con información y su manipulación, no las
computadoras, es cercana a las matemáticas
July 5 2011 Program By Design 2011 5
6. ¿Qué es un curso de Fundamentos a la
programación?
1) ¿Cómo emplear Microsoft Office, et al
2) Survey de la profesión de los computólogos
3) Un lenguaje, IDE, OS, etc. que proporcionen a los
estudiantes trabajo
4) Conceptos, hábitos, y metodologías de programación
Cuatro cursos completamente diferentes, cada uno valioso por
diferentes razones y para diferentes audiencias
#3 útil para estudiantes por recibirse, o en búsqueda de
ayudantías o trabajos de verano
#4 más útil como primer curso. Llamémosle “Fundamentos
de programación"…
July 5 2011 Program By Design 2011 6
7. ¿De qué trata Fundamentos de
programación, FP?
July 5 2011 Program By Design 2011 7
8. ¿Qué se enseña?
Bla, bla algoritmo bla variable bla función bla
tipo de datos bla objeto bla re-uso bla
metodología bla testing bla diseño bla
composición bla refinamiento bla
abstracción
July 5 2011 Program By Design 2011 8
9. ¿Qué se escucha?
bla ; bla { bla ) bla ] bla return bla this.x = x; bla
public static void main (String[] args) bla /* bla //
bla <int> bla if ( bla JOptionPane bla class
Posn(int x,y)
July 5 2011 Program By Design 2011 9
10. Lenguajes de programación e IDEs:
un mal necesario
• Necesario: para escribir programas reales
que realmente corran en computadoras
reales
• Mal: distraen a los estudiantes de temas
importantes
• En cualquier caso serán obsoletos en unos
cuantos años
July 5 2011 Program By Design 2011 10
11. ¿Cómo minimizar los lenguajes e
IDEs?
• Introducir características una a la vez
• Evitar “magia negra"; nunca pedir a los estudiantes escribir algo que
no entiendan en el momento
• Introducir características únicamente cuando sea necesario para
aprender un concepto importante
• Corolario: ningún aspecto que no ayude a enseñar un concepto de
programación debe mencionarse en Fundamentos de programación
• Corolario: se requieren reforzar subconjuntos de un lenguaje de modo
de evitar que los estudiantes usen accidentalmente aspectos no
comprendidos de un lenguaje
• Para GUIs, robótica, redes, etc. se requiere una interface entre el
código del estudiantes (mediante un subconjunto y el código de
biblioteca (en un lenguaje completo)
July 5 2011 Program By Design 2011 11
12. Hecho desafortunado
Java y C++, … no se atienen a esas reglas:
• Introducen muchos conceptos a la vez
• No pueden explicarse inmediatamente -> magia negra
• Tienen que introducir conceptos que podrían
emplearse en algún programa, no sólo aquellos
empleados en este programa
• Es fácil invocar accidentalmente aspectos avanzados
del lenguaje (p.e. punteros, clases internas)
July 11, 2011
13. ¿Qué acerca de Java y POO?
Sí, los estudiantes requieren Java y POO, pero
• ¿Cuándo?
• ¿Por qué?
Contestando primero el “por qué”, debido a que
afecta el “cuándo”.
July 11, 2011
14. ¿Por qué los estudiantes requieren
Java?
• Se emplea en muchas instituciones de
educación superior (actualmente)
• Se emplea en la industria (actualmente)
July 11, 2011
15. Por qué ¿Cuándo los estudiantes
requieren Java?
• Al momento de cursos a mitad de la carrera,
los que lo presuponen, si siguen vigentes
para entonces
• Al momento de obtener un trabajo en la
industria, si para entonces se sigue
empleando en la industria
July 11, 2011
16. ¿Por qué los estudiantes requieren
POO con base en clases?
• Es una forma útil de organizar programas
grandes… digamos, de 10,000 a 1,000,000
lines.
(No la única manera, pero una buena.)
• Se emplea en la industria… a veces.
(véase “Objects Never? Well, Hardly Ever!”
en CACM Sept. 2010)
July 11, 2011
17. Por qué ¿Cuándo los estudiantes
requieren POO con base en clases?
• Cuando escriban programas grandes… digamos,
10,000 a 1,000,000 lines. Probablemente no este año.
• Cuando apliquen en trabajos que requieran POO con
base en clases. Probablemente no este año.
• Los beneficios de POO no son evidentes en el primer
año; los estudiantes sólo sufren el costo y la
complejidad.
• (Desafío: escribir un programa corto, OO C++/Java
que no pudiera ser más corto y simple sin OO)
July 11, 2011
18. Si bien parece que mientras más pronto se inicie
el manejo de Java, mejor se aprenderá
• No necesariamente. Java tiene más sentido si ya
se sabe programar.
• Mejor, primero aprender conceptos y hábitos de
programación, luego un lenguaje complicado.
• Escuelas que posponen Java forman mejores
programadores Java
July 11, 2011
19. Opciones a primero-Java
• Principales opciones: Alice, Python,
Scheme/Racket, Scratch/BYOB, Processing
• Todas: inician con una sintaxis más simple a
la vez que los estudiantes dominan
conceptos. Motivan mediante gráficos.
• Diferencia: Alice, Python, Scratch,
Processing normalmente se enseñan en
forma imperativa; Racket, funcionalmente
July 11, 2011
20. Imperativo Funcional
• “¿Qué salida y efectos • “¿Cuál es la respuesta
colaterales se desean?” correcta?”
• “¿Qué hago, en que orden, • “¿Qué expresión algebraica
para generarlos?” genera la expresión correcta?”
• Primera semana: asignación, • Primera semana: llamadas a
I/O, secuencia función y definiciones
• Luego: condicionales, ciclos • Luego:
condicionales, recursión
• Más tarde: llamadas a
función y definiciones, • Más tarde:
recursión asignación, I/O, secuencia, cic
los
July 11, 2011
21. ¿Por qué programación funcional?
Imperativa Funcional
Modelo mental Máquina von Neumann: Sustitución algebráica:
Almacenar en y recuperar de cajas 3+4*5 -> 3+20 -> 23
Escritura de setFoo(5); setBar(3); setOther(-4); f(5,3) == rightAnswer
pruebas doF();
getResult().equals(rightAnswer)
&&
getOther() == -4 // hasn’t changed
Cambio en Cada prueba afecta los resultados Se pueden comentar o reordenar
pruebas de las subsecuentes pruebas sin cambiar los resultados
Debugging ¿Cuál es el valor de ésta variable ¿Cuál es el valor de ésta?
en éste momento?
Hábitos Grandes métodos que mezclan I/O Separa I/O y cálculo; corto,
y cálculo, haciendo muchas tareas reusable, funciones de un sólo
diferentes propósito
July 11, 2011
22. Puede programarse funcionalmente en
otros languajes (p.e. Java)
• Enseñar “return” antes de asignación o println
• Enseñar métodos con parámetros y valores
devueltos antes de sin
• Enseñar composición de métodos antes de
secuencias
• Enseñar recursión antes de loops
• … etc.
• Aunque el lenguaje no lo facilita.
July 11, 2011
23. Pero ¿por qué enseñar Racket?
¡Nadie lo emplea!
• Lo mismo se decía de Pascal en los 1980’s
• Realmente no importa enseñar Racket;
interesa enseñar programación.
• Enseñar lo menos posible de Racket:
5-10 reglas sintácticas en todo un semestre
• Curricula mucho más importante que el
lenguaje
July 11, 2011
24. ¿Qué hacer?
NO “enseñar Racket en lugar de Java”
Curricula multi-semestre, integrada
1) Enseñar lo menos posible de Racket; concentrarse en la
solución de problemas y en el pensamiento matemático
2) Enseñar lo menos posible de Java; concentrarse en la
solución de problemas y en el pensamiento matemático
3) Enseñar aspectos del lenguaje que requieren los
estudiantes en becas, servicio social, cursos
subsecuentes, etc.
“lo menos de Java" >> “lo menos de Racket"
July 11, 2011
25. La Trinidad
Curricula centrada en la solución
de problemas (Programación
mediante diseño)
Lenguaje simple IDE didáctica
(lenguajes para (DrRacket)
estudiantes tipo-
Scheme)
July 11, 2011
26. "concentrarse en solucionar
problemas"
• Receta de diseño paso a paso: de la descripción verbal
de un problema al código probado y corregido
• Preguntas concretas y entregables en cada paso
• Casos de prueba antes que la codificación; parte de la
face de análisis
• Data Driven Design (diseño impulsado por datos):
“la forma de los datos determina la forma del código"
July 11, 2011
27. Stephen Bloch, Adelphi University, Garden City, NY
John Clements, Cal Poly, San Luis Obispo, CA
Kathi Fisler, Worcester Polytechnic Institute, Worcester, MA
Matthew Flatt, University of Utah, Salt Lake City, UT
Shriram Krishnamurthi, Brown University, Providence, RI
Viera K. Proulx, Northeastern University, Boston, MA
Supported by NSF grant #0618543
Related work by Matthias Felleisen, Robby Findler,
Kathy Gray, Eli Barzilay, Emmanuel Schanzer, et al