O acrônimo C&T é bastante conhecido e traduzido como Ciência e Tecnologia. Nota-se que se são dois termos intimamente relacionados, caso contrário não haveria motivo para estarem sempre acompanhados. Por que o termo "tecnologia" vem acompanhado da ciência? Porque a tecnologia nada mais é que "aplicação da ciência" (não confundir com ciência aplicada). A ciência lida com as descobertas enquanto que tecnologia faz uso das descobertas em aplicações práticas, quando possível. Desta forma, não existe tecnologia sem a ciência. Ocorre que nos últimos tempos o termo tecnologia tornou-se popular com uma conotação associada as coisas ligadas à computação ou engenharia, apetrechos "hitech". Mas se tecnologia é resultado da aplicação das descobertas (ciência), sendo assim, tecnologia já existe desde que a humanidade começou a fazer uso das descobertas para fins práticos, como por exemplo, acender fogo a partir da descoberta da faísca de duas pedras. Conclui-se, com isso, que nem tudo que é produzido com tecnologia, também é uma tecnologia. Por exemplo, o fogo produzido pelas pedras.
Um exemplo histórico de tecnologia foi a penicilina que salvou a vida de muitos soldados durante a segunda guerra mundial. A penicilina foi produzida em 1940 graças à descoberta do fungo do gênero Penicillium chrysogenum que ocorreu em 1928 pelo médico escocês Alexander Fleming. Sem tal descoberta, a criação desse antibiótico estaria comprometida. Além disso, nota-se que a descoberta ocorreu 12 anos antes de criação do antibiótico.
Nos dias atuais tem sido muito comum a mídia associar tecnologia a tudo que é produzido pela área denomina de "Tecnologia da Informação" (TI). Está correto fazer isso? Sendo pragmático, não. Nem tudo que é produzido na área de TI é uma tecnologia no sentido restrito da palavra, mas vulgarmente acabamos chamando de tecnologia também. Vamos tomar como exemplo o aplicativo UBER, é uma tecnologia? Um indicativo forte de não ser fruto da ciência (descobertas) é o fato de ter surgido muitos outros aplicativos concorrentes quase que ao mesmo tempo. Um produto que é criado como fruto de ideias apenas, há grande chance de ser copiado ou reproduzido, como o caso do UBER. Já um produto que é fruto de descobertas não se reproduz com facilidades, porque exige o "domínio do estado da técnica", como o caso da penicilina, assim como a vacina contra o Convid-19. Um exemplo de tecnologia na área de TI é o mecanismo (algoritmo) de busca usado pela Google, ao ponto que o código de tal mecanismo não ter sido revelado ao público e encontra-se protegido.
Como fruto desta discussão, então é possível tirar conclusões o que seria uma "inovação tecnológia" e uma inovação ("não tecnológica"). Mas isso é assunto para um outro post.
terça-feira, 26 de março de 2019
quarta-feira, 5 de abril de 2017
INOVAÇÃO TECNOLÓGICA (=PESQUISA+NOVIDADE+MERCADO)
INOVAÇÃO TECNOLÓGICA
O termo "inovação tecnológica" está em moda ultimamente, principalmente depois da Lei de Inovação, porém, sinto que ainda é um termo confuso e este foi o motivo principal que me levou a escrever este texto com base na minha experiência dentro do NIT-UEM (Núcleo de Inovação Tecnológia), no manual de OSLO e Frascat (ambos da Organização para a Cooperação e Desenvolvimento Econômico - OCDE), palestras, reuniões, etc.
Para definir Inovação Tecnológica precisamos saber o significado de "inovação" e de "tecnologia".
Inovação de produto ou processo significa um produto (ou processo) NOVO que tem valor de mercado. Um produto novo que não consegue conquistar o mercado não pode ser chamado de inovação. INOVAÇÃO = NOVIDADE + MERCADO.
O que é tecnologia? Não é difícil de encontrar o uso do termo "tecnologia" como sendo produto "hightech" relacionado muitas vezes com computação e engenharia. Porém, nem tudo que é derivado da computação ou engenharia pode ser tecnologia. Este termo tecnologia é muito mais amplo que as fronteiras da computação e engenharia. Uma tecnologia pode ser qualquer produto (ou processo) que se originou de pesquisas (descobertas). Podemos dizer que tecnologia já existia na idade da pedra lascada quando o homem criou uma forma de produzir fogo usando faíscas do atrito de duas pedras. A produção de faísca foi fruto de uma "descoberta", que pôde ser aprimorada até chegar na sua utilização para produzir o fogo. Com este exemplo notamos que tecnologia já existe há muito tempo e não é algo exclusivo da nossa era. A diferença que nos dias atuais as tais "descobertas" estão geralmente associadas as pesquisas científicas.
Portanto, "INOVAÇÃO TECNOLÓGICA" (=PESQUISA+NOVIDADE+MERCADO) é uma inovação que tem na sua origem o uso de resultado de pesquisa científica (descobertas), caso contrário é simplesmente uma inovação. Nota-se, portanto, que nem toda inovação que utiliza computação (um aplicativo, por exemplo), pode ser chamada de inovação tecnológica só porque utiliza computação ou smartphone, mas se esse aplicativo utilizada resultados de pesquisa como novidade e ganhou espaço no mercado, então podemos chamá-lo de inovação tecnológica. Com isso, nem toda inovação que utiliza tecnologia da informação significa que seja uma inovação tecnológica. Note que isso não significa que uma inovação sem uso de pesquisa científica tenha menos mérito. O que geralmente se nota é que um produto/ou processo fruto de resultados de pesquisa geralmente são mais difíceis de serem reproduzidos (copiados). Notamos nisso tudo a importância da inovação tecnológica para a soberania de uma nação e isso só é possível a partir da ciência.
A famosa tríplice hélice da inovação coloca as Instituições de Cência e Tecnologia (ICT) como uma das hélices. Nota-se a importância da ciência dentro deste contexto. A ciência é que lida com as descobertas (perquisas), ou seja com a fronteira do conhecimento. Como as descobertas são elementos que não se copiam com facilidade, logo um produto sendo colocado no mercado como fruto de descoberta, não terá concorrentes com facilidades. No momento estamos vivenciando intensamente a corrida por vacinas contra o Covid-19, que depende da ciência (descobertas).
Diante disso notamos o quão é importante a aproximação da pesquisa científica com o mercado. Uma vez que a pesquisa científica visa gerar conhecimento novo do ponto de vista internacional, então um produto (ou processo) que incorpore esse resultado de pesquisa terá uma novidade, também, em nível mundial.
O termo "inovação tecnológica" está em moda ultimamente, principalmente depois da Lei de Inovação, porém, sinto que ainda é um termo confuso e este foi o motivo principal que me levou a escrever este texto com base na minha experiência dentro do NIT-UEM (Núcleo de Inovação Tecnológia), no manual de OSLO e Frascat (ambos da Organização para a Cooperação e Desenvolvimento Econômico - OCDE), palestras, reuniões, etc.
Para definir Inovação Tecnológica precisamos saber o significado de "inovação" e de "tecnologia".
Inovação de produto ou processo significa um produto (ou processo) NOVO que tem valor de mercado. Um produto novo que não consegue conquistar o mercado não pode ser chamado de inovação. INOVAÇÃO = NOVIDADE + MERCADO.
O que é tecnologia? Não é difícil de encontrar o uso do termo "tecnologia" como sendo produto "hightech" relacionado muitas vezes com computação e engenharia. Porém, nem tudo que é derivado da computação ou engenharia pode ser tecnologia. Este termo tecnologia é muito mais amplo que as fronteiras da computação e engenharia. Uma tecnologia pode ser qualquer produto (ou processo) que se originou de pesquisas (descobertas). Podemos dizer que tecnologia já existia na idade da pedra lascada quando o homem criou uma forma de produzir fogo usando faíscas do atrito de duas pedras. A produção de faísca foi fruto de uma "descoberta", que pôde ser aprimorada até chegar na sua utilização para produzir o fogo. Com este exemplo notamos que tecnologia já existe há muito tempo e não é algo exclusivo da nossa era. A diferença que nos dias atuais as tais "descobertas" estão geralmente associadas as pesquisas científicas.
Portanto, "INOVAÇÃO TECNOLÓGICA" (=PESQUISA+NOVIDADE+MERCADO) é uma inovação que tem na sua origem o uso de resultado de pesquisa científica (descobertas), caso contrário é simplesmente uma inovação. Nota-se, portanto, que nem toda inovação que utiliza computação (um aplicativo, por exemplo), pode ser chamada de inovação tecnológica só porque utiliza computação ou smartphone, mas se esse aplicativo utilizada resultados de pesquisa como novidade e ganhou espaço no mercado, então podemos chamá-lo de inovação tecnológica. Com isso, nem toda inovação que utiliza tecnologia da informação significa que seja uma inovação tecnológica. Note que isso não significa que uma inovação sem uso de pesquisa científica tenha menos mérito. O que geralmente se nota é que um produto/ou processo fruto de resultados de pesquisa geralmente são mais difíceis de serem reproduzidos (copiados). Notamos nisso tudo a importância da inovação tecnológica para a soberania de uma nação e isso só é possível a partir da ciência.
A famosa tríplice hélice da inovação coloca as Instituições de Cência e Tecnologia (ICT) como uma das hélices. Nota-se a importância da ciência dentro deste contexto. A ciência é que lida com as descobertas (perquisas), ou seja com a fronteira do conhecimento. Como as descobertas são elementos que não se copiam com facilidade, logo um produto sendo colocado no mercado como fruto de descoberta, não terá concorrentes com facilidades. No momento estamos vivenciando intensamente a corrida por vacinas contra o Covid-19, que depende da ciência (descobertas).
Diante disso notamos o quão é importante a aproximação da pesquisa científica com o mercado. Uma vez que a pesquisa científica visa gerar conhecimento novo do ponto de vista internacional, então um produto (ou processo) que incorpore esse resultado de pesquisa terá uma novidade, também, em nível mundial.
sexta-feira, 19 de novembro de 2010
Modelagem de Problema X Modelagem de Software
"Modelagem de problema computável" é o mesmo que "modelagem de software"?
Todos os problemas são solúveis por algoritmos? Sabemos que não. Nas disciplinas de algoritmos trabalhamos somente com "problemas computáveis", ou seja, problemas solúveis por dispositivos computacionais. Sinônimos de problema computável: problema solúvel, problema decidível, problema tratável e problema algorítimico.
No contexto da computação podemos encontrar dois tipos de modelagem que as vezes se confundem: "modelagem de programa (software)" e "modelagem de problema (computável)".
(1) Modelagem de Software. Sabemos que quando um software é desenvolvido é porque se pretende resolver um problema também. Neste caso utiliza-se a modelagem para compreender o problema, organizar as informações, estruturar o desenvolvimento, etc. Uma forma comum de modelagem de programas procedurais (não orientados a objeto) é através de fluxogramas, enquanto que a modelagem de programas orientados a objeto normalmente usam UML. Notem que também podemos utilizar este recurso para desenvolver ou compreender um algoritmo, principalmente fluxograma. Neste contexto de modelagem de sistemas também encontramos: DFD (Diagrama de Fluxos de Dados), DER (Diagrama Entidade-Relacionamento), organograma, diagrama de blocos, etc.
(2) Modelagem de Problema Computável. No contexto de desenvolvimento de algoritmo, modelar um problema signfica encontrar um modelo formal que "substitui" o problema do mundo real para ser "introduzido" na máquina (computador). Neste caso, uma fez que temos o modelo o passo seguinte é necessário encontrar um ALGORITMO para resolver o modelo. Exemplo de modelos formais: programação matemática, grafos e equações matemáticas. Este tipo de modelagem também tem sido chamado de Modelagem Computacional (http://pt.wikipedia.org/wiki/Modelagem_computacional)
Em (1) o modelo auxilia a compreender o problema real enquanto que em (2) o modelo substitui o problema real. No caso (1) o modelo irá auxíliar o programador na implementação, ou seja, é para ser utilizado por "ser humano", já no caso (2) o modelo é para ser utilizado pela máquina (computador), ou seja, o computador irá utilizar o algoritmo para solucionar o modelo. Em (1) o modelo é para humano, mas em (2) é para máquina.
Sabemos que existem ferramentas que o programador pode fazer a modelagem gráfica a partir do qual o código é gerado automaticamente em alguma linguagem. Mas isso é só para facilitar a vida do programador (humano), logo entra no caso (1) acima.
Todos os problemas são solúveis por algoritmos? Sabemos que não. Nas disciplinas de algoritmos trabalhamos somente com "problemas computáveis", ou seja, problemas solúveis por dispositivos computacionais. Sinônimos de problema computável: problema solúvel, problema decidível, problema tratável e problema algorítimico.
No contexto da computação podemos encontrar dois tipos de modelagem que as vezes se confundem: "modelagem de programa (software)" e "modelagem de problema (computável)".
(1) Modelagem de Software. Sabemos que quando um software é desenvolvido é porque se pretende resolver um problema também. Neste caso utiliza-se a modelagem para compreender o problema, organizar as informações, estruturar o desenvolvimento, etc. Uma forma comum de modelagem de programas procedurais (não orientados a objeto) é através de fluxogramas, enquanto que a modelagem de programas orientados a objeto normalmente usam UML. Notem que também podemos utilizar este recurso para desenvolver ou compreender um algoritmo, principalmente fluxograma. Neste contexto de modelagem de sistemas também encontramos: DFD (Diagrama de Fluxos de Dados), DER (Diagrama Entidade-Relacionamento), organograma, diagrama de blocos, etc.
(2) Modelagem de Problema Computável. No contexto de desenvolvimento de algoritmo, modelar um problema signfica encontrar um modelo formal que "substitui" o problema do mundo real para ser "introduzido" na máquina (computador). Neste caso, uma fez que temos o modelo o passo seguinte é necessário encontrar um ALGORITMO para resolver o modelo. Exemplo de modelos formais: programação matemática, grafos e equações matemáticas. Este tipo de modelagem também tem sido chamado de Modelagem Computacional (http://pt.wikipedia.org/wiki/Modelagem_computacional)
Em (1) o modelo auxilia a compreender o problema real enquanto que em (2) o modelo substitui o problema real. No caso (1) o modelo irá auxíliar o programador na implementação, ou seja, é para ser utilizado por "ser humano", já no caso (2) o modelo é para ser utilizado pela máquina (computador), ou seja, o computador irá utilizar o algoritmo para solucionar o modelo. Em (1) o modelo é para humano, mas em (2) é para máquina.
Sabemos que existem ferramentas que o programador pode fazer a modelagem gráfica a partir do qual o código é gerado automaticamente em alguma linguagem. Mas isso é só para facilitar a vida do programador (humano), logo entra no caso (1) acima.
quinta-feira, 28 de outubro de 2010
Receita de bolo é um algoritmo?
Quantas vezes você já ouviu falar que "uma receita de bolo" é um 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.
A NÃO ambiguidade implica dizer que cada instrução do algoritmo deve ser precisamente definida, sem permitir mais de uma interpretação de seu significado. Neste caso, algoritmos devem se basear no uso de um conjunto de instruções bem definido, que constituem um vocabulário de símbolos LIMITADO.
Pseudo-Algoritmos são aproximações de algoritmos, onde existe um grau de ambiguidade não nulo em sua definição. Na realização de tarefas cotidianas usamos implicitamente vários pseudo-algoritmos. Utilizamos um vocabulário de termos aberto para descrever os pseudo-algoritmos. Por isto eles não são algoritmos de fato, devido ao elevado grau de ambiguidade na forma aberta com que são definidos. Para fazê-los de forma precisa e não ambígua seria necessário definir toda a mecânica contida em cada uma das ações corriqueiras como fritar ovos, andar, falar, cozinhar, apertar um botão, etc. Isto tornaria a construção de algoritmos cotidianos extremamente extensa e provavelmente inútil, pois quando dispostos a cooperar, realizamos tais ações complexas (andar, falar, etc.) de forma automática, devido à nossa elevada capacidade e plasticidade cognitiva.
Logo, um algoritmo deve ser constituído de operações computáveis, ou seja, de operações que podem escritas em alguma linguagem de programação. Portanto, uma "receita de bolo" não pode ser considerada um algoritmo.
Eventualmente, usamos o termo algoritmo para designar conjuntamente os algoritmos "computáveis" e os pseudo-algoritmos, deixando implícito que atividades realizadas por humanos são de fato pseudo-algorítmos.
É comum professores utilizarem o exemplo de receita de bolo para introduzir o conceito de algoritmo. Mas uma vez que o aluno já tenha associado o conceito formal de algoritmo computacional, acredito que a associação com "receita de bolo" deva ser eliminada.
Um algoritmo pode ser definido como uma sequência finita e não ambígua de instruções (computáveis) para solucionar um problema.
A NÃO ambiguidade implica dizer que cada instrução do algoritmo deve ser precisamente definida, sem permitir mais de uma interpretação de seu significado. Neste caso, algoritmos devem se basear no uso de um conjunto de instruções bem definido, que constituem um vocabulário de símbolos LIMITADO.
Pseudo-Algoritmos são aproximações de algoritmos, onde existe um grau de ambiguidade não nulo em sua definição. Na realização de tarefas cotidianas usamos implicitamente vários pseudo-algoritmos. Utilizamos um vocabulário de termos aberto para descrever os pseudo-algoritmos. Por isto eles não são algoritmos de fato, devido ao elevado grau de ambiguidade na forma aberta com que são definidos. Para fazê-los de forma precisa e não ambígua seria necessário definir toda a mecânica contida em cada uma das ações corriqueiras como fritar ovos, andar, falar, cozinhar, apertar um botão, etc. Isto tornaria a construção de algoritmos cotidianos extremamente extensa e provavelmente inútil, pois quando dispostos a cooperar, realizamos tais ações complexas (andar, falar, etc.) de forma automática, devido à nossa elevada capacidade e plasticidade cognitiva.
Logo, um algoritmo deve ser constituído de operações computáveis, ou seja, de operações que podem escritas em alguma linguagem de programação. Portanto, uma "receita de bolo" não pode ser considerada um algoritmo.
Eventualmente, usamos o termo algoritmo para designar conjuntamente os algoritmos "computáveis" e os pseudo-algoritmos, deixando implícito que atividades realizadas por humanos são de fato pseudo-algorítmos.
É comum professores utilizarem o exemplo de receita de bolo para introduzir o conceito de algoritmo. Mas uma vez que o aluno já tenha associado o conceito formal de algoritmo computacional, acredito que a associação com "receita de bolo" deva ser eliminada.
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).
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.
"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".
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.
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.
Assinar:
Comentários (Atom)
Quem sou eu
- Ademir A. Constantino
- 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.

