Czy potrafisz napisać jednoznaczną specyfikację w języku naturalnym, takim jak angielski?

10

Wydaje mi się, że nie można napisać specyfikacji oprogramowania w języku angielskim, która jest całkowicie wolna od dwuznaczności, po prostu ze względu na nieformalny charakter języka naturalnego - i dlatego naprawdę jednoznaczna specyfikacja musi zawierać kod napisany w języku określonym formalnie.

Czy to znany wynik, czy coś mi umknęło?

jl6
źródło
1
„kod napisany w języku określonym formalnie”. To byłaby matematyka i logika, prawda? Czy nie po to jest matematyka i logika? Pytanie wydaje się dziwne, ponieważ języki te zawsze istniały w wyraźnym celu bycia jednoznacznym. Po co pytać?
S.Lott,
@ S.Lott: Użytkownicy chcą specyfikacji w swoim własnym języku, a nie matematyki ani logiki formalnej. Naszym zadaniem jest tłumaczenie między dwiema domenami.
tdammers
2
Twój kod może być jednoznaczny, ale to nie znaczy, że jest poprawny.
JeffO,
1
@tdammers: Co? Pytanie dotyczyło języka naturalnego a języka formalnego. Co użytkownicy mają z tym wspólnego? Co więcej, jeśli użytkownik faktycznie jest logikiem? Ponadto, czy „analitycy biznesowi” zwykle nie piszą w imieniu użytkowników? Sprawa „użytkownika” wydaje się podstępna i poza tym pytaniem.
S.Lott,
@ S.Lott: Zakładałem, że musisz opisać oprogramowanie klientowi / użytkownikowi / innemu nietechnicznemu interesariuszowi, co byłoby najlepszym powodem, dla którego chciałbym używać języka naturalnego.
tdammers

Odpowiedzi:

9

Czy to nie zawsze robili prawnicy, aby uniknąć dwuznaczności?

W rezultacie piszą w najbardziej nienaturalny sposób, próby odczytania swoich prac są trudniejsze niż kiedykolwiek, a mimo to zawsze występują niespójności i dwuznaczności.

Masz rację, nie możesz napisać specyfikacji oprogramowania całkowicie wolnej od dwuznaczności, ale nie poradzisz sobie również z implementacją określonego języka formalnego.

Dlatego też dokumentujemy nasz kod, ponieważ czasami trudno jest go odczytać dla naszych umysłów.

Nie ma sensu dokumentować kodu za pomocą innego kodu.

Jose Faeti
źródło
2
Niektórzy prawnicy lubią zaciemniać i zaciemniać rzeczy. Zależy od twojego celu.
duffymo
1
Mylisz prawników z matematykami.
Doc Brown,
1
@Doc: Matematyka jest tylko kolejnym kodem, ponieważ tylko matematycy mogą go odczytać i nie ma sensu dokumentować kodu za pomocą kodu, to jest kryptografia.
Jose Faeti
2
@Jose: Powiedziałbym, że bardzo upraszczasz. 99% wszystkich dowodów matematycznych jest napisanych w języku naturalnym - oczywiście w języku technicznym ze specjalnymi terminami i mniej więcej przy użyciu formuł, ale na pewno nie „formalnie określonym języku”.
Doc Brown,
@Doc: tak mówię ... dokumenty napisane w języku naturalnym. Brak sensu wyjaśniania kodu innym kodem.
Jose Faeti
4

Niemożliwy? Zapytajmy najpierw, czy jest to pożądane. Jeśli zgodzimy się, że jest to niemożliwe, a wciąż istnieje wiele przydatnych programów, cel jednoznacznej specyfikacji wydaje się akademicki.

Powiedziałbym, że nie da się udowodnić, że wszystko jest idealne i jednoznaczne, zarówno pod względem specyfikacji, jak i oprogramowania.

Myślę, że to zależy od wielkości problemu. Jeśli problem jest wystarczająco mały, z natury matematyczny, a może jakieś inne kryteria, których mi brakuje, powiedziałbym, że można napisać specyfikację, która będzie wykonalna.

Im większy problem, tym szersza publiczność, tym trudniej to zrobić.

Ale awionika i inne złożone problemy sugerują, że można napisać „wystarczająco dobrą” specyfikację w języku angielskim, aby rozwiązać duże problemy.

duffymo
źródło
2
„wystarczająco dobry jest wystarczająco dobry, ale perfekcja jest PITA” - Kiedyś pracowałem w budowaniu kontrolek środowiska i nie ma czegoś takiego jak całkowicie jednoznaczna specyfikacja, nawet jeśli mają do 400 stron - czasem to nie miało znaczenia , a na czasy, w których tak było, mieliśmy RFI
HorusKol,
4

no cóż… całkowicie jednoznaczną specyfikacją problemu jest sam kod :)

Jest to znany problem i w przypadku specjalnych systemów o krytycznym znaczeniu konieczne jest napisanie jednoznacznej specyfikacji w języku formalnym (programistycznym), a następnie przekształcenie jej w kod, który da się udowodnić zgodnie ze specyfikacją. To bardzo wąska dziedzina, 99,999% programistów nigdy nie musi wykonywać takich zadań, ale kiedyś rozmawiałem z facetem, który zrobił to dla systemu kontroli ruchu / kolei.

Karoly Horvath
źródło
3

Jestem obserwatorem W3C i zazwyczaj piszę artykuły na podstawie ich specyfikacji. Z mojego doświadczenia wynika, że czytanie dowolnej specyfikacji bez zapisanych przykładowych kodów to po prostu ból głowy.

Całkowicie się zgadzam i myślę, że głównym powodem jest to, że programiści lepiej czytają i rozumieją kod. Wyobraź sobie, że masz matematyczny papier bez żadnej formuły.

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

lub:

result = (x + y) / b

Który jest krótszy? Który jest bardziej czytelny? Co daje więcej zrozumienia?

To samo dotyczy specyfikacji. Wiele razy, gdy dochodzisz do części technicznych, napisanie jednego wiersza kodu może wyjaśnić długi akapit wyjaśnienia.

Saeed Neamati
źródło
I nawet wtedy zapytam, jakie są domeny (x + y) i (x + y) / b. Czy są podwójne? Czy to są liczby całkowite? Czy są to liczby całkowite o nieskończonej długości? Mam nadzieję, że jeśli są liczbami całkowitymi, napisałeś zasady dotyczące zaokrąglania :-)
xanatos
1

Załóżmy, że istnieje język formalny, który pozwala pisać jednoznaczne specyfikacje. Następnie proponuję, aby istniało bijective mapping na podzbiór języka angielskiego. Dlatego, jeśli będziesz trzymać się tego podzbioru, powinno być możliwe napisanie jednoznacznych specyfikacji.

Ale każdy język formalny, który jest wystarczająco wyrazisty, aby zrobić coś interesującego, nie będzie wolny od niekonsekwencji (niekompletność Gödela).


źródło
Jestem pewien, że rozumowanie jest dwuznaczne, ponieważ jest w prostym języku angielskim. Czy możesz napisać to w języku formalnym?
blubb
1
Wierzę, że to jest twoje założenie: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.1151
Thomas Owens
A potem pojawia się problem zatrzymania, który przekłada się na dwuznaczność: N jest większe niż N o 1 nie definiuje N
mojuba
1
-1 za błędne twierdzenie Gödla.
Ingo
1

Specyfikacje są niejednoznaczne i nieprecyzyjne, ponieważ ludzie są dwuznaczni i nieprecyzyjni. Znajdź idealną osobę, a być może wtedy uzyskasz idealną specyfikację.

Angielski, suahili, sanskryt lub babiloński nie ma znaczenia.

Dave Nay
źródło
1

W tym kontekście dwuznaczność jest siłą.

Aby wyjaśnić, dlaczego, załóżmy przez chwilę, że to jest możliwe, aby używać języka angielskiego w sposób całkowicie jednoznaczny sposób, tak, że każdy problem można rozwiązać programowo mogą być wyrażone całkowicie i jednoznacznie. Jeśli użyjemy tego wariantu angielskiego, a nasz opis rzeczywiście opisuje program, który ma być napisany całkowicie i jednoznacznie, logicznie wynika, że ​​musi być możliwe automatyczne tłumaczenie na docelowy język programowania - innymi słowy, wariant Angielski, który opracowaliśmy, jest w rzeczywistości samym językiem programowania.

Ludzie, którzy czytają dokumenty projektowe (zwłaszcza projekty funkcjonalne), tak naprawdę nie chcą tego poziomu szczegółowości - czytanie źródła programu, czy to w C ++, Java, czy w jednoznacznym angielskim, jest znacznie powyżej głowy przeciętnego nieprogramisty. Tu pojawiają się języki naturalne: pozwalają autorowi specyfikacji przesuwać się w dowolną stronę na skali szczegółów, przenosząc nieistotne szczegóły implementacji do podtekstu lub pozostawiając je nieokreślone całkowicie. Języki naturalne są pełne urządzeń do przekazywania znaczenia stosunkowo wyraźnie, nawet jeśli nie podajesz dokładnej definicji (co jest częścią tego, co sprawia, że ​​automatyczne tłumaczenia są tak trudne).

Tak więc celem nie jest zazwyczaj pełna, poprawna i jednoznaczna specyfikacja; celem jest napisanie specyfikacji, która jasno ilustruje ludziom, co zamierzasz zbudować.

Ilekroć potrzebujesz poprawnych i jednoznacznych danych, a mimo to wszystko staje się techniczne, pseudokod jest często bardziej wartościowy niż języki naturalne lub sztywne formalne - wciąż może pomijać nieistotne szczegóły (wywołując nieokreślone funkcje / procesy), ale struktura jest jednoznaczna .

tdammers
źródło
0

Nic ci nie brakuje, z wyjątkiem tego, że dokumentacja jest napisana do czytania przez ludzi. Pewna dwuznaczność jest oczekiwana, a nawet mile widziana, ponieważ zwięzły tekst jest trudny do odczytania (= nie dla ludzi).

Określenie dokumentacji dla języka formalnego w jeszcze innym języku formalnym byłoby rodzajem problemu z kurczakiem i jajkiem.

Jeśli naprawdę potrzebujesz formalnej specyfikacji, istnieją formalne sposoby sprawdzania modeli . Jest to aktywny i bardzo interesujący obszar badań, ale końcowi „użytkownicy” tutaj to maszyny, a nie ludzie.

Radim
źródło
0

(Niektóre z moich uwag zostały już wspomniane w innych odpowiedziach, ale czuję, że zapewniam wystarczająco inną perspektywę, aby uczynić tę wartość bardziej wartą odpowiedzi niż komentarza.)

Zanim zajmiemy się kwestią, czy specyfikacja może być naprawdę i całkowicie jednoznaczna, musimy odpowiedzieć na pytanie, czy powinna być jednoznaczna, przynajmniej na poziomie, o który pytasz.

Podejdę do tego z perspektywy menedżera programu pracującego nad małym lub średnim projektem lub funkcji w ramach większego projektu. Zazwyczaj istnieją dwa różne typy specyfikacji, które zostaną napisane dla takiego projektu: specyfikacja funkcjonalna (lub PM) i specyfikacja projektowa (lub Dev):

  • Specyfikacja funkcjonalna ma za zadanie opisanie, co powinna zrobić projekcja lub funkcja, często z perspektywy klienta. Zasadniczo nie powinien opisywać, jak należy to zrobić. W zależności od rodzaju projektu klientowi może zależeć, jak wygląda zewnętrzny interfejs API, ale czy klientowi zależy, czy klasa A dziedziczy po klasie B, czy implementuje interfejs C? Nie powinien. I specyfikacja funkcjonalna również nie powinna. To już wprowadza jeden poziom dwuznaczności: poziom techniczny.
  • Specyfikacja projektu ma na celu opisanie, w jaki sposób należy spełnić wymagania funkcjonalne, z perspektywy architekta lub projektanta technicznego elementu lub projektu. Ma on na celu rozwiązanie dwuznaczności projektu technicznego na wysokim poziomie. Będzie zawierał te szczegóły, których nie chciałeś w specyfikacji funkcjonalnej, takie jak architektura rozwiązania, w tym struktura klas, dziedziczenie, być może nawet poszczególne funkcje i metody, w zależności od zakresu i skali projektu. Czy architekt dba o to, co nazywamy zmiennymi tymczasowymi, czy też używasz listy lub tablicy dla wewnętrznego typu danych? Zakładając, że ufa programistom, nie powinna, podobnie jak specyfikacja projektu. Wprowadza to drugi poziom niejednoznaczności: poziom implementacji.

Zasadniczo te szczegóły na poziomie implementacji nie są ujmowane w formalnym dokumencie, ale same w sobie dokumentowane w samym kodzie, w tym w komentarzach. Ten poziom niejednoznaczności pozwala dobremu programistowi na wykorzystanie własnych umiejętności i podejmowanie szczegółowych decyzji technicznych, które są znakiem rozpoznawczym dobrego indywidualnego programisty. Z tego powodu nie zawaham się powiedzieć, że dwuznaczność w specyfikacji jest w rzeczywistości dobrą rzeczą: pozwala programistom wykonywać swoje zadania i podnosi ich ponad zwykłe „małpy kodowe”.

Nie oznacza to jednak, że cały dokument powinien być niejednoznaczny. Na wysokim poziomie nie powinno być wątpliwości co do interfejsu z klientem. Jeśli funkcja ma publiczny interfejs API, należy ją ściśle zdefiniować. Jeśli system wymaga podania daty, aby wykonać swoje zadanie, to czy data ta powinna być w lokalnej strefie czasowej czy w UTC? Jaki format jest potrzebny? Czy musi być dokładny do milisekundy, czy minuta jest w porządku?

Wracając do pytania, czy można użyć języka naturalnego do stworzenia jednoznacznych specyfikacji, to prawda, że ​​nie jest on zbyt dobry w uchwyceniu tego poziomu jasności. Widziałem to w pewnych ograniczonych okolicznościach, ale są to prawdopodobnie wyjątkowe wyjątki, których nie możemy zastosować uniwersalnie. Najczęściej niejasności rozwiązuje się za pomocą technicznego żargonu, diagramów, a nawet pseudokodu. Gdy zaczniesz korzystać z pomocy takich narzędzi, język naturalny przestaje być jedynym deskryptorem. Ponieważ narzędzia te mogą uczynić nawet całkowicie funkcjonalnie jednoznaczną specyfikację o wiele bardziej wyraźną, zaryzykowałbym stwierdzenie, że nie należy nawet podejmować takiego przedsięwzięcia.

To powiedziawszy, ponieważ język naturalny jest ogólnie uzupełniany przez te narzędzia, aby uczynić go jednoznacznym funkcjonalnie, moim profesjonalnym zdaniem jest to, że żaden język naturalny nie jest wystarczający do stworzenia jednoznacznych specyfikacji we wszystkich przypadkach.

Greg Jackson
źródło
0

Język naturalny można uczynić stosunkowo jednoznacznym, ale tylko z wielkim trudem.

Zawód prawnika bardzo desperacko potrzebuje języka, aby był jak najbardziej jednoznaczny. Chociaż wiele na temat tego, jak prawo jest stosowane, może podlegać interpretacji, to co oznaczają te słowa, nie powinno.

Potrzeba ta doprowadziła do wynalezienia legalese. Jak daleko chcesz się posunąć?

Waquo
źródło
0

Istnieje wiele specyfikacji otwartej grupy, ISO, IETF i ITU, które są wystarczająco jednoznaczne, aby wysoce konkurencyjne firmy mogły dość skutecznie współpracować. Istnieje wiele specyfikacji, które stanowią podstawę umów lub przepisów, w których zagrożone są miliony dolarów.

Dlatego specyfikacje mogą nie być „idealne”. Jest tak, ponieważ ludzie nie są doskonali. Na przykład jednoznaczne jest, że HTTP powinien używać nagłówka „Odsyłacz” - poprawna pisownia to tak naprawdę „Odsyłacz”.

Język angielski może być jednoznaczny, ale ludzie mogą popełniać błędy - w tym dwuznaczne.

Ponadto pomocne może być celowo dwuznaczne podejście do szczegółów, które nie zostały sfinalizowane lub mogą wymagać aktualizacji w przyszłości. Na przykład specyfikacja może określać „skrót”, a nie konkretnie md5, sha1, crc32 itp.

teambob
źródło
0

Uważam, że poprawna odpowiedź jest przecząca. Konieczne jest rozróżnienie następujących pytań:

  1. Czy można napisać specyfikację oprogramowania w języku naturalnym, który nie zawiera dwuznaczności?
  2. Czy można pisać oprogramowanie w języku naturalnym, który nie zawiera dwuznaczności?

Różnica między pierwszym i drugim pytaniem dotyczy poziomu szczegółowości, wymaganej ilości tłumaczeń ustnych oraz zasad nałożonych na konstrukcję zdań w języku naturalnym do celów pisania oprogramowania lub specyfikacji oprogramowania.

Odpowiedź na drugie pytanie jest twierdząca. Biorąc pod uwagę odpowiednio ograniczony podzbiór języka naturalnego z uzgodnionymi regułami budowy i znaczenia zdań, kod można pisać gramatycznymi zdaniami angielskimi. Na przykład następujący język jednoznacznie zezwala na pisanie instrukcji przypisania:

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.

Oznacza to, że możemy systematycznie tłumaczyć kod napisany w językach programowania formalnego na języki naturalne, opisując każdą procedurę. Z drugiej strony specyfikacja oprogramowania często wymaga interpretacji. Zatem to, czy specyfikację oprogramowania można podać jednoznacznie, zależy od poziomu szczegółowości zaangażowanego w specyfikację. Jednak biorąc pod uwagę wybraną domenę, w której zakres specyfikacji, z wybranymi konkretnymi operacjami w tej domenie, można przeprowadzić podobny proces tłumaczenia. Na przykład:

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.

gdzie wypowiedzi X, Y, Zzawierają tylko te elementy, o których mowa w przedmowie specyfikacji i są napisane w sposób formalny i odpowiednio uzgodnionych podzbioru języka naturalnego. Niejasności będą wówczas dotyczyły sposobu implementacji specyfikacji - ale tego można się spodziewać.

Danportin
źródło
0

Nie

Jednoznaczną specyfikacją obliczeń jest program komputerowy.

Kevin Cline
źródło