(Certains de mes points ont déjà été évoqués par d'autres réponses, mais je pense que j'apporte une perspective suffisamment différente pour que cela mérite une réponse plutôt qu'un commentaire.)
Avant d'aborder la question de savoir si une spécification peut être vraiment et complètement sans ambiguïté, nous devons nous demander si elle doit être sans ambiguïté, au moins au niveau que vous demandez.
Permettez-moi d'aborder cela du point de vue d'un gestionnaire de programme travaillant sur un projet de petite à moyenne taille, ou sur une fonctionnalité dans le cadre d'un projet plus vaste. Il existe généralement deux types de spécifications différents qui seront rédigés pour un tel projet: une spécification fonctionnelle (ou PM) et une spécification de conception (ou de développement):
- La spécification fonctionnelle a pour tâche de décrire ce que le projet ou la fonction doit faire, souvent du point de vue du client. Il ne devrait pas, en général, décrire comment procéder. Selon le type de projet, le client peut se soucier de l'apparence de l'API externe, mais le client se soucie-t-il de savoir si la classe A hérite de la classe B ou implémente l'interface C? Il ne devrait pas. Et la spécification fonctionnelle non plus. Cela introduit déjà un niveau d'ambiguïté: celui de la conception technique.
- La spécification de conception a pour tâche de décrire comment les exigences fonctionnelles doivent être satisfaites, du point de vue de l'architecte ou du concepteur technique de l'élément ou du projet. Il vise à résoudre les ambiguïtés de haut niveau de la conception technique. Cela contiendra les détails que vous ne vouliez pas dans la spécification fonctionnelle, tels que l'architecture de la solution, y compris la structure de classe, l'héritage, peut-être même des fonctions et des méthodes individuelles, selon la portée et l'échelle du projet. L'architecte se soucie-t-il de ce que vous appelez vos variables temporaires ou si vous utilisez une liste ou un tableau pour un type de données interne? En supposant qu'elle fasse confiance à ses développeurs, elle ne devrait pas, et les spécifications de conception non plus. Cela introduit un deuxième niveau d'ambiguïté: celui de la mise en œuvre.
En général, ces détails au niveau de l'implémentation ne sont pas capturés dans un document formel, mais plutôt documentés, en soi , dans le code lui-même, y compris les commentaires. Ce niveau d'ambiguïté permet à un bon développeur d'utiliser ses propres compétences et de prendre les décisions techniques axées sur les détails qui sont la marque d'un bon développeur individuel. Pour cette raison, je n'hésiterai pas à dire que l'ambiguïté dans une spécification est, en fait, une bonne chose: elle permet aux développeurs de faire leur travail, et les élève au-dessus de simples "singes de code".
Cela ne veut pas dire, cependant, qu'il devrait y avoir une ambiguïté dans tout le document. À un niveau élevé, il ne devrait pas y avoir d'ambiguïté sur l'interface avec le client. Si la fonctionnalité possède une API accessible au public, elle doit être strictement définie. Si le système nécessite qu'une date soit transmise pour faire son travail, cette date doit-elle être dans le fuseau horaire local ou UTC? Quel format est nécessaire? Doit-elle être précise à la milliseconde près, ou la minute est-elle très bien?
Pour en revenir à la question de savoir si le langage naturel peut être utilisé pour créer des spécifications sans ambiguïté, il est vrai qu'il n'est pas très bon pour capturer ce niveau de clarté. Je l'ai vu faire dans certaines circonstances limitées, mais ce sont probablement des exceptions uniques que nous ne pouvons pas appliquer universellement. Le plus souvent, l'ambiguïté est résolue à l'aide d'un jargon technique, de diagrammes ou même d'un pseudocode. Une fois que vous commencez à demander l'aide de ces outils, le langage naturel cesse d'être le seul descripteur. Parce que ces outils peuvent rendre plus claire même une spécification fonctionnellement sans ambiguïté, j'ose dire qu'une telle entreprise ne devrait même pas être tentée.
Cela dit, comme le langage naturel est généralement complété par ces outils pour le rendre fonctionnellement non ambigu, mon opinion professionnelle est que non, le langage naturel seul n'est pas suffisant pour créer des spécifications sans ambiguïté dans tous les cas.