(Некоторые из моих пунктов уже упоминались в других ответах, но я чувствую, что я предоставляю достаточно другую точку зрения, чтобы сделать этот ответ достойным ответа, а не комментарием.)
Прежде чем мы решим вопрос о том, может ли спецификация быть действительно и полностью однозначной, мы должны рассмотреть вопрос о том, должна ли она быть однозначной, по крайней мере, на том уровне, о котором вы спрашиваете.
Позвольте мне подойти к этому с точки зрения менеджера программы, работающего над проектом небольшого или среднего размера, или функции как части более крупного проекта. Обычно для такого проекта будут написаны два разных типа спецификаций: функциональная (или PM) спецификация и Design (или Dev) спецификация:
- Функциональная спецификация предназначена для описания того, что должен делать проект или функция, часто с точки зрения клиента. В общем, не следует описывать, как это должно быть сделано. В зависимости от типа проекта, клиент может заботиться о том, как выглядит внешний API, но заботится ли клиент о том, наследует ли класс A от класса B или реализует интерфейс C? Он не должен. И ни одна не должна функциональной спецификации. Это уже вводит один уровень двусмысленности: технический дизайн.
- Спецификация проекта имеет задачу описать, как должны выполняться функциональные требования, с точки зрения архитектора или технического дизайнера функции или проекта. Он предназначен для устранения неоднозначностей на высоком уровне технического дизайна. Он будет содержать те детали, которые вам не нужны в функциональной спецификации, такие как архитектура решения, включая структуру классов, наследование, возможно, даже отдельные функции и методы, в зависимости от масштаба и масштаба проекта. Архитектор заботится о том, что вы называете своими временными переменными, или вы используете список или массив для внутреннего типа данных? Предполагая, что она доверяет своим разработчикам, она не должна, как и проектная спецификация. Это вводит второй уровень неопределенности: уровень реализации.
В общем, эти подробности уровня реализации не фиксируются в формальном документе, а скорее документируются, как таковые , в самом коде, включая комментарии. Этот уровень неоднозначности позволяет хорошему разработчику использовать его или ее собственные навыки и принимать подробные технические решения, которые являются отличительной чертой хорошего индивидуального разработчика. Поэтому я без колебаний скажу, что неоднозначность в спецификации, на самом деле, хорошая вещь: она позволяет разработчикам выполнять свою работу и возвышает их над простыми «обезьянами кода».
Однако это не означает, что во всем документе должна быть неоднозначность. На высоком уровне не должно быть никакой двусмысленности относительно интерфейса с клиентом. Если у функции есть открытый API, он должен быть строго определен. Если система требует, чтобы дата была передана для выполнения своей работы, должна ли эта дата быть в местном часовом поясе или в UTC? Какой формат нужен? Должен ли он быть с точностью до миллисекунды, или минута просто отлично?
Возвращаясь к вопросу о том, может ли естественный язык использоваться для создания однозначных спецификаций, это правда, что он не очень хорош в достижении этого уровня ясности. Я видел это в определенных ограниченных обстоятельствах, но это, вероятно, уникальные исключения, которые мы не можем применять повсеместно. Чаще всего неопределенность разрешается с помощью технического жаргона, диаграмм или даже псевдокода. Как только вы начинаете привлекать помощь таких инструментов, естественный язык перестает быть единственным дескриптором. Поскольку эти инструменты могут сделать даже полностью функционально однозначную спецификацию намного более понятной, я бы рискнул сказать, что такое начинание даже не следует предпринимать.
Сказав это, поскольку естественный язык обычно дополняется этими инструментами, что делает его функционально однозначным, я считаю, что нет, одного естественного языка недостаточно для создания однозначных спецификаций во всех случаях.