Tematy CS, które student musi znać [zamknięte]

34

Na studiach nigdy nie interesowałem się teorią. Nigdy tego nie czytam. Bez względu na to, ile próbowałem, nie byłem w stanie czytać różnych rzeczy i nie wiedziałem, co się właściwie dzieje. Podobnie jak na przykład w moim kursie na temat teorii automatów, mój profesor powiedział mi wszystko, co może być związane z jego matematycznym aspektem, ale ani razu nie wspomniał o tym, gdzie miałoby to być praktyczne. To tylko przykład.

Udało mi się zdać maturę i odbyć staż w firmie, gdzie zrealizowałem projekt i na szczęście nie zawracali mi głowy ocenami, ponieważ były powyżej średniej.

Teraz chcę wiedzieć, jakie przedmioty student CS powinien bezwzględnie i pozytywnie mieć świadomość? Tematy, które mogą mieć znaczenie w branży. Dzieje się tak, ponieważ mam trochę wolnego czasu i pomogłoby mi to lepiej je zrozumieć.

Jakie są twoje sugestie? Podobnie jak jeden, algorytmy to jeden przedmiot.

Karl
źródło
3
Wyrażenia regularne oparte są na teorii automatów i pomoże ci, jeśli kiedykolwiek będziesz musiał parsować cokolwiek. Robiłem i uczyłem się w szkole rzeczy, które okazały się nieistotne dla pracy, którą miałem, ale to mówi tyle samo o tym, nad czym pracowałem, co tym, czego się nauczyłem. Nic, czego się nauczyłem, nie byłoby bezużyteczne w terenie w każdych okolicznościach.
David Thornley,
2
Nienawidzę pracować z twoim typem ... jk (w pewnym sensie). Gdybym był tobą, najpierw poświęciłbym czas na przejrzenie rzeczy, które powinieneś wiedzieć ze szkoły - w ten sposób nie wyglądasz jak idiota podczas następnego wywiadu. Potem poznam rozsądną ilość struktur danych i algorytmów, które wyglądają, jakby można je było wykorzystać w prawdziwym świecie. Musisz dowiedzieć się, gdzie chcesz być. Jeśli jesteś twórcą gry, prawdopodobnie potrzebujesz algebry liniowej, grafiki 3D, geometrii obliczeniowej. Ogólnie rzecz biorąc, musisz przeglądać dane dotyczące danych, algorytmu, bazy danych, systemu operacyjnego i kompilatora co najmniej i kontynuować naukę.
Job
Trudno jest nazwać konkretną aplikację dla teorii automatów w taki sam sposób, jak trudno jest nazwać konkretną aplikację dla arytmetyki. Może przesada, ale nie za bardzo. Diagramy stanów są często przydatne, a manipulowanie nimi w kodzie jest przydatne do wielu celów. Drzewa decyzyjne (zminimalizowane do postaci cyfr) są dla mnie stosunkowo nowym przykładem, a ja nawet musiałem używać modeli stanów (w formie kanonicznej) jako kluczy do kontenerów. Jeśli nie widzisz aplikacji w aplikacjach, pomyśl o dodaniu warstwy pośredniej - generowaniu kodu.
Steve314,
1
Otrzymujesz wiele świetnych odpowiedzi CS poniżej, ale myślę, że ograniczając swoje pytanie, pomijasz kilka najbardziej przydatnych rzeczy, które widziałem przez 15 lat, odkąd dostałem mój BSCS, co wyróżnia ludzi które dobrze sobie radziły w branży: komunikacja w małych grupach i umiejętności pracy w zespole. Głupio, jak się wydaje, przejdź do działu mowy / języka / teatru i weź udział w zajęciach takich jak „komunikacja w małych grupach” lub „kierownictwo / zarządzanie zespołem / grupą”. Nawet jeśli nie planujesz zarządzania, zdobyte tam umiejętności sprawią, że będziesz lepszym inżynierem i członkiem zespołu.
cabbey,

Odpowiedzi:

41

Wierzcie lub nie, jedną z rzeczy, które okazały się dla mnie kluczowe w późniejszym życiu, była Kompilator. Nie nowoczesna wersja namby-pamby z użyciem Lexa i Yacca, to jest dla manekinów.

PRAWDZIWA konstrukcja kompilatora, w której od zera piszesz własny skaner symboli i parser.

Myślałem, że nigdy więcej tego nie użyję. Ale w ciągu ostatnich 20 lat kurs ten udowodnił swoją wagę w złocie 4 razy. Każdy procesor poleceń, który musiałem pisać, każdy skaner wiadomości przychodzących, każdy dyspozytor użytkownika, każdy interpreter skryptów, stosował zasady z tego kursu. Zrób to w ten sposób, a życie będzie słodkie, jasne i proste. I nawet przekazałem wszystkie informacje koledze, który tego nie zrobił - musiał napisać kompilator dla abstrakcyjnej maszyny. Co mogę dodać, odniosło duży sukces komercyjny.

Gdybym musiał wstać i podziękować wykładowcy uniwersyteckiego na jakikolwiek temat, to byłoby to. Bez tego bym sobie poradził, ale moje rozwiązania byłyby o wiele brzydsze.

(I zanim ktoś podskoczy i powie „dobrze, że mogłeś użyć leksyk i yacc ...” odpowiedź może być - zależy to bardzo od systemu. W niektórych przypadkach językami programowania nie były C (np. PL / M i Ada), w niektórych przypadkach na platformie nie były dostępne łatwo dostępne Lexy lub Yacc. Znajomość podstaw oznacza, że ​​rozwiązanie jest dostępne, zamiast załamywania rąk, próbując wymyślić, jak zgiąć narzędzie, aby dopasować się do problemu.)

szybko
źródło
6
Kompilatory +1 były jednym z moich ulubionych kursów na uniwersytecie i zawsze są przydatne. Rzadko korzystałem z lex / yacc / bison, podstawy mają znacznie bardziej konkretne zastosowanie.
Orbling
Całkowicie się zgadzam, choć z innego powodu. Poznanie sposobu pisania generatora kodu - mimo że korzystałem z Lexa i Yacca - było moim pierwszym i najlepszym zanurzeniem w programowanie obiektowe.
Peter Turner
Możesz (i powinieneś także wiedzieć, jak to zrobić) napisać generator kodu w zwykłym C lub innym języku innym niż OO. Potem jest lekcja pisania bardzo dużych fragmentów kodu proceduralnego i dzielenia generowania parsera / skanera / kodu na rozsądne i zrozumiałe fazy.
szybko_now
Kompilatory +1 zawierają tak wiele wzorców i zasad, że pozwolą ci zobaczyć projekt i kod w zupełnie innym świetle po tym, jak to zrobisz.
Andrew T Finnell,
2
„Pomyślałem, że nigdy więcej tego nie użyję”. Gdybym miał dolara za każdym razem, gdy powiedziałem to sobie, gdy byłem młodszy ...
Nick Spreitzer
37
  1. Struktury danych / algorytmy, zwłaszcza wykresy. Ilość rzeczywistych sytuacji, w których udało mi się zastosować algorytmy związane z grafem, była dla mnie niespodzianką. Skoncentruj się na poznaniu cech charakterystycznych, kiedy struktura danych lub algorytm jest odpowiedni. Na przykład zauważenie problemu i umiejętność korzystania z dynamicznego programowania / chciwego algorytmu jest ważne i pozwala zaoszczędzić dużo czasu.

  2. Praktyczna znajomość złożoności obliczeniowej. Nie musisz wiedzieć z góry, co to jest dolna granica rodzaju radix, ale wiesz, jak dowiedzieć się, jaki najgorszy czas działania napisanego tekstu jest ważny, szczególnie w przypadku projektów o kluczowym znaczeniu dla wydajności.

  3. Koncepcje systemu operacyjnego. Zarządzanie pamięcią, harmonogramy itp. Każdy programista powinien naprawdę dobrze rozumieć systemy operacyjne, biorąc pod uwagę, że kod, który piszesz, stale z nim współdziała.

  4. NetSec. Zetknąłem się z bardzo małą liczbą programistów, którzy dobrze rozumieją podstawowe kwestie bezpieczeństwa związane z programowaniem (przepełnienie bufora, xss, SQLI itp.). Jest to naprawdę konieczne, jeśli chcesz odnieść sukces w branży. To świetnie, jeśli możesz napisać kolejną wielką rzecz, ale nie będziesz mieć wielu użytkowników na długo, jeśli nie zabezpieczysz ich danych.

  5. Paradygmaty programowania. Znać cechy charakterystyczne i różnice między programowaniem OO / funkcjonalnym / proceduralnym. Jedną z najlepszych zajęć licencjackich, jakie kiedykolwiek miałem, było pisanie prostych 20 tłumaczy instrukcji dla fortan, schematu, prologu itp. W samych językach. Już sama ekspozycja może naprawdę pomóc w zrozumieniu podstawowych koncepcji rozwoju oprogramowania.

Kurtis
źródło
1
+1 Cała lista jest prawie wymagana, szczególnie (4) jest bardzo ważna w dzisiejszej erze rozproszonej.
Orbling
1
+1 na strukturach danych / wykresach. Liczba programistów, których znam, którzy nie wiedzą, jak prawidłowo używać Hashtable lub dlaczego Lista połączona zamiast prostej tablicy w niektórych przypadkach zaskakuje mnie codziennie.
Machado
+1 za paradygmaty programowania. Bardzo pomocne jest dobre zrozumienie kontrastów między różnymi typami języków.
apoorv020
19

Spełnienie wymagań ukończenia studiów niekoniecznie wystarcza, aby być najlepszym informatykiem, jakim możesz być. W przypadku typowego programu nauczania w college'u znajdziesz dziesięć najważniejszych rzeczy, których powinieneś się nauczyć:

  1. Podstawy ekonomii - kurs wprowadzający obejmujący takie tematy jak uzupełnienia i substytuty jest niezbędny do pracy w gospodarce wyższej lub po prostu jej zrozumienia. Chociaż koncepcja Dobra Giffen niekoniecznie pomoże, wiedza na temat efektów zewnętrznych tak. Może to również pomóc ci docenić, że więcej sytuacji jest korzystnych dla obu stron, niż mogłeś sobie wyobrazić.

  2. Jak napisać dowód - wszystkie kierunki komputerowe powinny wiedzieć, jak napisać dowód. Dyskretna matematyka, choć stanowi część dobrze zbilansowanego śniadania, się nie liczy. [Indukcja jest tylko jedną techniką dowodową i możesz sobie z nią poradzić, nie wiedząc wiele o dowodach.] Kurs algebry lub prawdziwej analizy jest konieczny, aby naprawdę napisać dowody. A przez algebrę rozumiem teorię grup lub algebrę abstrakcyjną, a nie kurs, który uczyliście w szkole średniej. Aby uzyskać pełną korzyść, weź algebrę i prawdziwą analizę w tym samym terminie.

    Dlaczego pisanie dowodów jest niezbędne? Ponieważ to programuje! Pomyśl o tym, kiedy po raz pierwszy nauczyłeś się programować: jeśli zadanie wymagałoifi pętli, być może nie miałeś intuicji, gdzie je umieścić względem siebie. Ale teraz to samo zadanie wydawałoby się całkowicie naturalne. Pisanie dowodu jest bardzo podobne. Istnieje zestaw sztuczek, których się uczysz, a kiedy się je nauczysz, wszystko wygląda zupełnie inaczej.

  3. Jak pisać - Umiejętności w zakresie komunikacji pisemnej są niezbędne, niezależnie od tego, czy będziesz pracować w branży, czy w środowisku akademickim. Najlepiej, jeśli znajdziesz kurs mechaniki, a nie kurs pisania, który efektywnie dotyczy innego tematu. Oznacza to, że wiele szkół będzie próbowało uczynić kursy pisania bardziej interesującymi lub interesującymi, czyniąc je specjalnym tematem. Spróbuj wybrać „nudną” wersję kursu.

  4. Prawdopodobieństwo i statystyki - są pewne rzeczy, które można prawidłowo odebrać, biorąc udział w kursie. Wraz z głównymi wymaganiami CS (które powinny dać ci dyskretną matematykę, rachunek jednej zmiennej i rachunek wielu zmiennych oraz algebrę liniową) i algebry i / lub analizy rzeczywistej, zbieranie statystyk prawdopodobnie da ci niewielkie znaczenie z matematyki. Statystyki uczenia się mogą pomóc w pracy z innymi naukowcami nad ich projektami.

  5. Aktualny gorący temat - W poprzednich dekadach mogły to być bazy danych lub programowanie obiektowe. Dzisiaj może to być programowanie sieciowe lub architektura zorientowana na usługi. Jakakolwiek jest obecna moda, koniecznie weź udział w kursie. Żeby tylko zobaczyć, o co chodzi w modzie.

  6. Problem zatrzymania - Większość problemów nie może być rozwiązana przez maszyny. Jest to dość głęboka idea, że ​​nasza kultura tak dobrze się wchłonęła, że ​​nie brzmi już szokująco. To samo dotyczy radia, Goedela i bomby atomowej; dopiero sztuka ponowoczesna i zimna wojna pozwoliły nam poradzić sobie z tymi pojęciami. Jednak biorąc udział w kursie teorii obliczeń, możesz ponownie uwrażliwić cię na ten dość niesamowity dowód.

  7. Programowanie czysto funkcjonalne - najprawdopodobniej nie przejdziesz do programowania czysto funkcjonalnego, chyba że przeprowadzisz w nim badania lub pracujesz dla kilku wybranych firm, ale wiedza o tym pomoże ci być lepszym programistą. Powodem jest to, że poznasz wiele nowych form abstrakcji oraz takich pojęć, jak liczby i kontynuacje Kościoła oraz monady i tak, rekurencja, a te narzędzia można zastosować również w następnym programie Java.

  8. P i NP - OK, ten jest już na twojej krytycznej ścieżce, ale i tak uważaj. Chcesz mieć pewność, że możesz poprawić kogoś, kto nieprawidłowo nazywa NP „nie-wielomianowy”. Jakby!

  9. Tematy z kursu, którego z pewnością nie znosisz - może to być kurs CS, który uważasz za zbyt niski, zbyt teoretyczny, lub kurs inny niż CS, który uważasz za zbyt niekorzystny, zbyt trudny lub zbyt nudny . Jeśli taki kurs wydaje Ci się być problemem, a tłumaczysz innym, dlaczego tak się cieszę, że nie musisz brać takiego a takiego, powinien ci powiedzieć, że dużo się nauczysz biorąc kurs! Być może nie nauczysz się materiałów kursu, ale dowiesz się o własnych ograniczeniach i być może więcej o uzasadnieniach, które sam sobie uznasz. [Wskazówka: zazwyczaj są słabi.]

  10. Kurs non-CS, który z pewnością pokochasz - w końcu powinieneś się dobrze bawić. Jest to kurs, z którego prawdopodobnie skorzystasz najmniej, ale i tak go wykorzystaj. Zrób to raz. Jeśli akurat lubisz wiele kursów, to dobrze dla Ciebie, ale upewnij się, że nie przeszkadza to w pokryciu pozostałych kursów z tej listy.

Moje podejście tutaj było praktyczne, oparte na kursach, które możesz faktycznie wziąć. Skoncentrowałem się na celach uczenia się, których można się nauczyć. Uwaga: Ta odpowiedź została zaadaptowana z mojego blogu na temat Dziesięciu rzeczy, które powinien znać każdy informatyk .

Macneil
źródło
Pomocne byłoby wyjaśnienie opinii negatywnej. Być może mogę zmienić odpowiedź, a potem możesz zmienić zdanie.
Macneil
Profesorze, nie oddałbym głosu za twoją odpowiedzią, ale jest jedna rzecz, z którą będę miał problem. Pisanie dowodów: Do dziś nie mogę napisać dowodu dyskretnego, chyba że poprosisz mnie o potwierdzenie numeru nieparzystego lub parzystego. Nie widzę związku między tym a branżą. Może brakuje mi „Aspektu rozwiązywania problemów?”. Nigdy nie mogłem owinąć mózgu wokół indukcji matematycznej lub lematu pompującego. Nie sądzę, że to mnie spowalnia.
Bryan Harrington
Pisanie dowodu jest jak pisanie programu. Nauczenie się, jak udowodnić, że * 0 = 0, na przykład, przypomina matematykę FizzBuzz (cóż, być może jest to trochę trudniejsze). Na początku wydaje się to zastraszające, ale wkrótce wybierasz małe sztuczki, tak jak robiłeś to podczas nauki programowania. Dowody mogą mieć różne struktury, które mogą pomóc ci myśleć rekurencyjnie i strukturalnie. Jak powiedziałem, dyskretny kurs matematyki nie przycina go, aby nauczyć się prawdziwych dowodów. Potrzebujesz do tego teorii grup lub prawdziwej analizy.
Macneil
Chociaż znajomość komplementów jest z pewnością przydatna, uważam, że wiedza o komplementach jest bardziej istotna dla ekonomii.
ijw
1
@ijw: Jeśli chodzi o ekonomię dla studentów CS, Joel ma dobrą dyskusję, którą warto przeczytać: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Po rozmowie z kilkoma przedstawicielami firmy i przyjaciółmi, którzy mieli wiele wywiadów:

  • Bazy danych
  • OOP
  • Algorytmy
  • Struktury danych

wydają się być obowiązkowe dla nowych pracowników (lub, jak powiedzieli, „wysoce zalecane” kursy).

Inne przydatne kursy to bezpieczeństwo komputera, montaż i architektura maszyn. Wielu moich profesorów poleciło mi również kurs kompilatora. Ponadto, jeśli masz czas, bardzo polecam kursy matematyki, takie jak teoria grafów, matematyka dyskretna i kombinatoryka. Nauczysz się wielu umiejętności rozumowania na tych zajęciach, nad którymi prześwieca większość kursów CS, ale w końcu są bardzo przydatne podczas pisania bardzo złożonych programów.

Mam nadzieję, że to pomaga!

K-RAN
źródło
1
Zgodziłby się z OOP i strukturami danych.
apoorv020
4
Podstawowe struktury danych ... takoooooooooo ważne. Bardziej ważne, jak sądzę, niż OOP. Musisz myśleć o tym, jak przechowywać i organizować informacje. A jeśli w systemie wbudowanym układ struktur danych w pamięci jest sprawą życia lub śmierci.
szybko_now
3
+1 dla klas matematycznych. Pomagają również w nauce śledzenia dużych problemów / systemów.
Michael K
1
Praca w sieci również jest dobra.
Keyo
OOP? Możesz programować w Haskell lub C bez OOP ... Dam ci, że jest szeroko stosowany, ale nie sądzę, że jest to podstawa. Z drugiej strony narażenie na różne paradygmaty wydaje się dość przydatne.
Matthieu M.
6

W dużej mierze zależy to od tego, co planujesz zrobić ze stopniem naukowym. Wygląda na to, że większość kierunków CS kończy się jako inżynier oprogramowania. Mając to na uwadze, naprawdę nie jestem pewien, dlaczego więcej osób nie zajmuje się wyłącznie inżynierią oprogramowania. Podejrzewam, że nie ma wystarczającej liczby programów inżynierii oprogramowania, szczególnie w instytucjach publicznych.

Pochodzę z osadzonego podłoża. Każda osoba, z którą pracuję, miała stopień EE lub CE, a to częściowo dlatego, że kiedy „starzy faceci”, kiedy studiowali, nie było tak wielu dostępnych programów CE. Jest więc oczywiste, że jeśli chcesz pracować w polu osadzonym, pożądane jest tło sprzętowe.

Niezależnie od dziedziny, w której chcesz pracować, uważam jednak, że każdy programista powinien przejść kurs programowania. Możesz go nigdy nie używać, ale nauczy dokładnie, co dzieje się na poziomie procesora podczas wywołania funkcji, w jaki sposób obsługiwane są przerwania, jak zbudowana jest pamięć lub jak wykorzystywane są różne tryby adresowania. Wierzę, że dzięki tym wszystkim będziesz lepszym programistą.

Ponadto, choć może to nie być oczywiste, niektóre z nich są ważnymi tematami przy rozważaniu struktur danych i algorytmów dla konkretnej platformy.

Pemda
źródło
+1, ponieważ stopień informatyki daje doświadczenie w szerokim zakresie tematów / technologii. Pamiętaj tylko, aby zwrócić uwagę na kurs projektowania oprogramowania.
Pan Ant
+1 Podczas montażu zawsze mądrze jest naprawdę zrozumieć, co dzieje się na dole stosu. Byłoby miło, gdyby wszyscy znali również sprzęt, ale dla wielu byłby to krok za daleko.
Orbling
5

Istnieją 2 sposoby na odpowiedź na twoje pytanie. Pozwól mi spróbować obu. Pierwszym sposobem jest spojrzenie na rzeczy z potencjalnego punktu widzenia rynku pracy, umiejętności kodowania itp. Oto moja lista:

  1. Struktura danych
  2. Analiza algorytmów
  3. Programowanie obiektowe
  4. Konkretny kurs języka C ++ lub Java
  5. System operacyjny
  6. Projekt interfejsu użytkownika
  7. Programowanie równoległe

Drugi sposób to patrzeć na sprawy z nieco abstrakcyjnej perspektywy, a kto wie, może być też trochę filozoficzny. Poniższa lista może nie zawierać najgorętszych umiejętności wymaganych przez rynek pracy, ale jestem pewien, że kiedy wyjdziesz z tych kursów, będziesz w stanie głębiej docenić sztukę tworzenia oprogramowania.

  1. Teoria skończonych języków i automatów
  2. Budowa kompilatora
  3. Teoria grafów
  4. Sztuczna inteligencja
Fanatyk 23
źródło
Nie wymieniaj tylko zestawu kursów, które Twoim zdaniem są niezbędne, podaj powody i doświadczenia, które podyktowały twoją listę.
2

Dodałbym również do listy Inżynierię oprogramowania lub Praktyki projektowania, chociaż ich treść zazwyczaj są odbierane przez studentów z branży.

Ponadto, moim zdaniem (choć nie ma to dużego doświadczenia) firmy tak naprawdę nie chcą większości teoretycznych rzeczy nauczanych na kursach takich jak bazy danych itp., Chcą, aby ludzie rozumieli i mogli z nich korzystać .

EDYCJA: Ze względu na głosowanie mam ochotę wyjaśnić moją odpowiedź. Jestem studentem informatyki ostatniego roku, a moje doświadczenie opiera się na moich stażach i rozmowach kwalifikacyjnych z wiodącymi firmami w tej dziedzinie. Z mojego doświadczenia wynika, że ​​ludzie rzadko wymagają stosowania skomplikowanych algorytmów lub kodowania bardzo skomplikowanych struktur danych podczas wywiadów lub pracy.

Bardziej przydatne, jeśli możesz tworzyć bazy danych i korzystać z nich, korzystać z kontroli źródła, umieć poprawnie debugować, umieć używać wzorców projektowych itp. Jednak, jak powiedziałem, umiejętności te są zazwyczaj podnoszone w branży i nie są objęte kursami. Inżynieria oprogramowania / praktyki projektowe zazwyczaj obejmują zbudowanie projektu średniej wielkości, bardzo przydatnego do nauki wszystkich tych umiejętności.

apoorv020
źródło
Podaj więcej szczegółów na temat swoich doświadczeń i powodów, dla których ktoś powinien wziąć udział w tych kursach.
@Mark: Czy możesz wyjaśnić uzasadnienie opinii negatywnej?
apoorv020
@ apoorv020 bez wyjaśnienia, dlaczego polecasz inżynierię oprogramowania lub praktyki projektowe, twoja odpowiedź nie jest przydatna. Twoja edycja wciąż nie wyjaśnia, dlaczego je polecasz.
@ apoorv020 jedyną korzyścią przy podejmowaniu praktyk inżynierii oprogramowania lub projektowania jest to, że zazwyczaj budujesz projekt średniej wielkości (cokolwiek to znaczy)? Czego nauczyłeś się na tych kursach?
Dobrze wiedzieć, ale to nie są tematy z CS.
Thomas Owens
2

Rzeczy, których nauczyłem się na studiach, których używam na co dzień:

  • Metodologia projektowania obiektowego
  • Wzorce projektowe
  • Wyrażenia regularne
  • Podstawowe algorytmy i analizy
  • Struktury danych

Chciałbym wziąć kurs bazy danych. (Odebrałem wystarczająco dużo, by się utrzymać, odkąd ukończyłem szkołę, ale chciałbym wiedzieć więcej.) Chciałbym również, aby nauczono kontroli wersji - jest wszechobecna, niezwykle użyteczna i została całkowicie zignorowana w programie nauczania mojej szkoły.

Musiałem wziąć kilka kursów matematyki. Nie korzystałem z rachunku różniczkowego od czasu ukończenia studiów. Chciałbym wziąć kurs statystyczny. (Ponownie zebrałem wystarczająco dużo, aby przetrwać od ukończenia szkoły, ale chciałbym wiedzieć więcej).

Poza działem CS weź kurs pisania. Dobre umiejętności komunikacji pisemnej są niezbędne do osiągnięcia sukcesu.

PCW
źródło
+1 Zaskoczony, że bazy danych nie były obowiązkowe na twoim kursie, zwykle uważane za niezbędny element.
Orbling
To było. Wydostałem się z tego technicznie i żałuję.
pwc
@Orbling: Często małe wydziały (w przeciwieństwie do tych w dużych szkołach państwowych) po prostu nie mają wystarczającej liczby wykładowców, aby wymagać każdego ważnego tematu. Na przykład w mojej szkole bazy danych były do ​​wyboru.
Macneil
@Macneil: Na moim kursie podstawowy kurs baz danych był warunkiem wstępnym (obejmującym wszystkie podstawy: modelowanie ER, normalne formy, SQL (nie tylko podstawowy SQL, złożony / zagnieżdżony itp.), Umieszczanie indeksu itp.), Ten drugi, bardziej złożony , kursy bazy danych były do ​​wyboru (myślę, że w sumie były trzy). Nigdy nie zdecydowałem się ich wziąć, ponieważ doszedłem do wniosku, że były to rzeczy, które mogłem wchłonąć niezależnie łatwiej niż inne kursy, za którymi tęsknię. Myślę, że zamiast tego wziąłem zaawansowaną OR.
Orbling
@pwc: Założę się, czy pamiętasz, dlaczego tak się stało, a nie jak?
Orbling
2

Istnieje wiele ważnych kursów, w zależności od kierunku, w którym planujesz iść. Jednak zakładając, że możesz w ogóle programować, najważniejszym kursem musi być:

  • Struktury danych i algorytmy

    Praktycznie wszystko w informatyce wraca do obsługi danych przy użyciu algorytmów. Zwróć szczególną uwagę na tablice i tablice skrótów, ponieważ są to najbardziej przydatne struktury danych w powszechnym użyciu, ale listy i drzewa i wykresy (cóż, listy są ograniczonymi typami drzew, a drzewa są ograniczonymi typami wykresów) być również ważnym. Ponadto zrozumienie algorytmów ma kluczowe znaczenie dla tworzenia kodu, który nie jest straszny. (W przeciwnym razie zrobisz rzeczy, które są po prostu okropne, na przykład użyjesz algorytmu O ( n 3 ), w którym zrobi to O ( n log n ).) Jeśli twój stopień CS nie ma obowiązkowego kursu DS + A, to nie CS. Lub inżynieria oprogramowania. A nawet po prostu programowanie.

Poza tym kurs, który przez lata był dla mnie najbardziej użyteczny w wielu dziedzinach, to:

  • Konkurencja

    Współbieżność ma wiele aspektów, ale oczekiwałbym zrozumienia różnicy między pamięcią współużytkowaną a przekazywaniem wiadomości. Chciałbym również, aby istniało silne omówienie strategii blokowania (muteksy, semafory itp.) I transakcji.

    Jest to oczywiście istotne dla zrozumienia równoległości, ale ma również kluczowe znaczenie dla wszystkiego, co jest dystrybuowane (np. Pisanie usługi udostępnianej w Internecie, nawet jeśli jest ona jednowątkowa, ponieważ klienci i tak będą asynchroniczni). Rozumiem, że jest to również przydatne do pisania gier (które zwykle są wielowątkowe) i pracy z urządzeniami osadzonymi.

Poza tym myślę, że w najlepszym interesie większości studentów jest, aby byli narażeni na tak wiele różnych pomysłów, jak to możliwe. Wiele języków programowania i paradygmatów. Wiele różnych obszarów zastosowania. Rozsądna ilość matematyki (znowu, ponieważ jest tak często przydatna), a także pewne narażenie na czynniki ludzkie i psychologię (ponieważ każde oprogramowanie, które wchodzi w interakcje z użytkownikami, ma do czynienia z ludźmi). W końcu nigdy nie wiesz dokładnie, co będziesz robić w przyszłości, więc planowanie elastyczności to świetna strategia życiowa.

Donal Fellows
źródło
1

Kiedy byłem na studiach, było kilka tematów, których nie widziałem w życiu, a czasem intuicja okazała się słuszna (metody formalne są w rzeczywistości praktyczne tylko w przypadku trywialnych problemów w większości przypadków), a innym razem było całkowicie błędne (notacja Big-O jest bardzo przydatna), więc wydaje mi się, że moje młodsze „ja” miało częściowo rację.

Jeśli chcesz się przygotować do prawdziwego świata, oprócz rzeczy zalecanych powyżej przez @ K-Ran, sugeruję przeczytanie Code Complete i wykorzystanie go jako podstawy do głębszych badań nad dowolnymi tematami, które uważasz za trudne lub których nie masz. wystarczająco osłonięty.

glenatron
źródło
Czasami uważam, że metody formalne są użyteczne, choć oczywiście tylko na małych elementach. Myślałem o Dijkstrze i in. jak powiedzenie czegoś takiego: „Jeśli jesteś doskonałym matematykiem, możesz być dobrym programistą”.
David Thornley,
Podejrzewam, że jeśli pracujesz nad kodem, życie będzie zależeć od ciebie, po prostu musisz mieć solidną wiedzę na ten temat. Ale praca, którą wykonałem, nigdy nie była konieczna. Gdybym go teraz potrzebował, musiałbym wrócić i nauczyć się go od nowa ...
glenatron
Rzeczy takie jak Z są naprawdę używane tylko w przypadku oprogramowania o kluczowym znaczeniu dla organizacji, w których, jak mówisz, zagrożone jest życie. Wydaje mi się jednak, że ich uczenie się powoduje znacznie większą świadomość poprawności kodu i pozwala na głębsze zapoznanie się ze specyfikacją wszelkiego rodzaju. Czasami to, czego się uczysz, nie jest dla samego siebie, ale pomaga ustalić, co stoi wyżej.
Orbling
Pomyśl o tym, jak o większych bryłach, które są solidne. Jeśli udowodniłeś, że Twoje komponenty są poprawne (i przetestowałeś je, aby znaleźć głupie błędy, które popełniłeś przy projektowaniu i sprawdzaniu), masz mniej powodów do zmartwień podczas pisania i debugowania.
David Thornley,
1

Myślę, że powinieneś przestudiować następujące rzeczy:

System operacyjny: - Nawet jeśli nie musisz go używać jako programisty, warto wiedzieć, jak działa system operacyjny i oczekuje się tego od stopnia CS. Każda dobra książka może pomóc.

OOP: - To jest chleb z masłem. Koniecznością. Książki, jeśli chcesz zapytać: Twoja pierwsza książka powinna być: - kieruj się najpierw OOAD, potem możesz wybrać książkę Grady'ego Boocha i Ivara Jacobsona

Struktury danych i algorytmy: - Bardzo ważne, aby rozwinąć logiczne myślenie i sposób myślenia.

Tyle mi wystarczy. Nigdy nie jest za późno. :)

Abhi
źródło
1

Jako osoba, która regularnie przeprowadza rozmowy kwalifikacyjne z kandydatami do pracy programistycznej i osoba, która po ponad 12 latach pracy w branży czuje się rozsądnie osiągnięta, proponuję następujące

  • Projektowanie baz danych i SQL: Zadziwiające, jak wielu programistów nie zna prostego SQL, a ci z dobrymi umiejętnościami SQL są nieocenieni. Aby móc zaprojektować dobrą bazę danych, może nie być przydatna w firmie, która ma ustaloną strukturę bazy danych, dla firm rozpoczynających działalność i firm przechodzących zmiany, to MUSI!
  • Wzorce projektowe. Pomogą ci w podejmowaniu lepszych decyzji dotyczących dobrego projektu
  • OOP: Zazwyczaj jest to warunek wstępny dla większości kursów, ale pomoże.
  • Algorytmy: Ponieważ tak niewielu ludzi wie, czym jest rekurencja, nie mówiąc już o zrozumieniu, kiedy może zaoszczędzić im wiele skomplikowanego kodowania
  • Struktury danych: Większość współczesnych języków radzi sobie z tymi rzeczami, ale ich zrozumienie jest kluczem do dobrego projektowania.

Następnie dodatkowe prace programowe przeczytaj:

  • Książki typu certyfikacji. Często uczą cię składni i operatorów typu okładki. O wiele ważniejsze jest WIEDZIEĆ, dlaczego coś robisz, niż „ponieważ to działa”, co jest tak powszechne.
Codemwnci
źródło
1

TO ZALEŻNOŚCI , nie ma jednej dobrej odpowiedzi na to pytanie.

Programista to ogólny świat identyfikujący kogoś, kto pisze oprogramowanie komputerowe.

Teraz istnieje oprogramowanie wszelkiego rodzaju. Na przykład, używając wikipedii jako źródła uogólnienia, możemy spotkać 3 wielkie uogólnienia :

  • programowanie systemu
  • oprogramowanie do programowania
  • oprogramowanie

W pierwszym polu programowania systemu opracuj sterowniki urządzeń, system operacyjny, serwery, dzięki czemu możesz na przykład przejść kurs systemu operacyjnego.

ale co z oprogramowaniem do programowania ? tutaj, jak napisała wikipedia, możesz kodować kompilatory, debuggery, tłumacze, linkery, edytory tekstu, więc kurs automatyzacji teorii, teorii języka, języka i kompilatorów może być przydatny.

Czy nie możemy mówić o jakimkolwiek oprogramowaniu aplikacyjnym:
- gry wideo: algebra, fizyka, kursy obiektowe?
- oprogramowanie matematyczne: kursy matematyczne?
- edycja obrazu: matematyka, fizyka, kursy algorytmów?
- automatyka przemysłowa: matematyka, fizyka, algorytm, kursy robotyki?
- oprogramowanie medyczne: biologia, medycyna, co jeszcze kurs?
- dużo rzeczy tutaj: dużo kursów tutaj.

Jak widać, jest wiele rzeczy, które możesz śledzić i przydadzą się w twojej pracy.

Z mojego doświadczenia jestem inżynierem oprogramowania systemowego i aplikacyjnym w dziedzinie bezpieczeństwa (chcesz przejść kurs bezpieczeństwa?), Zaczynając od małego doświadczenia w programowaniu, interesuję się algorytmami i systemem rozproszonym i znów czuję niewygodne w prostocie aplikacji ogólnego przeznaczenia, którą napisałem (sniffer, system wykrywania włamań do sieci, separator protokołu i detektor itp.).

Jak kwaśno nauczyłeś się informatyki teoretycznej! Czy znasz te kursy? : P

Nauczyłeś się na przykład, że cały język komputerowy można dopasować do zestawu obliczalnych funkcji matematycznych i na przykład, jeśli twoje doświadczenie osiągnie tę samą ścieżkę, wkrótce poczujesz się nieswojo w tym małym zestawie rachunku różniczkowego i podobnie jak ja, możesz zacząć widzieć, jak rozwija się oprogramowanie nie jest tak wciągające i niesamowite, ponieważ ten sam WZÓR PROJEKTU powraca ponownie (czy uczęszczasz na kursy wzornictwa projektowego?) i na przykład możesz zacząć bardziej interesować się DLACZEGO i JAK język można tłumaczyć na funkcje matematyczne i zacząć naucz się, że język komputera nie jest tak skomplikowany! wkrótce możesz na przykład być bardziej zaskoczony osobą i psychologią, możesz zainteresować się nią i zostać dobrym kierownikiem projektu! czy śledzisz kursy na temat cyklu życia oprogramowania?

Więc teraz, jaki jest kurs MUST-HAVE w Twojej karierze CS?

Proponuję nauczyć się tyle, ile możesz się uczyć na wszystkich polach, szczególnie na polu teorii, ponieważ we wspólnej dziedzinie pracy szybko możesz się nudzić z powodu niewielkiej złożoności wokół ciebie, a stając się pracownikiem zatrudnionym w pełnym wymiarze godzin masz naprawdę mniej czasu na naukę jak rzeczy naprawdę działają i znacznie więcej czasu, aby zobaczyć, jak ludzie z dużą wiedzą teoretyczną przewidzieli rzeczy do pracy i dają ci możliwość kodowania, aby dostać jedzenie w domu.

w informatyce jest złe poczucie rzeczywistości. na przykład informatyk czasami jest naprawdę daleko od programisty.

spójrz na wyjaśnienie wikipedii.

baw się dobrze z życiem :)

moje 2 centy.

przepraszam za mój bardzo zły angielski.

wygwizdanie
źródło
1

Bez wątpienia najważniejszą rzeczą, w której studenci CS powinni biegle mówić, jest angielski.

Bez zrozumienia zarówno mówionego, jak i pisanego angielskiego na zawsze będziesz w niekorzystnej sytuacji.

Wystarczy spojrzeć na mnóstwo pytań, które pojawiają się na stronach Stack. Zbyt wiele z nich jest trudnych do rozszyfrowania. Niektóre osoby używają mieszanki l33t, wysyłania SMS-ów (nie jestem pewien poprawnego terminu). Inni wypowiadają się i po prostu dodają znak zapytania, pomijając ważne małe myśli, takie jak czasowniki lub przymiotniki.

Jeśli nie potrafisz się komunikować, nie będziesz w stanie sprawić, że zrozumiesz, a tym bardziej zrozumiesz, co mówią inni.

Cała reszta to tylko szczegóły. Jeśli potrafisz się komunikować, masz co najmniej przeciętną inteligencję i rozumiesz, co czytasz, to również możesz mieć udane programowanie kariery.

Nie ja
źródło
1

Podchodzę do tego z nieco innej perspektywy, ponieważ nie ukończyłem CS, ukończyłem inżynierię elektroniczną (z nieletnim w biznesie).

Na tej podstawie uważam, że lista rzeczy, które musisz zrozumieć, jest stosunkowo krótka, ponieważ ja (i wielu innych absolwentów CS) przeżyję szczęśliwie, nie wiedząc nic o projektowaniu kompilatora lub tym podobnych.

Co powiedziałbym, że wybrałem, które uważam za przydatne:

  • Projektowanie RDBMS - RDBMS stoją za większością systemów i witryn i powinieneś zrozumieć przynajmniej podstawy tego, co się dzieje (nauczyłem się tego podczas pracy).
  • Podstawowy projekt interfejsu użytkownika - wszyscy najlepsi programiści, z którymi współpracowałem, mogą stworzyć użyteczną aplikację, która nie była brzydka jak diabli. Z wyjątkiem jednego, ale jest wyjątkiem, który potwierdza regułę.
  • Niektóre podstawowe programowanie - i mam na myśli podstawowe. Nauczyłem się trochę C (do przetwarzania obrazów i systemów osadzonych), trochę asemblera (którego zapomniałem w ciągu kilku tygodni po ukończeniu kursu) i trochę Pascala (podstawowy kurs komputerowy był standardem dla wszystkich inżynierów). Podczas wywiadu jestem zdumiony, jak niewielu absolwentów CS może naprawdę programować w jakikolwiek sposób, że organizacje komercyjne uznają je za przydatne, więc nie oczekuję wiele, ale oczekuję, że znają podstawy.
  • Logika - nauczyłem się tego przez elektronikę cyfrową, matematyków przez teorię, absolwentów CS przez programowanie, ale jak się tego nauczysz, powinieneś dobrze go zrozumieć, ponieważ tyle się do tego sprowadza.
  • Umiejętności komunikacyjne - odbyłem kilka kursów na uniwersytecie poza moim faktycznym wykształceniem, umiejętnościami prezentacji i asertywnością. Dużo zdrowego rozsądku, ale kilka razy nigdy nie boli mnie mówienie rozsądnych rzeczy.
  • Podstawy biznesu i rachunkowości. Niektórzy programiści zachowują się tak, jakby to nie miało znaczenia, ale moim zdaniem ma to znaczenie dla każdego, kto pracuje w firmie - tak działa gra i będzie ona kontrolować twoje życie, więc dlaczego nie chcesz poznać przynajmniej podstaw jak i dlaczego coś się dzieje?

A jeśli w ogóle masz szansę dowiedzieć się o zarządzaniu projektami, to naprawdę nie zaszkodzi, ale w wielu przypadkach na uniwersytecie jest to bardzo źle nauczone i jest to coś, czego nauczysz się trochę w pracy, tylko przy projektach.

Jon Hopkins
źródło
0

Do listy dodałbym również kilka podstawowych kursów HR / psychologii.

Może to wydawać się dziwnym dodatkiem, ale część pracy zawodowej polega na uczeniu się, jak sprzedawać się i negocjować. Wejście do pierwszego „prawdziwego” wywiadu bez solidnej wiedzy na temat motywacji drona HR to przepis na katastrofę, który prawdopodobnie skończy się wkręceniem studenta w niską pensję.

Poznaj swojego wroga, abyś mógł się chronić.

Peter Bernier
źródło
-1

1 rok:

  1. Podstawowy OOP w języku wysokiego poziomu
  2. Struktury danych

Drugi rok:

  1. Kompilator, budujesz prosty zarys jednego formularza
  2. Konkurencja

Trzeci rok:

  1. Algorytm
  2. System operacyjny, dodajesz funkcjonalności i rozszerzenia do prostego
  3. Język formalny

4 rok:

  1. Sieć
  2. System rozproszony
  3. Interfejs użytkownika
  4. Zaawansowany kompilator
  5. Zaawansowany system operacyjny
  6. Sztuczna inteligencja
  7. Grafika komputerowa

Kursy te powinny zapewnić mnóstwo teorii i praktyki kodowania.

Thierry Lam
źródło
-2

Dziwne, że nikt nie wspominał o architekturze komputerowej.

Sorantis
źródło
Myślę, że architektura komputera jest ważna, jeśli chcesz zrozumieć wpływ pamięci podręcznych, błędów stron itp.
apoorv020