Programming 1 na UoPeople – Debugging

E já se foram alguns cursos compartilhados aqui desde que comecei a série de textos sobre a University of the People. Testei formatos diferentes procurando manter a estrutura mais ou menos coesa: linhas gerais do curso, pontos fortes, fracos, desafios e dicas gerais. O objetivo sempre foi lançar uma luz no caminho, não mostrar os detalhes do trajeto.

Parte desse esforço é egoísta. Cada postagem me força a revisar o curso e isso me ajuda a internalizar o que estudei. É também uma oportunidade de refletir sobre o que aprendi, e, principalmente, sobre como eu aprendi. Esse é o aspecto mais interessante do processo de aprendizado, na minha opinião. O “como” e o contexto. É entender o que está acontecendo no mundo enquanto aprendo determinado tópico e como isso afeta esse processo de internalização do conteúdo.

É um equilíbrio difícil. Ao criar um espaço público para compartilhar as minhas ideias, estabeleço invariavelmente um compromisso com o mundo externo. Preciso ser compreendido pelos outros. Não estou falando sozinho. O ato de compartilhar envolve ação e reação. É um ciclo que se retroalimenta. Abrir-se para o mundo envolve risco. E de que vale se arriscar se não for de corpo inteiro? De que vale se manter na zona de conforto no meio do desconhecido?

Essa postagem é sobre o curso de Programming 1 na University of the People, mas não de uma forma óbvia. Dessa vez não vou falar sobre o syllabus do curso, nem sobre os discussion forums, ou sobre os learning journals. São tópicos pontuais que podem ser escritos por qualquer um e já são publicados com prazo de validade limitado. Pouco significa falar que programamos em Java, que utilizamos Netbeans como IDE, ou que os Programming Assignments possuem 25% de peso na nota final. Isso foi assim há um ano atrás.

O objetivo-chave é o que podemos fazer de prático com esse conhecimento. É responder no quê Programming 1 acrescentou na minha vida. É explicar quais ferramentas adquiri para contribuir com algo, nem que esse algo seja um único grão de areia no castelo da humanidade. Programação Orientada a Objetos, Herança, Polimorfismo, Classes, Interface Gráfica e Estrutura de Dados: o que significa tudo isso para o mundo atual?

Nesse processo de reflexão pessoal é fácil deixar o pessimismo dominar tudo e revelar a resposta mais horrenda de todas: Eu não sei o que tudo isso significa. Entendo os conceitos. Aprendi ao longo do curso sobre estes e tantos outros tópicos considerados “essenciais”. É isso que Programming 1 cobre. Tópicos básicos sobre programação. Mas isso não significa nada sem objetivo. É como olhar um martelo e entender que ele serve para bater um prego, mas nunca utilizá-lo.

Eu faço aqui um convite e uma provocação. De agora em diante só vou falar enquanto bato o prego.

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.

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.

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.