Você está na página 1de 31

[MUSIC PLAING] DAVID MALAN: Tudo bem, esta é a CS50, a introdução da Universidade de Harvard aos empreendimentos intelectuais da ciência da

computação e da arte da programação, aqui no campus no lindo Sanders Theatre pela primeira vez em muito tempo. Então seja bem-vindo à aula. Meu
nome é David-- OK.

[TODOS E APLAUSOS]

Meu nome é David Malan. E eu mesmo fiz essa aula há algum tempo, mas quase não fiz. Era o outono do segundo ano e eu estava assistindo à aula. E
eu estava um pouco curioso, mas, eh, realmente não parecia o campo para mim. Eu definitivamente era uma pessoa de computador, mas a ciência da
computação parecia algo completamente diferente. E eu só criei coragem para fazer a aula, no final das contas, porque o professor da época,
Brian Kernighan, permitiu que eu fizesse a aula de aprovação/reprovação, inicialmente. E foi isso que fez toda a diferença.

Rapidamente descobri que a ciência da computação não é apenas programar e trabalhar isoladamente em seu computador. É realmente sobre a
resolução de problemas de forma mais geral. E havia algo sobre o dever de casa, francamente, que era realmente divertido, talvez pela primeira
vez em, o que, 19 anos. E havia algo sobre essa habilidade que eu descobri, junto com todos os meus colegas, de realmente criar algo e dar vida
a um computador para resolver um problema, e meio que trazer algo que eu usava todos os dias, mas não 'realmente não sei como aproveitar, isso
tem sido gratificante desde então e definitivamente desafiador e frustrante.

Tipo, até hoje, todos esses anos depois, você vai se deparar com erros, também conhecidos como bugs, na programação, que só te deixam maluco. E
você sente como se tivesse batido em uma parede. Mas o truque é mesmo dar tempo suficiente, dar um passo para trás, fazer uma pausa quando for
preciso. E não há nada melhor, ouso dizer, do que aquela sensação de gratificação e orgulho, realmente, quando você consegue algo para
trabalhar, e em uma aula como esta, apresentar, no final das contas, no final do semestre, algo como seu próprio projeto final.

Agora, isso não quer dizer que eu aceitei 100% perfeitamente. Na verdade, na semana passada, olhei no meu antigo fichário CS50, que ainda tenho
de 25 anos atrás, e tirei uma foto do que aparentemente foi o primeiro programa que escrevi e enviei, e rapidamente recebi menos 2 pontos sobre.
Mas este é um programa que veremos nos próximos dias que faz algo simplesmente como imprimir "Olá, CS50", neste caso, na tela.

E para ser justo, tecnicamente não segui as instruções, e é por isso que perdi alguns pontos. Mas se você olhar para isso, especialmente se
nunca programou antes, pode ter ouvido falar sobre linguagem de programação, mas nunca digitou algo assim, sem dúvida parecerá enigmático. Mas
ao contrário das línguas humanas, francamente, que eram muito mais sofisticadas, muito mais vocabulário, muito mais regras gramaticais,
programação, uma vez que você começa a entender o que é e como funciona e o que são essas várias linguagens, é tão fácil, você verá, depois de
alguns meses de uma aula como esta, começar a aprender sozinho, posteriormente, outros idiomas, conforme vierem, também nos próximos anos.

Portanto, o que realmente importa neste curso em particular não é tanto onde você termina em relação aos seus colegas, mas onde você termina em
relação a si mesmo quando começou. E, de fato, você começará hoje. E a única experiência que realmente importa nesta aula é a sua. E assim,
considere onde você está hoje. Considere, talvez, o quão enigmático algo assim parecia alguns segundos atrás. E console-se sabendo que daqui a
alguns meses tudo isso estará ao seu alcance.

E se você está pensando que, certo, certamente a pessoa na minha frente, à esquerda, à direita, atrás de mim sabe mais do que eu,
estatisticamente não é o caso. 2/3 dos alunos do CS50 nunca fizeram um curso de CS antes, ou seja, você está em ótima companhia durante todo o
período.

Então, o que é ciência da computação? Eu afirmo que é a resolução de problemas. E o lado bom disso é que resolver problemas é algo que fazemos o
tempo todo. Mas uma aula de ciência da computação, aprendendo a programar, acho que limpa seus pensamentos. Ajuda você a aprender a pensar de
forma mais metódica, mais cuidadosa, mais correta e mais precisa. Porque, honestamente, o computador não vai fazer o que você quer, a menos que
você seja correto, preciso e metódico.
E assim, há esses benefícios adicionais de apenas aprender a pensar como um cientista da computação e um programador. E não é preciso muito para
começar a fazê-lo. Esta, por exemplo, é talvez a imagem mais simples da ciência da computação, com certeza, mas realmente a solução de problemas
em geral. Os problemas são sobre receber informações, como o problema que você deseja resolver. Você deseja obter a solução, também conhecida
como saída. E assim, algo interessante deve estar acontecendo aqui, aqui, quando você está tentando passar dessas entradas para as saídas.

Agora, especificamente no mundo dos computadores, precisamos decidir antecipadamente como representaremos essas entradas e saídas. Todos nós só
precisamos decidir, sejam Macs, PCs, telefones ou qualquer outra coisa, que todos falaremos uma linguagem comum, independentemente de nossas
línguas humanas também. E você deve saber muito bem que os computadores tendem a falar apenas qual idioma, por assim dizer?

Montagem, um, mas binário, dois, pode ser o seu objetivo. E binário, ao implicar dois, significa que o mundo dos computadores tem apenas dois
dígitos à sua disposição, 0 e 1. E, de fato, nós humanos temos muito mais do que isso, certamente não apenas zeros e uns sozinhos. Mas um
computador realmente só tem zeros e uns. E, no entanto, de alguma forma eles podem fazer muito. Eles podem processar números no Excel, enviar
mensagens de texto, criar imagens, ilustrações, filmes e muito mais.

E então, como você passa de algo tão simples como alguns zeros, alguns uns, para todas as coisas que estamos fazendo hoje em nossos bolsos,
laptops e desktops? Bem, acontece que podemos começar de forma bastante simples. Se um computador quisesse fazer algo tão simples quanto contar,
bem, o que ele poderia fazer?

Bem, em nosso mundo humano, podemos contar fazendo isso, como 1, 2, 3, 4, 5, usando a chamada notação unitária, literalmente os dígitos em seus
dedos onde um dedo representa uma pessoa na sala, se eu m, por exemplo, fazendo atendimento. Agora, nós, humanos, normalmente contaríamos 1, 2,
3, 4, 5, 6. E iríamos além desses cinco dígitos e contaríamos muito mais alto, usando zeros até noves. Mas os computadores, de alguma forma, só
têm esses zeros e uns.

Portanto, se um computador só fala binário, zeros e uns, como ele conta além do número 1? Bem, aqui estão 3 zeros, é claro. E se você traduzir
esse número em binário, 000, para um número mais familiar em decimal, chamaremos isso apenas de zero. Disse o suficiente. Se fôssemos
representar, com um computador, o número 1, na verdade seria 001, o que, não surpreendentemente, é exatamente o mesmo que poderíamos fazer em
nosso mundo humano, mas talvez não nos incomodássemos em escrever os dois zeros no começo.

Mas um computador, agora, se quiser contar até dois, ele não tem o dígito 2. Então ele tem que usar um padrão diferente de zeros e uns. E isso é
010. Portanto, não é 10 com um zero na frente. É de fato zero um zero no contexto do binário.

E se quisermos contar agora mais do que dois, teremos que ajustar esses zeros e uns ainda mais para obter 3. E então, se quisermos 4 ou 5 ou 6
ou 7, estamos apenas alternando esses zeros e uns, também conhecidos como bits, para dígitos binários que representam, por meio desses padrões
diferentes, números diferentes que você e eu, como humanos, conhecemos, é claro, como o chamado sistema decimal, 0 a 9, dec, implicando 10, 10
dígitos , esses zeros até nove.

Então, por que esse padrão específico? E por que esses zeros e uns em particular? Bem, acontece que representar uma coisa ou outra é muito
simples para um computador. Por quê? No final do dia, eles são alimentados por eletricidade. E é muito simples armazenar eletricidade ou não.
Tipo, isso é tão simples quanto o mundo pode ser, ligado ou desligado. 1 ou 0, por assim dizer.

Então, de fato, dentro de um computador, um telefone, qualquer coisa hoje em dia que seja eletrônica, praticamente, há um certo número de
interruptores, também conhecidos como transistores. E eles são minúsculos. Você tem milhares, milhões deles em seu Mac, PC ou telefone hoje em
dia. E estes são apenas pequenos interruptores que podem ser ligados e desligados. E ligando e desligando essas coisas em padrões, um computador
pode contar de 0 a 7, e até mais que isso.

E então esses interruptores, realmente, você pode pensar em ser como interruptores como este. Deixe-me pegar emprestada uma de nossas pequenas
luzes de palco aqui. Aqui está uma lâmpada. No momento está desativado. E então, eu poderia pensar nisso como representando, em meu laptop, um
transistor, um interruptor, representando 0. Mas se eu permitir que um pouco de eletricidade flua, agora eu, de fato, tenho um 1.

Bem, como faço para contar acima de 1? Eu, claro, preciso de outra lâmpada. Então deixe-me pegar outro aqui. E se eu colocar no mesmo tipo de
padrão, não quero apenas fazer isso. Essa é a velha maneira de contar com os dedos de unário, apenas 1, 2. Eu quero realmente levar em conta o
padrão dessas coisas sendo ligadas e desligadas. Então, se este foi um momento atrás, o que eu acho que fiz antes foi desligá-lo e deixar o
próximo ser ligado, também conhecido como 010.

E deixe-me pegar um terceiro pedaço, se você quiser. E isso parece o suficiente. Aqui está o mesmo padrão agora, começando no início com 3.
Então aqui está 000. Aqui está 001. Aqui está 010, também conhecido como, em nosso mundo humano de decimal, 2. E então poderíamos, é claro,
continuar contando mais. Isso agora seria 3 e ponto ponto ponto. Se esta outra lâmpada acender agora, e aquele interruptor for ligado e todos os
três permanecerem acesos-- este, novamente, era o número?

AUDIÊNCIA: Sete.

DAVID MALAN: OK, então, sete. Então é tão simples, relativamente, assim, se você quiser. Mas como é que esses padrões surgiram? Bem, esses
padrões na verdade seguem algo muito familiar. Você e eu realmente não pensamos mais nisso neste nível porque provavelmente estamos fazendo
matemática e números desde a escola primária ou algo assim. Mas se considerarmos algo em decimal, como o número 123, eu pulo imediatamente para
isso. Isso se parece com 123 em decimal. Mas por que?

Na verdade, são apenas três símbolos, um 1, um 2 com um pouco de curva, um 3 com algumas curvas, aos quais você e eu instintivamente atribuímos
significado. Mas se retrocedermos alguns anos, isso é cento e vinte e três porque você está atribuindo significado a cada uma dessas colunas. O
3 está no lugar dos chamados uns. O 2 está na chamada casa das dezenas. E o 1 está na chamada casa das centenas.

E então a matemática segue rapidamente em sua cabeça. Isso é tecnicamente 100 vezes 1, mais 10 vezes 2, mais 1 vezes 3, também conhecido como
100 mais 20 mais 3. E aí temos o tipo de noção matemática que conhecemos como 123.

Bem, muito bem, em binário, é na verdade a mesma coisa. É que essas colunas significam algo diferente. Se você usa três dígitos em decimal e tem
a casa das unidades, a casa das dezenas e a casa das centenas, bem, por que isso foi 1, 10 e 100? Eles são tecnicamente apenas potências de 10.
Portanto, 10 elevado a 0, 10 elevado a 1, 10 elevado a 2. Por que 10? Sistema decimal, "dec" significando 10. Você tem 8 e 10 dígitos, de 0 a 9.

No sistema binário, se for usar três dígitos, basta trocar as bases se for usar apenas zeros e uns. Agora são potências de 2, 2 elevado a 0, 2
elevado a 1, 2 elevado a 2, também conhecido como 1 e 2 e 4, respectivamente. E se você continuar, vai ser coluna 8s, coluna 16s, 32, 64, e
assim por diante.

Então, por que obtivemos esses padrões que fizemos? Aqui está o seu 000 porque é 4 vezes 0, 2 vezes 0, 1 vezes 0, obviamente 0. É por isso que
temos o número decimal 1 em binário. É por isso que temos o número 2 em binário, porque é 4 vezes 0, mais 2 vezes 1, mais 1 vezes 0, e agora 3,
e agora 4, e agora 5, e agora 6, e agora 7. E, claro claro, se você quiser contar até 8, para ser claro, o que você tem que fazer? O que um
computador precisa fazer para contar até mais de 7?

AUDIÊNCIA: Adicione um pouco.

DAVID MALAN: Adicione um pouco. Adicione outra lâmpada, outro interruptor. E, de fato, os computadores padronizaram quantos zeros e uns, ou bits
ou interruptores, eles lançam nesses tipos de problemas. E, de fato, a maioria dos computadores normalmente usaria pelo menos oito por vez. E
mesmo se você estiver contando até três ou sete, você ainda usaria oito e teria um monte de zeros. Mas tudo bem, porque os computadores hoje em
dia certamente têm muito mais, milhares, milhões de transistores e interruptores que está tudo bem.

Tudo bem, então, com isso dito, se agora podemos contar até sete ou, francamente, tão alto quanto queremos, isso só parece tornar os
computadores úteis para coisas como Excel, como processamento de números. Mas os computadores, é claro, permitem que você envie mensagens de
texto, escreva documentos e muito mais. Então, como um computador representaria algo como uma letra, como a letra A do alfabeto inglês, se, no
final das contas, tudo o que eles têm são interruptores? Alguma ideia? Sim.

AUDIÊNCIA: Você pode representar letras em números.

DAVID MALAN: OK, então poderíamos representar letras usando números. OK, então o que é uma proposta? Que número deve representar o quê?

AUDIÊNCIA: Digamos que se você estivesse começando no início do alfabeto, poderia dizer 1 é A, 2 é B, 3 é C.

DAVID MALAN: Perfeito. Sim, todos temos que concordar de alguma forma que um número representará uma letra. Portanto, 1 é A, 2 é B, 3 é C, Z é
26 e assim por diante. Talvez possamos até levar em consideração letras maiúsculas e minúsculas. Nós apenas temos que concordar e escrever isso
em algum padrão global. E os humanos, de fato, fizeram exatamente isso. Eles não usaram 1, 2, 3. Acontece que eles começaram um pouco mais alto.
O A maiúsculo foi padronizado como o número 65. E o B maiúsculo foi padronizado como o número 66. E você pode imaginar como vai subir a partir
daí.

E isso porque tudo o que você está representando, em última análise, só pode ser armazenado, no final das contas, como zeros e uns. E assim,
alguns humanos em uma sala anterior decidiram que A maiúsculo deve ser 65, ou, na verdade, esse padrão de zeros e uns dentro de cada computador
do mundo, 01000001. Portanto, se esse padrão de zeros e uns aparecer em um computador, pode ser interpretado como de fato uma letra A maiúscula,
oito desses bits de cada vez.

Mas eu me preocupo, só para esclarecer, podemos ter criado um problema agora. Pode parecer, se eu jogar isso ingenuamente, que, OK, como eu
realmente faço matemática com o número 65? Se agora o Excel exibe 65 é um A, muito menos Bs e Cs. Então, como um computador pode fazer o que
você propôs, ter esse mapeamento de números para letras, mas ainda suportar números? Parece que desistimos de algo. Sim?

AUDIÊNCIA: Tendo um prefixo para letras?

DAVID MALAN: Por ter um prefixo?

AUDIÊNCIA: Você pode ter prefixos e sufixos.

DAVID MALAN: OK, talvez possamos ter algum tipo de prefixo, como algum padrão de zeros e uns-- eu gosto disso-- que indica ao computador que
aqui vem outro padrão que representa uma letra. Aqui vem outro padrão que representa um número ou uma letra. Então, nada mal. Eu gosto disso.
Outros pensamentos? Como um computador pode distinguir esses dois? Sim.

AUDIÊNCIA: Tenha um formato de arquivo diferente, então, como, texto estranho ou apenas verifique o gráfico ou--

DAVID MALAN: De fato, e isso é perfeito. Nada de errado com o que você sugeriu, mas o mundo geralmente faz exatamente isso. A razão pela qual
temos todos esses formatos de arquivo diferentes no mundo, como JPEG e GIF e PNGs e documentos do Word, .docx e arquivos do Excel e assim por
diante, é porque um grupo de humanos entrou em uma sala e decidiu, bem, em no contexto deste tipo de arquivo, ou realmente, mais
especificamente, no contexto deste tipo de programa, Excel versus Photoshop versus Google Docs ou similares, devemos interpretar quaisquer
padrões de zeros e uns como sendo talvez números para Excel, talvez letras em, como, um programa de mensagens de texto ou Google Docs, ou talvez
até cores do arco-íris em algo como Photoshop e muito mais. Portanto, depende do contexto.

E veremos, quando nós mesmos começarmos a programar, você, o programador, fornecerá algumas dicas ao computador que informam ao computador,
interprete da seguinte maneira. Portanto, semelhante em espírito a isso, mas não exatamente padronizado com esses prefixos.
Então esse sistema aqui na verdade tem o nome ASCII, o American Standard Code for Information Interchange. E, de fato, começou aqui nos Estados
Unidos, e é por isso que é um pouco tendencioso para A's a Z's e um pouco de pontuação também. E isso rapidamente se tornou um problema.

Mas se começarmos de forma simples agora, em inglês, o mapeamento em si é bastante direto. Portanto, se A é 65, B é 66 e ponto ponto ponto,
suponha que você tenha recebido uma mensagem de texto, um e-mail, de um amigo e, por baixo do capô, por assim dizer, se você meio que olhou
dentro do computador, o que você tecnicamente recebidos neste texto ou neste e-mail eram os números 72, 73, 33 ou, na verdade, o padrão
subjacente de zeros e uns. O que seu amigo pode ter lhe enviado como mensagem, se for 72, 73, 33?

AUDIÊNCIA: Ei.

DAVID MALAN: Ei? Perto.

AUDIÊNCIA: Olá.

DAVID MALAN: Olá. É, de fato, oi. Por quê? Bem, aparentemente, de acordo com esta pequena folha de dicas, H é 72, I é 73. Não é óbvio neste
gráfico o que é o 33, mas, de fato, esse padrão representa "oi". E alguém quer adivinhar, ou se souber, quanto é 33?

AUDIÊNCIA: Ponto de exclamação.

DAVID MALAN: Ponto de exclamação. E isso, francamente, não é o tipo de coisa que a maioria das pessoas conhece. Mas é facilmente acessível por
um bom gráfico amigável como este. Portanto, este é um gráfico ASCII. Quando eu disse que só precisamos anotar esse mapeamento antes, foi isso
que as pessoas fizeram. Eles escreveram em um livro ou em um gráfico. E, por exemplo, aqui está nosso 72 para H, aqui está nosso 73 para I, e
aqui está nosso 33 para ponto de exclamação.

E computadores, Macs, PCs, iPhones, dispositivos Android, apenas saibam esse mapeamento de cor, se quiserem. Eles foram projetados para entender
essas letras. Então, aqui, posso ter recebido um "oi". Tecnicamente, o que recebi foram esses padrões de zeros e uns. Mas é importante observar
que quando você obtém esses padrões de zeros e uns em qualquer formato, seja e-mail, texto ou arquivo, eles tendem a vir em tamanhos padrão, com
um certo número de zeros e uns no total. E isso é 8 mais 8, mais 8.

Portanto, apenas para obter a mensagem "oi, ponto de exclamação", você teria recebido pelo menos, ao que parece, cerca de 24 bits. Mas,
francamente, os bits são tão minúsculos, literal e matematicamente, que não tendemos a pensar ou falar, geralmente, em termos de bits. Você
provavelmente está mais familiarizado com bytes. BYTES é um byte, é um byte, é um byte. Um byte é apenas 8 bits.

E mesmo esses, francamente, não são tão úteis se fizermos as contas. Quão alto você pode contar se tiver oito bits? Ninguem sabe? Diga isso de
novo? Mais alto que isso. A menos que você queira ficar negativo, tudo bem. 256, tecnicamente 255. Para encurtar a história, se realmente
chegássemos aos detalhes de todos esses zeros e uns, e descobríssemos o que 11111111 soma matematicamente em decimal, seria de fato 255, ou
menos se você quiser representar números negativos também.

Isso é útil porque agora podemos falar não apenas em termos de bytes, mas, se os arquivos forem maiores, kilobytes são milhares de bytes,
megabytes são milhões de bytes, gigabytes são bilhões de bytes, terabytes são trilhões de bytes e assim adiante. Temos um vocabulário para essas
quantidades cada vez maiores de dados.

O problema é que, se você estiver usando ASCII e, portanto, oito bits ou um byte por caractere, e originalmente apenas sete, você poderá
representar apenas 255 caracteres. E na verdade são 256 caracteres no total, incluindo zero. E tudo bem se você estiver usando literalmente o
inglês, neste caso, mais um monte de pontuação. Mas há muitas línguas humanas no mundo que precisam de muito mais símbolos e, portanto, muito
mais bits.
Então, felizmente, o mundo decidiu que realmente daremos suporte não apenas ao teclado do inglês dos Estados Unidos, mas a todos os caracteres
acentuados que você pode querer para alguns idiomas. E caramba, se usarmos bits, zeros e uns suficientes, não só podemos representar todas as
línguas humanas na forma escrita, como também algumas emoções ao longo do caminho, podemos capturar o último com essas coisas chamadas emojis.

E, de fato, estes estão muito em voga nos dias de hoje. Você provavelmente envia e/ou recebe muitas dessas coisas em um determinado dia. Estes
são apenas caracteres, como letras de um alfabeto, padrões de zeros e uns que você está recebendo, que o mundo também padronizou. Por exemplo,
existem certos emojis que são representados com certos padrões de bits. E quando você os recebe, seu telefone, seu laptop, sua área de trabalho
os exibe como tal.

E esse padrão mais novo é chamado de Unicode. Portanto, é um superconjunto do que chamamos de ASCII. E o Unicode é apenas um mapeamento de muito
mais números para muito mais letras ou caracteres, de maneira mais geral, que pode usar oito bits para compatibilidade com versões anteriores
com a maneira antiga de fazer as coisas com ASCII, mas também pode usar 16 bits. E se você tiver 16 bits, poderá representar mais de 65.000
letras possíveis. E isso está chegando lá. E caramba, o Unicode pode até usar 32 bits para representar letras e números e símbolos de pontuação
e emojis. E isso lhe daria até 4 bilhões de possibilidades.

E, ouso dizer, uma das razões pelas quais vemos tantos emojis hoje em dia é que temos muito espaço. Quero dizer, temos espaço para mais bilhões,
literalmente. Então, na verdade, apenas como curiosidade, alguém já recebeu esse número decimal, ou se você preferir binário agora, alguém já
recebeu esse padrão de zeros e uns em seu telefone, em um texto ou e-mail, talvez O ano que passou?

Bem, se você realmente pesquisar, essa sequência esotérica de zeros e uns representa um rosto com máscara médica. E observe que, se você tiver
um iPhone ou um dispositivo Android, poderá ver coisas diferentes. Na verdade, esta é a versão Android disso, mais recentemente. Esta é a versão
iOS dele, mais recentemente. E há muitas outras interpretações de outras empresas também.

Portanto, o Unicode, como um consórcio, se preferir, padronizou as descrições do que são essas coisas. Mas as próprias empresas, fabricantes lá
fora, geralmente interpretam como você acha adequado. E isso pode levar a algumas falhas de comunicação humanas.

Na verdade, por tipo, literalmente, embaraçosamente, como um ano ou dois, comecei a ter o hábito de usar o emoji que se parece com isso porque
pensei que era como woo, cara feliz ou qualquer outra coisa. Eu não sabia que este é o emoji para abraço porque qualquer dispositivo que eu
estava usando se parece com isso, não com isso. E isso é por causa de sua interpretação dos dados.

Isso também aconteceu quando o que era uma arma se tornou uma pistola d'água aos olhos de alguns fabricantes. E então é uma dicotomia
interessante entre quais informações todos nós queremos representar e como escolhemos, em última análise, representá-las. Questões, então, sobre
essas representações de formatos, sejam números ou letras, ou logo mais. Sim?

AUDIÊNCIA: Por que o decimal é popular para um computador se o binário é a base de tudo?

DAVID MALAN: Desculpe, por que isso é tão popular?

AUDIÊNCIA: Por que o decimal é popular se o binário é o fundamental--

DAVID MALAN: Sim, então voltaremos a isso em algumas semanas, na verdade. Existem outras formas de representar números. Binário é um. Decimal é
outro. Unário é outro. E hexadecimal ainda é um quarto que usa 16 dígitos no total, literalmente de 0 a 9 mais A, B, C, D, E, F. E, de alguma
forma, você pode contar ainda mais alto com eles. Veremos em algumas semanas por que isso é atraente. Mas hexadecimal, para encurtar a história,
usa quatro bits por dígito. E então, quatro bits, se você tiver dois dígitos em hexadecimal, isso dá oito. E é apenas uma unidade de medida
muito conveniente. E também é uma convenção humana no mundo dos arquivos e outras coisas. Mas voltaremos a isso em breve. Outras perguntas?

AUDIÊNCIA: As luzes no palco supostamente dizem isso--


DAVID MALAN: As luzes no palco supostamente dizem alguma coisa? Bem, se tivéssemos pensado antecipadamente em usar talvez 64 lâmpadas, isso nos
daria 8 bytes totais no palco, 8 vezes 8, dando-nos exatamente isso. Pode ser. Boa pergunta. Outras perguntas sobre 0 e 1? Está um pouco claro
aqui. Não? Oh sim? Onde todos estão apontando para algum lugar específico. Aqui vamos nós. Desculpe. Muito brilhante neste canto.

AUDIÊNCIA: Eu só ia perguntar sobre os 255 bits, como com o máximo de caracteres. [INAUDÍVEL]

DAVID MALAN: Ah, claro, e voltaremos a isso, de alguma forma, nos próximos dias também, em um ritmo mais lento também, temos, com oito bits,
dois valores possíveis para o primeiro e depois dois para o próximo, dois para o próximo, e assim por diante. Isso é 2 vezes 2 vezes 2. Isso é 2
à oitava potência total, o que significa que você pode ter 256 padrões possíveis de zeros e uns. Mas, como veremos em breve, cientistas da
computação, programadores, software geralmente começam a contar em 0 por convenção e se você usar um desses padrões, 00000000 para representar o
número decimal que sabemos ser zero, você só tem 255 outros padrões para contar como alto, portanto, 255. Isso é tudo. Boa pergunta.

Tudo bem, então o que podemos ter além desses emojis, letras e números? Bem, é claro que temos coisas como cores e programas como o Photoshop e
imagens e fotos. Bem, deixe-me fazer a pergunta novamente. Como você acha que um computador, sabendo o que você sabe agora, pode representar
algo como uma cor? Como quais são nossas opções se tudo o que temos são zeros e uns e interruptores? Sim?

AUDIÊNCIA: RGB

DAVID MALAN: RGB. RGB de fato é esse acrônimo que representa uma certa quantidade de vermelho e uma certa quantidade de verde e azul e, de fato,
os computadores podem representar cores apenas fazendo isso. Lembrando, por exemplo, este ponto. Este ponto amarelo na tela que pode fazer parte
de qualquer um desses emojis hoje em dia, bem, é uma parte de vermelho, uma parte de verde, uma parte de azul. E se você misturar essas cores,
pode realmente obter uma muito específica. E nos veremos em apenas um momento.

Portanto, antes, os humanos usavam apenas sete bits no total. E foi apenas quando eles decidiram, bem, vamos adicionar um oitavo bit que eles
estenderam o ASCII e isso foi inicialmente em parte uma solução para o mesmo problema de não ter espaço suficiente, se você quiser, nesses
padrões de zeros e uns para representam todos os caracteres que você pode querer. Mas mesmo isso não foi suficiente e é por isso que agora
subimos para 16 e 32 e já passamos das 7.

Então, se voltarmos agora a esta cor em particular. O RGB foi proposto como um esquema, mas como isso pode funcionar? Bem, considere, por
exemplo, isso. Se de fato decidirmos como um grupo representar qualquer cor do arco-íris com alguma mistura de algum vermelho, algum verde e
algum azul, teremos que decidir como representar a quantidade de vermelho, verde e azul. Bem, acontece que se tudo o que temos são zeros e uns,
logo números, vamos fazer exatamente isso.

Por exemplo, suponha que estamos usando um computador, esses três números 72, 73, 33, não mais no contexto de um e-mail ou mensagem de texto,
mas agora no contexto de algo como o Photoshop, um programa de edição e criação de gráficos. arquivos, talvez esse primeiro número possa ser
interpretado como representando uma certa quantidade de vermelho, verde e azul, respectivamente. E é exatamente isso que acontece. Você pode
pensar no primeiro dígito como vermelho, no segundo como verde e no terceiro como azul.

E assim, finalmente, quando você combina aquela quantidade de vermelho, aquela quantidade de verde, aquela quantidade de azul, acaba se
parecendo com o tom de amarelo. E, de fato, você pode criar números entre 0 e 255 para cada uma dessas cores para misturar qualquer outra cor
que desejar.

E você pode realmente ver isso na prática. Mesmo que nossas telas, reconhecidamente, estejam ficando muito boas em nossos telefones e laptops,
de modo que você mal vê os pontos, eles estão lá. Você pode ter ouvido o termo pixel antes. Pixel é apenas um ponto na tela e você tem milhares,
milhões deles hoje em dia na horizontal e na vertical.
Se eu pegar até mesmo este emoji, que novamente é a interpretação de uma empresa de um rosto com máscara médica e aumentar um pouco o zoom,
talvez aumentar um pouco mais, você pode realmente começar a ver esses pixels. As coisas ficam pixelizadas porque o que você está vendo é cada
um dos pontos individuais que compõem essa imagem específica. E aparentemente cada um desses pontos individuais provavelmente está usando 24
bits, oito bits para vermelho, oito bits para verde, oito bits para azul, em algum padrão.

Este programa ou algum outro como o Photoshop está interpretando um padrão e é branco ou amarelo ou preto ou marrom no meio. Portanto, se você
parecer meio desajeitado, mas de perto do seu telefone, laptop ou talvez da TV, também poderá ver exatamente isso.

Tudo bem, bem, e as coisas que também assistimos todos os dias no YouTube ou algo parecido? Coisas como vídeos. Como um computador, sabendo o
que sabemos agora, representaria algo como um vídeo? Como você pode representar um vídeo usando apenas zeros e uns? Sim?

AUDIÊNCIA: Como podemos ver aqui, eles representam imagens, certo? [INAUDÍVEL] sons dos 0 e 1s também. [INAUDÍVEL].

DAVID MALAN: Sim, exatamente. Para resumir, o que o vídeo realmente acrescenta é apenas uma noção de tempo. Não é apenas uma imagem, não é
apenas uma letra ou um número, é presumivelmente algum tipo de sequência porque o tempo está passando. Então, com um monte de imagens, talvez 24
talvez 30 por segundo, se você as voar pelos olhos humanos, podemos interpretá-las usando nossos olhos e cérebro que agora há movimento e,
portanto, vídeo.

Da mesma forma com áudio ou música. Se apenas inventarmos alguma convenção para representar essas mesmas notas em um instrumento musical,
poderíamos fazer com que o computador as sintetize também? E isso pode ser realmente muito familiar. Deixe-me ver um vídeo rápido aqui, que é
uma versão antiga da mesma ideia. Você deve se lembrar da infância.

[MÚSICA, TOCANDO]

[CLICANDO]

Portanto, esse vídeo em particular é um vídeo real de uma animação baseada em papel, mas, na verdade, isso é realmente tudo que você precisa, é
uma sequência dessas imagens, que são apenas zeros e uns porque são apenas essa grade desses pixels ou pontos. Agora, algo como notas musicais
como essas, aqueles de vocês que são músicos podem tocá-las naturalmente em dispositivos físicos, mas os computadores certamente podem
representar esses sons também.

Por exemplo, um formato popular para áudio é chamado MIDI e MIDI pode representar apenas cada nota que você viu há pouco essencialmente como uma
sequência de números. Mas, de forma mais geral, você pode pensar na música como tendo notas, por exemplo, de A a G, talvez alguns bemóis e
alguns sustenidos, você pode ter a duração de quanto tempo a nota está sendo ouvida ou tocada em um piano ou algum outro dispositivo, e, em
seguida, apenas o volume, como com que força um humano no mundo real pressiona essa tecla e, portanto, quão alto é esse som? Parece que apenas
lembrando pequenos detalhes como esses quantitativamente, podemos representar realmente todas essas realidades humanas analógicas.

Portanto, essa é realmente uma longa lista de maneiras pelas quais podemos apenas representar informações. Mais uma vez, computadores ou
digitais têm todos esses formatos diferentes, mas no final do dia e por mais sofisticados que sejam esses dispositivos em anos, são apenas zeros
e uns, minúsculos interruptores ou lâmpadas, se você quiser, representados de alguma forma e cabe ao software que você, eu e outros escrevemos
usar esses zeros e uns de maneiras que queremos que os computadores façam algo mais poderoso.

Perguntas, então, sobre essa representação da informação, que ouso dizer que é, em última análise, o que significa resolver problemas, receber
informações e produzir novas por meio de algum processo intermediário. Alguma pergunta? Sim, atrás.

AUDIÊNCIA: Sim, então falamos sobre como diferentes formatos de arquivo permitem que você interprete as informações. Como um formato de arquivo
como .mp4 discrimina entre áudio e vídeo dentro de si como um valor?
DAVID MALAN: Então, uma pergunta muito boa. Existem muitos outros formatos de arquivo por aí. Você faz alusão ao MP4 para vídeo e, de maneira
mais geral, o uso são essas coisas chamadas codecs e contêineres. Não é tão simples ao usar arquivos maiores, por exemplo, em formatos mais
modernos que um vídeo seja apenas uma sequência de imagens, por exemplo.

Por quê? Se você armazenou tantas imagens como um filme de Hollywood, como 24 ou 30 delas por segundo, é um grande número de imagens. E se você
já tirou fotos com seu telefone, deve saber quantos megabytes ou até fotos individuais podem ter. Portanto, os humanos desenvolveram ao longo
dos anos um software mais sofisticado que usa muito mais matemática para representar a mesma informação de forma mais mínima, apenas usando
padrões de zeros e uns de alguma forma mais curtos do que a representação mais simplista aqui.

E eles usam o que pode ser chamado de compressão. Se você já usou um arquivo zip ou qualquer outra coisa, de alguma forma seu computador está
usando menos zeros e uns para representar a mesma quantidade de informações, idealmente sem perder nenhuma informação. No mundo da multimídia,
que abordaremos um pouco em algumas semanas, existem formatos com e sem perdas por aí. Sem perdas significa que você não perde nenhuma
informação.

Mas, mais comumente, como você está aludindo a um, é a compactação com perdas, PERDAS, onde você está realmente jogando fora uma certa
quantidade de qualidade. Você está obtendo uma certa quantidade de pixelização que pode não parecer perfeita para o ser humano, mas é muito mais
barato e muito mais fácil de distribuir.

E no mundo da multimídia, você tem contêineres como QuickTime e outros contêineres MPEG que podem combinar diferentes formatos de vídeo,
diferentes formatos de áudio em um arquivo, mas também os designers têm discrição. Então, mais em algumas semanas também.

Outras perguntas, então, sobre informações aqui também? Sim?

AUDIÊNCIA: Sei que os computadores costumavam ser muito grandes e ocupavam uma sala inteira e outras coisas. A razão pela qual eles ficaram
menores é porque podemos armazenar essas informações aos poucos ou o quê?

DAVID MALAN: Exatamente. Quero dizer, antigamente você já deve ter ouvido falar da expressão tubo de vácuo, que é como um dispositivo
fisicamente grande que pode armazenar apenas 0 ou 1. Sim, é a miniaturização do hardware hoje em dia que nos permitiu armazenar tantos e muitos
mais zeros e uns muito mais próximos uns dos outros. E como construímos máquinas mais sofisticadas que podem projetar esse hardware em uma
escala ainda menor, estamos apenas colocando mais e mais nesses dispositivos.

Mas também há uma troca. Por exemplo, você pode saber que, ao usar o telefone ou o laptop por um bom tempo, talvez no colo, começa a esquentar.
Portanto, existem esses efeitos colaterais físicos literais disso, onde agora alguns de nossos dispositivos esquentam. É por isso que um data
center no mundo real pode precisar de mais ar condicionado do que um local típico, porque também existem esses artefatos físicos.

Na verdade, se você gostaria de ver um dos primeiros computadores de décadas atrás, do outro lado do rio, aqui em Allston, agora no novo prédio
de engenharia, está o computador Harvard Mark 1 que lhe dará um modelo mental muito melhor disso.

Bem, se voltarmos agora a esta primeira imagem sendo ciência da computação ou realmente solução de problemas, ouso dizer que temos maneiras mais
do que suficientes para representar informações, entrada e saída, desde que todos concordemos em algo e, felizmente, todos aqueles antes us nos
deram coisas como ASCII e Unicode. Sem mencionar MP4s, documentos do Word e similares.

Mas o que há dentro dessa caixa preta proverbial na qual essas entradas estão entrando e as saídas estão chegando? Bem, é daí que tiramos esse
termo que você também deve ter ouvido. Um algoritmo, que é apenas instruções passo a passo para resolver algum problema encarnado no mundo dos
computadores por software. Quando você escreve programas de software, você está implementando um ou mais algoritmos, um ou mais conjuntos de
instruções para resolver algum problema, e talvez você esteja usando esta linguagem ou aquela, mas no final do dia, não importa a linguagem que
você use o computador vai representar o que você digita usando apenas zeros e uns.

Então, o que pode ser um algoritmo representativo? Hoje em dia, você pode usar bastante o telefone para fazer chamadas ou enviar mensagens de
texto ou e-mails e, portanto, tem muitos contatos em sua agenda. Hoje em dia, é claro, isso é muito digital, mas seja no iOS ou no Android ou
algo semelhante, você pode ter um monte de nomes, nome e/ou sobrenome, além de números, e-mails e afins.

Você pode ter o hábito de rolar em seu telefone todos esses nomes para encontrar a pessoa para quem deseja ligar. Provavelmente está
classificado em ordem alfabética por nome ou sobrenome, de A a Z ou algum outro símbolo. Isso é francamente o mesmo que costumávamos fazer na
minha época, CS50, quando usávamos apenas um livro físico. Neste livro físico pode haver um monte de nomes classificados alfabeticamente da
esquerda para a direita, correspondendo a um monte de números.

Então, suponha que nesta velha lista telefônica de Harvard queremos procurar por John Harvard. É claro que podemos começar simplesmente do
início aqui, olhando uma página de cada vez, e isso é um algoritmo. É como literalmente, passo a passo, procurar a solução para esse problema.
Nesse sentido, se John Harvard está na lista telefônica, esse algoritmo página por página está correto, você diria?

AUDIÊNCIA: Sim.

DAVID MALAN: Sim. Por exemplo, se John Harvard está na lista telefônica, obviamente vou chegar até ele, então é isso que queremos dizer com
correto. É eficiente? É bem desenhado, você diria? Não. Quero dizer, isso vai levar uma eternidade, mesmo apenas para chegar ao Js ou ao Hs,
dependendo de como essa coisa é classificada. Tudo bem, deixe-me ir um pouco mais rápido. Vou começar como duas páginas de cada vez. 2, 4, 6, 8,
10, 12 e assim por diante. Parece mais rápido, é mais rápido, correto?

AUDIÊNCIA: Não.

DAVID MALAN: OK, por que não está correto? Sim?

AUDIÊNCIA: Então, se você está começando na página 1, você está indo apenas para um número ímpar de páginas, então, se estiver em uma página de
número par, você perderá.

DAVID MALAN: Exatamente. Se eu começar com um número ímpar de páginas e for duas de cada vez, posso perder páginas no meio. E se, portanto,
concluo quando chego ao final do livro que não houve John Harvard, posso ter me enganado. Isso seria novamente um desses bugs. Mas se eu me
esforçar um pouco mais, sinto que há uma solução. Não precisamos descartar completamente esse algoritmo. Acho que provavelmente podemos ir duas
vezes mais rápido ainda. Mas o que devemos fazer para consertar isso? Sim, atrás.

AUDIÊNCIA: [INAUDÍVEL]

DAVID MALAN: Legal. Então, acho que muitos de nós, a maioria de nós, se usarmos mais essa tecnologia hoje em dia, podemos ir mais ou menos até o
meio da lista telefônica apenas para começar. E agora estou olhando para baixo, procurando por J, assumindo o primeiro nome, J Harvard, e parece
que estou na seção M. Então, só para ficar claro, o que devo fazer a seguir?

AUDIÊNCIA: [INAUDÍVEL]

DAVID MALAN: OK, e presumivelmente é John Harvard que estaria à esquerda disso. Portanto, aqui está uma oportunidade de, figurativa e
literalmente, rasgar esse problema específico pela metade, jogar metade do problema fora. Na verdade, é muito fácil se você fizer dessa maneira.
A maneira mais difícil é esta. Mas agora acabei de diminuir o tamanho desse problema pela metade.

Então, se eu comecei com 1.000 páginas de números de telefone e nomes, agora estou com 500. E ainda não encontramos John Harvard, mas isso é uma
grande mordida neste problema. Eu acho que está correto porque se J está à esquerda de M, é claro, ele definitivamente não estará lá.

Acho que se eu repetir isso de novo dividindo e conquistando, se você quiser, talvez eu tenha ido um pouco longe demais. Agora estou na seção E.
Então, deixe-me dividir o problema pela metade novamente, jogar outras 250 páginas fora e repetir novamente, dividindo e dividindo e
conquistando até que finalmente, presumivelmente, acabe com apenas uma página de uma lista telefônica na qual o nome de John Harvard está ou
está não, mas pelo algoritmo que você propôs, passo a passo, sei que ele não está em nada que descartei.

Tão traumático é que pode ter sido feito, na verdade é apenas aproveitar a boa intuição humana. Na verdade, é disso que se trata a programação
também. Não se trata de aprender um mundo completamente novo, mas apenas como aproveitar a intuição e as ideias que você já pode ter e assimilar
naturalmente, mas aprender a expressá-las agora de maneira mais sucinta e precisa, usando coisas chamadas linguagens de programação.

Por que um algoritmo como esse se eu achei John Harvard melhor do que, em última análise, apenas fazer o primeiro ou mesmo o segundo e talvez
voltar para verificar as páginas pares? Bem, vamos apenas olhar para pequenos gráficos aqui. Novamente, não precisamos entrar nas nuances dos
números, mas se tivermos um gráfico aqui, plotagem xy, no eixo x aqui, eu afirmo ser o tamanho do problema. Portanto, medido pelo número de
páginas na lista telefônica.

Portanto, quanto mais longe você for aqui, mais páginas haverá na lista telefônica. E aqui temos tempo para resolver no eixo y. Portanto, quanto
mais alto você subir, mais tempo levará para resolver esse problema específico. Então vamos apenas dizer arbitrariamente que o primeiro
algoritmo, envolvendo como n páginas, pode ser representado graficamente assim. Não importa a inclinação, é uma linha reta porque
presumivelmente há uma relação de um para um entre o número de páginas e o número de segundos ou o número de viradas de página.

Por quê? Se a companhia telefônica adicionar outra página no próximo ano porque algumas pessoas novas se mudaram para a cidade, isso exigirá uma
página adicional para mim. Um a um.

Se, no entanto, usarmos o segundo algoritmo, por mais falho que seja, a menos que voltemos um pouco para consertar alguém que está no meio, isso
também será uma linha reta, mas será uma inclinação diferente porque agora há um 2 para 1 ou um relacionamento de 1 para 2 porque estou indo
para as páginas de cada vez. Portanto, se a companhia telefônica adicionar outra página ou mais duas páginas, ainda será apenas mais uma etapa.

Você pode ver a diferença se eu desenhar isso. Se esta é a lista telefônica em questão, este número de páginas, pode levar tantos segundos na
linha amarela para representar ou encontrar alguém como John Harvard. Mas é claro que no primeiro algoritmo, a linha vermelha, vai literalmente
levar o dobro de passos. E o que significa o n aqui? n é a variável obrigatória para cientista da computação ou programador, apenas
representando genericamente um número. Portanto, se o número de páginas na lista telefônica for n, o número de etapas que o segundo algoritmo
teria executado seria, no pior caso, n sobre 2. Metade porque você está indo duas vezes mais rápido.

Mas o terceiro algoritmo, na verdade, se você se lembrar de seus logaritmos, se parece um pouco com isso. Há uma relação fundamentalmente
diferente entre o tamanho do problema e a quantidade de tempo necessária para resolvê-lo que, tecnicamente, também é baseada em log, mas é
realmente a forma que é diferente. A implicação disso é que, se, por exemplo, Cambridge e Allston, duas cidades diferentes aqui em
Massachusetts, se fundirem no ano que vem e houver apenas uma lista telefônica com o dobro do tamanho, nada demais para o terceiro e último
algoritmo.

Por quê? Você apenas rasga o problema mais uma vez pela metade, pegando mais um byte, é isso, não mais 1.000 bytes só para chegar na solução.
Dito de outra forma, você pode andar muito, muito, muito aqui para uma lista telefônica muito maior e, finalmente, aquela linha verde mal terá
se movido.

Portanto, esta é apenas uma maneira de formalizar e pensar sobre qual pode ser o desempenho ou a qualidade desses algoritmos. Antes de fazermos
agora mais uma formalização do próprio algoritmo, alguma dúvida então sobre essa noção de eficiência ou agora performance de ideias? Sim.
AUDIÊNCIA: Quantas listas telefônicas você tem?

DAVID MALAN: (rindo) Muitas listas telefônicas ao longo dos anos e se você ou seus pais ainda tiverem mais alguma em algum lugar, nós
definitivamente poderíamos usá-las porque são difíceis de encontrar. Outras perguntas? Mas obrigado. Outras perguntas aqui também? Não. Oh, isso
foi um murmúrio? Sim, por aqui.

AUDIÊNCIA: Você pode ter Harry Potter como orador convidado.

DAVID MALAN: Desculpe, diga novamente.

AUDIÊNCIA: Você pode ter Harry Potter como orador convidado.

DAVID MALAN: (rindo) Ah, sim. Esperançosamente. Então teríamos algo mais para usar aqui. Então, agora, se quisermos formalizar mais o que
acabamos de fazer, podemos ir em frente e apresentar isso. Uma forma de código, também conhecido como pseudocódigo. Pseudocódigo não é um idioma
específico, não é como algo que estamos prestes a começar a codificar, é apenas uma maneira de se expressar em inglês ou em qualquer idioma
humano de forma sucinta e correta, a fim de transmitir sua ideia de algoritmo.

Então, por exemplo, aqui pode ser como poderíamos formalizar o código, o pseudocódigo para esse mesmo algoritmo. O primeiro passo foi pegar a
lista telefônica, como eu fiz. A etapa dois pode ser aberta no meio da lista telefônica, como você propôs que fizéssemos primeiro. O terceiro
passo provavelmente foi olhar para as páginas, eu fiz. E a etapa quatro fica um pouco mais interessante porque tive que tomar uma decisão
rapidamente e me fazer uma pergunta. Se a pessoa estiver na página, provavelmente devo seguir em frente e ligar para essa pessoa. Mas
provavelmente não foi o caso, pelo menos para John Harvard, e abri a seção M.

Portanto, há outra pergunta que devo fazer agora, caso contrário, se a pessoa estiver no início do livro, devo dividir o problema pela metade
como fiz, mas ir para a esquerda, por assim dizer, e não apenas abrir no meio da metade esquerda do livro, mas realmente volte para a etapa
três, repita-me. Por quê? Porque posso apenas repetir o que acabei de fazer, mas com um problema menor por ter dado essa grande mordida.

Mas, se a pessoa estava mais tarde no livro, como pode ter acontecido com uma pessoa diferente de John Harvard, então eu deveria abrir no meio
da metade direita do livro, novamente voltar para a linha três, mas novamente, eu Não vou ser sugado fazendo algo assim para sempre porque
continuo diminuindo o tamanho do problema.

Por fim, o único cenário possível que resta, se John Harvard não está na página e não está à esquerda e não está à direita, qual deve ser nossa
conclusão?

AUDIÊNCIA: Ele não está lá.

DAVID MALAN: Ele não está lá. Ele não está listado. Portanto, precisamos sair de alguma outra forma. Agora, como um aparte, é meio deliberado
que eu enterrei essa última pergunta no final, porque isso é o que acontece com muita frequência na programação, seja você novo ou profissional,
apenas não considerando todos os casos possíveis, casos de canto se você vai, isso pode não acontecer com tanta frequência, mas se você não os
antecipar em seu próprio código, pseudocódigo ou outro, é quando e por que os programas podem travar ou você pode dizer estúpidas bolas de praia
giratórias ou ampulhetas ou seu computador pode reiniciar .

Por quê? Está fazendo algo meio imprevisível se um humano, talvez eu, não previsse isso. Como o que este programa faz se John Harvard não
estiver na lista telefônica se eu tivesse omitido as linhas 12 e 13? Não sei. Talvez se comportasse de maneira diferente em um Mac ou PC porque
é um tipo de comportamento indefinido.

Esses são os tipos de omissões que, francamente, você invariavelmente cometerá, bugs que introduzirá, erros que cometerá no início e eu também,
25 anos depois. Mas você ficará melhor em pensar sobre esses casos extremos e lidar com qualquer coisa que possa dar errado e, como resultado,
seu código ficará melhor por isso.

Agora, o problema em aprender a programar, especialmente se você nunca teve experiência ou mesmo se você aprendeu, mas aprendeu apenas um
idioma, é que todos eles parecem um pouco enigmáticos à primeira vista. Mas eles compartilham certas semelhanças. Na verdade, usaremos esse
pseudocódigo para defini-los primeiro.

Destacados em amarelo, aqui estão as funções que doravante vamos começar a chamar. Existem muitas linguagens de programação diferentes, mas a
maioria delas tem o que poderíamos chamar de funções, que são ações ou verbos que resolvem algum problema menor. Ou seja, você pode usar um
monte de funções para resolver um problema maior porque cada função tende a fazer algo muito específico ou preciso. Estes então em inglês podem
ser traduzidos em código, código de computador real, para essas coisas chamadas funções.

Destacados em amarelo agora estão o que poderíamos chamar de condicionais. Condicionais são coisas que você faz condicionalmente com base na
resposta a alguma pergunta. Você pode pensar neles como bifurcações na estrada. Você vai para a esquerda ou para a direita ou alguma outra
direção com base na resposta a alguma pergunta?

Bem, quais são essas perguntas? Destacado agora em amarelo ou o que chamaríamos de expressões booleanas, em homenagem a um sobrenome matemático
Bool, que simplesmente têm respostas sim e não. Ou, se preferir, respostas verdadeiras ou falsas ou, diabos, se preferir 1 ou 0 respostas. Só
precisamos distinguir um cenário do outro.

A última coisa que se manifesta neste pseudocódigo é o que posso destacar agora e chamar de loops. Algum tipo de ciclo, algum tipo de diretriz
que nos diz para fazer algo de novo e de novo para que eu não precise de um programa de 1.000 linhas para pesquisar em um catálogo telefônico de
1.000 páginas, posso me safar com um programa de 13 linhas, mas meio que me repito inerentemente para resolver algum problema até chegar à
última etapa.

Portanto, isso é o que podemos chamar de pseudocódigo e, de fato, existem outras características de programas que abordaremos em breve, coisas
como argumentos e valores de retorno, variáveis ​
e muito mais, mas infelizmente na maioria das linguagens, incluindo algumas, iremos
deliberadamente use nesta classe e que todos no mundo real hoje em dia ainda usam, seus programas tendem a se parecer com isso.

Este, por exemplo, é uma destilação daquele primeiro programa que escrevi em 1996 no próprio CS50 apenas para imprimir algo na tela. Na verdade,
esta versão aqui apenas tenta imprimir entre aspas, "Hello, world". O que é, ouso dizer, a primeira coisa mais canônica que quase qualquer
programador faz um computador dizer só porque sim, mas olhe para essa bagunça. Quero dizer, há um símbolo de hash, esses colchetes angulares,
parênteses, palavras como int, chaves, aspas, parênteses, ponto-e-vírgula e barras invertidas. Quero dizer, há mais sobrecarga e mais sintaxe e
confusão do que uma ideia real.

Agora, isso não quer dizer que você não será capaz de entender isso em breve, porque honestamente não há muitos padrões, na verdade, as
linguagens de programação normalmente têm um vocabulário muito menor do que qualquer linguagem humana real, mas a princípio pode realmente
parecer bastante enigmático . Mas talvez você possa inferir que ainda não tenho ideia do que essas outras linhas fazem, mas "Olá, mundo". é
presumivelmente entre aspas o que será impresso na tela.

Mas o que vamos fazer hoje, depois de uma pequena pausa, e preparar o terreno para a próxima semana, é introduzir exatamente essas mesmas ideias
em pouco tempo usando o Scratch, algo que vocês mesmos podem ter usado quando eram bem mais jovens, mas sem o mesmo vocabulário aplicado a essas
ideias. A vantagem do que faremos em breve usando o Scratch, essa linguagem de programação gráfica de nossos amigos do MIT, nos permitirá hoje
começar a arrastar e soltar coisas que parecem peças de quebra-cabeça que se encaixam se fizerem sentido lógico para fazer isso, mas sem a
distração de hashes, parênteses, chaves, colchetes, ponto-e-vírgula e coisas que estão fora de questão.

Mas, por enquanto, vamos fazer uma pausa de 10 minutos aqui e, quando retomarmos, começaremos a programar.
Então, esta na tela é uma linguagem chamada C, algo em que vamos mergulhar na próxima semana e, felizmente, agora na tela é outra linguagem
chamada Python, que também veremos em algumas semanas em breve, juntamente com outras linguagens ao longo do caminho. Hoje, porém, e nesta
primeira semana, semana zero, por assim dizer, usamos o Scratch porque novamente ele nos permitirá explorar alguns desses fundamentos de
programação que serão em C e em Python e em JavaScript e outras linguagens também, mas de uma forma em que não precisamos nos preocupar com as
distrações da sintaxe.

Então o mundo do Scratch se parece com isso. É um ambiente de programação baseado na Web ou para download que tem esse layout aqui por padrão. À
esquerda, veremos em breve uma paleta de peças de quebra-cabeça, blocos de programação que representam todas as ideias que acabamos de discutir.
E arrastando e soltando essas peças de quebra-cabeça ou blocos sobre essa grande área e conectando-os, se fizer sentido lógico fazer isso,
começaremos a programar nesse ambiente.

O ambiente permite que você tenha vários sprites, por assim dizer. Vários personagens, coisas como um gato ou qualquer outra coisa, e esses
sprites existem neste mundo retangular aqui em cima que você pode tela cheia para aumentar e isso aqui por padrão é o Scratch, que pode mover
para cima, baixo, esquerda, direita e fazer muitos mais coisas também. Dentro do mundo do Scratch, você pode pensar nele como talvez um sistema
de coordenadas familiar com Xs e Ys, que é útil apenas quando chega a hora de posicionar as coisas na tela.

No momento, Scratch está no padrão, 0,0, onde x é igual a 0 e y é igual a 0. Se você mover o gato para cima, x permanecerá zero, y será 180
positivo. Se você mover o gato todo o caminho até o fundo, x ficaria zero, mas y agora seria menos 180. E se você fosse para a esquerda, x se
tornaria menos 240, mas y ficaria 0, ou para a direita, x seria 240 e y ficaria zero .

Portanto, esses números geralmente não importam muito porque você pode se mover relativamente neste mundo para cima, para baixo, para a
esquerda, para a direita, mas quando chegar a hora de posicionar com precisão alguns desses sprites ou outras imagens, será útil apenas para
tenha esse modelo mental para cima, para baixo, para a esquerda e para a direita.

Bem, vamos em frente e fazer talvez o mais simples dos programas aqui. Vou mudar para o mesmo ambiente de programação agora para um passeio pelo
lado esquerdo. Então, por padrão, aqui está selecionada a categoria em movimento azul, que tem um monte de peças de quebra-cabeça ou blocos
relacionados ao movimento. E enquanto o Scratch como linguagem gráfica categoriza as coisas pelo tipo de coisas que essas peças fazem, veremos
que ao longo de toda essa paleta teremos funções e variáveis ​
e condicionais e expressões booleanas e mais cada uma em uma cor e forma diferente.

Assim, por exemplo, mover 10 passos ou virar para um lado ou para o outro seriam funções categorizadas aqui como coisas como movimento. Sob
aparência em roxo, você pode ter balões de fala que pode criar arrastando e soltando-os que podem dizer "olá" ou qualquer outra coisa por alguns
segundos. Ou você pode trocar de roupa, mudar o gato para se parecer com um cachorro ou um pássaro ou qualquer outra coisa intermediária. Sons
também. Você pode tocar sons como "miau" ou qualquer coisa que você mesmo possa importar ou gravar.

Depois, há essas coisas que o Scratch chama de eventos e a mais importante delas é a primeira, quando a bandeira verde é clicada. Porque se
olharmos para a direita do mundo do Scratch aqui, esta região retangular tem esta bandeira verde e sinal de parada vermelho acima, um dos quais
é para Play e outro para Stop e isso nos permitirá iniciar e parar nossos programas reais quando a bandeira verde é clicada inicialmente.

Mas você pode ouvir outros tipos de eventos quando a barra de espaço é pressionada ou outra coisa, quando este sprite é clicado ou outra coisa.
Aqui você já vê como a encarnação de um programador de coisas que você e eu tomamos como garantidas como todos os dias agora em nossos
telefones. Sempre que você tocar em um ícone ou arrastar o dedo ou apertar um botão ao lado. Isso é o que um programador chamaria de eventos,
coisas que acontecem e muitas vezes são acionadas por nós humanos e coisas que um programa seja em Scratch ou Python ou C ou qualquer outra
coisa pode ouvir e responder.

Na verdade, é por isso que quando você toca no ícone do telefone em seu telefone, o aplicativo do telefone é iniciado porque alguém escreveu um
software que está ouvindo o toque do dedo naquele ícone específico. Portanto, o Scratch também tem essas mesmas coisas.
Em Controle em laranja, você pode ver que podemos esperar um segundo ou repetir algo algumas vezes, 10 por padrão, mas podemos alterar qualquer
coisa nesses círculos brancos para qualquer outra coisa. Há outra peça do quebra-cabeça aqui para sempre, o que implica algum tipo de loop onde
podemos fazer algo de novo e de novo. Mesmo que pareça um pouco apertado, não há muito espaço para encaixar algo lá, o Scratch vai fazer essas
coisas crescerem e encolherem, mas queremos preencher peças de formato semelhante.

Aqui estão esses condicionais. Se algo for verdadeiro ou falso, faça a próxima coisa. E é assim que podemos colocar esta pequena forma de
trapézio. Alguma forma de expressão booleana, uma pergunta com resposta sim/não, verdadeiro/falso ou um/zero e decidir se deve fazer algo ou
não. Você também pode combinar essas coisas. Se algo for verdade, faça isso, caso contrário, faça outra coisa. E você pode até colocar um dentro
do outro se quiser fazer três, quatro ou mais perguntas.

Sentir, também, vai ser uma coisa. Você pode fazer perguntas, também conhecidas como expressões booleanas, como o sprite está tocando o ponteiro
do mouse, a seta na tela? Para que você possa começar a interagir com esses programas. Qual é a distância entre um sprite e um ponteiro do
mouse? Você pode fazer cálculos simples apenas para descobrir se o inimigo está se aproximando do gato.

Em Operador, algumas coisas de nível inferior, como matemática, mas também a capacidade de escolher números aleatórios, o que é ótimo para um
jogo, porque você pode variar a dificuldade ou o que está acontecendo em um jogo sem que o mesmo jogo seja jogado da mesma maneira todas as
vezes. E você pode combinar ideias. Algo e algo deve ser verdadeiro para tomar esse tipo de decisão antes. Ou podemos até juntar duas palavras.
Diz maçã e banana por padrão, mas você pode digitar ou arrastar e soltar o que quiser para combinar várias palavras em frases maiores e
completas.

Por fim, aqui embaixo, há coisas em laranja chamadas variáveis. Em matemática, obviamente temos x e y e outros enfeites. Na programação, teremos
a mesma capacidade de armazenar nesses símbolos nomeados, x ou y, os valores que nos interessam. Números ou letras ou palavras ou cores ou
qualquer coisa, em última instância. Mas na programação você verá que é muito mais convencional não apenas usar letras simples como x e y e z,
mas na verdade dar às variáveis ​
palavras singulares ou plurais completas para descrever o que elas são.

Então, por último, se isso não for suficiente para você, você pode criar seus próprios blocos. De fato, este será um princípio de programação
que aplicaremos hoje e com o primeiro problema definido, quando você começar a montar essas peças do quebra-cabeça e perceber, oh, teria sido
bom se essas várias peças pudessem ter sido substituídas por alguém pensou no MIT em me dar aquela peça do quebra-cabeça, você mesmo pode fazer
seus próprios blocos conectando-os todos juntos, dando-lhes um nome, e bum, uma nova peça do quebra-cabeça existirá.

Então, vamos fazer os programas mais simples e canônicos aqui, começando com o controle, e vou clicar e arrastar e soltar isso aqui quando a
bandeira verde clicar. Em seguida, vou pegar mais um, por exemplo, em Looks, e em Looks, vou em frente e apenas digo algo como inicialmente não
apenas Hello, mas o mundo mais canônico da vírgula Hello. Agora você pode imaginar que neste ambiente de programação, posso ir aqui agora e
clicar na bandeira verde e pronto, Olá, mundo da vírgula.

Então esse é meu primeiro programa e obviamente muito mais amigável do que digitar o texto muito mais enigmático que vimos na tela que você
também digitará na próxima semana. Mas, por enquanto, vamos nos concentrar apenas nessas ideias, neste caso, uma função. Então o que é que
acabou de acontecer? Este bloco roxo aqui é Say, essa é a função, e parece ter alguma forma de entrada no oval branco, especificamente Hello
vírgula mundo.

Bem, isso realmente se encaixa no paradigma que vimos anteriormente de apenas entradas e saídas. Então, se me permite, se você considerar o que
esta peça do quebra-cabeça está fazendo, ela realmente se encaixa neste modelo. A entrada neste caso será Hello comma world in white. O
algoritmo será implementado como uma função do MIT chamada Say e a saída disso será algum tipo de efeito colateral, como o gato e o balão de
fala dizendo Olá, mundo. Portanto, mesmo aquele simples arrastar e soltar imita exatamente esse modelo mental relativamente simples.

Então, vamos levar as coisas adiante. Vamos em frente agora e tornar o programa um pouco mais interativo para que ele diga algo como Olá, David
ou Olá, Carter ou Olá especificamente para você. E para isso, vou para Sensing. E você pode ter que procurar para encontrar essas coisas na
primeira vez, mas já fiz isso algumas vezes, então meio que sei onde estão as coisas e de que cor. Tem essa função aqui. Pergunte qual é o seu
nome, mas está em branco, então podemos mudar a pergunta para o que quisermos, e vai esperar o humano digitar a resposta.

Essa função chamada Ask é um pouco diferente do bloco Say, que tinha apenas o efeito colateral de imprimir um balão de fala na tela. A função
ask é ainda mais poderosa porque pede ao humano para digitar algo. chamado Resposta. Este pequeno oval azul aqui chamado de Resposta é novamente
uma dessas variáveis ​
que em matemática seriam chamadas apenas de x ou y, mas em programação estamos dizendo o que ela faz.

Então eu vou seguir em frente e fazer isso. Deixe-me ir em frente e arrastar e soltar este bloco e quero fazer a pergunta antes de dizer
qualquer coisa, mas você notará que o Scratch é inteligente e vai perceber que quero inserir algo no meio e só vai mover as coisas para cima e
para baixo. Vou deixar para lá e fazer a pergunta padrão, qual é o seu nome? E agora, se eu quiser ir em frente e dizer olá, David ou Carter,
vamos apenas fazer Olá vírgula, porque obviamente não sei quando estou escrevendo o programa quem vai usá-lo.

Agora, deixe-me pegar outro bloco de aparência aqui, diga algo novamente, e agora deixe-me voltar para Sensing e agora pegue o valor de retorno,
representado por esta outra peça do quebra-cabeça, e deixe-me arrastá-lo e soltá-lo aqui. Observe que é a mesma forma, mesmo que não seja
exatamente do mesmo tamanho. As coisas vão crescer ou encolher conforme necessário.

Tudo bem, então vamos agora diminuir o zoom. Deixe-me ir e parar a versão antiga porque não quero mais dizer Olá, mundo. Deixe-me bater na
bandeira verde e qual é o meu nome? Tudo bem, Davi. Digitar. Huh. Tudo bem, talvez eu não estivesse prestando atenção o suficiente. Deixe-me
tentar novamente. Bandeira verde, DAVID, entra. Isso parece um bug. Qual é o bug ou erro que você pode pensar? Sim?

AUDIÊNCIA: Você precisa de alguma forma adicioná-los na mesma caixa de texto?

DAVID MALAN: Sim, nós meio que queremos combiná-los na mesma caixa de texto. E é tecnicamente um bug porque isso parece meio estúpido. É só
dizer David depois que perguntei meu nome. Eu gostaria de dizer talvez Olá, então David, mas está apenas passando o Olá e imprimindo David. Mas
vamos descobrir por que isso está acontecendo. Você está certo para a solução, mas qual é o problema fundamental real? Atrás.

AUDIÊNCIA: Então ele diz olá, mas chega ao último passo tão rapidamente que você não consegue vê-lo.

DAVID MALAN: Perfeito. Quero dizer, os computadores são muito rápidos hoje em dia. Ele está dizendo Olá, todos nós somos muito lentos nesta sala
até mesmo para vê-lo porque está dizendo David na tela tão rápido também. Portanto, há algumas soluções aqui, e a sua está no local, mas apenas
para bisbilhotar, você verá o primeiro exemplo de quantas maneiras de programação, seja Scratch ou C ou Python ou qualquer outra, que haverá
resolver problemas?

Vamos ensiná-lo ao longo dessas semanas, algumas vezes algumas maneiras são melhores relativamente do que outras, mas raramente há uma melhor
maneira necessariamente, porque, novamente, pessoas razoáveis ​
discordarão. E o que tentaremos ensinar a você nas próximas semanas é como pensar
nessas nuances. E não vai ser óbvio à primeira vista, mas quanto mais programas você escrever, mais feedback você receberá, mais bugs você
introduzirá, mais você se firmará com exatamente esse tipo de solução de problemas.

Então, deixe-me tentar isso de algumas maneiras. Aqui em cima seria uma solução para o problema. O MIT antecipou esse tipo de problema,
especialmente com programadores iniciantes, e eu poderia simplesmente usar uma peça de quebra-cabeça que diz: diga o seguinte por dois segundos
ou um segundo ou o que quer que seja, depois faça o mesmo com a próxima palavra e pode ser meio que um pouco de pausa, Olá, um segundo, dois
segundos, David, um segundo, dois segundos, mas pelo menos pareceria um pouco mais gramaticalmente correto.

Mas posso fazer com um pouco mais de elegância, como você propôs. Deixe-me ir em frente e jogar fora um desses blocos, e você pode simplesmente
arrastar e soltar e ele se apagará. Deixe-me ir para Operadores porque este bloco Join aqui tem a forma certa. Portanto, mesmo que você não
tenha certeza do que vai para onde, concentre-se primeiro nas formas. Deixa eu arrastar isso aqui. Ele cresceu para preencher isso. Deixe-me ir
em frente e dizer olá espaço de vírgula. Agora, por padrão, ele poderia apenas dizer Hello, banana, mas deixe-me voltar para Sensing, Drag
answer, e isso vai arrastar e soltar lá.

Agora observe que estamos empilhando ou aninhando um bloco em outro para que a saída de um se torne a entrada de outro, mas tudo bem aqui.
Deixe-me ir em frente e diminuir o zoom, apertar Stop e apertar Play. Tudo bem, qual é o seu nome? DAVID, entra e pronto. Agora é
presumivelmente como pretendíamos inicialmente.

[APLAUSOS]

(rindo) Oh, obrigado. Obrigada. Não menos 2 desta vez. Portanto, considere que, mesmo com esse exemplo adicional, ele ainda se encaixa no mesmo
modelo mental, mas de uma maneira um pouco mais interessante. Aqui está a nova função Pergunte algo e espere. E observe que neste caso também há
uma entrada, também conhecida daqui em diante como argumento ou parâmetro, linguagem de programação para apenas uma entrada no contexto de uma
função. Se usarmos nosso desenho como antes para representar essa coisa aqui, veremos que a entrada agora será entre aspas "Qual é o seu nome?"

O algoritmo será implementado por meio dessa nova peça do quebra-cabeça, a função chamada Ask, e a saída dessa coisa desta vez não será o gato
dizendo nada, mas sim a resposta real. Portanto, em vez do efeito colateral visual do balão de fala aparecer, agora nada visível está
acontecendo ainda. Graças a esta função, ele está me devolvendo como um pedaço de papel com tudo o que eu digitei escrito nele, para que eu
possa reutilizar DAVID uma ou mais vezes, como fiz.

Agora o que eu fiz então com esse valor? Bem, considere que com a função subseqüente também tivemos este bloco Say, combinado com uma junção.
Portanto, temos essa variável chamada Resposta, estamos juntando-a com o primeiro argumento, Olá. Já vimos que algumas funções como Join podem
receber não um, mas dois argumentos, ou entradas, e tudo bem. A saída de Join presumivelmente será Hello, David ou Hello, Carter ou o que quer
que o humano tenha digitado.

Esse aviso de saída está essencialmente se tornando a entrada para outra função, digamos, só porque meio que empilhamos coisas ou as aninhamos
umas sobre as outras. Mas metodicamente, é realmente a mesma ideia. A entrada agora são duas coisas, Hello vírgula e o valor de retorno da
função Ask anterior. A função agora será Join, a saída será Hello, David. Mas essa saída Hello, David agora se tornará a entrada para outra
função, ou seja, aquele primeiro bloco chamado Say, e isso terá o efeito colateral de imprimir Hello, David na tela.

Então, novamente, tão sofisticados quanto os nossos e os seus, como outros programas vão ficar, eles realmente se encaixam nesse modelo mental
muito simples de entradas e saídas e você só precisa aprender a reconhecer o vocabulário e saber que tipos de peças de quebra-cabeça ou
conceitos a serem aplicados. Mas você pode realmente apimentar essas coisas. Deixe-me voltar ao meu programa aqui que está usando apenas o balão
de fala no momento.

O interior do Scratch também possui alguns recursos interativos bastante sofisticados. Clico no botão Extensões no canto inferior esquerdo. E
deixe-me ir em frente e escolher a extensão Text to Speech. Isso está usando um serviço de nuvem, portanto, se você tiver uma conexão com a
Internet, ele pode se comunicar com a nuvem ou com um serviço de terceiros, e este vai me dar algumas novas peças verdes do quebra-cabeça, ou
seja, a capacidade de falar algo do meu alto-falantes em vez de apenas dizê-lo textualmente.

Então deixe-me ir em frente e arrastar isso. Agora observe que não preciso interligá-los se estiver apenas brincando e quiser mover algumas
coisas. Eu só quero usar isso como uma tela temporariamente. Deixe-me ir em frente e roubar o Join daqui, coloque-o lá, deixe-me jogar fora o
bloco Say apenas movendo-o para a esquerda e soltando, e agora deixe-me juntar isso, então agora mudei meu programa para ser um pouco mais
interessante.

Então agora deixe-me parar a versão antiga. Deixe-me começar o novo. Qual o seu nome? Digite Davi. E voilá:

PROGRAMA: Alô, banana.


DAVID MALAN: (rindo) OK, menos 2 de verdade. Tudo bem, então o que acidentalmente joguei fora, intencionalmente para fins de instrução, foi a
resposta real que voltou do bloco de perguntas. É embaraçoso. Agora, se eu jogar de novo, vamos clicar no ícone verde. Qual o seu nome? Davi. E
agora:

PROGRAMA: Olá, David.

DAVID MALAN: Lá vamos nós. Olá, David. Tudo bem, obrigado.

[APLAUSOS]

OK, então temos essas funções em vigor, mas o que mais podemos fazer? Bem, e aqueles condicionais, loops e outras construções? Como podemos dar
vida a esses programas para que não seja apenas clicar em um botão e pronto, algo está acontecendo? Vamos em frente e tornar isso agora ainda
mais interativo. Deixe-me ir em frente e jogar fora a maioria dessas peças e deixar-me apenas apimentar as coisas com um pouco mais de áudio em
Som. Vou para Play Sound Meow até terminar. Aqui vamos nós, bandeira verde.

[MIAU]

OK, é um pouco alto, mas fez exatamente o que disse. Vamos ouvir de novo.

[MIAU MAIS SILENCIOSO]

OK. Eventualmente, é um programa nada assombroso, já que você gostaria de pensar que o gato miaria sozinho, mas.

[MIAU]

Tenho que continuar apertando o botão. Bem, esta parece ser uma oportunidade para fazer algo de novo e de novo. Então, tudo bem, bem, se eu
quiser miar, miau, miau, deixe-me pegar alguns deles, ou você pode clicar com o botão direito do mouse ou clicar com a tecla Control e copiar e
colar mesmo no código aqui. Deixe-me jogar isso agora.

[TRÊS MIAU]

Tudo bem, então agora não está realmente emocionando a felicidade da mesma maneira. Pode estar com fome ou chateado. Então vamos desacelerar.
Deixe-me ir para o controle, espere um segundo no meio, o que pode ser um pouco menos preocupante. Aqui vamos nós, jogar.

[TRÊS MIADOS MAIS LENTOS]

OK, então se meu objetivo era fazer o gato miar três vezes, ouso dizer que esse código ou algoritmo está correto. Mas vamos agora criticar seu
design. Isso é bem projetado? E se não, por que não? Quais são seus pensamentos aqui? Sim?

AUDIÊNCIA: Você poderia usar para sempre ou uma repetição para torná-lo mais--

DAVID MALAN: Sim, sim, concordo. Eu poderia usar para sempre ou repetir, mas deixe-me forçar um pouco mais. Mas por que? Assim funciona, eu meio
que terminei as tarefas, o que há de ruim nisso?

AUDIÊNCIA: Há muita repetição.


DAVID MALAN: Sim, há muita repetição, certo? Se eu quisesse alterar o som que o gato está fazendo para uma variante diferente de miado ou fazê-
lo latir como um cachorro, eu poderia alterá-lo no menu suspenso aqui, aparentemente, mas teria que alterá-lo aqui e então eu 'teria que mudar
isso aqui, e Deus, se isso fosse ainda mais longo, isso fica entediante rapidamente e você provavelmente está aumentando a probabilidade de
estragar tudo e perder um dos menus suspensos ou algo assim estúpido e introduzir um bug.

Ou, se você quiser alterar o número de segundos que está esperando, precisará alterá-lo em dois, talvez até mais lugares. Novamente, você está
apenas criando riscos para si mesmo e possíveis bugs no programa. Então eu gosto da repetição ou da ideia para sempre, para não me repetir. E,
de fato, o que mencionei ser possível, copiar e colar antes, não significa que seja uma coisa boa. E no código, de um modo geral, quando você
começa a copiar e colar peças de quebra-cabeça ou texto na próxima semana, provavelmente não está fazendo algo muito bem.

Então deixe-me ir em frente e jogar fora a maioria deles para me livrar da duplicação, mantendo apenas dois dos blocos que me interessam. Deixe-
me pegar o bloco Repeat agora, deixe-me mover isso para dentro do bloco Repeat, vai crescer para caber nele, deixe-me reconectar tudo isso e
mudar o 10 apenas para um 3, e agora, Play.

[TRÊS MIADOS LENTOS]

Muito melhor. É a mesma coisa. Ainda está correto, mas agora preparei o cenário para deixar o gato miar, por exemplo, quatro vezes mudando uma
coisa, 40 vezes mudando uma coisa, ou ele pode usar o bloco Forever e simplesmente ir embora e vai miar para sempre em vez disso. Se esse for o
seu objetivo, seria melhor. Um design melhor, mas ainda correto.

Mas você sabe o que? Agora que tenho um programa projetado para fazer um gato miar, uau, por quê? Quero dizer, o MIT inventou o Scratch, Scratch
como um gato, por que não existe uma peça do quebra-cabeça chamada Meow? Isso parece uma oportunidade perdida. Agora, para ser justo, eles nos
deram todos os blocos de construção com os quais poderíamos implementar essa ideia, mas um princípio de programação e realmente da ciência da
computação é alavancar o que agora vamos começar a chamar de Abstração.

Temos instruções passo a passo aqui, o Repeat, o Play e o Wait que implementam coletivamente essa ideia que nós, humanos, chamaríamos de miado.
Não seria bom abstrair essas várias peças do quebra-cabeça em apenas uma que literalmente diz o que faz, miau? Bem, aqui é onde podemos fazer
nossos próprios blocos.

Deixe-me ir aqui para Scratch na categoria de bloco rosa aqui e deixe-me clicar em Make a Block. Aqui vejo uma interface um pouco diferente onde
posso escolher um nome para ela e vou chamá-la de Meow. Eu vou mantê-lo simples. É isso. Ainda não há entradas para miar. Vou clicar em OK.

Agora eu só vou limpar isso um pouco aqui. Deixe-me arrastar e soltar Play Sound e Wait aqui. E sabe de uma coisa? Vou apenas arrastar este
caminho aqui, bem aqui, porque agora que terminei de implementar o Meow, vou literalmente abstraí-lo, meio que fora da vista, fora da mente,
porque agora observe no topo à esquerda, há uma nova peça de quebra-cabeça rosa chamada Meow.

Portanto, neste ponto, eu diria que realmente não importa como o Meow é implementado. Francamente, não sei como Ask or Say foi implementado pelo
MIT. Eles abstraíram essas coisas para nós. Agora eu tenho uma nova peça de quebra-cabeça que apenas diz o que é. E isso agora ainda está
correto, mas sem dúvida um design melhor.

Por quê? Porque é apenas mais legível para mim, para você, é mais fácil de manter quando você olha para o seu código daqui a um ano pela
primeira vez, porque você está finalmente olhando para o primeiro programa que escreveu. Diz o que faz. A função em si tem semântica, que
transmite o que está acontecendo. Se você realmente se preocupa com a implementação do Meow, pode rolar para baixo e começar a mexer nos
detalhes de implementação subjacentes, mas, caso contrário, não precisa mais se preocupar.

Agora sinto que há uma oportunidade adicional aqui para abstração e para fatorar algumas dessas funcionalidades. É meio chato eu ter esse bloco
de repetição que me permite chamar a função Meow, por assim dizer, usar a função Meow três vezes. Não seria bom se eu pudesse chamá-los de
função Meow, também conhecida como função Meow, e passá-la na entrada que diz à peça do quebra-cabeça quantas vezes eu quero que ela mie?

Bem, deixe-me ir em frente e diminuir o zoom e rolar para baixo. Deixe-me clicar com o botão direito do mouse ou clicar com a tecla Control na
peça rosa aqui e escolher Editar, ou posso começar do zero, sem trocadilhos, com uma nova. Agora aqui, em vez de apenas dar a esta coisa um nome
Meow, deixe-me ir em frente e adicionar uma entrada aqui. Vou prosseguir e digitar, por exemplo, n, para o número de vezes para miar, e apenas
para tornar isso ainda mais amigável e autodescritivo, vou adicionar um rótulo, que não tem impacto funcional , é apenas uma estética, e vou
dizer apenas Times, apenas para torná-lo mais parecido com o inglês, neste caso, que me diz o que a peça do quebra-cabeça faz.

Agora vou clicar em OK. E agora eu preciso refinar isso um pouco. Deixe-me ir em frente e pegar em Control um bloco de repetição, deixe-me mover
Play, Sound e Wait para o bloco de repetição. Não quero 10 e também não quero 3 aqui. O que eu quero agora é este n que é minha variável real
que o Scratch está criando para mim que representa qualquer entrada que o programador humano forneça. Observe que se encaixa bem no lugar.
Deixe-me conectar isso e agora voila, tenho uma versão ainda mais sofisticada do Meow que é parametrizada. Leva entrada que afeta seu
comportamento de acordo.

Agora vou rolar de volta para cima, porque fora da vista, fora da mente, só me importo que o Meow exista. Agora posso apertar meu código, por
assim dizer, usar ainda menos linhas para fazer a mesma coisa jogando fora o bloco Repeat, reconectando esta nova peça do quebra-cabeça aqui que
recebe uma entrada como 3 e pronto, agora estamos realmente programando, certo? Não fizemos nenhum progresso funcional. A coisa apenas mouse
três vezes. Mas é um projeto melhor.

À medida que você programa mais e mais, esses são os tipos de instintos que ainda começam a adquirir, de modo que você pode começar a fazer uma
grande tarefa, um grande conjunto de problemas, algo até para o dever de casa, que parece meio opressor no começo, como, oh meu Deus por onde eu
começo? Mas se você começar a identificar quais são os subproblemas de um problema maior? Então você pode começar a progredir.

Eu faço isso até hoje, onde se eu tiver que lidar com algum projeto relacionado à programação, é tão fácil arrastar meus pés e ugh, vai demorar
uma eternidade para começar, até que eu comece a escrever como uma lista de tarefas e eu começo a modularize o programa e diga, tudo bem, o que
eu quero que isso faça? Miando. O que isso significa? Eu tenho que dizer algo na tela. Tudo bem, preciso que ele diga algo na tela algumas
vezes.

Como literalmente uma lista de verificação mental ou escrita, ou código pseudocódigo, se preferir, em inglês em um pedaço de papel ou arquivo de
texto, e então você pode decidir, OK, a primeira coisa que preciso fazer como dever de casa para resolver este problema do mundo real , Eu só
preciso de uma função Meow. Também preciso usar vários outros códigos, mas preciso criar uma função Meow e bum, agora você tem uma parte do
problema resolvida, não muito diferente do que fizemos com a lista telefônica, mas, neste caso, vamos presumivelmente outros problemas para
resolver.

Tudo bem, então o que mais podemos fazer? Vamos adicionar mais algumas peças ao quebra-cabeça aqui. Vamos realmente interagir com o gato agora.
Deixe-me ir em frente e agora, quando a bandeira verde for clicada, deixe-me ir em frente e fazer uma pergunta usando um evento aqui. Deixe-me
ir em frente e dizer, vamos ver, eu quero fazer algo como implementar a noção de acariciar o gato. Então, se o cursor estiver tocando o gato
como aqui, algo assim, seria fofo se o gato miasse como se você estivesse acariciando um gato.

Então, vou fazer a pergunta, quando a bandeira verde for clicada, se vamos ver, acho que preciso de Sensing. Então, se tocar o ponteiro do
mouse, isso é muito grande, mas novamente a forma está boa, então lá vai. Cresceu para encher. E então, se estiver tocando o ponteiro do mouse,
ou seja, se o gato para quem este script ou este programa, sempre que eu anexar peças de quebra-cabeça, o MIT as chama de script ou como um
programa, se você quiser, deixe-me ir em frente e escolher um som e diga reproduzir som miau até terminar.

Tudo bem, então aqui está para ficar claro. Quando a bandeira verde for clicada, faça a pergunta, se o gato estiver tocando o ponteiro do mouse,
coloque o som miau. Aqui vamos nós. Toque.
[SILÊNCIO]

Tudo bem, vamos tentar novamente. Toque.

[SILÊNCIO]

Huh. Estou preocupado que não seja culpa do Scratch. Parece meu. Qual é o problema aqui? Por que isso não funciona? Sim, atrás, quem acabou de
virar.

AUDIÊNCIA: [INAUDÍVEL]

DAVID MALAN: Sim, o problema é que, no momento em que clico na bandeira verde, Scratch faz a pergunta: o gato está tocando o ponteiro do mouse?
E obviamente não é porque o cursor estava lá em cima um momento atrás e não está lá embaixo. Tudo bem se eu mover o cursor até lá, mas é tarde
demais. O programa já fez a pergunta. A resposta foi não ou falsa ou zero, como você quiser pensar sobre isso, então nenhum som foi tocado.

Então, qual pode ser a solução aqui? Eu poderia mover meu cursor rapidamente, mas parece que nunca vai funcionar direito. Outras soluções aqui?
Sim, no caminho de volta?

Você poderia usar o loop forever?

O loop para sempre. Então, eu poderia realmente usar esse loop Forever porque se eu quiser que meu programa apenas me ouça constantemente, bem,
vamos literalmente fazer algo para sempre, ou pelo menos para sempre, desde que o programa esteja em execução até que eu pressione Stop
explicitamente. Então deixe-me pegar isso. Deixe-me ir para o controle, deixe-me pegar o bloco Forever, deixe-me mover o If dentro deste bloco
Forever, reconecte isso, volte aqui, clique na bandeira verde e agora nada aconteceu ainda, mas deixe-me tentar mover meu cursor agora.

[MIAU]

Oh. Então agora.

[MIAU]

Isso é meio fofo. Então agora o gato está realmente respondendo e vai continuar fazendo isso de novo e de novo. Então agora temos essa ideia de
pegar essas ideias diferentes, essas diferentes peças de quebra-cabeça, reunindo-as em algo mais complicado. Eu definitivamente poderia colocar
um nome nisso. Eu poderia criar um bloco personalizado, mas por enquanto vamos apenas considerar que tipo de interatividade podemos fazer.

Deixe-me ir em frente e fazer isso. Ao pegar novamente um, quando a bandeira verde clicar, deixe-me ir em frente e clicar na detecção de vídeo,
e vou girar o laptop porque, caso contrário, teremos uma pequena coisa inicial aqui, onde a câmera está captando a câmera está lá em cima. Vou
revelar a vocês o que está dentro do púlpito aqui enquanto giramos isso.

Agora que temos um pano de fundo sem vídeo, vou dizer isso. Em vez de clicar na bandeira verde, na verdade, direi que quando o movimento do
vídeo for maior do que alguma medida arbitrária de movimento, irei em frente e tocarei o som miau até terminar. E então eu vou sair do caminho.

Então aqui está o gato. Vamos colocá-los lá em cima.

[MIAU]

OK. Tudo bem, e vamos lá.


[MIAU]

Então minha mão está se movendo mais rápido do que 50 algo ou outro, qualquer que seja a unidade de medida.

[MIAU]

AUDIÊNCIA: Ah.

DAVID MALAN: (rindo) Obrigado. Então agora temos uma versão ainda mais interativa.

[MIAU]

Mas eu acho que se eu meio que devagar.

[RISONHO]

(Risos) Certo? É completamente assustador, mas não estou indo além do limite...

[MIAU]

Até que finalmente minha mão se move tão rápido quanto isso. E aqui está uma oportunidade de mostrar algo que um ex-aluno fez. Deixe-me
prosseguir aqui e--

[MIAU DUAS VEZES]

OK, tenho que parar com isso. Deixe-me ir em frente e diminuir o zoom daqui a pouco.

[MIAU]

Se alguém fosse--

[RISONHO]

(Risos) Se alguém se sentisse confortável em aparecer não apenas mascarado, mas também na câmera da internet, pensei em tocar um dos projetos de
seu ex-colega aqui no palco. Alguém gostaria de ser voluntário aqui e subir no palco? Quem é aquele? Sim. Desça. Qual o seu nome?

AUDIÊNCIA: Sahar.

DAVID MALAN: Sahar. Tudo bem, desça. Deixe-me configurar para você aqui.

[MIAU]

[APLAUSOS]

[MIAU]
Tudo bem, deixe-me ir em frente e mostrar isso aqui em tela cheia. Portanto, isso é uma toupeira de um de seus predecessores mais firmes. Ele
vai usar a câmera focando na sua cabeça, que terá que se posicionar dentro desse retângulo. Você já jogou o jogo whack-a-mole em um fliperama?

AUDIÊNCIA: Sim.

DAVID MALAN: OK. Então, para aqueles que não o fizeram, essas pequenas toupeiras aparecem e com um martelo muito felpudo você meio que bate.
Você, porém, se não se importa, vai usar a cabeça para fazer isso virtualmente. Então, vamos alinhar sua cabeça com este retângulo vermelho, se
puder, faremos iniciante.

[MÚSICA, TOCANDO]

Tudo bem, aqui vamos nós. Sahar. Espere um momento. OK, chegue um pouco mais perto.

[DING]

E agora acerte as toupeiras com a cabeça.

[DING]

Vamos lá, um ponto.

[DING]

Um ponto.

[DING]

Agradável. faltam 15 segundos. Aqui vamos nós. Oh sim. Um ponto.

[RISONHO]

[DING]

Seis segundos.

AUDIÊNCIA: Ah, não.

DAVID MALAN: Lá vamos nós. Rápido!

[DING]

Muito bem, uma salva de palmas para Sahar. Obrigada.

[APLAUSOS]

Portanto, além de se divertir um pouco aqui, o objetivo era demonstrar que, usando alguns blocos de construção bastante simples e primitivos,
mas montando-os de maneira divertida com um pouco de música, talvez algumas novas roupas ou obras de arte, você pode realmente trazer programas
para a vida. Mas, no final das contas, as únicas peças do quebra-cabeça realmente envolvidas eram aquelas que acabei de arrastar e soltar e mais
algumas, porque havia claramente muitos sinais.

Portanto, o aluno provavelmente criou alguns sprites diferentes, não um único boné, mas pelo menos quatro toupeiras diferentes. Eles tinham
algum tipo de gráfico na tela que mostrava a Sahar onde posicionar a cabeça. Havia algum tipo de cronômetro, talvez uma variável que contava
cada segundo. Então você pode imaginar pegar o que parece ser um projeto bastante impressionante à primeira vista, e talvez opressor para
resolver sozinho, mas pense em quais são os blocos de construção básicos? E retire uma peça do quebra-cabeça, por assim dizer, de cada vez.

Então, de fato, se retrocedermos um pouco. Deixe-me prosseguir aqui e apresentar um programa que eu mesmo criei na pós-graduação, quando o
Scratch foi desenvolvido pela primeira vez pelo MIT. Deixe-me ir em frente e abrir aqui, me dê apenas um segundo, algo que chamei na época do
Oscar Time que se parece um pouco com isso. Se eu colocar em tela cheia e clicar em Play.

[MUSIC - SESAME STREET, "I LOVE TRASH"]

OSCAR, O RUGIDO: (CANTANDO) Oh, eu amo lixo.

DAVID MALAN: Então você notará que um pedaço de lixo está caindo. Eu posso clicar nele e arrastar e conforme chego perto da lixeira posso notar

OSCAR THE GROUCH: (CANTANDO) Qualquer coisa esfarrapada ou--

DAVID MALAN: Quer entrar, parece. E se eu deixar ir--

OSCAR, O RUGIDO: (CANTANDO) Sim, eu...

DAVID MALAN: Um ponto. Aí vem outro.

OSCAR THE GROUCH: (CANTANDO) Se você realmente quer ver algo inútil--

DAVID MALAN: Farei o mesmo, dois pontos.

OSCAR O RUGIDO: (CANTANDO) Eu tenho aqui um tênis que está esfarrapado e gasto--

DAVID MALAN: Há um tênis caindo do céu, então outro sprite de algum tipo.

OSCAR, O RUGIDO: (CANTANDO) Os cadarços estão rasgados. Um presente da minha mãe--

DAVID MALAN: Eu também posso ficar um pouco preguiçoso e simplesmente deixá-los cair no lixo se eu quiser. Então você pode ver que não tem a ver
com o cursor do mouse, tem a ver aparentemente com a distância aqui. Vamos ouvir um pouco mais. Acho que algum lixo adicional está prestes a
aparecer. Presumivelmente, há algum tipo de variável que acompanha essa pontuação.

OSCAR, O RUGIDO: (CANTANDO) Eu amo...

DAVID MALAN: OK, vamos ver qual é o último refrão aqui.

OSCAR, O RUGIDO: (CANTANDO) Coisa podre. Tenho aqui um jornal, crocante e

DAVID MALAN: OK, e assim ele continua. E a música realmente continua e continua e eu não tenho boas lembranças de implementá-la e ouvi-la por 10
horas seguidas, mas é um bom exemplo para apenas considerar como esse programa foi composto? Como fiz para implementá-lo na primeira vez? E
deixe-me ir em frente e abrir alguns programas agora que escrevi com antecedência apenas para que pudéssemos ver como essas coisas são montadas.

Honestamente, a primeira coisa que provavelmente fiz foi algo mais ou menos assim. Aqui está apenas uma versão do programa em que resolvi
resolver apenas um problema primeiro de plantar um poste de luz no programa. Certo? Eu meio que tive uma visão do que eu queria. Você sabe,
evoluiu com o tempo, certamente, mas eu sabia que queria que o lixo caísse, queria que um pequeno e fofo Oscar the Grouch saísse da lata de lixo
e algumas outras coisas, mas uau, isso é muito para resolver de uma vez .

Vou começar fácil, baixar uma foto de um poste de luz e, em seguida, arrastá-la e soltá-la no palco como uma fantasia e bum, essa é a versão um.
Não faz nada funcionalmente. Quero dizer, literalmente, esse é o código que escrevi para fazer isso. Tudo o que fiz foi usar o recurso Backdrops
e arrastar e soltar e mover as coisas, mas isso me levou à versão um do meu programa.

Então, qual pode ser a versão dois? Bem, eu considerei que parte da funcionalidade francamente poderia ser a mais fácil de arrancar a seguir e a
lata de lixo. Isso parece ser uma peça central de funcionalidade. Ele só precisa ficar sentado lá a maior parte do tempo. Então, a próxima coisa
que provavelmente fiz foi abrir, por exemplo, a versão da lata de lixo aqui que parece algo assim agora.

Então desta vez vou mostrar o que tem aqui dentro. Existe algum código, mas não muito. Observe que, no canto inferior direito, altero o gato
padrão para a imagem de uma lata de lixo, mas é o mesmo princípio que posso controlar. E então aqui eu adicionei este código. Quando a bandeira
verde for clicada, mude a fantasia para algo que chamei arbitrariamente de Oscar 1. Então, encontrei algumas fotos diferentes de uma lata de
lixo, uma que parece fechada, uma que parece parcialmente aberta e, finalmente, uma que mostra o Oscar saindo , e eu apenas dei a eles nomes
diferentes.

Então eu disse Troque para o Oscar 1, que é o fechado por padrão, então sempre faça o seguinte: se tocar no ponteiro do mouse, troque a fantasia
para o Oscar 2, caso contrário, mude para o Oscar 1. Ou seja, eu só queria para implementar essa ideia da lata abrindo e fechando, mesmo que não
seja exatamente o que eu queria, eu só queria fazer algum progresso.

Então aqui, quando executo este programa clicando em Reproduzir, observe o que acontece. Nada ainda, mas se eu me aproximar da lata de lixo, ela
realmente se abre porque está sempre ouvindo se o sprite, a lata de lixo neste caso, está tocando o ponteiro do mouse. E é isso. Essa foi a
versão 2, se você quiser.

Se eu entrar agora e adicionar o poste de luz e compor o programa juntos, agora estamos começando a progredir. Certo? Agora, pareceria um pouco
mais com o programa que pretendia criar. Que pedaço eu provavelmente mordi depois disso? Bem, acho que o que fiz foi provavelmente decidir
deixar-me implementar um dos pedaços de lixo, não o sapato no jornal de uma vez. Vamos fazer com que um pedaço de lixo funcione corretamente
primeiro.

Então deixe-me ir em frente e abrir este. E, novamente, todos esses exemplos estarão disponíveis no site do curso para que você também possa ver
todos esses exemplos. Não é muito longo, apenas o implemento com antecedência para que possamos folheá-lo rapidamente. Aqui está o que eu fiz
aqui. Do lado direito, transformei meu sprite em um pedaço de lixo desta vez em vez de um gato, em vez de uma lata de lixo, e também criei, com
a ajuda de Carter, um segundo sprite, este um chão. É literalmente apenas uma linha preta porque inicialmente eu só queria ter alguma noção de
um piso para poder detectar se o lixo está tocando o chão.

Agora sem ver o código ainda, apenas ouvindo aquela descrição, por que eu poderia querer o segundo sprite e esta linha preta para um chão com o
lixo pretendendo cair do céu? O que eu poderia estar pensando? Como o problema que eu poderia estar tentando resolver? Sim?

AUDIÊNCIA: Você não quer que o primeiro sprite passe por ele.

DAVID MALAN: Sim, você não quer que o primeiro sprite comece no topo, passe e, em seguida, bum, você o perca completamente. Isso não seria uma
coisa muito útil. Ou talvez pareça consumir cada vez mais a memória do computador se o lixo estiver caindo sem parar e eu não conseguir agarrá-
lo. Pode ser um pouco traumático se você tentar obtê-lo e não conseguir puxá-lo de volta e não conseguir consertar o programa. Então eu só
queria que a coisa parasse.

Então, como eu poderia ter implementado isso? Vejamos o código à esquerda. Aqui eu tenho um pouco de aleatoriedade, como propus anteriormente.
Existe uma função azul chamada Go To x, y que me permite mover um sprite para qualquer posição, para cima, baixo, esquerda, direita, eu escolhi
um local x aleatório, aqui ou aqui, 240 negativo para 240 positivo e depois ay valor de 180, que é o máximo.

Isso só torna o jogo mais interessante. É meio chato rapidamente se o lixo sempre cai do mesmo lugar. Aqui está um pouco de aleatoriedade, como
a maioria dos jogos teria, que apimenta as coisas.

Agora, se eu clicar na bandeira verde, você verá que ela simplesmente cai, nada de interessante vai acontecer, mas ela para quando toca a linha
preta porque observe o que fizemos aqui. Estou sempre me perguntando se a distância do sprite, o lixo, até o chão é maior que zero, tudo bem.
Altere a localização de y por menos 3. Portanto, mova-o para baixo 3 pixels, para baixo 3 pixels, até que a distância até o chão não seja maior
que zero, seja zero ou mesmo negativo, ponto em que ele deve parar de se mover completamente.

Poderíamos ter implementado isso de outras maneiras, mas parecia uma maneira legal e limpa que, logicamente, fazia sentido. OK, agora eu tenho
um pouco de lixo caindo, eu tenho uma lata de lixo que abre e fecha, eu tenho um poste de luz, agora eu dei uns bons três passos no programa.
Estamos progredindo.

Se considerarmos uma ou duas peças finais, algo como arrastar o lixo, deixe-me abrir esta versão 2. Arrastar o lixo requer um tipo diferente de
pergunta. Deixa eu ampliar aqui. Aqui está o pedaço de lixo. Eu só preciso de um sprite, sem chão aqui, porque eu só quero que o humano o mova
para cima, para baixo, para a esquerda, para a direita e o humano não será fisicamente capaz de movê-lo para fora do mundo.

Se ampliarmos esse código, a maneira como resolvemos isso é a seguinte. Estamos usando essa conjunção E que vislumbramos anteriormente, porque
quando a bandeira verde é clicada, estamos sempre fazendo essa pergunta ou realmente essas perguntas, plural, se o mouse estiver pressionado e o
lixo estiver tocando o ponteiro do mouse, isso é equivalente logicamente para clicar no lixo. Vá em frente e mova a lixeira para o ponteiro do
mouse.

Então, novamente, é preciso essa ideia muito familiar que você e eu tomamos como certa todos os dias em Macs e PCs de clicar, arrastar e soltar.
Como isso é implementado? Bem, Mac OS ou Windows provavelmente estão fazendo uma pergunta. Para cada ícone, o mouse está pressionado e o ícone
está tocando o mouse? Nesse caso, vá para o local do mouse para sempre enquanto o botão do mouse é pressionado.

Então, como isso funciona na realidade agora? Deixe-me ir em frente e clicar no Play. A princípio nada acontece, mas se eu clicar nele, posso
movê-lo para cima, para baixo, para a esquerda, para a direita. Não se move depois disso. Portanto, agora preciso combinar essa ideia de
arrastar com cair, mas aposto que poderia começar a usar apenas um único programa. No momento, estou usando alguns separados para mostrar ideias
diferentes, mas agora isso é outra parte do problema.

Se fizermos um último, algo como o placar é interessante, porque lembre-se de que toda vez que arrastávamos um pedaço de lixo para dentro da
lata, Oscar saía e nos dizia o placar atual. Então deixe-me ir em frente e encontrar este aqui, variáveis ​
do Oscar, e deixe-me ampliar este
aqui. Este é mais longo porque combinamos todos esses elementos. Então, esse é o tipo de coisa que, se você olhar à primeira vista, tipo, não
tenho ideia de como teria implementado isso do nada, literalmente do zero.

Mas, novamente, se você pegar sua visão e componenizá-la nesses problemas menores e pequenos, poderá dar esses passos de bebê, por assim dizer,
e então resolver tudo coletivamente. Então, o que há de novo aqui é este inferior. Para sempre, faça o seguinte: se o lixo estiver tocando
Oscar, o outro sprite que agora adicionamos ao programa, altere a pontuação em 1. Isso é uma laranja e, de fato, se dermos uma olhada, veremos
que laranja é uma variável , como um x ou y, mas com um nome melhor, alterá-lo significa adicionar 1 ou, se for negativo, subtrair 1.
Então vá em frente e peça ao lixo para escolher aleatoriamente. O que é isso tudo? Bem, deixe-me mostrar o que está fazendo e então podemos
inferir de trás para frente. Deixe-me ir em frente e apertar Play. Tudo bem, está caindo, estou clicando e arrastando, estou movendo e estou
soltando. Tudo bem, deixe-me fazer isso mais uma vez. Deixando ir, deixe-me parar. Por que tenho essa função no final chamada Ir para x e y
aleatoriamente? Tipo, que problema isso está resolvendo aqui? Sim, no caminho de volta.

AUDIÊNCIA: Apenas a mesma faixa teletransportada para o topo depois de colocá-la na lata de lixo.

DAVID MALAN: Sim, exatamente. Mesmo que o humano perceba isso como um monte de lixo caindo do céu, na verdade é o mesmo pedaço de lixo, apenas
sendo movido magicamente de volta ao topo como se fosse um novo. Aí também você tem essa ideia de código reutilizável. Se você estava
constantemente copiando e colando seus pedaços de lixo e criando 20 pedaços de lixo, 30 pedaços de lixo, só porque você quer que o jogo tenha
tantos níveis, provavelmente está fazendo algo errado. Reutilize o código que você escreveu, reutilize os sprites que você escreveu, e isso lhe
daria não apenas correção, mas também um design melhor.

Bem, vamos dar uma olhada em um conjunto final de blocos de construção que podemos compor em algo particularmente interativo como segue. Deixe-
me ir em frente e diminuir o zoom aqui e propor que implementemos algo como algum tipo de jogo baseado em labirinto. Deixe-me seguir em frente
aqui. Então eu quero implementar algum jogo baseado em labirinto que se pareça com isso à primeira vista. Deixe-me apertar Play.

Ainda não é um jogo muito divertido, mas aqui está um pequeno escudo de Harvard, algumas linhas pretas, desta vez verticais em vez de
horizontais, mas observe que você não pode ver minha mão aqui, mas estou usando minhas teclas de seta para ir para baixo, para subir, para a
esquerda, para a direita, mas se eu continuar indo para a direita, direita, direita, direita, direita, direita, direita, não vai a lugar nenhum.
E esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda, esquerda eventualmente
para.

Então, antes de olharmos para o código, como isso pode estar funcionando? Que tipos de scripts, coleções de peças de quebra-cabeça, podem nos
ajudar coletivamente a implementar isso? O que você acha?

AUDIÊNCIA: [INAUDÍVEL]

DAVID MALAN: Perfeito, sim. Provavelmente há alguma pergunta sendo feita, se tocar na linha preta, e acontece de ser um par de sprites, cada um
dos quais é literalmente uma linha preta vertical, provavelmente estamos fazendo uma pergunta como, você está tocando? A distância até ele é
zero ou próxima de zero? E se assim for, simplesmente ignoramos a seta para a esquerda ou para a direita nesse ponto. Então isso funciona.

Mas, caso contrário, se não estamos tocando uma parede, o que provavelmente estamos fazendo aqui para sempre? Como o movimento está funcionando
presumivelmente? Sim e de volta. Ah, você está coçando? OK, claro. Vamos continuar.

AUDIÊNCIA: [INAUDÍVEL]

DAVID MALAN: Desculpe, diga um pouco mais alto.

AUDIÊNCIA: Presumivelmente, ele está continuamente procurando por você para acertar as teclas de seta e, em seguida, movendo-se quando você o
faz.

DAVID MALAN: Exatamente. Ele está continuamente ouvindo as teclas de seta para cima, para baixo, para a esquerda, para a direita e, se a seta
para cima for pressionada, provavelmente estamos alterando o y por um valor positivo. Se a seta para baixo for pressionada, desceremos em y e
para a esquerda e para a direita de acordo. Então, vamos dar uma olhada rápida. Se eu diminuir o zoom aqui e der uma olhada no código que
implementa isso, há muita coisa acontecendo à primeira vista, mas vamos ver.
Em primeiro lugar, deixe-me arrastar algumas coisas para fora do caminho porque é meio opressor à primeira vista, especialmente se você, por
exemplo, estiver procurando online pelo conjunto de problemas 0 apenas para obter inspiração, a maioria dos projetos por aí vai pareça
impressionante à primeira vista, até que você comece a entender o que está acontecendo. Mas, neste caso, implementamos algumas abstrações desde
o início para explicar a nós mesmos e a qualquer outra pessoa que esteja olhando o código o que está acontecendo.

Este é aquele programa com as duas linhas pretas e o escudo de Harvard indo para cima, para baixo, para a esquerda e para a direita. Ele
inicialmente coloca o escudo no meio, 0,0, então sempre escuta o teclado, como acho que você estava descrevendo, e sente as paredes, como acho
que você estava descrevendo. Agora, como isso é implementado? Ainda não sei. Esses são blocos personalizados que criamos como abstrações para
ocultar os detalhes da implementação porque, honestamente, é tudo o que preciso saber agora.

Mas, como aspirantes a programadores, se estamos curiosos agora, vamos rolar para a implementação real de ouvir o teclado. Este é o da esquerda
e é um pouco comprido, mas tem uma estrutura muito parecida. Estamos fazendo o seguinte, se a seta para cima for pressionada, altere y por 1.
Suba. Se a seta para baixo for pressionada, altere y por menos 1. Desça. Seta para a direita, seta para a esquerda e pronto.

Então ele reúne todas essas ideias, combina em um novo bloco só porque é meio opressor, vamos implementá-lo uma vez e guardá-lo. E se rolarmos
agora para a função Feel for Walls, isso agora está fazendo a pergunta como hipótese, se estou tocando a parede esquerda, altere meu valor de x
em 1, meio que me afaste um pouco. Se estou tocando a parede direita, mova x por menos 1 para me afastar um pouco dela. Então, meio que
ricocheteia na parede. Para o caso de cair um pouco, mantemos a crista dentro dessas duas paredes.

Tudo bem, então mais algumas peças aqui para apresentar. E se quisermos realmente adicionar algum tipo de adversário ou adversário a este jogo?
Bem, deixe-me avançar para talvez este aqui onde o adversário neste jogo pode, por exemplo, ser projetado para ficar saltando para ficar no seu
caminho. Isso é como um labirinto e você está tentando levar o escudo de Harvard de baixo para cima ou vice-versa. Uh oh, Yale está no caminho e
parece estar saltando automaticamente para frente e para trás aqui.

Bem, deixe-me perguntar a outra pessoa. Hipotese. Como isso está funcionando? Isso é uma ideia que você tem, isso como uma ideia que você vê.
Vamos fazer engenharia reversa em sua cabeça para saber como funciona. Como isso pode estar funcionando? Sim, atrás.

AUDIÊNCIA: Se o símbolo de Yale estiver tocando uma parede direita ou esquerda, faça-o saltar.

DAVID MALAN: Sim, então se o símbolo de Yale estiver tocando a parede esquerda ou a parede direita, de alguma forma o fazemos saltar. E, de
fato, veremos que há uma peça de quebra-cabeça que pode fazer exatamente isso tecnicamente fora da borda, como veremos, mas há outra maneira de
fazer isso. Vejamos o código. A maneira como nós mesmos podemos implementar exatamente esse salto de ideia é apenas com um pouco de lógica.

Então aqui está o que esta versão do programa está fazendo. Está movendo Yale por padrão para 0,0 apenas para colocá-lo arbitrariamente em algum
lugar, apontando na direção de 90 graus, o que significa apenas horizontalmente, essencialmente, e então está sempre fazendo isso: se tocar na
parede esquerda ou tocar na parede direita, aqui está nossa tradução de salto. Estamos apenas girando 180 graus. E o bom disso é que não
precisamos nos preocupar se estamos indo da direita para a esquerda ou da esquerda para a direita. 180 graus vai funcionar em ambas as paredes.

E é isso. Depois de fazer isso, apenas movemos um passo, um pixel por vez, mas estamos fazendo isso para sempre, então algo está acontecendo
continuamente e o ícone de Yale está saltando para frente e para trás. Bem, uma peça final aqui, e se agora quisermos que outro adversário, um
adversário mais avançado na estrada, por exemplo, vá e nos siga onde quer que estejamos, de modo que desta vez queremos que o outro sprite não
apenas salte para frente e para trás, mas literalmente siga-nos, não importa onde vamos.

Como isso pode ser implementado na tela? Aposto que é outro bloco para sempre, mas o que tem dentro?

AUDIÊNCIA: Portanto, obtenha para sempre a localização do escudo de Harvard e dê um passo em direção a ele.
DAVID MALAN: Sim, sempre aponte para a localização do escudo de Harvard e dê um passo em direção a ele. Isso vai durar para sempre se eu
desistir, pelo menos nesta versão. Observe que está se contraindo para frente e para trás porque vai um pixel, depois um pixel e depois um
pixel. É uma espécie de estado frenético aqui. Ainda não terminamos o jogo, mas se olharmos por dentro, veremos exatamente isso. Não demorou
muito para implementar essa ideia simples. Vá para uma posição aleatória apenas para torná-la justa, inicialmente, então aponte para sempre em
direção a Harvard, que é o que chamamos de sprite de crista de Harvard, mova um passo.

Suponha que agora queremos fazer um nível mais avançado. Qual é a pequena alteração que eu poderia fazer logicamente neste código apenas para
tornar o MIT ainda melhor nisso?

AUDIÊNCIA: Mude o número de passos para dois.

DAVID MALAN: Tudo bem, mude o número de passos para dois. Então vamos tentar isso. Então agora eles têm duas vezes mais rápido. Deixe-me ir em
frente e tirar isso do caminho. Ops, deixe-me fazer uma luta justa. Bandeira verde. Tudo bem, infelizmente ainda estou movendo um pixel por vez,
então isso não vai acabar bem. Isso me pegou. E se formos realmente agressivos e fizermos algo como 20 passos de cada vez, clique na bandeira
verde. Jesus, OK, então é assim que você pode tornar seus níveis cada vez mais difíceis.

Portanto, não é por acaso que escolhemos esses exemplos específicos aqui envolvendo essas escolas específicas porque temos mais uma demonstração
que pensamos em apresentar hoje se conseguíssemos que outro voluntário aparecesse e tocasse o que foi chamado por um de seus predecessores Ivy's
Jogo mais difícil.

Vamos ver, você no meio. Você quer subir? Qual o seu nome?

AUDIÊNCIA: Celeste.

DAVID MALAN: Diga de novo?

AUDIÊNCIA: Celeste.

DAVID MALAN: Chegue um pouco mais perto, na verdade. Desculpe, difícil de ouvir aqui. Tudo bem, uma salva de palmas aqui, se pudermos também.

[APLAUSOS]

OK, desculpe, qual era o seu nome?

AUDIÊNCIA: Celeste.

DAVID MALAN: Ceoeste

AUDIÊNCIA: Celeste.

DAVID MALAN: Celeste.

AUDIÊNCIA: Sim.

DAVID MALAN: Venha. Prazer em te conhecer também. Então, aqui temos nesta outra tela o jogo mais difícil de Ivy, escrito por um ex-aluno do
CS50. Acho que você verá que combina esses mesmos princípios. O labirinto é claramente um pouco mais avançado. O objetivo em questão é mover
inicialmente o brasão de Harvard para o sprite totalmente à direita para que você o alcance neste caso, mas verá que há diferentes níveis e
diferentes níveis de sofisticação.

Então, se você quiser, pode usar apenas essas teclas de seta para cima, para baixo, para a esquerda, para a direita. Você estará controlando o
sprite de Harvard e se pudermos aumentar um pouco o volume, faremos deste nosso exemplo final. Aqui vamos nós, clicando na bandeira verde.

[MÚSICA, TOCANDO]

Sentindo-se pronto?

AUDIÊNCIA: Sim.

DAVID MALAN: Barra de espaço.

[MÚSICA - MC HAMMER, "VOCÊ NÃO PODE TOCAR ISSO"]

MC HAMMER: (CANTANDO) Não pode tocar nisso. Você não pode tocar nisso. Você não pode tocar nisso. Não posso tocar nisso. Minha, minha, minha,
minha música--

DAVID MALAN: Excelente.

MC HAMMER: (CANTANDO) tão difícil. Dá vontade de dizer, oh meu Senhor. Obrigado por me abençoar--

DAVID MALAN: Dois Yales agora.

MC HAMMER: (CANTANDO) É bom quando você sabe que está pra baixo. Um homeboy super drogado--

AUDIÊNCIA: Ah!

DAVID MALAN: Ah! Continue.

MC HAMMER: (CANTANDO) Você não pode tocar nisso. Eu te disse, mano. Não posso tocar nisso. Sim, é assim que viver--

DAVID MALAN: Tudo bem.

MC HAMMER: (CANTANDO) Não pode tocar nisso. Olhe para os meus olhos, cara. Você não pode tocar nisso. Você me deixou rebentar as letras funky.
Você não pode tocar nisso. Calças e chuteiras novas e frescas. Você entendeu assim e sabe que quer dançar. Então saia do seu lugar e pegue uma
garota voadora e pegue essa batida.

[RISONHO]

Aguentar. Bombeie um pouco e deixe-os saber o que está acontecendo assim, assim. Frio em uma missão, então volte. Deixe-os saber que você
também...

DAVID MALAN: Pronto. Ai está.

[APLAUSOS]
MC HAMMER: (CANTANDO) Não pode tocar nisso. Por que você está parado aí, cara? Você não pode tocar nisso. Ei, toque a campainha. A escola
começou, otário. Não posso tocar nisso. Dê-me uma música ou ritmo, fazendo-os suar, é isso que os dá.

[TORCENDO]

Eles sabem. Você está falando do martelo quando está falando sobre um show. Isso é sensacionalista e apertado. Os cantores estão suando, então
eles precisam limpar ou domar para aprender.

DAVID MALAN: Penúltimo nível. Oh!

MC HAMMER: (CANTANDO) Esse gráfico é legítimo. Ou trabalhe duro ou você pode muito bem desistir. Essa palavra porque você sabe--

DAVID MALAN: Ah! Continue, continue! Sim!

MC HAMMER: (CANTANDO) Você não pode tocar nisso.

DAVID MALAN: Você está quase lá.

MC HAMMER: (CANTANDO) Quebre isso.

DAVID MALAN: Pronto. Vai! Vai! Vai! Oh. Mais um. Sim!

[TORCENDO]

Ai está.

MC HAMMER: (CANTANDO) Pare, hora do martelo. "Vá com o fluxo", é dito. Se você não consegue curtir isso, provavelmente está morto. Então agite
as mãos no ar, faça alguns movimentos, passe os dedos pelos cabelos. É isso. Para um vencedor. Dance isso e você ficará mais magro. Agora mova,
deslize sua garupa. Só por um minuto, vamos todos fazer a colisão.

[TORCENDO]

DAVID MALAN: Sim!

[APLAUSOS]

Parabéns.

Tudo bem, é isso para CS50. Bem-vindo à aula. Nos vemos na próxima vez.

[MÚSICA, TOCANDO]

Você também pode gostar