Parece-me que você não pode escrever uma especificação de software em inglês completamente livre de ambiguidades, simplesmente devido à natureza informal da linguagem natural - e, portanto, que uma especificação verdadeiramente inequívoca deve incluir código escrito em uma linguagem formalmente especificada.
Esse é um resultado conhecido ou estou faltando alguma coisa?
Respostas:
Não é isso que os advogados sempre faziam para evitar ambiguidades?
O resultado é que eles escrevem da maneira mais antinatural, tentando ler seus artigos é mais difícil do que nunca e, apesar disso, sempre existem inconsistências e ambiguidades.
Você está certo, não pode escrever uma especificação de software totalmente livre de ambiguidades, mas também não conseguirá implementar uma linguagem formal especificada.
É também por isso que documentamos nosso código, porque às vezes é difícil ler para nossas mentes.
Não faz sentido documentar código com outro código.
fonte
Impossível? Vamos perguntar se é desejável primeiro. Se concordarmos que é impossível, e ainda houver muitos softwares úteis por aí, o objetivo de uma especificação inequívoca parecerá acadêmico.
Eu diria que é impossível provar que algo é perfeito e inequívoco, tanto para as especificações quanto para o software.
Eu acho que depende do tamanho do problema. Se o problema for pequeno o suficiente, de natureza matemática e talvez alguns outros critérios que eu estou perdendo, eu diria que é possível escrever uma especificação que seja viável.
Quanto maior o problema, maior a audiência, mais difícil é fazer.
Porém, aviônicos e outros problemas complexos sugerem que é possível escrever especificações "boas o suficiente" em inglês para resolver grandes problemas.
fonte
bem .. uma especificação completamente inequívoca do problema é o próprio código real :)
Esse é um problema conhecido e, para sistemas especiais de missão crítica, é obrigatório escrever uma especificação inequívoca em uma linguagem formal (programação) e depois transformá-la em um código que provavelmente faz o que a especificação diz. Este é um campo muito restrito, 99,999% dos desenvolvedores nunca precisam executar tarefas como essa, mas uma vez conversei com um cara que fazia isso para um sistema de controle de tráfego / ferrovia.
fonte
Sou seguidor do W3C e costumo escrever artigos com base em suas especificações. Minha experiência me diz que ler qualquer especificação sem códigos de exemplo escritos é simplesmente uma dor de cabeça.
Concordo plenamente e acho que o principal motivo é que os desenvolvedores tendem a ler e entender melhor o código. Imagine que você obtenha um artigo matemático sem nenhuma fórmula.
ou:
Qual é o mais curto? Qual é mais legível? O que traz mais compreensão com isso?
O mesmo vale para as especificações. Muitas vezes, quando você chega às partes técnicas, escrever uma linha de código pode esclarecer um longo parágrafo de explicação.
fonte
Suponha que exista uma linguagem formal que permita escrever especificações não ambíguas. Então, proponho que deveria haver um mapeamento bijetivo para um subconjunto de inglês. Portanto, deve ser possível escrever especificações inequívocas se você se ater a esse subconjunto.
Mas qualquer linguagem formal que seja expressiva o suficiente para fazer algo interessante não estará livre de inconsistências (incompletude de Gödel).
fonte
As especificações são ambíguas e imprecisas porque as pessoas são ambíguas e imprecisas. Encontre uma pessoa perfeita e talvez possa obter uma especificação perfeita.
Inglês, suaíli, sânscrito ou babilônico não faz diferença.
fonte
A ambiguidade é realmente uma força neste contexto.
Para explicar o porquê, vamos supor por um momento que é possível usar o idioma inglês de uma maneira totalmente inequívoca, para que qualquer problema que possa ser resolvido programaticamente possa ser expresso de maneira completa e inequívoca. Se usarmos essa variante do inglês, e nossa descrição descrever de fato o programa a ser escrito completa e inequivocamente, segue-se logicamente que deve ser possível executar uma tradução automática para a linguagem de programação de destino - em outras palavras, a variante de O inglês que concebemos é na verdade uma linguagem de programação.
As pessoas que lêem documentos de design (especialmente designs funcionais) não desejam esse nível de detalhe - ler a fonte de um programa, seja em C ++, Java ou inglês inequívoco, está muito acima da cabeça dos não programadores. É aí que entram as linguagens naturais: elas permitem que o escritor de uma especificação deslize de qualquer maneira na escala de detalhes, movendo detalhes de implementação irrelevantes para o subtexto ou deixando-os totalmente não especificados. Os idiomas naturais estão cheios de dispositivos para transmitir significado de forma relativamente clara, mesmo que você não esteja fornecendo uma definição exata (que faz parte do que torna as traduções automatizadas tão difíceis).
Portanto, o objetivo geralmente não é uma especificação completa, correta e inequívoca; o objetivo é escrever uma especificação que ilustra claramente, para os seres humanos, o que você está prestes a construir.
Sempre que você precisa de um correto e inequívoco, e as coisas estão ficando técnicas de qualquer maneira, o pseudocódigo geralmente é mais valioso do que linguagens naturais ou formais rígidas - ele ainda pode deixar de fora detalhes irrelevantes (chamando funções / processos não especificados), mas a estrutura é inequívoca .
fonte
Você não está perdendo nada, exceto que a documentação foi escrita para os humanos lerem. Alguma ambiguidade é esperada, e até bem-vinda, porque o texto conciso é difícil de ler (= não para humanos).
Especificar a documentação para uma linguagem formal em outra linguagem formal seria uma espécie de problema de galinha e ovo.
Se você realmente precisa de especificação formal, existem maneiras formais de verificar os modelos . É uma área de pesquisa ativa e muito interessante, mas os "usuários" finais aqui são máquinas, não humanos.
fonte
(Alguns dos meus argumentos já foram mencionados por outras respostas, mas sinto que estou fornecendo uma perspectiva diferente o suficiente para fazer com que isso valha a pena uma resposta, em vez de um comentário.)
Antes de abordarmos a questão de saber se uma especificação pode ser verdadeira e completamente inequívoca, devemos abordar a questão de saber se ela deve ser inequívoca, pelo menos no nível que você está perguntando.
Deixe-me abordar isso da perspectiva de um gerente de programa trabalhando em um projeto de tamanho pequeno a médio ou em um recurso como parte de um projeto maior. Geralmente, existem dois tipos diferentes de especificações que serão escritas para esse projeto: uma especificação Funcional (ou PM) e uma especificação Design (ou Dev):
Em geral, esses detalhes no nível da implementação não são capturados em um documento formal, mas documentados, per se , no próprio código, incluindo os comentários. Esse nível de ambiguidade permite que um bom desenvolvedor use suas próprias habilidades e tome as decisões técnicas detalhadas que são a marca registrada de um bom desenvolvedor individual. Por causa disso, não hesitarei em dizer que a ambiguidade em uma especificação é, de fato, uma coisa boa: permite que os desenvolvedores realizem seus trabalhos e os eleva acima de meros "macacos de código".
Isso não quer dizer, no entanto, que deve haver ambiguidade em todo o documento. No alto nível, não deve haver ambiguidade sobre a interface com o cliente. Se o recurso tiver uma API voltada para o público, deve ser estritamente definida. Se o sistema exigir que uma data seja passada para seu trabalho, essa data deve estar no fuso horário local ou no UTC? Que formato é necessário? Precisa ser preciso até o milissegundo ou o minuto está bom?
Voltando à questão de saber se a linguagem natural pode ser usada para criar especificações inequívocas, é verdade que não é muito bom capturar esse nível de clareza. Eu já vi isso em certas circunstâncias limitadas, mas essas são provavelmente exceções únicas que não podemos aplicar universalmente. Na maioria das vezes, a ambiguidade é resolvida com a ajuda de jargões técnicos, diagramas ou mesmo pseudocódigo. Depois que você começa a recorrer à ajuda de tais ferramentas, a linguagem natural deixa de ser o único descritor. Como essas ferramentas podem tornar ainda mais clara uma especificação completamente funcional e inequívoca, arriscaria dizer que esse empreendimento nem deveria ser tentado.
Dito isto, como a linguagem natural é geralmente complementada por essas ferramentas para torná-la funcionalmente inequívoca, é minha opinião profissional que não, apenas a linguagem natural não é suficiente para criar especificações inequívocas em todos os casos.
fonte
Pode-se tornar a linguagem natural relativamente inequívoca, mas apenas com grande dificuldade.
A profissão de advogado precisa desesperadamente que a linguagem seja o mais inequívoca possível. Embora muito sobre como uma lei seja aplicada possa estar aberto à interpretação, o que as palavras significam não deve.
Esta necessidade levou à invenção dos juridicos. Até onde você está disposto a ir?
fonte
Existem várias especificações do grupo aberto, ISO, IETF e ITU que são suficientemente inequívocas para empresas altamente competitivas interoperarem com êxito. Há várias especificações que são a base de contratos ou leis em que milhões de dólares estão em jogo.
Portanto, as especificações podem não ser "perfeitas". No entanto, isso ocorre porque os seres humanos não são perfeitos. Por exemplo, é inequívoco que o HTTP use um cabeçalho "Referer" - a ortografia correta é de fato "Referrer".
O idioma inglês é capaz de ser inequívoco, mas os seres humanos são capazes de cometer erros - incluindo ambiguidade.
Além disso, pode ser útil deliberadamente ambíguo para detalhes que não foram finalizados ou talvez precisem ser atualizados no futuro. Por exemplo, uma especificação pode especificar um "hash" em vez de especificar especificamente md5, sha1, crc32 etc.
fonte
Eu acredito que a resposta correta é negativa. É necessário distinguir as seguintes perguntas:
A diferença entre a primeira e a segunda pergunta diz respeito ao nível de detalhe envolvido, à quantidade de interpretação necessária e às regras impostas à construção de frases na linguagem natural para fins de redação do software ou especificação de software.
A resposta para a segunda pergunta é afirmativa. Dado um subconjunto adequadamente restrito de uma linguagem natural com regras acordadas para construção e significado de sentenças, o código pode ser escrito em sentenças gramaticais em inglês. Por exemplo, o idioma a seguir permite inequivocamente escrever instruções de atribuição:
Ou seja, podemos traduzir sistematicamente o código escrito em linguagens de programação formais em linguagens naturais, descrevendo cada procedimento. Por outro lado, uma especificação de software geralmente requer interpretação. Portanto, se uma especificação de software pode ser fornecida sem ambiguidade, depende do nível de detalhe envolvido na especificação. No entanto, dado um domínio selecionado no qual a especificação varia, com operações específicas nesse domínio selecionadas, um processo de conversão semelhante pode ser realizado. Por exemplo:
onde as declarações
X
,Y
,Z
conter apenas os itens mencionados no prefácio do especificação e são escritos de forma formal adequadamente e acordados subconjunto de uma linguagem natural. As ambiguidades, então, dizem respeito a como implementar a especificação - mas isso será esperado.fonte
Não
Uma especificação inequívoca de uma computação é um programa de computador.
fonte