Kierunek rozwoju programistycznego

Witam,

Wiem, że było już sporo tematów odnośnie tego zagadnienia, ale jednak zdecydowana większość tych tematów dotyczyła całkiem początkujących programistów, poza tym zamierzam poruszyć parę kwestii, które raczej się tutaj nie pojawiały.

Zacznę od tego, że mam pewne doświadczenie z programowaniem i nie jestem żółtodziobem. Trzy lata temu rozpocząłem studia informatyczne, które niestety przerwałem na drugim semestrze. Teraz chcę ponownie podjąć te studia i nie ukrywam, że przez ostatnie 2 lata do czynienia z programowaniem nie miałem wiele wspólnego, bo zajmowałem się czymś innym. Pamiętam jednak sporo z tych studiów.

To, co umiem, to:

  • podstawy Turbo Pascala (to jeszcze z liceum, ale wiem, że kompletnie nieprzydatne)

  • podstawy C/C++ i Assemblera (to ze studiów)

  • podstawowy poziom PHP/MYSQL i paru innych technologii webowych (tyle że orientuję się co jest do czego wykorzystywane, mam sporą wiedzę ogólną i sporo doświadczenia w administrowaniu CMSami typu phpBB, Wordpress, vBulletin itd.)

Interesuje mnie to i bardzo chciałbym ponownie zacząć się dynamicznie rozwijać w kierunku programistycznym, jednakże mój “problem” polega na tym, że co prawda nie jestem początkującym, ale jedyną moją zaletą jest bardzo rozległa wiedza ogólna w rozmaitych tematach - niestety jest to raczej wiedza podstawowa, a nie specjalistyczna. Rozumiem istotę programowania, jak to wszystko działa, mam też pewne pojęcie o architekturze komputerów. Mimo wszystko wydaje mi się, że daje mi to dobry start do rozpoczęcia czegoś poważniejszego.

Od pewnego czasu biję się z myślami, w jakim kierunku zmierzać. Kusi mnie wiele języków i technologii, które wydają mi się ciekawe i atrakcyjne i chyba właśnie ta różnorodność jest dla mnie problemem, bo nie wiem na co się zdecydować. Nawet jak coś zacznę, to po krótkim czasie zmieniam i zaczynam się bawić czymś innym. W konsekwencji nie jestem w niczym naprawdę dobry.

Nurtuje mnie również kolejność uczenia się danych języków i technologii. Przykładowo - chciałbym zacząć programować w jakimś “normalnym” języku programowania, który jest pożądany na rynku pracy i który daje możliwości (Java, C#, Python), a z drugiej strony chciałbym też wyspecjalizować się w PHP+MYSQL, aby móc swobodnie rozwijać i modyfikować CMSa dla pewnej organizacji pozarządowej, której nie stać tymczasowo na zatrudnienie programisty. W związku z tym chciałbym zadać pytanie nr 1 - czy rozpoczęcie przygody i wyspecjalizowanie się w PHP nie zaszkodzi przyszłemu rozwojowi w innych językach programowania? WIadomo, PHP wybacza wiele, może nauczyć i utrwalić wiele złych nawyków, nie wykształcić odpowiednich metod postępowania, nie wymuszać odpowiedniego zrozumienia zagadnień programistycznych, co przełoży się na niższą efektywność w przypadku programowania w czymś innym.

Pytanie 2 - czy rozpoczęcie nauki od języków wysokiego poziomu (typu Java, C#) jest dobrym pomysłem? Czy jeśli teoretycznie chciałbym potem zejść do języków niższego poziomu (C++, C, Assembler), nie byłoby problemem? Czy nie byłoby sytuacji, w której de facto musiałbym zacząć uczyć się wszystkiego na nowo? Czy nie rozsądniej i lepiej jest zacząć rozwój w programowaniu na poważnie od jakiegoś języka bardziej niskopoziomowego, bo potem przejście na cokolwiek wyżej będzie zdecydowanie prostsze i mniej bolesne, aniżeli w drugą stronę?

Pytanie 3 - co sądzicie o równoległej nauce języków? Czy równoległa nauka paru, często bardzo od siebie różniących języków programowania, jest korzystna? Czy można na tym sporo zyskać (np. elastyczność, doświadczenie, umiejętność przełączania się między technologiami, znajomość różnic między różnymi technikami programowania), czy też stracić - bo wszystko zacznie się mieszać i w konsekwencji będziemy umieli wszystko i nic?

Oczywiście chciałbym o tym wszystkim sensownie zdecydować również uwzględniając potrzeby rynku pracy. Nie chciałbym spędzić wielu tygodni i miesięcy na naukę czegoś tylko i wyłącznie “dla sportu” - nawet jakby to było fascynujące i ciekawe, ale jednak czas to pieniądz i lepiej przeznaczyć go na coś w miarę produktywnego :slight_smile:

Z góry dzięki za wszelkie opinie i odpowiedzi.

W takiej sytuacji najlepiej zerknij na jakiś większy serwis z ogłoszeniami i sprawdź, kogo najbardziej potrzeba w twojej okolicy. Przykładowo taki Wrocław ugina się od ogłoszeń dla Javowców + sporo jest dla C#, dodatkowo tamtejsza politechnika obklejona jest ogłoszeniami dla piszących w PHP wedle wzorca MVC w oparciu o któryś popularny framework (głównie Symfony).

Strategia równoległej nauki kilku języków wydaje mi się być średnio opłacalna. Broń Boże, nie chcę cię odzierać z przyjemności, ale imo powinieneś wybrać sobie jedną wiodącą technologię, w której chciałbyś zarabiać, i właśnie ją rozwijać ze szczególnym zaangażowaniem.

Popatrz na takie ogłoszenie dla Javowca. Już nie szuka się ludzi do pisania w Javie (SE ani EE) - teraz zatrudnia się specjalistów od danego frameworka, ORM-a, ze dwóch baz danych i paru technologii towarzyszących, ewentualnie od czegoś w niższych warstwach (EJB itp.). Cała reszta jest w “Znajomość X będzie atutem”.

Kolejny wątek na tym forum, na ten temat…

Pytanie podstawowe co chcesz robić jako programista? Aplikacje biznesowe, strony internetowe, programować sterowniki itd.

Jeżeli będzie tworzył aplikacje biznesowe, strony www to taki asembler nie będzie Ci w ogóle potrzebny.

W ogóle na tym forum już jest setki na takich tematów, i nie wiem ludzie co chcecie osiągnąć przez takie pytania…

Nikt Wam nie powie -> nauczcie się tego języka i będzie zarabiać kilka tysięcy

Akurat w mieście, w którym mieszkam, studiuję i w którym chciałbym również pracować, oferty pracy dla programistów są bardzo różne. Dominuje raczej (jak wszędzie) Java, do tego są oferty C# i PHP. Zdarza się również, że szukają programistów C++ albo mobile app developers pod Androida czy iOS.

Z drugiej jednak strony, to nie zawsze to, co najpopularniejsze, musi być najbardziej korzystne. W najpopularniejszych językach jest zawsze większa konkurencja i nawet jak umiemy dobrze daną technologię, to nie wyróżniamy się specjalnie z tłumu. Za to wstrzelenie się w jakąś dobrą niszę może być o wiele bardziej opłacalne.

Problem w tym, że jeszcze tego dobrze nie wiem, bo w życiu nie napisałem żadnej większej aplikacji, nie zrealizowałem jakiegoś dużego projektu. Pewnie dopiero w praniu wyjdzie, co mnie najbardziej kręci - do tego czasu chcę jednak tak się ukierunkować, aby teoretycznie móc możliwie szybko i sprawnie przejść z jednego w drugie :wink:

Ja doskonalę zdaję sobie z tego sprawę. Nie proszę o receptę, prosty przepis na sukces, tylko o pewne wskazówki dotyczące właściwego ukierunkowania się i odpowiedniego planowania własnego rozwoju. Wiem, że do wszystkiego muszę dojść samodzielnie, ciężką pracą i nie ma jakiegoś jednego, uniwersalnego sposobu na to, jak osiągnąć swój cel.

Problem wygląda następująco - żeby dostać pracę w aplikacjach webowych, Javę/C# (+ narzędzia/frameworki) trzeba znać co najmniej dobrze. Zaczynasz od Junior Developera i jeżeli masz smykałkę, szybko się wyrobisz + zapotrzebowanie jest tak wielkie, że trudno mówić o konkurencji. Natomiast jeśli chodzi o nisze (taki C albo… Java SE ze Swingiem) - tutaj szuka się hax0rów z 10-letnim stażem pracy i to często nie do “Nowych, ekscytujących projektów”, jak to stoi w ogłoszeniach, tylko do utrzymywania napęczniałych staroci z zamierzchłej epoki. Trochę inaczej wygląda to na zachodzie, gdzie “nisza” może się też odnosić do bardzo świeżych technologii, ale i wtedy nie pracują tam nowicjusze, tylko Uncle Boby, dla których z ich doświadczeniem przyswojenie czegoś nowego to “ziuuut i gotowe”.

Jeżeli znasz różnicę między operatorami == oraz ===, i wiesz kiedy którego używać, to już jesteś lepszy niż jakieś 90% “programistów PHP”. :slight_smile:

Jeśli programując w PHP będziesz stosował dobre praktyki, a unikał tych złych, pisał obiektowo, stosował wzorce projektowe i podział na warstwy, to będziesz dobrym programistą. Z tymże, PHP zawsze będzie językiem słabo i dynamicznie typowanym, w którym trzeba stosować “stringly typed programming”, co moim zdaniem jest bardzo niewygodne w pisaniu.

W zasadzie zarówno nauka C po C#, jak i C# po C, jest nauką wszystkiego na nowo. Może pewne elementy składni są podobne, ale nawet instrukcje wejścia/wyjścia są zupełnie inne i odbywają się na całkowicie innych zasadach. A co najważniejsze, języki te mają zupełnie inną filozofię, którą trzeba zrozumieć, jeśli chce się w nich na serio programować.

Niektórzy ludzie twierdzą, że po C nauka języków wysokiego poziomu jest prosta. Problem w tym, że niektórym ludziom, którzy znają C, pisanie w C# sprawia ogromny ból. Próbują robić to bez zrozumienia i denerwują się np. na to, że w C# trzeba definiować klasy, a potem tworzyć jakieś obiekty, a przecież w C można było sobie po prostu napisać kod i działał. Potem, taki proceduralny kod napisany w języku obiektowym wygląda koszmarnie i nadaje się jedynie do wyrzucenia.

Nigdy nie uczyłem się równolegle, wydaje mi się, że osobie początkującej może się w ten sposób wiele rzeczy mieszać. Z drugiej strony, na studiach w ciągu jednego semestru nieraz przerabia się sześć języków, więc jest to wykonalne. Pytanie tylko, jakie są tego efekty. :slight_smile:

Serio? To pokaż mi jeszcze trzy tak poważne i konkretne wątki dotyczące rozwoju własnego na tym forum. Bo zazwyczaj jest albo “jaki wyprać jenzyk, żeby zarabiać miljardy $”, albo “jaki język jest najlebszy do zropienia własnego WOWa” (pisownia celowa).

Przypomniało mi się, jak kiedyś czytałem na jakimś blogu o takich programistach - którzy po wielu latach doświadczenia np. w C i innych podobnych, strukturalnych językach, nie byli w stanie przełączyć się na programowanie obiektowe - tak silnie zakorzenił się w nich ten specyficzny rodzaj myślenia, że przerzucenie się na całkowicie odmienny paradygmat programowania stawało się bardzo trudne.

Jak tak sobie myślę, to chyba największym problemem byłaby tutaj składnia - pisząc równolegle w paru językach ciężko byłoby się nie mylić i nie stosować omyłkowo elementów składni z jednego języka pisząc w drugim. Odnośnie studiów, to niestety taka już ich specyfika - nauczyć się wszystkiego po trochu, niczego dobrze. Napiszemy “Hello World!” w 10 językach, ale nie damy rady zrealizować jakiegoś większego projektu w danej technologii. Chociaż akurat moja uczelnia jest dosyć wysoko oceniana, więc mam nadzieję, że czas poświęcony na te studia nie będzie czasem całkowicie zmarnowanym.

Ogólnie to dzięki za merytorycznego i wartościowego posta :slight_smile:

to Ty pokaż choć dwa takie :smiley:

Dodane 24.07.2012 (Wt) 21:28

ja uważam, że dzisiejsze moce komputerów są tak duże, że przy wyborze języka można zdecydowanie pominąć argument “bo programy w nim pisane są szybsze” a wraz z postępem (przebiegiem czasu) moja hipoteza będzie się tylko umacniać w prawdzie. Wg mnie wybór języka zależy od środowiska w jakim chcesz tworzyć, jako, że widzę trend tworzenia dużych aplikacji w przeglądarce stawiam na PHP nawet z MySQL-em daje radę.

Sam pracuję w firmie gdzie właśnie na takim PHP z MySQLem stoi cały system CRM/WMS/ERP. Wszystko swobodnie potrafi obsłużyć jeden serwer. A patrząc na kod niejeden znawca niskiego poziomu złapałby się za głowę gdyby zobaczył ten “burdel” :slight_smile:

Szczerze mówiąc, to nie spodziewałem się aż tak bogatego i merytorycznego odzewu na moje zapytanie :slight_smile: Dzięki wam wszystkim za odpowiedzi, dało mi to dużo do myślenia.

Na początek skupię się poważnie na PHP+MYSQL (choć to głównie z potrzeby organizacji, w której działam, i możliwości wykazania się w większym projekcie na start ;)), a potem będę myślał co dalej - na pewno przekazane tutaj rady będą dla mnie nieocenione jeśli chodzi o podjęcie następnych decyzji dotyczących własnego rozwoju w tej dziedzinie.

Swoją drogą, to trochę zaskakuje mnie fakt, że znajomość PHP cały czas jest tak pożądana na rynku pracy. Niedawno nawet dostałem jakąś propozycję pracy od znajomego na FB tylko dlatego, że adminowałem jednym portalem+forum i wydawało mu się, że znam dobrze PHP - niestety musiałem odmówić.

Jak przeglądałem dzisiaj oferty pracy dla programistów w moim mieście, to większość z nich dotyczyła właśnie PHP + oczywiście rozmaite frameworki typu Zend, Symfony itd. Ciekawe kiedy to się skończy. Słyszałem, że nowe projekty już raczej rzadko stawia się na PHP - nawet jak jest praca dla programistów PHP, to głównie dotyczy ona utrzymania, konserwacji, rozbudowy i ulepszania już istniejących systemów, których nie opłaca się przepisywać na jakieś nowe technologie.

Przy wybieraniu Javy poważnie bym się zastanowił i nie pomijał argumentu zasobów komputera… A i tak najszybszy, najwydajnieszy i w ogóle naj jest ASM x,x Ale dość problematyczny :stuck_out_tongue:

Jak często widzisz ogłoszenia, gdzie ktoś szuka speca od Javy działającej nie na serwerze, a lokalnie (pomijając aplikacje mobilne)?

No, jeśli mówimy z punktu widzenia pracy, no to ta Java ujdzie, bo nadal jest popyt. A serwery jakoś ją uciągną :smiley: Ale i tak chyba lepiej wybrać coś przyszłościowego. Bo tak: teraz dopiero kolega będzie studia wznawiał, do pracy to jeszcze mu ze 3-4 lata przyjdzie poczekać, a do tego czasu to kto wie, co się stanie przy tak szybko rozwijającej się technologii.

Nie ma to jak skwitować język, na który w naszym kraju jest największe zapotrzebowanie (wszystkie rankingi + rzut oka na ogłoszenia w pierwszym z brzegu portalu) “nadal jest popyt”…

Java i C# to w dalszym ciągu najpewniejsze z punktu widzenia nauki inwestycje. Chociaż od Javy jedzie już nieco stęchlizną i co rusz pojawiają się jacyś “następcy” (Scala, Clojure, Groovy), to istnieje wręcz pewność, że w będzie się w niej klepało przez długie lata.

Języki programowania umierają długo - tak długo, jak utrzymywane są prowadzone w nich projekty. Z tego powodu ciągle można natrafić na ogłoszenie szukające specjalisty od 50-letniego COBOL-a, za zapotrzebowanie na PHP-owców ciągle nie maleje, chociaż zewsząd sypią się gromy, jaki to zły język.

Nie da się z dnia na dzień przerzucić tysięcy javowych/Csharpowych projektów na coś nowszego, więc przez dłuuugi czas będzie zapotrzebowanie na ludzi utrzymujących i rozwijających systemy. Dodatkowo choć rozwój Javy ostatnio mocno przystopował, rokrocznie powstaje masa frameworków i narzędzi wspomagających ten język, tworzonych przez firmy trzecie typu Google.

Kolejna sprawa - tak samo jak z umieraniem języki długo dojrzewają. Wspomniałem wcześniej o typowanych następcach Javy. Wszystkie można z powodzeniem wykorzystać do celów komercyjnych, jednak duże projekty, w których te narzecza odgrywają znaczącą rolę, można policzyć na palcach. Warto też spojrzeć na Pythona - świetny według mnie język, któremu jednak mimo niemałego stażu strasznie opornie idzie wejście do głównego nurtu. Tak więc imo na obecnym etapie łatwo można wytypować narzędzia, w których można lub będzie można tworzyć, ale nie da się odgadnąć, na co w przyszłości będzie popyt. Poza Javą, C# i PHP oczywiście :wink:

A o tym to nie wiedziałem, być może masz rację :stuck_out_tongue: Ciekawe czym to jest spowodowane.

A Dobreprogramy? :smiley: Jest to duży portal i do tego jeden z większych polskich. Może nie ma do roboty jakoś wyjątkowo dużo, ale nie można zaprzeczyć, że jest spory.

No widzisz, to jest ta przewaga możliwości sprzętu nad użytym oprogramowaniem.

Tzn. co konkretnie jest takie przyszłościowe, skoro nie dość dojrzała technologia z masą bibliotek i mnóstwem systemów w niej wykonanych? C++? ASM? Haskell? D? Prolog?

Ta, przez 3-4 lata przepisze się wszystko z Javy do np. Pascala. ;]

To nie język, a implementacja decyduje o szybkości. No i sam sposób kompilacji, czasem -O3 daje 5% szybsze efekty niż -O2, a -O2 czasem skraca wykonywanie programu o połowę (zależy jak bardzo nieprzyzwoicie kod jest napisany)! Tym samym przy tych samych ustawieniach clang nie dość że kompiluje o prawie połowę szybciej (40% szybciej jak testowałem llame), to czas wykonywania też był o kilka % krótszy. Ale co dziwne, przy dodaniu -march=native czas przetwarzania przez llame skompilowanego w GCC wydłużył się prawie dwukrotnie, clang nie umiał dopasować flag do mojego procesora.

A mit o powolności Javy wziął się z Javy w wersji pierwszej, kiedy jeszcze nie było Just-in-time compilera, tylko bajtokod był interpretowany. Obecnie aplikacja przy uruchamianiu jest kompilowana przez JiT z bajtokodu do kodu natywnego i uruchamiana jakby natywnie, podobnie to działa w .NET. Różnica względem C++? Góra 20%, czasem kod w Javie jest tak samo szybki jak ten w C++ z -O2 (nie mówię już o porównaniach z C++ bez -O2, gdzie Java wydaje się być demonem szybkości xD). No i sama Java wymaga więcej RAMu, więc kiedyś jak komputery miały go ledwo na tyle, żeby to działało, używanie Javy nie było zbyt rozsądne. Dziś może spokojnie zeżreć sobie 128MiB, albo i 512MiB i więcej na zapas (ma blok pamięci, którym JVM może sam zarządzać, nie prosząc OSu o przyznanie więcej co jakiś czas).

Następca Javy (jako język, nie platforma)? Scala. Moim zdaniem biblioteka Scali mogłaby być dołączona “na standardzie” z JRE, bo 8MiB to trochę dużo, jakbym chciał aplet zrobić. Oglądałem ostatnio parę prezentacji, to na prawdę świetny język.