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?
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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.
lub:
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.
źródło
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
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.
źródło
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 .
źródło
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.
źródło
(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):
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.
źródło
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ąć?
źródło
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.
źródło
Uważam, że poprawna odpowiedź jest przecząca. Konieczne jest rozróżnienie następujących pytań:
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:
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:
gdzie wypowiedzi
X
,Y
,Z
zawierają 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ć.źródło
Nie
Jednoznaczną specyfikacją obliczeń jest program komputerowy.
źródło