Escolar Documentos
Profissional Documentos
Cultura Documentos
CADERNO 2
PROCESSOS DE DESENVOLVIMENTO DE
SOFTWARE
1º Edição
NOTA SOBRE ESTA EDIÇÃO
O conhecimento recolhido neste caderno origina-se dos livros clássicos e introdutórios de Engenharia
de Software, de publicações científicas produzidas pela comunidade nacional e internacional de
computação, de publicações técnicas oriundas de empresas e associações de software, das pesquisas
em Engenharia de Software conduzidas na própria UTFPR e da experiência do autor atuando no
mercado de desenvolvimento software e como pesquisador. Destaca-se, como fonte de informação,
o SWEBOK V3.0 – Guide to the Software Engineering Body of Knowledge (Swebok, 2014).
Trata-se de um documento produzido pelo IEEE Computer Society com uma grande reputação na
definição dos conhecimentos fundamentais e consolidados da área de engenharia de software.
CADERNO 2
PROCESSOS DE
DESENVOLVIMENTO DE
SOFTWARE
“Given enough time, I can meet any software deadline!” (Clyde Calcote).
CONCEITO DE PROCESSO
A definição comum dos dicionários para o termo “processo” é a de “uma série de ações que
são executadas com o objetivo de se alcançar um resultado particular”. Em geral, um
processo é construído por um ou mais conhecedores de um domínio visando prescrever uma
maneira apropriada de se realizar algum trabalho. Assim, os processos são análogos a
receitas, algoritmos ou modelos a serem seguidos quando se tem determinados objetivos a
alcançar. Os processos são descritos por ações ou atividades a serem realizadas, por decisões
a serem tomadas, por eventuais entradas e saídas, e por um encadeamento destas.
Existe uma semelhança entre alguns termos como técnica (i.e., maneira de realizar uma ação
visando a obtenção de um determinado resultado), método (i.e., meio utilizado para chegar a
um fim) e processo. Na atualidade, prefere-se empregar na engenharia e nas corporações o
termo “processo”, pois tem-se uma interpretação de ele define uma forma mais detalhada e,
inclusive, diagramática de se estabelecer como se organizam as atividades para atingir
determinado resultado.
Por outro lado, a definição de “sistema” é bem mais abrangente e mais antiga, não se
limitando à área de computação. A palavra vem do latim systema e do grego sýstema
significando “aquilo que permanece junto”. A definição mais comum de “sistema” dos
dicionários é: “Um sistema é uma coleção de elementos ou componentes que são organizados
para operarem em conjunto visando alcançar um propósito comum.”. Analogamente,
segundo o INCOSE (International Council on System Engineering), “Um sistema é um
arranjo de partes ou elementos que juntos exibem um comportamento e significado que os
constituintes individuais não têm”. O conceito de “parte” está relacionado com a noção de
Aristóteles quando ele afirma que “O todo é mais que a soma das partes.”.
Sistemas podem ser naturais (e.g., sistema solar, sistema digestivo ou nervoso de um ser vivo,
uma árvore) ou artificiais criados pelo ser humano (e.g., um carro, um submarino, um sistema
A partir dos anos 40, em consequência da segunda grande guerra e, também, da evolução
tecnológica, governos e empresas passaram a desejar desenvolver produtos de maior porte e
de maior complexidade. Projetos de maior porte trazem dificuldades adicionais para se
garantir que o todo seja consistente e que opere de forma apropriada e eficiente com todas as
suas partes. Considere, por exemplo, o desenvolvimento de um submarino, de um porta
aviões ou de um sistema bancário. Para conceber e desenvolver tais produtos, é necessária
uma visão mais ampla do conjunto e das diferentes disciplinas envolvidas (e.g., engenharia
mecânica, elétrica, computação, design). Para permitir desenvolver produtos (i.e., sistemas)
deste porte foi criada a Engenharia de Sistemas. Trata-se de uma nova engenharia, distinta
das demais, cujo papel é o desenvolvimento do todo e não de uma especialidade de
engenharia. Por exemplo, o desenvolvimento de um submarino, não é um projeto de
engenharia mecânica exclusivamente, nem de engenharia elétrica ou computação. Neste
caso, é a engenharia de sistemas que deveria ser aplicada, levando em conta o conjunto
heterogêneo de partes. Engenheiros mecânicos, eletricistas e de computação participarão do
desenvolvimento de subsistemas, mas a responsabilidade pela concepção do todo é do
engenheiro de sistemas.
Embora todo software faça sempre parte de um sistema maior, nem sempre é necessário que
se aplique a Engenharia de Sistemas para, então, realizar-se o desenvolvimento de software.
Alguns sistemas de computação e de informação tem o software como componente
fundamental e os outros componentes são padrões e usuais (e.g., hardware de PC, monitor,
A análise de segurança visa determinar quais são os riscos de falhas do futuro sistema e seus
efeitos, em especial relativo à integridade de pessoas. A determinação do nível de risco
associado a um sistema é essencial, pois a forma de condução da engenharia do sistema s
seguir será diferente de acordo com os riscos de segurança existentes. Para sistemas com
riscos maiores, o rigor da engenharia também deverá ser maior. Os riscos de falhas podem
estar associados às diversas funções e componentes do sistema, inclusive dos softwares.
Existem técnicas consagradas para a análise de segurança de sistemas como FMEA (Failure
Mode and Effect Analysis) e FMECA (Failure Mode, Effects & Criticality Analysis),
desenvolvidas a partir do final dos anos 40 e aperfeiçoadas ao longo do tempo. Basicamente,
estas técnicas consistem no estudo por parte do engenheiro, das possíveis ocorrências de
falhas (chamadas “modos de falhas”), como, por exemplo, “Falha em detectar a aproximação
de uma pessoa” ou “Falha em acionar o motor de abertura” em um sistema de porta
automática. A seguir, estuda-se as possíveis causas de cada modo de falha e o efeito destas
falhas. No exemplo do primeiro modo de falha, a causa poderia ser a “Falha de operação do
sensor de proximidade”, seu o efeito local seria “A porta automática não abre” e seu efeito
global seria “Há probabilidade da pessoa passante se chocar contra a porta.”, pois ela poderia
esperar que a porte se abriria. Estuda-se, também, outros aspectos das falhas como sua
frequência, probabilidade de ocorrência e o quão severa a falha é. Finalmente, analisa-se
quais ações podem ser tomadas, em termos de projeto do sistema, para minimizar ou evitar
a ocorrência de tais falhas. Por exemplo, no caso da porta automática, “O sensor de
proximidade deverá ser substituído a cada 6 meses que seu período de vida útil médio.”
• Planejamento do Desenvolvimento
Este tipo de plano é elaborado quando um determinado software deverá ser certificado por
uma agência reguladora, como a ANAC (Agência Nacinal de Aviação Civil), e deverá
atender a normas que regulamentam o desenvolvimento de software em determinado setor,
como o setor aeronáutico. Como todo plano, o PSAC é elaborado antes do início do
desenvolvimento do software e encaminhado ao agente regulador. O plano fornece às
autoridades de certificação uma visão geral dos meios de adequação do desenvolvimento às
normas em vigor e dos aspectos de planejamento para o desenvolvimento do produto. A
agência reguladora, em geral, irá revisar e aprovar o plano e o utilizará para o
acompanhamento do desenvolvimento por um auditor.
Este plano descreve de que forma a atividade de especificação de requisitos deverá ser
realizada. Existem várias técnicas, métodos e abordagens alternativos para uma equipe
realizar a especificação de requisitos de um software, envolvendo reuniões com o cliente,
questionários, escrita de estórias do usuário (i.e., user´s stories), análises de mercado, análises
de segurança, validação de requisitos, modelagem formal, entre outros. O plano de
especificação de requisitos determina o que e como a equipe deverá realizar esta atividade
para o desenvolvimento do software em questão, de maneira que não haja dúvida sobre como
conduzir as ações.
Em projetos envolvendo alta criticidade (e.g., sistemas aeronáuticos com alto riscos à
segurança de pessoas), o nível de qualidade técnica do software deve garantido. Para isso, a
equipe de desenvolvimento deverá utilizar técnicas e ferramentas adequadas de
desenvolvimento. Como, em geral, as ferramentas são produzidas por outras empresas, há
uma dúvida legítima sobre a qualidade das ferramentas. Por exemplo, uma equipe pode se
esforçar para aplicar as melhores práticas de programação visando garantir uma alta
qualidade, mas, ainda assim, os programas podem ter falhas graves originadas por bugs no
compilador utilizado. Assim, quando o nível de qualidade de software é alto, torna-se
necessária “qualificar” as ferramentas usadas por meio da comprovação da qualidade sua
técnica. Isso pode ser feito solicitando aos fornecedores atestados de qualidade ou realizando-
se teste de garantia de qualidade sobre as ferramentas usadas. Ferramentas, cuja qualidade
não possa ser comprovada, não podem ser usadas em determinados desenvolvimentos. O
plano de qualificação de ferramentas define como cada ferramenta usada será qualificada,
obviamente, se o desenvolvimento em questão o exigir.
Na visão do autor deste caderno, o Project Manager deveria ser um administrador (inclusive
com formação em administração) para bem conduzir as tarefas de gestão segundo as práticas
mais atuais. Ele não deveria ser o líder do desenvolvimento, pois não é um engenheiro. A
liderança do desenvolvimento deveria ser exercida por um engenheiro experiente,
assessorado por um Project Manager. Desta forma, cada profissional agiria dentro de suas
competências, podendo alcançar máxima eficiência. Não é incomum encontrar um “grande
engenheiro” alocado como Project Manager de um desenvolvimento, fazendo atividades de
administração de maneira insatisfatória (até porque não é sua competência primária, nem seu
gosto) e infeliz (e mal utilizado) por não ter disponibilidade de tempo para atuar na concepção
do produto técnico. É claro que existem, também, engenheiros que desenvolvem um gosto
maior, e até uma capacitação, em gestão e poderiam assumir, assim, o papel de Project
Manager. Mas note que nesse caso, podemos ter uma ótima gestão, mas o papel de liderança
técnica de projeto fica comprometido. O grande problema parece ser misturar dois papéis
distintos (liderança técnica e administração) em uma mesma função. É claro que isso é
compreensível e aceitável para projetos menores com uma equipe reduzida.
• Verificação
A atividade de verificação tem por objetivo avaliar a qualidade técnica da solução que está
sendo concebida e construída ao longo de seu desenvolvimento. Nesta atividade, aplicam-se
técnicas de inspeção, de revisão e de testes para medir esta qualidade. Isso pode ser feito para
cada parte do sistema, separadamente, ou para o conjunto das partes do sistema, conforme o
avanço dos desenvolvimentos permita checar a qualidade das integrações das partes.
Não se deve confundir QA com o “controle de qualidade” (Quality Control - QC). O controle
de qualidade está relaciondo com processos ou procedimentos para assegurar a qualidade
técnica do sistema em desenvolvimento (i.e., se os parâmetros da solução desenvolvidade
estão de acordo com os requisitos técnicos especificados) e faz parte da atividade de
Verificação. Portanto, QC está relacionado com o desenvolvimento do produto em si,
podendo ser considerada, efetivamente, uma atividade de engenharia. QA, por outro lado, é
uma atividade de monitoramento dos processos que fazem parte do desenvolvimento, sendo
uma atividade de suporte à engenharia.
Ao longo das décadas, os processos foram sendo repensados em busca de uma maior
eficiência e conformidade com as características do desenvolvimento de software. Novas
propostas de processos ou de aperfeiçoamentos de processos existentes foram apresentadas
e aplicadas na indústria, inclusive baseadas na evolução dos paradigmas de software. Até os
dias atuais, continua-se a repensar as formas de desenvolvimento utilizadas e a buscar
melhores alternativas visando melhorar a eficiência (i.e., fazer mais com menos recursos) e
melhorar a possibilidade de sucesso do produto (i.e., satisfazer as demandas dos clientes).
A tabela a seguir ilustra alguns dos principais processos existentes com uma classificação
proposta pelo autor deste caderno.
Uma representação gráfica alternativa àquela da Figura 6.a, seria desenhar as atividades
diagonalmente, conforme ilustrado na Figura 7. Isso não muda em nada as atividades nem
sua ordem de realização, mas permite criar uma nova analogia. Nesta visão, com cada
atividade a direita estando desenhada um pouco mais abaixo, tem-se a impressão de uma
escada ou de uma cascata em degraus (inclusive desenhou-se na Figura 7 uma representação
da água acima das atividades para melhor caracterizar esta visão de uma cascata. A analogia
(que também dá o nome de “cascata” ou “waterfall” ao processo) é a de que o processo flui
em uma única direção, tal como em uma cascata a água escorre naturalmente de um degrau
ao próximo, sempre na mesma sequência, provocado pela força da gravidade. Ou seja, deseja-
se caracterizar o fato de o processo ser sequencial, não tendo como se avançar do primeiro
ao terceiro degrau sem passar necessariamente pelo segundo, e assim por diante.
Assim, em processos sequenciais, o retorno a atividade anteriores é a situação que gera maior
dificuldade. Em especial, falha de especificação de requisitos, quando observadas apenas ao
final do processo na Verificação, exigiriam um retorno para correções no início com os
maiores custos. Este, de fato, é o maior problema da abordagem sequencial. Em razão do
alongamento do desenvolvimento criando um distanciamento entre as atividades (porque
cada atividade só inicia após a conclusão da anterior), há um grande risco ao desenvolvimento
uma vez que os requisitos especificados mais ao início só serão confirmados (verificados)
mais ao final do processo na Verificação, quando todo o esforço e custo de desenvolvimento
já foi aplicado. Se os objetivos do desenvolvimento do software forem bem claros, bem
conhecidos e não vierem a sofrer mudanças (e.g., são estáveis), então o risco ao
desenvolvimento é baixo e este processo Waterfall é aplicável. Na situação extrema ao
contrário, em que os requisitos não são bem conhecidos e há incertezas sobre eles, o processo
Waterfall pode ser uma abordagem inadequada. Foi exatamente, esta dificuldade que levou
ao processo interativos que serão discutidos adiante.
Outro aspecto a ser considerado sobre o processo Waterfall é que ele, principalmente em
desenvolvimentos maiores, levou a organizações funcionais do desenvolvimento. Como
havia quatro atividades distintas a executar, envolvendo habilidades profissionais também
distintas, muitas empresas organizavam o desenvolvimento fazendo passar o projeto por
quatro equipes, cada qual fazendo seu papel de especificação, projeto, construção e
verificação com profissionais especializados em cada tarefa. Com isso, criou-se uma
departamentalização do desenvolvimento de software. Uma equipe (ou setor ou
departamento) iniciava o desenvolvimento, fazendo a especificação de requisitos do
software. Ao término, esta equipe produzia um documento técnico com os resultados e
encaminhava para a próxima equipe que, usando os resultados anteriores, produzia o projeto
da solução e sua documentação. Os resultados eram, então, encaminhados à equipe de
Construção e, posteriormente, à equipe de Verificação. Cada profissional atuava em uma
Pode-se, ainda, afirmar que o processo Waterfall é um processo simples de entender, simples
de aplicar e fácil de gerir. Esta simplicidade é resultado da natureza sequencial do processo,
pois, em geral, coisas sequenciais são mais simples de se entender e controlar. A gestão de
um processo Waterfall tende a não ser complexa (relativo à sua dimensão), pois há uma
previsibilidade do que está sendo feito a cada momento (i.e., sempre uma única atividade), o
cronograma é compreensível e sabe-se, claramente, o que há a fazer. O eventual complicador
da gestão deste processo seria a necessidade de retorno a atividades anteriores, mas que não
deveria ocorrer em excesso, pois este processo só deveria ser aplicado a casos em que os
requisitos são mais claros e estáveis.
Com relação a sua eficiência, o processo Waterfall pode ser considerado o mais eficiente dos
processos, notadamente para o caso de desenvolvimentos com requisitos claros e estáveis.
Essa alta eficiência se justifica pelo fato do processo Waterfall ter a natureza de uma linha
de produção sem série, como em uma fábrica de produtos manufaturados (e.g., produção de
automóveis). Este tipo de estrutura de produção tende a gerar o máximo de saídas (produtos
acabados) por recursos utilizados, o que representa sua eficiência. Obviamente, se houver
retrabalhos, em razão principalmente de falhas nos requisitos, esta eficiência será
comprometida.
A prototipação de software é uma técnica que poder ser empregada em conjunto com
qualquer processo de desenvolvimento, como um meio para melhorar a qualidade das
especificações (i.e., deixar os requisitos mais próximos da real demanda dos clientes). Além
disso, a prototipação pode ser útil para validar princípios de funcionamento da solução
pretendida, validar a performance alcançável em uma dada plataforma, analisar a viabilidade
de certas tecnologias e avaliar outras características técnicas sobre as quais a equipe possa
não ter domínio pleno ou há incertezas. Fundamentalmente, é produzido um protótipo do
software antes de se partir para o desenvolvimento mais intenso do produto. Este protótipo é
uma construção simplificada e incompleta do futuro software, baseada nos requisitos
definidos até o momento (i.e., podem ainda estar incompletos) e em um esboço da solução
estrutural e comportamental.
(i) Não investir demais em detalhes e cuidados para que o tempo de construção
seja curto e o custo seja baixo. Ou seja, a construção de um protótipo deve ser
feita sem os cuidados de desenvolvimento de um software. Não é necessário fazer
o projeto da arquitetura do protótipo, não é necessário usar técnicas de
programação detalhadas, nem documentar o protótipo, não é necessário que o
protótipo seja completo (ou seja, pode haver “ifs” sem “elses”, por exemplo, e
pode haver funções não implementadas) e, ainda, não se faz testes do protótipo
para assegurar sua qualidade.
(ii) Descartar integralmente o protótipo após seu uso. Dado que os protótipos são
construídos sem cuidados, o código produzido deve ser de baixa qualidade no
sentido geral e, assim, deve ser integralmente descartado após seu uso na
validação dos requisitos. Se houver intenção de aproveitar o código ao final, então
a regra (i), possivelmente, não será respeitada, pois haverá tendência de se
construir o protótipo com mais qualidade, alongando o tempo de desenvolvimento
e aumentando rapidamente o seu custo.
O Processo ou Modelo em V (“V Model” ou ainda “The Validation and Verification Model”)
foi inicialmente proposto em 1986 por Paul Rook [11] e depois aperfeiçoado e detalhado por
vários autores, na forma de uma extensão do processo Waterfall. Assim, trata-se também de
um processo sequencial com características análogas ao que foi discutido na seção anterior,
mas com algumas particularidades. O Modelo em V teve grande repercussão mundial e
tornou-se, por exemplo, o padrão de desenvolvimento de software em 1992 das autoridades
federais da Alemanha para todos os projetos nas áreas de defesa e comercial. Ainda hoje, em
muitas áreas de engenharia, o Modelo em V também é uma referência, como no setor de
transporte, industrial, aeronáutico e de defesa.
O Processo em V foi proposto tendo uma preocupação especial com a melhoria da qualidade
dos softwares. Por esta razão, ele estende as atividades existentes no processo Waterfall para
colocar em destaque as atividades de verificação (i.e., testes). Na prática, mantém-se as
mesmas quatro atividades fundamentais de todos os processos, mas com um detalhamento
em testes. A figura a seguir ilustra o Processo em V na forma de uma extensão do Processo
Waterfall, em que a atividade de Verificação é substituída por três atividades de teste. O autor
deste caderno também chama este processo de “cascatão”, quando o desenha neste formato
de um processo em cascata alongado.
• Testes Unitários
Um método clássico de teste unitário denomina-se “Teste em Caixa Preta” (Black Box
Testing em inglês). Este método baseia-se apenas na relação entre os dados entrada de uma
unidade e dos dados resultantes da sua execução. O fluxo de processamento dentro da
unidade de código não é considerado e é, por essa razão, que esta técnica se chama “caixa
preta”, pois não se vê o interior da unidade. Para testar cada unidade é necessário a elaboração
de um plano de testes no qual estarão definidos os casos de teste, ou seja, um conjunto de
valores de entrada e respectivos dados de saída esperados. Se a unidade sendo testada
produzir os resultados esperados para todos os casos de teste (ou seja, se a unidade passar
nos casos de teste), ela será então considerada aprovada no teste unitário. A principal
dificuldade na elaboração dos casos de teste é a possibilidade de haver um número muito
grande de casos, tornando a atividade muito longa ou inviável. Considere, por exemplo, a
seguinte unidade (i.e., função) a ser testada: int Somar(int a, int b). Para garantir que
esta função faça a soma adequada de dois inteiros quaisquer “a” e “b” e produza um inteiro
resultante da soma, seria necessário criar tantos casos de teste quando fosse a combinação de
todos os inteiros positivos e negativos de “a” e “b”, o que, seguramente, será uma longa lista.
Frequentemente, empregam-se técnicas para reduzir este número de casos, como o
“Particionamento em Classes de Equivalência” e “Análise de Valor Limite”. No
Particionamento em Classes de Equivalência busca-se determinar grupos de valores dentro
do domínio dos dados que sejam equivalentes para fins de teste, de forma a evitar a
necessidade de testá-los todos. O teste com um único valor dentro de uma classe seria
suficiente para verificação de todos os valores da classe. A Análise de Valor Limite considera
que erros costumam ocorrer nos limites dos valores dos dados que separam as classes de
equivalência e, assim, valores nestes limites são escolhidos para os casos de teste.
Outro método de teste unitário denomina-se “Teste em Caixa Branca” (White Box Testing
em inglês) em que o fluxo de execução (i.e., algoritmo) da unidade sendo testada é levado
em conta. Assim, deve-se considerar o código no interior da unidade, o que deu o nome
“Caixa Branca” ao método. Aqui vale observar que este nome parece equivocado, pois não
é possível enxergar o que há dentro de uma caixa branca. Talvez um nome melhor teria sido
“Caixa Transparente”. Testes em caixa branca buscam checar a qualidade de uma unidade
do software analisando aspectos relacionados com a cobertura dos testes (code coverage).
Deseja-se saber o quanto do código foi efetivamente testado, mesmo que ele tenha
• Testes de Integração
Uma vez que todas as unidades do código do software tenham sido testadas e passaram nos
testes unitários, pode-se avançar para a atividade de Testes de Integração. Neste nível de
teste, busca-se checar se as unidades de código operando em conjunto realizam
adequadamente as funcionalidades de mais alto nível previstas. Alguns autores, diferenciam
também os testes de integração e testes funcionais, em que os primeiros envolvem funções
de mais alto nível e os segundos envolvem funções mais intermediárias ou de mais baixo
nível, ambos envolvendo a operação conjunta de unidades já testadas. Mais frequentemente,
utilizam-se métodos em Caixa Preta nos testes de integração.
Alguns autores empregam, também, o termo Testes de Sistema (System Testing) para
denominarem os testes em que todo o sistema é considerado, inclusive o hardware,
dispositivos externos, usuários e outros softwares externos que compõem o sistema. Na
prática, há grande similaridade com o que é feito nos Testes de Integração, não sendo
necessário diferenciá-los para a maioria das situações.
• Testes de Aceitação
Após a verificação da qualidade técnica do software, feita por meio dos testes unitários e de
integração, pode-se proceder aos testes de aceitação. O objetivo é verificar se os requisitos
especificados para o software foram atendidos pela solução produzida. Em geral, estes testes
são planejados baseando-se nos requisitos de alto nível, verificando-se, um a um, se o
software entrega (i.e., realiza) a funcionalidade e características que atendem cada requisitos.
Não é necessário percorrer todas as possibilidades de execução das funcionalidades, pois isso
já foi verificado anteriormente. Estes testes muitas vezes são feitos com a presença do cliente
que atesta que o software cumpre com o que foi especificado, servindo de base para o
Essa visão de processo surgiu do conceito de executar uma série de ciclos curtos de Planejar-
Fazer-Estudar-Agir (do inglês, PDSA: Plan-Do-Study-Act) proposto por Walter Shewhart
dos Bell Labs, nos anos 30 (Larman, 2003). Entende-se que esta visão iterativa permite ao
desenvolvedor tirar vantagem sobre o que se aprendeu durante o desenvolvimento das
versões incrementais (i.e., ciclos ou iterações) anteriores do sistema. Este aprendizado vem
das próprias conclusões sobre as decisões do desenvolvimento, mas, também, do uso do
sistema (parcial) já desenvolvido, em que a participação do cliente (i.e., do contratante e/ou
usuário) é essencial para um feedback sobre os resultados parciais já alcançados.
TODO
MÉTODOS ÁGEIS
TODO
Rook, 1986 Rook, P., Rook, E., Controlling software projects, IEEE Software Engineering
Journal, 1(1), 1986, pp. 7-16.
Larman, 2003 Larman, C. e Victor R. Basili, V. R., Iterative and Incremental Development: A
Brief History, IEEE Computer, 2003.
Boehm, 1986 Boehm, Barry, A Spiral Model of Software Development and Enhancement,
ACM SIGSOFT Software Engineering Notes. 11 (4): 14–24, 1986.
Swebok, 2014 Guide to Software Engineering Body of Knowledge, Ed. P. Bourque
e R. E. Fairley, IEEE Computer Society, 2014.
Glass, 2001 Glass, R. L., Frequently Forgotten Fundamental Facts about
Software Engineering, pg. 112, IEEE Software, May/June, 2001.