Arquivo da tag: Engenharia de Software

Minha experiência com o Ensino à Distância

Durante o verão de 2009 tive pela primeira vez a oportunidade de realizar um curso à distância. Eu era super cético quanto a essa modalidade de ensino, mas como a oportunidade me foi oferecida de graça, mesmo o conteúdo não sendo atrativo para mim, resolvi fazer. Era um curso de Direito em Informática. Como eu estava curioso sobre a mecânica de um curso à distância, e dada a credibilidade da instituição que iria aplicar o curso (a FGV), decidi levar a sério, como se a aprovação nessa disciplina fosse uma obrigação na minha faculdade imaginária. Em resumo: gostei do que vivi… aprendi sobre direito autoral em informática, e gostei dos recursos utilizados na didática on-line. Mas eu percebi uma lacuna a ser resolvida: como aferir com precisão o aprendizado. Os métodos tradicionais e presenciais sempre foram a forma inequívoca de fazê-lo; no ensino à distância não seria diferente, com o desafio adicional da verificação da autoria (evitando plágios). Nos dois casos, ainda era necessário um processo laborioso na aferição do aprendizado.

No ano que passou (2013), por sugestão de um colega, fiz um curso à distância no site EDX, oferecido por nada mais, nada menos do que a Universidade  Berkley. Fazer um curso ministrado por David Patterson (autor do clássico livro de Arquitetura de Computadores que usei na pós-graduação) já seria motivação mais do que suficiente para mim, mas além disso o curso versava sobre Engenharia de Software, e era extremamente relevante para minha atualização profissional. Levei a sério o curso. Fiz nas minhas férias de janeiro, quando tinha tempo suficiente para lidar com os puxados trabalhos práticos. Ralei muito. Gostei tanto que fiz a parte 2 do curso, já no mês de agosto, em um período de plena carga de trabalho para mim. Não houve jeito a não ser sacrificar boas horas dos meus fins de semana fazendo os trabalhos da parte 2 do curso. Mas valeu cada minuto.

Ganhei dois certificados, e exibo-os com orgulho:

berkleyx saas parte 1

berkeleyx saas parte 2

 

 

 

 

 

O que mais me impressionou nesses cursos foram as ferramentas de avaliação automática… você disponibilizava sua resposta de exercício – um software – e outro software verificava, de acordo com especificações determinadas no enunciado, se ele funcionava como o esperado… quanto mais requisitos cumpridos, mais pontos valia. Vejo nisso o nirvana no ensino à distância em computação e pretendo investir nisso neste ano, agora do lado da docência.

Recomendo, para quem domina minimamente o Inglês, que faça esses cursos. Quem o fizer, ou já tenha tido uma experiência num curso à distância, por favor compartilhe comigo suas impressões!

Quando a extensibilidade se torna vilã do paradigma O.O.

O título é bastante provocador, afinal, ao contrário do que ele sugere, o paradigma orientado a objetos propõe justamente oferecer alternativas mais elegantes para a extensão de uma classe.

Li o artigo intitulado Uniform Function Call Syntax (Bright, Walter) e foi uma interessante reflexão sobre as formas que utilizamos para estender as funcionalidades de uma classe já existente. As opções que tipicamente se apresentam:

1. Adicionar a nova funcionalidade diretamente na classe

Essa alternativa só é possível quando o código fonte da classe está disponível para nossa aplicação, o que nem sempre é o caso. Mesmo quando está acessível, nem sempre é conveniente fazê-lo: será que aquela funcionalidade justifica a sobrecarga que impomos à classe, e a provável violação do princípio da responsabilidade única?

2. Herança

Seria a maneira mais adequada, mas esbarra com uma limitação imposta por Java ou outras linguagens de herança simples: como combinar várias extensões? O exemplo do artigo é muito bom. Imagine a classe Integer do Java, e que eu quisesse adicionar a funcionalidade aoQuadrado numa subclasse de Integer. Outro colega necessita do método aoCubo e cria outra subclasse. Sem herança múltipla, como posso utilizar os dois métodos de maneira simples?

Além disso, nem sempre essa é uma opção: há classes que, justamente para evitar a confusão oriunda do descontrole sobre subclasses, colocam-as como ‘final’. Ou seja, estão seladas para herança.

3. Composição e Classe utilitária

As duas são maneiras mais elegantes, no meu ponto de vista, de adicionar a funcionalidade a uma classe existente. Digo isso do ponto de vista do encapsulamento. Sou capaz de adicionar a nova funcionalidade sem afetar a classe alvo. Mas não é chato ter que saber que existe uma classe IntegerUtil, ou, pior ainda, regredir do formato sintático tradicional que se aplica na orientação a objetos para o uso procedural? Não é muito melhor escrever objeto.metodo do que ClasseUtilitaria.fazAlgo(objeto) ?

Foi aí que esbarrei com essa nova modalidade de extensão: os métodos de extensão (Extension Method). Ele não difere do ponto de vista conceitual de uma classe utilitária. O diferencial dele é a forma de uso.

Não seria legal, ao invés de usar:

Integer resultado = IntegerUtil.aoQuadrado( meuInteger );

usar:

Integer resultado = meuInteger.aoQuadrado();

Pois é isso que os métodos de extensão habilitam. O código abaixo seria uma aproximação em C# da classe utilitária:

public static class IntegerUtil {
   public static Integer aoQuadrado(this Integer valor) {
      return valor * valor;
   }
}

O this, no código anterior, faz a mágica. Ainda não consegui relacionar o impacto desse novo recurso com as linguagens dinâmicas, como o Ruby. Alguma opinião?

Referências:

Bright, Walter. Uniform Function Call Syntax. Dr.Dobb’s. 2012.

Extension Method. Wikipedia. 12 October 2012.