niedziela, 11 października 2015

Synteza - od hejtu do oświecenia

"It is necessary that at least once in your life you doubt, as far as possible, all things."
René Descartes

Flejmy są tak samo fajne jak urywki z reality show gdzie ludzie przerzucają się bluzgami. Niestety czasem uczestnicy takiego dyskursu udają sztucznie, ze są na tzw "poziomie" przez co całe widowisko traci na rozrywkowości ale mimo wszystko zazwyczaj kilka postów jest wesołych.

Tematyka flejmu jest bardzo zależna od dziedziny w jakiej pracujemy. Zapewne gdzieś tam jest nisza w której grupa ludzi prawie się zabije w trakcie dyskusji czy lepsze jest norma ISO-88976 czy ISO-88975. Sam kiedyś zmarnowałem kawałek życia na dyskusje o roli UML w pracy programisty - a życie to tak jak zęby mleczne - ma się je raz w życiu.

Z innych ciekawych flejmów jakie pamietam to

  • C++ vs Assembler - to jeszcze za czasów kawiarenek internetowych ( "a co to kawiarenka internetowa?")
  • Java vs C#
  • PHP vs cokolwiek

Ale co było takim pierwszym dużym flejmem na gruncie rzeczy mocno abstrakcyjnych?

  • Windows vs linux ?? wcześniej ...
  • yyy OOP vs Proceduralne ?? wcześniej ...
  • mainframe vs PC ?? wcześniej..
  • Lampy vs scalaki ?? wcześniej
wcześniej, dużo wcześniej!!!

Epistemologia

Epoka tak zwanego renesansu to wiek gdy pewna grupa ludzi pozbawiona innych rozterek życiowych skupia się na rozwiązaniu problemów pierwszego świata czyli np. "Czy mogę udowodnić, że świat w którym żyję naprawdę istnieje?" I takie tam.

Utworzyli oni dwie frakcje - Empiryści - którzy uważają, że wiedzę nabywa się zmysłami i Racjonaliści żywiący przekonanie, że wiedza jako taka istnieje w nas od urodzenia i musimy ją niejako "odzapomnieć" poprzez procesy myślowe i dumanie.

  • Empiryzm - Locke, Berkeley, and Hume
  • Nie ma wiedzy jako takiej a tylko to co odbieramy przez zmysły - jeśli urodziłeś się ślepy to skąd "wiesz", że "niebieski" to niebieski?
  • Czy tez pojecie próżni - w pewnym momencie historii zupełnie absurdalne koncepcyjne - później potwierdzone obserwacjami. (Można to nawet podciągnąć pod czasy niemal współczesne pod hasłem "Bóg nie gra w kości" - kto ciekawy niech sobie pogogluje)
  • Realizm- Descartes, Leibniz
  • Czy musimy wpierw zaobserwować wzór na pole koła aby ten wzór zaczął obowiązywać? (wskazówka - nie, nie musimy)
  • Jak "wygląda,pachnie,brzmi" etyczne zachowanie,dobro,zło ?
  • czy możemy przewidzieć rzeczy, których jeszcze nie widzieliśmy?

Posłużymy się fejsbukiem dla zmarłych ludzi czyli wikipedią. Pierwszy pojawia się Francis Bacon, który tworzy coś co będzie totalnie olewane przy dyskusjach o metodykach IT kilkaset lat później - "metodę naukową". Twierdzi, że postęp technologiczny najbardziej hamują różnego rodzaju zabobony i "sub optymalne konfiguracje społeczne" - dzieli je na :

  1. “idols of the mind.”
  2. “idols of the tribe”
  3. “idols of the cave”
  4. “idols of the marketplace”
To ostatnie w IT ma się świetnie. Ostatnio był fajny cytat na twiterze, że "teraz jest więcej firm, które specjalizują się w szkoleniach ze scruma niż firm które faktycznie używają scruma."

Teraz na scenę wchodzi Rene Descartes na polskie tłumaczony "Kartezjusz". To tak jak np. Kowalski tłumaczy się na angielski "Smith". To jest koleś od cytatu I think therefore I'am , który podobno w oryginale brzmi jednak inaczej.

On generalnie poleca coś innego niż wykorzystywanie zmysłów gdyż ktoś lub coś może jego zmysłami manipulować. Poleca poddać wszystko co się wie w wątpliwość i wyprowadzić wiedzę od nowa. Wszystko to jest nieco zakręcone ale na szczęście istnieje poniższy filmik

John Locke jeszcze zanim wystąpił w LOSTach, żywił przekonanie, że ludzki po urodzeniu to "tabula rasa" czyli tzw. "Czysta Karta". Miało to dosyć poważne implikacje dla ówczesnego światopoglądu, że jedni ludzi są lepsi od drugich "by default" i dlatego ci pierwsi się opierdalaja a ci drudzy zapierdalają. Później będzie to stanowić cegiełkę w krwawych przewrotach rzeczywistości gdy ogramna masa ludzi, której źle się dzieje zacznie się dopytywać "zaraz zaraz ale kto własciwie ustala te zasady" - ale to dopiero później

Nic też dziwnego, że Locke angażował się w politykę i kilka fajnych rzeczy "pomógł osiągnąć" - https://en.wikipedia.org/wiki/Natural_and_legal_rights#John_Locke

Gottfried Wilhelm Leibniz - od razu ciekawa rzecz, to on stworzył słowo Monada. I wtedy podobno też mało kto to rozumiał :

"Each monad is isolated from other
monads, and each contains a
complete representation of the
whole universe in its past,
present, and future states."
Na zadnym zdjęciu jednak nie nosi koszulki z niezwykle niszowym żartem o Kategorii Endofuntorów.

George Berkeley lub po prostu "Dżordż" - twórca Idealizmu (?). Szerzył ekstremalny empiryzm twierdząc, ze tylko rzeczy, które odebraliśmy zmysłami w ogóle istnieją, że łamiące drzewo w lesie nie wydaje dźwięku jak nikt nie może go usłyszeć. Zresztą drzewo też nie istnieje - jak i łyżka. Wydaje mi się, że do tego zwykłe zioło nie wystarczy i musiał jeździć do Amsterdamu jeszcze jak grzybki były tam legalne.

I w końcu David Hume, który (też grał w LOSTach tego kolesia, który siedział w bunkrze) nie tyle optował za tym, że świat należy badać poprzez zmysły ale także, iż i tak większość ludzi to robi i to tak trochę niepoprawnie tworząc nawyki - np. przez ostatni rok słońce wschodziło każdego dnia to i jutro wstanie (wiem chociaż nie mam dowodu). Jeśli przypatrzeć się bliżej filozofii Huma to w sumie przewidział, że niektórzy ludzie będą pracowac w korpo kilkadziesiąt lat codziennie robiąc to samo - w każdym razie ...



user : jhnlocke27 is online
user : DES~TES is online
user : HumE is online
user : lbnITZ is online
user : BEKElej is online

jhnlocke27 : Widzę, że wszyscy są
lbnITZ : no było wiadomo
DES~TES : chyba,że to boty. Nie jestem pewien
BEKElej : zalogowaliście się bo ja się zalogowałem
BEKElej : pewnie was tu nie było zanim nie przyszedłem. Tego czata nie było
BEKElej : Czy program rzuca wyjątki jeśli nikt nie obserwuje konsoli?
user : HumE : o widzę, że było jarane :)?
                 |                     
                 |.|                    
                 |.|                    
                |\./|                   
                |\./|                   
.               |\./|               .   
 \^.\          |\\.//|          /.^/    
  \--.|\       |\\.//|       /|.--/     
    \--.| \    |\\.//|    / |.--/       
     \---.|\    |\./|    /|.---/        
        \--.|\  |\./|  /|.--/           
           \ .\  |.|  /. /              
 _ -_^_^_^_-  \ \\ // /  -_^_^_^_- _    
   - -/_/_/- ^ ^  |  ^ ^ -\_\_\- -  
lbnITZ :
user : HumE : Ty tak z przyzwyczajenia?
lbnITZ : nie masz argumentów to trolujesz
jhnlocke27 : Co to jest trol?
DES~TES : twój stary
jhnlocke27 : poważnie pytam?
DES~TES : twój stary
lbnITZ : JEST TU JAKIŚ ADMIN?
user : K.A.N.T is online
user : jhnlocke27 is offline
user : DES~TES is offline
user : HumE is offline
user : lbnITZ is offline
user : BEKElej is offline

"Critique of Pure Reason"

To co próbuje zrobić Kant to synteza (chociaż wtedy jeszcze nie można mówić o syntezie) obydwóch postaw : Empiryzmu i Racjonalizmu - tak aby uzyskać jeden spójny bogatszy model (choć jeszcze wtedy nie można mówić o modelach). I tutaj można chyba wziąść wziąć slajd ze standardowej prezentacji managerskiej numer 5 i użyć słowa Synergia!!

Wiedza to kombinacja faktów obiektywnych - których jako ludzie nie jesteśmy w całości w stanie pojąć - oraz subiektywnych ograniczonych obserwacji zjawisk. Obserwuję spadające jabłko czego doświadczam zmysłami ale aby zdefiniować "obserwuję" muszę założyć, że istnieje pojęcie "obserwacji" i "przestrzeni" i one musza być zdefiniowane przed obserwacją samą w sobie. (Tutaj upraszczam po swojemu)

Dwa filmiki - pierwszy Śmieszny:
Drugi dłuższy :

W sumie to o czym do tej pory pisaliśmy to był taki wstęp do głównej myśli artykułu. Pozostając wciąż w klimatach filozoficznych - pytanie czy można proces, który zaobserwowaliśmy - czyli spajanie dwóch przeciwstawnych idei uogólnić tak by opisać go poziom abstrakcji wyżej.

Tak, tutaj właśnie pojawia się synteza...

Synteza

The learner always begins by finding fault, but the scholar sees the positive merit in everything.
Georg Wilhelm Friedrich Hegel

To co Kant zrobił dla przypadku szczególnego - Hegel opisał, uogólnił i zdaje się, że to doprowadziło do powstania całej dziedziny zwanej Dialektyką

Z opisu filozofii Hegla wynika trochę, że miał on tak pokręcone teksty, że nawet nie można śmiesznego filmiku na ten temat na youtube znaleźć. Dlatego poniższy film nie jest smieszny ale wciąż przydatny. Warto z niego zapamiętać cytat : "Learn from Ideas you dislike"

Nauka pod innym kontem

  1. Rozumiem pewną ideę. Mogę bronić tej idei wzmacniajac swoje przekonanie odnośnie tejże idei.
  2. Odnaleźć przeciwstawna ideę. Zrozumeić przeciwstawną ideę.
  3. Obydwa podejścia są osobnymi perspektywami bardziej abstrakcyjnej idei.
  4. Uzupełniając luki w bardziej abstrakcyjnej idei ogarniam potęzniejszy model (chociaz wtedy o modelu nie mozna było mówić - dop. autora).

Technologia - powrót do codzienności

No dobra ale co takiego ten wywód daje nam w świecie cyfrowych cudów? Jak już jesteśmy przy filozoficznie brzmiących słówkach to przyjrzyjmy się Polimorfizmowi . Od wczesnych czytanek obiektowych młodzi adepci sztuki programowania uczą się prostych przykładów gdzie Piesek i Kotek dziedziczy ze Zwierzątka a cały koncept nazywa się Polimorfizm gdzie słówko wymyślili Grecy jeszcze zanim zaczęli wydawać więcej niż zarabiali.

To czego nie napisali lub napisali a każdy podświadomie olał bo przecież "polimorfizm to dziedziczenie" to taka kwestia, że jest kilka rodzajów polimorfizmu a dziedziczenie to tzw. "sybtype polimorphism", który jest jedynie podzbiorem koncepcji polimorfizmu jako takiej --> więcej tutaj https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

Akurat to mi zapadło w pamięć bo widziałem prezentację Rubiego gdzie ktoś się pytał
"czy jest zaimplementowany polimorfizm?
-doprecyzuj proszę
-no czy można dziedziczyć..."

Idąc dalej tym tropem w innym typie polimorfizmu - Ad Hoc Polimorphism natrafimy na koncepcję "Type Classes". Jest to coś czego w świecie Javy nie doświadczyłem a jednocześnie jest trudno do ogarnięcia dla Javowca bo ma w sobie słowo "classes" - a nie o takie klasy chodzi.

I na przykład w Scali mamy coś takiego :

List(1,3,2).sorted
//res1: List[Int] = List(1, 2, 3)
Jak zerkniemy w definicję metody sorted - wtedy zobaczymy, że przyjmuje ona jeszcze dodatkowy parametr (osławiony implicit), który określa pojęcie "Uporządkowania" dla danego typu
 def sorted[B >: A](implicit ord: Ordering[B]): Repr = {

Nie do końca byłem w stanie to zrozumieć jako mechanizm programowania funkcyjnego bo to wygląda jak standardowa strategia z Javy (jeśli odjąć to implicit). Tak jak przekazywanie komparatora do metody sort za starych dobrych czasów.To był świat OOP gdzie wszystko jest obiektem, jeden sztywny punkt widzenia. Rozwiazanie przyniosło dopiero spojrzenie z innego usztywnionego punktu widzenia FP - http://learnyouahaskell.com/making-our-own-types-and-typeclasses

Jeśli mam tak zdefiniowane dane
data DataType = Small | Medium | Big
I wywołam :
*Main> Small < Medium

<interactive>:3:7:
    No instance for (Ord TrafficLight) arising from a use of ‘<’
    In the expression: Small < Medium
    In an equation for ‘it’: it = Small < Medium
Ten bidny komputer nie wie jak to nawet do siebie porównać Ale "wzbogaćmy typ"
data DataType = Small | Medium | Big deriving (Eq,Ord) 
i Już śmiga!
*Main> Small < Medium
True
*Main> Small == Medium
False

Spojrzenie z Haskella uwalnia od narzutu powiązanego z czystą mechaniką w Scali, która do opisu konceptu "Klasy Typu" używa "mechaniki klasy OOP". W skrócie pozbyliśmy się mechaniki klas by lepiej zrozumieć istotę "Klas"!

Kiedy nastąpi synteza?

[PRZERWA NA REKLAMĘ]
Zacząłem równoległy Nowy blog pisany złym angielskim :

[/PRZERWA NA REKLAMĘ]

Idąc za tokiem myślowym Hegla mieliśmy już za sobą ekstremum obiektowości, teraz czeka nas ekstremum programowania funkcyjnego co jasno odsłoni braki tego podejścia i wtedy nastąpi zbalansowanie i unifikacja obydwu podejść rodząc nową kategorie (czy coś w tym stylu)

Innym ciekawym podejściem - choć być może niewygodnym dla tych, którzy zarabiają rysując kwadraty - jest opcja, że FP jest już syntezą wszystkich dobrych praktyk, które pojawiły się na gruncie programowania obiektowego (teretycznie większość wzorców projektowych można wyrazic przy pomocy jednego konceptu - funkcji, a Effective Java to dobry wstępniak do FP dla Javowców)

Co by się nie stało to świat idzie dalej - Red Queen Race i te sprawy - być moze za kilka lat będziemy mieli takie technologie, że bardziej będzie się opłacało zapłacić kilku kumatym ludziom by stworzyli coś zupełnie nowego niż armii utrzymaniowej - być może model wartego górę złota programisty Cobola nie powtórzy się z obecną technologią.

I w tym kontekście nauki nowych rzeczy - z tego co widziałem nauka scali idzie najgorzej ... programistom Javy - a to na skutek pewnych luk pojęciowych.Powstał pewien tight coupling do ograniczonych mechanizmów zapewnionych przez jeden język zetknięcie ze scalą jest pierwszym momentem gdy stykają się z zupełnie nowymi pojęciami (jak np. wspomniane type classes (wole nie tłumaczyć by nie wyszło, że "die hard" to szklana pułapka). nawet ktoś kto nie tykał się JVM i pisałem w F# jest w stanie szybciej skumać poprawne sposoby wykorzystania mechanizmów scali aniżeli właśnie czyści tacy rasowi OOProgramiści Javy. Być może uogólnienie wynika z tego, że znam masę programistów Java a jedynie garstkę programistów F# ;) ale z drugiej strony akurat Java 7 nie byłam najlepszym narzędziem do nauki tego co przyszło w Javie 8 i być może Java8 nie jest najlepszym sposobem na naukę tego co ma przyjść w Javie9. W sumie to Java8 też nie jest najlepszym narzędzie do nauki tego co przyszło w ... Javie8:D

I na koniec obserwacja bardzo złego podejścia do nauki jako takiej - "maksymalizacja tylko i wyłącznie tego co robię tu i teraz". W ten sposób biega się w kółko po tym samym pudełku, próbuje rozwiazywać problemy w ten sam sposób szlifując trochę parametry i jednocześnie oczekuje coraz lepszych rezultatów...