Este texto foi compartilhado pelo professor João Carlos de A. R. de Oliveira. Neste texto, Niklaus Wirth faz um passeio pela história da engenharia de software. Durante esse passeio, ele faz uma crítica a passividade das universidades ao assimilar os maus hábitos da indústria. Interessante notar que durante a história da computação, nem sempre as linguagens de programação que se tornaram populares eram as melhores disponíveis.
Boa Leitura!
Boa Leitura!
Uma breve História da Engenharia de Software
Niklaus Wirth
Resumo
Nós apresentamos uma perspectiva pessoal da arte da programação. Começamos com o seu estado por volta de 1960 e acompanhamos o seu desenvolvimento até os dias atuais. O termo engenharia de software tornou-se conhecido após uma conferência em 1968, quando as dificuldades e armadilhas de projetar sistemas complexos foram discutidas francamente. A busca de soluções começou. Ela se concentrou em melhores metodologias e ferramentas. As mais importantes foram as linguagens de programação que refletem os estilos procedimental, modular e, em seguida, orientado a objeto. A engenharia de software está intimamente ligada ao aparecimento e aperfeiçoamento desses estilos. Também importantes foram os esforços de sistematização, automatização da documentação do programa e testes. Por último, a verificação analítica e provas de correção deveriam substituir os testes.
Mais
recentemente, o rápido crescimento do poder computacional tornou possível
aplicar computação em tarefas cada vez mais complicadas. Esta tendência
aumentou drasticamente as demandas por engenheiros de software. Programas e
sistemas se tornaram complexos e quase impossíveis de ser completamente
compreendidos. A queda dos custos e a abundância de recursos computacionais
inevitavelmente reduziram os cuidados para um bom projeto. A qualidade parecia
extravagante, uma perda na corrida pelo lucro. Mas devemos estar preocupados
com a resultante deterioração da qualidade. Nossas limitações não são dadas por
hardwares lentos, mas pela nossa própria capacidade intelectual. Por
experiência, sabemos que a maioria dos programas pode ser significativamente
melhorados, ficando mais confiáveis, econômicos e confortáveis de se utilizar.
A década de 1960 e a origem de Engenharia de
Software
É
lamentável que pessoas que lidam com os computadores costumam ter pouco
interesse em sua história. Como resultado, muitos conceitos e idéias são
propagados e anunciados como novos, sendo que existem há décadas, talvez sob
uma terminologia diferente. Creio que vale a pena gastar ocasionalmente algum
tempo para analisar o passado e investigar como os termos e conceitos surgiram.
Eu
considero o final dos anos 1950 como um período essencial da era da computação.
Computadores de grande porte foram disponibilizados para instituições de
pesquisa e universidades. A presença deles foi notada principalmente na
engenharia e nas ciências naturais, mas também nos negócios, onde logo tornaram-se
indispensáveis. O tempo em que eles eram acessíveis apenas a uns poucos em
laboratórios, quando quebravam toda vez que alguém queria usá-los, pertence ao
passado. O seu aparecimento, dos laboratórios fechados de engenheiros
eletricistas para o domínio público, fez com que a sua utilização, em especial
a sua programação, se tornasse uma atividade para muitos. Uma nova profissão
nasceu, mas os computadores de grande porte se tornaram ocultos, dentro de porões muito bem guardados. Programadores traziam os seus
programas para o balcão, onde havia um atendente que os pegava e enfileirava, e
onde os resultados poderiam ser buscados horas ou dias depois. Não havia
nenhuma interatividade entre homem e computador.
A
programação foi conhecida por ser uma tarefa sofisticada que exige dedicação e
pesquisas minuciosas, e uma paixão por códigos obscuros e truques. Para
facilitar essa codificação, notações formais foram criadas. Nós agora as
chamamos de linguagens de programação. A idéia principal era substituir seqüências
de código de instrução especial por fórmulas matemáticas. A primeira linguagem
amplamente conhecida, Fortran, foi lançada pela IBM (Backus, 1957), logo
seguida pelo Algol (1958) e sua sucessora oficial em 1960. Como os computadores
eram usados para a computação em vez de armazenamento de dados e comunicação,
essas linguagens serviam principalmente para a cálculos matemáticos. Em 1962, a linguagem Cobol foi
lançada pelo Departamento de Defesa dos EUA para aplicações de negócios.
Mas,
como a capacidade de computação cresceu, assim também ocorreu com as exigências
sobre os programas e programadores: tarefas tornaram-se mais e mais
complicadas. Foi lentamente reconhecido que a programação era uma tarefa
difícil, e que dominar os problemas complexos não era trivial, mesmo quando -
ou porque - os computadores eram tão poderosos. A salvação foi procurada em
"melhores" linguagens de programação, mais "ferramentas",
sobretudo na automação. Uma melhor linguagem deve ser útil em uma ampla área de
aplicação, ser mais parecida com uma linguagem "natural", oferecer
mais facilidades. PL / 1 foi concebida para unificar os mundos científico e
comercial. Foi anunciada sob o slogan "Todo mundo pode programar graças ao
PL / 1". As linguagens de programação e seus compiladores tornaram-se um
marco principal da ciência da computação. Mas eles não se ajustavam à
matemática nem à eletrônica, os dois setores tradicionais em que os
computadores eram usados. Uma nova disciplina surgiu, chamada de Ciência da
Computação na América e de Informática na Europa.
Em
1963, o primeiro sistema de tempo compartilhado apareceu (MIT, Stanford,
McCarthy, DEC PDP-1). Isso trouxe de volta a interatividade. Os fabricantes de computadores
aderiram à idéia e desenvolveram sistemas de tempo compartilhado para os seus
grandes mainframes (IBM 360/67, a GE
645). Descobriu-se que a transição de sistemas de processamento em lote para sistemas de tempo compartilhado, ou a sua fusão, era muito mais difícil do que o previsto. Os sistemas eram anunciados e não podiam ser entregues a tempo. Os problemas eram muito complexos. As pesquisas deveriam ser conduzidas no dia-a-dia. As novidades do momento eram o multiprocessamento e programação concorrente. As dificuldades levaram as grandes empresas à beira do colapso. Em 1968, uma conferência patrocinada pela NATO, foi dedicada ao tema (1968 em Garmisch-Partenkirchen, Alemanha) [1]. Apesar de críticas terem ocasionalmente sido expressas anteriormente [2, 3] só após a conferência as dificuldades foram discutidas abertamente e confessadas com franqueza incomum, e os termos “engenharia de software” e “crise de software” foram criados..
645). Descobriu-se que a transição de sistemas de processamento em lote para sistemas de tempo compartilhado, ou a sua fusão, era muito mais difícil do que o previsto. Os sistemas eram anunciados e não podiam ser entregues a tempo. Os problemas eram muito complexos. As pesquisas deveriam ser conduzidas no dia-a-dia. As novidades do momento eram o multiprocessamento e programação concorrente. As dificuldades levaram as grandes empresas à beira do colapso. Em 1968, uma conferência patrocinada pela NATO, foi dedicada ao tema (1968 em Garmisch-Partenkirchen, Alemanha) [1]. Apesar de críticas terem ocasionalmente sido expressas anteriormente [2, 3] só após a conferência as dificuldades foram discutidas abertamente e confessadas com franqueza incomum, e os termos “engenharia de software” e “crise de software” foram criados..
A programação como uma Disciplina
No
mundo acadêmico, foram sobretudo E.W. Dijkstra e C.A.R. Hoare que reconheceram
os problemas e ofereceram novas idéias. Em 1965, Dijkstra escreveu o seu famoso
“Notes on Structured Programming” [4] e declarou a programação como uma
disciplina, em contraste com o artesanato. Também em 1965, Hoare publicou um
importante artigo sobre estruturação de dados [5]. Essas idéias tiveram uma
profunda influência sobre as novas linguagens de programação, em particular Pascal
[6]. As línguagens são os veículos nos quais essas idéias deveriam ser
expressas. A programação estruturada tornou-se sustentada por uma linguagem de
programação estruturada.
Além
disso, em 1966, Dijkstra escreveu um artigo seminal sobre processos que cooperam harmoniosamente [7],
postulando uma disciplina baseada em semáforos como primitivas para
sincronização de processos concorrentes. Hoare seguiu em 1966 com seu
“Communicating Sequential Processes (CSP)” [8], percebendo que, no futuro, os
programadores teriam que lidar com as dificuldades dos processos concorrentes.
Obviamente, isso resultaria em uma metodologia estruturada e disciplinada ainda
mais atraente.
Claro,
tudo isso não mudou a situação, nem dissipou todas as dificuldades da noite pro
dia. A indústria não poderia mudar nem as políticas nem as ferramentas
rapidamente. No entanto, cursos de formação intensiva sobre a programação
estruturada foram organizados, notavelmente através de H.D. Mills na IBM. Nada
menos do que o Departamento de Defesa dos EUA percebeu que os problemas eram
urgentes e crescentes. Ele começou um projeto que culminou com a linguagem de
programação Ada, uma linguagem altamente estruturada, apropriada para uma ampla
variedade de aplicações. O desenvolvimento de software no Departamento de
Defesa dos EUA seria então baseado exclusivamente em Ada [9].
Unix e C
No
entanto, uma outra tendência começou a permear toda a área de programação,
principalmente na academia,, apontando na direção oposta. Foi provocada pela
disseminação do sistema operacional UNIX, contrastando com o MULTICS do MIT e
utilizado nos minicomputadores que estavam surgindo rapidamente. UNIX foi um
alívio muito bem-vindo em relação aos grandes sistemas operacionais estabelecidos
em computadores de grande porte. Em seu reboque, UNIX trouxe a linguagem C [8], que tinha sido expressamente concebida
para apoiar o desenvolvimento do UNIX. Evidentemente por causa disso, era atrativo,
senão mesmo obrigatório, o uso de C para o desenvolvimento de aplicações
rodando em UNIX, que atuou como um cavalo de Tróia para C.
Do
ponto de vista da engenharia de software, a rápida disseminação da C
representou um grande salto para trás. Ele revelou que a comunidade em geral
não havia compreendido o verdadeiro significado do termo "linguagem de
alto nível", que se tornou um chavão mal-entendido. O que, então, deveria
ser "alto nível"? Como esta questão está no centro de engenharia de
software, precisamos entrar em detalhes.
Abstração
Os sistemas computacionais são máquinas de grande complexidade. Esta complexidade pode ser dominada intelectualmente por uma única ferramenta: Abstração. Uma linguagem representa um computador abstrato cujos objetos e construções se encontram mais perto (em mais alto nível) para o problema a ser representado do que em uma máquina concreta. Por exemplo, em uma linguagem de alto nível lidamos com os números, matrizes indexadas, tipos de dados, instruções condicionais e repetitivas, e não com bits e bytes, palavras endereçadas, desvios e códigos de condição. No entanto, essas abstrações são benéficas somente se forem consistentemente e completamente definidas em termos de suas próprias propriedades. Se isto não é assim, se as abstrações podem ser entendidas só em termos de facilidades de um computador subjacente, então os benefícios são marginais, quase insignifcantes. Se a depuração de um programa - sem dúvida a atividade mais comum da engenharia de software - requer uma "descarga da memória em hexadecimal", a linguagem vale pouco a pena.
Os sistemas computacionais são máquinas de grande complexidade. Esta complexidade pode ser dominada intelectualmente por uma única ferramenta: Abstração. Uma linguagem representa um computador abstrato cujos objetos e construções se encontram mais perto (em mais alto nível) para o problema a ser representado do que em uma máquina concreta. Por exemplo, em uma linguagem de alto nível lidamos com os números, matrizes indexadas, tipos de dados, instruções condicionais e repetitivas, e não com bits e bytes, palavras endereçadas, desvios e códigos de condição. No entanto, essas abstrações são benéficas somente se forem consistentemente e completamente definidas em termos de suas próprias propriedades. Se isto não é assim, se as abstrações podem ser entendidas só em termos de facilidades de um computador subjacente, então os benefícios são marginais, quase insignifcantes. Se a depuração de um programa - sem dúvida a atividade mais comum da engenharia de software - requer uma "descarga da memória em hexadecimal", a linguagem vale pouco a pena.
8 comentários:
Ótimo texto, parabéns!
Muito bom!
Muito bom.
Hoje vivemos em função da tecnologia. Sem a qual não conseguiremos trabalhar.
Viagem nos bits do tempo!
Eu costumo dizer que hoje em dia tem ocorrido uma inversão de valores regida pela seguinte frase: "Para que facilitar se você pode complicar?!" O simples passou a ser sinal de má qualidade. Fazer o que é preciso, necessário... se não tiver uma gama de complexidade não é valorizado. É preciso usar mil e um frameworks do momento pra mostrar qualidade. Muita coisa boa ainda pode ser feito de forma simples e direto ao ponto.
Obrigado por compartilhar essa fantástica viagem no tempo! Realmente é preocupante a falta de qualidade e aumento da complexidade dos softwares atuais, e infelizmente poucos desenvolvedores se preocupam com os princípios de engenharia de software, e quando se dão conta, geralmente é tarde, e muitos só descobrem quando precisam fazer manutenção ou upgrade no sistema. O imediatismo causa a falsa sensação que o importante e fazer acontecer, não importa como, mas é uma cilada sem volta.
Excelente!!!!
Postar um comentário