Czy muszę rozumieć algorytmy i struktury danych, aby nazywać się programistą? [Zamknięte]

37

Minęło sześć lat, odkąd koduję. Kodowanie we wszelkiego rodzaju rzeczach, takich jak ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP itp. Korzystałem z tablic, map, powiązanych list, zestawów itp. I wszędzie tam, gdzie pracowałem, ludzie tacy jak ja. Ale za każdym razem, gdy przeprowadzam wywiad, bardzo prawdopodobne jest, że ludzie zadają mi pytania dotyczące skrótów, drzew, stosów i kolejek. Niektóre pytania dotyczą żonglowania algorytmami sortowania. Nie wiem, czy naprawdę powinienem je znać, czy powinienem przestać nazywać się programistą. Jest we mnie coś, co mówi mi, nawet jeśli ludzie, którzy zadają wszystkie te pytania, wybiorą mnie, nigdy nie zmuszą mnie do pracy nad tymi rzeczami. Czy naprawdę muszę to wszystko wiedzieć?

Sushil Bharwani
źródło
10
To zależy od tego, gdzie pracujesz i kogo chcesz nazwać programistą.
Tim
1
Tak, jeśli bez żadnych przymiotników.
duros

Odpowiedzi:

79

Jeśli wszystko, co wiesz, jak napisać kod kleju, możesz nazwać się małpą kodu. Trzeba napisać dużo kodu kleju i możesz zarabiać jak małpa. Aby nazywać się Real Programmer TM i mieć zaufanie, gdy kod musi być napisany od zera, musisz znać algorytmy, struktury danych, zarządzanie pamięcią, wskaźniki, język asemblera itp. Oraz zrozumieć, jak wykorzystać tę wiedzę do oceny kompromisów.

dsimcha
źródło
6
Wow, w połowie oczekiwałem, że zostanie to zlekceważone przez zbyt przesadnie poprawnych politycznie ludzi za używanie terminu „małpa kodowa”.
dsimcha
15
„simian oprogramowania” jest zawsze preferowaną terminologią
STW
3
Nie do końca się zgadzam. Rodzaj oprogramowania pisanego „od zera” ma duży wpływ na to, kto jest w stanie go napisać. Niektóre oprogramowanie wymaga z natury mniej (lub więcej) wyrafinowania niż inne.
Nick Spreitzer,
8
+1, 20%, ponieważ się zgadzam, 5% z powodu „Real Programmer TM”, a 75%, ponieważ nauczyłem się języka asemblera i chcę udawać, że było to warte bólu
Carson Myers
3
Większość istniejących zadań wymaga tylko „małp kodowych”. To normalne, że ludzie pracujący w „małpach kodowych” zwykle zapominają o całej swojej wcześniejszej wiedzy, przez co stają się coraz bardziej „małpami kodowymi” każdego dnia, pomimo swojego potencjału. :(
cag
32

ci, którzy nie znają historii, skazani są na jej ponowne opracowanie

Steven A. Lowe
źródło
75
W rzeczywistości ci, którzy nie znają historii, są skazani na ponowne opracowanie jej przy użyciu metod O (N 2) lub O (N 3) zamiast stosowania dobrze znanych metod O (N log N), które są wystarczająco duże, aby kupić alkohol w całości 50 stany.
John R. Strohm,
@John ROFLMAO - zbyt prawdziwe!
Steven A. Lowe
3
.... skazani na
30

Cóż, praca w języku takim jak JavaScript sprawia, że ​​jest to dość przestarzałe, ponieważ tablica jest mieszanką wektora, skrótu i ​​drzewa i może być używana jako stos lub kolejka. Jest bardzo mało prawdopodobne, abyś kiedykolwiek musiał lub był w stanie zaimplementować strukturę danych w JavaScript, która przewyższa klasę Array. Dotyczy to również PHP.

W przypadku Java OTOH istnieje różnica. Podejrzewam, że standardowa biblioteka Javy zawiera informacje o każdej strukturze danych, której potrzebujesz. Jednak:

  1. Musisz znać i rozróżniać te struktury danych oraz rozumieć ich działanie w różnych sytuacjach, abyś mógł wybrać właściwą.
  2. W Javie nie jest absolutnie mało prawdopodobne, że w końcu będziesz chciał napisać własną implementację, aby uzyskać skrót w niektórych bardzo szczególnych przypadkach (na przykład, jeśli klucze, które chcesz obsłużyć, spełniają specjalne ograniczenia, które pozwalają na optymalizację).

Jeśli chodzi o algorytmy sortowania, nie trzeba ich zbytnio znać ani rozumieć, ponieważ nie ma potrzeby, aby wdrażać je samodzielnie. Jeśli jednak otrzymasz taki algorytm, powinieneś być w stanie go zrozumieć i wdrożyć.

Dwie rzeczy są pewne:

  1. Państwo może zrobić karierę jako programista nie opierając się na wiedzy, jak ten.
  2. Na pewno nie zaszkodzi ci je poznać.

Struktury danych i algorytmy są po prostu rzeczą, którą dobrze zrozumieć. I jest to coś niezwykle jasnego i sformalizowanego, a zatem dość trywialnego w porównaniu do zawiłości aplikacji lub inżynierii systemów. To tylko jeden mały element układanki, ale łatwo je uchwycić - jeśli chcesz zainwestować trochę czasu.

Więc nie, nie potrzebujesz ich, ale znajomość ich byłaby tylko dla twojej korzyści .

back2dos
źródło
13

Może to być okazja, gdy może istnieć semantycznie znaczące rozróżnienie między „programistą” i „inżynierem oprogramowania”. W tym kontekście w szczególności widzimy, że znasz kilka języków programowania i powiązanych technologii oraz że możesz ich używać do uzyskiwania pożądanych rezultatów. Jest to doskonała operacyjna definicja „programisty komputerowego”.

Uważam się za inżyniera oprogramowania. W większości codziennych aspektów mojej pracy prawdopodobnie robię te same rzeczy, co ty. Używam języka komputerowego i powiązanych technologii, aby uzyskać pożądany rezultat. Jednak rozumiem struktury danych i algorytmy i uważam, że ta wiedza jest fundamentem mojej zdolności do robienia znacznie więcej.

Często - choć nie zawsze - moja praca polega na znalezieniu rozwiązania złożonych problemów, dla których nie ma oczywistych rozwiązań, nic, co nie jest bezpośrednio rozwiązane przez cechy używanego frameworka lub możliwości języka, w którym pracuję z. W tym muszę przeanalizować problem i opracować rozwiązanie, a czasami ten proces przechodzi w sferę architektury na dużą skalę.

Chociaż doskonałe zrozumienie tych głębszych problemów jest konieczne do wykonywania tego rodzaju pracy, nie jest wystarczające . Innymi słowy, sama wiedza o tym, jak działa tabela skrótów lub dlaczego typ stosu ma zwykle dobre parametry wydajności, nie wystarcza, aby zostać architektem systemu lub starszym inżynierem. To logiczne miejsce rozpoczęcia, z którego możesz zacząć kopać głębiej i podróżować szerzej, a także zdobyć doświadczenie niezbędne do rozwiązania większych problemów.

Przypuszczam, że aby odpowiedzieć na twoje pytanie, powinieneś zadać sobie pytanie: „Kim chcę być? Gdzie pójdę z moją karierą?” Jeśli jesteś zadowolony z kontynuowania tego, co robisz, możesz po prostu nauczyć się wystarczającej liczby struktur danych i algorytmów, aby przejść przez w dużej mierze arbitralne pytania, z którymi masz do czynienia.

Jeśli chcesz rozwijać się w swojej karierze i masz do tego niezbędną pasję, powinieneś objąć te tematy tak ściśle, jak to możliwe. Jeśli masz trochę czasu, aby nad nimi popracować, otwarty umysł i prawdziwy entuzjazm, znajdziesz wspaniałe i ekscytujące rzeczy. Nigdy nie zapomnę dnia, w którym po raz pierwszy zrozumiałem Quicksort. Uczucie podniecenia i odkrycia wyznaczyło kierunek na resztę życia i nie mogłem być za to bardziej wdzięczny. Teraz nie wyobrażam sobie robienia niczego poza pracą jako inżynier oprogramowania.

Życzymy powodzenia z tym, co wybierzesz.

Adam Crossland
źródło
2
Zawsze są oczywiste rozwiązania. Po prostu przestają działać, gdy zmieniają się wymagania;) Nie sądzę, aby dogłębna znajomość algorytmów i struktur danych była prawdziwym warunkiem dobrego inżyniera oprogramowania. Po prostu rzadko go brakuje, ponieważ to, co ma dobry inżynier oprogramowania, jest niezaspokojonym pragnieniem wiedzy.
back2dos,
+1 Dobrze sformułowane „Przypuszczam, że aby odpowiedzieć na twoje pytanie, powinieneś zadać sobie pytanie:„ Kim chcę być? Gdzie pójdę z moją karierą? ”
Bill
12

To zależy od tego, do czego służą zadania. Tego rodzaju rzeczy są dość standardowymi pytaniami do rozmowy kwalifikacyjnej, ale są również dość niewyobrażalne i prawdopodobnie nie odnoszą się w ogóle do pracy - z pewnością nie są pracą wykorzystującą wymienione technologie.

Dla mnie w miarę przesłuchiwania pytań, są one w stanie ocenić, czy zrobiłeś stopień informatyki (i pamiętasz go), a nie jakąś miarę ogólnej umiejętności programowania lub wiedzy.

Sugeruję, abyś albo nauczył się tego, aby przejść przez wywiad, albo po prostu akceptujesz, że nigdzie nie zadajesz takich pytań, ale nie, nie musisz ich znać, aby nazywać się programistą.

Jon Hopkins
źródło
1
dzięki za odpowiedź. Podzielę się z Wami zabawnym wywiadem. Ludzie, którzy mnie przeszukali, potrzebowali kogoś, kto byłby dobry po stronie Interfejsu Użytkownika, używając JSS CSS JS JScriptery itp. Zapytali mnie, jak napisalibyście serwer WWW. A co się stanie, gdy przycisk zapisu zostanie wciśnięty w pliku słowa
sushil bharwani,
2
@sushil - Myślę, że to miejsce, w którym nie chcesz pracować ...
Jon Hopkins,
@sushil: Całkowicie zgadzam się z @Jon Hopkins. Lepiej pracować jako kelner, czekając na dobrą pracę, niż podjąć taką pracę. Posiadanie niekompetentnych idiotów jako przełożonych sprawi, że będziesz wyjątkowo sfrustrowany i zatrzymasz cię w rozwoju osobistym.
back2dos,
6

Świetne pytanie. JavaScript, Java lub VC ++ to super inteligentne języki programowania, w których nigdy nie trzeba tworzyć od początku listy połączonej ani tabeli skrótów. Ale nadal musisz mieć możliwość decydowania, kiedy użyć jednego nad drugim, kar za wydajność i bonusów, które narastają itp.

Przeprowadziłem wywiady z wieloma programistami API, czyli małpami kodowymi, i w większości wywiadów rutynowo nie projektują systemów wydajnych i skalowalnych pod względem wydajności. Podsumowując: znajomość API zapewni Ci chleb, ale w przypadku masła musisz zacząć od podstaw obliczeń.

Fanatyk 23
źródło
Wielkie dzięki, skorzystam z twojej rady i zacznę uczyć się na te tematy
Mahmoud Hossam
3

Dodam „tak, oczywiście, że nadal możesz nazywać się programistą”. Ale jakim typem programisty chcesz być? Myślę, że najlepsi programiści mają przynajmniej podstawy w teoretycznych podstawach. Wiedzą, dlaczego wybrali określoną strukturę danych / algorytm, a także wynikające z tego kompromisy. Oczekuję, że każdy programista, z którym przeprowadzam wywiad, będzie miał przynajmniej podstawową wiedzę, nawet jeśli nie używa tego samego żargonu (chociaż nie znajomość tego żargonu oznacza, że ​​będzie Ci trudniej komunikować się z innymi programistami).

Martijn Verburg
źródło
2

Znajomość algorytmów pozwalają śmiało powiedzieć, jak Twoje wybory będą skalować ! Osobiście uważam to za konieczne, aby zostać starszym programistą


źródło
2

„Jeśli chcesz być dobrym programistą, programujesz codziennie przez dwa lata. Jeśli chcesz być światowej klasy programistą, możesz programować codziennie przez dziesięć lat lub możesz programować codziennie przez dwa lata i wziąć lekcję algorytmów . ”

-Charles E. Leiserson

Dobra rada z analizy algorytmów Charles E. Leiserson - MIT

milan-j
źródło
1

To zależy od projektu: jestem inżynierem informatyki i pracuję jako programista analityków.

Spędziłem dużo czasu na pracy w projektowaniu (testowanie, doc, projektowanie kodu). Ale kiedy znajdę błąd (lub złą wydajność) lub muszę zakodować nową strukturę danych (ponieważ wymaganie jest bardzo NOWE dla aplikacji), muszę zrozumieć, gdzie jest problem w algorytmie i muszę go naprawić ( Zrobiłem to niezbyt dobrze, więc :))

Klasyczne algorytmy i struktury danych są rodzajem „wzorca słownika” w świecie programistów.

Kilka doskonałych linków:

alepuzio
źródło
1

Być może jesteś teraz dobrym programistą, ale znajomość struktury danych, algorytmów i znajomość innych zagadnień informatycznych z pewnością bardzo by pomogła w poprawie siebie na wiele sposobów:

  • Możesz być w stanie być bardziej skuteczny i szybszy w robieniu rzeczy. Nawet ludzie, którzy mają już stopień informatyki i znają wiele z tych tematów, zwykle starają się być na bieżąco z najnowszymi osiągnięciami w celu poprawy siebie.

  • Ta wiedza będzie również przydatna, jeśli w mniejszym stopniu, powiedzmy, jeśli później przejdziesz z programisty na ścieżkę zarządzania, ponieważ dzięki tej wiedzy będziesz w stanie lepiej zrozumieć techniczne aspekty projektów.

  • Oczywiście w wywiadach często zadawane są pytania dotyczące struktury danych i algorytmów, dlatego jest to jeszcze jeden powód, dla którego warto je znać.

aditya
źródło
0

Wspominasz skróty, drzewa, stosy, kolejki i algorytmy sortowania. Technologie, o których wspomniałeś, dotyczą głównie stron internetowych i skryptów internetowych. Zdecydowanie powinieneś przynajmniej zrozumieć drzewa, abyś mógł dobrze pracować z DOM. Ale jeśli wszystko, co musisz zrobić, to prawdopodobnie wszystko jest w porządku. Prawdziwy programista nie będzie potrzebował większości narzędzi z branży. Ale to dlatego, że istnieje duża różnica między żonglowaniem ciągami, które stanowi większość skryptów sieciowych, a tym, co większość z nas uważa za „pisanie programów”.

Pracuję z haszami i drzewami praktycznie codziennie, a stosy i kolejki rzadziej, ale wystarczająco często. Sortowanie jest w zasadzie rozwiązanym problemem; prawie w każdym języku jest wbudowana funkcja szybkiego sortowania w standardową bibliotekę, metoda sortowania podstawowych typów kolekcji itp., ale powinieneś wiedzieć, w jakich okolicznościach wydajność quicksort może się poważnie obniżyć, a właściwe strategie opóźniają sortowanie.

Gdybym nie znał tych zasad i sposobu ich działania, prawdopodobnie mógłbym przerobić działające rozwiązania kodowania, ale nie byłyby to rozwiązania bardzo dobrej jakości. Działałyby powoli, były trudne do odczytania i trudne do modyfikacji, ponownego użycia lub rozszerzenia. Więc jeśli chcesz nauczyć się być dobrym programistą, powinieneś zdecydowanie przeczytać swoje algorytmy i struktury danych. Naprawdę poprawią jakość twojego kodu.

Mason Wheeler
źródło