Jak mogę całkowicie samodzielnie studiować informatykę? [Zamknięte]


46

Będąc programistą całkowicie samoukiem, chciałbym, gdybym mógł się lepiej samouczyć kursu informatyki prowadzonego dla typowego absolwenta CS.

Znalezienie różnych zasobów w Internecie było łatwe, istnieje oczywiście otwarte oprogramowanie MIT , a także kursy Coursera ze Stanford i innych uniwersytetów. Istnieje wiele innych otwartych zasobów rozsianych po Internecie i kilka dobrych książek, które są wielokrotnie polecane.

Dużo się nauczyłem, ale moje studia są bardzo rozdrobnione, co naprawdę mnie wkurza. Bardzo bym chciał. Gdzieś mógłbym znaleźć ścieżkę, którą powinienem podążać, i stos, do którego powinienem się ograniczyć, aby być pewnym, jakie istotne części informatyki studiowałem, a następnie systematycznie podchodzić do tych, których nie znałem.

Problem z Wikipedią polega na tym, że nie mówi ci, co jest najważniejsze, ale nalega na bycie pełnym źródłem informacji.

MIT otwarte przedmioty kursowe dla informatyki i elektr. Inż. ma ogromną listę kursów, które również nie informują o tym, które kursy są niezbędne, a które opcjonalne, zależnie od zainteresowań / wymagań danej osoby. Nie znalazłem wzmianki o kolejności, w jakiej należy uczyć się różnych przedmiotów.

Chciałbym stworzyć listę, którą będę mógł śledzić, na przykład ten obojętny

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

Jak wyraźnie widać, nie mam pojęcia, z czego składają się poszczególne przedmioty informatyki.

Byłoby to niezwykle pomocne, nawet gdyby ktoś wskazał niezbędne kursy z MIT Course ware (+ niezbędne przedmioty nieobecne na MIT OCW) w zalecanej kolejności badań.

Wymienię posty, przez które już przeszedłem (i nie dostałem tam tego, czego szukałem)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - najlepsza odpowiedź mówi, że nie warto studiować cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - wskazuje na MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming


Całkowicie? Te wszystkie fajne rzeczy teoretyczne?

Tak, naprawdę podoba mi się teoretyczna zabawa, myślę, że zwiększy to moje rozumienie tematu (choć to kwestia dyskusji w moim kręgu). Poza tym czuję się samotny, gdy moi przyjaciele CS rozmawiają na temat CS lub denerwuję ich, zadając zbyt wiele pytań.
Optimus

2
Pamiętaj, że w programie nauczania są pewne „wyspy”, w których wszystko się łączy. Na przykład rzadko potrzebujesz rachunku lambda w teorii grafów. Weź również pod uwagę, że fajnie byłoby mieć mentorów w pobliżu - czy mieszkasz w pobliżu odpowiedniej instytucji edukacyjnej?

Właściwie to robię i jestem przyjazny z profami, ale nie mogę ich cały czas pluskać. Przyczyniły się one do dużej fragmentacji wiedzy, którą mam przede wszystkim.
Optimus

3
W takim przypadku możesz być w stanie wybrać wybrany kurs lub dwa - co pozwala ci cały czas na błędy w profach.

Odpowiedzi:


24

Widziałem jakiś materiał kursu z MIT i był szokująco zły . Mieli materiały dydaktyczne, które wymagały VC5, wiązki ukrytych zmiennych globalnych, przekazujących kolory jako „niebieskie” zamiast 32-bitowego ARGB, nie mówiąc już o pływakach 4x [0,1], tego typu rzeczy. Nie ufałbym programowi ani kodowi tylko dlatego, że pochodzi on z renomowanego uniwersytetu.

Mój dyplom CS (z uniwersytetu, który jest w pierwszej dziesiątce w Wielkiej Brytanii dla CS) składał się z:

Pierwszy rok:

  1. OOP - super podstawy
  2. Systemy komputerowe - takie rzeczy, jak binarne reprezentacje liczb całkowitych.
  3. Podstawowa teoria relacyjnych baz danych
  4. Matematyka dla CS - prosta geometria 2D i 3D.
  5. Trochę HTML / JS - pełne rzeczy dla początkujących
  6. Równie mały kawałek PHP.
  7. Odrobina programowania funkcjonalnego

Drugi rok:

  1. Kwestie prawne związane z informatyką, takie jak przepisy dotyczące ochrony danych użytkowników
  2. Języki programowania - omówiono hierarchię i leksykę Chomsky'ego
  3. Systemy operacyjne, sieci i Internet - głównie takie rzeczy, jak pamięć wirtualna i stronicowanie, stos IP
  4. Dwuwymiarowa grafika komputerowa - w większości tylko dowodzenie twierdzeń leżących u podstaw matematyki
  5. AI - podstawowe opisy sieci neuronowych, bayesowskich systemów wierzeń itp.
  6. Analiza wymagań - krótki przegląd UML, wymagań funkcjonalnych / niefunkcjonalnych.
  7. Projekt zespołowy

Trzeci rok:

  1. Analiza algorytmów - głównie teoria złożoności
  2. Implementacja języków programowania - techniki analizy LL / LR, CFG i tym podobne.
  3. Oprogramowanie do zarządzania projektami - spojrzenie na modele Waterfall / Agile
  4. International Computing - Unicode i inne zabawy lokalizacyjne
  5. Zaawansowana sztuczna inteligencja - nie wiem, szczerze mówiąc, wkrótce mam egzamin
  6. Grafika komputerowa 3D - przede wszystkim ponownie dowodzi twierdzeń o macierzach obrotowych i tym podobnych
  7. Systemy oparte na agentach - głównie o komunikowaniu się asynchronicznych agentów, podejmowaniu decyzji grupowych itp.
  8. Aplikacje mikroprocesorowe - cyfrowe przetwarzanie sygnału
  9. Robotyka - obejmuje takie rzeczy, jak widzenie komputerowe i podejmowanie decyzji przez roboty na wysokim poziomie

Jak zauważysz, prawie wszystko jest „podstawą” czegoś i prawie nic nie jest objęte użyteczną głębią.

Rzeczy, które były warte zrobienia, niezbędne:

  1. OOP- i jeszcze trochę, a potem jeszcze więcej
  2. Programowanie funkcjonalne - także trochę więcej. Spróbuj wybrać język, taki jak C ++ lub C #, w którym nie musisz ponownie uczyć się składni i narzędzi itp., Aby objąć oba style.
  3. Warto wiedzieć o częściowej pamięci wirtualnej systemu operacyjnego, podobnie jak tryb jądra kontra tryb użytkownika. Pomiń segmentację i stos IP.
  4. Analiza wymagań - musi być przydatna w każdym projekcie
  5. Analiza algorytmów - ważna jest wiedza na temat złożoności algorytmicznej, sposobu jej zmniejszenia oraz złożoności typowych operacji.
  6. Modele zarządzania projektami oprogramowania - wiele sklepów robi Agile, a wiele starszych wciąż robi modele w stylu Waterfall.
  7. Komputery międzynarodowe - Unicode jest niezbędny

Rzeczy, które warto było zrobić, opcjonalnie:

  1. Języki programowania - hierarchia Chomsky'ego, narzędzia leksykalne i parsujące. Pomiń teorię parserów LL lub LR - parser LR może zaakceptować praktycznie każdy realistyczny jednoznaczny CFG, a kiedy nie, dokumentacja generatora parsera ci o tym powie.
  2. Grafika 3D. Nie mam na myśli „Udowodnij, że to formuła macierzy rotacyjnej” strata czasu, mam na myśli faktyczne rzeczy „To jest moduł cieniujący wierzchołki” lub GPGPU. To zabawne, interesujące i inne.
  3. Niektóre elementy sztucznej inteligencji są zabawne jak potencjalne pola i szukanie ścieżek.

Rzeczy, które są niezbędne, ale i tak ich nie opisałem:

  1. Współbieżność - obowiązkowa wiedza, przynajmniej podstawy, dla każdego w 2012 roku.

Reszta była całkowitą stratą czasu. Niestety większość z tych dziewięciu punktów albo już znałem, albo zbierałem przydatne części w innym miejscu. Jeśli czytasz o takich sprawach, jak problem FizzBuzz , szybko staje się jasne, że tak naprawdę nie musisz wiedzieć tyle, aby znaleźć się na wierzchu paczki - co jest szczęśliwe, ponieważ mój stopień naukowy i wiele materiałów, które widziałem w Internecie dla innych stopni tak naprawdę wcale nie uczą.


3
@ ThorbjørnRavnAndersen: Teoria to narzędzie do pisania kodu, nic więcej. Teoria jest nic warta, jeśli nie można jej użyć do stworzenia lepszego kodu.
DeadMG

3
@Optimus: zdecydowana większość teorii nie może pomóc w ulepszeniu kodu.
DeadMG

3
Teoria jest podstawą, aby wiedzieć, jaki kod można napisać, a co nie.

17
W tym poście jest kilka dobrych rad, ale zbyt dogmatycznie traktujesz niektóre pola jako stratę czasu. Obecnie programowanie zadań jest bardzo zróżnicowane, a strata czasu na jedno zadanie może być niezbędna dla innego. Zamiast po prostu odrzucić coś jako stratę czasu, pomocne byłoby opisanie rozwoju, w który byłeś zaangażowany.
Charles E. Grant

4
W ciągu ostatnich kilku lat przeprowadziłem wiele wywiadów i wydaje się, że największą luką w kolegiach jest nauczanie struktur danych i algorytmów. Drugą największą luką jest zrozumienie, w jaki sposób narzędzia są wdrażane wewnętrznie. Moim zdaniem zajęcia z używania określonego narzędzia są stratą czasu. Znajomość składni C ++ nie ma większego sensu, jeśli nie możesz wyjaśnić, kiedy używać tabeli mieszającej, a kiedy drzewa.
Gort the Robot

5

Open Course ware to tylko lista kursów, które udostępnili. Jeśli chcesz wiedzieć, co zrobiłby uczeń, przejdź na stronę MIT (bez OCW) i spójrz na rzeczywisty program. Mają listę wymagań i tego, co uważa się za warunek wstępny. Oto ich strona.


Patrzę na to, ale ich wymagania są dość zwięzłe. i gdzie jest długa lista kursów?
Optimus,


dzięki, to również będzie pomocne, Dobrze wiedzieć, jaki program nauczania realizują duże univs
Optimus

1
W tej chwili robię EECS w Berkeley. Jeśli program MIT EECS ma strukturę podobną do Berkeleya, nie uzyskasz tam wielu wskazówek: mamy krótką sekwencję wprowadzającą, a następnie dosłownie rób co chcesz w dowolnej kolejności, o ile wykonujesz minimalną liczbę zaawansowanych kursy. Myślę, że to niesamowite, ale prawdopodobnie nie pomoże ci ustalić, które kursy wybrać: sam musiałem podjąć te same decyzje. (Miałem pomoc mojego wydziałowego doradcy, ale zupełnie przypadkowo jego rada była taka, żeby wziąć udział w seminarium dla absolwentów :)).
Tikhon Jelvis

@TikhonJelvis Łatwiej jest dokonać wyboru tego, czego chcesz się nauczyć, a czego nie, kiedy masz pojęcie, jaki jest zakres pola i jaki zakres powinien przynajmniej obejmować. Ja, będąc absolwentem inżynierii lądowej, nie mam pojęcia, co dzieje się w informatyce i inżynierii. Pole
Optimus,

5

Wypróbuj zalecenia programowe dla informatyki z ACM / IEEE z 2001 r., Do których link znajduje się tutaj: http://www.acm.org/education/curricula-recommendations

wraz z aktualizacjami CS 2008.

Strona 17 raportu z 2001 roku zawiera poręczną tabelę, która podkreśla całą „podstawową” wiedzę i wciąż zawiera listę przedmiotów do wyboru.

Program studiów licencjackich nie miałby czasu na pokrycie nawet kursów uznanych za kluczowe w tych zaleceniach, więc zbroją niektóre kategorie razem i pozwolą uczniom wybrać spośród nich (np. Systemy operacyjne, języki programowania i inżynieria oprogramowania Oprogramowanie, a uczniowie wybierają ścieżkę).

Wymagane zajęcia można znaleźć na stronie internetowej działu CS praktycznie dla każdej szkoły, i powinny to być jakieś wersje tego.


dobrze, trochę nieaktualne, ale nadal wiele przedmiotów pozostawionych do wyboru w normalnym programie nauczania jest uważanych za kluczowe, fajnie jest mieć większy wybór studiów, jeśli zabraknie rzeczy, które ustawiłeś w kolejce +1.
Optimus

Dla leniwych ta lista zawiera: Dyskretne struktury (DS) Podstawy programowania (PF) Algorytmy i złożoność (AL) Architektura i organizacja (AR) Systemy operacyjne (OS) Net-Centric Computing (NC) Języki programowania (PL) Człowiek-komputer Interakcja (HC) Grafika i grafika (GV) Inteligentne systemy (IS) Zarządzanie informacjami (IM) Zagadnienia społeczne i zawodowe (SP) Inżynieria oprogramowania (SE) Nauki obliczeniowe i metody numeryczne (CN).
Damien Roche,

-4

Jeśli mogę, chciałbym zasugerować dołączenie do github.com w ramach procesu uczenia się.

Następnie możesz wyszukać kod, który ma jakąś rzeczywistą aplikację, którą jesteś zainteresowany, sklonować go dla siebie, pracować z nim, kodować go i poznać, i ostatecznie zacząć przesyłać łatki z powrotem do projektu źródłowego , a później pracuj nad projektem typu open source, którym jesteś zainteresowany.

I oczywiście poznasz git, który jest tym lepszy.


5
-1: Choć cenny, nie naraża go na teoretyczne aspekty informatyki, które powinien znać.
Ken Bloom

kiedy już to zrobiliśmy, mamy również osobiste repozytorium git, Kręcenie się wokół github sprawia, że ​​jesteś lepszym programistą
Optimus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.