W tym wpisie chciałbym podzielić się refleksją nad nauką innych języków programowania.

Wyjdźmy od śmiałej, choć prawdziwej hipotezy: wszystkie programy można napisać w języku C.

Oczywiście nie zawsze jest to ani łatwe ani szybkie, ale język C daje programiście dużą kontrolę nad tworzonym oprogramowaniem i pozwala na rozwijanie projektów w sposób bardziej szczegółowy. C jest językiem niskiego poziomu, co oznacza, że odzwierciedla on bezpośredni sposób działania komputera.

Po co więc zaprzątać sobie głowę nauką innych języków? Przecież techniczne możliwości języków programowania są takie same jak w języku C, a dodatkowe warstwy abstrakcji zwykle wnoszą dodatkowy narzut wydajnościowy i złożoność.

Tutaj chciałbym rzucić światło na kwestię, o której rzadko się wspomina, a którą postrzegam za najistotniejszą rzecz w nauce kolejnego języka, czyli: zmiana sposobu myślenia.

A language that doesn't affect the way you think about programming, is not worth knowing
– Alan Perlis

W gąszczu możliwości oferowanych przez nowoczesne języki, warto dostrzec przede wszystkim... ich ograniczenia. To one zmuszają nas do przyjęcia innej perspektywy.


Zmiana perspektywy jest warta dodatkowych 80 punktów IQ
- Alan Kay


Język C charakteryzuje niemal nieograniczona swoboda. Nauka języków wysokopoziomowych oznacza zazwyczaj coś odwrotnego – świadome przyjęcie ram i zasad, które zmuszają nas do zmiany podejścia do problemów. Na tym właśnie polega największa wartość płynąca z nauki innych języków.

Warto to przeanalizować na przykładzie języków C i  Clojure.

W C fundamentem jest zmienność (mutowalność) – tworzymy zmienną, a potem w pętli modyfikujemy jej wartość w pamięci. Clojure, jako język funkcyjny, całkowicie tego zakazuje. Wszystkie dane są tam niezmienne (immutability), a klasyczne pętle, jakie znamy z C, po prostu nie istnieją.

Dla programisty C pierwsza próba napisania czegoś w Clojure to ściana. Nasze dotychczasowe narzędzia znikają. Zamiast instruować komputer krok po kroku, jak ma zmieniać stan pamięci, musimy myśleć o tworzeniu danych za pomocą rekurencji lub funkcji takich jak map i reduce. Zmiana nawyków wymusza jednak narodziny zupełnie nowej intuicji programistycznej. Bogatsi o doświadczenie z Clojure, zaczniemy pisać w języku C bezpieczniejszy kod, świadomi jak ogromnym zagrożeniem jest niekontrolowane modyfikowanie zmiennych.

To właśnie dla tej zmiany perspektywy warto uczyć się kolejnych języków. Na początku bywa to przytłaczające. Nowe reguły blokują nasze dotychczasowe ścieżki myślowe, przez co nawet proste zadania stają się wyzwaniem.

Aby odnieść sukces, potrzeba czasu na zrozumienie założeń stojących u fundamentów danego języka. Dopiero wtedy zaczynamy doceniać jego architekturę i możliwości.

Znajomość wielu paradygmatów nie tylko poszerza horyzonty, ale pozwala spojrzeć na architekturę kodu z różnych stron, co z kolei przekłada się na bardziej świadomy dobór narzędzi w przyszłych projektach, łatwiejsze rozwiązywanie problemów i lepszą kontrolę nad złożonymi systemami.