Como a indústria de software enfrentou décadas de fracassos sistemáticos e construiu, passo a passo, as bases da engenharia de software mode...

No final da década de 1960, a indústria da computação vivia um paradoxo: o hardware evoluía em ritmo exponencial, mas a capacidade de produzir software confiável ficava cada vez mais para trás. Projetos atrasavam, orçamentos explodiam e sistemas entregues frequentemente não atendiam às necessidades dos usuários. Esse conjunto de problemas crônicos recebeu o nome de Crise do Software — termo cunhado durante a Conferência de Engenharia de Software da OTAN, realizada em Garmisch, Alemanha, em 1968[1].
Relatórios da época e estudos posteriores revelaram números alarmantes sobre a taxa de fracasso dos projetos de software[2]:
O projeto do sistema operacional OS/360 da IBM é frequentemente citado como caso emblemático: envolveu milhares de programadores, atrasou anos e acumulou inúmeros defeitos, sendo descrito por Frederick Brooks como um "pântano de alcatrão"[3].
A crise se manifestava através de cinco sintomas interligados[4]:
O modelo cascata (waterfall) foi o primeiro modelo de ciclo de vida de software formalizado. Descrito por Winston Royce em 1970[5], propõe que o desenvolvimento avance em fases sequenciais — como água descendo uma cascata — onde cada fase deve ser concluída e aprovada antes que a próxima se inicie.
A principal fragilidade do cascata é a premissa de que os requisitos podem ser completamente definidos no início e não mudarão[10]. Na prática, requisitos mudam — e se um erro de requisitos só é descoberto na fase de testes, o custo de correção é exponencialmente maior do que se fosse detectado no início[4].
O modelo também atrasa o feedback: o cliente só vê o sistema funcionando na etapa final, quando mudanças significativas são quase inviáveis. Essa rigidez motivou a busca por modelos alternativos.
Proposto por Barry Boehm em 1986[6], o modelo espiral combina o cascata com prototipagem e adiciona um elemento até então inédito: a análise de riscos como atividade central de cada ciclo. A cada volta da espiral, o projeto cresce em escopo e maturidade, mas só avança se os riscos forem considerados aceitáveis.
Cada volta da espiral passa por quatro quadrantes[6]:
Em vez de entregar tudo no final, o sistema é construído em partes (incrementos). Cada incremento passa por um mini-ciclo completo de análise, projeto, codificação e testes. A distinção entre os dois termos é sutil, porém importante[4]:
Na prática, quase sempre se combinam: cada incremento (parte nova) é refinado em iterações (melhorado a cada passada). As metodologias ágeis — Scrum, XP, Kanban — são a evolução direta desse modelo[9].
Nenhum modelo é universalmente superior — cada um se adequa a contextos diferentes[10]. A tabela abaixo sintetiza as diferenças fundamentais:
| Critério | Cascata | Espiral | Iterativo |
|---|---|---|---|
| Fluxo | Linear, uma passada | Ciclos com análise de risco | Mini-ciclos de entrega |
| Requisitos | Fixos no início | Refinados a cada volta | Evoluem continuamente |
| Entrega | Somente no final | Protótipos + produto final | Incrementos funcionais |
| Feedback | Só na entrega | A cada volta | A cada incremento |
| Custo de mudança | Muito alto | Médio | Baixo |
| Risco | Alto (descoberto tarde) | Controlado (análise explícita) | Moderado (mitigado por ciclos) |
| Ideal para | Requisitos estáveis e regulados | Projetos grandes, alto risco | Maioria dos projetos modernos |
Padrões de projeto (design patterns) são soluções reutilizáveis para problemas recorrentes no design de software orientado a objetos. Não são código pronto, mas esquemas documentados que descrevem como estruturar classes e objetos para resolver um tipo específico de problema de forma elegante. O conceito foi popularizado pelo livro de Gamma, Helm, Johnson e Vlissides — o chamado Gang of Four (GoF) — que catalogou 23 padrões divididos em três categorias[8].
Abstraem o processo de instanciação, tornando o sistema independente de como seus objetos são criados[8].
Lidam com a composição de classes e objetos para formar estruturas maiores e mais flexíveis[8].
Definem como objetos colaboram e distribuem responsabilidades, estabelecendo padrões de comunicação flexíveis[8].
A Crise do Software nunca teve uma resolução definitiva — como argumentou Brooks em seu célebre ensaio "No Silver Bullet", a complexidade essencial do software é irredutível e não existe tecnologia ou prática que, isoladamente, produza ganhos de ordem de magnitude na produtividade[7].
O que houve foi uma resposta acumulativa: o cascata[5] mostrou que era preciso ter processo; o espiral[6] mostrou que era preciso gerenciar riscos; o modelo iterativo mostrou que era preciso obter feedback rápido; e o Manifesto Ágil[9] combinou essas lições com foco em pessoas, colaboração e adaptação contínua.
Os padrões de projeto[8], por sua vez, contribuíram com um vocabulário compartilhado que permitiu a engenheiros comunicar soluções complexas de forma precisa e eficiente — acelerando o design e reduzindo a ambiguidade.
- [1] NAUR, Peter; RANDELL, Brian (ed.). Software Engineering: report on a conference sponsored by the NATO Science Committee. Garmisch, Germany: NATO, 7–11 Oct. 1968. Brussels: Scientific Affairs Division, NATO, 1969. Disponível em: http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF. Acesso em: 14 mar. 2026.
- [2] THE STANDISH GROUP. CHAOS Report. Boston: The Standish Group International, 1995.
- [3] BROOKS, Frederick P. The Mythical Man-Month: essays on software engineering. Reading, MA: Addison-Wesley, 1975. ISBN 0-201-00650-2.
- [4] PRESSMAN, Roger S.; MAXIM, Bruce R. Engenharia de software: uma abordagem profissional. 9. ed. Porto Alegre: AMGH, 2020. ISBN 978-85-8055-534-1.
- [5] ROYCE, Winston W. Managing the development of large software systems. In: PROCEEDINGS OF IEEE WESCON, Los Angeles, 1970. Proceedings [...]. New York: IEEE, 1970. p. 1–9.
- [6] BOEHM, Barry W. A spiral model of software development and enhancement. ACM SIGSOFT Software Engineering Notes, New York, v. 11, n. 4, p. 14–24, Aug. 1986. DOI: 10.1145/12944.12948.
- [7] BROOKS, Frederick P. No silver bullet: essence and accidents of software engineering. Computer, Washington, v. 20, n. 4, p. 10–19, Apr. 1987. DOI: 10.1109/MC.1987.1663532.
- [8] GAMMA, Erich; HELM, Richard; JOHNSON, Ralph; VLISSIDES, John. Design Patterns: elements of reusable object-oriented software. Reading, MA: Addison-Wesley, 1994. ISBN 0-201-63361-2.
- [9] BECK, Kent et al. Manifesto for Agile Software Development. 2001. Disponível em: https://agilemanifesto.org/. Acesso em: 14 mar. 2026.
- [10] SOMMERVILLE, Ian. Engenharia de software. 10. ed. São Paulo: Pearson Education do Brasil, 2016. ISBN 978-85-430-1968-2.


Comentários