Dlaczego program jest moim pierwszym językiem na uniwersytecie?

80

Słyszę o C, C ++, Javie każdego dnia, gdy ludzie zaczynają mówić o informatyce, ale na moich pierwszych zajęciach z informatyki jesteśmy proszeni o pisanie w Scheme (DrRacket).

Dlaczego?

Jakie to wpłynie na moje przyszłe rozumienie programowania?

AKTUALIZACJA: Skończyłem swój pierwszy semestr, ale nie do końca skończyłem ze Scheme. W mojej drugiej kadencji (która jest teraz) zajęliśmy się programowaniem w języku C. Początkowo frustracja nauczyła mnie wskazówek, ale teraz czuję się znacznie lepiej.

Nie ma nic więcej do powiedzenia. Próbuję nauczyć się języka Java (lub C ++?) Dla części OOP, której mi brakuje. Do tej pory najbardziej lubię programowanie funkcjonalne. Lambda jest po prostu fascynująca. :)

Erica Xu
źródło
148
Gratulacje, to (dla mnie) brzmi, jakbyś chodził do jednej z niewielu szkół, które opuściły szkołę komputerową, a która próbuje uczyć informatyki. Program nauki jako pierwszego języka jest (IMO) bardzo dobrą rzeczą. Nie, nie jest tak komercyjny jak wiele innych, ale jest doskonałym językiem do nauki prawdziwej istoty informatyki.
Jerry Coffin
21
C, C ++ i Java są przemysłowymi produktami ubocznymi informatyki. Całe korzenie programu są związane z informatyką. Języki komercyjne mają tyle samo wspólnego z informatyką, co McDonalds z kuchnią.
JasonTrue,
33
Ci goście mają rację; mylisz programowanie z informatyką - jak powiedział Dijkstra, to jest jak mylenie budowy teleskopu z astronomią. Schemat dotyczy najlepszego języka do nauki podstawowych pojęć w informatyce . Jeśli spodziewasz się, że zdobycie stopnia naukowego z informatyki dotyczy nauki pisania aplikacji biznesowych w Javie, być może zapisałeś się do niewłaściwego programu.
Eric Lippert,
29
Z tego samego powodu, dla którego kursy zoologii uczą biologii ewolucyjnej, anatomii i zachowań zwierząt, a nie jak rozwalać stoisko słoni
jk.
4
Kiedy już będziesz pod nogami i zrozumiesz podstawową składnię Schematu, spróbuj przeczytać „Mały Schemer”. Jest to cienka książka, ale jeśli wszystko zrozumiesz, dobrze zrozumiesz podstawy funkcjonalnych języków programowania.
Eric Lippert,

Odpowiedzi:

91

Brzmi jak świetna szkoła! Dialekty Lisp znacznie ściślej podążają za matematycznym paradygmatem algorytmów. Zmuszają programistów do nauki rekurencji i stylu funkcjonalnego. To doskonałe doświadczenie. Twoja szkoła jest w szeregach z MIT, który wciąż używa Abelsona i Sussmana do wymaganego CS 6.001.

Ten artykuł może być zachęcający i pomocny w zrozumieniu problemu.

Jonathan Henson
źródło
6
„Siła” prawdopodobnie nie jest dobrym słowem do użycia. Co powiesz na „pociąg”?
Barry Brown,
4
W ciągu ostatnich kilku lat nastąpiły ogromne zmiany w programie nauczania MIT EECS. Ich kurs wprowadzający jest teraz podzielony na dwa kursy (patrz pierwsza połowa mit.edu/6.01/mercurial/fall11/www/index.html ), a większość instrukcji językowych odbywa się w języku Python.
jonsca
4
Zgadzam się, że program jest świetnym językiem i dobrym pomysłem jest jego nauczenie się. Spójrzmy jednak prawdzie w oczy; prawie każda praca programistyczna w świecie rzeczywistym wykorzystuje imperatywny język; większość naprawdę poważnych zadań programistycznych wymaga C ++, a programiści C ++ zwykle aktywnie zniechęcają cię do korzystania ze wszystkich dobrych matematycznych pomysłów do projektowania programów z tego czy innego powodu. Rekurencja nie będzie odgrywać dużej roli w waszych programach imperatywnych.
Felix Dombek
4
@FelixDombek, jesteś pewien? Wszystkie pomysły? Naprawdę? Pamiętaj, że pętla imperatywna jest również matematycznym pomysłem.
SK-logic
3
@ FelixDombek, widzę tylko powód, aby używać iteracji zamiast rekurencji ogona w C ++. Wszystkie pozostałe formy rekurencji są obsługiwane dokładnie tak samo, jak w implementacjach języków funkcjonalnych. Więc nie mogę w ogóle zgodzić się z twoją uwagą. Im więcej matematyki wkładasz w kodowanie C ++, tym lepiej. Wątpię, czy spróbujesz wdrożyć, powiedzmy, czerwono-czarne drzewa w C ++ bez rekurencji.
SK-logic
37

Nikt nie oczekuje, że jako student pierwszego roku będziesz wystarczająco biegły w każdym języku, aby znaleźć prawdziwą pracę, więc dlaczego nie zacząć od takiego, który jest łatwy do nauczenia się? Oczekiwanie, że nowicjusze nauczą się programowania przy użyciu profesjonalnego języka w profesjonalnym środowisku IDE, przypomina trochę dawanie skalpela studentowi pierwszego roku medycyny i zmuszanie go do pracy na żywych ciałach.

Nie martw się; w końcu nauczysz się Java / C / C ++, prawdopodobnie rozpoczynając drugi rok. Jeśli zaczniesz uczyć się Java 6 teraz, do czasu ukończenia Java 8 nie będzie już dostępny. Lub zostanie zastąpiony przez Python. Lub jakiś inny język, który nie został jeszcze wynaleziony, ale podbija branżę. Lepiej odkładaj naukę „popularnych” rzeczy tak długo, jak to możliwe, aby nie stały się przestarzałe, gdy dostaniesz się na siłę roboczą.

Schemat / Racket pomoże Ci skupić się na ważnych pojęciach: projektowaniu algorytmu, strukturach danych i manipulowaniu informacjami. Wiesz, rzeczy wspólne dla wszystkich języków.

Barry Brown
źródło
36

Gratulacje, teraz stajesz się ekwiwalentem wegana w świecie komputerów, a za dwa lata nie będziesz w stanie zakończyć dyskusji bez informowania ludzi o wyższej moralnej podstawie, na której stoisz. ;)

W każdym razie masz bardzo dobrą szkołę. Szkoły, które niebiczowane przez przemysł, są dobre.
Jak ktoś inny powiedział, uczą cię nauki, z której czerpiesz rzemiosło .

Wiele złych farm małp kodowych uczy cię rzemiosła, a potem możesz wywnioskować z niego naukę, ale nie jest to gwarantowane. (i możesz skończyć z dość dziwnymi nieporozumieniami na ten temat)

W każdym razie, jako honorowy członek funkcjonalnego tłumu, kiedy się stąd wydostaniesz, zawsze poczujesz się niezrozumiany i niedoceniany .

Przyznajmy, że przeciętny komputerowy kreator nie jest niczym nowym.

Jesteś teraz na wysokie ryzyko:

  • próbując zakończyć karierę akademicką ,
  • rozpocząć pogoń za doktorem ,
  • ... emacs .

Prawdopodobnie spodoba ci się również open source, ale nigdy nie znajdziesz wystarczającej liczby współpracowników do swoich funkcjonalnych projektów.

ZJR
źródło
2
Przepraszam, aby skomentować, ale dlaczego emacs? Jestem ciekawy. Jestem na tej samej łodzi, co OP (jesienią tego roku rozpoczynam studia pierwszego roku) i użyjemy rakiety (podobnej do schematu).
Kevin Johnson
2
@KevinJohnson emacs jest często określany jako system operacyjny napisany w LISP, który przypadkowo pomaga wielu osobom edytować kod . Jeśli wykonujesz paradygmaty funkcjonalne i (jak się ich uczy) lubisz nieprzyzwoitość składni podobnych do LISP, prawdopodobnie zwiększy się to jako preferowany edytor tekstu.
ZJR
1
„nauczy cię nauki, z której czerpiesz rzemiosło”: +1
Giorgio
23

Jakie to wpłynie na moje przyszłe rozumienie programowania?

To trochę jak pytanie, w jaki sposób czytanie Szekspira pomoże ci napisać prace semestralne. Programowanie (w dowolnym języku) to tylko sposób na wyrażenie swoich pomysłów w formie wykonywalnej. Informatyka dostarcza koncepcyjne elementy składowe, które dadzą ci coś ciekawego do powiedzenia. Składnia schematu jest stosunkowo prosta, dzięki czemu można szybko dotrzeć do interesujących pomysłów i nie natrafić na wiele błędów kompilatora, standardowych bibliotek itp.

Zwróć szczególną uwagę na zajęciach - w tym semestrze nauczysz się wielu ciekawych rzeczy.

Caleb
źródło
14

Wygląda na to, że dopiero zaczynasz programować i nie masz wcześniejszego doświadczenia. Oto kilka wyjaśnień:

Dlaczego schemat, a nie C / C ++ / Java ...?

Ucząc się języka programowania (można by dokonać analogii z językiem angielskim), uczysz się składni, której musisz przestrzegać, aby kod był poprawny gramatycznie. Jednak język nie nauczy Cię logiki rozwiązywania problemów. Aby poznać tę logikę, uczysz się różnych paradygmatów programowania .

Każdy język może implementować (mniej lub bardziej dokładnie) jeden lub więcej paradygmatów. Paradygmat to sposób na uporządkowanie logiki, a paradygmat zaimplementowany przez Schemat nazywa się Programowaniem Funkcjonalnym (FP).

Prawdziwe pytanie, które zadajesz, brzmi: dlaczego FP?

Jak wspomniałeś, C, C ++ i Java (które nie implementują FP) są znacznie bardziej popularne. W rzeczywistości (z różnych powodów wszyscy mają swoje zdanie) FP nie jest bardzo popularna w branży.

Z drugiej strony FP jest bardzo wysoko ceniony w środowisku akademickim. Jest bliższy powszechnemu podejściu matematycznemu, koncentruje się bardziej na sprawdzalności i optymalizacji algorytmów, a większość ludzi zgodzi się, że dzięki temu ogólnie będziesz lepszym programistą.

Jest podobny do szkół, które uczą łaciny w celu nauki angielskiej literatury.

rahmu
źródło
1
Schemat nie musi być wykorzystywany funkcjonalnie, chociaż jest bardziej prawdopodobne, że zrobisz to niż w C, C ++ i Java.
Ricky Clarkson,
„Jest podobny do szkół, które uczą łaciny w celu studiowania literatury angielskiej.”: Lub do klas systemów operacyjnych, które uczą uniksowego systemu operacyjnego zamiast innych, bardziej rozpowszechnionych systemów operacyjnych.
Giorgio
11

Powinieneś nauczyć się, jak odbywa się programowanie i jakie są podstawowe pojęcia. Języki codziennego użytku używane w większości firm mogą być odpowiednie do tworzenia potrzebnego dzisiaj oprogramowania, ale niekoniecznie najlepiej nadają się do nauki podstaw programowania.

Po opanowaniu koncepcji łatwo jest zastosować je w innych językach.

perdian
źródło
4
„Codzienne języki używane w większości firm może być dobrze nadaje się do wytwarzania oprogramowania potrzebnego dzisiaj” - biorąc pod uwagę typowe koszty, jakość i ceny za sukces, że to raczej optymistyczne stwierdzenie :-)
Jörg W Mittag
To zdecydowanie prawda! Dlatego napisałem „może” zamiast „są” :-)
perdian
1
„Po zapoznaniu się z tymi koncepcjami można je łatwo zastosować w innych językach”. - To stwierdzenie jest zbyt prawdziwe. Podejrzewam, że zajęłoby mi to około tygodnia, aby zebrać składnię w prawie każdym nowym języku i być biegłym. Nauczono mnie C / C ++ i asemblera w szkole, ale nauczyłem się Python na boku i Lisp do projektu badawczego. Bez fundamentalnego zrozumienia, które zyskałem dzięki Pythonowi, Lispowi i Zgromadzeniu, wątpię, czy byłbym dzisiaj prawie programistą.
Wayne Werner,
9

Jeśli uczysz się z DrRacket, założę się, że korzystasz także z programu Jak projektować programy.

Oto, co jeden z (co prawda stronniczych) autorów HtDP ma do powiedzenia na temat tego, jak Scheme nauczania przygotowało studentów z Northeastern University do współpracy w ramach programu edukacyjnego („kooperacja”: studenci naprzemiennie semestry studiów akademickich z semestrami studiów stacjonarnych zatrudnienie).

Przed moim przybyciem Northeastern korzystał ze standardowego programu nauczania przez dwie dekady: trzy terminy obecnie modnego języka (Pascal, C ++, Java), używając zestawu niezwykle bogatych graficznie ćwiczeń przeplatanych lekcjami praktycznych zastosowań. Program nauczania został szeroko opublikowany w SIGCSE i powiązanych społecznościach, ale nie zadziałał. W szczycie bańki internetowej tylko około jedna trzecia studentów dostała spółdzielnie programistyczne; większość innych skończyła jako „technicy”, jak sami siebie nazywali: przenoszenie komputerów, uruchamianie skryptów, konfigurowanie routerów i sieci itp. A cała ta edukacja kosztuje 150 000 $ czesnego.

Po roku w Northeastern nasz dziekan poprosił mnie o przejęcie pierwszego kursu. Pierwsza instancja zakończyła się sukcesem - w przeciwieństwie do prognoz niektórych lokalnych wykładowców. Mimo że uważano to za proces, przeszliśmy na TeachScheme! program nauczania na stałe; dziekan zasugerował, że zaprojektuję kurs pomostowy, aby połączyć kurs HtDP z resztą programu nauczania; to zapoczątkowało moją współpracę nad HtDC z Viera Proulx. Zobacz postscript poniżej. W ciągu kilku lat zacząłem słyszeć od naszego wydziału współpracy, że udział stanowisk programistycznych rośnie. Do 2007 r. - kiedy po raz ostatni uczestniczyłem w kursie - powiedziano mi, że stosunek programowania w pierwszej spółdzielni wzrósł do dwóch trzecich i więcej. W międzyczasie wszystkie TeachScheme! kursy były prowadzone przez wielu wykładowców o różnych stylach nauczania i osobowościach niż moja własna. Współczynnik współpracy programistycznej wzrósł do trzech czwartych i więcej, a wszyscy wykładowcy niższego szczebla cieszą się z umiejętności programowania uczniów.

Edycja: dla osób bardzo zainteresowanych racjonalnością programu nauczania, oto wyjaśnienie głównego architekta - http://www.youtube.com/watch?v=m3be1PHW5X0

pidge
źródło
6

Moja szkoła zaczęła się także od programu. Jednym z wspomnianych powodów było wyrównanie szans. Większość Comp Sci pierwszego roku może mieć trochę lub dużo kontaktu z bardziej popularnymi językami. Mniej prawdopodobne było, że ktokolwiek miał dużą wiedzę na temat Schematu.

ciemny suwak
źródło
4
Zgadzam się; Zacząłem CS, znając Pascal, C, Basic, x86 Assembler, podczas gdy inni mieli doświadczenia w różnych językach lub wcale. Wprowadzono nas do ML, z którym nie tylko nikt nie miał wcześniejszego doświadczenia, ale który miał tak obcy paradygmat, że to było jak zaczynać od nowa nawet dla najbardziej doświadczonych spośród nas. Później myślę, że ML (paradygmat funkcjonalny) jest najbardziej przydatną rzeczą, której nauczyłem się w CS.
KaptajnKold
6

W rzeczywistości, ponieważ Lisp (Schemat będący dialektem) jest Wielką Dame języków funkcjonalnych (pomyśl o F #, Groovy, Clojure, Haskell itp.), To szkolenie nie pozostawia cię w żadnej niekorzystnej sytuacji komercyjnej, ponieważ jest to najgorętsze temat na temat bloku programistycznego w tej chwili.

adrianmcmenamin
źródło
4

Schemat pomoże ci się dobrze postarać i właściwie myśleć o funkcjonalnych językach programowania. Na przykład Scala jest hybrydą Functional / OO, która jest dość genialna, choć nieco gęsta. Takie języki oznaczają jednak przyszłość - miejmy nadzieję.

Języki podobne do Lisp mają jednak czystość i prostotę konstrukcji, dzięki czemu są nieco łatwiejsze w nauczaniu. Zaletą jest jednak to, że znacznie łatwiej będzie ci później nauczyć się czegoś takiego jak Scala.

egervari
źródło
3

Ukończyliśmy program w pierwszej i pierwszej połowie drugiego semestru. Dopiero kiedy zaczęliśmy pracę z C, zacząłem zdawać sobie sprawę z mocy Scheme.

Jeśli chodzi o twoje pytanie, dlaczego wybrano Scheme: odpowiedź jest taka, że ​​jest to jeden z najprostszych języków i pozwala ci dużo robić (szczególnie, gdy później zaczynamy grać z leniwymi listami). Ponadto :

  1. Dla osób, które nie mają doświadczenia w programowaniu, łatwiej jest się uczyć. Nie ma wielu szczegółów technicznych i tylko kilka specjalnych formularzy.
  2. Pozwala na abstrakcję wyższego poziomu. Dobry kurs może koncentrować się na uczeniu programistów, jak myśleć, zamiast skupiać się na szczegółach technicznych, które pozwalają uczniom zostać lepszymi programistami.
  3. Listy są niesamowite. Jest tyle rzeczy, które możesz z nimi zrobić. Car i cdr okazują się potężnymi narzędziami i dopiero po rozpoczęciu pracy ze wskaźnikami zdajesz sobie sprawę, że Scheme był niesamowity w obsłudze list.
Avian78
źródło