¿Puedes escribir una especificación inequívoca en un idioma natural como el inglés?


10

Me parece que no es posible escribir una especificación de software en inglés que esté completamente libre de ambigüedades, simplemente debido a la naturaleza informal del lenguaje natural, y por lo tanto, una especificación verdaderamente inequívoca debe incluir código escrito en un lenguaje formalmente especificado.

¿Es este un resultado conocido o me falta algo?


1
"código escrito en un lenguaje formalmente especificado". Eso sería matemática y lógica, ¿verdad? ¿No es eso para lo que son las matemáticas y la lógica? Parece extraño preguntar, ya que estos idiomas siempre han existido con el expreso propósito de no ser ambiguos. ¿Por qué preguntar?
S.Lott

@ S.Lott: los usuarios quieren especificaciones en su propio idioma, no en matemáticas o lógica formal. Es nuestro trabajo traducir entre los dos dominios.
tdammers

2
Su código puede ser inequívoco, pero eso no significa que sea correcto.
JeffO

1
@tdammers: ¿Qué? La pregunta era sobre lenguaje natural versus lenguaje formal. ¿Qué tienen que ver los usuarios con esto? Además, ¿qué pasa si el usuario es realmente un lógico? Además, ¿los "analistas de negocios" no suelen escribir en nombre de los usuarios? Lo del "usuario" parece engañoso y está fuera de esta cuestión.
S.Lott

@ S.Lott: Estaba asumiendo una situación en la que tiene que describir el software a un cliente / usuario / otra parte interesada no técnica, que sería la mejor razón para querer utilizar un lenguaje natural en primer lugar.
tdammers

Respuestas:


9

¿No es esto lo que siempre hicieron los abogados para evitar ambigüedades?

El resultado es que escriben de la manera más antinatural, tratar de leer sus documentos es más difícil que nunca y, a pesar de esto, siempre hay inconsistencias y ambigüedades.

Tiene razón, no puede escribir una especificación de software que esté completamente libre de ambigüedades, pero tampoco podrá hacerlo implementando un lenguaje formal específico.

Esta es también la razón por la que documentamos nuestro código, porque a veces es difícil de leer para nuestras mentes.

No tiene sentido documentar el código con otro código.


2
A algunos abogados les gusta ofuscar y ocultar cosas. Depende de tu objetivo.
duffymo

1
Estás confundiendo abogados con matemáticos.
Doc Brown

1
@ Doc: Math es solo otro código, porque solo los matemáticos pueden leerlo, y no tiene sentido documentar código con código, eso es criptografía.
Jose Faeti

2
@Jose: Diría que estás simplificando demasiado. El 99% de todas las pruebas matemáticas están escritas en lenguaje natural, por supuesto, un lenguaje técnico con términos especiales y más o menos haciendo uso de fórmulas, pero seguramente no hay un "lenguaje formalmente especificado".
Doc Brown el

@ Doc: eso es lo que digo ... documentos escritos en lenguaje natural. No tiene sentido explicar un código con otro código.
Jose Faeti

4

¿Imposible? Preguntemos si es deseable primero. Si estamos de acuerdo en que es imposible, y todavía hay muchos softwares útiles, el objetivo de una especificación inequívoca parece académico.

Yo diría que es imposible demostrar que algo es perfecto e inequívoco, tanto para las especificaciones como para el software.

Creo que depende del tamaño del problema. Si el problema es lo suficientemente pequeño, de naturaleza matemática, y quizás algunos otros criterios que me faltan, diría que es posible escribir una especificación que sea viable.

Cuanto mayor es el problema, más amplio es el público, más difícil es hacerlo.

Pero la aviónica y otros problemas complejos sugieren que es posible escribir especificaciones "suficientemente buenas" en inglés para resolver grandes problemas.


2
"lo suficientemente bueno es lo suficientemente bueno, pero la perfección es una PITA": solía trabajar en la construcción de controles de entorno, y no existe una especificación completamente inequívoca, incluso cuando corren a 400 páginas, a veces no importaba , y por las veces que tuvimos
RFIs

4

bueno ... una especificación completamente inequívoca del problema es el código en sí :)

Este es un problema conocido y para sistemas especiales de misión crítica es obligatorio escribir una especificación inequívoca en un lenguaje formal (de programación) y luego transformarlo en un código que probablemente haga lo que dice la especificación. Este es un campo muy estrecho, el 99.999% de los desarrolladores nunca tiene que hacer tareas como esta, pero una vez hablé con un tipo que hizo esto para un sistema de control de tráfico / ferrocarril.


3

Soy un seguidor del W3C y tiendo a escribir artículos según sus especificaciones. Mi experiencia me dice que leer cualquier especificación sin códigos de ejemplo escritos es simplemente un dolor de cabeza.

Estoy completamente de acuerdo y creo que la razón principal es que los desarrolladores tienden a leer y comprender mejor el código. Solo imagina que obtienes un trabajo matemático sin ninguna fórmula.

To calculate the result, simply add variable x to variable y, 
and then divide that by the b factor.

o:

result = (x + y) / b

¿Cuál es más corto? ¿Cuál es más legible? ¿Qué trae más comprensión con eso?

Lo mismo es cierto sobre las especificaciones. Muchas veces, cuando llega a las partes técnicas, escribir una línea de código puede aclarar un extenso párrafo de explicación.


E incluso entonces, preguntaré cuáles son los dominios de (x + y) y (x + y) / b. ¿Son dobles? ¿Son enteros? ¿Son enteros de longitud infinita? Espero que, si son números enteros, escribiste las reglas sobre el redondeo :-)
xanatos

1

Suponga que hay un lenguaje formal que permite escribir especificaciones inequívocas. Luego propongo que debería haber un mapeo biyectivo a un subconjunto de inglés. Por lo tanto, debería ser posible escribir especificaciones inequívocas si se adhiere a este subconjunto.

Pero cualquier lenguaje formal que sea lo suficientemente expresivo como para hacer algo interesante no estará exento de inconsistencias (incompleto de Gödel).


Estoy seguro de que el razonamiento es ambiguo, ya que está en inglés simple. ¿Podrías escribirlo en un lenguaje formal?
blubb


Y luego está el problema de detención, que se traduce en ambigüedad: N es mayor que N por 1 no define N
mojuba

1
-1 por equivocar el teorema de Gödels.
Ingo

1

Las especificaciones son ambiguas e imprecisas porque las personas son ambiguas e imprecisas. Encuentre una persona perfecta y tal vez pueda obtener una especificación perfecta.

Inglés, swahili, sánscrito o babilónico no hace ninguna diferencia.


1

La ambigüedad es en realidad una fortaleza en este contexto.

Para explicar por qué, supongamos por un momento que es posible usar el idioma inglés de una manera completamente inequívoca, de modo que cualquier problema que pueda resolverse mediante programación pueda expresarse de manera completa e inequívoca. Si usamos esta variante del inglés, y nuestra descripción describe el programa para que se escriba completamente y sin ambigüedades, entonces lógicamente se deduce que debe ser posible realizar una traducción automática al lenguaje de programación de destino, en otras palabras, la variante de El inglés que hemos concebido es en realidad un lenguaje de programación en sí mismo.

Las personas que leen documentos de diseño (especialmente diseños funcionales) en realidad no quieren este nivel de detalle: leer la fuente de un programa, ya sea en C ++, Java o inglés inequívoco, está muy por encima de la cabeza del no programador promedio. Aquí es donde entran los lenguajes naturales: permiten que el escritor de una especificación se deslice de cualquier manera en la escala de detalles, moviendo detalles de implementación irrelevantes al subtexto o dejándolos sin especificar por completo. Los lenguajes naturales están llenos de dispositivos para transmitir el significado con relativa claridad a pesar de que no proporciona una definición exacta (que es parte de lo que hace que las traducciones automáticas sean tan difíciles).

Por lo tanto, el objetivo generalmente no es una especificación completa, correcta e inequívoca; El objetivo es escribir una especificación que ilustre claramente, para los humanos, lo que está a punto de construir.

Cada vez que se necesita información correcta e inequívoca, y las cosas se están volviendo técnicas de todos modos, el pseudocódigo suele ser más valioso que los lenguajes naturales o los formales rígidos; aún puede omitir detalles irrelevantes (al llamar funciones / procesos no especificados), pero la estructura no es ambigua .


0

No le falta nada, excepto que la documentación está escrita para que los humanos la lean. Se espera cierta ambigüedad, e incluso bienvenida, porque el texto conciso es difícil de leer (= no para humanos).

Especificar la documentación para un idioma formal en otro idioma formal sería una especie de problema de gallina y huevo.

Si realmente necesita una especificación formal, existen formas formales de verificar los modelos . Es un área de investigación activa y muy interesante, pero los "usuarios" finales aquí son máquinas, no humanos.


0

(Algunos de mis puntos ya han sido mencionados por otras respuestas, pero siento que estoy proporcionando una perspectiva lo suficientemente diferente como para que valga la pena una respuesta en lugar de un comentario).

Antes de abordar la cuestión de si una especificación puede ser verdadera y completamente inequívoca, debemos abordar la cuestión de si debe ser inequívoca, al menos al nivel que está preguntando.

Permítanme abordar esto desde la perspectiva de un gerente de programa que trabaja en un proyecto de tamaño pequeño a mediano, o una característica como parte de un proyecto más grande. Por lo general, se escribirán dos tipos diferentes de especificaciones para dicho proyecto: una especificación funcional (o PM) y una especificación de diseño (o desarrollo):

  • La especificación funcional tiene el trabajo de describir lo que debe hacer el proyecto o la característica, a menudo desde la perspectiva del cliente. En general, no debe describir cómo se debe hacer esto. Dependiendo del tipo de proyecto, al cliente puede importarle el aspecto de la API externa, pero ¿le importa si la clase A hereda de la clase B o implementa la interfaz C? No debería. Y tampoco debería la especificación funcional. Esto ya introduce un nivel de ambigüedad: el del diseño técnico.
  • La especificación de diseño tiene el trabajo de describir cómo se deben cumplir los requisitos funcionales, desde la perspectiva del arquitecto o diseñador técnico de la característica o proyecto. Su objetivo es resolver las ambigüedades de alto nivel del diseño técnico. Esto contendrá los detalles que no deseaba en la especificación funcional, como la arquitectura de la solución, incluida la estructura de clases, la herencia, tal vez incluso las funciones y métodos individuales, según el alcance y la escala del proyecto. ¿Le importa al arquitecto lo que llamas variables temporales o si usas una lista o una matriz para un tipo de datos interno? Suponiendo que confíe en sus desarrolladores, no debería, y tampoco debería hacerlo la especificación de diseño. Esto introduce un segundo nivel de ambigüedad: el de implementación.

En general, estos detalles a nivel de implementación no se capturan en un documento formal, sino que se documentan, per se , en el propio código, incluidos los comentarios. Este nivel de ambigüedad permite a un buen desarrollador utilizar sus propias habilidades y tomar decisiones técnicas orientadas a los detalles que son el sello distintivo de un buen desarrollador individual. Debido a esto, no dudaré en decir que la ambigüedad en una especificación es, de hecho, una buena cosa: permite a los desarrolladores hacer su trabajo y los eleva por encima de simples "monos de código".

Sin embargo, esto no quiere decir que debe haber ambigüedad en todo el documento. En el nivel superior, no debe haber ambigüedad sobre la interfaz con el cliente. Si la función tiene una API pública, debe estar estrictamente definida. Si el sistema requiere que se pase una fecha para realizar su trabajo, ¿debería estar en la zona horaria local o UTC? ¿Qué formato se necesita? ¿Tiene que ser preciso al milisegundo, o el minuto está bien?

Volviendo a la pregunta de si el lenguaje natural se puede usar para crear especificaciones inequívocas, es cierto que no es muy bueno para capturar este nivel de claridad. Lo he visto hecho en ciertas circunstancias limitadas, pero esas son probablemente excepciones únicas que no podemos aplicar universalmente. Muy a menudo, la ambigüedad se resuelve con la ayuda de jerga técnica, diagramas o incluso pseudocódigo. Una vez que comienza a solicitar la ayuda de tales herramientas, el lenguaje natural deja de ser el único descriptor. Debido a que estas herramientas pueden hacer que incluso una especificación completamente funcionalmente inequívoca sea mucho más clara, me aventuraría a decir que tal empresa ni siquiera debería intentarse.

Dicho esto, dado que el lenguaje natural generalmente se complementa con estas herramientas para que sea funcionalmente inequívoco, es mi opinión profesional que no, el lenguaje natural por sí solo no es suficiente para crear especificaciones inequívocas en todos los casos.


0

Uno puede hacer que el lenguaje natural sea relativamente inequívoco, pero solo con gran dificultad.

La profesión jurídica necesita desesperadamente que el lenguaje sea lo más inequívoco posible. Si bien mucho sobre cómo se aplica una ley puede estar abierto a interpretación, lo que significan las palabras no debería serlo.

Esta necesidad lleva a la invención de la jerga legal. ¿Hasta dónde estás dispuesto a llegar?


0

Existen varias especificaciones del grupo abierto, ISO, IETF e ITU que son lo suficientemente inequívocas para que las compañías altamente competitivas interoperen con bastante éxito. Hay una serie de especificaciones que son la base de contratos o leyes en las que están en juego millones de dólares.

Por lo tanto, las especificaciones pueden no ser "perfectas". Sin embargo, eso se debe a que los humanos no son perfectos. Por ejemplo, no es ambiguo que HTTP use un encabezado "Referer"; la ortografía correcta es, de hecho, "Referidor".

El idioma inglés es capaz de ser inequívoco, pero los humanos son capaces de cometer errores, incluida la ambigüedad.

Además, puede ser útil ser deliberadamente ambiguo para los detalles que no se han finalizado o que pueden necesitar actualizarse en el futuro. Por ejemplo, una especificación puede especificar un "hash" en lugar de especificar específicamente md5, sha1, crc32, etc.


0

Creo que la respuesta correcta es negativa. Es necesario distinguir las siguientes preguntas:

  1. ¿Es posible escribir una especificación de software en un lenguaje natural que no contenga ambigüedades?
  2. ¿Es posible escribir software en un lenguaje natural que no contenga ambigüedades?

La diferencia entre la primera y la segunda pregunta se refiere al nivel de detalle involucrado, la cantidad de interpretación requerida y las reglas impuestas en la construcción de oraciones en el lenguaje natural con el propósito de escribir el software o la especificación del software.

La respuesta a la segunda pregunta es afirmativa. Dado un subconjunto adecuadamente restringido de un lenguaje natural con reglas acordadas para la construcción y el significado de oraciones, el código se puede escribir en oraciones gramaticales en inglés. Por ejemplo, el siguiente lenguaje sin ambigüedad permite escribir declaraciones de asignación:

Variables: x,y,z,...
Constants: 1,2,3,...
Rules: (1) if x is a variable and n a constant, then
           "The variable x contains the number n" is a sentence.
       (2) if x is a variable and n a constant, then
           "Assign the number n to the variable x" is a sentence.

Es decir, podemos traducir sistemáticamente el código escrito en lenguajes de programación formales a lenguajes naturales describiendo cada procedimiento. Por otro lado, una especificación de software a menudo requiere interpretación. Por lo tanto, si una especificación de software se puede dar sin ambigüedades depende del nivel de detalle involucrado en la especificación. Sin embargo, dado un dominio seleccionado sobre el que varía la especificación, con operaciones particulares en este dominio seleccionado, se puede llevar a cabo un proceso de traducción similar. Por ejemplo:

Over the domain D supporting operations f,g,h over elements a,b,c in relations
P,R,Q with properties φ,ψ,θ, design a program that does X,Y,Z.

Cuando los estados X, Y, Zsólo figuran los elementos mencionados en el prefacio de la especificación y se escriben en una forma adecuada formal y acordadas subconjunto de un lenguaje natural. Las ambigüedades se referirán a cómo implementar la especificación, pero esto será de esperar.


0

No

Una especificación inequívoca de un cálculo es un programa de computadora.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.