dobry programista powinien znać bardzo dobrze przynajmniej 5 języków, aby potrafił spojrzeć na problem z różnych perspektyw.
Od lat się zastanawiam, co oznacza "dobrze" / "bardzo dobrze" znać język. Wciąż nie mam odpowiedzi, choć pomysły na definicję widziałem/słyszałem różne:
- Znać na pamięć wszystkie słowa kluczowe, składnię - raczej mało skomplikowane, pamięciówka
- Znać na pamięć bibliotekę standardową i najpopularniejsze narzędzia - co do zasady nie jest to szczególnie trudne, ale raczej czasochłonne
- Umieć wyrecytować changelogi dla N ostatnich wersji wstecz - zależy jak bardzo szczegółowe zmiany mamy śledzić - zadanie od trywialnego do ledwo wykonalnego
- Wiedzieć w jaki sposób jest kompilowany / interpretowany, jak się zarządza pamięcią, wielowątkowością, charakterystyczne mechanizmy użyte w języku etc - nabyć ogólne pojęcie jak coś działa nie jest trudno, z niuansami i znajomością bebechów kompilatora / interpretera / maszyny wirtualnej już trudniej.
- Mieć świadomość, dlaczego zostały podjęte takie, a nie inne decyzje
- Podzbiór / całość powyższych
Wydaje mi się, że poza osobami zaangażowanymi w rozwój danego języka mało kto spełnia absolutnie wszystkie te kryteria w najbardziej restrykcyjnych wariantach - chyba, że język jest bardzo świeży i jeszcze dość biedny. Być może nawet niektórzy twórcy ich nie spełniają, jak projekt się zanadto rozrośnie.
Z pewnością żadnego języka (ani jego ekosystemu) nie znam dobrze - mogę jedynie znać podstawy podstaw, a w najlepszym wypadku znać język w stopniu słabym, ale wystarczającym, by jakoś tam w miarę swobodnie go używać i nawet z nim pracować, w razie potrzeby niezdarnie zajrzeć do bebechów i nie dostać ataku paniki. Jednych i drugich będzie w okolicach 5-7, mając na uwadze że tylko w obecnej pracy w mniejszym lub większym stopniu wykorzystuję/wykorzystywałem ze 4 języki JVMowe, 2 skryptowe i Python. Plus kilka kolejnych, o które zaledwie się otarłem i nie nazwę tego nawet podstawową znajomością.
Jaką piątkę wy byście wybrali, w jakiej kolejności i dlaczego?
Bez kolejności, równorzędnie. Trochę oszustwo, bo w niektóre kategorie wpycham kilka języków
- Asm / inna niskopoziomowa reprezentacja np. LLVM IR - żeby mieć jakieś pojęcie, jak kod może wyglądać na poziomie prostych instrukcji i jak zmienia się to zależnie od np. architektury, optymalizacji
- Java - jako przykład języka
enterprajs
+ inny język JVMowy, np. Kotlin - jako przykład tego, że to samo co w Javie można napisać bardziej zwięźle i czytelnie, nie wszystko musi być pisane w trybie enterprajs OOP
, a cukier składniowy to nie tylko widzimisię. Może być też analogiczne zestawienie dla .NET pewnie też byłoby OK.
- Bash / Powershell - do pisania skryptów w powłoce systemu
- Python - w miarę ekspresywny język, w którym mogę pisać zarówno skrypty, narzędzia i prototypy, jest też w pewnej mierze zaprzeczeniem języka
enterprajs
- dowolny "egzotyczny" język - najlepiej prezentujący jeszcze inne podejścia, niż te wymienione wyżej.