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?
Respuestas:
¿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.
fuente
¿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.
fuente
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.
fuente
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.
o:
¿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.
fuente
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).
fuente
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.
fuente
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 .
fuente
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.
fuente
(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):
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.
fuente
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?
fuente
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.
fuente
Creo que la respuesta correcta es negativa. Es necesario distinguir las siguientes preguntas:
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:
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:
Cuando los estados
X
,Y
,Z
só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.fuente
No
Una especificación inequívoca de un cálculo es un programa de computadora.
fuente