Escolar Documentos
Profissional Documentos
Cultura Documentos
Resumo1
Toda a construção de software envolve tarefas essenciais, a formação de estruturas
conceituais complexas que compõem a entidade abstrata do software, e tarefas acidentais,
a representação dessas entidades abstratas em linguagens de programação e o
mapeamento delas em linguagens de máquina dentro das restrições de espaço e
velocidade. A maior parte dos grandes ganhos do passado em produtividade de software
veio da remoção de barreiras artificiais que t o r n a r a m as tarefas acidentais
extremamente difíceis, como restrições severas de hardware, linguagens de programação
complicadas e falta de tempo de máquina. Quanto do que os engenheiros de software
fazem atualmente ainda é dedicado ao acidental, em oposição ao essencial? A menos que
seja mais de 9/10 de todo o esforço, reduzir todas as atividades acidentais a tempo zero
não proporcionará uma melhoria de ordem de magnitude.
Portanto, parece que chegou a hora de abordar as partes essenciais da tarefa de
software, aquelas relacionadas à criação de estruturas conceituais abstratas de grande
complexidade. Eu sugiro:
• Explorar o mercado de massa para evitar a construção do que pode ser comprado.
• Usar a prototipagem rápida como parte de uma iteração planejada no estabelecimento
de requisitos de software.
• O software cresce organicamente, acrescentando cada vez mais funções aos sistemas à
medida que eles são executados, usados e testados.
• Identificar e desenvolver os grandes designers conceituais da nova geração.
Introdução
De todos os monstros que enchem os pesadelos de nosso folclore, nenhum aterroriza
mais do que os lobisomens, porque eles se transformam inesperadamente do familiar em
horrores. Para eles, buscamos balas de prata que possam magicamente fazê-los descansar.
1 Reproduzido de: Frederick P. Brooks, The Mythical Man-Month, edição de aniversário com 4 novos
capítulos, Addison-Wesley (1995), reproduzido dos Proceedings of the IFIP Tenth World Computing
Conference, H.-J. Kugler, ed., Elsevier Science B.V., Amsterdam, NL (1986) pp. 1069-76.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 2
O conhecido projeto de software tem um pouco desse caráter (pelo menos na visão do
gerente não técnico), geralmente inocente e direto, mas capaz de se tornar um monstro de
cronogramas não cumpridos, orçamentos estourados e produtos defeituosos. Portanto,
ouvimos gritos desesperados por uma bala de prata, algo que faça com que os custos de
software caiam tão rapidamente quanto os custos de hardware de computador.
Mas, ao olharmos para o horizonte da próxima década, não vemos nenhuma bala de
prata. Não existe um desenvolvimento único, seja em tecnologia ou em técnica de
gerenciamento, que por si só prometa uma melhoria de uma ordem de magnitude em
produtividade, confiabilidade e simplicidade. Neste capítulo, tentaremos entender o
porquê, examinando a natureza do problema do software e as propriedades das soluções
propostas.
Entretanto, ceticismo não é pessimismo. Embora não vejamos nenhuma descoberta
surpreendente e, de fato, acreditemos que isso seja inconsistente com a natureza do
software, muitas inovações encorajadoras estão em andamento. Um esforço disciplinado
e consistente para desenvolvê-las, propagá-las e explorá-las deve, de fato, produzir uma
melhoria de ordem de magnitude. Não existe uma estrada real, mas existe uma estrada.
O primeiro passo para o controle de doenças foi a substituição das teorias dos
demônios e dos humores pela teoria dos germes. Esse mesmo passo, o início da
esperança, por si só acabou com todas as esperanças de soluções mágicas. Ela dizia aos
trabalhadores que o progresso seria feito por etapas, com grande esforço, e que seria
necessário um cuidado persistente e incessante com uma disciplina de limpeza. O mesmo
acontece com a engenharia de software atualmente.
Se isso for verdade, a criação de software sempre será difícil. Não há, inerentemente,
uma bala de prata.
Vamos considerar as propriedades inerentes a essa essência irredutível dos sistemas
de software modernos: complexidade, conformidade, capacidade de mudança e
invisibilidade.
Complexidade. As entidades de software são mais complexas para seu tamanho do que
talvez qualquer outra construção humana, porque não há duas partes iguais (pelo menos
acima do nível de instrução). Se forem, transformamos as duas partes semelhantes em
uma só, uma sub-rotina, aberta ou fechada. Nesse aspecto, os sistemas de software
diferem profundamente de computadores, edifícios ou automóveis, onde há muitos
elementos repetidos.
Os computadores digitais são mais complexos do que a maioria das coisas que as
pessoas constroem; eles têm um número muito grande de estados. Isso dificulta a
concepção, a descrição e os testes. Os sistemas de software têm ordens de magnitude
mais estados do que os computadores.
Da mesma forma, o aumento de escala de uma entidade de software não é apenas uma
repetição dos mesmos elementos em tamanho maior; é necessariamente um aumento no
número de elementos diferentes. Na maioria dos casos, os elementos interagem uns com
os outros de forma não linear, e a complexidade do todo aumenta muito mais do que
linearmente.
A complexidade do software é uma propriedade essencial, não acidental. Por isso, as
descrições de uma entidade de software que abstraem sua complexidade geralmente
abstraem sua essência. A matemática e as ciências físicas fizeram grandes avanços
durante três séculos, construindo modelos simplificados de fenômenos complexos,
derivando propriedades dos modelos e verificando essas propriedades
experimentalmente. Isso funcionou porque as complexidades ignoradas nos modelos não
eram as propriedades essenciais dos fenômenos. Não funciona quando as complexidades
são a essência.
Muitos dos problemas clássicos do desenvolvimento de produtos de software derivam
dessa complexidade essencial e de seu aumento não linear com o tamanho. Da
complexidade vem a dificuldade de comunicação entre os membros da equipe, o que leva
a falhas no produto, custos excedentes e atrasos no cronograma. Da complexidade vem a
dificuldade de enumerar, e muito menos de entender, todos os estados possíveis do
programa, e daí vem a falta de confiabilidade. Da complexidade das funções vem a
dificuldade de invocá-las, o que torna os programas difíceis de usar. Da complexidade da
estrutura vem a dificuldade de estender os programas a novas funções sem criar efeitos
colaterais. Da complexidade da estrutura vem o estado não visualizado que constitui uma
armadilha de segurança.
Não apenas os problemas técnicos, mas também os problemas de gerenciamento
decorrem da complexidade. Essa complexidade dificulta a visão geral, impedindo assim a
integridade conceitual. Torna difícil encontrar e controlar todas as pontas soltas. Ela cria
uma enorme carga de aprendizado e compreensão que torna a rotatividade de pessoal um
desastre.
Conformidade. As pessoas que trabalham com software não são as únicas a enfrentar a
complexidade. A física lida com objetos terrivelmente complexos, mesmo no nível das
partículas "fundamentais". O físico trabalha, no entanto, com a firme convicção de que há
princípios unificadores a serem encontrados, seja nos quarks ou nas teorias de campo
unificado. Einstein argumentou repetidamente que deve haver explicações simplificadas
da natureza, porque Deus não é caprichoso ou arbitrário.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 4
Essa fé não conforta o engenheiro de software. Grande parte da complexidade que ele
precisa dominar é uma complexidade arbitrária, forçada sem rima ou razão pelos muitos
fatores humanos que o tornam um profissional de software.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 5
instituições e sistemas para os quais suas interfaces devem confirmar. Elas diferem de
interface para interface e de tempos em tempos, não por necessidade, mas apenas porque
foram projetadas por pessoas diferentes, e não por Deus.
Em muitos casos, o software deve confirmar porque entrou em cena mais
recentemente. Em outros, ele deve estar em conformidade porque é percebido como o
mais adaptável. Mas, em todos os casos, grande parte da complexidade vem da
conformidade com outras interfaces; isso não pode ser simplificado apenas com um
redesenho do software.
estabelecer o controle conceitual sobre essa estrutura é impor o corte de links até que um
ou mais gráficos se tornem hierárquicos.2
Apesar do progresso em restringir e simplificar as estruturas do software, elas
permanecem inerentemente não visualizáveis, privando a mente de algumas de suas
ferramentas conceituais mais poderosas. Essa falta não apenas impede o processo de
design em uma mente, mas também dificulta muito a comunicação entre as mentes.
2Parnas, D.L., "Designing software for ease of extension and contraction", IEEE Trans. on SE, 5, 2
(março de 1979), pp. 12-138.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 7
linguagem, nem mesmo por causa de todos eles combinados. Tampouco o novo Ada
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 9
3 Booch, G., "Object-oriented design", em Software Engineering with Ada. Menlo Park, Califórnia:
Benjamin Cummings, 1983.
4 Mostow, J., ed., Special Issue on Artifical Intelligence and Software Engineering, IEEE Trans. on SE, 11,
11 (nov. 1985).
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 11
Edward Feigenbaum diz que o poder desses sistemas não vem de mecanismos de
inferência cada vez mais sofisticados, mas sim de bases de conhecimento cada vez mais
ricas que refletem o mundo real com mais precisão. Acredito que o avanço mais
importante oferecido pela tecnologia é a separação da complexidade do aplicativo do
próprio programa.
Como isso pode ser aplicado à tarefa de software? De várias maneiras: sugerindo
regras de interface, aconselhando sobre estratégias de teste, lembrando frequências de
tipos de bits, oferecendo dicas de otimização etc.
5Parnas , D.L., "Software aspects of strategic defense systems", Communications of the ACM, 28, 12 (Dez.,
1985), pp. 1326-1335. Também em American Scientist, 73, 5 (setembro-outubro de 1985), pp. 432-440.
6 Balzer, R., "A 15-year perspective on automatic programming" (Uma perspectiva de 15 anos sobre
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 12
O Parnaso dá a entender que o termo é usado por glamour e não por conteúdo
semântico, afirmando,
Ele argumenta, em essência, que na maioria dos casos é o método de solução, e não o
problema, cuja especificação deve ser fornecida.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 14
É difícil ver como essas técnicas podem ser generalizadas para o mundo mais amplo
do sistema de software comum, onde casos com propriedades tão perfeitas são a exceção.
É difícil até mesmo imaginar como esse avanço na generalização poderia ocorrer.
9 Raeder, G., "A survey of current graphical programming techniques", em R. B. Grafton e T. Ichikawa, eds.,
Special Issue on Visual Programming, Computer, 18, 8 (Aug., 1985), pp. 11-25
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 16
Ambientes e ferramentas. Quanto mais se pode esperar das crescentes pesquisas sobre
melhores ambientes de programação? A reação instintiva é que os problemas de grande
retorno foram os primeiros a serem atacados e já foram resolvidos: sistemas de arquivos
hierárquicos, formatos de arquivos uniformes para que haja interfaces de programas
uniformes e ferramentas generalizadas. Os editores inteligentes específicos da linguagem
são desenvolvimentos que ainda não são amplamente utilizados na prática, mas o
máximo que eles prometem é a ausência de erros sintáticos e erros semânticos simples.
Talvez o maior ganho ainda a ser obtido no ambiente de programação seja o uso de
sistemas de banco de dados integrados para acompanhar as miríades de detalhes que
devem ser lembrados com precisão pelo programador individual e mantidos atualizados
em um grupo de colaboradores em um único sistema.
Certamente esse trabalho vale a pena e certamente trará alguns frutos em termos de
produtividade e confiabilidade. Mas, por sua própria natureza, o retorno a partir de agora
deve ser marginal.
Estações de trabalho. Que ganhos podem ser esperados para a arte do software com o
aumento rápido e certo da capacidade de potência e memória da estação de trabalho
individual? Bem, quantos MIPS podem ser usados de forma proveitosa? A composição e
a edição de programas e documentos são totalmente compatíveis com as velocidades
atuais. A compilação poderia ter um aumento, mas um fator de 10 na velocidade da
máquina certamente deixaria o tempo de reflexão como a atividade dominante no dia a
dia do programador. De fato, parece ser assim agora.
Estações de trabalho mais potentes são certamente bem-vindas. Não podemos esperar
melhorias mágicas delas.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 18
Se, como acredito, os componentes conceituais da tarefa estão tomando a maior parte
do tempo, então nenhuma atividade nos componentes da tarefa que são meramente a
expressão dos conceitos pode proporcionar grandes ganhos de produtividade.
Portanto, devemos considerar os ataques que abordam a essência do problema do
software, a formulação dessas estruturas conceituais complexas. Felizmente, alguns deles
são muito promissores.
Na verdade, não são os pacotes. Eles podem ser um pouco mais generalizados e um
pouco mais personalizáveis do que antigamente, mas não muito. Os aplicativos também
não são bem assim. Se
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 20
11 Mills, H. D., "Top-down programming in large systems", Debugging Techniques in Large Systems, R.
Rustin, ed., Englewood Cliffs, N.J., Prentice-Hall, 1971.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 22
Sim Não
Unix Cobol
APL PL/1
Pascal Algol
Módulos MVS/370
Smalltalk MS-DOS
Fortran
Fig. 1 Produtos interessantes
12 Boehm, B. W., "A spiral model of software development and enhancement", Computer, 20, 5 (May,
1985), pp. 43-57.
F. Brooks: No Silver Bullet-Essence and accident in software engineering (1986) 23
Nenhuma organização de software pode ignorar esse desafio. Bons gerentes, por mais
escassos que sejam, não são mais raros do que bons designers. Tanto os grandes
designers quanto os grandes gerentes são muito raros. A maioria das organizações
despende um esforço considerável para encontrar e cultivar os candidatos a gerentes; não
conheço nenhuma que despenda o mesmo esforço para encontrar e desenvolver os
grandes designers, dos quais a excelência técnica dos produtos dependerá em última
instância.
Minha primeira proposta é que cada organização de software deve determinar e
proclamar que os grandes designers são tão importantes para seu sucesso quanto os
grandes gerentes, e que se pode esperar que eles sejam nutridos e recompensados da
mesma forma. Não apenas o salário, mas também os privilégios do reconhecimento -
tamanho do escritório, mobília, equipamento técnico pessoal, fundos para viagens, apoio
à equipe - devem ser totalmente equivalentes.
Como desenvolver grandes designers? O espaço não permite uma discussão longa,
mas algumas etapas são óbvias:
• Identifique sistematicamente os melhores designers o mais cedo possível. Os melhores
geralmente não são os mais experientes.
• Designe um mentor de carreira para ser responsável pelo desenvolvimento do cliente
potencial e mantenha um arquivo de carreira cuidadoso.
• Elaborar e manter um plano de desenvolvimento de carreira para cada cliente em
potencial, incluindo estágios cuidadosamente selecionados com os melhores designers,
episódios de educação formal avançada e cursos de curta duração, todos intercalados
com design individual e atribuições de liderança técnica.
• Oferecer oportunidades para que os designers em crescimento interajam e estimulem uns
aos outros.
■