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ć?
interview
self-improvement
algorithms
data-structures
Sushil Bharwani
źródło
źródło
Odpowiedzi:
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.
źródło
ci, którzy nie znają historii, skazani są na jej ponowne opracowanie
źródło
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:
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:
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 .
źródło
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.
źródło
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ą.
źródło
Ś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ń.
źródło
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).
źródło
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
Dobra rada z analizy algorytmów Charles E. Leiserson - MIT
źródło
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:
źródło
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ć.
źródło
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.
źródło