sexta-feira, 7 de agosto de 2009

Automação com Ênfase em Software

É muito comum o uso da Automacão em tarefas que são humanamente complexas ou impossíveis de serem realizadas. Mas é possível a automação de tarefas usando SOMENTE software?

Quando se fala em Automação a grande maioria imagina o uso de máquinas (robôs, braços mecânicos, circuitos eletrônicos, etc.) e o software apenas como uma interface do computador com tal máquina, ou um software embarcado, ou em alguns casos não é necessário software algum. Mais do que isso, pode haver casos que não há qualquer relação com a computação. Esta é uma realidade encontrada Automação Industrial. Neste contexto, observamos que o software (quando ele existe) é só um MEIO para se atingir a automação do processo.


Por outro lado, existe Automação usando somente software para computadores comuns. Não estou falando de software de auxílio em atividades administrativas que podem armazenar, recuperar e transmitir informações, como, por exemplo, as ferramentas de automação de escritório, de locadoras, de armazens, etc. É claro que essas ferramentas auxiliam nas atividades e no ganho de produtividade. Porém não é esse tipo de software que estou mencionando, mas aquele tem a função específica de realizar tarefas complexas e de propor soluções automáticas para o tomador de decisão, tendo em vista a complexidade do problema a ser resolvido.

Existem técnicas de projeto de algoritmos especializados para essa área que normalmente estão associadas com a área de Otimização, Mineração de Dados, Processamento de Imagens, Aprendizagem de Máquina, Programação Matemática, entre outras. O objetivo de um software de automação é a substituição do trabalho humano pelo uso de software já que o computador consegue realizar tarefas com maior velocidade e precisão, consegue gerar melhores soluções e realizar operações complexas que são humanamente impossíveis, trazendo, com isso, ganho econômico, ganho de produtividade, melhoria no serviço e, algumas vezes, redução de impactos ambientais.

Normalmente vários dias de trabalho humano são SUBSTITUIDOS por poucos minutos de processamento de um computador com software de automação. Stress e trabalho humano reduzidos drasticamente. Além da possibilidade incorporar novos serviços que não realizados por limitações humanas.

Estes casos de software de automação usam computadores comuns (sem qualquer outro equipamento especializado conectado ao computador). Observe que nesta classe de automação, o software é o FIM e não o MEIO para se realizar a automação. Esse tipo de software deixa de realizar a atividade MEIO para ser o FIM em si mesmo. O software deixa de ser "coadjuvante" para ser o "protagonista" no cenário de automação.

O desenvolvimento desse tipo de software não necessita de hardware especializado como ocorre na automação com ênfase em hardware. As técnicas vistas em Engenharia de Software não são suficientes para desenvolver esse tipo de software. Ser um expecialista em alguma linguagem de programação também não é suficiente. Esse tipo de software requer o desenvolvimento de algoritmos especializados por um "engenheiro de algoritmo" (não confunda algoritmo com programa).

Normalmente os cursos de Engenharia de Automação tem a ênfase em Hardware e não em Software. Não há nada de errado nisso! Porém, a Automação com ênfase em Software, sem uso de hadware especializado, é negligenciado.

Onde encontramos esse tipo de software? São vários os casos de aplicação. Um exemplo comum é construir horários para escolas, maximizandos as preferências dos professores e obecendo restrições. Ao tentar solucionar esse problema manualmente, os diretores/coodenadores consomem horas ou dias para encontrar uma solução viável, não necessariamente a melhor. Um software de automação para esse caso pode conseguir uma solução melhor em poucos minutos de processamento de um computador. Outro exemplo é a contrução automática de escalas de trabalho para um grupo de enfermeiros de um grande hospital. Quais são os benefícios desse tipo de software? No caso de escalonamento de trabalho os benefícios podem ser visto aqui: http://www.cs.nott.ac.uk/~tec/NRP/benefits.html (em Inglês)

É natural do ser humano sentir mais atração pelo que pode ver e tocar fisicamente, principalmente quando o objeto está em operação (movimento). Por outro lado, um software não tem todas essas características. Um software até pode pode ser visualizado na tela do computador, mas não pode ser tocado e nem suas operações podem ser vistas (normalmente).

terça-feira, 4 de agosto de 2009

Ensino de Agoritmo - Enfoque na Semântica ou na Sintaxe?

Em outra postagem já comentamos sobre o que é algoritmo.

"Um algoritmo pode ser definido como uma sequência finita e não ambígua de instruções (computáveis) para solucionar um problema." Como definido, as instruções devem ser passíveis de serem implementadas em um computador.

Quem trabalha com implementação de algoritmo já deve ter notado que se algoritmo não for implementado dentro da sintaxe da linguagem de programação que está sendo usada, logo o compilador reclama e aposta o erro. Já deve ter notado, também, que o compilador não faz análise de "semântica". A semântica está ligada a avaliação de correção do algoritmo, ou seja, a sequência de instruções de fato resolve o problema que espera resolver.

Portanto, para análise de sintaxe nós temos ferramentas computacionais para auxiliar, mas não temos para análise semântica e essa análise é de responsabilidade do projetista do algoritmo. As técnicas de avaliação de correção de algoritmos é que faz esse papel. 

Algoritmos Genéticos: Evolução Genética ou Melhoramento Genético?

Algoritmos Genéticos: Evolução ou Melhoramento Genético.

Afinal, Algoritmos Genéticos é fruto da Teoria da Evolução, ou é fruto da área de Melhoramento Genético?

Na teoria da evolução o homem se originou a partir da ameba, ou seja, de uma coisa se transformou em outra. Já em algoritmos genéticos, o algoritmo inicia com um conjunto de "soluções" e ao término o algoritmo continua com "soluções" modificadas. A única diferença que as soluções no final do processamento tende a ser melhores segundo uma função de avaliação. Mas isso também ocorre na área de Melhoramento Genético que encontramos, por exemplo, dentro das pesquisas na Zootecnia e Agronomia. Portanto, parece-nos que Algoritmos Genéticos está mais para "Melhoramento Genético" do que para a "Evolução Genética".


sábado, 25 de julho de 2009

PROGRAMAÇÃO x CODIFICAÇÃO

O objetivo deste artigo é tentar diferenciar duas palavras, programação e codificação, que utilizamos na computação, algumas vezes com a mesma conotação. São duas palavras que estão intimamente relacionadas, talvez seja essa a razão das confusões.

Codificação é sinônimo de "geração do código fonte". A codificação sigifica escrever (utilizando uma linguagem de programação) as instruções que o computador deve realizar para alcançar um resultado.

Programação é um conjunto de técnicas e práticas voltadas para solucionar problemas computáveis (solúvel por meio computacional), incluindo técnicas para modelagem formal de um problema e técnicas de projeto de algoritmos.

Portanto, projetar um algoritmo para um problema faz parte da programação, mas se o trabalho do programador é só escrever um algoritmo pronto, então seu trabalho é de codificação.

Fora do meio acadêmico é muito comum associar "PROGRAMAÇÃO" com a acão/habilidade de programar com ênfase na tecnologia, ou seja, a programação é entendida como habilidade de CODIFICAR em alguma linguagem de programação (escrever, testar, depurar e manter código de programa).

No meio acadêmico a PROGRAMAÇÃO tem um sentido muito mais abrangente, extrapolando as fronteiras do campo de atuação da Engenharia de Software e das disciplinas de Linguagem de Programação.

A expressão PROGRAMAÇÃO é mais antiga que o surgimento das linguagem computacionais modernas. O termo PROGRAMAÇÃO já era usado na década de 30 com o objetivo de solucionar problemas reais por meio de equações matemáticas (o que chamamos hoje de programação matemática) que precisavam ser solucionados. Pelos meus achados, Dantzig, pioneiro da Programação Linear, na década de 40, usou o termo "Programming in a linear Structure" para definir a análise de problemas de "planejamento" (ou programação) para a força aérea americana. Apenas, com a disseminação do uso do computador, o termo "programação" também absorveu a codificação de algoritmo em uma determinada linguagem.

Logo, a "PROGRAMAÇÃO" é muito mais que a habilidade com uma certa linguagem de programação (C, Pascal, Java, Prolog, etc.) e com o desenvolvimento de software. Programação está relacionada com a habilidade de "resolver problemas computáveis". Ou seja, está relacionada com a "construção de algoritmos" (digo algoritmo e não programa). Essa conotação da PROGRAMAÇÃO pode passar despercebida, mas basta observar o propósito da tão conhecida "Maratona de Programação" da SBC (http://maratona.ime.usp.br/info09.html). Para participar dessa maratona não basta ser um bom CODIFICADOR em alguma linguagem de programação. Ser expert em alguma linguagem de programação ou paradigma de linguagem de programação não é suficiente, logo, a Maratona de PROGRAMAÇÃO não é uma Maratona de CODIFICAÇÃO.

Outros exemplos conhecidos na computação em que a palavra PROGRAMAÇÃO está relacionada com a idéia de "resolver problemas com algoritmos": Programação Paralela, Programação Matemática, Programação Linear, Programação Inteira, Programação Dinâmica, Programação Estocática, Programação Por Restrição, Programação Não Linear, Programação Heurística, etc. Algumas dessas técnicas de programação são utilizadas na Maratona de Programação.

Um outro exemplo prático relacionado com codificação tem sido os treinamentos "Coding Dojo". O termo “Dojo” é muitas vezes usado nas artes marciais para definir o “local de treino” onde os praticantes se reúnem para treinar. Portanto, a tradução simples de "Coding Dojo" signfica ''local de treinamento de codificacao''. O foco é treinamento em alguma ferramenta de desenvovimento de software.

Conclui-se que Técnicas de Programação são diferentes de Técnicas de Codificação. A codificação está relacionada com a atividade de escrever código de programa em alguma linguagem de programação. Logo, a CODIFICAÇÃO é parte da PROGRAMAÇÃO. A Linguagem de Programação não é o FIM da programação, mas é MEIO para conseguirmos a resolução de problemas juntamente com a codificação. Não podemos confundir "Paradigmas de Programação" com "Paradigmas de Linguagem de Programação", afinal, a linguagem de programação é só uma ferramenta que possibilita a resolução de problemas por meios computacionais, ou seja, é o meio pelo qual o algoritmo para solucionar um problema pode ser transferido para o computador.

É comum encontrarmos na literatura os Paradgmas de Linguagem de Programação (Orientação a Objetos, Estruturada, Imperativa, Declarativa, etc.) sendo denominados de "Paradgmas de Programação". Essa nomenclatura induz o entendimento que a linguagem de programação seja o elemento exclusivo de todo o processo da PROGRAMAÇÃO, mas sabemos que isso não é verdade.

Em resumo, entendo que isso é resultado de vícios que herdamos da comunidade não acadêmica, da mídia e, também, de profissionais da área. A consequência disso não está somente no CONCEITO, mas reflete drásticamente na prática, na formação profissional e na visão empresarial. Estamos falando de quebra de paradgma, de mudança de hábitos, de mudança de cultura. Isso pode levar uma geração inteira, mas entendo que temos que começar a mudança.

Quem sou eu

Minha foto
Professor Titular do Departamento de Informática da Universidade Estadual de Maringá - Paraná, foi pesquisador visitante na University of Nottingham, UK. Bolsista produtividade em desenvolvimento tecnológico e inovação pelo CNPq (órgão federal). Membro do conselho técnico do Núcleo de Inovação Tecnológica da UEM.