eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › poprawność algorytmu
Ilość wypowiedzi w tym wątku: 94

  • 21. Data: 2015-03-27 11:09:18
    Temat: Re: poprawność algorytmu
    Od: g...@g...com

    W dniu piątek, 27 marca 2015 10:06:11 UTC+1 użytkownik Maciej Sobczak napisał:
    >
    > > No to teraz całkowicie bez szydery i na poważnie spytam, jakie są
    > > praktyczne możliwości. Mam powiedzmy program w C++, kilkaset tysięcy
    > > linii kodu, korzysta z boosta, wątków, libc, bazy danych, MOM-a itd. -
    > > co można zrobić żeby udowodnuć jego poprawność i ile to będzie kosztowało?
    >
    > Nie da się. Dla równowagi zauważmy jednak, że przetestować
    > tego też się nie da, zresztą dokładnie z tych samych powodów
    > (uwaga logiczna: z tezy że się nie da konsekwentnie wynika
    > też teza, że się tego nie robi; można co najwyżej udawać że
    > się robi pomijając milcząco tą drobną niedogodność, że się
    > nie da i tak właśnie działa większa część branży, patrz też niżej).

    Tutaj akurat widzę pomylenie pojęć. Testowanie to uruchamianie
    programu z założeniem sprawdzenia, jak się zachowuje w określonych
    okolicznościach. Nie wiem, dlaczego programów napisanych w C++
    miałoby się nie dać uruchomić z zamiarem sprawdzenia, jak się zachowuje
    w określonych okolicznościach.

    > Na poważnie - nie stosuje się metod formalnych a posteriori
    > w odniesieniu do kodu, który nie był pisany z myślą o takich
    > metodach. Problem stopu, Goedel, i podobne teoretyczne przeszkody.
    > Natomiast da się napisać (i to udowodnić) poprawny program,
    > jeśli się go pisze z myślą o takich metodach.
    > Co ciekawe, dotyczy to również testów i to z takich samych powodów.

    To jest ciekawe pytanie: jakie znacie systemy stworzone z myślą
    o dowodzeniu poprawności napisanych w nich programów?

    I przy okazji kilka ciekawostek, które ostatnio przebiegły twittera:

    "What if you could write a test for a problem and have your compiler automatically
    return a correct implementation?":
    http://blogs.teamb.com/craigstuntz/2014/07/07/38818/

    Microsoft (chyba wczoraj) wypuścił źródła systemu Z3 używanego w w/w
    artykule: github.com/Z3Prover/z3

    Dowód sprzeczności w systemie Coq: https://github.com/clarus/falso

    > Ćwiczenie logiczne: jeżeli ktoś twierdzi, że testuje swój program,
    > to ja poproszę o *dowód*, że testowanie jest kompletne.

    Na tym chyba polega istotowa różnica między dowodem a testowaniem,
    że dowód wyczerpuje wszystkie możliwości, a testowanie nie.
    "Kompletne testowanie" byłoby właśnie -- po prostu -- dowodem.


  • 22. Data: 2015-03-27 12:24:47
    Temat: Re: poprawność algorytmu
    Od: "M.M." <m...@g...com>

    On Friday, March 27, 2015 at 10:57:26 AM UTC+1, g...@g...com wrote:
    > Oczywiście pewien problem natury epistemicznej wiąże się ze sformułowaniem
    > odpowiedniej listy aksjomatów, które miałyby odzwierciedlać rozważany
    > przez nas problem
    Właśnie o tym pisałem. Poprawność dowodu, to też jego poprawność w
    odzwierciedlaniu oryginalnego zadania.


  • 23. Data: 2015-03-27 13:21:21
    Temat: Re: poprawność algorytmu
    Od: g...@g...com

    W dniu piątek, 27 marca 2015 12:24:48 UTC+1 użytkownik M.M. napisał:
    > On Friday, March 27, 2015 at 10:57:26 AM UTC+1, g...@g...com wrote:
    > > Oczywiście pewien problem natury epistemicznej wiąże się ze sformułowaniem
    > > odpowiedniej listy aksjomatów, które miałyby odzwierciedlać rozważany
    > > przez nas problem
    > Właśnie o tym pisałem. Poprawność dowodu, to też jego poprawność w
    > odzwierciedlaniu oryginalnego zadania.

    W takim razie zgoda -- tego rodzaju "poprawność" jest niemożliwa do uzyskania.
    Należy jednak mieć na uwadze, że z formalnego punktu widzenia poprzez
    "poprawność" dowodu rozumie się to, czy każdy krok jest zgodny z regułami,
    natomiast w tym przypadku raczej należałoby użyć słowa "adekwatność"
    (na przykład teza Churcha-Turinga postuluje adekwatność maszyny Turinga
    jako modelu ujmującego intuicyjne rozumienie obliczalności)

    Jednak z drugiej strony jeśli mamy na przykład dowód indukcyjny twierdzenia,
    że funkcja "append" zdefiniowana (dajmy na to w czymś haskelopodobnym) jako

    append [] y = y
    append (h:t) y = h:(append t y)

    jest operatorem łącznym, tzn dla dowolnych skończonych list a, b, c
    append (append a b) c === append a (append b c)

    to tak naprawdę trudno jest to kwestionować i podważać, tzn. albo uznajemy
    regułę indukcji, i wtedy musimy uznać dowód za poprawny, albo jej nie uznajemy,
    i obawiamy się, że "mogą istnieć takie listy, dla których append wcale
    nie będzie się zachowywał jako operator łączny" -- choć byłoby czymś
    szokującym, gdyby ktoś był w stanie podać pozbawione błędów rozumowanie,
    które pozwalałoby taki obiekt skonstruować. Tym bardziej trudno byłoby
    tutaj sformułować zarzut nieadekwatności, bo nie za bardzo można wskazać
    jakąś zewnętrzną dziedzinę problemową, do której mielibyśmy odnosić
    dowód

    (a przy okazji jak kogoś ciekawi, to znajdzie ten dowód w notatkach
    http://www.cl.cam.ac.uk/teaching/Lectures/funprog-jr
    h-1996/all.pdf
    na stronie 86)


  • 24. Data: 2015-03-27 15:12:08
    Temat: Re: poprawność algorytmu
    Od: Maciej Sobczak <s...@g...com>


    > Tutaj akurat widzę pomylenie pojęć. Testowanie to uruchamianie
    > programu z założeniem sprawdzenia, jak się zachowuje w określonych
    > okolicznościach.

    Tak. Można nawet jakiegoś buga tak znaleźć.

    > Nie wiem, dlaczego programów napisanych w C++
    > miałoby się nie dać uruchomić z zamiarem sprawdzenia, jak się zachowuje
    > w określonych okolicznościach.

    Da się. Ale nie da się stwierdzić, czy te sprawdzone okoliczności wyczerpują możliwe
    stany i zachowania sprawdzanego programu, adekwatnie do wszystkich możliwich sposobów
    przyszłego użycia.

    Przykładowo, da się napisać test, który "sprawdza" funkcję sortującą i zapewne ktoś
    taki test napisał w Javie dla funkcji napisanej dekadę temu. Dało się to napisać i
    uruchomić.

    Ale rzeczona funkcja nadal była zje-banana, co raczej rzuca cień i rysę na taką
    metodę.

    > To jest ciekawe pytanie: jakie znacie systemy stworzone z myślą
    > o dowodzeniu poprawności napisanych w nich programów?

    SPARK?

    > I przy okazji kilka ciekawostek, które ostatnio przebiegły twittera:
    >
    > "What if you could write a test for a problem and have your compiler automatically
    return a correct implementation?":

    Fajne. Zwłaszcza jak ktoś napisze zły test. Będzie miał wtedy złą implementację
    pasującą idealnie do tego złego testu.

    Spuszczamy to z wodą.

    Podobnie jak automaty, który generują testy z implementacji. To jest taka sama
    ściema. Implementacja i test to są dwa *niezależne* artefakty, które się uzupełniają
    właśnie dzięki temu, że są niezależne. Jak ktoś generuje jedno z drugiego, to równie
    dobrze mógłby jednego w ogóle nie robić.
    Np. umówmy się, że wtedy nie robimy testów. To bardzo popularna metoda jest.

    > Na tym chyba polega istotowa różnica między dowodem a testowaniem,
    > że dowód wyczerpuje wszystkie możliwości, a testowanie nie.
    > "Kompletne testowanie" byłoby właśnie -- po prostu -- dowodem.

    Dokładnie. Stąd właśnie bierze się potencjalny zysk z użycia dowodów, które w
    porównaniu do kompletnych testów mogą być tańsze. Bo to, że dowody mogą być droższe
    od niekompletnych testów, to jest argument dla Dilberta.

    --
    Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com


  • 25. Data: 2015-03-27 16:00:37
    Temat: Re: poprawność algorytmu
    Od: g...@g...com

    W dniu piątek, 27 marca 2015 15:12:10 UTC+1 użytkownik Maciej Sobczak napisał:

    > > Nie wiem, dlaczego programów napisanych w C++
    > > miałoby się nie dać uruchomić z zamiarem sprawdzenia, jak się zachowuje
    > > w określonych okolicznościach.
    >
    > Da się. Ale nie da się stwierdzić, czy te sprawdzone okoliczności wyczerpują
    możliwe stany i zachowania sprawdzanego programu, adekwatnie do wszystkich możliwich
    sposobów przyszłego użycia.

    Da się z łatwością stwierdzić, że zazwyczaj nie wyczerpują.

    > Przykładowo, da się napisać test, który "sprawdza" funkcję sortującą i zapewne ktoś
    taki test napisał w Javie dla funkcji napisanej dekadę temu. Dało się to napisać i
    uruchomić.
    >
    > Ale rzeczona funkcja nadal była zje-banana, co raczej rzuca cień i rysę na taką
    metodę.

    Mnie się zdaje, że to w ogólności jest "cieńka" metoda. Tym bardziej,
    że wielu ideologów pisania testów mówią, że "im więcej, tym lepiej"
    i że "testy nie muszą być elegancko napisane" -- problem jest taki,
    że testy również potrafią czynić pewne założenia, które nie są kluczowe
    z perspektywy projektu, a których zmiana w projekcie sprawi, że słita
    testowa stanie się bezużyteczna.

    > > I przy okazji kilka ciekawostek, które ostatnio przebiegły twittera:
    > >
    > > "What if you could write a test for a problem and have your compiler
    automatically return a correct implementation?":
    >
    > Fajne. Zwłaszcza jak ktoś napisze zły test. Będzie miał wtedy złą implementację
    pasującą idealnie do tego złego testu.
    >
    > Spuszczamy to z wodą.

    A co jeśli ktoś napisze zły test i złą implementację? Taki sam klops.
    Jednak artykuł w gruncie rzeczy nie opisywał tego, o czym mówił
    ten nagłówek, tylko po prostu pewną odmianę programowania
    deklaratywnego opartą o microsoftowy system.

    > Podobnie jak automaty, który generują testy z implementacji. To jest taka sama
    ściema. Implementacja i test to są dwa *niezależne* artefakty, które się uzupełniają
    właśnie dzięki temu, że są niezależne. Jak ktoś generuje jedno z drugiego, to równie
    dobrze mógłby jednego w ogóle nie robić.
    > Np. umówmy się, że wtedy nie robimy testów. To bardzo popularna metoda jest.

    Tzn. generowanie testów z implementacji rzeczywiście brzmi idiotycznie.
    Jednak w drugą stronę to nie całkiem zachodzi. Jeżeli mamy system, który
    na podstawie testów potrafi wygenerować sensowną implementację, to szacun.

    > > Na tym chyba polega istotowa różnica między dowodem a testowaniem,
    > > że dowód wyczerpuje wszystkie możliwości, a testowanie nie.
    > > "Kompletne testowanie" byłoby właśnie -- po prostu -- dowodem.
    >
    > Dokładnie. Stąd właśnie bierze się potencjalny zysk z użycia dowodów, które w
    porównaniu do kompletnych testów mogą być tańsze. Bo to, że dowody mogą być droższe
    od niekompletnych testów, to jest argument dla Dilberta.

    Ja jednak będę trwał na stanowisku, że testy są z założenia niekompletne,
    bo obejmują pewne przypadki jednostkowe. I testy jako takie mają pewną
    wartość. Podobnie jak program QuickCheck.

    I owszem, zgodzę się, że fajniej jest mieć dowody poprawności, kiedy
    tylko się da (choć nie wiem, czy akurat w logice Hoare'a), ale jedno
    nie wyklucza drugiego. Tak jak fajnie np. w podręczniku do matematyki
    mieć nie tylko definicje, twierdzenia i dowody, ale również przykłady.


  • 26. Data: 2015-03-27 21:25:35
    Temat: Re: poprawność algorytmu
    Od: Andrzej Jarzabek <a...@g...com>

    On 27/03/2015 10:06, Maciej Sobczak wrote:
    >>
    >> No więc pomijając płacenie itd., to jest bardzo istotne kryterium,
    >> bo jeśli formalny zapis nawet nie tylko samego dowodu, ale również
    >> kryterium poprawności, które zostało dowiedzione, jest
    >> niezrozumiałe dla osób, które rozmieją, kiedy program jest
    >> rzeczywiście poprawny, to cały dowód poprawności jest OKDR.
    >
    > Zgadza się. Ale z drugiej strony, skąd osoby, które rozumieją, kiedy
    > program jest rzeczywiście poprawny, mają pewność, że on faktycznie
    > jest poprawny, skoro nie potrafią wyspecyfikować tego kryterium?
    > Kierują się przeczuciem?

    Ale może właśnie potrafią wyspecyfikować, ale niekoniecznie w języku
    formalnym.

    Albo nawet, co jest też częste, nie potrafią co prawda wystarczająco
    precyzyjnie wyspecyfikować, ale programista potrafi dojść do tego
    poprzez zadawanie pytań, zrozumienie celu jaki ma realizować program i
    posługiwanie się przykładami.

    > Tak jak przeczuciem kierowali się ludzie, którzy dekadę temu napisali
    > algorytm sortowania w Javie?

    No więc właśnie algorytm sortowania to taki wdzięczny temat dla metdo
    formalnych - formalne wyspecyfikowanie kryterium posortowanej sekwencji
    nie stanowi problemu i nie wymaga żadnej wiedzy domenowej. Mało też
    prawdopodobne, że to kryterium ulegnie zmianie w przewidywalnej
    przyszłości. Niestety w praktyce zwykle miewa się do czynienia z
    bardziej skomplikowanymi przypadkami.

    > Zgadzam się, że to jest problem. Metody formalne są ciałem obcym w
    > branży, bo nie pasują do dotychczas przyjętych wzorów pracy.

    Bo się nie nadają do realizacji tych zaań, które zazwyczaj się realizuje.

    >>> Zainteresowanie dowodzeniem rośnie właśnie dlatego, że jest
    >>> tańsze. Może być nawet dużo tańsze.
    >>
    >> Stąd gdzie ja stoję, tego zainteresowania nie widać.
    >
    > Najwyraźniej nie ma takiej potrzeby.

    Zależy jak to rozumieć. Potrzeba niezawodności owszem, jest, ale nie za
    wszelką cenę. Konsensus jest taki, że metody formalne albo w ogóle nie
    nadają się do zastosowania większości problemów, albo są nieopłacalne.

    Jeśli konsensus się myli, to byłoby bardzo duże zainteresowanie tym, jak
    by to zrobić w praktyce tak, żeby się opłacało. Tyle że na razie udaje
    się to jedynie w specyficznych niszach.

    Jeśli uważasz, że dałoby się stosować te metody w ogólnym przypadku, to
    np. ja byłbym bardzo zainteresowany - jak?

    >> Nie wątpię, że nieskończenie lepiej ode mnie znasz się na metodach
    >> formalnych, ale w tej kwestii nie masz pojęcia o czym mówisz.
    >
    > Może tak być. Ale zadam dwa pytania kontrolne:
    >
    > 1. Czy ktoś poniósł kiedyś osobiste konsekwencje (np. poszedł do
    > pierdla) za zrobienie błędu w programie użytym w branży finansowej?
    > 2. Czy ktoś odniósł kiedyś osobiste korzyści (np. dostał wysoką
    > premię) za szybkie wdrożenie systemu na rynek, wyprzedzając tym
    > konkurencję?

    Ale właściwie co to ma do rzeczy? Firma nie ponosi straty jeśli
    pracownik nie idzie do pierdla? Jak ktoś dostaje albo nie dostaje premii
    to znaczy że są albo nie ma testów?

    Zamiast odpowiadać na non sequitury, odniosę się do tego, o czym
    pisałeś: owszem, firmy ponoszą straty finansowe i utratę reputacji na
    wskutek błędnie działającego oprogramowania, owszem, jeśli firma straci
    pieniądze przez takie błędy w swoim oprogramowaniu, np. wysyłając
    niekorzystne dla siebie zlecenia na giełdę, to nie da się ich odzyskać
    przez "reklamacje", owszem, oprogramowanie się testuje.


    >> No to teraz całkowicie bez szydery i na poważnie spytam, jakie są
    >> praktyczne możliwości. Mam powiedzmy program w C++, kilkaset
    >> tysięcy linii kodu, korzysta z boosta, wątków, libc, bazy danych,
    >> MOM-a itd. - co można zrobić żeby udowodnuć jego poprawność i ile
    >> to będzie kosztowało?
    >
    > Nie da się. Dla równowagi zauważmy jednak, że przetestować tego też
    > się nie da, zresztą dokładnie z tych samych powodów (uwaga logiczna:
    > z tezy że się nie da konsekwentnie wynika też teza, że się tego nie
    > robi; można co najwyżej udawać że się robi pomijając milcząco tą
    > drobną niedogodność, że się nie da i tak właśnie działa większa część
    > branży, patrz też niżej).

    Da się, bo sukces testowania to nie jest 100% wyeliminowanie szansy
    błędu, tylko redukcja ryzyka strat w takim stopniu, żeby opłacało się to
    firmie.

    O ile trudno jest zmierzyć dokładnie o ile ryzyko jest redukowane przez
    testy i ile dokładnie opłaca się w te testy inwestoować, o tyle
    (przynajmniej kiedy nie stosuje się metod formalnych) jest oczywistą
    oczywistością, że jakiekolwiek testowanie jest lepsze od braku
    testowania w ogóle.

    > Na poważnie - nie stosuje się metod formalnych a posteriori w
    > odniesieniu do kodu, który nie był pisany z myślą o takich metodach.
    > Problem stopu, Goedel, i podobne teoretyczne przeszkody. Natomiast da
    > się napisać (i to udowodnić) poprawny program, jeśli się go pisze z
    > myślą o takich metodach.

    Jak konkretnie by to wyglądało w przypadku takiego programu, jaki opisałem?

    > Różnica między dowodami i testami jest taka, że niekompletnego dowodu
    > nie da się zrobić, bo od razu widać, że jest niekompletny - natomiast
    > bez najmniejszego problemu można zrobić niekompletne testy, bo
    > najczęściej nie widać, jak bardzo one są niekompletne. Testy są po
    > prostu wygodniejsze zarówno dla tych, którzy je robią, jak i dla
    > tych, którzy je akceptują i to tłumaczy ich "silną pozycję rynkową".

    Ale niekompletne testy są też użyteczne, w sensie takim, że realnie
    redukują ryzyko - w przeciwieństwie do niekompletnego dowodu, który jest
    czystym marnotrawstwem.


  • 27. Data: 2015-03-28 05:04:03
    Temat: Re: poprawność algorytmu
    Od: "M.M." <m...@g...com>

    On Friday, March 27, 2015 at 1:21:22 PM UTC+1, g...@g...com wrote:
    > W dniu piątek, 27 marca 2015 12:24:48 UTC+1 użytkownik M.M. napisał:
    > > On Friday, March 27, 2015 at 10:57:26 AM UTC+1, g...@g...com wrote:
    > > > Oczywiście pewien problem natury epistemicznej wiąże się ze sformułowaniem
    > > > odpowiedniej listy aksjomatów, które miałyby odzwierciedlać rozważany
    > > > przez nas problem
    > > Właśnie o tym pisałem. Poprawność dowodu, to też jego poprawność w
    > > odzwierciedlaniu oryginalnego zadania.
    >
    > W takim razie zgoda -- tego rodzaju "poprawność" jest niemożliwa do uzyskania.
    > Należy jednak mieć na uwadze, że z formalnego punktu widzenia poprzez
    > "poprawność" dowodu rozumie się to, czy każdy krok jest zgodny z regułami,
    > natomiast w tym przypadku raczej należałoby użyć słowa "adekwatność"
    > (na przykład teza Churcha-Turinga postuluje adekwatność maszyny Turinga
    > jako modelu ujmującego intuicyjne rozumienie obliczalności)

    Mój (hipotetyczny) klient zamawia najlepszy program do gry w
    szachy o łącznym rozmiarze kodu i danych nie większym niż 1MB. Napisałem
    taki program. Jak mam przeprowadzić dowód, że nie istnieje w
    ramach tego rozmiaru lepszy program?



    >
    > Jednak z drugiej strony jeśli mamy na przykład dowód indukcyjny twierdzenia,
    > że funkcja "append" zdefiniowana (dajmy na to w czymś haskelopodobnym) jako
    >
    > append [] y = y
    > append (h:t) y = h:(append t y)
    >
    > jest operatorem łącznym, tzn dla dowolnych skończonych list a, b, c
    > append (append a b) c === append a (append b c)
    >
    > to tak naprawdę trudno jest to kwestionować i podważać, tzn. albo uznajemy
    > regułę indukcji, i wtedy musimy uznać dowód za poprawny, albo jej nie uznajemy,
    > i obawiamy się, że "mogą istnieć takie listy, dla których append wcale
    > nie będzie się zachowywał jako operator łączny" -- choć byłoby czymś
    > szokującym, gdyby ktoś był w stanie podać pozbawione błędów rozumowanie,
    > które pozwalałoby taki obiekt skonstruować. Tym bardziej trudno byłoby
    > tutaj sformułować zarzut nieadekwatności, bo nie za bardzo można wskazać
    > jakąś zewnętrzną dziedzinę problemową, do której mielibyśmy odnosić
    > dowód
    >
    > (a przy okazji jak kogoś ciekawi, to znajdzie ten dowód w notatkach
    > http://www.cl.cam.ac.uk/teaching/Lectures/funprog-jr
    h-1996/all.pdf
    > na stronie 86)


  • 28. Data: 2015-03-28 09:40:56
    Temat: Re: poprawność algorytmu
    Od: Maciej Sobczak <s...@g...com>

    W dniu piątek, 27 marca 2015 16:00:39 UTC+1 użytkownik g...@g...com napisał:

    > Mnie się zdaje, że to w ogólności jest "cieńka" metoda. Tym bardziej,
    > że wielu ideologów pisania testów mówią, że "im więcej, tym lepiej"
    > i że "testy nie muszą być elegancko napisane" -- problem jest taki,
    > że testy również potrafią czynić pewne założenia, które nie są kluczowe
    > z perspektywy projektu, a których zmiana w projekcie sprawi, że słita
    > testowa stanie się bezużyteczna.

    Tak. I na tej podstawie można też podważyć stosowanie takich artefaktów do testowania
    regresji. Może być tak, że po zmianie w implementacji i wprowadzeniu do niej bugów
    stary test nadal będzie przechodził, bo nie testuje nowo powstałych osobliwości.

    Testów nie da się pisać na masę, chyba że ktoś chce uprawiać poprawność tzw.
    statystyczną. To też ma jakąś wartość, ale trzeba wiedzieć, gdzie.

    > A co jeśli ktoś napisze zły test i złą implementację? Taki sam klops.

    I te rzeczy były pisane przez niezależnych wykonawców? To wtedy prawdopodobieństwo
    znalezienia niezgodności jest bardzo wysokie i wiadomo, że co najmniej jedno z dwóch
    jest zwalone. Tej efektywności nie ma gdy się robi jedno z drugiego (tu z pogardą
    spoglądamy również na TDD).

    Podobno w praktyce wychodzi 50-50, więc tym bardziej nie należy traktować jednego z
    tych artefaktów jako nadrzędnego.

    > Jednak artykuł w gruncie rzeczy nie opisywał tego, o czym mówił
    > ten nagłówek, tylko po prostu pewną odmianę programowania
    > deklaratywnego opartą o microsoftowy system.

    Jasne. W takim kontekście jest to bardzo ciekawe. Szkoda tylko, że niepraktyczne.

    > Tzn. generowanie testów z implementacji rzeczywiście brzmi idiotycznie.
    > Jednak w drugą stronę to nie całkiem zachodzi. Jeżeli mamy system, który
    > na podstawie testów potrafi wygenerować sensowną implementację, to szacun.

    Szacun dla systemu. Ale nadal niepraktyczne.

    Taki system zmusza autora testu do takiego sformułowania testu, żeby z jego formuły
    wynikała kompletna implementacja. Tzn. albo test musi być wyczerpujący albo musi być
    tak skonstruowany, żeby *nie dało się* z niego zrobić niekompletnej implementacji.
    Np. napisz test, który sprawdza funkcję sort - ale napisz go tak, żeby po
    wygenerowaniu implementacji z tego testu, każdy inny test też przechodził.
    I jeszcze udowodnij, że tak jest.

    Wysiłek intelektualny z tym związany jest porównywalny z napisaniem tej funkcji. I
    udowodnienia, że jest poprawna.

    To jest jak ze ściskaniem plasteliny w dłoni - po prostu wylezie z innej strony a jej
    objętość się nie zmniejszy.

    > Ja jednak będę trwał na stanowisku, że testy są z założenia niekompletne,
    > bo obejmują pewne przypadki jednostkowe.

    Mogą obejmować wszystkie klasy równoważności (albo w ogóle być wyczerpujące w sensie
    przestrzeni wejść). Ale znalezienie wszystkich klas równoważności jest tak samo
    trudne, jak dowód z pominięciem testów. A testy wyczerpujące to tylko dla
    najprostszych funkcji logicznych można napisać przed zejściem.

    > I testy jako takie mają pewną
    > wartość.

    Tak. Oraz cenę.

    > I owszem, zgodzę się, że fajniej jest mieć dowody poprawności, kiedy
    > tylko się da (choć nie wiem, czy akurat w logice Hoare'a), ale jedno
    > nie wyklucza drugiego. Tak jak fajnie np. w podręczniku do matematyki
    > mieć nie tylko definicje, twierdzenia i dowody, ale również przykłady.

    Tak. Ale dowodem można uzasadnić zmniejszenie ilości testów. Tak jak w książce do
    matematyki nie trzeba podawać wyczerpujacych przykładów, wystarczy podać te
    ilustracyjne. Wtedy książka może mieć mniej kartek i może być tańsza.

    --
    Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com


  • 29. Data: 2015-03-28 09:45:21
    Temat: Re: poprawność algorytmu
    Od: g...@g...com

    W dniu sobota, 28 marca 2015 05:04:04 UTC+1 użytkownik M.M. napisał:

    > > W takim razie zgoda -- tego rodzaju "poprawność" jest niemożliwa do uzyskania.
    > > Należy jednak mieć na uwadze, że z formalnego punktu widzenia poprzez
    > > "poprawność" dowodu rozumie się to, czy każdy krok jest zgodny z regułami,
    > > natomiast w tym przypadku raczej należałoby użyć słowa "adekwatność"
    > > (na przykład teza Churcha-Turinga postuluje adekwatność maszyny Turinga
    > > jako modelu ujmującego intuicyjne rozumienie obliczalności)
    >
    > Mój (hipotetyczny) klient zamawia najlepszy program do gry w
    > szachy o łącznym rozmiarze kodu i danych nie większym niż 1MB. Napisałem
    > taki program. Jak mam przeprowadzić dowód, że nie istnieje w
    > ramach tego rozmiaru lepszy program?

    To akurat nie jest problem metody dowodowej, tylko nieprecyzyjnej
    specyfikacji. Co to znaczy,że "w ramach określonego rozmiaru program
    jest lepszy od innego programu"?

    Zresztą cechy użytkowe nie są czymś, co dowodzi się formalnie
    (bo są subiektywne). Formalnie chcemy dowodzić raczej pewnych
    inwariantów -- że na przykład w programie wielowątkowym nie dojdzie
    do sytuacji dead-locku (klasyczne zastosowane logik temporalnych),
    że dla określonej klasy danych wejściowych program się zatrzyma,
    że zużycie zasobów w czasie działania programu będzie ograniczona
    określoną funkcją od czasu działania i rozmiaru danych wejściowych
    itd.


  • 30. Data: 2015-03-28 10:10:19
    Temat: Re: poprawność algorytmu
    Od: Maciej Sobczak <s...@g...com>

    W dniu piątek, 27 marca 2015 21:25:34 UTC+1 użytkownik Andrzej Jarzabek napisał:

    > Ale może właśnie potrafią wyspecyfikować, ale niekoniecznie w języku
    > formalnym.

    To skąd wiedzą, że dobrze wyspecyfikowały? Mają przeczucie?

    > Albo nawet, co jest też częste, nie potrafią co prawda wystarczająco
    > precyzyjnie wyspecyfikować, ale programista potrafi dojść do tego
    > poprzez zadawanie pytań, zrozumienie celu jaki ma realizować program i
    > posługiwanie się przykładami.

    I napisać funkcję sort?

    > No więc właśnie algorytm sortowania to taki wdzięczny temat dla metdo
    > formalnych

    Tak. Metody formalne rozwija się po to, żeby wdzięcznych tematów było coraz więcej.

    > Niestety w praktyce zwykle miewa się do czynienia z
    > bardziej skomplikowanymi przypadkami.

    Zgadza się. I co, wtedy się łatwo testuje?

    > > Zgadzam się, że to jest problem. Metody formalne są ciałem obcym w
    > > branży, bo nie pasują do dotychczas przyjętych wzorów pracy.
    >
    > Bo się nie nadają do realizacji tych zaań, które zazwyczaj się realizuje.

    Ale testy też się nie nadają, tylko łatwiej to ukryć pod pozorem, że się je robi.

    > Konsensus jest taki, że metody formalne albo w ogóle nie
    > nadają się do zastosowania większości problemów, albo są nieopłacalne.

    Czyj konsensus? Bo na razie ustaliliśmy, że punkty widzenia są różne.

    > Jeśli konsensus się myli, to byłoby bardzo duże zainteresowanie tym, jak
    > by to zrobić w praktyce tak, żeby się opłacało.

    No więc ja rozumiem, że zainteresowanie jest.

    > Tyle że na razie udaje
    > się to jedynie w specyficznych niszach.

    Bo tylko w specyficznych niszach się próbuje to robić. W pozostałych niszach może
    nawet nie być wystarczającej świadomości, że jest to możliwe.

    > Jeśli uważasz, że dałoby się stosować te metody w ogólnym przypadku, to
    > np. ja byłbym bardzo zainteresowany - jak?

    Nie wiem. Nie wiem nawet, czy to jest dobre pytanie. Bo zamiast szukać jednej metody
    do zastosowania w ogólnym przypadku, może trzeba szukać szczególnej metody do każdego
    przypadku osobno. Ja wiem, że korporacje tego nie lubią, bo im to utrudnia
    zarządzanie zasobami metodą "zatrudnijmy 20% programistów więcej".

    > > 1. Czy ktoś poniósł kiedyś osobiste konsekwencje (np. poszedł do
    > > pierdla) za zrobienie błędu w programie użytym w branży finansowej?
    > > 2. Czy ktoś odniósł kiedyś osobiste korzyści (np. dostał wysoką
    > > premię) za szybkie wdrożenie systemu na rynek, wyprzedzając tym
    > > konkurencję?
    >
    > Ale właściwie co to ma do rzeczy? Firma nie ponosi straty jeśli
    > pracownik nie idzie do pierdla? Jak ktoś dostaje albo nie dostaje premii
    > to znaczy że są albo nie ma testów?

    Sam napisałeś, że to wszystko wynika z zarządzania ryzykiem. Powyżej masz input do
    tego zarządzania. Outputem jest wybór metod pracy.

    > Da się, bo sukces testowania to nie jest 100% wyeliminowanie szansy
    > błędu, tylko redukcja ryzyka strat w takim stopniu, żeby opłacało się to
    > firmie.

    Zgadza się. Coś jak z pytaniem czy dziecko nauczyło się tabliczki mnożenia a ono
    odpowiada, że nauczyło się tyle, żeby w opłacalnym stopniu zredukować ryzyko wpadki.
    No to nauczyło się czy się nie nauczyło?

    > jest oczywistą
    > oczywistością, że jakiekolwiek testowanie jest lepsze od braku
    > testowania w ogóle.

    Tak. Jest też oczywistą oczywistością, że jakiekolwiek testowanie nie wypełnia
    definicji terminu "system jest przetestowany". Proponuję wprowadzić termin
    "podtestowany system".

    > > Na poważnie - nie stosuje się metod formalnych a posteriori w
    > > odniesieniu do kodu, który nie był pisany z myślą o takich metodach.
    > > Problem stopu, Goedel, i podobne teoretyczne przeszkody. Natomiast da
    > > się napisać (i to udowodnić) poprawny program, jeśli się go pisze z
    > > myślą o takich metodach.
    >
    > Jak konkretnie by to wyglądało w przypadku takiego programu, jaki opisałem?

    Złe pytanie. Tego programu jeszcze nie ma, więc nie ma takiego przypadku. :-)
    Przypadkiem może być problem do rozwiązania, np. "system tradingowy". Mam opisać jak
    się to robi od początku? No więc bierze się białą tablicę i pisak, a potem... ;-)

    Ja wiem, że to jest niemodne podejście. Teraz się od razu nap...la kod, zanim jeszcze
    będzie wiadomo, co program ma robić.

    > Ale niekompletne testy są też użyteczne, w sensie takim, że realnie
    > redukują ryzyko

    Jak realnie? Możesz to wyrazić w liczbach? Jakiś wykres, abo coś? Bo jeśli mam za to
    zapłacić, to chcę znać ROI. Skoro te testy mają mieć efektywność probabilistyczną, to
    być może bardziej opłaca się wykupienie polisy ubezpieczeniowej? To wcale nie jest
    śmieszne pytanie.

    > w przeciwieństwie do niekompletnego dowodu, który jest
    > czystym marnotrawstwem.

    Więc róbmy dowód kompletny.

    --
    Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com

strony : 1 . 2 . [ 3 ] . 4 ... 10


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: