VILA VELHA-ES
2008
MÁRCIO HENRIQUE DA SILVA
VILA VELHA-ES
2008
MARCIO HENRIQUE DA SILVA
___________________________
___________________________
___________________________
VILA VELHA-ES
2008
Dedico este trabalho a minha família, aos
amigos e colegas de profissão que
colaboraram com a pesquisa.
AGRADECIMENTOS
Agradeço a DEUS, aos profissionais que
responderam o questionário, aos amigos que
ajudaram a encontrar literaturas sobre o
assunto, à minha família pela paciência e
minha mãe por tudo.
“Um relato honesto se desenrola melhor
se o fazem sem rodeios.”
(Shakespeare)
RESUMO
I. LINGUAGENS DE PROGRAMAÇÃO...................................................................16
1.1. COMO FUNCIONAM AS LINGUAGENS ......................................................16
1.1.1. Código fonte ............................................................................................16
1.1.2. Processos de tradução ...........................................................................17
1.2. CLASSIFICAÇÃO DAS LINGUAGENS .........................................................17
1.3. HISTÓRICO DAS LINGUAGENS ..................................................................18
1.4. PARADIGMAS DE PROGRAMAÇÃO ...........................................................21
1.4.1. Imperativo................................................................................................21
1.4.2. Orientação a objetos ...............................................................................21
1.4.3. Orientação a aspecto ..............................................................................22
1.4.4. Funcional .................................................................................................22
1.4.5. Lógico ......................................................................................................23
1.5. TENDÊNCIAS DAS LINGUAGENS...............................................................23
1.6. ASPECTOS PARA AVALIAÇÃO DE UMA LINGUAGEM.............................24
1.6.1. Uniformidade ...........................................................................................24
1.6.2. Ambigüidade ...........................................................................................24
1.6.3. Concisão..................................................................................................24
1.6.4. Localidade ...............................................................................................25
1.6.5. Linearidade..............................................................................................25
1.6.6. Manutenibilidade .....................................................................................25
1.6.7. Modularidade...........................................................................................26
1.6.8. Independência modular ..........................................................................26
1.6.9. Legibilidade .............................................................................................26
1.6.10. Simplicidade ........................................................................................27
1.6.11. Ortogonalidade ....................................................................................27
1.6.12. Confiabilidade ......................................................................................28
1.6.13. Portabilidade........................................................................................28
1.6.14. Tipologia de dados ..............................................................................28
1.6.15. Documentação do código ...................................................................29
1.6.16. Eficiência..............................................................................................30
II. FERRAMENTAS DE DESENVOLVIMENTO........................................................32
2.1. CASE ..............................................................................................................32
2.2. CONTROLE DE QUALIDADE .......................................................................33
III. AMBIENTES DE DESENVOLVIMENTO...........................................................36
3.1. DESENVOLVEDOR AUTÔNOMO ................................................................36
3.2. DESENVOLVIMENTO IN-HOUSE ................................................................37
3.3. EMPRESAS ESPECIALIZADAS EM DESENVOLVIMENTO .......................37
IV. PESQUISA .........................................................................................................40
4.1. METODOLOGIA .............................................................................................40
4.2. ANÁLISE DA PESQUISA...............................................................................42
4.3. SÍNTESE.........................................................................................................45
V. CONCLUSÃO ........................................................................................................47
VI. REFERÊNCIAS BIBLIOGRÁFICAS ..................................................................49
12
INTRODUÇÃO
Este trabalho não irá apresentar nomes de linguagens ou ferramentas que devem
ser selecionadas para esta ou aquela necessidade. O propósito é alertar para os
13
conceitos que devem ser levados em conta, considerando que a escolha irá
depender de muitas variáveis.
Quanto à pesquisa, não visa apontar a solução mais usada, mas um estudo de caso
dos aspectos que são tratados pelos profissionais como mais importantes.
14
JUSTIFICATIVA
PROBLEMATIZAÇÃO
I. LINGUAGENS DE PROGRAMAÇÃO
class AloMundo {
public static void main (String args[]) {
System.out.println("Exemplo de programa em Java");
17
System.out.println("Esab - 2008");
}
}
A primeira linguagem de programação que se têm notícias foi projetada pelo alemão
Konrad Zuse em meados de 1943, o nome desta linguagem é Plancalkül (Calculus)
(SEBESTA, 2005).
MVI A
MVI B
MVI C
ADD B
ADD C
ANA B
CALL 0010
JNZ 0015
/* Calcula a média */
average = sum / listlen;
/* conta os valores de entrada maiores que a média */
for (counter = 0; counter < listlen; counter++ )
if (intlist(counter] > average) result ++;
/* Imprime o resultado */
System.out.println(
"\nNúmero de valores > que a média é: " + result);
} //** Fim do if ((listlen >0) ...
else System.out.println(
"Erro de entrada. Tamanho da lista inválido\n");
} //** Fim do método principal
} //** Fim da classe Ins(Sort)
20
Não se pode dizer que um determinado paradigma é melhor ou pior que outro, visto
que suas vantagens estão associadas ao projeto e às necessidades específicas.
1.4.1. Imperativo
Hoje em dia, a grande maioria das linguagens que estão crescendo quanto à
aceitação do mercado suportam orientação a objetos e muitas ferramentas oferecem
recursos para documentar e facilitar o uso de objetos.
22
1.4.4. Funcional
Segundo Baranauskas (1993) este modelo foi desenvolvido por John McCarthy
através da linguagem LISP, em 1958.
Exemplo de uma função para retornar fatorial, escrita em Lisp: (Baranauskas, 1993):
1.4.5. Lógico
Este modelo inclui algumas características imperativas para aumentar sua eficiência.
É muito utilizado em prototipação, sistemas especialistas e banco de dados.
fatorial(0,1).
fatorial(N,Fat):- N>0,
N1 is N-1,
fatorial(N1,Fat1),
Fat is Fat1 * N
Uma forte tendência presumida com base nas tecnologias que surgiram nos últimos
é sem dúvida a universalização de ambientes, proposta principalmente pelas
máquinas virtuais e frameworks. O objetivo é gerar código que possam ser
traduzidos em diferentes sistemas operacionais e equipamentos.
Outro aspecto fortemente crescente são as aplicações para Internet, que rodam em
browsers (programa que interpreta as páginas de Internet). Embora ainda não exista
uma receita para produzir aplicações que funcionam em todos os ambientes, há uma
grande tendência de soluções deste tipo.
24
1.6.1. Uniformidade
A = 10 {Atribuição}
if A = 10 then <comando> { Comparação }
1.6.2. Ambigüidade
Isto pode ser exemplificado no caso de uma sintaxe cuja precedência aritmética não
seja óbvia.
X1 = X1/X2 * X3
1.6.3. Concisão
1.6.4. Localidade
1.6.5. Linearidade
1.6.6. Manutenibilidade
compatibilidade de código, para evitar que códigos-fonte antigos tenham que ser
reescritos em uma nova compilação ou interpretação.
1.6.7. Modularidade
Silva (2007, p. 7) trata a modularidade com um fator de qualidade e afirma que seu
significado é “... uma forma particular da separação de interesses, em que a divisão
do problema se faz por unidades (módulos) individualizados e coerentes, com valor
e significado por si só”.
1.6.9. Legibilidade
Uma linguagem com alta legibilidade precisa oferecer uma boa abstração de dados,
comandos de controle, modularização, documentação, convenções léxicas, sintaxe e
semântica. Estas características determinam não só a aceitação da linguagem pelos
programadores, como também contribuem para que outros profissionais como os
analistas, profissionais de suporte e especialistas de outras áreas possam interpretar
os código gerados.
1.6.10. Simplicidade
1.6.11. Ortogonalidade
1.6.12. Confiabilidade
1.6.13. Portabilidade
De acordo com Fairley apud Pressman (1995) há cinco níveis de verificação de tipos
disponíveis na maioria das linguagens:
Nível 4: Verificação forte de tipos. Somente operações entre dados de mesmo tipo,
previamente definido, são permitidas. A verificação de tipo é realizada na
compilação, carga e execução do programa.
Este aspecto deve ser levado e consideração quando se avalia uma linguagem e
inclusive as ferramentas de apoio ao desenvolvimento.
30
1.6.16. Eficiência
2.1. CASE
Toolkit: Ferramentas para pequenas tarefas, sem interação entre si e que apóiam
parte do processo de desenvolvimento.
• Maior produtividade
• Redução de erros
• Padronização
• Apoio à gerência de projetos
• Simplificação do trabalho
Desvantagens da CASE:
Saur (2004) apresenta três fatores críticos de sucesso para o Brasil no mercado de
“Global sourcing”:
34
Uma forte justificativa para este mercado pode ser a questão do desemprego, baixo
custo dos serviços oferecidos e também pela questão geográfica, ou seja,
proximidade do prestador de serviços em relação ao cliente.
IV. PESQUISA
4.1. METODOLOGIA
Autônomo
In-house Especializado
14
12
10
0
Java ASP C# Delphi Flex PHP Progress VB VB.Net
A explicação para esta questão pode ser um conjunto de fatores, como por exemplo,
da forte divulgação, disponibilidade de cursos e treinamentos. Mas principalmente o
fato destas linguagens e ferramentas serem usadas por equipes e projetos
pequenas, no domínio desta pesquisa, onde não há um projeto detalhado das
necessidades tecnológicas e ainda porque muitos desenvolvedores trabalham com
mais de uma linguagem e diversas ferramentas.
14
Produtividade
Portabilidade
12
Custo de licenças
Robustez
10
Aprendizagem rápida
Recursos
8
Planos do fornecedor
Comunidade
6
Documentação
Tipo de licença
4
Legibilidade
Material disponível
2
Mercado
Conhecimento da equipe
0
120
Portabilidade
Open Source/Free/Pago
100
Custo das licenças e pacotes
80 Tempo de aprendizado
Planos do fornecedor
60 Apoio da comunidade
Produtividade
20 Valorização profissional
Uma questão que realmente chamou a atenção foi a quinta, que perguntava sobre
quais as ferramentas de apoio são utilizadas e porque foram escolhidas. Não foram
citadas ferramentas de apoio à qualidade, testes, controle de versão, métricas ou até
mesmo geradores de aplicação. Isto pode ser um reflexo do ambiente restrito da
pesquisa, que atingiu apenas cenários de pequenas equipes e projetos simples ou
de pequeno porte, onde as metodologias mais avançadas não são utilizadas, bem
como qualquer ferramenta de apoio de alto nível.
4.3. SÍNTESE
Este procedimento pode ser justificado, em partes, pela simplicidade dos projetos
associado ao fato de sua maioria atuar no desenvolvimento in-house que, conforme
citado anteriormente, gera condições especiais, impossibilitando que os critérios de
escolhas de ferramentas sejam mais condicionantes que a exigência interna do
projeto. Um bom exemplo pode ser o caso do desenvolvimento de soluções de
migração e integração de sistemas, onde já existe um aparato tecnológico e
46
V. CONCLUSÃO
A codificação envolve conceitos que vão desde abstração, regras de sintaxe, regras
de semântica, interpretação do código, execução, interface com usuários e geração
de resultados. As metodologias construídas ao longo dos anos criaram diversos
paradigmas e a evolução tecnológica trouxe diversas opções de softwares de
desenvolvimento, com editores avançados, compiladores poderosos, interfaces de
produção, ferramentas de apoio, testes e métrica. Esta evolução também gerou
diversas alternativas para se alcançar uma solução esperada, por meio de técnicas
simples ou complexas, de custo elevado ou baixo, flexíveis ou limitadas.