Czy powinienem nadal inwestować w struktury danych i algorytmy? [Zamknięte]

28

Obecnie dużo inwestuję w struktury danych i algorytmy i próbuję rozwiązać niektóre zagadki programistyczne.
Próbuję kodować i rozwiązywać za pomocą Java i Clojure.

Czy marnuję czas? czy powinienem więcej inwestować w technologie i frameworki, które już znam, aby uzyskać głębszą wiedzę (ins i outs) i móc szybciej z nimi pisać?

Studiując struktury danych i algorytmy, czy zamierzam zostać lepszym programistą, czy te przedmioty są ważne tylko w latach studiów?

Chiron
źródło
5
Z jakimi strukturami danych i algorytmami pracujesz? Na jakich łamigłówkach programistycznych ich używasz?
oosterwal
Pracuję / jeszcze pracuję nad tabelami skrótu, mapami, stertami, wykresami, drzewami i towarzyszącymi im algorytmami (przemierzanie, mieszanie, wyszukiwanie, wstawianie, usuwanie i niektóre algorytmy sortowania). Puzzle pochodzą z zawodów TopCoder i Google Code Jam.
Chiron

Odpowiedzi:

24

Jest całkowicie możliwe, aby spędzić większość / całą swoją karierę wykonując znaczącą, przydatną pracę, przy minimalnej znajomości algorytmów i struktur danych.

Minimalny poziom wiedzy o algorytmach i datastructures, w celu odnieść sukces, będzie wymagać, aby:

  • bądź świadomy większości z nich (w tym od czasu do czasu czytając nowe, gdy tylko wyjdą)
  • wiedzieć, gdzie znaleźć dobre, sprawdzone, działające wdrożenia
  • być w stanie porównać algorytmy i ich przydatność
  • być w stanie poprawnie skopiować jeden z przykładu typu open source do określonego środowiska, z niewielką poprawką

Nie ma * maksimum * . Jeśli chcesz, możesz przenieść swoje studia na stopień doktora i dalej. Jego przydatność jest bezpośrednio związana z rodzajem pracy, którą jesteś zainteresowany, oraz z którą pracą uważasz za najbardziej interesującą i satysfakcjonującą.

To powiedziawszy, jako szorstka (ale nie absolutna) wytyczna, im bardziej niski poziom, więcej zasobów i mniej zautomatyzowany będzie język, struktura i aplikacja, nad którymi pracujesz, tym wyższy wymagany poziom umiejętności, jeśli chodzi algorytmów i struktur danych. Na przykład, implementacja algorytmu Ukkonen w asemblerze prawdopodobnie, ale niekoniecznie, będzie oznaczać, że będziesz potrzebować zrozumienia na poziomie mistrzowskim algorytmu i struktur danych.

W konkretnej sytuacji, począwszy od środowiska programistycznego Java, aż po pracę nad IO, przy czym wszystkie inne rzeczy są jednakowe, spodziewaj się nieco większego zapotrzebowania na ogólne rozumienie algorytmów i struktur danych. Będziesz chciał mieć możliwość wydajnego działania na urządzeniu z mniejszą ilością dostępnych zasobów. Ponadto spodziewaj się, że dodasz kilka nowych kategorii do swojego arsenału - przede wszystkim będziesz chciał dowiedzieć się więcej o zarządzaniu pamięcią.

Blueberryfields
źródło
2
Stanowczo się zgadzam. Prawie nigdy nie mam do czynienia z algorytmami bezpośrednio, ponieważ ogromna większość potrzebnych jest już zawarta w podstawowych bibliotekach. Ale miałbym kłopoty, gdybym nie zrozumiał wystarczająco charakterystyk wydajności, aby wybrać odpowiedni algorytm lub strukturę dla konkretnego przypadku użycia. OP, chyba że chcesz pracować w algorytmach, możesz uzyskać znacznie, dużo , znacznie lepszy zwrot z inwestycji za czas poświęcony na naukę innych bibliotek oraz narzędzi i technik.
quentin-starin
1
Ugh, pisanie algorytmu Ukkonen w Pythonie jest wystarczająco trudne, mogę nawet wyobrazić sobie, że robię to w asemblerze.
rjzii
2
To mieści się w punkcie „porównywania algorytmów”, ale chciałem tylko wyjaśnić, że powinieneś znać kompromis między złożonością przestrzeni i czasu. Wiele algorytmów powszechnie używanych na komputerach ze względu na ich szybkość może nie być wykonalnych w systemie iOS, ponieważ wymagają dużych struktur danych.
Karl Bielefeldt
3
Nie zgadzam się. Prostym powodem jest to, że kiedy ktoś spędza czas na nauce algorytmów, projektowania lub architektury, nie chodzi tylko o to, kiedy / gdzie zamierza go użyć. To tylko sprawia, że ​​osoba jest mądrzejsza i może wykorzystać naukę do rozwiązywania innych problemów. Zachęca również do robienia rzeczy optymalnie. Na przykład może nie istnieć ręcznie wykonany algorytm do wszystkiego, ale ponieważ znasz wiele rzeczy, możesz sam stworzyć coś wyjątkowego.
Geek
14

Nie Jeśli dopiero zaczynasz, to próbujesz dostać się do dużych obrazów, takich jak programowanie interfejsu użytkownika, i takie po prostu cię powstrzymują. W końcu musisz się tam udać i nauczyć większych struktur ... jak korzystać ze struktur danych i algorytmów napisanych przez INNE osoby. Gdy dopiero zaczynasz, dobrze jest trzymać się ograniczonego zakresu.

Algorytmy i struktury danych są w zasadzie podstawą wszystkiego, nawet jeśli prawdopodobnie nigdy nie napiszesz własnego, gdy przekroczysz fazę początkową. Znając je, a przynajmniej je znając, ostatecznie staniesz się lepszym programistą. Będziesz wiedział, kiedy i po co z nich korzystać, ponieważ będziesz wiedział, JAK działają. Co więcej, uczynienie algorytmów i struktur danych ogólnymi, aby mogły one współpracować z dowolnym typem i typem z interfejsem X naprawdę JEST czymś, z czego będziesz korzystać przez resztę swojej kariery.

Widzę zbyt wielu ludzi wskakujących na takie rzeczy jak Qt, którzy w końcu zadają pytania, które pokazują zerową znajomość C ++ (na przykład). Próbują ominąć zbyt wiele kroków, a na koniec nauka zajmuje im więcej czasu. Powiedziałbym, że podążasz właściwą ścieżką.

Edward Strange
źródło
Zajmuję się programowaniem w języku Java profesjonalnie (mam na myśli to, że jestem zatrudniony) od 2007 roku. Teraz zamierzam (przynajmniej mam nadzieję) zrobić trochę rozwoju dla iOS.
Chiron
9

Nie marnujesz czasu.

Jeśli w trakcie pracy musisz użyć narzędzia lub frameworka, którego wcześniej nie używałeś, nauczysz się go i będziesz go używać.

Jeśli jednak musisz użyć struktury danych lub algorytmu, którego wcześniej nie używałeś, istnieje szansa, że ​​nawet nie będziesz wiedział, że istnieje, i rozwiążesz swój problem za pomocą okropnie nieoptymalnej techniki, która wymaga więcej wysiłek i skaluje się strasznie.

Próbuję powiedzieć, że jest to rodzaj rzeczy, których nie będziesz się uczył, robiąc to, musisz się tego nauczyć, ucząc się w szkole lub poprzez osobistą inwestycję, ponieważ robić teraz.

Carson63000
źródło
6

W praktyce pamiętaj o tym, jakie są dostępne struktury danych, jakie są ich cechy złożoności, gdzie można uzyskać ich dobre implementacje i gdzie przechowujesz swoją kopię Wprowadzenie do algorytmów, aby później sprawdzić szczegóły.

smithco
źródło
1

Jeśli to sprawia, że ​​jesteś szczęśliwy, zdecydowanie powinieneś się tego trzymać. Jeśli martwisz się, że nie stosujesz wystarczającej teorii, zastanów się nad projektem opartym na teorii. Zbuduj od podstaw mały język programowania, taki jak Eliksir . Pełna implementacja wykorzysta tabele skrótów, wykresy, drzewa i ogromną gamę algorytmów. Jeśli wydaje się to interesujące, możesz zagłębić się w optymalizację, generowanie kodu natywnego lub rozszerzanie użytkownika.

Staniesz się lepszym programistą, kiedy będziesz zainteresowany i skoncentrowany, a nie podczas pracy nad projektami, które wydają się praktyczne, ale trochę nudne.

W dół króliczej nory, Dorothy!

Scant Roger
źródło
1

Spędziłem dużo czasu hakując w C / C ++ z OpenGL. Znam języki i API wystarczająco dobrze ... i dzięki temu doświadczeniu stałem się rozsądnym programistą i programistą. To powiedziawszy, faktyczna wiedza na temat algorytmów wymagana do rozwiązania różnych napotkanych problemów, którą tak naprawdę byłam w stanie pojąć.

Mówiąc z własnego doświadczenia, koncentrowanie się na tworzeniu aplikacji będzie stratą czasu, jeśli nie znasz teorii leżącej u podstaw domen problemowych związanych z tym, co próbujesz zbudować.

W przypadku wielu różnych rodzajów oprogramowania domeny te będą wynikać z podstaw, których nauczysz się ze studiowania algorytmów, a także z ich własnej specyficznej teorii niszowej (np. Algebra liniowa w grafice komputerowej, teoria liczb / informacji w kryptografii itp.).

Niekoniecznie musisz stać się komputerowym czarodziejem za wszystkim, ale robienie tego, co robiłeś w momencie pisania tego postu, jest bardzo, bardzo potrzebną ścieżką, aby choć raz zejść na dół podczas podróży programistycznej - niezależnie od tego, czy nie są samoukami.

o pustym miejscu
źródło
0

Myślę, że jeśli nie znasz ich dobrze, nie znajdziesz powodów, aby z nich korzystać. Wydaje mi się, że cały czas znajduję dla nich zastosowania. Ale muszę przyznać, że wraz z poprawą ogólnych leków generycznych w ciągu ostatnich pół tuzina lat potrzeba tworzenia własnych pojawia się coraz rzadziej. To wciąż nie usuwa korzyści płynących z wiedzy o tym, jak i kiedy ich używać, i mogą znacznie uprościć skądinąd skomplikowany kod.

Maczać
źródło