Muszę wyznać, że nie byłem tak silny w strukturach danych, kiedy skończyłem studia. Podczas stażu w kampusie byłem świadkiem, że większość dużych firm technologicznych, takich jak Amazon, Microsoft itp., Koncentruje się głównie na strukturach danych. Wygląda na to, że struktury danych są jedyną rzeczą, jakiej oczekują od absolwenta.
Szczerze mówiąc, czułem się z tym źle. Piszę dobry kod. Postępuję zgodnie ze standardowymi wzorcami projektowymi kodowania, używam struktur danych, ale na powierzchownym poziomie, tak jak w interfejsach API eksponowanych w Javie, takich jak ArrayList, LinkedList itp. Ale firmy zwykle koncentrują się na skomplikowanych aspektach struktur danych, takich jak manipulacja pamięcią opartą na wskaźnikach i złożoność czasu.
Prawdopodobnie z powodu mojego środowiska Java, wtedy rozumiałem wydajność kodu i logikę tylko wtedy, gdy mówiłem o programowaniu obiektowym, takim jak obiekty, instancje itp., Ale nigdy nie zagłębiałem się w poziom bitów i bajtów. Nie chciałem, żeby ludzie patrzyli na mnie z góry z powodu mojego deficytu wiedzy w strukturach danych.
Tak naprawdę, dlaczego cały ten nacisk na struktury danych?
źródło
Odpowiedzi:
Nie, jest więcej. Na przykład, możemy również spodziewać się, że będzie szybko uczący się, którzy mogą uczyć się nowych ram Apis lub języków programowania nawet w krótkim czasie. To czysty minimalny pasek. Ktoś, kto nauczy się dużo nowego frameworku, interfejsu API lub języka, nie odniesie sukcesu w większości zespołów Microsoft.
I oczywiście jest wiele innych aspektów, na których skupiamy się w wywiadach, poza zwykłą znajomością struktur danych. Na przykład umiejętność radzenia sobie z niejednoznacznymi specyfikacjami lub rozpoznawanie wzorców kodowania, które wytwarzają niepewny kod, lub tuzin innych rzeczy. Ale umiejętność zrozumienia struktur danych jest z pewnością bardzo duża.
Jest to szczególnie przypadku, że wywiady są dociskane do testowania znajomości struktur danych dla absolwentów CS. Niedawni absolwenci, z których większość nie ma dużego doświadczenia w świecie rzeczywistym, nie powinni być dobrzy w tych samych sprawach, w których ktoś z piętnastoletnim doświadczeniem w branży byłby dobry.
Dobrze, że wiesz o sobie. Jeśli nie możesz lub nie chcesz tego zmienić o sobie, zalecam, abyś nie ubiegał się o pracę wymagającą ułatwienia ze strukturami danych.
To jest tautologiczne, że dobry programista to programista, który jest dobry w budowaniu programów, które trzeba zbudować. Wielu programistów pracuje nad zadaniami, które nie wymagają głębokiej znajomości struktur danych. Niektóre z nich pracują np. Nad zadaniami wymagającymi dogłębnej znajomości projektowania interfejsu użytkownika. Lub normalizacja bazy danych. Lub cokolwiek. Ci ludzie nadal mogą być „dobrymi programistami” w swoich domenach.
Zadaję pytania dotyczące wywiadu dotyczące struktur danych, ponieważ w moim zespole programiści projektują, wdrażają i manipulują złożonymi strukturami danych przez cały dzień każdego dnia. Wczoraj mieliśmy cztery godziny spotkań, podczas których pół tuzina programistów dyskutowało o zaletach i wadach dodawania pojedynczego pola logicznego do konkretnego węzła drzewa. Prawdopodobnie w moim zespole nie ma umiejętności ważniejszych niż umiejętność zrozumienia struktur danych na głębokim poziomie. Byłoby głupotą nie zadawać pytań na ten temat, ponieważ to właśnie robimy.
Cóż, to z pewnością uniemożliwi ci znalezienie pracy w moim zespole. Ale jak powiedziałem wcześniej, programowanie jest ogromną dziedziną. Istnieje wiele rodzajów programowania komputerowego, które nie wymagają znajomości struktur danych.
Nie. Ale prawie zawsze wystarcza wykrycie programistów, którzy raczej nie odniosą sukcesu w Microsoft. Ponieważ to przede wszystkim interesuje mnie wykrywanie, znajomość struktur danych jest jednym z czynników, które sprawdzam w wywiadach.
źródło
Ważną kwestią dotyczącą struktur danych jest to, że są one uniwersalne i ponadczasowe, przynajmniej do celów praktycznych. Każdy, kto był programistą w ciągu ostatnich 30 lat, powinien znać podstawowe struktury danych, takie jak pojedyncze / podwójnie połączone listy, drzewa binarne lub wykresy. Jeśli zapytasz o nie dwóch programistów, możesz porównać wiedzę programistów według ich odpowiedzi. Trudno powiedzieć o frameworkach, a nawet językach: jeśli zapytasz dwóch programistów o Rails, a jeden wie o wiele więcej niż drugi, co to tak naprawdę mówi? Jak mówisz w pytaniu, inteligentny programista może nauczyć się nowego frameworka wystarczająco szybko, więc testowanie jego obecnej wiedzy nie ma większego sensu.
Tak. Zdecydowanie. Chyba że chcesz spędzić całe życie na pisaniu aplikacji CRUD.
Nie, to nie wystarczy. Ale jest kilka rzeczy, o które możesz zapytać podczas rozmowy kwalifikacyjnej, które są wystarczające. Powiedziałbym, że znajomość algorytmów jest jednym z lepszych wskaźników, przynajmniej dla osób świeżo po szkole, gdzie nie można pytać o doświadczenia zawodowe.
źródło
Nie brzmi to zbyt ostro, ale każdy na wpół przyzwoity programista będzie w stanie wybrać nowy język lub framework w stosunkowo krótkim czasie.
Struktury danych są uniwersalne, stanowią podstawowy element informatyki - czerwono-czarne drzewo jest w zasadzie takie samo, niezależnie od tego, czy jest implementowane w Javie, Pythonie, PHP, czy cokolwiek innego. Zamiast więc testować określone języki lub określone ramy, pracodawca (przynajmniej pracodawca poszukujący wyróżniających się programistów) przetestuje, czy znasz podstawy informatyki, a nie tylko jakikolwiek smak miesiąca ” ponownie używam.
(przynajmniej powinni przetestować podstawy oprócz tego, czego obecnie używają ... nie ma sensu zatrudniać kreatora informatyki, jeśli nigdy nie napisał linii kodu w swoim życiu)
źródło
Czy wierzysz, że kierowcy F1 po prostu jeżdżą szybkimi samochodami? Nie, rozumieją samochód, którym jeżdżą i współpracują z mechanikami / inżynierami, aby go dostroić. Oczywiście normalny kierowca po prostu jeździ.
Możesz być normalnym / przeciętnym programistą, który po prostu pisze kod. Nie rozumiesz, co jest za tobą. Zrobisz wszystko. To wszystko, do zobaczenia następnego dnia.
Ale wiele firm szuka programistów F1. Ludzie, którzy będą się rozwijać, wiedząc, co kryje się za ich kodem. Ludzie, którzy pomogą firmie zbudować coś lepszego.
Dobrze jest znać struktury danych nie tylko dlatego, że będziesz ich często używać w formie „gotowej”. Jest to również dobre, ponieważ stworzysz coś, co wywodzi się z ich pomysłu.
źródło
W mojej klasie na temat struktur danych pierwszą rzeczą, o której powiedział profesor, było: W tej klasie nie chodzi o to, by móc wyszukiwać naprawdę szybko. Następnie spędziliśmy pół roku, szukając najlepszych możliwych struktur danych i algorytmów, aby wyszukiwać naprawdę szybko.
Nadal jednak miał rację. Możliwość analizowania struktur danych, zastosowania odpowiedniej struktury danych do danego problemu, a nawet wymyślenia nowych struktur danych wymaga wielu cech inżyniera:
Kiedy Amazon i Microsoft zatrudniają ludzi, nie zadają pytań o struktury danych, ponieważ mają nadzieję na wynalezienie kolejnej szybkiej dystrybucji . Chcą upewnić się, że zatrudniają kogoś o wyżej wymienionych cechach.
Oczywiście możliwe jest posiadanie dużego zestawu tych cech i wciąż ssanie struktur danych. Ale jeśli tak jest, nie zajmie ci dużo czasu, aby stać się ekspertem w dziedzinie struktur danych.
To powiedziawszy, wciąż istnieje problem, który
ArrayList
po prostu nie do końca się skaluje. Kiedy systemy stają się duże, do wykonania zadania potrzebne są lepiej dostosowane rozwiązania. Bez dobrego zrozumienia struktur danych nie będziesz w stanie znaleźć i skomponować struktur i algorytmów, które w dużej skali są skalowane w konkretnym scenariuszu.źródło
ArrayList
, że bez dobrego zrozumienia struktur danych możesz nawet nie zdawać sobie sprawy, żeArrayList
nie do końca się skaluje i musisz znaleźć i skomponować struktury i algorytmy o takiej skali.Zasadniczo algorytmy i struktury danych są uważane za dwa najbardziej „twarde” tematy w programowaniu. Jest tak, ponieważ istnieje ogrom pracy i badań dotyczących ich w informatyce. Przyciągają również typowych programistów „lewych płatów”, którzy lubią matematykę i naukę ścisłą (czyli wielu programistów)
Biorąc to pod uwagę, znajomość tych zagadnień może wpłynąć na twoją karierę w zakresie przeprowadzania wywiadów, szczególnie jeśli przeprowadzasz wywiad w miejscach pracy zorientowanych na inżynierię, takich jak google. Inne firmy mogą teraz jednak w ogóle dbać o ten aspekt.
Z mojego doświadczenia wynika, że wymagania algorytmów / struktury danych mogą czasem być postrzegane jako „elitarność programisty”, w której maniacy alfa walczą, by pokazać, kto jest najmądrzejszy. Zawsze dobrze jest wiedzieć, co tam jest, ale istnieje wiele różnych zadań programistycznych, w których nigdy nie będziesz musiał wiedzieć, jak korzystać z czerwonego / czarnego drzewa lub kodować wyszukiwanie boyer-moore.
Poleciłbym dowiedzieć się więcej na te tematy, jeśli uważasz, że są interesujące i masz jakiś osobisty projekt, w którym możesz majstrować przy nich, w przeciwnym razie prawdopodobnie poradzisz sobie bez nich
PS. Znajomość podstawowych struktur danych (powiązane listy, słowniki, tabele itp.) Powinna być obowiązkową wiedzą dla każdego programisty DS.
źródło
Dwa powody.
Po pierwsze, pokazuje, że możesz myśleć o problemie w sposób abstrakcyjny, a nie w odniesieniu do konkretnego języka programowania. Czy wiesz, dlaczego tabela skrótów może być lepszym lub gorszym wyborem niż czerwono-czarne drzewo w danej sytuacji, niezależnie od podstawowej implementacji?
Po drugie, istnieje przerażająca liczba osób przeprowadzających rozmowy kwalifikacyjne w sprawie pracy, które po prostu kłamią na temat swojego doświadczenia i mają bardzo mało, jeśli w ogóle, zdolności programistyczne; pytania dotyczące struktur danych to szybki sposób na wyeliminowanie tych osób.
źródło
Są fundamentalne, ale także, na czym byś quizował absolwentów? Mogą, ale nie muszą, mieć doświadczenia poza pracą zawodową. Ich kurs mógł obejmować technologie Microsoft bardziej niż powiedzieć Javę i odwrotnie. Struktury danych są wspólną płaszczyzną.
źródło
Często najlepszy kod pozwala uniknąć odkrywania struktur danych niskiego poziomu. Jest to szczególnie prawdziwe w językach wysokiego poziomu. Zauważyłem trend w kierunku pytań o strukturę danych niskiego poziomu, nawet w zadaniach CRUD. YMMV, ale wydaje się, że nacisk na wiedzę naukowców hakerów przyćmił inne umiejętności, które sprawiają, że świetny programista:
Struktury danych są świetne. Struktury danych są ważne. Każdy programista powinien je zrozumieć. Jednak mamy obsesję na punkcie wypychania tych podstaw poza ich miejsce. Nie chodzi tylko o struktury danych, aw 99% przypadków nie ma potrzeby zadawania pytań poza podstawami struktur danych. Jeśli przeprowadzasz wywiad z księgowym, z pewnością zapytaj go, co to jest 81 podzielone przez 9, ale jeśli wciąż pytasz: „Jaki jest pierwiastek sześcianowy z 98425454242412 * 4512324? ... bez kalkulatora!” wtedy będziesz przerażał spory odsetek rozsądnych, inteligentnych, utalentowanych i przyjaznych ludzi, których mógłbyś mieć. Zapytaj, czy mogą zbudować podstawowy relacyjny model danych, zapytaj, czy mogą korzystać z ulepszonych struktur tablicowych zapewnianych przez odpowiednią strukturę, i zapytaj, czy potrafią wyjaśnić, kiedy wyszukiwanie binarne jest szybsze niż wyszukiwanie płaskie, ale nie ma zbyt wiele sensu, aby wyjść poza to. Jeśli potrafią to zrobić, zacznij szukać najładniejszej, najbardziej profesjonalnej i najbardziej kreatywnej ze wszystkich.
Uwielbiam pisanie Joela, ale myślę, że jego „Java Schools” jest zupełnie nie tak. Istnieje wiele rzeczy, które mogą udowodnić, że ktoś jest mądry poza opanowaniem C ++. Pomyśl o tym, możesz porozmawiać z kimś przez 10 minut, nie pytając go o arytmatykę wskaźnika, i mieć całkiem niezłe pojęcie, czy to oni są typem ludzi, którzy potrafią załatwić sprawę i rozwiązać problem. Nie musimy być tacy:
Przeprowadzający wywiad: „Opowiedz mi o swoich osiągnięciach”.
Coder: „Na moim ostatnim stanowisku byłem jedynym programistą niestandardowego systemu ERP dla firmy finansowej o wartości miliarda dolarów. Dostarczyliśmy miesiące przed terminem, a system jest produkowany od 3 lat.”
Przeprowadzający wywiad: „Pozwól, że wyjaśnię. Opowiedz mi o swoich osiągnięciach programistycznych ”
Koder: „Umm ...”
Przeprowadzający wywiad: „Na przykład, czy kiedykolwiek stworzyłeś własną listę, do której prowadzi link?”
Coder: „... [wychodzi]”
źródło
Bycie dobrym programistą nie polega na nauce języków i frameworków. Chodzi o umiejętność budowania rozwiązań złożonych problemów. Aby te rozwiązania były wydajne i niezawodne, prawie zawsze będą polegały na dobrych algorytmach i odpowiednim wykorzystaniu struktur danych. Znajomość struktur danych nie wystarczy. Musisz zrozumieć, że struktury danych wystarczą, aby użyć odpowiedniej dla problemu. Listy i mapy oferują niektóre cenne funkcje, ale wiążą się z nimi koszty, a użycie niewłaściwego może znacznie obniżyć wydajność oprogramowania.
Dobry ankieter wie o tym i stara się ustalić, czy możesz być wartościowy dla jego zespołu lub firmy. Języki, których będziesz używać za 2 lata, mogą być bardzo różne, ale potrzeba skutecznych algorytmów i struktur danych nie ulegnie zmianie.
źródło
Struktury danych, złożoność czasu, manipulowanie pamięcią i wskaźniki to fundamenty, które ktoś, kto nazywa siebie informatykiem, powinien z natury wiedzieć. Każda małpka kodowa może nauczyć się języka i nauczyć się go używać, ale specjaliści CS i studenci powinni się wyróżniać, wiedząc nie tylko, jak korzystać z połączonej listy lub mapy skrótów, ale DLACZEGO.
DLACZEGO naprawdę wyróżnia nas wszystkich od podstawowego skrypciarza, małpy kodowej i chrząkania świata komputerowego. DLACZEGO należy użyć tabeli skrótów zamiast połączonej listy, DLACZEGO moja tabela skrótów powinna mieć gęstość klastra z grubsza .6 -8. 8 DLACZEGO powinienem użyć tutaj listy połączonej cyklicznie zamiast listy podwójnie połączonej. DLACZEGO mój kod powinien działać z wydajnością „x” w najgorszym przypadku i „y” w przeciętnym przypadku.
Te podstawowe struktury danych i wiedza nie tylko o tym, w JAKI sposób są one używane (jak zresztą i tak powinno się odtwarzać w każdym programiście), ale o tym, że język jest obojętny DLACZEGO są używane, co zwykle jest tym, czego szukają w tych przypadkach.
Wiele miejsc sprawi, że napiszesz kod w języku, który znasz, ale jest to bardziej ogólnikowe, ponieważ C nie jest już langua franca w świecie programowania, a pseudokodowanie struktury może być miszmaszem. na miejscu i, w większości przypadków, gdy pseudo-kod / kod p & p tak naprawdę nie jest uczony, właściwie niemożliwe do rozwiązania.
źródło
Struktury danych stanowią fundament wszystkich programów. Nie musisz mieć dogłębnego ich zrozumienia, ale absolutnie musisz wiedzieć, jak one działają.
Dlaczego? Ponieważ cały kod oddziałuje na dane i manipuluje nimi. Jeśli zestawu danych nie można zapisać w strukturze, nie można go użyć. Dane są jak materiały budowlane domu. Dopóki nie złożysz go w strukturę, po prostu masz bezużyteczny stos desek.
Po podjęciu decyzji o tym, jak myśleć i zdefiniować swój zestaw danych, wtedy można zacząć używać go do robienia rzeczy, klasyczny algorytm część duetu. Każdy program, który piszesz, wykorzystuje strukturę danych, choć w wielu przypadkach struktura ta jest tak uproszczona, że prawie nie istnieje. Kilka zmiennych dla danych stanu i gotowe!
Gdy przejdziesz poza trywialne programy, prawie wszystko wymaga struktury danych. Który wolisz, profesjonalny architekt, który projektuje wieżowiec z najlepszymi praktykami i matematyką, czy wujek Joe Bob, który natychmiast zaczyna budować?
źródło
Aby wykorzystać to, co mówi @Pelshoff , oznacza to, że wiesz, co robisz. Jeśli używasz LinkedList do wszystkiego, może to wskazywać, że nie wiesz, co robisz lub nie chcesz przestać myśleć o problemie. Co więcej, przynajmniej kurs dotyczący struktur danych, który odbyłem, obejmował podstawową teorię złożoności tych struktur danych, która w przypadku dużych zbiorów danych jest bardzo ważna. Właśnie dlatego firmy takie jak Amazon czy Microsoft zrobiłyby coś takiego.
Muszę powiedzieć, że zanim wziąłem klasę struktury danych, pomyślałem, że nie są one ważne, ale przynajmniej są w stanie rozpoznać, kiedy lista połączona (lub ArrayList) nie jest praktyczna lub jakie są jej wady.
źródło
To, czy piszesz dobry kod, czy nie, jest subiektywnym stwierdzeniem. Ważne jest, aby wiedzieć, że kod funkcjonalny nie zawsze tworzy dobry kod.
To powiedziawszy, struktury danych są ważne, ponieważ są jak zakulisowi pracownicy, którymi kierujesz jako programista. To prawda, że możesz wywoływać metody na strukturze, nie do końca rozumiejąc, co ona robi, i możesz korzystać ze struktury bez poznania sposobu przechowywania danych, ale znajomość tych szczegółów lepiej przygotuje Cię do zrozumienia, kiedy należy zastosować jedną strukturę ponad inne.
Wiedza, na przykład, że możesz przechodzić w obie strony przez podwójnie połączoną listę i tylko do przodu poprzez pojedynczo połączoną listę może pomóc określić, która struktura jest ważna podczas przechowywania danych. Możesz podjąć jeszcze większą decyzję edukacyjną, wiedząc, że pojedynczo połączona lista może potencjalnie mieć mniejszy narzut pod względem zużycia pamięci (ponieważ nie zawiera wskaźników do poprzednich elementów), więc jeśli potrzebujesz tylko iterować listę, możesz zaoszczędzić trochę pamięci, używając odpowiedniej struktury.
To tylko małe przykłady i ostatecznie, jeśli uważasz, że dobrze sobie radzisz w swojej karierze bez dogłębnej znajomości struktur danych, być może nie musisz się więcej uczyć. Jednak zrozumienie tego, co dzieje się pod maską, może naprawdę pomóc w przekształceniu funkcjonalnego kodu w dobry kod.
źródło
Struktury danych są elementami składowymi wielu rzeczy, które chcesz robić. Jeśli znasz zastosowania każdej struktury danych, jej słabości i mocne strony, możesz łatwo rozwiązać problemy.
Na przykład mieliśmy wymóg zarządzania tysiącami obiektów. Co jakiś czas musimy aktualizować znacznik czasu obiektu zgodnie z jego identyfikatorem. Co jakiś czas musieliśmy usuwać obiekty, które nie były aktualizowane przez więcej niż X minut.
Jeśli znasz swoje struktury danych, możesz łatwo zdefiniować problem, a także bardzo łatwo znaleźć rozwiązanie. Kiedy programista, który nie zna wystarczającej struktury danych, próbował znaleźć rozwiązanie, jego rozwiązanie było niezręczne. Był jak ty - inteligentny, programista kodów, który szybko uczy się frameworków. Ale bez znajomości struktur danych musiał sam wymyślić koło. Co więcej - miał trudności z zrozumieniem prostszych rozwiązań, ponieważ były one oparte na strukturach danych, których nie rozumiał, takich jak czerwono-czarne drzewa (Twoja stara TreeMap w Javie).
Powiedziałbym więc, że ważne jest, aby wiedzieć, jak i kiedy korzystać z każdej struktury danych bez konieczności myślenia o tym. Ale nie sądzę, aby można to osiągnąć bez faktycznego zrozumienia, jak działają.
źródło