Czy język obcy jest podobny do języka programowania? Co łączy tamilski, angielski i JavaScript? Czy można zastosować mechanizmy obecne w językach obcych, aby uczyć się programowania? O tym wszystkim w dzisiejszym wpisie.
Z wykształcenia jestem filologiem. Od dłuższego czasu nosiłam się z zamiarem spisania moich przemyśleń i spostrzeżeń związanych z relacją między językami obcymi a językami programowania. Połączenie tych dwóch dziedzin stało się dla mnie sposobem na życie i uważam, iż to niezwykle jak bardzo się one przenikają i są do siebie podobne. Chciałam zrobić z tego jeden wpis, ale gdy naszkicowałam jego plan, okazało się, iż strasznie tego dużo! Postanowiłam więc podzielić wszystko na części i artykuły umieszczać regularnie w nowej kategorii Okiem filologa. Znajdziecie w niej m.in. teksty o tym, czy filologowi łatwiej się koduje, jak stosować mechanizmy nauki języka obcego, aby szybciej uczyć się programowania czy o tym, jak uczyć się języków obcych.
Dodatkowo, niedługo ruszam z moim własnym kanałem na YouTube (mówię to oficjalnie zachęcona Waszymi reakcjami na tę informację podczas ostatniego live – video z live przez cały czas do obejrzenia tutaj) i jednym z tematów, które będę poruszać podczas pierwszych filmów są języki obce i programowanie. Jeszcze w kwietniu planuję też live z anglistką, która zdradzi Wam jak najlepiej ujarzmić ten język, abyście mogli skupić się na nauce kodowania. Śledźcie fanpage i czekajcie na szczegóły
Ale teraz od początku – dziś o tym, w jaki sposób języki obce są podobnego do języków programowania! Tekst na przykładzie języków obcych, które znam zestawionych z JavaScript.
Czym tak naprawdę jest język? Podając jedną z definicji tego słowa za Słownikiem PWN:
Język to sposób porozumiewania się ludzi pewnego środowiska lub zawodu oraz zapisu i przekazywania informacji w jakiejś dziedzinie wiedzy. To utrwalony społecznie zespół znaków dotyczących jakichś działań człowieka lub wyrażających jego emocje oraz każdy układ elementów rzeczywistości, któremu człowiek nadał jakąś treść.
Widzicie jak bardzo rozległa i uniwersalna jest ta definicja? Uważam, iż bardzo łatwo da się też pod nią “podciągnąć” języki programowania. Przecież język programowania to nic innego jak sposób porozumiewania się z programem. Dzięki temu on wykonuje to, co chcemy (przynajmniej w teorii;)).
Uczyłam się w życiu wielu języków obcych. Od tych “zwykłych”, jak angielski, francuski, czy niemiecki, przez orientalne (jak hindi, tamilski, chiński) po te, od których to wszystko się zaczęło (czyli łacina czy sanskryt). Gdy zaczęłam naukę JavaScript uderzyło mnie, jak wiele mechanizmów, które stosowałam przez lata przy nauce i nauczaniu języków można przełożyć na programowanie. I tym właśnie chcę się dzisiaj z Wami podzielić. Chcecie wiedzieć, co ma wspólnego tamilski, angielski czy francuski z JavaScriptem? Czytajcie dalej!
Logika przede wszystkim
Nie ukrywam, iż moją ulubioną częścią języka obcego jest gramatyka. Lubię zgłębiać zasady, dowiadywać się, jaka struktura jest wymagana, jakie powinny być końcówki, jak coś odmienić. Nie licząc wyjątków, które zdarzają się w każdym języku obcym, gramatyka jest logiczna. Wiemy, czego się spodziewać. Jesteśmy w stanie przewidzieć to, co ma na myśli komunikujący patrząc na struktury jakich użył.
Świetnym zobrazowaniem jest tutaj mechanizm aglutynacji w językach obcych. Co to takiego? Aglutynacja dosłownie oznacza “sklejanie” (więcej o samej aglutynacji możecie poczytać tutaj). Jest to jeden ze sposobów, dzięki którego tworzą się w językach obcych struktury gramatyczne. W praktyce polega to na tym, iż do rdzenia wyrazu doklejamy różnego rodzaju afiksy, które niosą znaczenie. Doklejenie konkretnego afiksu do wyrazu zawsze daje taki sam efekt – zmienia jego znaczenie w okreśony sposób. Do języków aglutynacyjnych należą m.in. węgierski, fiński, turecki czy tamilski. Jako, iż jestem indologiem, za przykład posłuży nam język tamilski.
Istnieje w nim sufiks “-il”, który doklejony do rzeczownika oznacza “w” + ten rzeczownik. jeżeli więc chcemy powiedzieć po tamilsku “w samochodzie”, musimy dokleić “-il” to słowa samochód. Samochód po tamilsku to “kār”, wiec “w samochodzie” to “kāril”. Tworzymy nowe słowo, ale dzięki tej końcówce wiemy, iż niesie ono już pewne znaczenie – to na pewno “w”. Teraz pozostaje nam odciąć tę końcówkę, aby dowiedzieć się, jakie słowo oryginalnie zostało zmodyfikowane. Znamy strukturę, możemy więc sami, analogicznie działać dalej. Jak powiedzieć “w Paryżu”? “pārisil”. Widzicie mechanizm? Oczywiście nie jest to aż tak proste, bo pojawia się kilka dodatkowych zasad. Gdy wyraz kończy się za “a”, dodajemy pomocniczen “v” przed “il”, aby łatwiej było całość wymówić. I tak “w Indiach” to będzie “intiyāvil” (czyt. “indiyawil”).
A jak to przełożyć na grunt JavaScriptu? Bardzo prosto. Weźmy za przykład tablicę, czyli array. Kiedy chcemy do zmiennej w JS przypisać tablicę, zapisujemy określone wartości w nawiasie kwadratowym. Widząc, iż coś ma nawias kwadratowy wiemy, iż jest to tablica. Kiedy więc chcemy przechować imiona naszych znajomych w tablicy, robimy tak: let names = ["Ola", "Ala", "Patryk"]; . Tworzymy zmienną i stosujemy odpowiednią strukturę. Dzięki zastosowaniu struktury, wiemy, jaki efekt uzyskamy. Wszystko jest logiczne. Teraz za każdym razem, gdy widzimy przypisanie do zmiennej czegoś, co ma nawiasy kwadratowe, wiemy, iż musimy traktować to jako tablicę. Tak samo jak z “il” w przykładzie powyżej. Co więcej, sami możemy tworzyć już tablicę, bo wiemy, jakim mechanizmem powinniśmy się kierować. Czy to nie jest logiczne?
Kilka sposobów na ten sam efekt
Kolejna rzecz, która łączy języki obce i języki programowania jest możliwość osiągnięcia tego samego efektu na kilka sposobów. Weźmy na przykład angielskie czasowniki frazowe, czyli phrasal verbs. Pamiętam, jak musiałam się ich uczyć po raz pierwszy i strasznie trudno było mi zrozumieć po co. Przecież znam już sposób jak powiedzieć, iż ktoś wyzdrowiał (“recover from”), po co mi na to kolejne wyrażenie (“get over”), które w dodatku wcale nie przypomina tego pierwszego!
Taka sama myśl pojawiła się w mojej głowie, gdy po raz pierwszy spotkałam się z funkcjami strzałkowymi (jak to uroczo brzmi po polsku!), czyli arrow functions. Uczyłam się wtedy JavaScript już ponad pół roku, a tu nagle widzę w kodzie jakieś dziwne strzałki (dokładnie takie =>). I tak się zaczęłam zastanawiać, co one tam robią. Sprawdziłam i dowiedziałam się, iż z ich pomocą tworzymy funkcje. A gdzie stare, dobre użycie słowa “function” przy deklarowaniu funkcji?
Uważam, iż ten przykład idealnie obrazuje to, jak działa użycie czegoś w prawdziwym życiu. Osoby, które mówią po angielsku naturalnie stosują czasowniki frazowe, jest to dla nich szybki sposób wyrażania swoich myśli, wiedzą, co dane struktury znaczą. Dla kogoś, kto dopiero uczy się angielskiego, to może być dość niezrozumiałe, szczególnie, iż po “rozłożeniu” tych wyrażeń na czynniki pierwsze, pojedyncze słowa znaczą coś zupełnie innego. I tak samo mamy w JavaScript. Gdy zaczynamy się uczyć, poznajemy sposób tworzenia funkcji przez użycie słówka “function”. Stosujemy to, wszystko działa fajnie. Aż tu nagle pojawia się nowy sposób, który nie jest oczywisty. Nie jest to przecież tak oczywiste, iż strzałka oznacza funkcję i musimy się nauczyć konkretnego mechanizmu użycia tej struktury, aby ją poprawnie stosować.
Niby to samo, ale coś innego
I od razu proces odwrotny, czyli mamy dwie rzeczy, które pozornie robią to samo, ale tak naprawdę się różnią i nie są w stu procentach wymienne. Jako przykład niech posłużą nam tutaj dwa słowa z języka hindi, czyli “prem” i “mohabbat”. Oba znaczą “miłość”. I wydaje się, iż można je stosować jako synonimy, ale tak nie jest. Po pierwsze, różni je pochodzenie. “Prem” pochodzi z sanskrytu, “mohabbat” z perskiego. Po drugie, różni je użycie. “Prem” występuje dziś w większości w literaturze, raczej nie w codziennym użyciu, i najczęściej oznacza miłość do boga, najczystszą formę miłości (czasem w poezji też w odniesieniu do kochanków, gdy chcemy podkreślić wielkość i czystość ich miłości). “Mohabbat” z kolei to miłość między dwojgiem ludzi, parą, małżeństwem, choć doczytałam także, iż nie zastosuje się tego słowa w odniesieniu do miłości matczynej, ojcowskiej, czy braterskiej. Różnice są więc delikatne, ale użytkownik języka je zna i stosuje słowa zgodnie z zasadami. A dla ciekawostki – w hindi mamy jeszcze kilkanaście innych słów na miłość, każde oznacza coś odrobinkę innego.
Wracając na grunt JavaScript – zmienną możemy stworzyć według standardu ES6 dzięki let lub const. Efekt jest taki sam, czyli powstaje zmienna, która pozwala nam przechowywać fragment kodu i możemy go używać wielokrotnie nie musząc za każdym razem podawać jego wartości, odnosimy się do istniejącej już zmiennej. Jest jednak różnica! Kiedy stworzymy zmienną przy użyciu let, możemy nadpisać jej wartość. Załóżmy, iż chcemy zapisać miejsce naszego zamieszkania w zmiennej myCity, piszemy więc tak: let myCity = "Poznań"; Przeprowadzamy się jednak i zmienia się nasze miejsce zamieszkania. Musimy więc nadpisać wartość naszej zmiennej, czyli zrobić tak: myCity = "Wrocław"; Świetnie! Wszystko działa. A co, gdybyśmy utworzyli tę zmienną dzięki const? Nie byłoby już tak wesoło. Oczywiście kod const myCity = "Poznań"; zadziałaby tak samo, stworzyłaby się zmienna z przypisaną do niej wartością. Jednak próba nadpisania tej zmiennej spowodowałaby błąd, ponieważ zmiennej stworzonej przez const nie możemy nadpisać wartości. To stała, która ma przypisaną wartość tylko raz. I musimy o tym wiedzieć, by dobrze stosować let i const.
Nauka na pamięć
Moim zdaniem języki obce i języki programowania łączy też konieczność nauczenia się niektórych rzeczy na pamięć. Nie wszystko da się wydedukować, czy podejść do tego na logikę. Musimy mieć wbite w głowę pewne struktury, aby się w nich sprawnie poruszać. I na nic zdadzą się tutaj krzyki i wzbranianie się! Czasem trzeba się czegoś zwyczajnie nauczyć. Oczywiście, gdy pracujemy systematycznie i dużo ćwiczymy, często ta nauka na pamięć dzieje się mimochodem. Tzn. powtarzamy coś tyle razy, iż samo nam to w chodzi w głowę. Niemniej, jest to nauka na pamięć.
Obudzona w nocy jestem w stanie wyrecytować między innymi końcówki dla drugiej deklinacji rzeczownika dla rodzaju męskiego liczby pojedynczej po łacinie (gdyby kogoś to interesowało – te końcówki to “-us”, “-i”, “-o”, “-um”, “-o”, “-e”). I tak samo trzeba się nauczyć niektórych struktur w języku programowania. W JavaScript na przykład możemy nasłuchiwać na różne wydarzenia na stronie. Załóżmy, iż chcemy wiedzieć, kiedy użytkownik kliknie na dany element i wtedy chcemy jakoś zareagować, np. pokazać mu formularz zapisu do newslettera. Aby w JS podłączyć taki “nasłuchiwacz” do elementu, musimy zastosować konkretną strukturę. Najpierw podajemy element, na którym ma wydarzyć się event, potem robimy kropkę i dodajemy metodę addEventListener. Jako pierwszy argument podajemy wydarzenie, na które nasłuchujemy – w naszym przypadku to będzie kliknięcie. Jako drugi argument podajemy funckję, która ma się wykonać. Nasz kod wyglądałby więcej tak:
element.addEventListener("click", function() {
// tu kod, który ma się wykonać
};
Jeśli podałabym najpierw kod, który ma się wykonać, a potem dopiero nazwę wydarzenia – moja instrukcja nie zadziała, bo jest niezgodna z zasadami. Program więc jej nie zrozumie. Tak samo jak z gramatyką – gdy źle odmienimy rzeczownik, mówimy coś innego niż to, co mieliśmy na myśli. Wprawdzie jest szansa, iż rozmówca nas zrozumie (w końcu rozmówca jest to bardziej złożony twór niż maszyna), jednak to, co powiedzieliśmy nie jest zgodne z zasadami.
Coś jeszcze?
To tylko kilka z mechanizmów, które zauważyłam. Mam ich całą listę i jeżeli chcecie, mogę się z Wami podzielić w kolejnych wpisach. A teraz jestem bardzo interesująca – czy są jakieś podobieństwa w językach obcych i językach programowania, które Wy zauważyliście? Czy przydają Wam się jakoś przy nauce, zarówno języka obcego jak i języka programowania? Czy raczej utrudniają sprawę? Podzielcie się koniecznie w komentarzu pod tym wpisem!