eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
Ilość wypowiedzi w tym wątku: 160

  • 91. Data: 2019-01-08 09:42:18
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: AK <n...@n...net>

    On 2019-01-08 09:08, Wojciech Muła wrote:
    > On Monday, January 7, 2019 at 11:23:26 AM UTC+1, g...@g...com wrote:
    >> Może. Ale może też problem, na który się powołujesz, jest bardzo
    >> specyficzny (również ze względu na kontekst swojego powstawania).
    >> Większość programistów, jakich znam, nie implementuje swojego MD5.
    >
    > Nawet nie wiesz, jakie to jest śmieszne w wątku, gdzie na
    > poważnie dyskutuje się o sumowaniu kwadratów n początkowych
    > liczb pierwszych. :)
    >
    > w.

    1. W tym watku _nie dyskutuje sie_ o sumowaniu kwadratow
    poczatkowych liczb perwszych. To klasyczny "learning by example".
    PS: Smieszne to rzeczywiscie bylo (w innym watku) podnoszenie (przez
    Szanownych Ayatollahow badziewia zwanego C++) sprawy niemoznosci
    zrobienia listy/standardowej kolekcji prymitywow Javowych jako niby
    wada samej Javy jako jezyka. Tymczasem jest to wylacznie sprawa
    takiej a nie innej implementacji biblioteki, a implementacji
    nie majacych tej "wady" co niemiara (ze wspomne chocby o
    https://www.eclipse.org/collections/ - ze "niestandardowa"?
    heh, o wiele bardziej standardowa dla Javy niz boost czy Qt dla C++.
    Nie spotkalem Javovca ktory nie bylby za pan brat z Eclipse
    i jego srodowiskiem).
    2. W tym watku dyskutuje sie o badziewnosci i trupowatosci C++
    w stosunku do innych jezykow programowania.
    PS:Az dziw mnie bierze, ze Szanowna Mlodziezy - tak przecie z
    natury "Nowoczesna" i "do przodu" tak broni tego emeryta i kołtuna
    zwanego C++ :).

    AK


  • 92. Data: 2019-01-08 10:42:28
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: Maciej Sobczak <s...@g...com>

    > > Rozumiem. Mamy więc (niezaskakujący) wniosek, że różne języki są właściwe do
    różnych problemów.
    >
    > Pytanie, jaki dalszy wniosek możemy wyciągnąć z tego wniosku.
    > Może na przykład taki, że rozsądnie byłoby eksplorować języki,
    > które ułatwiają projektowanie języków.

    Zgadzam się. Dlatego, jak już wspomniałem, podoba mi się język Wolfram, bo dzięki
    swojej umiarkowanej lispowatości świetnie nadaje się do tworzenia tzw.
    Domain-Specific Languages. Zastanawiam się nad możliwością użycia tego do opisu
    wymagań, które można weryfikować albo z których można generować właściwy kod (albo
    testy).
    Sam LISP jest przez swój minimalizm zbyt sztywny, żeby był użyteczny dla końcowego
    odbiorcy.

    > Możesz zerknąć w przykłady programów liczących sumę kwadratów
    > początkowych siedmiu liczb pierwszych, które przewinęły się
    > przez ten wątek (to było w odpowiedzi na post AK).
    > Tam dokładnie pokazałem przykład rozumowania podstawieniowego.

    Ależ ja go rozumiem i od początku staram się tu zrobić konfrontację tych koncepcji.
    "Przykład rozumowania podstawieniowego" nie pokazuje żadnej przewagi nad tym
    imperatywnym oryginałem, z dwóch powodów:

    1. Nie widać w nim długoterminowych zalet w aspekcie utrzymania kodu. Wyobraź sobie,
    że klient dostał ten program i jest zadowolony, ale przecież jesteśmy agile, więc
    klient od razu wpada na nowy pomysł: "a jeszcze tak sobie pomyślałem, że te liczby,
    które nie są pierwsze, też by można do siebie dodać".
    Z punktu widzenia klienta to nie jest zmiana wymagań, tylko *nowe*, *dodatkowe*
    wymaganie (bo logicznie tak właśnie jest). A skoro tak, to klient będzie oczekiwał,
    że ten drobny dodatek będzie zrealizowany przez drobny dodatek w kodzie. W wersji
    imperatywnej (tej syfiastej, brzydkiej i naiwnej) *faktycznie* wystarczy coś dodać,
    bez modyfikacji istniejącego kodu. W wersji funkcjonalnej trzeba wywalić cały program
    i napisać go od nowa (pokażesz?). To jest potencjalnie poważny problem i nie tylko
    dlatego, że klient nie zrozumie, dlaczego tak ma się stać.
    Ten przykład w całości jest sztuczny (serio: nikt nie rozwiązuje takich problemów),
    ale nie wynika z niego, że powyższy problem nie wystąpi w większej (ilościowo albo
    czasowo) skali. Ciekawym aspektem do rozważenia jest to, że to, co Ty traktujesz jako
    wymagania ("dodaj ... itd.") to nie są jedyne wymagania, z jakimi musi się zmierzyć
    inżynier. Niejawnymi wymaganiami są też kwestie wydajności (sam widziałeś) i
    utrzymanie projektu w długim terminie. "Paradygmat podstawieniowy" tych problemów sam
    z siebie nie adresuje a przez to jest rozwiązaniem nie tylko niekompletnym ale może
    być wręcz ograniczającym.

    2. Programowanie imperatywne w żaden sposób nie wyklucza analizy podstawieniowej.
    Analizatory kodu (np. takie, które sprawdzają statycznie, czy ktoś nie wyjeżdża poza
    tablicę albo nie dzieli przez zero) wykonują weryfikację właśnie przez podstawienia i
    przez rozwiązywanie równań.

    > Większość programistów, jakich znam, nie implementuje swojego MD5.

    To samo mogę powiedzieć o każdym zaproponowanym przez Ciebie przykładzie.
    A jednak ktoś coś immplementuje, inaczej nie mielibyśmy roboty. Pytanie, w którym
    momencie trafię na taki (lub należący do tej klasy) problem.

    > Być może z dydaktycznego punktu widzenia lepiej jest, żeby
    > programiści najpierw uczyli się języków, które realizują prostsze
    > modele obliczeń, a dopiero później (jeśli zajdzie taka potrzeba)
    > takich, które pozwalają na ścisłą kontrolę sprzętu.
    > (Wiele wskazuje na to, że tak właśnie jest)

    Ja bym się nawet z tym zgodził. I tu możemy wrócić do Twojej tezy, że początkujący
    programiści powielają nawyki z prostych przykładów w większej skali. A może warto ich
    uczyć na językach, których nie da się zastosować w większej skali? Wtedy nie będą
    niczego powielać. Scratch, Logomocja, itp. - a potem, jak już się wyszaleją na
    piramidkach i ciuchciach, pokazać im prawdziwy język, od razu w dużej skali. Np. C++.
    :-D

    > Czasem się spotykam z takim sformułowaniem, że dobry
    > język powinien robić tak, żeby łatwe rzeczy były w nim
    > łatwe, a trudne przynajmniej możliwe.

    Zgadzam się. Ale to może być też kwestią ekspozycji - tzn. można pokazywać język
    kawałkami, zaczynając od tych łatwych.

    > > > Operator przypisania w językach takich jak C czy Python jest
    > > > łatwo dostępny, i sprawia wrażenie, że jest prostą operacją.
    > >
    > > Bo jest. To jest podstawowa operacja.
    >
    > Podstawowa dla jakiego problemu?

    Jak niewiasta chce przemalować włosy to je maluje a nie robi swojego klona z innymi
    włosami. Jak mam kapcia w samochodzie to pompuję oponę a nie kupuję nowe napompowane
    koło (przepraszam: nowy samochód, bo przecież do starego nie da się nowego koła
    założyć). Jak mam gorzką kawę, to ją dosładzam a nie robię nową słodką. A jak chcę
    zmienić kolor ściany, to ją maluję a nie buduję nowy dom. I nie zakładam nowego konta
    (w nowym banku), żeby móc dostać wypłatę.
    Tak ma moje oko, operacja przypisania jest podstawowa w sensie uniwersalnym. To
    właśnie udawanie, że tej operacji nie ma, jest dla mnie kosztem.

    > Załóżmy, że zmienimy linijkę
    >
    > if(++dodano==ilu) return suma;
    >
    > na
    >
    > if(dodano++==ilu) return suma;
    >
    > Już mamy błąd.

    To jest problem kolejności operacji a nie samego przypisania (w tym przypadku
    modyfikacji). Funkcje też można zaaplikować w złej kolejności.

    > > > i właśnie z tego powodu w pierwszych dwóch rozdziałach SICP
    > >
    > > A z jakiego powodu teraz używają Pythona do nauki?
    >
    > Wyjaśniają w tekście, który podlinkowałeś wcześniej.

    Czyli jednak można pokazywać uczniom operację przypisania od samego początku nauki?

    > Polecam ten wykład:
    > https://www.youtube.com/watch?v=uEFrE6cgVNY

    Jak to się ma do ludzi, którzy uczyli się matematyki i nie rozumieją, że x=x+1 to nie
    musi być równanie?

    Ludzie, którzy zawodowo zajmują się matematyką biegle posługują się narzędziami
    takimi jak Mathematica, Matlab, Octave, itp. (zależność kulturowa) i zdumiewająco
    wszystkie te trzy są imperatywne i korzystają z pojedynczego znaku "=" jako operacji
    przypisania, czyli:

    x=5;
    x=x+1;

    we wszystkich tych narzędziach oznacza to samo.
    Czyli najwyraźniej ludzie zajmujący się matematyką nie mają z tym problemu.

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


  • 93. Data: 2019-01-08 17:21:21
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: Wojciech Muła <w...@g...com>

    On Tuesday, January 8, 2019 at 9:42:25 AM UTC+1, AK wrote:
    > 1. W tym watku _nie dyskutuje sie_ o sumowaniu kwadratow
    > poczatkowych liczb perwszych. To klasyczny "learning by example".

    Jest to problem skrajnie niepraktyczny, w przeciwieństwie do MD5.
    Fajnie, że można zabawkowe rzeczy napisać szybko, ale to tylko
    zabawki. Rzeczywistość boleśnie pokazuje, że fajne języki są
    fajne tylko na slajdach, nikt ich na poważnie nie stosuje.
    Oczywiście nie można odmówić fajnym językom zalet. Można o nich
    napisać pracę magisterską, a nawet dorobić się doktoratu, czy
    pojawiać na konferencjach ze stosownie mądrymi odczytami i
    ogólnie być ponad tą masą debili piszących w mainstreamowych
    językach. Ale to wszystko tak naprawdę jest bez znaczenia.

    > PS: Smieszne to rzeczywiscie bylo (w innym watku) podnoszenie (przez
    > Szanownych Ayatollahow badziewia zwanego C++) sprawy niemoznosci
    > zrobienia listy/standardowej kolekcji prymitywow Javowych jako niby
    > wada samej Javy jako jezyka.

    Nie, to jest wada Javy, bo nie można pogodzić starych typów z
    nowymi z powodu maszyny wirtualnej, której z kolei nie można
    zmienić "bo kompatybilność". Maszyna wirtualna została
    zaprojektowana 25 lat temu i jest przestarzała od jakiś 20 lat.
    Co nie wpływa na fakt, że Java nie zdechnie przez następne
    150 lat, tyle kodu w niej powstało.

    > 2. W tym watku dyskutuje sie o badziewnosci i trupowatosci C++
    > w stosunku do innych jezykow programowania.

    Słaba ta dyskusja, miałka niestety. Mnie, jako wieloletniego
    krytyka C++[1] i jednocześnie praktyka nic tutaj nie przekonuje.
    Daleko tu do mojego ulubionego https://yosefk.com/c++fqa/.
    Niestety, Yosef wymiękł i nie kontynuuje dzieła wytykania głupot
    w C++11, C++14, czy C++17, a byłoby tego sporo. Co ciekawe, dużo
    można by dodać np. z konferencji CppCon, bo wbrew opiniom
    programiści C++ są krytyczni. Np. Stroustrup mówił, że "auto"
    jest używane wbrew intencjom --- nie chwaląc się, przewidziałem
    ten efekt 4 lata temu.

    [1] Na przykład:
    http://0x80.pl/notesen/2019-01-07-cpp-read-file.html
    http://0x80.pl/notesen/2018-04-28-be-careful-with-di
    r-iterator.html
    http://0x80.pl/notesen/2018-03-16-awful-part-of-cpp.
    html
    http://0x80.pl/notesen/2015-11-22-another-cpp-nasty-
    feature.html

    > PS:Az dziw mnie bierze, ze Szanowna Mlodziezy - tak przecie z
    > natury "Nowoczesna" i "do przodu" tak broni tego emeryta i kołtuna
    > zwanego C++ :).

    Pochlebiasz mi, ale ja już jestem na tyle stary, że
    zrozumiałem na czym polega inercja. Można napisać 1 gigabajt
    tekstów o tym, że C++ jest badziewiem, ale co to niby
    zmieni? Badziewie zadziwiająco dobrze się trzyma i
    zadziwiająco dużo kasy w niego idzie z różnych stron. Staje
    się mniej badziewne nawet, o czym jednak trudno się
    przekonać bez praktyki.

    Szczęśliwie już jestem na tym etapie, że mało mnie interesują
    języki programowania, to dość nudny kawałek IT. Naprawdę
    ciekawe są kompilatory, ale tylko ta cześć za frontendem. :)

    w.


  • 94. Data: 2019-01-08 22:48:05
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: AK <n...@n...net>

    On 2019-01-08 17:21, Wojciech Muła wrote:
    > Jest to problem skrajnie niepraktyczny, w przeciwieństwie do MD5.
    > Fajnie, że można zabawkowe rzeczy napisać szybko, ale to tylko
    > zabawki. Rzeczywistość boleśnie pokazuje, że fajne języki są
    > fajne tylko na slajdach, nikt ich na poważnie nie stosuje.
    > Oczywiście nie można odmówić fajnym językom zalet. Można o nich
    > napisać pracę magisterską, a nawet dorobić się doktoratu, czy
    > pojawiać na konferencjach ze stosownie mądrymi odczytami i
    > ogólnie być ponad tą masą debili piszących w mainstreamowych
    > językach. Ale to wszystko tak naprawdę jest bez znaczenia.

    10 lat temu zrywaliscie boki jak nie gdze indziej niz tu "promowalem"
    Pythona. 10 lat temu wieli glowny Mufti C++ niejaki Sekator van Skijlen
    zarykiwal sie gdy "promowalem" tu .NET-a/C#.
    No ze pojade klasykiem: i kto mial racje ?
    A gdzie bylo C++ w tym czasie? Ano (do czasu C++14, choc to tez
    przegadany syf...) byl w d... gdy inne jezyki sie rozwijaly.

    >> PS: Smieszne to rzeczywiscie bylo (w innym watku) podnoszenie (przez
    >> Szanownych Ayatollahow badziewia zwanego C++) sprawy niemoznosci
    >> zrobienia listy/standardowej kolekcji prymitywow Javowych jako niby
    >> wada samej Javy jako jezyka.
    >
    > Nie, to jest wada Javy, bo nie można pogodzić starych typów z
    > nowymi z powodu maszyny wirtualnej, której z kolei nie można
    > zmienić "bo kompatybilność". Maszyna wirtualna została
    > zaprojektowana 25 lat temu i jest przestarzała od jakiś 20 lat.
    > Co nie wpływa na fakt, że Java nie zdechnie przez następne
    > 150 lat, tyle kodu w niej powstało.

    Wumyslane problemy.
    W zyciu mi sie nie zdarzylo miec problemy ze stosowaniem i wydajnoscia
    koekcji Integer vs int, czy Double vs double.
    Moze w czasach 16bit/1MB to tak ale dzis gdy RAM na 1000 x wiecej
    miejsca niz wtedy najwiekszy HDD ?

    >> 2. W tym watku dyskutuje sie o badziewnosci i trupowatosci C++
    >> w stosunku do innych jezykow programowania.
    >
    > Słaba ta dyskusja, miałka niestety. Mnie, jako wieloletniego
    > krytyka C++[1] i jednocześnie praktyka nic tutaj nie przekonuje.

    Przeciez nikt tu nie bedzie przedyskutowywal calego raportu C++ :)
    Szkoda zycia na cus takiego.

    > [1] Na przykład:
    > http://0x80.pl/notesen/2019-01-07-cpp-read-file.html
    > http://0x80.pl/notesen/2018-04-28-be-careful-with-di
    r-iterator.html
    > http://0x80.pl/notesen/2018-03-16-awful-part-of-cpp.
    html
    > http://0x80.pl/notesen/2015-11-22-another-cpp-nasty-
    feature.html
    >
    >> PS:Az dziw mnie bierze, ze Szanowna Mlodziezy - tak przecie z
    >> natury "Nowoczesna" i "do przodu" tak broni tego emeryta i kołtuna
    >> zwanego C++ :).
    >
    > Pochlebiasz mi, ale ja już jestem na tyle stary, że
    > zrozumiałem na czym polega inercja. Można napisać 1 gigabajt
    > tekstów o tym, że C++ jest badziewiem, ale co to niby
    > zmieni?

    Nic :) Po prostu C++ badziewne jest i tyle :)
    Trzeba umiec dazyc do "prawdy obektywnej" a nie opierac sie
    na wlasnych "uwazaniach"/fanatyzmie.

    > Badziewie zadziwiająco dobrze się trzyma i
    > zadziwiająco dużo kasy w niego idzie z różnych stron. Staje
    > się mniej badziewne nawet, o czym jednak trudno się
    > przekonać bez praktyki.
    >

    Chinskie wyroby tez trzymaja sie dobrze, ale czy to znaczy ze
    sa "obiektywnie dobre" ?.

    > Szczęśliwie już jestem na tym etapie, że mało mnie interesują
    > języki programowania, to dość nudny kawałek IT.

    Baaardzo ciekawy :). Zwlaszac ich historia i ewolucja (czesciej
    degradacja niestety).

    > Naprawdę ciekawe są kompilatory, ale tylko ta cześć za frontendem. :)

    Zeby taki kompilator byl ciekawy, musi byc naprawde dobry jezyk.
    Jesli to jest cus w rodzaju C++ to jest to raczej malo ciekawa
    mordega. (Poza tym dla rzezbiarza niusne produkcji dluta sa/powinny byc
    raczej malo ekscytujace. Jak i dla wirtuoza skrzypiec nie sa
    najwazniejsze niuanse lutnicze ale mozliwosci brzmieniowe konkretnych
    skrzypiec. Co innego dla innego lutnika:) To fakt).

    AK


  • 95. Data: 2019-01-08 22:51:25
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: AK <n...@n...net>

    On 2019-01-08 17:21, Wojciech Muła wrote:
    > On Tuesday, January 8, 2019 at 9:42:25 AM UTC+1, AK wrote:
    >> 1. W tym watku _nie dyskutuje sie_ o sumowaniu kwadratow
    >> poczatkowych liczb perwszych. To klasyczny "learning by example".
    >
    > Jest to problem skrajnie niepraktyczny, w przeciwieństwie do MD5.
    > Fajnie, że można zabawkowe rzeczy napisać szybko, ale to tylko
    > zabawki.

    Ze niby generatory/wyrazenia generatorowe/iteratorowe sa zabawka?
    Ze lazy jest zabawka?

    No to pokaz jak uzywac generatorow/wyrazen generatorowych w C++

    AK


  • 96. Data: 2019-01-08 23:24:56
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: g...@g...com

    W dniu wtorek, 8 stycznia 2019 10:42:29 UTC+1 użytkownik Maciej Sobczak napisał:
    > > > Rozumiem. Mamy więc (niezaskakujący) wniosek, że różne języki są właściwe do
    różnych problemów.
    > >
    > > Pytanie, jaki dalszy wniosek możemy wyciągnąć z tego wniosku.
    > > Może na przykład taki, że rozsądnie byłoby eksplorować języki,
    > > które ułatwiają projektowanie języków.
    >
    > Zgadzam się. Dlatego, jak już wspomniałem, podoba mi się język Wolfram, bo dzięki
    swojej umiarkowanej lispowatości świetnie nadaje się do tworzenia tzw.
    Domain-Specific Languages. Zastanawiam się nad możliwością użycia tego do opisu
    wymagań, które można weryfikować albo z których można generować właściwy kod (albo
    testy).
    > Sam LISP jest przez swój minimalizm zbyt sztywny, żeby był użyteczny dla końcowego
    odbiorcy.

    Mógłbyś wyjaśnić, co masz na myśli, mówiąc 'zbyt sztywny'?
    Dyskutowałem kiedyś z jednym gościem na Quorze. Gość pracował kiedyś dla Wolframa i
    był chyba w jakimś stopniu entuzjastą Mathematiki (nazywa się Jon Harrop, jeśli to
    coś mówi)
    Zadałem mu małe wyzwanie związane z tematem, którym się akurat zajmowałem w ramach
    pracy magisterskiej.
    Temat był raczej niszowy, bo dotyczył konwersji programów z rekurencją do takich, w
    których rekurencja się nie pojawiała (zamiast tego używa się tzw. kombinatora punktu
    stałego).
    Konwersję mam przedstawioną w dodatku do swojej pracy magisterskiej:

    https://github.com/panicz/master-thesis/blob/master/
    chapters/B.tex

    Jon napisał swój odpowiednik w języku Wolframa, i choć nie zdołałem go przekonać do
    Lispa, sam określił swoje rozwiązanie mianem bełkotu

    https://www.quora.com/Why-is-Haskell-not-homoiconic/
    answer/Jon-Harrop-2/comment/31109783

    > > Możesz zerknąć w przykłady programów liczących sumę kwadratów
    > > początkowych siedmiu liczb pierwszych, które przewinęły się
    > > przez ten wątek (to było w odpowiedzi na post AK).
    > > Tam dokładnie pokazałem przykład rozumowania podstawieniowego.
    >
    > Ależ ja go rozumiem i od początku staram się tu zrobić konfrontację tych koncepcji.
    "Przykład rozumowania podstawieniowego" nie pokazuje żadnej przewagi nad tym
    imperatywnym oryginałem, z dwóch powodów:
    >
    > 1. Nie widać w nim długoterminowych zalet w aspekcie utrzymania kodu. Wyobraź
    sobie, że klient dostał ten program i jest zadowolony, ale przecież jesteśmy agile,
    więc klient od razu wpada na nowy pomysł: "a jeszcze tak sobie pomyślałem, że te
    liczby, które nie są pierwsze, też by można do siebie dodać".
    > Z punktu widzenia klienta to nie jest zmiana wymagań, tylko *nowe*, *dodatkowe*
    wymaganie (bo logicznie tak właśnie jest). A skoro tak, to klient będzie oczekiwał,
    że ten drobny dodatek będzie zrealizowany przez drobny dodatek w kodzie. W wersji
    imperatywnej (tej syfiastej, brzydkiej i naiwnej) *faktycznie* wystarczy coś dodać,
    bez modyfikacji istniejącego kodu. W wersji funkcjonalnej trzeba wywalić cały program
    i napisać go od nowa (pokażesz?).

    Nie rozumiem przykładu i nie wiem, skąd bierze się Twój wniosek. Ja mam w tej kwestii
    zupełnie inne doświadczenia.
    Programowanie funkcyjne polega przede wszystkim na definiowaniu pojęć, przy pomocy
    których wyrażasz rozwiązanie problemu.
    Pojęcia reprezentują nasze rozumienie składników rozwiązania. Jeżeli do wymagań
    klienta dochodzi coś nowego, co nie jest wyrażalne przy pomocy dotychczasowego
    aparatu pojęciowego, to wówczas trzeba ten aparat rozszerzyć, tzn. podefiniować nowe
    pojęcia. Ale nic nie trzeba wyrzucać.

    > To jest potencjalnie poważny problem i nie tylko dlatego, że klient nie zrozumie,
    dlaczego tak ma się stać.
    > Ten przykład w całości jest sztuczny (serio: nikt nie rozwiązuje takich problemów),
    ale nie wynika z niego, że powyższy problem nie wystąpi w większej (ilościowo albo
    czasowo) skali.

    Tzn. jaki przykład?

    > Ciekawym aspektem do rozważenia jest to, że to, co Ty traktujesz jako wymagania
    ("dodaj ... itd.") to nie są jedyne wymagania, z jakimi musi się zmierzyć inżynier.
    Niejawnymi wymaganiami są też kwestie wydajności (sam widziałeś) i utrzymanie
    projektu w długim terminie. "Paradygmat podstawieniowy" tych problemów sam z siebie
    nie adresuje a przez to jest rozwiązaniem nie tylko niekompletnym ale może być wręcz
    ograniczającym.

    Ja nie twierdzę, że programowanie funkcyjne to panaceum na wszystkie problemy. Sam
    dużo programuję imperatywnie, i jakoś sobie z tym radzę.
    Ja mówię przede wszystkim o uczeniu się programowania: o dostrzeżeniu, że niemożność
    analizy programu w terminach podstawień też jest pewnym kosztem (który może czasem
    można zamortyzować, a czasem warto ponieść).

    > 2. Programowanie imperatywne w żaden sposób nie wyklucza analizy podstawieniowej.
    Analizatory kodu (np. takie, które sprawdzają statycznie, czy ktoś nie wyjeżdża poza
    tablicę albo nie dzieli przez zero) wykonują weryfikację właśnie przez podstawienia i
    przez rozwiązywanie równań.

    Ok, w takim razie weź kod fira, który przekleiłem do swojej odpowiedzi, i pokaż nam,
    jak by dla niego taka analiza podstawieniowa wyglądała.

    > > Większość programistów, jakich znam, nie implementuje swojego MD5.
    >
    > To samo mogę powiedzieć o każdym zaproponowanym przez Ciebie przykładzie.
    > A jednak ktoś coś immplementuje, inaczej nie mielibyśmy roboty. Pytanie, w którym
    momencie trafię na taki (lub należący do tej klasy) problem.

    Weź dowolną finansową aplikację. Tam tego typu prostych przekształceń będziesz miał
    na pęczki.
    Może niekoniecznie sumowanie kwadratów liczb pierwszych, ale na przykład liczenie
    bilansu zysków i strat albo kwoty wolnej od podatku.

    > > Być może z dydaktycznego punktu widzenia lepiej jest, żeby
    > > programiści najpierw uczyli się języków, które realizują prostsze
    > > modele obliczeń, a dopiero później (jeśli zajdzie taka potrzeba)
    > > takich, które pozwalają na ścisłą kontrolę sprzętu.
    > > (Wiele wskazuje na to, że tak właśnie jest)
    >
    > Ja bym się nawet z tym zgodził. I tu możemy wrócić do Twojej tezy, że początkujący
    programiści powielają nawyki z prostych przykładów w większej skali. A może warto ich
    uczyć na językach, których nie da się zastosować w większej skali? Wtedy nie będą
    niczego powielać. Scratch, Logomocja, itp. - a potem, jak już się wyszaleją na
    piramidkach i ciuchciach, pokazać im prawdziwy język, od razu w dużej skali. Np. C++.
    :-D

    Tylko wtedy mamy dydaktyczny problem zmiany skali.

    > > Czasem się spotykam z takim sformułowaniem, że dobry
    > > język powinien robić tak, żeby łatwe rzeczy były w nim
    > > łatwe, a trudne przynajmniej możliwe.
    >
    > Zgadzam się. Ale to może być też kwestią ekspozycji - tzn. można pokazywać język
    kawałkami, zaczynając od tych łatwych.

    Moim zdaniem pokazywanie języka to zachowanie na poziomie przedszkolnym.
    Dlatego cenię książki Lispowe, o których wspominałem, że w nich język w ogóle nie
    jest kwestią, i zamiast na nim i na "językowych ficzerach" można się skupić po prostu
    na przykładach użycia języka, czyli na wypowiedziach.
    C++ przyzwyczaja pokolenia programistów do "językowych ficzerów".
    Natomiast książki pokroju SICP czy PAIP uczą się, że możemy najpierw próbować wyrazić
    problem w dogodny dla nas sposób, a dopiero później wykombinować, co z owym
    wyrażeniem ma robić komputer.

    > > > > Operator przypisania w językach takich jak C czy Python jest
    > > > > łatwo dostępny, i sprawia wrażenie, że jest prostą operacją.
    > > >
    > > > Bo jest. To jest podstawowa operacja.
    > >
    > > Podstawowa dla jakiego problemu?
    >
    > Jak niewiasta chce przemalować włosy to je maluje a nie robi swojego klona z innymi
    włosami. Jak mam kapcia w samochodzie to pompuję oponę a nie kupuję nowe napompowane
    koło (przepraszam: nowy samochód, bo przecież do starego nie da się nowego koła
    założyć). Jak mam gorzką kawę, to ją dosładzam a nie robię nową słodką. A jak chcę
    zmienić kolor ściany, to ją maluję a nie buduję nowy dom. I nie zakładam nowego konta
    (w nowym banku), żeby móc dostać wypłatę.
    > Tak ma moje oko, operacja przypisania jest podstawowa w sensie uniwersalnym. To
    właśnie udawanie, że tej operacji nie ma, jest dla mnie kosztem.

    Wydaje mi się, że nie rozumiesz jednej rzeczy.
    Ta rzecz jest może trudna do wyjaśnienia, bo jest bardzo abstrakcyjna, wszędobylska,
    a przez to trudna do uchwycenia.
    Jak ja Ci przedstawiam jakąś nową informację, to ja jej nie tracę, a stare informacje
    nie znikają.
    Jak piszę nowego posta na usenecie, to nie kasuję poprzedniego.
    To, że William Szekspir umarł, nie sprawia, że nie mogę o nim mówić, nie dostając
    błędu segmentacji pamięci.
    Jeżeli od jakiegoś momentu postanowimy, żeby słowem "jabłko" określać konia, nie
    sprawi to, że nagle wszystkie jabłka staną się końmi, ani że wszystkie dotychczasowe
    użycia słowa "jabłko" będą dla wszystkich oznaczać konie.
    Nawet w szkole, jak nauczyciel zmazuje tablicę, to Ty nie bierzesz korektora, i nie
    zamazujesz wszystkich swoich notatek.

    Trudno to sobie uświadomić, bo to są rzeczy, które się nie dzieją. Jesteśmy
    przyzwyczajeni do tego, że się nie dzieją.
    Operator przypisania nie ma swojego odpowiednika w świecie językowym czy pojęciowym,
    w którym żyjemy na co dzień.
    Unikanie go sprawia, że programowanie staje się równie proste i naturalne, co
    mówienie.

    Właśnie dlatego nie kupuję Twojego argumentu: kiedy ja mówię o niemutowalności, to Ty
    mówisz "świat taki nie jest". Ale my nie mówimy teraz o świecie, tylko o języku, i ja
    odpowiadam na Twój obraz świata: "język taki nie jest".

    Wprowadzenie operatora przypisania rodzi bardzo wiele nieoczywistości w różnych
    sytuacjach.
    Choćby w Pythonie mamy coś takiego: możemy być przyzwyczajeni traktować zapis "x +=
    y" jako skrót dla "x := x + y".
    Jest tak na przykład wtedy, kiedy x i y odnoszą się do liczb całkowitych:

    >>> x = 5
    >>> y = x
    >>> y += 2
    >>> y
    7
    >>> x
    5

    ale jeśli napisalibyśmy
    >>> x = [1,2,3]
    >>> y = x
    >>> y += [4,5]
    to oczywiście
    >>> y
    [1,2,3,4,5]
    ale - co już mniej oczywiste
    >>> x
    [1,2,3,4,5]

    Jedni mogą twierdzić, że to jest dobre zachowanie, inni że złe, ale dla mnie to jest
    jeden z tych problemów, które wolę obejść, niż rozwiązywać, bo którego nie można
    dobrze rozwiązać a priori.

    I owszem, jeżeli jesteśmy przyzwyczajeni do tego, że programowanie to "mówienie
    komputerowi, co ma robić", to takie programowanie, o którym ja tutaj mówię, można
    uznać za iluzję - często trudniej sprawić, żeby efekt działał wydajnie, co - w
    zgodzie z tym, co piszesz, można widzieć jako pewien koszt. Prostota, o której ja
    piszę, nie jest prostotą implementacyjną, ale prostotą pojęciową, bądź też prostotą
    mentalnego modelu programowania.

    > > > > i właśnie z tego powodu w pierwszych dwóch rozdziałach SICP
    > > >
    > > > A z jakiego powodu teraz używają Pythona do nauki?
    > >
    > > Wyjaśniają w tekście, który podlinkowałeś wcześniej.
    >
    > Czyli jednak można pokazywać uczniom operację przypisania od samego początku nauki?

    Nie wiem, w jaki oni sposób uczą Pythona, ale podejrzewam, że nadal są pod tym
    względem ostrożni.

    > > Polecam ten wykład:
    > > https://www.youtube.com/watch?v=uEFrE6cgVNY
    >
    > Jak to się ma do ludzi, którzy uczyli się matematyki i nie rozumieją, że x=x+1 to
    nie musi być równanie?

    Właśnie w taki sposób, że na podstawie badań empirycznych wyszło im, że wyjmując
    operator przypisania z języka unikają bardzo wielu nieporozumień.


  • 97. Data: 2019-01-09 00:18:49
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: AK <n...@n...net>

    On 2019-01-08 23:24, g...@g...com wrote:
    > Jak to się ma do ludzi, którzy uczyli się matematyki i nie rozumieją, że x=x+1 to
    nie musi być równanie?

    W "moich czasach" bylo jednak normalniej :).

    = to bylo: rowna sie
    <- to bylo: podstawienie

    Pozniej jednak jakis debil usunal <- z klawiatury :(

    ICL1900 Algol:

    integer procedure silnia(n):
    integer n;
    begin
    silnia <- if n = 1 then 1 else silnia(n - 1) * n;
    end

    AK


  • 98. Data: 2019-01-09 08:46:06
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: Maciej Sobczak <s...@g...com>

    > > Sam LISP jest przez swój minimalizm zbyt sztywny, żeby był użyteczny dla
    końcowego odbiorcy.
    >
    > Mógłbyś wyjaśnić, co masz na myśli, mówiąc 'zbyt sztywny'?

    Np. to, że jego składnia jest ukłonem w stronę parserów a nie w stronę użytkowników.
    Ja naprawdę wolę napisać a*b+c, niż (+ (* a b) c), i nie cieszy mnie kończenie
    wyrażeń serią nawiasów tak długą, że nie sposób ich policzyć. Wolfram jest o tyle
    ciekawy, że ma dwie albo trzy wewnętrznie równoważne składnie i pozwala posłużyć się
    taką, jaka jest w danym miejscu odpowiednia. Jest to ważne zwłaszcza wtedy, gdy
    chcemy w języku wyrazić coś nowego, np. wymagania albo zbiór danych.

    [o przykładzie z dodawaniem kwadratów liczb pierwszych]

    > > Z punktu widzenia klienta to nie jest zmiana wymagań, tylko *nowe*, *dodatkowe*
    wymaganie (bo logicznie tak właśnie jest). A skoro tak, to klient będzie oczekiwał,
    że ten drobny dodatek będzie zrealizowany przez drobny dodatek w kodzie. W wersji
    imperatywnej (tej syfiastej, brzydkiej i naiwnej) *faktycznie* wystarczy coś dodać,
    bez modyfikacji istniejącego kodu. W wersji funkcjonalnej trzeba wywalić cały program
    i napisać go od nowa (pokażesz?).
    >
    > Nie rozumiem przykładu

    Przykład pokazuje, że Twoja metoda funkcyjno-podstawieniowa tworzy zamknięty ciąg,
    którego nie da się rozwijać. Poprosiłem o implementację nowego wymagania w tym samym
    "projekcie". Pokażesz? Przecież stwierdziliśmy, że kod jest lepszy od słów.

    > Ja mam w tej kwestii zupełnie inne doświadczenia.

    Poproszę o implementację nowego wymagania w istniejącym projekcie.
    W wersji imperatywnej jest to oczywiste - dodatkowa zmienna, być może gałąź else. Jak
    to będzie w Twojej wersji?

    > Pojęcia reprezentują nasze rozumienie składników rozwiązania. Jeżeli do wymagań
    klienta dochodzi coś nowego, co nie jest wyrażalne przy pomocy dotychczasowego
    aparatu pojęciowego

    Ale właśnie jest. "Te liczby, które nie są pierwsze, też można by do siebie dodać".
    Co tu jest pojęciowo nowego? Liczby pierwsze, dodawanie - te pojęcia już masz, bo już
    ich używałeś w programie. Teraz odwołując się do tych istniejących pojęć ja chcę mieć
    też dodane do siebie te liczby, które nie były pierwsze.

    > Ale nic nie trzeba wyrzucać.

    Pokaż.

    > > 2. Programowanie imperatywne w żaden sposób nie wyklucza analizy podstawieniowej.
    >
    > Ok, w takim razie weź kod fira, który przekleiłem do swojej odpowiedzi, i pokaż
    nam, jak by dla niego taka analiza podstawieniowa wyglądała.

    A na jakie pytanie chciałbyś taką analizą odpowiedzieć?

    > Weź dowolną finansową aplikację. Tam tego typu prostych przekształceń będziesz miał
    na pęczki.

    Weź dowolny system, który czegoś pilnuje albo czymś steruje.
    Jeszcze nie mówiliśmy o wymaganiach czasowych. Np. "woda w kranie w toalecie ma
    przestać lecieć po 5s od ostatniej aktywacji czujnika zbliżeniowego". To wymaganie
    jest pojęciowo bardzo proste.

    > Może niekoniecznie sumowanie kwadratów liczb pierwszych, ale na przykład liczenie
    bilansu zysków i strat albo kwoty wolnej od podatku.

    Ale nawet w takim systemie wyobrażam sobie nowe wymaganie typu "a to coś co nie
    spełniało warunku, to coś tam". I mam ten sam problem co z sumowaniem kwadratów.

    > A może warto ich uczyć na językach, których nie da się zastosować w większej skali?
    >
    > Tylko wtedy mamy dydaktyczny problem zmiany skali.

    A może to nie jest problem nauki języka, tylko nauki inżynierii programowania? Może
    właśnie tego brakuje adeptom powielającym złe nawyki z prostych przykładów? Ale język
    jest wtedy drugorzędny.
    Przecież ten sam problem wystąpi w każdej innej dziedzinie - nie można oczekiwać, że
    się nauczy kogoś architektury albo budownictwa na klockach. Tymczasem tak właśnie
    ludzie podchodzą do nauki programowania - biorą książkę "Python w 24h" i jazda.

    > Wydaje mi się, że nie rozumiesz jednej rzeczy.

    > Jak ja Ci przedstawiam jakąś nową informację, to ja jej nie tracę, a stare
    informacje nie znikają.

    A jeśli są wyświetlane na ekranie smartfona? Stare muszą zniknąć, bo rozmiar ekranu
    jest ograniczony.

    > Jak piszę nowego posta na usenecie, to nie kasuję poprzedniego.

    Ale możesz edytować tego nowego, gdy się pomylisz.

    > To, że William Szekspir umarł, nie sprawia, że nie mogę o nim mówić, nie dostając
    błędu segmentacji pamięci.

    Ale żółwika z nim nie przybijesz.

    > Jeżeli od jakiegoś momentu postanowimy, żeby słowem "jabłko" określać konia, nie
    sprawi to, że nagle wszystkie jabłka staną się końmi, ani że wszystkie dotychczasowe
    użycia słowa "jabłko" będą dla wszystkich oznaczać konie.

    Ten przykład jest dla mnie za trudny.

    > Nawet w szkole, jak nauczyciel zmazuje tablicę, to Ty nie bierzesz korektora, i nie
    zamazujesz wszystkich swoich notatek.

    A jeśli piszę na tablecie?

    > Trudno to sobie uświadomić,

    Znowu mnie nie przekonałeś?

    > Choćby w Pythonie mamy coś takiego:
    [...]

    Tak, Python jest źle zaprojektowany. Ale to nie jest przykład na problem z operacją
    przypisania. Są języki, gdzie ten sam przykład zadziała prawidłowo i zgodnie z
    intuicją. Np. Wolfram. W C++ analogiczny przykład na kontenerach też zadziała
    poprawnie.

    > Prostota, o której ja piszę, nie jest prostotą implementacyjną, ale prostotą
    pojęciową

    I to jest dobre określenie. Podoba mi się i zgadzam się z nim. Za wyjątkiem
    oczywiście tego, że pomijanie aspektów implementacyjnych jest zwykle krótkowzroczne i
    sprawdza się tylko w prostych albo jednorazowych (często te cechy są razem)
    przykładach.
    Zgodzę się jednak, że prostota pojęciowa to dobry cel w wielu zastosowaniach. Myślę
    jednak, że proponowane przez Ciebie rozwiązania zostaną kiedyś zastąpione przez coś w
    rodzaju asystentów AI, jak Wolfram Alpha:

    https://www.wolframalpha.com/input/?i=sum+of+first+s
    even+prime+numbers

    Jest prostota pojęciowa? Jest. Właściwie prościej się nie da.
    Pozostaje zastosować to w większej skali, np. systemu finansowego. Nie mam
    wątpliwości, że taki jest właśnie kierunek rozwoju.

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


  • 99. Data: 2019-01-09 09:08:23
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: Maciej Sobczak <s...@g...com>

    > Spróbuj sformułować problem liczenia MD5 bez odwoływana się
    > do istniejących implementacji i dokumentów. Czekam.

    Źle. Jeśli ograniczasz swoją perspektywę tylko do problemów, które można wytłumaczyć
    przez telefon, to sam sobie budujesz szklany sufit. Jednocześnie sam sobie
    zaprzeczasz, bo twierdziłeś tutaj, że bardziej od słów cenisz sobie hiper-precyzyjny
    zapis w postaci kodu. Dlaczego teraz przed tym uciekasz?

    Algorytm MD5 jest opisany np. tutaj:

    https://en.wikipedia.org/wiki/MD5

    Jest tam sekcja Algorithm a pod nią Pseudocode.

    Istnieje spora szansa, że nie da się tego wyrazić prościej.
    Pytanie teraz, jak to zaprogramować. I w czym.

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


  • 100. Data: 2019-01-09 22:32:37
    Temat: Re: Jaki język polecić początkującemu? - komentarz do artykułu w Programista 9/2018
    Od: Wojciech Muła <w...@g...com>

    On Tuesday, January 8, 2019 at 10:51:30 PM UTC+1, AK wrote:
    > On 2019-01-08 17:21, Wojciech Muła wrote:
    > > On Tuesday, January 8, 2019 at 9:42:25 AM UTC+1, AK wrote:
    > >> 1. W tym watku _nie dyskutuje sie_ o sumowaniu kwadratow
    > >> poczatkowych liczb perwszych. To klasyczny "learning by example".
    > >
    > > Jest to problem skrajnie niepraktyczny, w przeciwieństwie do MD5.
    > > Fajnie, że można zabawkowe rzeczy napisać szybko, ale to tylko
    > > zabawki.
    >
    > Ze niby generatory/wyrazenia generatorowe/iteratorowe sa zabawka?

    Tak, to tylko lukier składniowy, który nie wnosi nic do
    semantyki. O wiele istotniejsze, jeśli jesteśmy przy pythonie,
    jest context management protocol.

    Co do wyrażeń generatorowych to owszem, używam na co dzień w
    pythonie, ale mógłbym żyć bez tego. Nie boli mnie pisanie pętli,
    ja się nawet goto nie boję. :) Bardziej skomplikowane wyrażenia i
    tak zamykam w funkcji/metodzie, bo mi etyka zawodowa nie pozwala
    pisać jednolinijkowców na 150 znaków.

    > Ze lazy jest zabawka?

    Nie, leniwe liczenie to wyłącznie środek do celu (który ma swój
    ukryty koszt, o czym lepiej nie pamiętać). Okazało się np., że
    genialne w swojej prostocie parsowanie za pomocą pochodnych
    wyrażeń regularnych dużo zyskuje dzięki temu podejściu, jeśli
    nawet nie staje możliwe dzięki niemu. No i to w sumie jedyne
    praktyczne zastosowanie leniwego wartościowania o jakim
    słyszałem.

    > No to pokaz jak uzywac generatorow/wyrazen generatorowych w C++

    Przecież nie ma czegoś takiego w C++, po co na siłę udawać?
    Generator w języku imperatywnym to będzie stan + funkcja która
    liczy następną wartość ze stanu (tak jest zresztą fizycznie
    w pythonie robione). I przypominam sobie dokładnie jeden
    przypadek, kiedy musiałem coś takiego napisać. To była
    implementacja interfejsu generatora w rozszerzeniu do Pythona
    napisanym w C. :)

    w.

strony : 1 ... 9 . [ 10 ] . 11 ... 16


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: