Wpis z mikrobloga

@dedek:
Reminiscencje Twórcy Systemów cz. 10: Programowanie funkcyjne i sposób na naukę trudnych zagadnień

W pierwszej mapie (cz. 2) zwróciłem uwagę na konsekwencje obranej (nieświadomie) na początku ścieżki rozwoju. Moja droga w programowaniu wiodła przez asemblera i C, ponieważ w tych językach pisali wszyscy zawodowcy, jakich znałem. Ponadto do wizualizacji algorytmów i struktur danych wykorzystywano grafy i schematy, które łatwo się przekładały na języki imperatywne. Wiedziałem jak pracuje maszyna, więc myślałem jak maszyna. Na program składały się sekwencje instrukcji wykonywane jedna po drugiej, w każdej chwili mogłem wcisnąć w debuggerze pauzę i sprawdzić stan programu.

Taki sposób myślenia był i pozostaje wiodący wśród programistów. Wystarcza do tworzenia dobrych systemów. Jest naturalny, ponieważ wynika bezpośrednio z konstrukcji najpopularniejszych języków programowania.

Od drugiego roku studiów moje umiejętności programistyczne wykraczają już znacząco poza średnią. Na trzecim wydaje mi się, że poznałem już wszystko i teraz głównym problemem jest nauka narzędzi, w których się pracuje, a nie samej sztuki programowania. Błogi stan przerywają ćwiczenia ze Sztucznej Inteligencji, na których piszemy programy w Prologu. Piszemy to zresztą powiedziane na wyrost: dostajemy gotowe programy, w których mamy dodać kilku reguł, żeby otrzymać prawidłowy wynik. Jeśli poprawnie zdefiniujesz wszystkie reguły, program magicznie się zadzieje.

Kod programów wygląda jak starożytny manuskrypt z przepisem na eliksir. Pytam wszystkich kumatych “jak to się dzieje”, “jak to przetłumaczyć na ciąg przyczynowo-skutkowy”, ale nikt nie zna odpowiedzi. Z perspektywy czasu widzę, że gdybym przyjął inne kryteria zapytań, mógłbym dotrzeć do sedna szybciej. Nie miałem przecież problemu z SQL, ponieważ tam z założenia przyjąłem inne zasady niż w językach tłumaczonych na kod maszynowy.

Mój guru Kamil, z którym robiłem na przełomie wieków grę (ja design i grafika, on programowanie) studiuje informatykę na Uniwersytecie Wrocławskim i podsuwa mi język funkcyjny OCaml jako prostszą alternatywę dla Prologa. W OCamlu można operować tymi magicznymi listami x::xs tudzież head::tail ale jak już nie dajesz rady, możesz napisać wszystko na zwykłej tablicy z indeksami jak w C++. No i przede wszystkim widzisz deterministyczny flow. Jestem jednak tak silnie osadzony w myśleniu sekwencyjnym, że nieprawidłowo postrzegam pattern matching i gubię najsilniejsze atuty programowania funkcyjnego. Z perspektywy czasu ciężko mi już sobie przypomnieć, dlaczego tego nie rozumiałem, ale fakt jest taki, że po kilku tygodniach porzucam OCamla i wracam do C++. Do tworzenia gier nie potrzebuję funkcyjnych wodotrysków. Za dużo było tam typów, transformacji funkcji i innych “nieżyciowych” zagadnień, a za mało praktycznych zastosowań.

A jednak to programowanie funkcyjne zaważy później mocno na mojej karierze. Opiszę również metodę nauki, którą stosuję do dziś. Nie jest to nic wielkiego, zapewne wielu z was ją zna, ale wielu też nie jest jej świadomych. Otóż gdy 3 lata później zasiadłem ponownie do programowania funkcyjnego, to mój postęp w nauce był błyskawiczny. Wszystko co sprawiało mi problemy w OCamlu za pierwszym razem, rozumiałem już w sposób naturalny. Tak jakby mózg przez te lata gdzieś przepracował problemy. Z marszu przeskoczyłem wszystkie pierwotne zadania i wszedłem na poziom wyżej.

Wtedy uświadomiłem sobie, że żaden wysiłek nie idzie na marne. Jeżeli natrafiam na zagadnienie wykraczające poza mój aktualny stan pojmowania, ale wiem, że będę go w życiu potrzebował, po prostu biorę je na klatę. Czytam, próbkuję, tworzę koncepcje, nasiąkam teorią. A potem, gdy na horyzoncie pojawiają się zadania o wyższym priorytecie, porzucam naukę. Wracam do niej po tygodniach, miesiącach a czasem latach - i wtedy ten drugi start jest o wiele prostszy. Samo utworzenie zalążka nowej teorii wystarcza, by umysł zaczął przeprowadzać symulacje. Zaczynam patrzeć inaczej na nowe sytuacje, ponieważ pojawił się kolejny punkt widzenia.

Metodę tę stosuję z premedytacją od 15 lat i dzięki niej stałem się ekspertem w wielu oddalonych od informatyki dziedzinach.

#naukaprogramowania #programowanie #informatyka #programista15k #reminiscencjetworcysystemow
dedek - @dedek: 
Reminiscencje Twórcy Systemów cz. 10: Programowanie funkcyjne i spo...

źródło: comment_1587540472AC3ZRomks2LDkcZrNvepVH.jpg

Pobierz
  • 14
@dedek: Trzeba być geniuszem żeby być ekspertem w dwóch dziedzinach, a ty piszesz, że jesteś w wielu. Z tego zdania odniosłem wrażenie, że jesteś troszkę przemądrzały.
@czokobons: rozumiem. Ja interpretuję to zdanie inaczej, ponieważ zakładam bycie ekspertem w wąskich dziedzinach. Np. jeden z moich przyjaciół jest zawodowo ekspertem od rysowania, a z zamiłowania to chodząca encyklopedia muzyki średniowiecznej, barokowej, ciemnych mgławic, lornetek i teleskopów, kolarstwa, komiksu francuskiego itd. Rozumiem Twoją interpretację, choć nie wysnułbym takich wniosków czytając czyjś wywód jak był zielony i potrzebował lat, żeby opanować zagadnienia, które niektórym nie sprawiają problemów.
@LazyInitializationException: to nie jest istota tej metody. Pominąłeś ważny niuans jakim jest powrót do nauki. Metoda daje wiarę, że możesz się nauczyć rzeczy trudnych, które innych odstraszają do wystartowania, ponieważ dajesz sobie czas na przepracowanie problemu.
@LazyInitializationException: tak więc no dalej tekst jest o czymś innym. Rzuciłeś okiem na zdanie wyrwane z kontekstu, wyrobiłeś sobie opinię i dokonałeś oceny.

Pisząc "wiadomo od dawien dawna" rzutujesz własne postrzeganie na innych. To, że dla Ciebie nie ma w tekście nic nowego, nie znaczy że dla innych pewne spostrzeżenia nie są rewolucyjne. Większość ludzi zakłada, że zdolności/talent są wrodzone i przegapia szansę na rozwój i lepsze życie.
@LazyInitializationException: Metoda polega na tym, że gdy zaczynasz naukę mając blade pojęcie o temacie i masz trudności ze zrozumieniem, odstawiasz go na dłuższy czas. Kiedy po miesiącach/latach wracasz do nauki, okazuje się, że tym razem łapiesz znacznie więcej i szybciej. Stosowana świadomie daje bardzo dobre efekty, ponieważ wielu ludzi po zniechęceniu ustawia się na pozycji "to nie dla mnie", "nigdy tego nie zrozumiem", "nie lubię tego".

Jeśli to wiesz, to nie
@dedek: bardzo interesujące spostrzeżenia. Nigdy się nad tym nie zastanawiałem świadomie, ale zauważam podobne zjawisko u siebie. Zarówno w wersji długoterminowej, jak i krótkoterminowej. Długoterminowo, tak jak to opisujesz, zaś krótkoterminowo w obszarach, które już znam, ale w których konkretny problem mnie przerasta. Wtedy wystarczy, że odstawię problem, nawet na jedną noc i drugie podejście staje się tym skutecznym. Mało tego, zawsze towarzyszy mi przy tym uczucie, że ciągle, gdzieś w
@czornolisto: dokładnie, krótkoterminowo też jest taka metoda. Polega na tym, że jak nie możesz czegoś rozwiązać, to przed spaniem definiujesz pytania i w czasie snu nieświadoma część umysłu przepracowuje problem. Kiedy się budzisz, bardzo często znasz już rozwiązanie. Jak sam zauważyłeś - stosujesz to, ale właśnie uświadomienie sobie, że coś takiego robisz i to działa, daje większe możliwości, bo możesz świadomie używać metody. Zazwyczaj przepracowujemy problemy, które nas trapią. Niepokój jest