Nauka javy a sens nauki algorytmów i struktury danych

0

Hej, z góry przepraszam za być może trywialne pytanie.
Postanowiłem mocno przysiąść do javy i dopiero uczę się jej podstaw.
Trafiłem na polecany przez wielu kurs na reddicie dotyczący algorytmów (https://www.coursera.org/learn/algorithms-part1 i part2).
Czy jest sens go w ogóle przerabiać? Czy w pracy przyda się ta wiedzą aż tak, czy klasycznie- to zależy?
Czy nauka tego jest głównie pod rekrutacje, gdzie, z tego co czytałem, sporo osób lubi o to pytać?
Czy jednak olać to i czas poświecony na ten kurs przeznaczyć na coś innego?
Dzięki za wszelakie odpowiedzi.

2

Ucz się dalej javy, algorytmy zrób później. Praca opiera się na tworzeniu aplikacji/baz danych a nie na klepaniu mergsorta, zrób sobie protfolio, pójdź na rekrutacje i zobacz o co pytaja i czego ci brakuje i tego się douczaj. Gdzieś w tle możesz robić sobie ten kurs ale nie zniechęcaj się nim, algorytmy bez silnej motywacji do poznania ich sa bardzo niewdzięcznym i nudnym tematem..l;

2

@bagietMajster:

Jasne
Przecież żadnemu chirurgowi na rozmowie kwalifikacyjnej nie każą zbudować płuca i klatki piersiowej, on ma tylko w praktyce brać te żelazne rzeczy i wykonywać cięcia.

Z perspektywy "kilku" lat w zawodzie.

  • strasznie rzadko wykonywałem coś dokładnie na bazie "algorytmów i struktur" ze studiów
  • ale byłbym ogromnym kaleką gdybym tego starannie nie poznał. Tamta wiedza prowadzi do płynności użycia WŁAŚCIWYCH struktur i algorytmów, nawet jeśli sa dane gotowe. Byłbym jak programista borlandowy, który jedyną strukturę danych jaką zna, to hidden StringGrid na formatce i global int

Co do poznawania języka. Nie wyobrażam sobie naprawdę głębokiego poznania języka bez przepracowania dużej ilości algorytmów o skali złożoności większej niż codzienna paszczyzna

0
AnyKtokolwiek napisał(a):

@bagietMajster:

Jasne
Przecież żadnemu chirurgowi na rozmowie kwalifikacyjnej nie każą zbudować płuca i klatki piersiowej, on ma tylko w praktyce brać te żelazne rzeczy i wykonywać cięcia.

Z perspektywy "kilku" lat w zawodzie.

  • strasznie rzadko wykonywałem coś dokładnie na bazie "algorytmów i struktur" ze studiów
  • ale byłbym ogromnym kaleką gdybym tego starannie nie poznał. Tamta wiedza prowadzi do płynności użycia WŁAŚCIWYCH struktur i algorytmów, nawet jeśli sa dane gotowe. Byłbym jak programista borlandowy, który jedyną strukturę danych jaką zna, to hidden StringGrid na formatce i global int

Co do poznawania języka. Nie wyobrażam sobie naprawdę głębokiego poznania języka bez przepracowania dużej ilości algorytmów o skali złożoności większej niż codzienna paszczyzna

A myslisz, ze jest sens uczyć się tego zagadnienia porządnie jeszcze przed podjęciem pierwszej pracy czy tą wiedzę warto zdobyć już później?

6

Rozumienie struktur danych to bezwzględna podstawa jeśli chcesz pisać dobry i wydajny kod. Algorytmy się przydają natomiast ich znajomość "z palca" jest znikoma, bo na 99% w pracy nie będziesz musiał tego pisać, bo większość języków ma już odpowiednie do tego biblioteki. Jedyna przydatność to rekrutacje, gdzie nadal jest to jeden z etapów (bezsensownie).

0

A myslisz, ze jest sens uczyć się tego zagadnienia porządnie jeszcze przed podjęciem pierwszej pracy czy tą wiedzę warto zdobyć już później?

Tak, nigdy nie będziesz miał więcej czasu i energii.

czy ma sens?

W firmie w której pracuje nie przeszedł byś innej rekrutacji niz juniorska.

Złożoność obliczeniowa i zielone pojecie o notacji dużego O to konieczność.
Znajomośc podstawowych struktur danych i ich wydajności w notacji duzego O to konieczność.

Pada argument ze w pracy się z tego nie korzysta i algorytmów się nie implementuje. To tylko częściowa prawda. Bardzo ale to bardzo często korzysta się z tej wiedzy nie wprost, listę 2 kierunkową użyłem moze 2 razy przez ostanie 5 lat, ale kod w którym jeden obiekt referuje drugi, a ten drugi pierwszy kolejny itd. pisałem dziesiatki razy i nie wiem ile razy używałem istniejącego. Podobnie jest z grafami, drzewami(te są wzglednie czeste btw.), algorytmami przeszukiwania. Raczej nie trafi Ci praca na tych strukturach w akademickim znaczeniu, ale prace na nich nie wprost będziesz miał niemal zagwarantowaną, bo cos ma referencje do czegoś i do czegość i w praktyce okazuje drzewem, listą, grafem itd.
Ustrukturyzowana wiedza w takich przypadkach sie przydaje, bo zamiast wymyślać koło na nowo, znasz rozwiązania, możliwości i ograniczenia.

Jednym z większych plusów tej wiedzy, że jest to ze nie będziesz popełniał błedów charakterystycznych dla noobów, będziesz umiał rozwiazywac 3/4 problemów z performacem. Nie będziesz robił tego tak powszechnego błedu, że przekazujesz słownik list, albo liste słowników, albo liste list list albo masz miliona metod AddDiagnostic, AddMember, ClearMember, ClearDiagnostic na złym poziomie abstrakcji lub duplikowanych w 8 klasach bo nikt Ci nigdy nie powiedział ze możesz napisać własną strukturę danych, która spełnia w 100% twoje potrzeby.

0

Raczej większość osób ogarnia dobrze algorytmy, a to jest wierzchołek góry lodowej, ale też podstawa bo bez sensu np. przechodzić 2-3 razy po jakiejś strukturze jak np. można zrobić w jednym przejściu lub nawet jego logarytmie co do ilości elementów.

Programy można jeszcze bardziej przyspieszyć, ale to już trzeba wiedzieć ile wynosi cache line i jak struktury danych i algorytmy na nich projektować, żeby dane mieściły się w poszczególnych levelach cache, a dodatkowo były alignment i używały najnowszych intrisics instrukcji SIMD dodatkowo uwzględniając architekturę procesora i wersję.

Między juniorem, expertem, a hackerem jest kompletny rozstrzał umiejętności.
Jak będziesz zaniedbywał takie rzeczy to będziesz kompletnie niewydajnie kod pisał nieświadomie.

1
intoit napisał(a):
AnyKtokolwiek napisał(a):

A myslisz, ze jest sens uczyć się tego zagadnienia porządnie jeszcze przed podjęciem pierwszej pracy czy tą wiedzę warto zdobyć już później?

_flamingAccount napisał(a):

A myslisz, ze jest sens uczyć się tego zagadnienia porządnie jeszcze przed podjęciem pierwszej pracy czy tą wiedzę warto zdobyć już później?

Tak, nigdy nie będziesz miał więcej czasu i energii.

To prawda z tą energią, Na studiach zrobiłem "coś" (znacznie przekraczające program studiów) w jednym języku.Nigdy nie udało mi się, mimo 2-3 krotnego restartowania, zrobić tego drugi raz w innym języku w latach pracy, mimo dużo większego doświadczenia itd...

Dodał bym.
Wiedza typu bazowego, fundamenty, jak już przystępujesz do pracy, ma być lekko zakurzona, trochę zapomniana z pamięci świeżej, zinternalizowana, przekształcona w intuicję. Chirurg podczas operacji nie posiada wiedzy koniecznej do zdania egzaminu na 1. roku, nie zdałby go - ma to przetrawione gdzieś w środku.

Wiedza być zweryfikowana w paluchach (również przez błędy projektowe wiedziałem teoretycznie ale źle wybrałem praktycznie). Skonfrontowana z innymi źródłami. Moze źródło A (książka / kurs) miało luki, albo miałem kiepskie dni i źle przetrawiłem rozdziały 7,8 i 9, ale skorygowało to źródło B
Stanięcie nagle podczas pracy wobec duzej dawki nie ułożonej wiedzy teoretycznej , niewiele daje.

0

Okej, dzięki Wam za wasze opinie/rady. Będę dalej uczył się podstaw a w międzyczasie obejrzę sobie ten kurs i go również przerobie.

1

Ten kurs to naprawdę to minimum minimów, które powinieneś znać, więc się nie zastanawiaj. Do algorytmów w Javie, masz również: https://algs4.cs.princeton.edu/home/

0
intoit napisał(a):

Czy jest sens go w ogóle przerabiać? Czy w pracy przyda się ta wiedzą aż tak, czy klasycznie- to zależy?

W javie wszystko jest obiektem więc zamiast struktur danych masz tam jakieś fancy name które w teorii coś tam niby odzwierciedlają (np. List vs Array vs Hashmap vs whatever) ale ogólnie to pozostałość z czasów gdy Java chciała przekonać do siebie programistów C++. Dziś do tego używa się profilera a pytania o powyższe stosuje się by się pośmiać z kandydata na rekrutacji.

Co do algorytmów - w tej branży wszystko jest algorytmem więc uczysz się w pracy.

2

Przyda się:

  • umiejętność myślenia, wyciągania wniosków, operowania abstrakcją, umiejętność dzielenia problemu na mniejsze części - tutaj jeśli jesteś kumaty, to i bez algorytmów to ogarniesz. Jak jesteś średniokumaty, to algorytmy mogą pomóc. Jak jesteś niekumaty, to i algorytmy nie pomogą, bo ich zwyczajnie nie zrozumiesz. Podobnie ma się rzecz z wzorcami projektowymi.
  • znajomość podstaw, żeby nie wyważać otwartych drzwi. Jak będzie apka ci zamulać przy dużej ilości danych, to bez znajomości podstaw nie będziesz miał nawet pomysłu, jak ją sensownie zoptymalizować. A jak będziesz znał podstawy, to będziesz wiedział, czego szukać, nawet jeśli użyjesz gotowej implementacji to będziesz wiedział, że np. w tym przypadku opłacałoby się użyć jakiegoś drzewa, hashmapy czy innej struktury danych odpowiedniej do tego, co będziesz akurat pisał.
  • jeśli będziesz chciał napisać coś bardziej ambitnego, to przyda się większa wiedza o algorytmach, ale zakładam, że to nie jest ten przypadek i że nie masz takich ambicji.
2
loza_prowizoryczna napisał(a):

W javie wszystko jest obiektem

No nie.
Dopiero w C# ta idea jest pogłębiona (być może do 100%, zależnie od punktu widzenia)

3

@loza_prowizoryczna:

coś tam niby odzwierciedlają (np. List vs Array vs Hashmap vs whatever)

No nie, np. HashMap i TreeMap dobrze odzwierciedlaja róznice.

2
lion137 napisał(a):

@loza_prowizoryczna:

coś tam niby odzwierciedlają (np. List vs Array vs Hashmap vs whatever)

No nie, np. HashMap i TreeMap dobzre odzwierciedlaja róznice.

Z tymi HashMapami i TreeMapami to ciekawa sprawa, dla mnie ciekawa bo budzi parę wspomnień ze studiów.

  1. Odnośnie TreeMap to iż tam są zrównoważone drzewa czerwono czarne, że są transformaty które powodują iż drzewo zawsze jest zrównowazone
  2. Odnośnie HashMap iż są tablice i funkcje hashujące, że tablica powinna być pełna max na 90% bo później jest za dużo kolizji (chodziać dziś to już chyba nie prawda bo w Javie używa sie Hashmap które zawierają TreeMap XD)

A w praktyce?

  1. Zawsze nalezy używać HashMapy bo jest szybsza, no chyba że chcemy mieć kolejność to TreeMapy
  2. Dla haszmapy trzeba dobrze zaimplementować hashcode i equals - w zasadzie problem nietrywialny dla modyfikowalnych obiektów XD
  3. Dla TreeMapy trzeba jeszcze caimplementować combarable
  4. trzeba pamiętać iż HashMap jest liniowe jeśli chodzi o czas, a TreeMap - logarytmiczne

PS tak, wiedza o pisaniu funkcji haszujący mi się jeszcze nie przydała, ani niestety nie miałem potrzeby implementacji własnych drzew czerwono czarnych :( Może kiedyś, może jeszcze

UPDATE co to ja chce przekazać, do końca to nie wiem XD ogólnie inna wiedza jest potrzebna o algorytmach jak samemu implementujesz swoją bibliotekę kolekcji a inna jak chcesz wydajnie używać istniejącej biblioteki kolekcji

0

Zawsze nalezy używać HashMapy bo jest szybsza,

PEwnie tak, chociaż mnie uczono :) że złożoność tych operacji hash mapy jest prawie stała (approximately constant), tzn. czasem, możemy trafić na liniową; i jak nam wystarcza O(logn) to można sobie wziąć TreeMap

1
lion137 napisał(a):

Zawsze nalezy używać HashMapy bo jest szybsza,

PEwnie tak, chociaż mnie uczono :) że złożoność tych operacji hash mapy jest prawie stała (approximately constant), tzn. czasem, możemy trafić na liniową; i jak nam wystarcza O(logn) to można sobie wziąć TreeMap

Na liniową już nie trafisz bo w kubełkach HashMapa w Javie nie używa już list tylko drzewa, więc prawie zawsze będzie stała a jak wszystkie elementy mają ten sam hashcode to będzie logarytmiczna

1

A widzisz, stary jestem to i ze starych ksiażek się uczyłem 😉

2
KamilAdam napisał(a):

Na liniową już nie trafisz bo w kubełkach HashMapa w Javie nie używa już list tylko drzewa, więc prawie zawsze będzie stała a jak wszystkie elementy mają ten sam hashcode to będzie logarytmiczna

Ciekawe jak?
Założenie: Elementy zwracają hashCode stale równy 1. Jak drzewo coś zmienia przy wyszukiwaniu? (zakładamy, że elementy różnią się przy equals).

1
jarekr000000 napisał(a):
KamilAdam napisał(a):

Na liniową już nie trafisz bo w kubełkach HashMapa w Javie nie używa już list tylko drzewa, więc prawie zawsze będzie stała a jak wszystkie elementy mają ten sam hashcode to będzie logarytmiczna

Ciekawe jak?
Założenie: Elementy zwracają hashCode stale równy 1. Jak drzewo coś zmienia przy wyszukiwaniu? (zakładamy, że elementy różnią się przy equals).

5.3. Collisions

For this to work correctly, equal keys must have the same hash, however, different keys can have the same hash. If two different keys have the same hash, the two values belonging to them will be stored in the same bucket. Inside a bucket, values are stored in a list and retrieved by looping over all elements. The cost of this is O(n).

As of Java 8 (see JEP 180), the data structure in which the values inside one bucket are stored is changed from a list to a balanced tree if a bucket contains 8 or more values, and it’s changed back to a list if, at some point, only 6 values are left in the bucket. This improves the performance to be O(log n).

https://www.baeldung.com/java-hashmap#collisions

Czyli to nie działa na równe hashcode'y tylko na kolizje. Ale co się dzieje jak hashcody są takie same? Albo są 4 takie same a cztery różne, to która struktura jest wybierana?

A to tylko prosta HashMapa XD

2
jarekr000000 napisał(a):

Założenie: Elementy zwracają hashCode stale równy 1. Jak drzewo coś zmienia przy wyszukiwaniu? (zakładamy, że elementy różnią się przy equals).

W takim wypadku masz jeden kubełek pod którym jest zwykłe drzewo ala TreeMap

0
KamilAdam napisał(a):

PS tak, wiedza o pisaniu funkcji haszujący mi się jeszcze nie przydała, ani niestety nie miałem potrzeby implementacji własnych drzew czerwono czarnych :( Może kiedyś, może jeszcze

Przydałaby się gra do tego. Tj. zrobić grywalizację, ładne animacje i budujesz tam swoje drzewa za pomocą skryptu (i jakieś wygodne API do tego) i widzisz jak się animują. A potem osiągasz jakiś cel (np. znalezienie wartości w drzewie) i leci animacja punktów.

Wtedy to ludzie sami by chcieli to pisać dla rozrywki.

0

Na samym starcie nauka algorytmów nie jest Ci niezbędna, nauka struktur danych już bardziej aby znać charakterystykę list, setów, tablic itp (ale też nie na jakimś mega zaawansowanym poziomie typu jak jest zaimplementowana hashmapa w javie).

0

Lepiej się naucz jak tworzyć nowoczesną elektronikę czy jakieś nowe systemy operacyjne, może progamowania FPGA, ewentualnie Asmebler. Programowanie w Javie zaraz przejmnie AI.

1

Lepiej się naucz jak tworzyć nowoczesną elektronikę czy jakieś nowe systemy operacyjne, może progamowania FPGA, ewentualnie Asmebler. Programowanie w Javie zaraz przejmnie AI.

Powala mnie że proponowana jest każda możliwa metoda nauki programowania poza tą najprostszą. Zamiast pisać FizzBuzz na 100 sposobów, lub kolejnej kopi sklepu, można napisać liste kierunkowa, liste, hasmape, drzewo i podstawowe algorytmy na nich. Nie dość że pieczesz dwie pieczenie na jednym ogniu, to z pewnego punktu widzenia to prostsza droga, dostaniesz bardzo wyraźny feedback czy twój kod jest dobry czy zły. Algorytm albo zadziała lub nie. FizzaBuzz lub sklep nie posiadają takiej jednoznaczności.

1

Popeniłem krótki wpis na temat użyteczności algorytmów i struktur danych https://open.substack.com/pub/zatrudnialnydev/p/jak-algorytmy-i-struktury-danych?r=1i12pv&utm_campaign=post&utm_medium=web

TL;DR;

Znajomość i zrozumienie tych podstaw pozwoli Ci:

  • Uniknąć prostych pułapek z wydajnością 💡
  • Rozwiązywać problemy w ustrukturyzowany sposób 🧩
  • Wykorzystywać gotowe rozwiązania 🛠️
  • Lepiej komunikować się ze współpracownikami 🗣️

1 użytkowników online, w tym zalogowanych: 0, gości: 1