Ostatnimi czasy zarówno na devPytaniach jak i 9fingers pojawiało się podobne pytanie, wcześniej też je wielokrotnie słyszałem. Powiem więcej - sam je kiedyś zadawałem.
Na dotnetomaniaku z kolei pojawił się link do bloga, którego autor (Matthew) również dzieli się refleksjami na ten temat: link.
Zachęcam do lektury - jeśli nie czytaliście to przeczytajcie i spotkajmy się za kilka minut :).
Jestem zakałą? Krótka polemika
Skoro przytoczony post jest już przeczytany, to macie w nim przedstawiony pewien punkt widzenia. Kilka cytatów:
- "Każda osoba, która zadaje to pytanie jest zakałą informatyki". No cóż, gorsze określenia pod moim adresem padały, ale takie uogólnianie jest raczej niestosowne
- "Nigdy nie osiągnięcie przyzwoitego poziomu". Hmm... Ostatni raz z takim czarnowidztwem spotkałem się u Ferdka Kiepskiego. Może niech Autor spróbuje swoich sił w Ezo TV?
- "Nieważne jest co robisz, tylko jak. Nieważne w czym piszesz swoje programy, ważne, żebyś robił to dobrze." Częściowo zgoda - wszystko co się robi najlepiej robić dobrze... ale pytanie jest o to W CZYM te programy pisać, tak? moim zdaniem JEST to ważne
- "To, że w tej chwili coś jest modne i często wykorzystywane (jak Java i C#) nie oznacza, że będzie takie za 5 lat." Myślę, że jest dokładnie odwrotnie - popularność Javy i C# jest tak ogromna, że z pewnością za 5 lat nadal poszukiwać się będzie programistów ze znajomością tych języków. Idąc tokiem rozumowania Autora należałoby założyć, że tysiące systemów napisane w okresie popularności .NET i Java (czyli w ciągu ostatniej dekady) nagle przestaną istnieć lub zostaną napisane od zera na coś, co będzie modne za te 5 lat.
- "Może warto zainwestować trochę czasu w naukę mniej popularnych języków? Taki COBOL nadal jest wykorzystywany w bankowości (...)". No pięknie genialna alternatywa. Nie ucz się Javy! Nie ucz się C#! One są co prawda aktualnie na topie, ale ucz się COBOLa który był na topie milion lat temu!
- "słabsi studenci wybierają .net dlatego że są za słabi na robienie w czymś innym. Wybierają Windę bo nie potrafią ogarnąć Linuksa" Ten kawałek to właściwie tak rozrywkowo... nawet nie mam do tego komentarza, powaliła mnie oczywistość tego stwierdzenia:)
Oczywiście to tylko wyrywki (powyciągane spomiędzy banałów, z którymi nie można się nie zgodzić), ale chciałem się gdzieś do nich ustosunkować. A wolę tutaj niż w komentarzach, których jest już ponad 100.
I to tyle odnośnie wpisu będącego bezpośrednim impulsem mojej reakcji, przejdźmy dalej.
Mój punkt widzenia jest nieco inny.
Początki nauki
Skąd młody ambitny człowiek podchodzący do swojej przyszłości na tyle poważnie, że myśli o tym wcześniej niż większość rówieśników, ma wiedzieć od czego zacząć? Sam pamiętam swoje zagubienie, gdy przed studiami nie bardzo wiedziałem co oznacza programowanie w Turbo Pascalu, czym się różni C od C++, albo co to jest Java. O pojęciach czysto programistycznych, jak "programowanie obiektowe" czy "wzorce projektowe", nigdy nawet nie słyszałem. Zapytam więc jeszcze raz: skąd człowiek CHCĄCY poznać programowanie ma zasięgnąć porady która skieruje go ku odpowiedniej a nie głupiej decyzji?
Teoretycznie może pomóc mu w tym informatyka w szkole (średniej), jednak tam zwykle:
- uczą ludzie niemający ZIELONEGO POJĘCIA o co chodzi w programowaniu, o praktycznym doświadczeniu nie wspominając
- program nauczania narzuca określony język (pewnie najczęściej Turbo Pascala) nie wspominając że istnieje jakakolwiek alternatywa
- mało kogo tak naprawdę obchodzi cała ta "informatyka" - zarówno nauczyciela jak i uczniów; i nie jest to odpowiedni "klimat" do nauki programowania
Może też zapytać na forum poświęconemu jakiejś technologii, ale tam z kolei:
- bywają ludzie specjalizujący się w danej platformie, więc siłą rzeczy to ona będzie "tą polecaną"
- nie można liczyć na konstruktywną dyskusję - podrzucenie alternatywy kończy się pyskówką (śledzę sporo polskich stron o programowaniu i nie wiem dlaczego, ale tak po prostu jest)
Może zapytać na "ogólnym" forum programistycznym, jak właśnie devpytania czy 9fingers... i to moim zdaniem najlepsza droga (oprócz prywatnej rozmowy z kimś, kto się tym już zajmuje). Wśród ludzi z różnych środowisk bardziej prawdopodobne będzie uzyskanie wartościowej odpowiedzi/wywołanie ciekawej dyskusji. Oczywiście przy okazji można dowiedzieć się, że jest się zakałą, ale warto zaryzykować.
Ja takie pytania rozumiem tak:
"Chcę zacząć przygodę z programowaniem. Nie wiem czy chcę to zrobić dla kasy, nie wiem czy będzie to moim zawodem, nie wiem czy po pół roku mi się nie znudzi... Wiem że chcę sensownie wejść w temat i zobaczyć o co chodzi."
I jeśli na taką prośbę ktoś odpowie "ucz się COBOLa" czy Ady czy Fortrana to... Potencjalnie wysłał Zeusowi ducha winnego człowieka na wieeele godzin durnej pracy, która w praktyce najprawdopodobniej nie przyda mu się do NICZEGO. A przynajmniej mógłby te długie godziny spędzić o wiele bardziej produktywnie.
Specjalizacja
Moim zdaniem nauka dodatkowych języków programowania jest w dzisiejszych czasach nie tyle "opcją", co koniecznością. C#, SQL, HTML, CSS, JavaScript... każdy ma swoją rolę i odpowiednik każdego z nich programista musi znać. Trzeba jednak od czegoś ZACZĄĆ. I trzeba się w czymś specjalizować.
Język, który będzie naszym "numerem jeden" powinien mieć praktyczne zastosowanie - takie, abyśmy z niego na co dzień korzystali. Wszystko dodatkowe jest... no, dodatkowe. Nie należy oczywiście traktować pierwszego wyboru jak przysięgi małżeńskiej, bo zmienić później preferencje i się przekwalifikować na inną technologię powinno być w miarę łatwo. Kluczowym kryterium w wyborze powinno być postanowienie: nie podjąć GŁUPIEJ decyzji marnującej nasz cenny czas.
W przyszłości, docelowo, trzeba będzie oczywiście wiedzieć dlaczego programowanie obiektowe jest lepsze od proceduralnego. Albo do czego nadaje się programowanie funkcyjne, i jakie ma zalety. Albo czym charakteryzuje się programowanie aspektowe i jak mądrze z niego korzystać. Albo... i można tak wymieniać i wymieniać. Ale nie oszukujmy się - po co komu ta wiedza na początku drogi? Jeśli ktoś pyta o wskazówkę "jakiego języka się uczyć", to te wszystkie pojęcia nic mu nie powiedzą. Nie ma sensu się więc wymądrzać.
Nie jest tajemnicą, że na dzień dzisiejszy prym wiedzie programowanie obiektowe - i z rodziny tych właśnie języków trzeba coś wybrać.
Algorytmy...?
W kilku przypadkach spotkałem się z opinią, którą można skrócić do: "dla prawdziwego programisty język programowania nie ma znaczenia... to ALGORYTMY są najważniejsze; naucz się algorytmów i będzie cacy". Czy aby na pewno?
Po pierwsze - nie do końca wiem, co ma współczesne programowanie do algorytmów. Wykorzystywane algorytmy zostały już wymyślone, zaimplementowane, opakowane w ładne biblioteki i udostępnione. Oczywiście na studiach napisanie algorytmu może być zadaniem samo z siebie, ale i tak ma się to nijak do PRACY programisty. Nawet jeśli jakiś nowy algorytm będzie potrzebny, to poważna firma poszuka matematyka aby to obmyślił - a programiście zostanie wpisanie instrukcji w klawiaturę.
Po drugie - jakie tak naprawdę znaczenie ma znajomość algorytmów? Czy takie podejście nie jest nauką "na zapas"? W dzisiejszych czasach problemy wydajnościowe nie są spowodowane złą implementacją jakiegoś algorytmu przez programistę pracującego nad projektem. Są spowodowane nieumiejętnym zarządzaniem połączeniami z bazą danych, nieefektywnym wykorzystaniem cache, użyciem nieodpowiednich bibliotek, błędnym posługiwaniem się technologią... czyli właśnie tym wszystkim, co programista POWINIEN umieć robić. Od wymyślania algorytmów są... algorytmicy :).
Z życia wzięte:
Pisałem kiedyś aplikację, która z plików tekstowych o rozmiarach liczonych w gigabajtach musiała wygrzebać odpowiednie informacje, skonstruować zapytania SQL i wrzucić dane do bazy. Najpierw zrobiłem to "po bożemu", czyli tak, aby było "ładnie" z mojego punktu widzenia - programisty/architekta. Spodziewałem się, że na tym się nie skończy, ale w końcu "Premature optimization is the root of all evil" :). Okazało się, że całość działa zbyt długo (chociaż i tak robiła wszystko w 1/3 czasu potrzebnego na te operacje w już istniejącym systemie). Manipulacja SQLem, przejście z pojedynczych zapytań na procedury składowane a potem na bulk insert przyniosły kolejne ucięcie czasu o połowę. Ale pomyślałem, że nie zaszkodzi pobawić się i spróbować jeszcze zejść z tego czasu. I właśnie wtedy - DOPIERO wtedy - pojawił się temat jakichkolwiek algorytmów. Trochę lektury w internecie, trochę eksperymentów z GOTOWYMI implementacjami, zamiana w jednym miejscu listy na BST i czas uległ kolejnemu skróceniu o kilkadziesiąt %.
Cała algorytmiczna zabawa zajęła mi JEDEN wieczór, JEDEN raz podczas kilku lat parania się programowaniem. Czy żałuję, że algorytmy nie były dla mnie priorytetem na początkach nauki? Zdecydowanie - NIE. Jeśli chcę posortować listę to wywołuję metodę List.Sort() - a co ona zrobi pod spodem to mnie naprawdę guzik obchodzi. Sprawienie, aby metoda działała dobrze zarówno dla 10 jak i dla miliona elementów, to zadanie programisty piszącego jej implementację i umieszczającego odpowiednie informacje w dokumentacji... lub moje, gdy profiler pokaże, że należy zwrócić szczególną uwagę na ten kawałek kodu.
SuperDEV napisze wszystko w każdym języku
Można napisać wszystko we wszystkim. Dajcie mi jeden dzień a napiszę kalkulator w każdym języku programowania. Dajcie miesiąc, a napiszę w każdym proste forum internetowe.
Tylko co z tego? Czy to będzie znaczyło, że jestem dobrym programistą? A skądże znowu! Dajcie mojej babci rok, i też wam to napisze.
Podchodząc w ten sposób do programowania ograniczę się do szukania wśród wszystkich używanych języków ZBIORU CECH WSPÓLNYCH. Czyli okaleczę każdy jeden język po kolei, ucinając z niego to, co odróżnia go od reszty.
Sztuką w programowaniu nie jest pisanie WSZYSTKIEGO WE WSZYSTKIM. Sztuką jest umiejętność stuprocentowego wykorzystania potencjału drzemiącego w technologii wykorzystywanej w projekcie. Ja piszę projekty w .NET i staram się, z różnym skutkiem, wycisnąć te 100% z platformy .NET. Ktoś inny robi to w innej technologii. Ale jeśli ktoś będzie próbował wmówić mi, że w równie zaawansowanym stopniu zna i .NET, i Javę, i PHP, i Pythona, i RoR, i cokolwiek jeszcze... to nie pomyślę o nim "ale z niego super programista". W 95% przypadków pomyślę: "co on pier...?".
Oszczędźcie mi takich bzdur (ale o tym już kiedyś pisałem w poście "Technologiczny kogel-mogel. .NET vs Java vs PHP vs RoR...").
Więc... jaka jest ostateczna rada?
Byłby głupio wylać tyle wypocin na ekran i nie zakończyć faktyczną odpowiedzią na to pytanie.
Oto odpowiedź, jaką JA chciałbym dostać zaczynając dzisiaj przygodę z programowaniem i zastanawiając się co wybrać:
"Rozpoczynając naukę programowania najlepiej jest wybrać język, który nie tylko ma bardzo szerokie praktyczne zastosowanie, ale też społeczności skupione wokół portali internetowych mu poświęconych. Najpopularniejszymi na dzień dzisiejszy wydają się być C# i Java. Ucząc się ich na początku można mieć przekonanie graniczące z pewnością, że nauka nie pójdzie w las. Po kilku latach nauki i praktyki bez problemu powinno się znaleźć pracę na stanowisku programisty.
Jeśli interesują cię szybkie efekty i chciałbyś na przykład dorobić sobie kilka groszy tworząc sam proste stronki internetowe, wizytówki gabinetów stomatologicznych, informacyjne witryny o jakichś wydarzeniach itp - zainteresuj się PHP.
Zauważysz pewnie, że w liceum i na studiach naukę rozpoczyna się od Turbo Pascala bądź C. Daruj sobie - te języki pobieżnie poznasz właśnie na zajęciach. Argument bardziej merytoryczny: są to języki proceduralne, a nie ma sensu zaczynać od języka innego niż obiektowy.
Możesz spotkać się z poradami, które będą cię skłaniały do nauki języków starszych, takich jak COBOL czy Fortran. Argument: nadal używa się systemów w nich napisanych, a brakuje programistów specjalizujących się właśnie w nich. Z ich znajomością także nie powinieneś mieć problemu ze znalezieniem pracy (chociaż... cholera wie), jednak należy zdawać sobie sprawę z tego, że prawdopodobnie nie będzie to praca... ciekawa. W tych językach napisano miliony programów, które nadal ktoś musi utrzymywać. A utrzymanie systemu istniejącego od X lat nie jest zajęciem, które bym polecił komukolwiek. Najprzyjemniejsze, najciekawsze i najbardziej ambitne jest tworzenie projektu od zera. Nawet w C# czy Javie może być ciężko z taką okazją i nie można się na to nastawiać, lecz przy takich językach jak COBOL czy Fortran graniczy to z niemożliwością.
Powyżej pominąłem chociażby C++ - moim zdaniem nie jest to dobry język na początek. Nie wspomniałem też o Ruby czy Pythonie - fakt, że są to języki dynamiczne, dyskwalifikuje je moim zdaniem jako kandydatów na "pierwsze koty za płoty".
Wzmianki na temat bardziej oryginalnych języków jak Lisp, F# czy OCaml ignoruj całkowicie z czystym sumieniem - są to języki funkcyjne, którymi nie powinieneś interesować się na tym etapie edukacji.
Tak więc na koniec jeszcze raz: jeśli chcesz rozpocząć naukę programowania, to zdecyduj się na C# lub Javę. W ten sposób nie zmarnujesz czasu na naukę czegoś nieprzydatnego, a pamiętaj że na ewentualną zmianę technologii nigdy nie jest za późno".
I oto moje kilka groszy dorzucone do tematu. Thoughts?