Polimorfismo em Java

Na unidade 6 do curso de Programação 1 aprendemos o conceito de polimorfismo, termo derivado do grego poli — muitos —, e morpheus — forma, estrutura. Uma das tarefas é discutir polimorfismo no contexto de programação orientada a objetos e dar um exemplo de como implementar essa funcionalidade em Java.

Revisando as anotações achei que a minha abordagem foi interessante. Segue para a apreciação, com pequenas modificações.


The world around us is polymorphic. We can see this almost everywhere: people, animals, cars, books, languages, houses. As humans, we seek to differentiate ourselves from others. We like to think and show that we are unique up to a point in which other people still recognize us as humans. Up to a point that they still can relate and interact with us.

Something similar happens with a programming language like Java. The ability to instantiate and handle multiple objects together make complex programs easier to handle, manage and develop. It is expected that complex software keeps evolving and including new functionalities with time. Imagine that if for each new functionality you have, you need to review previous objects and update old code to fit each new features included. It can easily become a complex and time-consuming task. Polymorphism is a powerful solution that avoids a lot of code rework and guarantee program fluidity. Citing Oracle Java documentation definition, “subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parent class.” (Oracle, 2017)

Imagine the following Language superclass and English subclass.

class Language {
    void toHear(Language hear) {
    // Method to hear some language
}
toSpeak(Language speak) {
    // method to speak some language
    }
}

class English extends Language {
	void toHear(English hear) {
	// specific instructions to hear and understand the English language.
	}
	toSpeak(English speak) {
	// specific instructions to hear and understand the English language.
	}
}

Imagine that in the example above you have multiple language subclasses and want then all to “work” in their own language. Of course that this is a simplified example, but the same method toSpeak would call a specific response for each object (aka each language), a unique behavior, while still sharing some functionality from the parent class.

Reference: Oracle (Ed.). (n.d.). Polymorphism. Retrieved October 18, 2017, from https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

Programming 1 – Learning Journal

Escrevi isso no diário de classe de Programming 1 na University of the People. Idos de 2017. Estou revisando minhas anotações para o texto sobre o curso e achei interessante compartilhar isso aqui em separado. Segue.

Learning Journal – Unit 4

The process of developing a program with subroutines was very enlightening to me in the overall programming learning process. If in the Programming Fundamentals course we were presented to conceptual models like flowcharts and pseudocode, now we actually use the tools that break the problem into manageable steps and make complex ideas possible to handle.

I know that it can be a naive feeling, but it is a realization that programs are simpler than I originally imagined. Not in the sense that they are easy. Now it is also much more clear to me the amount of effort behind complex software and systems. But they are done in manageable steps. There are several foundations done many years ago that are still used as the basis to systems that are developed nowadays. I do not remember quite well where I read the phrase from one of the Unix OS developers that was surprised by seeing lines of his code in almost every operating system that we use today.

There is this concept of the human colossus: the realization that we build everything on the shoulders of many scientists and inventors that came before us. Being a “genius” in that sense is always a humble process. Humanity is a collective effort and somewhat this is especially intense when we study software development.

As you can see, my feelings on this unit are more philosophical. Routines and subroutines building on top one of another. Black boxes and the recognition that a lot around us have mysterious internal dynamics that we simply do not think about, just trust, use, and even put our lives on its hands. This makes me understand the importance of the work that I might decide to do and the projects that I might get involved in the future. In our times, lines of code can save many lives, but they also can kill many. If in the last learning journal I talked about the importance of studying math to be a better developer, now I see the importance of philosophy and ethics behind what we do and the tools that we have at our disposal. It should not be only about a good job and salary. I must be about us all, the humanity and the human colossus.

O que é Design Humano?

Mês passado compartilhei uma entrevista com Yuval Harari e Tristan Harris. Nela, ambos discutem o poder da persuasão, os limites do intelecto humano e os impactos decorrentes da popularização de serviços digitais. Sociedade, política, economia, nada escapa de ser profundamente influenciado por tais serviços. Estamos aos poucos entendendo que as consequências são muito mais profundas do que alienação, influência indevida em processos democráticos e reorientação dos valores. O próprio conceito de humanidade e de ser “humano” está em transformação.

Temos visto nos últimos anos diversas análises na mídia especializada, especialmente em veículos internacionais. Elas revelam uma mudança de paradigma sobre as grandes empresas de tecnologia e o Vale do Silício. De “salvadores da pátria” para “culpados” por muitos dos problemas atuais. Foco na lucratividade e um modelo de negócios baseado na monetização de dados pessoais choca-se com valores básicos democráticos e individuais.

O que fazer para evitar isso? Existe uma alternativa?

Tristan Harris afirma que sim. Seu projeto “Center for Humane Technology” propõe que é possível alinhar o desenvolvimento tecnológico com as necessidades humanas básicas. A ideia principal é que podemos seguir um modelo que “acolhe” a natureza humana, ao invés de explorá-la.

No dia 23 de abril de 2019 a organização realizou o evento “Humane: A New Agenda for Tech”. Nele, foi apresentado um diagnóstico preciso do cenário atual, bem como sugestões para o caminho a seguir na implementação desse modelo nos produtos e serviços digitais. As ideias de Tristan já influenciam empresas como Facebook e Google nesse sentido. As propostas de Tristan e sua equipe são importantes para entender a direção que muitas empresas no setor de tecnologia estão tomando recentemente no desenvolvimento de seus produtos.

Me identifico pessoalmente com essas ideias e já procuro aplicá-las nos meus projetos. Sinto que é de extrema importância compartilhá-las com desenvolvedores e engenheiros brasileiros, pois os impactos desses serviços influenciam intensamente nossa sociedade. Em geral, consumimos com pouca visão crítica. Pesquisas demonstram, por exemplo, que o Brasil está segundo lugar no tempo gasto na internet: 9 horas e 29 minutos por dia, atrás apenas da Indonésia!

Quais serviços utilizados durante todo esse tempo? Qual é a qualidade do tempo gasto? O que consumimos?

Isso é assunto para outro texto. O interessante é o mapa que Tristan nos oferece para pensar diferente. Por exemplo, o site da iniciativa tem uma página intitulada “Tome o Controle”, que sugere ações concretas para reduzir o impacto dos aplicativos e das redes sociais sobre a nossa atenção e qualidade de vida:

  1. Desligar todas as notificações, exceto as que partem de pessoas.
  2. Desabilitar as cores do celular (Cinquenta Tons de Cinza).
  3. Manter a tela principal do celular apenas com aplicativos utilitários como mapas, calendário, câmera, agenda, etc.
  4. Recarregar o celular fora do ambiente onde relaxamos ou dormimos.
  5. Remover todos os aplicativos de redes sociais do celular.

Mas o principal item da iniciativa, na minha opinião, é o guia de design. É um documento útil para todos os profissionais envolvidos no desenvolvimento ou promoção de produtos digitais. É uma espécie de mapa que elenca as sensibilidades (e fragilidades) humanas e orienta o processo criativo de design posicionando o ser humano no centro.

As ideias de Tristan Harris são mais do bem-vindas, são essenciais. Gosto muito do fato de serem ideias propositivas. O objetivo central não deve ser orientado sob a maximização do tempo, o uso de anúncios e apropriação de dados pessoais. A internet pode ser muito mais do que isso. Na realidade, ela já oferece muito mais, porém é necessário um esforço ativo para explorar os serviços mais benéficos, enquanto é muito fácil cair na armadilha viciante das redes sociais.

Conhecer e aplicar estas ideias é um passo importante para melhorar a nossa qualidade de vida como indivíduos. Para engenheiros de software e designers, aplicá-las é um imperativo moral coletivo.

Estudantes da UoPeople: Greyce Riquinho

Foto de Greyce Riquinho no escritório da door2door em Berlim, Alemanha.
Greyce Riquinho, estudante da University of the People e programadora na door2door

O interesse por uma universidade ou curso normalmente envolve algumas questões previsíveis: O curso é difícil? Quanto tempo leva para se formar? Tem diploma no final? Quais são as matérias mais difíceis? Ele é reconhecido no Brasil?

Todas são perguntas válidas, porém acredito que elas focam em questões que não tocam no que deveria ser central em tudo o que envolve educação: o que os alunos fazem durante e depois do curso? Existem projetos multidisciplinares? Existe uma empresa júnior? Os alunos são engajados em alguma causa?

Para mim, educação deve gerar, na maioria das vezes (nem sempre, portanto), um produto prático. Educação deve falar com a população, deve desenvolver algo com a sociedade, deve empoderar o indivíduo e a comunidade em seu entorno.

É por isso que histórias como a da Greyce Riquinho, colega na UoPeople, merecem destaque. Histórias que revelam o impacto prático do poder da educação, especialmente quando a educação é flexível e acessível. Sua história está disponível em detalhes no blog oficial da empresa em que trabalha, door2door. É uma história inspiradora, e que revela o poder da educação em conjunto com a determinação de se reinventar. Sem dúvida é do interesse de todas e todos que se interessam em estudar, mas têm dúvidas se existe algum resultado “real” depois de tanto esforço. É claro que a universidade não é individualmente responsável pelo sucesso da Greyce. A história dela é o resultado de inúmeras variáveis, algumas que só ela sabe quais são. Mas não deixa de ser um exemplo de sucesso, e um exemplo de que temos colegas engajadas em projetos e empregos incríveis em todos os cantos do mundo.

A entrevista mais importante de 2018: Yuval Harari e Tristan Harris

Yuval Noah Harari and Tristan Harris interviewed by Wired

Yuval Noah Harari, historiador-estrela, escritor aclamado, conselheiro global sobre o futuro da humanidade.

Tristan Harris, ex-designer do Google, diretor e cofundador do Centro para a Tecnologia Humana, um dos mais influentes pensadores na área de design persuasivo.

Os dois estão juntos, a convite da Wired Magazine, para uma interessante conversa a respeito do poder da persuasão em tempos digitais. Grande destaque é dado para os limites da mente humana e como ela é influenciável. É o reconhecimento de que os humanos são animais manipuláveis, e como a crença na escolha humana é uma ilusão.

A conversa é extremamente interessante por reunir um historiador e um cientista da computação, ambos preocupados com os rumos da humanidade. Na minha opinião, eles dão um diagnóstico preciso do momento presente e mostram possíveis caminhos para um futuro mais justo e próspero.

Yuval e Tristan são pensadores essenciais para entendermos o confuso momento do agora. Eles também são relativamente pouco conhecidos no Brasil e no mundo em desenvolvimento, o que é uma lástima. Portanto, fica a recomendação. Com certeza discutirei suas ideias com mais profundidade nas próximas postagens.

Ei, Programadores! Parem de odiar Humanas

Compartilho abaixo a tradução livre de um texto de Emma Pierson, postado em Abril de 2017 na Wired Magazine. Uso ele para abrir o assunto que será constante no meu blog nas próximas semanas. A versão original em inglês está disponível no link acima.

Como estudante de doutorado em ciência da computação, sou uma discípula de big data. Não vejo nenhum tópico sagrado para análises estatísticas: usei-as para estudar tudo, desde sexo a Shakespeare, e recebi respostas raivosas para essas tentativas. Em Stanford, na adolescência, eu recebia armas elegantes e letais – algoritmos que poderiam identificar os terroristas mais perigosos, ou detectar a insatisfação de alguém com o governo por meio de seus textos on-line.

A ciência da computação é maravilhosa. O problema é que muitas pessoas no Vale do Silício acreditam que ela é tudo o que importa. Você vê isso quando recrutadores em feiras de carreira deixam claro que só estão interessados nos cientistas da computação; na diferença salarial entre estudantes de engenharia e não-engenheiros; nos olhares inquisitivos que os estudantes de humanidades recebem quando ousam revelar suas especialidades. Eu vi cientistas de computadores brilhantes mostrarem uma ignorância tão lamentável sobre as populações que estavam estudando que eu só pude rir diante deles. Eu observei cientistas militares apresentarem suas inovações letais com um entusiasmo infantil, sem mencionar a quem as armas estão sendo usadas. Há poucas coisas mais assustadoras do que um cientista que pode dar uma palestra acadêmica sobre como atirar num ser humano, mas não pode raciocinar se você deveria estar atirando neles em primeiro lugar.

O fato de tantos cientistas da computação serem ignorantes ou desdenhosos em relação a abordagens não-técnicas é preocupante porque, em meu trabalho, estou constantemente confrontando questões que não podem ser respondidas com código. Quando eu fui programadora na Coursera, uma empresa de educação on-line, desenvolvi um algoritmo que recomendava aulas para pessoas com base em seu gênero. Mas a empresa decidiu não usá-lo quando descobrimos que isso afastaria as mulheres de cursos em ciência da computação.

Acontece que esse efeito – em que os algoritmos entranham as disparidades sociais – ocorre em domínios que vão da justiça criminal à pontuação de crédito. Este é um dilema difícil: na justiça criminal, por exemplo, você é confrontado com o fato de que um algoritmo que atende a determinantes estatísticos básicos também é muito mais provável de classificar réus negros como de alto risco, mesmo quando eles não seguirão adiante cometendo outro crime.

Eu não tenho uma solução para esse problema. Eu sei, no entanto, que não vou encontrá-lo no meu livro de algoritmos; Tenho muito mais probabilidade de encontrar fatos relevantes no trabalho de Ta-Nehisi Coates sobre discriminação sistêmica ou de Michelle Alexander sobre o encarceramento em massa.

Meus projetos pessoais têm apresentado questões éticas espinhosas semelhantes. Devo escrever um programa de computador que irá baixar as comunicações de milhares de adolescentes que sofrem de transtornos alimentares postados em um site de aconselhamento de anorexia? Escrever um programa para postar mensagens anônimas e suicidas em centenas de fóruns universitários para ver quais faculdades oferecem mais apoio? Minha resposta a estas perguntas, incidentemente, foi “não”. Mas eu considerei isso. E a glória e o perigo dos computadores é que eles aumentam o impacto de suas fantasias: um impulso se torna um programa que pode prejudicar milhares de pessoas.

Talvez seja mais eficiente permitir que cientistas da computação façam o que sabem melhor – escrever código – e deixar para que outras pessoas regulem nossos produtos? Isso é insuficiente. Os programadores desenvolvem produtos em velocidade alucinante, muitas vezes encobertos pelo sigilo da indústria; Quando a legislação chegar, milhões de pessoas já poderão ser prejudicadas. O treinamento de ética é necessário para profissionais de outras áreas, em parte porque é importante que médicos e advogados possam agir com ética, mesmo quando ninguém está olhando. Além disso, os cientistas da computação precisam ajudar nas regulamentações porque eles possuem o conhecimento técnico necessário; É difícil regular o viés algorítmico de word embeddings se você não tem ideia do que é um word embedding.

Aqui estão alguns passos recomendados. As universidades devem começar com um treinamento mais amplo para estudantes de ciências da computação. Entrei em contato com oito dos principais programas de graduação em ciência da computação e descobri que a maioria não exige que os alunos façam um curso sobre questões éticas e sociais (embora alguns ofereçam cursos opcionais). Esses cursos são difíceis de ensinar bem. Os cientistas da computação muitas vezes não os levam a sério, não se sentem à vontade com o pensamento não quantitativo, são excessivamente confiantes porque são matematicamente brilhantes ou estão convencidos de que o utilitarismo é a resposta para tudo. Mas as universidades precisam tentar. Os professores precisam assustar seus alunos, fazê-los sentir que eles recebem as habilidades não apenas para ficar ricos, mas para destruir vidas; eles precisam torná-los humildes, para fazê-los perceber que, por melhores que sejam em matemática, ainda há muito que eles não sabem.

Um currículo mais socialmente orientado não apenas tornaria os programadores menos propensos a causar danos; ele pode também torná-los mais propensos a fazer o bem. As escolas de ponta desperdiçam muito do seu talento técnico em atividades socialmente inúteis (mas que pagam bem), como algorítmicos de trading. Como Andrew Ng, um cientista da computação de Stanford, repreendeu uma sala cheia de estudantes de Stanford que ele estava tentando recrutar para o Coursera: “Você tem que se perguntar, por que eu estudei ciência da computação? E para muitos estudantes, a resposta parece ser, para que eu possa projetar o novo aplicativo de mídia social … Acredito que podemos construir coisas que sejam mais significativas do que isso “.

Há muitas ações que as empresas de tecnologia também devem adotar. As organizações devem explorar as questões éticas e sociais que seus produtos criam: o Google e a Microsoft merecem crédito por pesquisar a discriminação algorítmica, por exemplo, e o Facebook para investigar as câmaras de eco (echo chambers). Torne mais fácil para pesquisadores externos avaliarem os impactos de seus produtos: seja transparente sobre como seus algoritmos funcionam e forneça acesso a dados sob acordos de uso de dados apropriados. (Pesquisadores também precisam ter permissão para auditar algoritmos sem serem processados.) Faça perguntas sociais ou éticas nas entrevistas de contratação, não apenas sobre algoritmos; Se os gerentes de contratação pedissem, os alunos aprenderiam como respondê-los. (Em uma entrevista técnica, o CEO da Microsoft foi questionado sobre o que faria se visse um bebê caído em um cruzamento: a resposta óbvia de pegar o bebê não ocorreu a ele).

As empresas devem contratar as pessoas prejudicadas ou excluídas por seus produtos: cujos rostos seus sistemas de visão computacional não reconhecem e seus emojis sorridentes não representam, cujos currículos são classificados como menos relevantes e cujas opções de moradia eles limitam, que são assediados pela Internet por trolls que eles ajudaram a organizar e fazer pouco para controlar. Contrate cientistas “não-informáticos” e leve-os para palestras na hora do almoço; faça com que eles desafiem as visões de mundo da sua força de trabalho.

É possível que escutar cientistas que não sejam de computação reduzirá a velocidade da máquina do Vale do Silício: visões de mundo diversas podem produzir conflitos. Mas desacelerar em lugares onde pessoas razoáveis podem discordar é uma coisa boa. Em uma época em que até as eleições são vencidas e perdidas nos campos de batalha digitais, as empresas de tecnologia precisam se mover menos rapidamente e quebrar menos coisas.

Introduction to Statistics – Manual de Sobrevivência

63% dos estudantes da UoPeople desistem após falhar no curso de Introdução à Estatística.

A sentença acima é falsa, mas só de ler já dá ansiedade. Exemplo tosco do poder da estatística. Assim começo a postagem dedicada ao curso de Introduction to Statistics da University of the People.

Do que se trata

O curso foca nos conceitos básicos de estatística descritiva e probabilidade, especialmente em preparar o estudante a pensar “estatisticamente”. Ao longo das unidades fazemos análises simples, baseadas em dados-modelo fornecidos pela universidade. Estatística inferencial será o foco de outro curso, que será compartilhado posteriormente aqui no blog.

É sempre válido apresentar uma lista com os tópicos principais, assim dá uma noção do que é esperado do estudante: Variáveis discretas e contínuas, distribuição de amostras, teorema do limite central (Central Limit Theorem), lei dos grandes números (Law of Large Numbers), aproximação binomial, variância, desvio padrão, etc. O pacote básico completo de um curso introdutório.

O detalhe das teorias matemáticas não é o foco. Elas são apresentadas sempre sob uma ótica prática. O curso utiliza a linguagem R nos exercícios, portanto é necessária a instalação do programa. Esse ponto faz o curso não ser muito amigável para dispositivos móveis (se alguém souber de bons apps que rodam R, por favor, compartilhe).

Recursos do curso

Conforme citado acima, usamos bastante a linguagem R ao longo das unidades. Instalar e se familiarizar um pouco com ela antes do curso começar pode ajudar, mas dá para ir aprendendo durante os estudos sem problema. O livro de referência se chama “Introduction to Statistical Thinking (With R, Without Calculus)”, de Benjamin Yakir. O título é auto explicativo e o livro é bom!

A qualidade dos materiais, exercícios e discussões é acima da média se comparado aos outros cursos, mas, — sempre tem um “mas” —, recomendo estudar pelo Khan Academy antes, durante e depois. Os tópicos mais complicados (Z-Scores, por exemplo) são muito bem explicados no Khan. Sei que essa é minha recomendação em quase todos os cursos, mas não consigo evitar. É difícil superar a didática do Sal.

Estrutura

Adivinhou? Pois é. UoPeople sempre consistente. Aqui também tem Learning Journal, Discussion Forum, Programming Assignments, e Graded Quiz. Vamos por partes:

Learning Journal

Ele segue o padrão de revisar os conceitos e aprendizados da semana. A grande surpresa deste curso para mim foi a instrutora, Jessica Rouen. Foi a melhor que tive até o momento, incluindo vários cursos que ainda não compartilhei no blog. Sem dúvida ela foi uma grande motivação para o curso. Além das revisões, toda semana tem três pequenos exercícios para postar no Journal: funções importantes em R, estimativa de horas de estudo, definição de conceitos (distribuição de amostra x distribuição de uma amostra, por exemplo), e até a elaboração de dicas que você daria para outros estudantes que irão fazer o curso.

Discussion Forum

Da instalação do R até a probabilidade de amostras. Uso de aproximações e modelos matemáticos. Pensamento crítico na análise de dados e dos resultados. Por que utilizar determinado modelo? Para que ele serve? Quais os pontos sensíveis? A maioria dos temas exploram o pensamento crítico sobre o resultado estatístico. Aprendemos que não é sobre calcular cegamente, mas conhecer a origem dos dados, possíveis inconsistências e falácias nos resultados.

Graded Quiz

São duas avaliações durante o curso e uma avaliação final. O peso das três avaliações representa 60% da nota, então é essencial se familiarizar com as questões, fazer todos os Self-Quiz e revisar sempre que possível.

Final Exam

Segue o padrão do Graded Quiz, por isso a importância de estudar bem as questões. O exame é proctored, o que significa que ele deve ser acompanhado pessoalmente (ou online) por um observador. É permitido usar o console do R, o livro do curso, e anotações. Calculadoras básicas são permitidas, mas nada de celular, tablet ou calculadora do computador! Meu método foi criar um documento com um resumo de todas as unidades, com a lista das fórmulas principais e funções de R mais comuns. Foi o suficiente para assegurar uma boa nota, ainda que tenha exigido um certo esforço!

Considerações Finais

É sempre importante lembrar que o objetivo da estatística não é efetuar mil cálculos complicados, com resultados indecifráveis. É saber usar ferramentas que permitam estabelecer sentido no meio do oceano de dados que temos ao nosso redor.

Os métodos estatísticos nos ajudam a chegar ao que se chama de “best educated guess”. Um palpite baseado em conceitos sólidos. Um palpite com esteróides, por assim dizer. Para isso é necessário lidar com a coleta, análise, interpretação, e apresentação de dados. É uma ciência útil para todos os campos, mas que também forma a base teórica dos campos mais “avançados” do momento, como ciência de dados e machine learning. Não perca a oportunidade de fazer esse curso com dedicação! Pode ter a certeza de que ele será útil no futuro.

Como foi Programming Fundamentals na UoPeople

A pergunta mais comum, quando digo que estudo Ciência da Computação, é: “Qual linguagem de programação você aprende no curso?”. Normalmente assim, no singular, como se existisse uma linguagem única capaz de expressar tudo e construir qualquer tipo de programa. Perguntas desse tipo são frequentes e revelam o desconhecimento das pessoas a respeito da tecnologia que nos cerca. “Hoje em dia todo mundo deve aprender a programar”. “Saber programar é uma habilidade em alta demanda”. “Milhares de vagas foram abertas para programadores”. Essas frases estão por toda parte: conversas de bar, artigos de jornal, anúncios e ofertas de cursos online. Programar é o Santo Graal da modernidade, capaz de resolver todos os problemas do mundo e de quebra garantir aquele salário anual de seis dígitos.

Programming Fundamentals é o primeiro curso de programação para a maioria dos alunos da UoPeople. É possível fazer cursos que trabalham com programação antes dele, mas é em Fundamentals que a atividade de programar está no centro do curso. Ele é a base para basicamente todos os outros cursos de CS da universidade, e de também nos ajuda a entender as limitações da computação. Ele remove a aura sagrada em torno do tópico e revela a dura realidade do ato de programar.

Os objetivos do curso

Em Fundamentals entramos na história e no desenvolvimento das linguagens de programação. Aprendemos como planejar um programa, antes de efetivamente programá-lo, utilizando modelos conceituais como pseudo code e fluxogramas, que ajudam a aprimorar a lógica de um programa, sua funcionalidade e execução. Desenvolvemos programas básicos em Python, e, finalmente, discutimos as vantagens e desvantagens de certos paradigmas de programação.

A introdução do curso destaca a importância de entender profundamente os tópicos, e não apenas completar burocraticamente os exercícios. São conceitos que serão revisitados constantemente nos cursos adiante, assumindo que já sabemos os fundamentos apresentados em Programming Fundamentals. É o alicerce de toda a construção que está por vir.

Como se preparar

Apesar do curso ser introdutório, recomendo entender o que será abordado com antecedência. Neste caso, é importante preparar a mente para entrar no “modo programador”. É o que em inglês chamam de mindset. Para minha (e nossa) sorte, nosso colega Dan Fletcher (que já citei aqui anteriormente) fez uma ótima postagem com o “manual de sobrevivência” para o curso. Ele dá dicas práticas de como instalar Python, a importância do processo de debugging, o conceito de ler-pesquisar-perguntar (read-search-ask), e compartilha sites excelentes para praticar o que aprendemos.

Para os ansiosos, vale dar uma “folheada” no livro do curso, Think Python. A versão online é dinâmica, com linguagem simples e ilustrativa. Ela contém vários exercícios interativos e que podem ser executados diretamente no navegador.

A dinâmica do curso

A UoPeople é consistente na estrutura dos cursos. Todos possuem exercícios de discussão (discussion assignments), diários de aprendizado (learning journals), e provas de múltipla escolha (graded quiz). Em Programming Fundamentals a diferença está nos exercícios de redação (written assignments), que se tornam exercícios de programação (programming assignments).

Os tópicos abordados nos discussion assignments giram em torno de conceitos genéricos de programação, como linguagens compiladas/linguagens interpretadas, linguagens formais, linguagens naturais. A maioria dos temas não possuem uma resposta absoluta, o que encaixa muito bem no formato de debate proposto. Quem espera só escrever código pode se surpreender. Os conceitos apresentados em English Composition 1 e 2 serão úteis aqui, especialmente se o instrutor for rígido com a qualidade dos textos e o uso de citações e referência APA.

Os exercícios de programação exigem a criação de pequenos programas de cálculo, de interface simples com o usuário e manipulação de documentos/dados. Quem tem experiência prévia com programação, mesmo que básica, não terá dificuldades. Praticamente todos os exercícios exigem a criação de um modelo conceitual em pseudo code/flowchart, que deve ser submetido junto com o código em Python. É um trabalho adicional que pode torcer o nariz de alguns, mas é uma forma excelente de praticar como documentar adequadamente o programa e garantir que o código seja claro para a revisão de terceiros.

Por fim, os testes de múltipla escolha abordam o conteúdo do livro Think Python e sobre a história da computação. É aqui que a quantidade de conteúdo pode ficar pesada. O curso utiliza o livro de Roy A. Allan, “A History of the Personal Computer”. É uma obra extensa, um tanto desorganizada e desatualizada, que entra nos mínimos detalhes de cada época na evolução dos computadores. Para evitar se perder na quantidade de informação, recomendo fazer os self quiz antes de ler os capítulos de cada unidade. Anote apenas o que cai nos testes e passe “superficialmente” sobre o conteúdo restante.

Mesmo com todas as falhas, o livro de história abre bastante a cabeça para a complexidade por trás do longo desenvolvimento da computação. Ele mostra como evoluções no hardware contribuem para evoluções no software, e vice-versa. Reúne publicações históricas de cada década, fala sobre a computação amadora, empresas como Tandy/Radio Shack, Altair, Namco e Atari. Processadores como o Intel 8008. Personalidades como Ada Lovelace, Charles Babbage, John von Neumann, Claude Shannon, Nolan Bushnell e Toru Iwatani.

Resumão

Este é um curso que vai além de muitos cursos introdutórios de programação que vemos pela internet. Não pela qualidade técnica, mas pela abrangência. Ele não se resume a ensinar o uso de variáveis, funções, operadores lógicos, estruturas de looping, data structures e data types. Ele vai além, misturando história, conceitos de desenvolvimento de software e exercícios práticos.

A habilidade mais importante de um cientista da computação é a resolução de problemas”. Este é um paradigma que devemos manter durante todo o curso. Não se trata de aprender essa ou aquela linguagem, mas de internalizar a capacidade de resolver problemas de forma estruturada. “Programar é o processo de quebrar uma tarefa grande, complexa, em tarefas cada vez menores e suficientemente simples para serem realizadas por instruções computacionais básicas”. Aprendemos que a tarefa mais difícil ao desenvolver um programa é conceitualizar suas instruções de forma organizada. Programar é resolver um problema, é atender uma necessidade. O programa deve ter um propósito.

Para alguns o parágrafo acima pode soar óbvio, mas sei que para outros tantos não é. É comum esquecermos esses princípios. Muitos se distraem querendo saber qual linguagem será a mais popular, ou qual linguagem é “melhor”. Descobrimos que não há resposta absoluta, e que muitas respostas dependem do contexto e do problema. Manter isso em mente é o melhor caminho para sobreviver à Programming Fundamentals e manter o foco durante a longa jornada em busca do bacharelado em Ciência da Computação.

Como sempre, estou à disposição em caso de dúvidas. É só comentar ou entrar no grupo de estudantes no Facebook.

Reflexões sobre o filme Marighella

Dia 15 de fevereiro de 2019 estreou Marighella no Festival de Cinema de Berlim. Assisti o filme na sessão do dia seguinte, e de lá para cá venho sendo impactado não só pela sua narrativa, mas também pela verdadeira guerra de discursos que tomou a imprensa e a internet.

Canais como Mamãe Falei e do Movimento Brasil Livre lançaram uma série de vídeos desqualificando o diretor, atores e o personagem retratado. “Desmascarando Wagner Moura”, “Mídia Gringa Detona”, “Boicote Nacional” são alguns dos títulos apocalípticos. A página do filme no Imdb foi inundada com milhares de avaliações negativas. Notícias da imprensa tradicional sobre o filme foram soterradas de comentários, imagens e memes, majoritariamente negativos.

Minha intenção aqui não é avaliar o filme em seus aspectos técnicos, defender ou atacar a equipe envolvida ou a história de Carlos Marighella. Existem jornalistas, críticos e historiadores muito mais tarimbados que já fizeram ou irão fazer um trabalho muito melhor. Minha intenção é apenas refletir sobre a reação que está ocorrendo no ambiente digital. Marighella lutou nas ruas com violência, e agora a luta pelo domínio narrativo de sua história está sendo parte de uma luta simbólica feroz.

A arte é feita para perturbar; a ciência tranquiliza”, já disse George Braque. Não conhecia essa frase até recentemente, e ela faz todo o sentido neste contexto. Não lembro, na memória recente, de um filme brasileiro que tenha causado tanta revolta como Marighella. Isso é ainda mais impressionante considerando que, na data em que escrevo, ele ainda nem estreou no Brasil. Muitos ataques assumem que o filme exalta Marighella, contra argumentando que ele foi apenas um terrorista, enquanto a questão do terrorismo está sim presente no filme, e é colocada de forma muito interessante na narrativa.

Marighella é um filme intenso, bonito, feio, bagunçado e violento. Durante a minha sessão algumas pessoas saíram no meio. Amigos gringos próximos comentaram que a violência retratada foi inesperada e chocante. A maioria aplaudiu, outros tantos saíram em silêncio. É uma obra que claramente fez muita gente pensar. Que coloca dilemas morais intensos diante do espectador. É uma obra que perturba. É a arte de que Braque fala.

A intenção central deste post é ajudar um pouco o leitor confuso que está pesquisando sobre Marighella e fica desconfortável quando lê ataques tão intensos contra um filme. A ironia de toda essa reação é que ela gera mídia espontânea e atiça a curiosidade. Digo para observar as pessoas que atacam o filme. O que elas defendem? Quem elas são? Por que elas estão falando tanto sobre algo que nem assistiram?

Para mim, o incômodo nos outros diz muito. Isso, por sí só, revela o argumento central sobre a importância desta obra. Ela incomoda uma galera que, em sua maioria, está alinhada com o governo que temos atualmente no Brasil. Por que o discurso pretensamente vencedor está se sentindo tão ameaçado?

Assista Marighella e tire suas próprias conclusões.