Ao escrever um software, qual é o objetivo de escrever uma especificação formal e detalhada de árvore morta? Para esclarecer, uma especificação informal e de alto nível para pessoas que não querem ler o código faz sentido para mim. Porém, uma implementação de referência em código-fonte legível e bem comentado é a especificação mais inequívoca de tudo o que você obterá, já que um computador precisa executá-lo. As especificações formais costumam ser tão difíceis de ler e quase tão difíceis de escrever quanto o código.
Quais benefícios uma especificação formal oferece sobre uma implementação de referência, além de um pouco de documentação sobre qual comportamento é indefinido / definido pela implementação, independentemente de como ele funciona na implementação de referência.
Edit: Como alternativa, o que há de errado com os testes sendo a especificação formal?
Respostas:
Como você pode saber que terminou, se não sabe como deve ser quando terminar?
O recurso creep irá pegá-lo. Você estará tentando entregar para um cliente e, à medida que o tempo de conclusão chegar, eles descobrirão 10.000 pequenas coisas que absolutamente precisam ter .
Para receber o pagamento, a fim de tirar seu chefe das costas quando o prazo terminar, você precisa conseguir as especificações e dizer: "Todas as minhas estimativas de tempo e custo foram para isso , não para novas coisa que todo mundo decidiu que quer ".
fonte
As especificações permitem que você pondere sobre as coisas sem ter escrito muito código antecipadamente, que precisaria ser alterado, se a especificação mudar. Considere entre o quadro-negro e a codificação real
É também uma muito boa idéia fazer quando se tem várias partes independentes escrevendo componentes que necessitam para ir junto.
fonte
Além de outras boas razões já mencionadas, ter uma especificação formal permite CYA - Cover Your Ass! Se os gerentes / analistas / testadores disserem que você não criou algo corretamente, você pode apontar para as especificações e dizer "Eu criei exatamente como você queria!". Isso inclui itens de baixo nível, como "Todos os dados persistidos na tabela AXX_RGV devem estar em MAIÚSCULAS", "Formulários da Web com menos de 3 campos de entrada devem ter o botão Enviar no canto inferior esquerdo", etc ...
Também para quando as pessoas esquecem coisas em um projeto muito longo e grande, ter uma especificação detalhada para se referir pode ser muito útil. Lembre-se de que a especificação deve ser um Documento Vivo, e se os requisitos mudarem (através do que se espera que seja um processo formal e documentado), o mesmo deve acontecer com a especificação. Sim, isso pode levar mais tempo. Na minha experiência, vale a pena (se for bem feito).
fonte
Uma especificação formal dos requisitos de um programa é necessária porque o engenheiro de software precisa saber o que implementar; o engenheiro de controle de qualidade precisa saber o que testar e o cliente precisa saber o que esperar.
Ter uma especificação permite saber quando você termina de programar.
fonte
Um dos principais benefícios pode ser a segurança. Eu não gostaria de voar em um avião de passageiros em que a especificação dos sistemas de controle fosse uma implementação de referência. Eu realmente quero que alguém especifique o que os sistemas precisam fazer de uma forma que alguém que não esteja intimamente familiarizado com o software possa entender. Eu esperaria que cada requisito fosse totalmente verificado por testes.
Para sistemas menos críticos para a segurança, as especificações são ferramentas de comunicação. Eles devem detalhar o que o sistema precisa fazer com detalhes suficientes para construir e testar o sistema. Como o sistema faz isso é de responsabilidade do código. Os detalhes necessários variarão de acordo com a experiência no domínio da equipe de desenvolvimento e o acesso aos especialistas no domínio.
As especificações devem sempre corresponder aos sistemas implementados. Se forem encontrados erros na especificação, a especificação deverá ser atualizada.
As causas de erro estimadas que eu vi indicam que as falhas de teste são divididas de forma relativamente uniforme entre erros nas especificações, código e testes.
fonte
Penso que esta questão é o cerne da questão do ciclo de vida ágil versus cascata.
Se você está agilizando, uma premissa básica é que o código associado à interação estreita com o desenvolvedor é melhor e mais rápido que a especificação detalhada. A equipe prioriza o lançamento de novos recursos e alta qualidade sobre outras coisas - como mecanismos formais de comunicação, como especificações detalhadas do projeto. Mas há um comércio aqui - você precisa ter canais de comunicação entre os membros da equipe que permitam que eles perguntem sobre nuances e intenção detalhada do projeto quando necessário.
Se você está fazendo cascata, está trabalhando com a suposição de que o trabalho de preencher o código sob o design detalhado e testá-lo é significativo. E você deseja fornecer às partes interessadas informações precoces sobre como esse trabalho continuará e como será quando terminar. Isso pode estar avaliando o design com o cliente para garantir que você tenha escolhido os recursos que fazem sentido. Pode ser também consultá-lo com especialistas em outras áreas - como análises de segurança, análises de segurança e análises de membros da equipe que precisam se integrar ao seu código. A suposição é de que essas revisões economizarão tempo a longo prazo, pois evitarão que você investigue uma grande quantidade de tempo no desenvolvimento da coisa errada.
Ultimamente, tenho visto uma fusão realmente excelente entre projetos detalhados e ferramentas de comentários de código - JavaDoc, por exemplo. Como os designs mais detalhados são pegadas do código e explicações curtas sobre o que ele fará - isso é mais ou menos a mesma coisa que você esperaria dos comentários do código. Portanto, é ótimo ter uma ferramenta que transformará os comentários do código em uma especificação detalhada do projeto - uma maneira muito melhor de mantê-lo atualizado do que fazê-lo manualmente.
Acredito que a avaliação imprecisa de como o design deve ser detalhado para o projeto é um fator importante no aumento de custos. A pior parte é que você está condenado se fizer isso e condenado se não fizer:
Não acho que seja um gabinete preto e branco - pode haver muitas vezes em que alguns componentes são "bons o suficiente" se projetados em um nível alto, enquanto outros precisam de um trabalho detalhado e rigoroso. E a mudança de ambientes de equipe ou projeto pode ditar novas necessidades de design à medida que o projeto evolui.
fonte
Trabalhando em um grande projeto agora. Até agora, as especificações ajudaram o controle de qualidade a identificar o que testar, nos permitiram cobrar mais do cliente (significativamente em milhões) quando, no teste do usuário, eles decidiram que o que haviam concordado não era o que realmente queriam, permitia às pessoas fazer uma revisão de código para verificar se o código atendia ao requisito, permitiu que os desenvolvedores tivessem uma base para verificar se eles haviam terminado e apontar para a especificação para resolver disputas sobre o que o módulo deveria conter. Também nos permitiu identificar desenvolvedores que não estavam produzindo o que o cliente exigia antes que ele visse o produto e isso acabou como uma base para livrar-se de algumas pessoas que, de maneira sistemática, não podiam seguir as especificações. A complexidade de nossas especificações ajudou o cliente a perceber que não estávamos sendo ultrajantes em nossas estimativas de custo e tempo.
Eu queria acrescentar, trabalhei em projetos com boas especificações, com especificações ruins e sem especificações. Os que acabaram sendo os piores foram os sem especificação, porque a equipe de desenvolvimento e o cliente sempre tiveram uma visão interna diferente do resultado final. Estes são os projetos nos quais você sai por aí murmurando: "Onde posso obter um módulo de leitura da mente?" Adivinhar o que o cliente pode querer é uma experiência horrível. Especificações ruins não são muito melhores, mas pelo menos você pode refinar enquanto diz: "Não sei ao certo o que você quis dizer aqui". para obter mais informações antes de perder seu tempo criando a coisa errada. O grande projeto em que estou agora tem especificações surpreendentemente boas, tornou a vida mais fácil e muito menos estressante.
fonte
Pessoalmente, acho que as especificações detalhadas superestimaram.
Na minha experiência, o que os clientes precisam e o que pensam que precisam são geralmente duas coisas diferentes. Se você congelar os requisitos desde o início, estará criando o que eles pensam que precisam, e não o que eles realmente precisam. Legalmente, você está do lado seguro e será pago, mas não terá um cliente feliz.
Por outro lado, se você aceitar que o desenvolvimento de software é, em certa medida, uma atividade exploratória, tentará manter os requisitos abertos pelo maior tempo possível. Discuta com os usuários o que você precisa saber para a iteração atual , nem mais nem menos. E saiba que, às vezes, você precisará revisar essas decisões em uma iteração posterior. Mais importante: lembre-se de que, se isso acontecer, não é culpa do cliente. A menos que seus usuários também sejam desenvolvedores de software, a coleta de requisitos não faz parte da descrição de seu trabalho. Faz parte da descrição do seu trabalho.
Então, como você evita a fluência de recursos? Idealmente, com um gerente de produtos sã responsável por aceitar ou rejeitar solicitações de recursos e que não pode ser substituído por mais ninguém.
fonte
O Agile tem mais de 10 anos, portanto, esse não é um fenômeno novo.
Espero que as especificações sejam muito menores do que o código, por isso não sei quantos detalhes você precisa. Deve haver o suficiente para manter os membros da equipe informados. Ler todos os códigos um do outro é prático / necessário?
Concordou, não há necessidade de documentos mortos. Prefiro abordar uma base de código desconhecida sem documentação do que documentação incorreta.
E se o computador é tão bom em executar seu código, por que você não deixa fazer as próprias alterações? Seguir a receita na parte de trás da caixa não faz de você um chef.
fonte