Koherencja wiedzy

Mądrzy ludzie

Zagłębiając się w bibliografiach mądrych ludzi tego świata można dostrzec jedną, na prawdę zadziwiającą, rzecz. Wielu z nich, ba, większość z nich odznacza lub odznaczała się wiedzą z jednej strony głęboką, ale z drugiej strony też bardzo szeroką. Z jednej strony jest to banał, w końcu, właśnie dlatego uznajemy ich za szczególnych. Z drugiej strony można się zastanowić, jak ktoś kto miał te same 24 godziny podczas doby osiągnął wyniki diametralnie różne od innych?

Elon Musk

SpaceX CEO Elon Musk visits N&NC and AFSPC (190416-F-ZZ999-006) (cropped)
NORAD and USNORTHCOM Public Affairs / Public domain

Weźmy takiego Elona Muska. Mało kto odważy się zakwestionować jego umiejętności inżynierskie, ale z drugiej strony jest on też operacyjnym mózgiem i przedsiębiorcą stojącym za sukcesem firm takich jak PayPal, SpaceX czy Tesla. Spójrz na jego życiorys, tak na prawdę zaangażowany był w jeszcze więcej projektów!. Jeżeli spojrzymy na spektrum wiedzy potrzebnej do stworzenia tych trzech firm, branża finansowa, kosmiczna i samochodowa. To na prawdę niełatwe i niebywale zróżnicowane tematy. W jaki sposób Musk kultywuje dobre praktyki nauki? Ciekawą rzecz napisał w AMA (Ask Me Anything) jakie dał Reddit. Otóż wspomniał, że dla dla niego wiedza ma budowę drzewa gdzie dopiero gdy masz dobrze opanowane podstawy, czyli twój pień i grube gałęzie wiedzy, możesz zacząć dodawać cieńsze gałęzie i liście, nigdy na odwrót!

Leonardo da Vinci

Da Vinci Vitruve Luc Viatour
Leonardo da Vinci / Public domain

Innym przykładem może być, ikona i symbol „człowieka renesansu” czyli Leonardo da Vinci. Wystarczy spojrzeć na jego stronę na wikipedii: „włoski malarz, rzeźbiarz, architekt, filozof, muzyk, poeta, odkrywca, matematyk, mechanik, anatom, geolog”. Tak, to wszystko o jednej i tej samej osobie! To właśnie jemu przypisuje się cytat:

The noblest pleasure is the joy of understanding.

Leonardo da Vinci

Co możemy przetłumaczyć jako, „najszlachetniejszą przyjemnością jest radość zrozumienia”. Zauważ, że nie chodziło o radość wynikającą z tego, że wydajemy się mądrymi, nie chodziło o radość wynikającą z czytania, chodziło o radość ze zrozumienia!

Richard Feynman

Richard Feynman 1959
Unknown author / Public domain

Czytając książkę „Pan raczy żartować, panie Feynman!” rzuciło mi się w oczy jak wielką wagę Feynman przywiązywał do zrozumienia problemu a nie uczenia się formułek. Jak on to określił, nie można nazwać nauką przekładania jednego tekstu na drugi. Nie można nazwać nauką tłumaczenia terminu na jego definicję, bo nie prowadzi nas to do niczego co możemy potem spożytkować. Było to zwłaszcza widoczne podczas jego pobytu w Brazylii gdzie nie mógł się nadziwić tamtejszemu sposobowi edukacji i bezsensownością zakuwania formułek przez studentów. Najciekawszą w tym wszystkim jest to jak bliskie jest to moim doświadczeniom z polskim systemem edukacji.

Wjeżdża koherencja

W jaki sposób posiadając jedno życie, 24 godziny w ciągu doby, osiągnąć takie rezultaty by wszyscy uważali cię za kogoś o szczególnych umiejętnościach? Jak to się dzieje, że jedni nie mogą osiągnąć mistrzostwa w jednej dziedzinie, podczas gdy inni osiągają je w wielu dziedzinach? Jedną, chociaż na pewno nie jedyną, odpowiedzią jest silna koherencja wiedzy. Ten jeden czynnik pozwala na zastosowanie dźwigni i przekładanie efektów nauki z jednej dziedziny do drugiej.

Do słownika zaglądam rzadko 😛 Tym razem zdecydowałem się na ten krok. Co mówi SJP na temat tego czym jest koherencja?

„Koherencja – spójność wewnętrzna myśli, teorii lub ich wzajemna zgodność”. 

 https://sjp.pl/koherencja

Bardzo mi się podoba ta definicja! Problem w tym, że wydaje się nieco abstrakcyjna. Od siebie dodam jeszcze taką bardziej praktyczną:

Koherencją wiedzy możemy określić stopień w jakim nasza wiedza jest spójna i pełna. Im większa koherencja tym mocniejsze podstawy ma nasza wiedza oraz tym mniej w niej fundamentalnych braków. O wiedzy koherentnej mówimy wtedy gdy jesteśmy w stanie uczyć się poprzez wiązanie nowych faktów z wiedzą, którą już posiadamy. Traktujemy kolejne gałęzie wiedzy jako część całości a nie jako luźno powiązany zbiór faktów. Posiadamy wiedzę na temat natury rzeczy, nie tylko rozumiemy znaczenie poszczególnych elementów, ale i znamy powiązania między nimi.

Przykładowo wiemy nie tylko czym są wskaźniki finansowe takie jak P/E, CAPE czy EBITDA, ale także rozumiemy jakie są implikacje z ich zmiany. Dodatkowo potrafimy zrozumieć jak zmiany tychże wskaźników wpływają na wskaźniki finansowe przedsiębiorstw w okresie krótki jak i długim. Jesteśmy w stanie wyróżnić efekty pierwszego rzędu i efekty drugiego rzędu (eng. first-order effects and second-order effects) 

Koherencja w edukacji

Brak koherencji wiedzy to jeden z problemów dzisiejszej edukacji. Dlaczego? Obecne metody nauczania w szkołach są oderwane od rzeczywistości i praktyki. Ucząc się przede wszystkim abstrakcji w oderwaniu od praktycznej aplikacji nabywamy groźnego syndromu niespójnej wiedzy. Taka wiedza jest niesamowicie niebezpieczna z kilku powodów. Najważniejszym jest obniżenie motywacji do zdobywania nowej wiedzy. Tylko poprzez zdobywanie jednocześnie wiedzy praktycznej możemy widzieć rezultaty nauki, łatać luki w zrozumieniu konkretnych tematów i rozwijać się. To wszystko prowadzi też do złych nawyków, gdzie zdobywanie wiedzy jest celem samym w sobie i nie sprzyja umiejętności używania wiedzy.

green and black rope

Wiedza koherentna

Jakie są oznaki zdobywania wiedzy w sposób koherentny?

  1. Potrafimy wykorzystać zdobytą wiedzę w zdobywaniu praktycznych umiejętności
  2. Uczymy się znajdować analogie pomiędzy dziedzinami
  3. Przenosimy wiedzę z jednej dziedziny do drugiej
  4. Zdobywamy i rozwijamy modele mentalne  https://en.wikipedia.org/wiki/Mental_model
  5. Ucząc się budujemy podstawy na których kładziemy kolejne cegiełki dzięki czemu nie mamy do czynienia z chwiejną konstrukcją a specjalistyczną wiedzą i umiejętnościami.

W rezultacie kultywujemy zdrowe podejście w którym ciekawość prowadzi do chęci zdobywania wiedzy. Rozwijamy praktyczne umiejętności, a nauka daje rezultaty.

Black magic

Co jeżeli powiedziałbym ci, że zatrudnię dla ciebie kogoś kto pomoże utrzymać twój kod w pythonie w odpowiednim porządku? Ten ktoś zajmie się twoimi standardami. Jeżeli pracujesz w zespole programistycznym to znacznie ułatwi ci kooperację z innym, przyspieszy code review i ogolnie przyspieszy pracę. Przedstawiam Pana black https://github.com/psf/black robiącego tytułowy black magic

Początki

W najprostszym wypadku do użycia black magic wystarczy nam wywołanie prostej komendy:

black <<file name>>

Jeżeli nie masz jeszcze biblioteki to przedtem jeszcze:

pip install black

W rezultacie zobaczymy coś takiego:

Pozwoli nam na sformatowanie niechlujnego wyglądu kodu:

w coś co spełnia założone reguły:

Co potrafi Pan black?

Domyślnie black robi takie rzeczy jak:

  • standaryzacja użycia cudzysłowów
  • usunięcie zbędnych nawiasów np. z warunków if (condition):
  • usunięcie zbędnych pustych linii
  • umieszczenie argumentów wywołania funkcji, w miarę możliwości, w jednej linii
  • i wiele innych

Jak przystało na przydatne narzędzie black może być też konfigurowany tak by sprostać potrzebom ludzi pracujących z innymi standardami.

Przykładowo umieszczenie w pliku pyproject.toml:

[tool.black]
line-length = 75

zgodnie z intuicją sprawi, że nasz kod będzie przyjazny węższym ekranom:

Co jeszcze oferuje black?

  • Możesz skonfigurować integrację z systemem kontroli wersji i formatować kod przy użyciu pre-commit hooka.
  • Zignorować formatowanie części plików jeżeli nie chcesz do nich aplikować standardów
  • Użyć integracji z twoim ulubionym edytorem (Visual Studio Code, SublimeText 3, Vim, PyCharm)

Integracja z Visual Studio Code

Jako, że sam używam Visual Studio Code to pokażę, też w jaki sposób można z poziomu Visual Studio Code używać black. Wystarczy zrobić 2-3 proste czynności:

  1. Zakładam, że masz już zainstalowaną bibliotekę black. Jeżeli nie to pip install black.
  2. Do naszych ustawień visual studio code (plik settings.json) dodajemy wpis: "python.formatting.provider": "black"
  3. Za pomocą polecenia Format Document hmmm… formatujemy dokument 😉 Można też użyć skrótu Shift+Alt+F

Jeżeli chcemy w jakiś sposób sparametryzować formatowanie black’a i użyć niestandardowych ustawień formatowania, to w tym samym pliku używamy np. "python.formatting.blackArgs": ["--line-length", "90"]

Profit

Chyba nie muszę pisać ile czasu może nam to zaoszczędzić, jeżeli porównamy to z ręcznym formatowaniem kodu 🙂 

Praktyczny Powershell i ścieżki przechowywane w słowniku

Dzisiaj będzie o trickach związanych z powershell-em. Przez dłuższy czas rozważałem różne możliwości przemieszczania się po strukturze folderów.

Zlocation

O ile część problemów rozwiązuje narzędzie typu  https://github.com/vors/ZLocation i możliwość szybkiego „skakania” po folderach najczęściej przez nas używanych:  

(jak widzie sporo przyspiesza to pracę z konsolą) to w pewnych sytuacjach przydaje się jeszcze jedno ułatwienie.

Słownik

Jeżeli

  • nie pamiętamy nazwy folderu który chcemy wyszukać
  • chcemy przekazać gdzieś ścieżkę do jakiegoś naszego skryptu bądź też programu z zachowaniem elastyczności, możliwości jej późniejszej zmiany czy to na tym samym komputerze bądź też na komputerze innego użytkownika.

potrzebujemy czegoś innego. Najlepszym rozwiązaniem które do tej pory wymyśliłem to dedykowane zmienne w Powershell razem ze słownikiem, który je agreguje.

Tytułem wstępu, cały kod, który pojawia się poniżej ładujemy do naszego pliku $PROFILE w Powershell.

Przykładowo definiujemy zmienne:

$scripts = "C:\Users\g\dropbox\scripts"
$user = "C:\Users\g\"
$documents = [Environment]::GetFolderPath("mydocuments")
$projects = "C:\Projects"
$ctr="C:\projects\flashe"
$woxPluginsDev="c:\projects\WoxPlugins"
$templates="C:\Users\g\Dropbox\Scripts\Templates"

potem ładujemy je do słownika:

$paths = @{
profileDir = $profileDir;
scripts = $scripts;
user = $user;
...
}

A efekt w Powershell:

I w użyciu np:

Zmienne środowiskowe

Dlaczego nie użyć zmiennych środowiskowych?

Możesz zapytać. I słusznie. Równie dobrze możemy użyć zmiennych środowiskowych jeżeli np. dany skrypt ma działać u kogoś na komputerze. Jeśli chodzi jednak o nawigację to słownik ma 2 duże przewagi:

  1. Szybciej można użyć danej zmiennej w Powershell (tip: użyj Tab completion)
  2. Słownik może mieć tylko te wartości, których używasz na co dzień, dzięki temu nawigacja jest prostsza.

Na koniec proponuje jeszcze załadować nasze dane ze słownika do zmiennych środowiskowych, tak by rzeczywiście można było używać ich w przenośnych skryptach.

 $paths.Keys | % { [Environment]::SetEnvironmentVariable($_,$paths[$_])}

Teraz ty!

A teraz Ty, dodaj swoje ulubione ścieżki i ciesz się zaoszczędzonym czasem!