Dlaczego uczy się CS zapamiętywania? [Zamknięte]

23

W ubiegłym roku w szkole średniej brałem zaawansowaną informatykę. Wydaje się, że uczono nas po prostu zapamiętywania kodu i funkcji, a nie tego, jak być zaradnym i wydajnym w korzystaniu z dokumentacji i tym podobnych.

Praktycznie wyobrażam sobie, że wiele (jeśli nie wszystkie) zadania programistyczne pozwoliłyby ci przejrzeć dokumentację, przejrzeć wcześniejszy kod i kod innych, zasadniczo robiąc to, co mój nauczyciel uznałby za „oszukiwanie”.

Chociaż zgadzam się, że podstawowe pojęcia są niezbędne do zapamiętywania (w dowolnym temacie), wydaje mi się zbędne i niepraktyczne, aby dać egzamin papierowy dla klasy CS, szczególnie gdy praktycznie miałbyś kompilator, debugger, referencję podręczniki i cały internet, do którego można się odnosić w każdej rzeczywistej sytuacji w pracy.

Dlaczego CS uczy się koncentrowania na zapamiętywaniu kodu i funkcji, a nie na nauczaniu przydatnych umiejętności, w tym jak używać i interpretować dokumentację, przykładowy kod, debugger i tym podobne?

esqew
źródło
34
CS nie polega na zapamiętywaniu kodu i funkcji. Gdzie do cholery studiujesz CS? Czy mogę zasugerować, że prawdziwym problemem jest to, że kurs, który bierzesz, to bzdury?
Andres F.,
1
@AndresF. OP jest w dziedzinie zaawansowanego informatyki, która jest kursem oferowanym licealistom (przed uniwersytetem).
3
@GlennNelson Oops! Źle to odczytałem. Ok, w takim przypadku: esqew : poczujesz ulgę, wiedząc, że na poziomie uniwersyteckim CS nie (głównie) nie zapamiętuje kodu. Będziesz jednak musiał przeczytać wiele rzeczy;) Edukacja CS nie musi również koniecznie oznaczać znalezienia pracy (prawdopodobnie będziesz rozczarowany, jeśli tak uważasz)
Andres F.,
1
Powinieneś wiedzieć, że nie jest tak w większości szkół wyższych. W mojej szkole każdy test informatyki był otwartą notatką / otwartą książką.
Casey Patton
2
Zauważ, że część odpowiedzi najprawdopodobniej jest taka, że CS nie jest stopniem programistycznym . Nie oczekuj, że nauczysz się programowania z klasy CS. Oczekuj, że poznasz wszystkie podstawowe teorie i pojęcia, które akurat są odpowiednie dla programisty. I na pewno nauczysz się kilku języków programowania i nauczysz się trochę programowania podstawowego, ale przede wszystkim faktyczne programowanie jest czymś, co zakładają, że dostaniesz , abyś mógł skupić się na wszystkich materiałach CS , a nie na odwrót na około.
czerwiec

Odpowiedzi:

37

W klasie licealnej jesteś na najbardziej podstawowym poziomie swojej ścieżki do opanowania. Rzeczy, które są objęte twoją klasą, to rzeczy, które profesjonalny programista powinien znać na zimno. Pod wieloma względami przypomina to naukę „tabel czasów”. Oczywiście zawsze będziesz mógł pobrać kalkulator w „rzeczywistym świecie”, ale to zapamiętywanie nie tylko zwiększa Twoją szybkość w bardziej złożonych zadaniach, ale także promuje głębsze zrozumienie podstawowych zasad.

Na przykład powinieneś znać kilka algorytmów sortowania, w jaki sposób są one zaimplementowane, jak działają, kiedy najlepiej je wykorzystać, a kiedy nie. To zawsze można było podnieść, ale nie powinno tak być - już więcej matematyk nie powinien szukać 6 razy 8.

Jeffrey
źródło
9
Powinieneś znać podstawową naturę algorytmów sortowania, ale minęło około 15 lat, odkąd miałem okazję napisać coś innego niż sortowanie bąbelkowe. (W przypadku bardzo małego N jest to czasem lepsza odpowiedź.)
Loren Pechtel
1
Chciałbym móc powiedzieć, że wszystkie zajęcia z informatyki są tak dobre. W mojej szkole średniej uczyli podstawowej składni java ... Przez cały rok. Wielu z nich zachwiało się chęcią bycia „programistą”, kiedy nie potrafili nawet wyjaśnić różnicy między sortowaniem bąbelkowym a algorytmem Dijkstry.
Daniel Gratzer
2
Jako przykład, biorąc pod uwagę, że możesz wyszukać dowolne słowo w słowniku, teoretycznie powinieneś być w stanie zrozumieć ten artykuł na meanone . Ale nasze mózgi radzą sobie tylko z ograniczoną liczbą zagnieżdżonych nieporozumień.
Benjol
1
I zaskoczenie - zapamiętywanie moich tabel czasów nie miało dla mnie absolutnie żadnego zastosowania. Ile czasu spędza przeciętny inżynier oprogramowania na wdrażaniu algorytmów sortowania? Och, czekaj - prawdopodobnie około 0 . Nawet przy bardzo odległej przypadkowości, że rodzaj dostarczany przez środowisko nie jest dla ciebie wystarczająco dobry, potrzebujesz tylko jednego faceta, aby napisać bardziej odpowiedni algorytm - i może on użyć trywialnie dostępnych informacji z czegoś takiego jak Wikipedia, aby wybrać i wdrożyć optymalny algorytm - a następnie możesz go ponownie użyć przez resztę czasu.
DeadMG
2
@kaoD: Zapamiętywanie odniesienia nie pomoże w tym ani trochę. Nie wymaga niczego wymyślania, to po prostu pasta do kopiowania. Jedyna różnica między odpowiedzią z pamięci a kopiowaniem z Wikipedii polega na tym, że jedna jest przechowywana w pamięci RAM, a druga w mózgu. Nadal jest to kopia-wklej.
DeadMG
14

Często uczy się tego w ten sposób, ponieważ nauczyciele zazwyczaj nie znają żadnego innego sposobu sprawdzania zrozumienia. Wasze uczucia są całkowicie słuszne, ponieważ nie warto się tak uczyć. Sposób, w jaki ludzie są wykształceni, wymaga desperackich reform!

Życie staje się lepsze, przynajmniej na UIUC odkryłem, że im wyżej idziesz na zajęciach CS, tym mniej egzaminy są zorientowane, jak opisujesz, i na większości moich kursów pozwolono nam na ściąganie kart na całe bzdury że prawdopodobnie zetknąłbyś się z Google, gdybyś faktycznie siedział przy komputerze.

To powiedziawszy, im wyżej poszedłem na moje zajęcia, tym mniej faktycznie uczą cię języków i jak coś wdrożyć. W rzeczywistości miałem tylko jedną klasę, w której faktycznie nauczyły nas wszystkiego o programowaniu, głównie abstrakcyjne koncepcje matematyczne i oczekiwano, że sami rozwiążemy tę kwestię programowania (pod warunkiem, że zawsze chętnie pomagali, ale to było nigdy czegoś na egzaminie).

rudolph9
źródło
2
+1 Amen. Uczyłem programowania na poziomie uczelni, a moim celem było jak najszybsze przeniesienie studentów do miejsca, w którym mogliby realizować własne, unikalne projekty. Nienawidzę, gdy nauczyciele traktują to jako zapamiętywanie lub robienie rzeczy „we właściwy sposób”. Starałem się wprowadzić wystarczające umiejętności, aby uwolnić kreatywność uczniów.
Mike Dunlavey,
... Miałem studentów, którzy byli bardzo mądrzy i bardzo dobrzy w zapamiętywaniu. Zajmie im jeden lub dwa testy, zanim zdołam przekazać, że musisz pisać programy do nauki programowania, a nie zapamiętywania innych rzeczy.
Mike Dunlavey
Usłysz słyszeć! To zabawne, dorastanie W szkole nigdy nie byłem dobry; zły wynik ACT, złe oceny itp. Ale po zapoznaniu się z CS wszystko miało sens. Zdecydowanie walczę w niektórych obszarach, ale nauczyłem się przezwyciężyć rzeczy, które mnie powstrzymywały, dzięki zrozumieniu koncepcji, których nauczyłem się na moich zajęciach z CS.
rudolph9
10

Nie pozwól, aby edukacja przeszkadzała w Twojej edukacji.

- Mark Twain

Jestem Meksykaninem i mówię to, ponieważ w Meksyku nie jest to dobre miejsce na edukację (na żadnym poziomie), przynajmniej na edukację publiczną.

Cóż, w połowie mojej kariery (CS) czuję się dokładnie tak, jak się czujesz, więc zaczynam uczyć się sam i spędzam rok nauki algorytmów, linuxa, skryptów, działania mojego komputera, trochę relacyjnych bazy danych, html, css itp. (trochę o wszystkim). I oczywiście musiałem pomijać zajęcia *, obniżać oceny * i kończyć studia rok później *, wszystko po to, by się uczyć.

Po tym roku wracam do „normalnej” rutyny, wracam do regularnych zajęć, prac domowych, egzaminów i projektów. Zajęcia były nadal nudne, nic nowego do nauczenia, wszystko było takie samo. Postanowiłem więc wejść na strony z programami konkursowymi, takie jak UVA, oceniam online , szef kuchni i euler projektu , a potem obejrzałem kilka wykładów w MIT Open Course Ware i nadal uczyłem się samodzielnie, ale w inny sposób.

Lekcja: Nie pozwól, aby rzeczy się wydarzyły, spraw, aby się stało. Jeśli nie jesteś zadowolony ze sposobu, w jaki się uczysz, zmień go!

* Nie najmądrzejsze decyzje, które podjąłem.

razpeitia
źródło
4
„Nie pozwól, aby rzeczy się wydarzyły, spraw, aby rzeczy się wydarzyły”, - Jeśli kiedykolwiek istniały słowa do przeżycia, to one!
GrandmasterB,
+1 za wycenę. Ja prawie nie musiałem czytać reszty odpowiedzi
Chani
3

To zależy od tego, co próbujesz zapamiętać ...

Na przykład, aby studiować matematykę, trzeba znać algebrę i często trzeba wykazać się kreatywnością w wykonywaniu manipulacji algebraicznych w celu uproszczenia równań. Ale musisz zapamiętać pewne bloki konstrukcyjne, aby móc skupić się na tych interesujących bitach. Musisz na przykład znać swoje tabliczki mnożenia na pamięć i musisz znać pewne tożsamości, abyś mógł rozpoznać, jak manipulować równaniami w celu użycia tych tożsamości.

Aby studiować informatykę, podobnie musisz znać podstawowe struktury i algorytmy danych budulcowych, ponieważ będziesz musiał zastosować je do problemów wyższego poziomu. Jest bardzo mało prawdopodobne, abyś na przykład napisał własną implementację listy połączonej w prawdziwym świecie, po prostu skorzystałby z tej dostarczonej przez bibliotekę. Ale wiedząc, jak zaimplementowana jest lista połączona i jak zaimplementować własną, będziesz w stanie zastanowić się, gdzie i czy użyć połączonej listy, kiedy zaczniesz pracować nad problemami wyższego poziomu. Podobnie, nigdy nie napisałbyś własnej funkcji wyszukiwania binarnego, ale ważne jest, aby zrozumieć, jak to działa, abyś mógł rozumować, na przykład, gdzie baza danych może korzystać z indeksu, a gdzie nie.

Po zapamiętaniu podstawowych elementów konstrukcyjnych łatwiej jest robić takie rzeczy, jak interpretacja dokumentacji. Dokumentacja może wskazywać, że lista jest używana i zakładać, że programista domyślnie wie, że oznacza to, że wstawki to O (1), a wyszukiwania to O (n). Bloki konstrukcyjne są również znacznie bardziej stabilne w czasie - najprawdopodobniej będziesz używać nowych debuggerów co kilka lat, prawdopodobnie będziesz używać tego samego wyszukiwania binarnego przez całą swoją karierę.

Justin Cave
źródło
Gdzie i czy korzystać z połączonej listy, zależy od jej złożoności dla różnych operacji i wydajności pamięci. Nie musisz go wdrażać, aby znać jedną z tych rzeczy. Gdzie baza danych może korzystać z wyszukiwania binarnego? Dla kluczy, które umie porównać. To było łatwe.
DeadMG
3

„Dlaczego CS uczy się koncentrowania na zapamiętywaniu ... w przeciwieństwie do uczenia przydatnych umiejętności” - myślę, że zbytnio przeceniasz zapamiętywanie. Podobnie jak powinieneś ćwiczyć pisanie kodu, interpretowanie dokumentacji, używanie debuggera, powinieneś także ćwiczyć zapamiętywanie.

Możesz być zaskoczony, o ile możesz stać się bardziej wydajny, jeśli nie będziesz musiał tak często sięgać do interfejsu API lub wyszukiwać tylu poleceń debuggera.

Jedną z najlepszych rzeczy, których nauczyłem się w liceum, było obserwowanie przyjaciela, który nigdy nie robił żadnych notatek w klasie. Argumentował, że pamięta, co jest ważne. Zacząłem robić to samo i myślę, że poprawiło to moje umiejętności zapamiętywania, które uważam za bardzo przydatne na co dzień, mimo że wszystkie te odniesienia API były łatwo dostępne.

DXM
źródło
2
Nie trzeba szukać API przez praktykę, nie ucząc API jako formalnej edukacji.
DeadMG
@DeadMG: Umiejętność zapamiętywania większej liczby rzeczy przychodzi wraz z praktyką, tak jak wszystko inne. Wymaganie zapamiętywania niektórych interfejsów API nie jest celem samym w sobie, ale środkiem do trenowania głowy, aby zachować informacje, abyś nie musiał tak często ich szukać. I nie mówię tylko o interfejsach API, jeśli pamiętam jeszcze jedną rzecz, to o jedną krótszą podróż muszę zrobić w Google / MSDN / innym pliku źródłowym, a praktyka ma to wpływ na szybkość pracy .
DXM
Ćwicz z tym konkretnym API . Nie zapamiętywanie rzeczy w ogóle. A czas spędzony na edukacji jest niewielkim przypisem w porównaniu do czasu zawodowego.
DeadMG
2

Egzaminy pisemne i papierowe faktycznie mają sens, jeśli celem jest sprawdzenie pełnego zrozumienia przedmiotu. Zdałem egzamin Computer Science AB prawie dziesięć lat temu i zgadzam się z metodą pisaną i papierową.

Powinieneś znać wystarczająco dużo każdego algorytmu, którego się uczysz na niższych poziomach informatyki, aby móc zrozumieć, jak napisać kod implementacyjny w języku docelowym. Studenci powinni również umieć pisać kod ręcznie, z poprawną składnią. Wszyscy czasami pomijamy średnik lub nawias :). Można także testować umiejętności debugowania i projektowania bez wnioskowania z pomocnego IDE.

Jeśli uczeń nie może tego zrobić, nie ma opanowania tego tematu, może tylko przelotną znajomość.

Peter Smith
źródło
-1: Całe ręczne pisanie poprawnego składniowo kodu informuje, że dana osoba jest w stanie napisać kompilowalny program (prawdopodobnie około miliona razy wolniejszy niż najwolniejszy komputer) - co może nie działać zgodnie z przeznaczeniem. Co gorsza, mają po prostu dobrą pamięć i prawdopodobnie recytują Szekspira, jeśli zostanie o to poproszony. W niewielkim stopniu wskazuje to na umiejętności osoby jako programisty.
mattnz
Ta odpowiedź nie przedstawia uzasadnienia dla przedstawionej opinii. Dlaczego ktokolwiek miałby mieć możliwość napisania implementacji dowolnego algorytmu w swoim ulubionym języku?
DeadMG
Nie chodzi o to, że ta osoba jest dobrym programistą, ale o to, że zna materiał informatyki nauczany w swojej klasie. Jeśli uczeń został nauczony, jak sporządzać wykresy funkcji, uzasadnione jest oczekiwać, że zrobi to na egzaminie. Dobre testy pokonały również zapamiętywanie, zadając pytania wymagające zrozumienia pojęciowego, takie jak implementacja sortowania bąbelkowego za pomocą wielu kluczy dla tej struktury danych, którą właśnie wyciągnąłem z cienkiego powietrza, lub wyjaśnienie różnicy między tym kodem wyszukiwania, który podaję, a wyszukiwaniem binarnym.
Peter Smith
-2

Z mojego doświadczenia wynika, że ​​zapamiętywanie przychodzi z prostą praktyką i absolutnie nie trzeba go wcale uczyć. Co ważniejsze, takie podejście oznacza jedynie zapamiętywanie tego, co naprawdę musisz pamiętać w tym, co robisz, a nie kilka przypadkowych śmieci, których nauczyciel ma nadzieję, że będziesz potrzebować i niezmiennie nie będziesz. Czas poświęcony na zapamiętanie implementacji jakiegoś algorytmu może być znacznie lepiej poświęcony innej sprawie.

W końcu, dlaczego miałbyś kiedykolwiek ćwiczyć pisanie algorytmu? Gdy raz go napiszesz, możesz go ponownie używać na zawsze - nawet przy bardzo odległej szansie, że ktoś jeszcze nie napisał darmowej implementacji dla wybranego przez ciebie języka i że twoje środowisko nie zapewnia już takiej algorytm do użytku, który nie jest prawdą w przypadku większości prostych algorytmów, takich jak sortowanie i tym podobne. Ćwiczysz coś, co jest bardzo mało prawdopodobne, że kiedykolwiek będziesz musiał to zrobić, a nawet jeśli to zrobisz, będziesz musiał to zrobić tylko raz? Nie cenne wykorzystanie czasu.

Ważne, aby wiedzieć o Heapsort, nie jest to, jak go w ogóle wdrożyć. Jest to złożoność operacyjna w najlepszych i najgorszych przypadkach oraz podobne rzeczy. Ale, niespodzianka, na Wikipedii znajduje się poręczny, elegancki stolik, który natychmiast poda te informacje. Więc znowu nie ma żadnej wartości w posiadaniu tej wiedzy. Jest on natychmiast dostępny dla Ciebie, kiedy tylko chcesz, do końca czasu, bez żadnych kosztów. Dlaczego więc chcesz to zapamiętać? To bezcelowe.

Z mojego doświadczenia wynika, że ​​nie ma absolutnie żadnego powodu, aby wymagać od ucznia zapamiętania czegokolwiek. Jeśli zadajesz pytanie, na które można uzyskać odpowiedź ze źródła referencyjnego, zadajesz pytanie, gdzie odpowiedź na nie nie ma żadnej wartości.

DeadMG
źródło
2
Rany, chłopaki, nie zawracajcie sobie głowy wyjaśnianiem swoich negatywnych opinii itp.
DeadMG
Jedyny raz, kiedy potrzebowałem poznać heapsort, to kiedy potrzebowałem modyfikowalnej kolejki priorytetowej (heapsort działa świetnie jako kolejka priorytetowa). Możliwość dostosowania znanych algorytmów jest dobrym powodem, aby wiedzieć, jak je wdrożyć.
David Thornley
@David: Nie musisz wiedzieć, jak działa heapsort. Implementacja przy użyciu dowolnego algorytmu sortowania byłaby w porządku.
DeadMG
Nie w tym konkretnym przypadku tak nie byłoby. Często musiał obsługiwać wiele zdarzeń w systemie, który już może być przeciążony. Do tego projektu potrzebowaliśmy wydajności i ją otrzymaliśmy. Dla kontekstu, to zdarzyło się raz w dość długiej karierze, a całe moje sortowanie przez długi czas było takie jak rodzina SQL ORDER BYi C ++ std::sort.
David Thornley
@David: Dlatego sugerowałbym, że nie jest to coś, czego potrzebuje każdy programista.
DeadMG