DAVID MALAN: Bien, esto es CS50, una introducción de la Universidad de Harvard
para proyectos intelectuales enfocados en ciencias de la computación
y en el arte de la programación.
Y según parece, así era yo en la época
en la que estaba de su lado, chicos. Ahora estoy de este lado gracias a
un colega que pasó mucho tiempo merodeando por la Biblioteca Lemont,
donde los novatos que se inscribieron en 1995, al parecer aún lo siguen siendo.
Y señalo esto, porque para mí fue un enorme problema
volver a cuando era un novato y en definitiva, un estudiante
de segundo año, que evaluaba tomar una clase como esta, CS50, pero en general,
ciencias de la computación.
Y si ustedes, como yo, perciben a las ciencias de la computación
igual que en la preparatoria, o incluso en la secundaria,
pueden tener la percepción de que esto se basa totalmente en la programación.
Quizás es un poco antisocial.
O tal vez en el laboratorio de computación, bajen la cabeza,
un tipo de codificación para algo que no necesariamente entienden.
Y sí, yo también tenía esa percepción durante el primer año en este curso,
y en general, me atrevo a decir que esta área realmente logró
tener muy mala reputación.
Desde luego, asumí que la mayoría de las personas a mi alrededor
con seguridad sabían más que yo.
Y para mí no fue cierto solo en las CS.
Fue cierto para la mayoría de las clases del catálogo de cursos de Harvard,
con las cuales no estaba familiarizado.
Y entonces, en lugar de eso me incliné hacia lo más cómodo.
Y tomé muchos cursos sobre gobierno, economía e historia
solo porque es lo que comprendía mejor y me gustaba en la secundaria.
No me encantaba, pero era conocido y estaba en mi zona de confort.
Y fue hasta el segundo año cuando tuve el valor
suficiente para tomar esta clase, CS50.
Y solo lo hice porque mi profesor me dio a elegir entre aprobar o suspender,
lo que conocemos como SAT/UNSAT.
Y eso me permitió sobreponerme a esta especie de barrera mental
que me había impuesto yo mismo por el miedo a reprobar
o simplemente a no hacer las cosas tan bien como estaba acostumbrado.
Así que tuve cuidado de no tomar una clase como esta, hasta entonces.
Y siempre he lamentado no haber explorado esto antes.
Y este curso no tiene por qué ser así.
Tampoco es exclusivo de las CS, pues puede suceder en cualquier ámbito.
Esas fueron las lecciones que aprendí cuando yo era como ustedes.
Y me he sentido más cómodo desde que superé este curso
y me parece inspirador que hoy, el 68 % de los estudiantes en esta sala
y los que estuvieron aquí el año pasado, nunca hayan tomado un curso de CS.
Entonces, si tienen ese modelo mental en donde todos lo que están a la izquierda
y a la derecha seguramente saben más que ustedes, lo más probable es que,
de hecho, no sea así.
Y en CS50 tenemos diferentes vías y tipos de secciones
para los que no se sienten cómodos, para los que se sienten cómodos
y para los que están en algún punto intermedio.
Y no existe una definición formal para estas etiquetas.
Solamente ustedes saben en cuál de ellas se encuentran.
Y si hoy mentalmente tienen un pie fuera del curso,
porque no están realmente seguros de si esto es para ustedes,
probablemente se encuentran entre los que no se sienten cómodos.
Aún así están entre la mayoría, entre el 56 % de los estudiantes del año pasado.
Si por el contrario, han programado
desde que tenían ocho o 10 años,
la edad que sea, pero han sido autodidactas, entonces
quizás tengan muchas deficiencias en sus conocimientos
o realmente no entiendan todas estas formalidades,
Si son de los que averiguan todo, tal vez están entre los más cómodos.
Y si no, tal vez son de los que están en algún punto intermedio.
De modo que en las secciones de CS50 tendremos juntos a estudiantes similares,
con antecedentes y niveles de comodidad parecidos,
para que todos se sientan cómodos al hablar de las cosas, sin saber mucho
de ellas, aprender más e ir más allá.
Porque, en definitiva, el curso se califica y se evalúa al final de forma
manual, con mucho tacto y con respeto a los conocimientos
previos de los estudiantes, o a la falta de ellos.
En realidad, al final del semestre lo más importante
no es tanto dónde finalicen en relación con sus compañeros de clase,
sino dónde terminan en la semana 11, con respecto a dónde se encuentran
hoy en la semana 0.
Y de hecho, gracias a los CS50, a Haley James y a un gran número
de miembros del equipo de CS50, quienes este verano, pasaron
gran parte de su tiempo viajando por el país para traer gente de regreso
al campus, alumnos, antiguos alumnos y personal, quienes alguna vez tuvieron una
conexión al tomar o impartir cursos en CS50.
Y si desean ver las historias de algunos de sus predecesores y de personas que
han encontrado accidentalmente su camino, incluso cuando
encontraron en él los desafíos de las ciencias de la computación,
den un vistazo a esta página que el equipo preparó: project5050.org.
Ahora, el curso en sí no tiene que ver con la programación como tal.
Es, en efecto, una herramienta que utilizaremos.
De verdad, solo se trata de eso.
Y en realidad, eso es lo que son las CS de manera general.
Ya sea que comiencen con el hardware, los gráficos, la teoría o cualquier otro
campo, como la inteligencia artificial, el aprendizaje automático y más allá,
en realidad solo se trata de resolver problemas.
Y lo que encontré desde el principio, y que es realmente genial en las CS,
es que no siempre tienen un fin en sí mismo.
Esta área permite hacer cosas cada vez más interesantes,
más impactantes en las humanidades, las ciencias físicas y sociales, las artes,
en cualquier cosa, porque proporciona un nuevo modelo mental para resolver
mejor y más eficazmente los problemas, cómo pueden resolverlos correctamente,
y cómo pueden, en cierta forma, analizar grandes conjuntos de datos
o resolver problemas que, de otro modo, habrían estado fuera de su alcance.
Entonces, ¿qué significa esto?
¿Qué es la resolución de problemas?
Bueno, quizás podríamos sintetizarlo de manera sencilla
como una enorme caja negra, como una salsa secreta,
en donde van las entradas, a modo del problema que queremos resolver,
y del cual obtenemos las salidas, es decir, las soluciones que queremos.
Entonces, es una forma muy general de describirlo, pero lo que
representamos en esta caja negra son los llamados algoritmos.
En un momento volveremos
a los ingredientes necesarios para resolver problemas.
Pero, ¿de qué manera representamos las entradas y las salidas?
Es posible, incluso si no son expertos en computación y tampoco piensan como uno,
que sepan que las computadoras comprenden un vocabulario muy limitado.
Por ejemplo, ¿cuál es el alfabeto que hablan?, por así decirlo.
Posiblemente ASCII, pero uno mejor.
PÚBLICO: Binario.
DAVID: Binario, binario, bi significa dos, es decir, ceros y unos.
Entonces, mientras los humanos comúnmente usamos decimales,
que significa 10, del 0 al 9, al igual que nuestro alfabeto de letras,
las computadoras, como ya saben, solo utilizan ceros y unos.
Ahora, ¿por qué esto es tan poderoso?
Bueno, tan pronto como tengan al menos dos dígitos en su alfabeto,
pueden comenzar a representar cosas de una manera más poderosa y mucho más
eficiente.
Por ejemplo, en caso de que quisiera contar a las personas en esta sala,
¿a cuántos de ustedes podría contar con solo una mano?
Posiblemente a cinco.
Entonces podría contar a cinco.
Serían uno, dos, tres, cuatro, cinco.
¿Pero saben qué?
Si fuera un poco más inteligente, apuesto que podría usar la misma mano
y contar al menos 32, tal vez a 31 de ustedes.
Bueno, ¿cómo es eso?
Pues justo ahora estoy utilizando el sistema unario, donde uno significa uno.
Entonces solo sería un dígito en este alfabeto, un dedo o ninguno.
No es exactamente lo mismo el cero que el uno,
entonces contamos una persona, dos, tres, cuatro, cinco.
Pero, ¿qué pasa si sustituyo mis dedos de manera tal
que el patrón de los dedos que tengo arriba realmente importe
y no solo la cantidad de ellos?
Entonces tal vez este aún sea 0 y que este ahora sea 1,
y en lugar de que este sea 2, quizás podría ser esto.
Entonces, si mi segundo dedo está levantado, voy a llamarle dos.
Y si mis primeros dos dedos están levantados, podría llamarlos tres.
Si solo este dedo está levantado, de un modo un poco ofensivo,
podría llamarle cuatro y luego cinco,
y luego se vuelve doloroso,
seis, siete.
Y lo que estoy haciendo realmente, es contar en binario.
Ahora, esto puede parecer completamente enigmático,
pero ocurre que, tan pronto como se tienen dos dígitos, son suficientes
para representar cualquier cosa de un modo endiablamente eficiente.
Pero, ¿por qué?
Lo más probable es que, si son como yo, seguramente crecieron
con el sistema decimal, el que va del cero al nueve.
Y quizás tuvieron que escribir en el pizarrón algunos símbolos, como el número
123.
Pero, ¿por qué pensamos en eso como el número 123?
En realidad solo se trata de un bonito arreglo de símbolos o glifos
en la pantalla, al que atribuimos algún tipo de propiedad matemática
cuyo significado es,
123.
Pero en realidad solo fue que alguien dibujó símbolos en la pantalla.
Bueno, si ustedes son como yo, y regresamos a la escuela primaria,
probablemente aprendieron que el número que está aquí, a la derecha
está en lo que llamamos, ¿en qué lugar?
El de las unidades, ¿correcto?
De modo que si quisiéramos etiquetar estas cosas,
deberíamos poner aquí las unidades y desde luego, el lugar para las decenas
y el lugar de las centenas, quizás el de los miles, diez miles y así sucesivamente.
Así que como base, hemos tenido este tipo de modelos mentales.
Y tengan en cuenta que luego se vuelven potencias de 10.
10 para el 0 es 1.
10 para el 1 es 10.
10 para el 2 es 100, y así sucesivamente.
Ese es el patrón, incluso si su maestro en la primaria no
les habló en ese momento sobre los exponenciales.
Entonces, ¿por qué este número es 123?
Bueno, es porque tenemos un uno en la columna de las centenas,
eso significa 100 veces 1.
Tenemos un dos en la columna de las decenas
y tenemos un tres en la columna de las unidades.
Estos.
Y desde luego, si ahora nos ponemos a hacer aritmética,
es decir, 100 más 20 más 3, evidentemente es igual a 123.
Y actualmente todos, sin lugar a dudas, lo damos por hecho.
Cuando ven un número, matemáticamente saben qué es.
Pero las computadoras trabajan de la misma manera.
Entonces, incluso si nunca han pensado en ustedes mismos como expertos en
computación, o en realidad no tenían idea de lo que significa
hablar solo con ceros y unos, lo único que deben hacer
es actualizar los lugares.
En lugar de las potencias de 10, es decir los decimales, usaremos el número dos para
potencias binarias.
Así que ahora tendremos 2 a la 0, 2 a la 1, 2 a la 2,
2 a la 3, con el mismo concepto.
Solo se trata de una base diferente.
Nuestra modificación tiende hacia el 2.
Y ahora tenemos lugares como este,
1, 2, 4, y si continuamos así, 8, 16, 32, 64 y así sucesivamente.
Entonces, ¿qué número binario aparece en la pantalla, si lo convierten
mentalmente a decimales?
Solo es el número uno, ¿correcto?
Porque tenemos un 1 en las unidades y luego un cero en los demás sitios.
Entonces, 1 por 1 es igual a 1.
Ahora, si utilizo el unario o mis manos, de la manera tradicional, el número dos
estaría aquí, donde ponemos nuestros dos dedos arriba.
Pero si no tratamos de utilizar patrones ni cantidades.
Sino más bien el binario, ¿cómo podría representar el número dos?
010.
Lo cual sería equivalente a levantar solo mi dedo índice.
Y si quiero contar hasta tres, ahora necesito añadirle un 1 a la mezcla.
Y lo agrego en las unidades.
Y si ahora comienzan a visualizar esto, es como
uno de esos relojes viejos, que había en la escuela, en los que
las manecillas giran hasta dar la vuelta.
Es como si los unos dieran una vuelta y se convirtieran en ceros
y los ceros se convirtieran en unos.
Y después tendremos cinco y luego seis y luego siete.
Y entonces, ¡diablos!, ¿qué hace una computadora para contar hasta ocho?
Claro, solo necesitamos añadir otro lugar, ¿cierto?
Es como nosotros, los humanos, que no tenemos un número infinito de números
cuando escribimos algo, de alguna manera nos detenemos
cuando no es necesario y todo lo que necesitamos es otro bit.
Solo tenemos que añadir a la izquierda otro 0 o un 1, específicamente un uno.
Entonces todos estos unos pueden convertirse en ceros.
Y podemos hacer esto de modo infinito.
Pero, ¿de dónde provienen estos bits?
Todo esto es muy abstracto y solo son imágenes en una pantalla.
Bueno, resulta que tenemos un ingrediente físico
en todas nuestras computadoras.
Quizás nuestra computadora sea portátil, de escritorio o nuestro celular.
A fin de cuentas todos estos dispositivos funcionan, ya sea con
baterías o mediante un cable conectado a la pared, del cual obtienen electricidad.
E incluso si estamos poco familiarizados con la electricidad,
probablemente sabemos que hay algo como pequeños electrones que fluyen.
Entonces, existe algún tipo de recurso físico que puede o no fluir.
Podemos encenderlos o apagarlos.
Bueno, al igual que las lámparas que tenemos aquí,
tenemos tres lámparas que, desde luego, están conectadas a la electricidad.
Entonces tenemos alguna entrada física.
Y lo que hago ahora es ponerlo en práctica en mi propia computadora
usando estas simples lámparas.
Si quiero representar algún valor, alguna entrada o salida, OK, aquí está el cero.
En binario esto es cero.
Solo necesito dejar tres lámparas apagadas.
Si lo que quiero es representar un uno, necesito encender esta.
Y ese es ahora el lugar de las unidades.
Si lo que quiero es representar al dos, solo necesito encender esta lámpara.
Si lo que quiero es representar al tres, también encendemos esta.
Si lo que quiero es representar al cuatro, ¿qué es lo que ocurre?
5, 6, 7, y luego, por supuesto, necesitamos algo para el 8,
si lo que queremos es apagar estas y representar cuatro bits juntos en total.
Y eso es lo que pasa dentro de nuestros teléfonos y computadoras.
Actualmente los teléfonos, las computadoras y demás dispositivos
tienen unos interruptores muy pequeños, llamados transistores,
que se encienden o se apagan.
Y eso es todo lo que necesitamos si tenemos recursos como la electricidad
para almacenar la información.
Solo necesitamos una gran cantidad de interruptores y una gran cantidad
de lámparas, mucho más pequeñas, para representar la información.
Pero las computadoras, claro está, pueden hacer mucho más que representar números.
¿Qué hay de las cartas, los correos electrónicos y cosas por el estilo?
Bueno, por eso necesitamos algo que nos permita decidir,
como humanos, cómo interpretaremos cosas como estas lámparas.
En ciertos contextos, como el de una calculadora, pueden representar números,
números decimales, o lo que sea.
Pero en un programa de correo electrónico,
como Microsoft Word o Google Docs,
probablemente deseamos que estas lámparas o los transistores
de las computadoras, no almacenen solo números, o de lo contrario
solo podríamos hacer matemáticas.
Nosotros queremos que guarden letras, oraciones, párrafos y cosas así.
Entonces necesitamos contar con algún tipo de mapeo.
Y lo haremos de la siguiente manera.
ASCII, el cual solo es un acrónimo que describe
un mapeo de números a letras, ¿pero saben qué
decidimos hace años los humanos?
En el contexto donde necesitamos letras,
almacenaremos solo un patrón de bits igual al número 65,
si queremos la letra a.
Un patrón de bits igual al número decimal 66,
si queremos almacenar el número b.
Avanzamos rápidamente hasta la h y la i.
Si queremos almacenar la h o la i, 72, 73, y solo esa cantidad de bits.
Y no me interesa más esta historia, ni cómo representamos el 65 o el 73.
Lo único que quiero es que sepamos que, de alguna manera, con las lámparas
en el escenario, los transistores en mi teléfono o con cualquier dispositivo,
podemos abstraernos de esos pequeños detalles.
De hecho, no pasaremos demasiado tiempo
después de hoy, hablando sobre el binario en CS50, porque aquí
conceptualmente, tenemos electricidad.
Además de eso, podemos construir la noción de binario, los ceros y unos
y una vez que salgamos de esta convención
podemos empezar a hablar de las letras de un alfabeto.
Pero esta no es la única cosa de la que podemos hablar,
también podemos hablar sobre los gráficos, los videos y todas estas cosas
que damos por hecho estos días.
Por ejemplo, y solo para recapitular, ¿cuál sería el mensaje
que tengo codificado ahora en la pantalla?
PÚBLICO: Hi.
DAVID: Sí, dice Hi, porque como dije hace un momento, el 72 y el 73
son los números que inventamos hace años los humanos para representar HI.
En realidad no sé qué significa el 33.
Deberían decirme qué es o buscarlo.
Resulta que es el signo de admiración, porque los humanos decidieron
expresar también en códigos numéricos todos los símbolos de un teclado.
Lamentablemente, en ese entonces no fueron muy astutos.
Solo usaron 7 bits en total, y más tarde algo parecido de 8 bits.
Pero aún así, aún cuando eso nos da más de 200 valores posibles, 256,
existen muchos idiomas que no son como el alfabeto inglés,
Idiomas asiáticos y similares, que tienen muchos, muchos más
símbolos que se pueden expresar con tan solo siete u ocho bits.
Así que ahora ASCII fue reemplazado por algo llamado Unicode.
En resumen, los humanos comenzaron a resolver problemas que en principio
surgieron por no anticipar, necesitar o querer valores más grandes.
Pero en otro contexto, como Photoshop o cualquier programa de gráficos,
podemos ver el mismo patrón de bits,
72, 73, 33.
Pero en estos programas, ellos saben cómo interpretar esos números
así como cierta cantidad de color.
Si alguna vez han oído hablar de RGB,
rojo, verde, azul, son solo un acrónimo que
describe cómo podemos mezclar tres colores diferentes
y llegar al alma de la pintura, o dicho de forma más técnica y sencilla,
se combinan estos tres colores y se obtiene cualquier color del arcoiris.
Entonces cada número que mencionaré puede ir del 0 al 255 y del 72 hasta el 255.
Es como una cantidad mediana de rojo.
También tenemos una cantidad mediana de verde y solo un poquito de azul.
Y si combinamos estos tres colores, mezclándolos
en un solo punto o píxel, como se le llama en computación,
obtendremos esta especie de sombreado en amarillo oscuro.
Pero en el contexto de Photoshop, o de algún programa de gráficos,
los mismos tres patrones de bits se interpretarían de esta manera.
Y ocurre lo mismo si hablamos en términos de bits individuales,
lo cual no es del todo útil.
Con un solo bit, lo más que podemos contar es el uno.
Así que los humanos unificaron hace tiempo la nomenclatura del byte, B-Y-T-E,
en solo 8 bits.
Y si alguna vez oyeron hablar de kilobytes, megabytes, gigabytes,
terabytes y términos similares, son solo múltiplos del mismo,
que por lo general tienen una magnitud de 1000 o 1024, o más.
Entonces, con solamente tres bytes, es decir 24 bits, podemos
representar letras, números y similares.
Y a fin de cuentas solo son ejemplos de una abstracción.
Y son conceptos que tendremos presentes, no solo en este curso,
sino en general en las ciencias de la computación, considerando
ideas muy simples, que a primera vista no parecen ser interesantes.
Pero en cuanto las usemos como ingredientes para resolver problemas,
reutilizaremos dicha herramienta para construir algo más interesante,
y la reutilizaremos para construir algo aún más interesante,
incluso cuando comencemos a desarrollar aplicaciones
y resolvamos problemas que de verdad nos preocupen,
dando por hecho que las personas que nos precedieron
resolvieron muchos de esos detalles menores de implementación.
¿Qué hay dentro de esta caja negra?
Es lo que llamamos algoritmos.
Si les parece familiar, ¿qué es un algoritmo?
Es una palabra muy elegante, pero es algo muy sencillo.
¿Alguien sabe qué es un algoritmo?
PÚBLICO: Son instrucciones paso a paso.
DAVID: ¡Exacto! Solo son instrucciones paso a paso para resolver un problema.
Eso es todo.
Eso es un algoritmo, las instrucciones paso a paso para resolver algún problema.
Entonces, ¿cuál sería un problema que nos gustaría resolver?
Bueno, me acuerdo de...
Recuerdo que en quinto grado
mi profesora trataba de enseñarnos,
tan eficazmente como podía, a seguir instrucciones correctamente.
Y en ese momento se volvió un completo desastre.
Pero con este ejemplo siempre me acuerdo de su demostración,
pues viene al caso, aunque ella no utilizó
esa palabra para dar una idea sobre el pensamiento computacional,
o para pensar como una computadora, por así decirlo,
o con lo cual trataremos de resolver algo correctamente.
Pero para ello necesitamos dar instrucciones muy precisas.
Aunque es más fácil decirlo que hacerlo.
Y de hecho, para representarlo, gracias al equipo tenemos aquí un plato,
tenemos un paquete de pan,
un frasco de deliciosa crema de cacahuate Skippy
y un frasco con mermelada de uva concordia, de Smucker's,
también, como inevitable necesidad, una gran cantidad de toallas de papel
y este cuchillo.
Entonces propondré esto solo por un momento.
Jugaré el papel de una computadora, o quizás
el de un robot que va a desarrollar un algoritmo,
y ustedes serán el programador, la persona que me dará las instrucciones
para que pueda resolver el problema.
Y el problema aquí será desarrollar algo, quizás no les sorprenda,
un sándwich de crema de cacahuate y mermelada, prepararlo es fácil e intuitivo
si crecimos comiendo estas cosas,
pero si nunca hemos pensado cómo enseñar a alguien más a prepararlo
y que ese alguien no es tan... comprensivo como otro ser humano,
pues los humanos tenemos convenciones para leer entre líneas,
pero las computadoras no pueden hacer eso.
Ellas solo harán lo que les digamos que hagan.
Y por ello, en cierto modo, son menos poderosas que nosotros, los humanos.
Entonces, ¿cuál es el primer paso para preparar con estos ingredientes,
estas entradas, un sándwich de crema de cacahuete y mermelada?
PÚBLICO: Abre la bolsa de pan.
DAVID: Escuché, abre la bolsa de pan.
PÚBLICO: Así no.
DAVID: Bueno, tal vez no era lo que tenían en mente.
Pero está bien.
La bolsa está abierta.
Entonces, ¿qué podría ser más preciso para el paso dos?
PÚBLICO: Toma dos rebanadas.
DAVID: Díganlo de nuevo.
PÚBLICO: Toma dos rebanadas.
DAVID: Tomo dos rebanadas.
OK.
PÚBLICO: Pon las dos rebanadas en el plato.
DAVID: Pongo dos rebanadas en el plato.
PÚBLICO: Tira el cuchillo.
PONENTE 1: Tiro... ¿qué?
¿Tiro el cuchillo?
PÚBLICO: [INAUDIBLE]
DAVID: OK.
PÚBLICO: Abre la mermelada.
DAVID: Abro la mermelada.
OK.
PÚBLICO: Toma el cuchillo.
DAVID: Tomo el cuchillo.
PÚBLICO: Mete el cuchillo en la mermelada.
DAVID: Meto el cuchillo en la... ¡oh!
¿Qué?
PÚBLICO: Por el otro extremo.
DAVID: Oh, gracias.
Bien.
Toma el cuchillo por el otro extremo.
Alguien de más atrás, ¿quizás?
PÚBLICO: Mete el cuchillo en la mermelada.
DAVID: Meto el cuchillo en la mermelada.
¿Cómo?
PÚBLICO: Sácalo.
DAVID: Lo saco.
OK.
¿Otra vez?
PÚBLICO: Mete el cuchillo en la mermelada.
DAVID: Meto el cuchillo en la mermelada.
Aw.
Cucharéalo.
PÚBLICO: Sí.
Ponlo sobre el pan.
[RISAS]
DAVID: OK, vamos a medio camino.
¿Y ahora qué?
PÚBLICO: Esparce la mermelada con el cuchillo sobre el pan.
DAVID: Esparzo la mermelada con el cuchillo sobre el pan.
PÚBLICO: ¡De modo uniforme!
DAVID: Oh, de modo uniforme.
Tengamos cuidado aquí.
OK, OK.
¿Ahora?
PÚBLICO: Haz con la crema de cacahuate, lo mismo que con la mermelada
sobre la otra rebanada de pan.
DAVID: OK, entonces, creo que primero hicimos esto.
PÚBLICO: Y esta vez no le pongas tanta crema de cacahuate.
DAVID: Hicimos esto, después hicimos aquello.
Entonces... oh.
Bueno, me tomaré algunas libertades.
OK, y ahora ponemos esto de nuevo.
PÚBLICO: Cucharéalo un poco hacia afuera.
DAVID: Esta vez escuché: "Cucharéalo un poco hacia afuera".
PÚBLICO: Sobre la otra rebanada de pan.
DAVID: Sobre la otra rebanada de pan, gracias.
PÚBLICO: Espárcelo de modo uniforme.
DAVID: Lo esparzo de modo uniforme.
La próxima vez háganme usar mi mano derecha, por favor.
OK, y...
PÚBLICO: Baja el cuchillo.
Pon el lado con mermelada sobre el de crema de cacahuate.
DAVID: Gracias.
Pongo el lado con mermelada sobre el de crema de cacahuate y...
¡Delicioso!
OK.
Muchas gracias.
[APLAUSOS]
Este fue un ejemplo tonto, pero dense cuenta de cuántas posibles
ambigüedades o escenarios hubo en algo tan simple,
y que no anticiparon.
De hecho, entre las cosas que haremos hoy,
ya que empezamos a formalizar estas ideas con un código, un código de programación,
es descomponer los problemas en las partes que los conforman,
y teniendo en cuenta lo que sucedió, ¿qué debo hacer si pasa esto?
¿Qué debo hacer si pasa esto?
Porque, a menos que anticipemos las tonterías
como las que estuve actuando allí, de manera deliberada,
¿quién sabe lo que una computadora podría terminar haciendo?
Después de todo, es probable que todos en esta sala,
como yo, hayan visto una pelota de playa que gira o un reloj de arena
cuando su computadora, ya sea su Mac o su PC, se pasma o se bloquea.
Y casi siempre esto ocurre como resultado de algún error humano.
Alguien en Google, Microsoft o Facebook, o en cualquier parte, cometió algún error.
Ellos no anticiparon alguna situación,
no anticiparon que escribiríamos una palabra,
no anticiparon que ejecutaríamos 20 programas al mismo tiempo,
tampoco anticiparon algunos escenarios.
Y por eso, el comportamiento de la computadora no se definió eficientemente.
Y entonces se produjo un resultado incorrecto.
¿Qué podemos pensar al respecto?
¿Qué sería ideal si de algún modo,
si de algún modo formalizáramos esto mediante un código real?
Y lo haremos con un problema de la vieja escuela,
un problema que es mucho más digital en estos días,
pero que aún está presente.
Ya sea que tengamos un teléfono Android, un iPhone, o cualquier otra cosa,
probablemente incluya una pequeña agenda de contactos o direcciones.
Y tendrá una gran cantidad de nombres,
tal vez ordenados alfabéticamente por nombre o apellido,
también muchos números de teléfono y quizás correos electrónicos,
entre otras cosas recientes.
Pero la representación física de ese icono en nuestros teléfonos
es esta cosa vieja, una agenda telefónica.
Y si quisiera buscar a un viejo amigo, por ejemplo, Mike Smith, ¿cómo podría
encontrarlo en esta vieja agenda telefónica?
Bueno, al igual que en forma digital, solo tengo que
desplazarme por la lista y buscarlo.
Busco en la primera página, miro hacia abajo, no lo veo, paso a la otra,
lo busco, no lo veo, paso otra página, lo busco, no lo veo y así sucesivamente.
¿Es correcto este algoritmo?
PÚBLICO: Sí.
DAVID: Sí, es correcto.
Esto es algo tonto, ciertamente, porque tardaremos
una eternidad para hallar a Mike, hay casi 1000 páginas aquí,
pero es correcto.
Es el equivalente a un tipo de desplazamiento, lento y metódico
en nuestra lista de contactos, sin el lujo de la búsqueda automática
o la función autocompletar y similares.
Bueno, podríamos hacerlo mejor.
En la primaria generalmente aprendemos a contar de dos en dos.
Entonces podríamos contar 2, 4, 6, 8, 10, 12.
Ahora puedo revisar la agenda mucho más rápido.
Pero, ¿es correcto este algoritmo?
PÚBLICO: No.
DAVID: No, ¿por qué?
PÚBLICO: Puedes pasarlo de largo.
DAVID: Claro, puedo pasarlo de largo, ¿cierto?
Ya que Mike, por casualidad, podría estar hecho sándwich,
sin doble sentido, entre las dos páginas que volteo rápidamente
y podría pasarlo de largo.
Pero al menos puedo arreglar este error o "bug", por así decirlo.
Un bug es un error en un programa, un error completamente humano.
Si llego hasta la letra t, la t está después de Smith.
Tal vez pueda retroceder al menos una página y arreglar ese error.
Retroceder me toma algo más de tiempo, pero si lo hago bien,
solo me costará algo así como una vuelta adicional a la página.
Es mejor y es lo correcto.
Pero obviamente, nadie en esta sala buscará a Mike Smith
comenzando por la primera página.
¿Desde dónde empezarían a buscar?
Desde la mitad, tal vez cerca del final, porque saben dónde está la S.
Entonces, abrirán la agenda por la mitad.
Buscarán hacia abajo y verán la sección M.
Así que no tuve que ir tan lejos.
Pero lo genial de esta vieja tecnología,
es que ahora podemos romper este problema en dos partes, arrojar la mitad
y, en esencia, quedarnos con el mismo problema, pero en una versión
más pequeña.
Quizás ahora no sean 1000 sino 500 páginas, pero es el mismo problema.
Y puedo aplicar la misma lógica, ir hasta la mitad, mirar hacia abajo.
Esta vez me fui un poco más lejos, a la sección T.
Pero puedo romper de nuevo casi una cuarta parte de este problema,
lo cual me deja ahora con un tamaño total de, quizás 250 páginas
después de dividirlo a la mitad dos veces.
Y puedo repetirlo, una y otra vez.
Mientras Mike continúe en la agenda telefónica,
al final, lo encontraré una vez, y solo una vez,
en la última página de la agenda y entonces podré llamarlo.
La verdadera pregunta es, ¿hasta qué punto fue lo mejor?
Fue algo ineficiente.
Aquí, en el mundo analógico, no podemos solo deshacer algo.
Pero pensemos en qué tan bueno fue ese algoritmo,
el que sin duda damos por hecho y con el que debimos comenzar.
Bueno, aquí tenemos una gráfica simple, y sobre el eje horizontal, o x,
tenemos el tamaño del problema,
es decir, la cantidad de páginas de la agenda, como queramos medirlas,
y luego, sobre el eje vertical, o y, el tiempo para resolverlo,
quizás por el número de segundos, o las veces que damos vuelta la página,
como queramos contar los pasos,
es una relación de tamaño y tiempo.
Y en el primer algoritmo dibujaré
algo como esto, una línea recta en rojo,
a la cual llamaré n, donde n equivale al número de páginas
que hay en la agenda.
Los especialistas en sistemas usan la n como una variable, solo es un símbolo.
Y esta es una línea recta por la siguiente razón.
Si la agenda aumenta el próximo año, y un poco más el próximo año,
en una página, eso significa que tendríamos
que dedicar un paso más buscando a Mike.
Así, la pendiente de esta línea es lineal.
Existe una relación uno a uno entre el número
de páginas Verizon, o de la compañía telefónica, y el número de páginas
a las que debo dar la vuelta.
Aunque el segundo algoritmo también es una línea recta,
se dibuja más abajo, en amarillo.
Y 2 veces n significa que es el doble de rápido o que equivale a la mitad del tiempo
porque para un problema de cierta magnitud, si siguen mi mano derecha hacía
arriba, la línea amarilla debería estar debajo de la línea roja
porque voy muy rápido por la agenda, dos páginas a la vez.
Así que debe tomar la mitad del tiempo.
Pero si uso el primer algoritmo, tengo que recorrer todo el camino
hasta la roja, la cual mide el número de segundos.
Pero el tercer algoritmo tiene una forma completamente diferente.
Y aquí es donde aparece la belleza de las ciencias de la
computación y de los algoritmos.
Al final no se vuelve una recta.
Parece como si disminuyera gradualmente.
Pero hará esto para siempre.
Se trata de un aumento tan lento en el tiempo,
que ni siquiera podemos verlo, aunque la pantalla fuera más amplia.
Llamamos a esto logarítmico, log n, pero hablaremos de eso más tarde.
Pero la forma es completamente diferente.
Es una línea curva.
Y lo más importante de ello, es que podemos asimilarlo más fácil
e intuitivamente.
Si Verizon duplica el tamaño de su agenda telefónica el próximo año
porque tal vez Cambridge y otra ciudad
se junten en una sola agenda, no habría problema,
porque si Verizon duplica el tamaño de su agenda el próximo año,
¿cuántas vueltas de página más necesitaría para encontrar a Mike?
PÚBLICO: Solo una.
DAVID: Solo una, ¿cierto?
Porque solo divido el problema por la mitad una vez más, no es gran cosa,
en lugar de hojear 500 o 1000 páginas adicionales.
Y entonces esta intuición con la que entraron hoy a Sanders,
es probable que puedan aprovecharla para resolver problemas más efectivamente,
siempre y cuando empecemos a notar los patrones y el tipo de entradas útiles
con las cuales podamos resolver problemas.
Pero necesitamos empezar a formalizar el proceso.
Debemos expresarnos menos naturalmente que como lo hicimos
con la crema de cacahuate y la mermelada.
Entonces, ¿cómo podríamos expresar con mayor precisión
ese algoritmo con la agenda telefónica para el cual, sin embargo,
tenemos una comprensión intuitiva?
Bien, empezaré a contar desde cero, solo porque los programadores
y los especialistas en sistemas tienden a contar desde cero,
porque es como si todas las lámparas estuvieran apagadas.
Así que mejor comenzamos desde allí.
Y luego, el paso cero sería, toma la agenda telefónica.
Es una especie de acción.
Haz esto.
El primer paso es, abre la agenda telefónica por la mitad.
Eso es muy parecido a lo que hice hace un momento.
El segundo paso es, ve los nombres,
otra acción o verbo
Paso tres, si Smith está entre los nombres.
Se trata de una construcción diferente.
Y la palabra clave aquí va a ser "if".
Es una pregunta que nos hacemos a nosotros mismos.
Es como una especie de encrucijada.
Si Mike está entre los nombres, en esa página, entonces llamamos a Mike.
Y puse una sangría deliberadamente, porque en muchos lenguajes informáticos
la sangría significa, lógicamente, que solo debemos seguir
el paso cuatro, si la línea tres es verdadera.
O si la respuesta a esa pregunta es sí.
"Else", "if", Smith aparece antes en la agenda, a la izquierda, seguimos el paso seis,
abre la mitad de la mitad izquierda de la agenda.
Aquí fue cuando la rompí por la mitad, la tiré lejos y luego lo repetí
en la mitad izquierda.
De lo contrario, si Smith, oh, perdón.
Entonces vuelve al paso dos, un paso clave.
Ahora que he dividido el problema por la mitad
y estoy buscando en la mitad de la mitad izquierda,
el problema básicamente es el mismo, tal como lo dije antes.
Se trata de hacer lo mismo, pero con un problema más pequeño.
Y lo bello de este algoritmo es que es recurrente,
por así decirlo, como veremos más adelante,
Seguimos haciendo lo mismo, y lo mismo y lo mismo,
pero dado que el problema sigue haciéndose más pequeño,
al final no haremos esto para siempre.
En algún momento encontraremos la respuesta que buscamos.
Y así volveremos al paso dos.
Paso ocho, else, if, Smith se encuentra adelante en la agenda, a mi derecha,
abre la mitad de la mitad derecha de la agenda
y vuelve de nuevo al paso dos.
Else... ¿cuál es el cuarto escenario a considerar?
PÚBLICO: [INAUDIBLE]
DAVID: Sí, ¿qué pasa si Mike no tiene teléfono?
No estaría en la lista.
Sería mejor prevenir que mi programa se bloquee o mi computadora se pasme,
porque al parecer no sabe qué hacer si Mike no está.
Así que pondré quit en este caso particular.
Y ahora dejaremos esto mientras resaltamos
en amarillo estos verbos clave o acciones importantes.
Desde ahora llamaremos a las palabras en amarillo, funciones,
para hablar en lenguaje de programación.
Estas son acciones o verbos y se los mostraré, pero en inglés
porque no hay ningún lenguaje aquí.
No se trata de algún vocabulario formal que estemos presentando.
Solo es mi forma más clara de expresar ese algoritmo.
Y a eso se le llama pseudocódigo.
Es similar a la sintaxis del inglés que cualquiera en la sala debería,
con algo de suerte, ser capaz de entender si es
amigable, limpia y precisa.
Pero hay otro tipo de palabra clave aquí
y es el if y el else, el if y el else, el if y el else.
Son las palabras clave que los lenguajes, a menudo,
usan para representar estas encrucijadas, ve a la izquierda,
ve a la derecha, ve aquí, ve allá, haz diferentes cosas.
Y cada una de estas decisiones, por así decirlo, se basa en la respuesta
a una pregunta.
Y llamaremos a estas preguntas expresiones Booleanas, se llaman así
desde hace años, en honor a Bool.
Y una expresión booleana solo es una pregunta con una respuesta, sí o no,
o dicho más técnicamente, una respuesta de falso o verdadero.
Noten el hecho de que todo cae en cestas con dos opciones,
sí o no, verdadero o falso,
y significa que podemos usar esas lámparas a nuestro favor.
Quizás apagado sería falso, o no.
Quizás encendido sería verdadero, o sí.
Podemos representar con una lámpara cualquiera de las respuestas
a estas preguntas.
Y son expresiones booleanas.
Por último, tenemos lo siguiente,
vayamos al paso dos, que es quizás el más explícito.
Porque induce a algún tipo de bucle o ciclo.
Haz algo una y otra vez.
Y todas estas ideas, funciones, condiciones, expresiones booleanas, bucles
y más, estarán presentes en varios de los lenguajes que exploraremos
a lo largo del semestre.
Pero, por supuesto, esto en sí mismo aún no es un código real.
Y hoy, dentro de un rato, nos sumergiremos
en un verdadero código de programación, aunque gráficamente y con un lenguaje
llamado Scratch, y para la próxima semana seguiremos con un lenguaje
de programación llamado C.
Pero antes de eso, haré un par de presentaciones.
Detrás de CS50, sus lecciones, secciones, horas de oficina y más,
hay todo un equipo formado por casi 100 colaboradores cada año,
que están aquí para lograr que este curso sea satisfactorio para ustedes
para que, independientemente de sus conocimientos previos o la falta de ellos,
ustedes también tengan éxito, en especial si se encuentran entre los del 68%.
Y permítanme invitar a María, Brian, Doug y Rob
quienes les dan la bienvenida a nombre del equipo del curso.
DOUG LLOYD: Buenos días a todos.
Mi nombre es Doug Lloyd.
Soy el tutor principal y administrador del curso.
Hace ya 12 años me senté, por así decirlo, en el mismo lugar que ustedes.
Estaba en el Lowell Lecture Hall, justo al otro lado de la calle.
Yo era de los menos cómodos.
Nunca antes había programado algo en mi vida.
Entonces tomé el CS50.
Eso cambió por completo mi forma de pensar en la resolución de problemas.
Poco después cambié al CS de nivel avanzado,
y junto con David, he sido parte del equipo desde hace 11 años.
Así que es genial estar aquí una vez más.
Gracias a todos por estar aquí.
MARÍA: Hola a todos.
Mi nombre es María.
Estudio el último año, vivo en Cabot y este es mi cuarto año en el curso.
Lo tomé como principiante, me la pasé genial, y este mi tercer año al frente.
Y sin duda me ha encantado.
El equipo es increíble.
Trabajar con todos ha sido maravilloso y no puedo
esperar para tener un último curso increíble con ustedes, chicos.
BRIAN: Hola a todos, soy Brian.
Soy el asistente principal del curso.
Estudio el tercer año, vivo en Winthrop y tomé el curso cuando era principiante,
hace ya dos años.
Estoy muy contento de que estén aquí y en verdad deseo
que tengamos un semestre fantástico y trabajar con todos ustedes.
ROB: Hola, chicos.
Soy Rob.
Soy estudiante de cuarto año de doctorado, vivo en Thayer
y este es mi octavo año en el curso.
Creo que cada año el curso se pone mejor.
Durante el verano pusimos mucho empeño en el curso,
construimos nuevas herramientas y modificamos el temario.
Realmente creo que ustedes, chicos, van a disfrutarlo.
[APLAUSOS]
DAVID: Muchas gracias.
Nuestra tradición en CS50, es terminar la primera semana con un pastel o cupcakes.
Así que después de la lección de hoy son bienvenidos a acompañarnos
en el transepto, para que conozcan a las demás personas que forman el equipo.
Pero primero, y antes de hacer la transición a uno de estos primeros
lenguajes de programación, podríamos atenuar las luces
y mostrar algunas imágenes, no solo de la estructura de soporte del curso,
sino también sobre su cultura o la comunidad, lo cual es algo en lo que
nos hemos centrado recientemente, para que los estudiantes del curso
sientan, que no solo es una oportunidad de tener una introducción a las ciencias
de la computación, también es una introducción a Harvard
y, como han visto en Yale y más allá, también es una comunidad de apoyo,
así que pueden apoyarse mutuamente para afrontar los problemas de la semana,
así, al salir, habrán tenido una experiencia similar y compartida.
Esta es la comunidad de CS50.
[MÚSICA DE FONDO]
CANTANTE: [INAUDIBLE] Stop rocking the beat.
Come on!
DAVID: Bien, entonces,
para ser breves, así es como se verá un código.
Y francamente, es sumamente enigmático y lleno de
distractores, como pueden ver, con todos esos puntos, comas, llaves,
paréntesis y cosas similares.
Y francamente, este tipo de distracciones sintácticas
tienden a interponerse en el camino del aprendizaje, de lo que realmente
es el interesante contenido intelectual de la programación y la informática,
en términos generales.
Así que hoy comenzaremos, antes de la transición de la próxima semana,
con ese lenguaje Scratch, un lenguaje adorable que
se inventó calle abajo, en MIT Media Lab,
hace algunos años, y que increíblemente tiene todos los conceptos que vimos
hace rato, con lo de Mike Smith, la crema de cacahuate y la mermelada,
y aún más ideas que hoy nos permiten programar
arrastrando y soltando las piezas de un rompecabezas,
y que solo se entrelazan si hay un sentido lógico al hacerlo.
Y casualmente, como habrán visto en la comunidad de CS50,
esta semana celebramos en el Día del acertijo de CS50,
una oportunidad, no para resolver problemas con computadoras y programas, sino para
formar equipos, de dos, tres o cuatro, con sus colegas, al otro lado del río
en el iLab, el Día del acertijo de CS50.
Cuando salgan, tomen una de las invitaciones. El objetivo
es enviar el mensaje de que las ciencias de la computación no se trata
de programación, sino de resolución de problemas,
y en este caso, también habrá pizza y premios.
Entonces, esto es Scratch.
Y lo bueno de Scratch es que por medio de este lenguaje
podemos descomponer programas cada vez más difíciles
en tan solo un par de piezas de rompecabezas.
Veamos la comparación.
Si retrocedemos un momento, tenemos
este programa en C, un lenguaje de programación bastante viejo.
Pero es bueno porque es bastante pequeño.
En poco tiempo aprenderemos casi cada aspecto de este lenguaje.
Pero, ¿qué creen que hace?
En especial si ustedes nunca han programado
y no reconocen algunas de las palabras que están en la pantalla,
¿Cuál comando operativo tal vez les parece familiar?
¿Qué tal prints?
Técnicamente es print f, lo cual en realidad no
sé qué significa en este momento.
Pero imprimir suena familiar.
¿Y qué va a imprimir?
PÚBLICO: Hello, world.
DAVID: Tal vez hello, world.
Cuando ejecute este programa en mi Mac o mi PC, es probable que
simplemente imprima, hello, world.
¿Cómo?
No lo sé aún, pero llegaremos ahí.
Pero ahora, el mismo programa en este otro lenguaje,
Scratch, se puede implementar gráficamente arrastrando y soltando dos piezas
de las que Scratch tiene, y que pronto verán como un gato
que dice en la pantalla hello, world, dentro de un globo de caricatura.
Y de hecho, con Scratch podremos explorar todas estas mismas ideas,
funciones, condiciones, expresiones booleanas, bucles,
y muchas otras, como las que veremos de nuevo en C y posteriormente,
durante el semestre, en Python, SQL, JavaScript
y muchos más.
Entonces, empezaremos a explorar de la siguiente manera.
Voy a abrir el programa Scratch.
Está disponible en dos formatos, una versión fuera de línea,
la cual utilizo durante el curso para no tener problemas de wifi,
y también está disponible una versión en línea, en scratch.mit.edu,
que utiizarán para la primera tarea del curso, la serie de problemas cero.
Y así es como luce la interfaz.
La parte superior izquierda, donde está el gato, es el escenario de Scratch.
Este es su mundo bidimensional, en el que se mueve hacia arriba,
hacia abajo, a la izquierda o la derecha.
En el centro hay muchas categorías de piezas de rompecabezas.
Esta de aquí dice, muévete 10 pasos, gira 15 grados y así sucesivamente.
Y en la parte superior hay códigos de colores para otras categorías de
piezas que podríamos utilizar.
Y a la derecha tenemos lo que se llama el área de scripts.
Aquí es donde podemos programar.
Aquí es donde se arrastran y se sueltan las piezas del rompecabezas.
Y aquí abajo, si quiero más de un gato o algún otro personaje
también puedo crear otros sprites o personajes.
Entonces, en este caso, ¿qué hago para programar?
Primero, noten que en Scratch hay una bandera verde y una señal de alto roja.
La bandera verde significa avanzar.
La señal de alto significa detenerse.
Así es como inicio y detengo mi programa, justo arriba de Scratch.
Mientras tanto, si quiero comenzar a programar, haré lo siguiente.
Y sé donde están las cosas porque ya utilicé Scratch antes.
Si hago clic en la categoría Events, noten esta pieza de rompecabezas,
cuando hago clic en la bandera verde.
Puedo arrastrar y soltar esta pieza en cualquier lugar a la derecha.
Y mi programa no hará nada
porque aún no he terminado de crearlo.
Pero si ahora vamos a Looks, una categoría diferente en morado,
podría poner algo como say
y ahora noten que cuando las acerco lo suficiente, son algo magnéticas,
quieren unirse.
Entonces puedo soltarla y después escribir hello, coma, world.
Ahora alejaré la imagen, moveré mi cursor sobre la bandera verde y daré clic.
Y ya escribí mi primer programa.
Ciertamente no es tan complejo.
Todo lo que hice fue arrastrar y soltar un par de gráficos.
Pero lógicamente, hace exactamente lo que le dije que hiciera.
Bien, antes de que sigamos adelante, veamos cómo lucirán
algunos de estos bloques, de modo que tengamos
un modelo mental para todas estas categorías codificadas por colores.
En morado podemos ver funciones, acciones o verbos como los que
vimos en el ejemplo de la agenda telefónica.
Aquí tenemos las condiciones.
Son algunas piezas más, pero cuando se entrelazan se ven muy hermosas.
Y esta es una rama o una condición.
Y noten también que, al igual que en mi programa de texto,
puse sangrías con la tecla de espacio o de tabulaciones.
Esto está un poco separado debido a las envolturas amarillas
que hay alrededor de todas las piezas.
Entonces solo dirá que x es menor que y, si esas piezas naranjas
x y y, a las cuales llamaremos variables, como en álgebra, guardan valores
como uno, dos, tres o cuatro.
En ese caso diremos que x es menor que y.
Mientras tanto podemos anidar estas cosas.
Así que, a pesar de que parecen tener un tamaño fijo,
crecerán para ajustarse a otros bloques si queremos meter más en ellos.
Entonces tendremos una encrucijada de tres vías al combinar estas ideas.
Si x es más pequeño que y, entonces decimos que x es menor que y.
Pero si x es más grande que y, entonces decimos que x es mayor que y.
Además hay un tercer escenario, desde luego, donde x debe ser igual a y.
Así es como lo programaremos.
Solo arrastraremos y soltaremos juntas estas piezas del rompecabezas.
Hablando en términos generales, ¿cómo se llama este bloque verde?
PÚBLICO: [INAUDIBLE]
DAVID: Bueno, la condición con la que técnicamente
llamamos al amarillo que está usando este bloque verde.
PÚBLICO: Booleano.
DAVID: Sí, es una expresión booleana,
y es así porque se trata de una respuesta sí o no, o verdadera o falsa.
x es menor que y, ya sea esto verdadero o falso.
Pero no puede ser ambas.
Y entonces generalmente tendríamos que i es menor que 50.
No tienen que comparar las variables.
Al igual que en matemáticas, podemos comparar números y variables.
Pero aquí es un concepto diferente.
Llamaremos bucle a un ciclo que hace, en este caso,
algo que dura para siempre, por ejemplo, decir hello, world.
O que lo haga un número finito de veces, como decir hello, world 50 veces
y después detenerlo.
Así se podría establecer una variable.
Este bloque naranja establece una variable llamada i por convención, porque i
representa a un número entero.
Lo establece para que sea igual a 0.
Entonces, estas dos cosas son la demostración de una característica
de procesamiento múltiple más poderosa que tienen Scratch y otros lenguajes.
Es una forma elegante de decir que un programa puede escribirse de modo
que haga dos cosas a la vez.
¿Cómo?
Solo se usan dos de estas piezas para que al hacer clic en la bandera verde,
sucedan varias cosas a la vez y soporten nuestros procesos.
Y después hay una función incluso más elegante,
pero relativamente fácil de usar.
Se llama manejo de eventos, y la veremos
cuando presentemos la programación web durante el semestre.
Cuando recibo una transmisión. significa solo eso.
Un sprite, un personaje como un gato, puede emitir un tipo de
susurro a otro sprite en el programa,
y enviarle un mensaje que pueda escuchar, o mejor dicho recibir,
y hacer algo con base en ello.
Entonces, en vez de que su programa haga algo
solo cuando den clic en la bandera verde, pueden hacer
que un sprite le hable a otro y le diga cuándo comenzar,
o algo a lo largo de estas líneas.
Y así, con solo estos principios, seremos
capaces de implementar cualquier número de programas.
Prosigamos y veamos lo siguiente.
Haré que esto sea más interesante y no solo
lo diré en la pantalla.
A continuación reproduciré el sonido miau.
[MIAU]
Con un poco más de volumen.
[MIAU]
Oh, con menos volumen.
[MIAU]
Es adorable.
Es un programa sencillo.
Y si quiero que maulle tres veces,
[MIAU]
solo debo presionar esto tres veces.
Pero puedo hacer algo mejor.
No quiero volver a ejecutar el programa.
¿Cuál es la construcción que me permitiría maullar tres veces?
Sí, un bucle o repetición.
Así que iré directo a control.
Le haré un acercamiento.
Repeat está predeterminado 10 veces.
Así que lo cambiaré a tres.
Puedo arrastrar esto hacía afuera y luego ponerlo dentro.
Observen que quiere conectarse y que crece para ajustarse.
Y ahora puedo dejar que se conecte aquí.
Dejen lo reproduzco de nuevo.
[MIAU]
Hm, ¿qué pasó allí?
Mi primer error.
Es sutil, pero es algo que
hará que nos detengamos, sobre todo si lo hacemos por nuestra cuenta.
Debí pensar más detenidamente en cuáles bloques usar.
La pista se encuentra en la pantalla, aunque es muy sutil.
Mientras acaba, aquí hay un bloque alternativo.
¿Y saben qué?
Aún no sé por qué resultará, pero déjenme hacer lo siguiente
y deshacerme de esto simplemente arrastrándolo.
Veamos si se arregla el problema aún cuando no sepamos por qué.
[MIAU]
No es el sonido natural de un gato, pero se solucionó el error.
En retrospectiva, ¿podemos inferir por qué tenía errores
y en qué consistían?
PÚBLICO: Se reprodujo tres veces al mismo tiempo.
DAVID: Sí, se reprodujo tres veces al mismo tiempo.
En teoría no fue exactamente al mismo tiempo, pero mi Mac
es endiabladamente rápida, ¿cierto?
Con Intel inside tenemos un gigahertz en el CPU,
o cerebro de la computadora, o dos gigahertz.
Eso significa que nuestra Mac o PC puede hacer mil millones de cosas a la vez,
perdón, mil millones de cosas en un segundo, lo cual
es bastante bueno, o dos mil millones de cosas en un segundo,
lo cual es aún mucho mejor.
Entonces, no hay duda de que puede maullar tres veces y que las cosas
solo se tropiezan una con otra.
Pero si usamos el bloque que dice, reprodúcelo hasta que acabe,
entonces podremos escuchar los tres.
Y de hecho, lo podemos hacer mejor
porque eso no sonaba como un gato normal.
Puedo arrastrar este bloque, esperemos un segundo, y veamos
si ahora suena un poco más natural.
[MIAU]
OK.
[MIAU]
No está mal, es totalmente adorable.
Pero, ¿y si ahora queremos agregar algo de movimiento?
Dejen elimino esto.
Y haré un bloque eterno, de modo que no tenga que averiguar
previamente cuánto durará.
Ahora voy a motion y pongo move 10 steps, luego hago clic sobre la bandera verde.
Ah, OK.
Afortunadamente, el MIT se dio cuenta de que esto podría salir mal.
Entonces nos dió suficiente acceso a su cola para tirar de él hacia atrás.
Pero este no es el mejor programa.
Probablemente sería mejor si rebotara en la orilla o reconociera
un detector de colisiones, ¿cierto?
Al parecer vivimos en un mundo donde los autos se conducen solos.
Sería bueno si las cosas,
bueno, tal vez no rebotaran unas con otras,
pero, en general, evitaran las cosas.
Así que está bien.
Tengo el vocabulario necesario para hacerlo.
Dejen hago un acercamiento.
¿Cuál sería la construcción, si quiero resolver esto?
Algo como, si golpea el borde, que dé la vuelta.
Es algún tipo de if, ¿cierto?
Entonces, haré esto a un lado y pondré... oh, OK.
If... ahora debo terminar la oración, y puedo hacerlo rápido
por experiencia previas.
Así que iré a sensing
y luego tomaré esta expresión booleana en azul.
Noten que es demasiado grande, pero crecerá para ajustarse.
Ahora, desde este menú desplegable, puedo hacer esta pregunta.
If touching edge, ¿que quiero que haga?
Tal vez que gire así.
Haré que gire 180 grados y que luego regrese completamente.
Ahora necesito mover esto de vuelta.
De nuevo, parece que no entra, pero crecerá para ajustarse bien.
De lo contrario, avanzará 10 pasos.
Ahora presiono Play.
OK, aún tiene algunos errores, pero al menos es dinámico
y hará esto para siempre.
Ahora podemos desviarnos de este ejemplo intelectual
y hacer algo tonto como esto, solo para conocer sus funciones.
Esto es un micrófono.
Ese era yo grabando "esto es un micrófono".
Aquí vamos.
¡Auch!
OK, así es como luce la palabra "auch" en forma de onda.
Ahora llamaremos a esto "auch".
Y ahora necesito sonido.
Ops... es en scripts.
Sound, play sound, auch... lógicamente.
Entonces, para dar una idea de lo que hará, si toca el borde, dirá "auch",
y dará la vuelta.
Auch.
Tiene una reacción un poco retrasada, pero ahora tenemos
una combinación de ideas diferentes.
Y nos movimos rápidamente más allá de dónde empezamos.
Todo lo que hicimos en un principio, fue decir algo,
entonces movimos al gato,
luego se movió para siempre,
luego se movió para siempre, a menos que tocara los bordes, y en ese caso
debía dar la vuelta.
Entonces, con la construcción de ideas muy simples podemos
construir programas más complicados.
Y vayamos al futuro por un momento, antes de separar
algunas de las funciones más complejas, para echar un vistazo
al primer programa que escribí en el posgrado
cuando Scratch salió a la luz.
Lo llamé Oscar Time porque siempre me encantó Plaza Sésamo.
Y el programa que hice mezcla muchas, muchas, muchas horas
desde que empecé a usar Scratch y muchas de estas mismas ideas.
Y en vez de que yo juegue, tal vez sería más divertido
si alguien más lo hace.
¿Habrá algún voluntario valiente, tal vez allá atrás?
Sí, ¿cuál es tu nombre?
PÚBLICO: Monsi.
DAVID: Monsi, ven aquí Monsi.
Muy bien, denle gracias a Monsi.
[APLAUSOS]
Debes sentirte cómoda apareciendo en Internet,
ya que hay cámaras allá.
Encantado de conocerte.
MONSI: Encantada de conocerte también.
DAVID: Ven aquí.
Así que, notemos que en Oscar Time tenemos una gran cantidad de sprites.
Entonces verán que pasan muchas cosas a la vez.
Noten que no comencé a escribir este programa implementando el juego.
Solo modifiqué sus partes hasta que el resultado de muchas, muchas,
muchas horas después fue el juego que van ver.
Vamos directo a la pantalla completa.
En un momento verás algunas instrucciones en la pantalla
y podrás controlarlo con el teclado.
Arrastra la mayor cantidad de objetos que puedas al bote de basura.
OSCAR: [CANTANDO] Oh, adoro la basura.
Todo lo que sea sucio, inmundo o polvoso.
Cualquier cosa andrajosa o...
DAVID: Muy bien.
OSCAR: [CANTANDO] ...o rancia.
DAVID: Mientras ella juega, noten que algunos de los
componentes básicos son de este programa.
Creo que lo primero que hice cuando implementé
este juego, que se volverá cada vez más y más complejo,
fue descubrir cómo tirar un objeto a la basura, de arriba hacia abajo.
Y es algo parecido a lo que acabamos de hacer con el gato,
aunque de arriba hacia abajo, en vez de izquierda a derecha.
Y después pensé que podría implementarlo en parte de Oscar.
Pero Oscar, en cierto modo, es una simple animación.
No es como un video.
Son como tres imágenes diferentes.
El bote de basura está cerrado,
luego se abre parcialmente,
luego se abre completamente
y aparece él.
Solo son muchas imágenes diferentes, o disfraces, como los llama el MIT,
que se reproducen con medio segundo de separación para crear
la ilusión, como en esos viejos libritos escolares, de que algo
sucede en forma animada. Mientras tanto, él está contando.
Para eso utiliza una variable, una de las piezas naranjas que vimos antes.
Hay un tipo de aleatoriedad
que aparece en los programas, incluido Scratch,
que pueden usar una pseudo aleatoriedad, ciertos valores aleatorios,
de modo que a veces la basura cae aquí o aquí o aquí.
Y muchos videojuegos lo hacen, ¿cierto?
Muchos de los juegos que jugaban cuando eran niños
serían aburridos si hicieran exactamente lo mismo.
Queremos que la computadora o el CPU hagan cosas
un poco diferentes o aleatorias.
OSCAR: [CANTANDO] Ahora mira toda esta basura.
Un reloj que no sirve, un viejo teléfono y una sombrilla rota,
DAVID: Tengan en cuenta que la canción dura tres minutos
y solo hay un error en cierta parte del programa,
fue una auténtica pesadilla depurarlo, tenía que esperar uno o dos minutos
hasta que sucedía de nuevo.
OSCAR: [CANTANDO] Oh, adoro la basura. Todo lo que sea sucio, inmundo o polvoso.
DAVID: Y nunca se detiene.
Felicidades.
Gracias.
Déjame agradecerte con una pelotita para el estrés de CS50,
por lo menos.
Entonces esto es Oscar Time.
Pero lo mejor de esto, además de que es mi, mi... mi bebé,
es que nos da una oportunidad para pensar, cómo podemos crear
algo que se vea complejo y, con suerte, muy divertido al final,
pero distinto de las partes que lo conforman.
Veamos cuáles otros ingredientes tenemos.
Por ejemplo, déjenme mostrarles la oveja.
Este es un ejemplo.
Y como todos los que vimos hoy, se encuentra en el sitio web del curso,
en caso de que quieran reproducirlos.
En esta ocasión cambié al gato por una oveja.
Si presiono Play verán lo que pasa. Aquí tenemos a la oveja.
Ups, la oveja no cuenta nada.
Sigamos y probemos una versión diferente de la oveja,
ya que la descompuse ahorita.
Disculpen.
Aquí viene la oveja.
Entonces, aquí tenemos una oveja con un script muy sencillo...
A la que también le falta a su programa.
Qué vergonzoso.
Y aquí tenemos la versión en línea de Scratch.
Y dado que en todos los navegadores del mundo ahora se bloquea el flash,
tenemos que habilitarlo.
Aquí vamos.
Y por fin tenemos a la oveja que cuenta, lo cual es muy decepcionante,
ya que solo es una oveja que cuenta.
OK.
Dediqué mucho tiempo a esto,
así que me siento feliz de lograr que funcionara.
En la parte superior derecha podemos ver todos los componentes.
Al dar clic en la bandera verde se configura un contador, una variable,
lo cual es más interesante que llamarla x o y.
Lo llamé counter,
lo configuré igual a 0
y luego, forever le dice a counter que cambie cada segundo
como en el globo de la caricatura, espera un segundo
y entonces counter aumenta 1 simplemente agregándole 1.
Y al utilizar esta variable obtenemos el efecto de conteo eterno.
También podemos hacer otras cosas, por ejemplo,
hagamos una entrada un poco más dinámica,
con un personaje, quizás de nuevo un gato.
Y este programa se llama "Mima al gato"
Entonces, en Mima al gato ocurre lo siguiente.
Nada, a pesar de que presiono play.
Pero esperen un minuto.
Veamos el programa.
¿Qué necesito para que este programa haga algo?
PÚBLICO: Acariciar al gato.
DAVID: Oh, acariciar al gato, ¿cierto?
Entonces hay un condicional if que formula la pregunta
si lo tocamos con el puntero del mouse.
Vamos a probarlo.
[MIAU]
Ah.
[MIAU]
Es bastante lindo.
Podemos hacer,
[MIAU]
lo opuesto, "no mimes al gato".
Verán que tengo un if y un else de forma predeterminada, y el gato ahora,
[MIAU]
maulla.
[MIAU]
Pero si acariciamos a este gato,
[MIAU]
[ROAR]
no acaricien a ese gato.
¿Como funciona esto?
Bueno, solo necesitamos otra encrucijada.
Si acariciamos al gato, aparecerá el rugido del león.
De lo contrario, solamente maúlla y es mucho más lindo y pacífico.
Pero también podemos ir más allá.
Ahora abriremos los subprocesos, los cuales
son un ejemplo de un programa que hace varias cosas a la vez.
En este caso tenemos otros tipos de gato y pájaro.
¿Cuál parece ser el más inteligente de los dos?
El gato parece saber lo que ocurre, un poco más que el pájaro,
un tipo de IA por así decirlo.
[ROAR]
OK, tenemos el mismo sonido allí.
Pero noten que ahora tenemos una interacción entre dos personajes.
Honestamente, el gato está haciendo trampa.
En realidad no se trata de IA.
Solo apunta hacia el pájaro.
Esta pieza del rompecabezas dice que siempre que se toque al pájaro,
se reproducirá el rugido del león.
Así es como termina el programa.
Pero en la parte inferior dice, apunta hacia el pájaro, avanza un paso,
apunta hacia el pájaro, avanza un paso.
Y entonces, ¿qué pasa si soy algo impaciente y le concedo
al gato algunos poderes divinos
[ROAR]
para acelerarlo y que se mueva 10 pasos a la vez.
Y todo eso es, otra vez, una animación.
En vez de moverse un punto o píxel a la vez,
se moverá 10, la percepción para nosotros los humanos
es que se mueve mucho más rápido.
Por supuesto, podemos darle una ventaja al pájaro.
Aparentemente se mueve tres pasos a la vez.
Vamos a aumentarlo hasta 30.
[ROAR]
Eso tampoco funcionó muy bien.
Pero en este caso, los dos sprites están interactuando
porque uno de ellos comprueba si toca al otro o no.
Mientras tanto, podemos hacer lo siguiente.
Dejen les presento Events, que también es otro programa.
No es muy largo, pero tiene dos sprites, dos pequeñas marionetas.
Si presiono reproducir, no pasa nada, hasta que presiono la tecla de espacio.
Cuando se aplica a este juego, uno dice Marco y el otro
dice Polo.
Pero uno dice Polo como respuesta al otro que dice Marco.
Si abro el sprite de la marioneta naranja, veremos esto.
Siempre hará lo siguiente.
"If key space pressed, then", si presionamos la tecla de espacio,
dirá Marco por dos segundos y entonces transmite un evento.
Y un evento para nuestros propósitos de hoy, es como un susurro.
Susurra algo que solo otros sprites pueden escuchar, no los humanos.
Por otra parte, si miro en la marioneta azul, no hay mucho allí.
Cuando recibas ese evento, ese susurro, di Polo.
Y así tenemos una interacción entre estos dos sprites,
al igual que la respuesta de Oscar cuando arrastrábamos y soltábamos
basura en su bote.
Para terminar, tenemos este aquí, hi, hi, hi,
que también combina algunas de estas ideas y nos permite
[SONIDO DE FOCA]
implementar una idea conocida
[SONIDO DE FOCA]
de un videojuego en el teléfono o la computadora.
[SONIDO DE FOCA]
Este sonido perpetuo, como de ladridos, es muy molesto
[SONIDO DE FOCA]
hasta que descubrimos cómo funciona.
¿Qué hago para detenerlo?
[SONIDO DE FOCA]
Si miran el código en la parte superior derecha,
[SONIDO DE FOCA]
menciona a la tecla de espacio... y se detuvo.
¿Por qué?
¿Qué parece hacer cuando presionamos la tecla de espacio?
Está en este programa de la izquierda.
Si presiono la tecla de espacio, ¿qué estoy haciendo?
If... sí, if muted, y parece una variable porque es un bloque naranja.
If muted = 0, set muted to 1.
Else set muted to 0.
¿Qué significa eso?
Bueno, es como la programación equivalente de esto.
Si la lámpara está apagada, enciéndela.
Sino, apágala.
Entonces, es solo una forma de cambiar el estado o la respuesta
de falso a verdadero o de verdadero a falso.
Y uso esta información para decidir a la derecha, if muted = 0.
Entonces cero significa apagado o falso.
Entonces, si no es muted, if muted = 0, significa que no es muted,
y se reproduce el sonido de foca.
Y así es como el programa se detiene hasta que lo revierto,
[SONIDO DE FOCA]
presionando esto.
Ahora, tenemos todas estas piezas, o si lo prefieren, estos ingredientes,
[SONIDO DE FOCA]
y todas las habilidades que nos permiten conjuntar estas ideas.
Y básicamente también podemos hacer cosas bastante asombrosas.
De hecho, con la intención de reunir a nuestros dos campus,
el de aquí y el de New Haven, pensamos
que sería agradable concluir con un último juego, para el cual
necesitamos otro voluntario para que juegue el Hardest Game, de Yvy.
Vamos a invitarte a subir, porque la vez pasada también levantaste la mano.
¿Cómo te llamas?
LUKE: Luke.
DAVID: Luke, ven aquí.
Aquí viene Luke para jugar el Hardest Game, de Yvy.
Fue escrito por uno de sus predecesores en CS50, un ex alumno.
En un momento verás las instrucciones en la pantalla.
Aquí vamos, pantalla completa.
Yo lo iniciaré para ti y tú
utilizarás las teclas de dirección para jugarlo.
Aquí vamos Luke.
[MÚSICA DE FONDO]
[CANCIÓN DE MC HAMMER, "CAN'T TOUCH THIS"]
MC HAMMER: Can't touch this.
DAVID: [INAUDIBLE]
MC HAMMER: Can't touch this.
DAVID: Muy bien.
Ah, tú puedes.
Está bien.
MC HAMMER: My, my, my music hits me so hard,
makes me say oh my Lord.
Thank you for blessing me.
DAVID: Muy bien.
Vean las dos variables de arriba.
Está en el nivel tres y tiene cero muertes.
Mientras tanto hay varios sprites en la pantalla.
Hay tres de Yale.
Son como el gato, chocan con los bordes.
Muy b... ¡oh!
Sigue, sigue.
Ahora hay una muerte.
Ahora hay dos muertes.
Eh... infinitas.
Está bien.
Excelente.
Nivel seis.
Muy bien.
Claramente hay un if cerca de Harvard, aléjate.
Bien.
Vamos, puedes hacerlo.
Penúltimo nivel.
Ya van siete muertes.
Excelente.
¡Último nivel!
Solo un par de intentos más.
Excelente.
Un intento más.
Voy a concluir con una nota.
Esto es CS50.
El pastel con el equipo ya está listo.
Nos vemos la próxima semana!