(Деякі мої моменти вже наголошувались на інших відповідях, але я відчуваю, що надаю досить різну перспективу, щоб зробити це вартістю відповіді, а не коментаря.)
Перш ніж ми вирішимо питання про те, чи може специфікація бути справді і абсолютно однозначною, ми повинні вирішити питання про те, чи повинна вона бути однозначною, принаймні на рівні, про який ви питаєте.
Дозвольте мені підійти до цього з точки зору керівника програми, який працює над проектом малого та середнього розміру, або до функції, що є частиною більшого проекту. Зазвичай для такого проекту будуть записані два різних специфікації: функціональна специфікація (або PM) та специфікація Design (або Dev):
- Функціональна специфікація має завдання описувати, що повинен робити проект чи функція, часто з погляду замовника. Загалом не слід описувати, як це слід робити. Залежно від типу проекту, замовник може піклуватися про те, як виглядає зовнішній інтерфейс API, але чи переймається клієнт, клас A успадковується від класу B чи реалізує інтерфейс C? Він не повинен. І також не повинно функціонувати специфікація. Це вже вводить один рівень неоднозначності: технічний дизайн.
- У специфікації дизайну є завдання описати, як повинні відповідати функціональні вимоги, з точки зору архітектора чи технічного дизайнера функції чи проекту. Він призначений для вирішення двозначних неясностей технічного проектування. Це буде містити ті деталі, які ви не хотіли в специфікаціях, таких як архітектура рішення, включаючи структуру класів, успадкування, можливо, навіть окремі функції та методи, залежно від обсягу та масштабу проекту. Чи цікавить архітектор те, як ви називаєте ваші тимчасові змінні, чи використовуєте ви список або масив для внутрішнього типу даних? Якщо припустити, що вона довіряє своїм розробникам, вона не повинна, а також не повинна бути вказана специфікація дизайну. Це вносить другий рівень неоднозначності: рівень реалізації.
В цілому, ці реалізації на рівні деталі не враховуються в якості офіційного документа, а задокументовані, сам по собі , в коді себе, в тому числі коментарі. Цей рівень неоднозначності дозволяє хорошому розробнику використовувати власні навички та приймати детально орієнтовані технічні рішення, які є ознакою хорошого індивідуального розробника. Через це я не соромлюсь сказати, що неоднозначність у специфікації насправді є хорошою справою: вона дозволяє розробникам виконувати свою роботу і піднімає їх над просто "кодовими мавпами".
Однак це не означає, що у всьому документі має бути неоднозначність. На високому рівні не повинно бути двозначностей щодо інтерфейсу із замовником. Якщо функція має відкритий для API інтерфейс, її слід чітко визначити. Якщо системі потрібна дата для введення дати, щоб виконати її роботу, чи повинна ця дата знаходитися в локальному часовому поясі чи UTC? Який формат потрібен? Чи потрібно бути точним до мілісекунди, або хвилина просто чудова?
Повертаючись до питання про те, чи можна використовувати природну мову для створення однозначних специфікацій, це правда, що не дуже добре вловлювати цей рівень ясності. Я бачив це в деяких обмежених обставинах, але це, мабуть, унікальні винятки, які ми не можемо застосовувати універсально. Найчастіше двозначність вирішується за допомогою технічного жаргону, діаграм чи навіть псевдокоду. Як тільки ви почнете звертатися за допомогою до таких інструментів, природна мова перестає бути єдиним дескриптором. Оскільки ці інструменти можуть зробити більш зрозумілою навіть функціонально однозначну специфікацію, я б ризикну сказати, що такого зобов'язання навіть не слід робити.
Сказавши це, оскільки природні мови, як правило, доповнюються цими інструментами, щоб зробити його функціонально однозначним, я вважаю, що ні, природна мова є недостатньою для створення однозначних специфікацій у всіх випадках.