Idealna sekwencja uczenia się języka programowania? [Zamknięte]


17

Co myślisz? Jaka jest idealna sekwencja uczenia się języków programowania, która obejmie większość obecnie używanych języków i paradygmatów, a także pomoże zrozumieć wspólne podstawy programowania, pomysły i praktyki? Możesz nawet zaproponować sekwencję uczenia się zamiast paradygmatów.

Uwaga: To jest pytanie, które zadałem w przepełnieniu stosu i zostało zamknięte z powodu subiektywności i kłótni.


Świetne pytanie. Jakie byłyby odpowiedzi, gdyby to pytanie było zorientowane na wydajność? Jestem ciekawy: programmers.stackexchange.com/questions/16323/… : D
JoeBilly,

4
Jestem DOKŁADNIE zaskoczona i zachwycona, że ​​Lisp często pojawia się na wysokich pytaniach.
Inaimathi,

1
To pytanie zostało również zadane tutaj (chociaż myślę, że to pierwsze): programmers.stackexchange.com/questions/41720/…
oosterwal

Odpowiedzi:


26

Python, Lisp, C, Haskell

Zakładając, że pytanie dotyczyło idealnej sekwencji uczenia się dla początkujących programistów (ponieważ stare ręce w programowaniu będą miały własną (prawdopodobnie przypadkową) sekwencję uczenia się), sugerowałbym przeczytanie eseju Norviga na temat uczenia się programowania za 10 lat , a następnie:

  1. Python : Zacznij od dynamicznego, wysokiego poziomu, OO i funkcjonalnego języka. Ponieważ dla początkujących bardzo ważne jest, aby poczuć się jak najszybciej produktywnie, i nie może zostać wyłączony przez obcą składnię, brak bibliotek, brak wielu platform, brak zasobów edukacyjnych i brak społeczności. Python jest bardzo czytelny, ma mnóstwo dobrych bibliotek (zwłaszcza bibliotek naukowych - współczesny naukowiec / inżynier musi umieć programować), jest łatwy do uruchomienia z większości systemów operacyjnych, ma mnóstwo samouczków i całych darmowych książek i jest ogólnie przyjazny dla użytkownika - wszystko to wciąż jest wystarczająco potężne, aby rosnąć wraz z Tobą, gdy stajesz się zaawansowanym programistą pracującym nad dużymi problemami. Ważne jest również, aby wzmocnić ważne + użyteczne konwencje dla początkującego: czytelność kodu ma duże znaczenie i powinieneś pisać kod dla siebie i innych, aby łatwo zrozumieć.

  2. Lisp: W szczególności przynajmniej przejrzyj Strukturę i interpretację programów komputerowych lub obejrzyj filmy SICP , a oczy szeroko otwarte, widząc podstawy i ekspresyjną moc programowania - można zrobić tak wiele za bardzo niewiele. Dowiedz się, w jaki sposób Lisp może wyrazić nie tylko paradygmat funkcjonalny, ale OO, logiczne / deklaratywne i inne - na przykład tworzenie nowych języków specyficznych dla domeny. Przeczytaj PAIP Norviga, aby zobaczyć, co mistrz może zrobić z tym językiem. Następnie sprawdź Clojure , nowoczesny dialekt Lisp, który może być jedną z następnych wielkich rzeczy.

  3. C: Tylko dlatego, że to lingua-franca komputerów. :) Prawdopodobnie obecnie jest opcjonalny, jeśli ktoś jest przede wszystkim programistą w określonej domenie innej niż oprogramowanie. Uważam to za brzydkie, ale warto wiedzieć, aby docenić podstawowy sprzęt. Oczywiście korzystaj z K&R .

  4. Haskell : czysta moc funkcjonalna. Gdzie obecny Com.Sci. teoria i praktyczna moc ekspresyjna spotykają się. Zobacz Real World Haskell .

Po powyższej wycieczce byłby bardzo biegły w rozwiązywaniu problemów i wyrażaniu rozwiązań w kodzie i byłby całkowicie swobodny z paradygmatami tutaj :

alternatywny tekst


(Naturalnie) podstawiłbym Smalltalk na Pythona jako numer 1, ale mówię, że wiedza o tym, że Python (a) jest znacznie bardziej popularna niż Smalltalk i że (b) zmuszenie Smalltalk do mówienia w innych językach jest tak trudne, jak w Javie , co jest wystarczająco trudne, by sfrustrować nowicjusza. „Skrypty” Pythona wydają się dość dużą zaletą.
Frank Shearar,

Zgadzam się z twoim oświadczeniem o wydajności. Myślę, że nauka C jako absolutnie pierwszego języka to mnóstwo bzdur. Ale zdecydowanie powinien być gdzieś na stosie.
Mark Canlas

+1 Nie jestem pewien, czy Haskell powinien być na szczycie, ale szczerze mówiąc, jeszcze tego nie wiem i jest następny na mojej liście, więc może to być ostatni język, którego się uczę.
Inaimathi,

2
1-kliknij, aby wyświetlić pełny rozmiar diagramu @ i54.tinypic.com/168ity1.jpg
Mike Clark

Dałbym +1, gdyby C nie było na liście
Balog Pal

28

Tak bym to zrobił:

  1. Python (lub Ruby lub Lua): Zinterpretowany język, bez typów, możesz zrobić rzeczy w kilku wierszach. Ogromna biblioteka (chyba do tego najlepiej Python). Możesz zagłębić się w algorytmy, ponieważ nie ma żadnych zakłóceń. Kompilacja nie jest konieczna, po prostu uruchom. Ponadto w Pythonie domyślnie uczysz dobrego stylu, ponieważ wcięcia w Pythonie są obowiązkowe. Możesz także uczyć orientacji obiektowej (w Lua jest to większy problem). Celem jest dobra zabawa i pokazanie uczniowi, co można zrobić.

  2. C ++ (a może Java): szybki, pisany na maszynie język. Jeśli potrzebujesz orientacji obiektowej, znasz już kilka pojęć. Główną ideą jest „tłumaczenie” tego, co zrobiłeś w Pythonie i zrobienie tego z nowymi ograniczeniami (głównie typami). Teraz, jeśli masz odpowiednie koncepcje, dodawanie typów nie jest takim problemem. Następnym krokiem jest myśleć bardziej niskiego poziomu (Java nie pomaga tutaj), a wskaźniki Teach dobrze . Rozumiem przez to wyjaśnienie przestrzeni adresowej, procesora, systemu operacyjnego, abyś mógł zacząć widzieć pod swoim programem. Język skompilowany wprowadza rozróżnienie między interpretacją a kompilacją, bardzo przydatny do wyjaśnienia, czym jest język maszynowy itp.

  3. Montaż : Wreszcie, bez magii, po prostu rozmawiasz z maszyną. Trwa debata na temat składni Intel i GAS, to nie jest ważne. Jeśli masz MIPS, uważam, że jest lepszy do nauczania, ale przypuszczam, że x86 jest wygodniejszy, ponieważ jest bardziej rozpowszechniony (x86_64 lepiej, ponieważ ma więcej rejestrów i drobiazgów). Musisz tylko usunąć część złożoności i pozwolić uczniom na dalsze badanie, jeśli chcą.

(Te pierwsze 3 to „głębokość”. Do tej pory schodziliśmy w dół, dopóki nie dotkniesz dna, które, jak mówią, jest „bliskie metalu”. Myślę, że to bardzo ważne, wiele pytań w programowaniu jest rozwiązany, gdy masz jasne pojęcie o tym, co się dzieje. Gdy to wiesz, możesz z pewnością zdobyć dalszą wiedzę.)

  1. Schemat (lub Common Lisp lub Clojure): Jak powiedział @dukeofgaming, języki Lisp pozwalają dobrze uczyć rekurencji (dla tego schematu jest najlepszy, ponieważ nie ma wyraźnych pętli). Ale chciałbym uczyć dwóch innych rzeczy: zamknięć i makr. Makra odróżniają języki Lisp od innych. Osobiście nie lubię makr Scheme, ale nie jest to zbyt ważne. Myślę, że makra Clojure są na przykład ładne (ale rekursja w Clojure nie jest tak czysta, ponieważ JVM nie ma rekurencji ogona). Zamknięcia są bardzo ważną koncepcją, gdy już je omoczysz, natychmiast „widzisz” Javascript. Po przestudiowaniu języków C ++, Python i Lisp Javascript staje się „trywialny”.

  2. Haskell : Jeśli chodzi o funkcjonalny język, nie sądzę, żebyś mógł pokonać Haskella. Lisp i Schemat są uważane za funkcjonalne, ale aby podkreślić funkcjonalne programowanie, musisz zmusić uczniów do myślenia bez stanu. Haskell ma również inne bardzo fajne rzeczy, takie jak curry i dopasowywanie wzorów do „destrukcji”. Nie znam dużo Haskella, ale zwięzłość kodu, który można napisać, jest po prostu piękna. Dobra znajomość Haskell znacznie ułatwia zrozumienie Erlanga.

  3. Dalej : język stosu. To całkowicie łamie twoją logikę (jeśli Lisp i Haskell nie wystarczą). Posunąłbym się nawet do nauczania Jonesa Fortha, ponieważ znają oni zgromadzenie, a wtedy możecie całkowicie zrozumieć, co się dzieje. (Knowing Forth otwiera na przykład PostScript.)

(Więc te ostatnie 3 to szerokość, o której mówiłeś. Dla mnie te języki są na tyle dziwne, że zmieniają twój sposób myślenia. Przynajmniej dla mnie. I myślę, że dzięki tym rozumiesz wystarczająco paradygmatów, aby nauczyć się nowego języka bardzo szybko.)

Opcjonalnie możesz przestudiować te:

  1. SmallTalk : język wyłącznie obiektowy. Aby zobaczyć, co dzieje się, gdy poważnie traktujesz orientację obiektu, język nie potrzebuje „if”, „for”. Wszystko jest przesłaniem: znowu wielka realizacja. (Ułatwi to teraz cel C).

  2. Idź : (piękny) język z naciskiem na współbieżność. Uważam, że Go jest bardzo miły i wygodny w programowaniu.

  3. Prolog : Kolejny paradygmat programowania. Nie napisałem żadnego Prologu, ale rozumiem, że to kolejny zadziwiający język.


6
Python i Ruby (nie wiem o Lua) są silnie pisanymi językami. Myślę, że masz na myśli, że są one dynamiczne, a nie statyczne.
Daniel Roseman

13
Traktuj C i C ++ jako dwa oddzielne języki.
David Thornley,

1
Bjarne mówi : „Nie ma języka o nazwie„ C / C ++ ”. Zwrot ten jest zwykle używany przez osoby, które nie mają pojęcia o programowaniu (np. Personel HR i słabi menedżerowie). Alternatywnie, są używane przez osoby, które po prostu nie wiedzą znać C ++ (i często też nie C). ”
fredoverflow

1
Chciałbym, aby ktoś spierał się, czy asembler powinien poprzedzać C ++. W tym momencie podejście do asemblowania byłoby dość łatwe ze względu na proste koncepcje i niewielki zestaw dostarczonych narzędzi, ale praca z surową pamięcią i referencjami surowej pamięci powinna być bardzo pomocna podczas zbliżania się do C ++, gdzie użycie nominalnych referencji do rozwiązania obu arbitralnych lokalizacje i wartości pamięci dezorientują sh * większości ludzi.
Filip Dupanović,

1
Dałem moim dwóm studentom CS tygodniowy kurs w asemblerze. w zasadzie wynalazłem komputer z minimalnym zestawem instrukcji i interpreter. Następnie mogliby napisać (i zobaczyć uruchomienie) bardzo proste procedury wraz z czasem. Następnie dodałem takie rzeczy, jak buforowanie danych i pobieranie wstępne, aby mogli zobaczyć, jak cechy architektoniczne współdziałają z wydajnością. Podejrzewam, że sztuczny asembler i komputer mogą pozwolić na większą elastyczność i efektywność uczenia się, jeśli celem jest dydaktyka, a nie nabywanie czegoś, z czego mogliby skorzystać.
Omega Centauri

12
  • Ten, którego teraz potrzebujesz
  • Ten, którego potrzebujesz później
  • Ten, którego potrzebujesz później

Poważnie, mogłem nauczyć się języka BASIC, COBOL, Fortran, Forth, Pascal i Prolog, ale nigdy szczególnie nie potrzebowałem ich używać i tak naprawdę nie widzę żadnego sposobu, w jaki wpłynęłyby na moje użycie innych języki, z wyjątkiem być może niewłaściwego stosowania paradygmatów między sobą. Zajęło mi wieki oduczenie się języka BASIC na tyle, by napisać ustrukturyzowanego Pascala, kilka lat, aby przestać pisać kod Pascala w C, i kolejne kilka lat, aby uruchomić OOP, kiedy zacząłem używać Objective-C i Java. Z drugiej strony, odkąd pracuję (prawie) wyłącznie w językach OO, mogłem skoncentrować się na ulepszeniu mojego używania języków OO, nie starając się, aby wyglądały jak Scheme lub PostScript.


4
Wiesz, ja sądzę, że istnieje jakaś wartość uczenia się nowego języka, nawet jeśli nie potrzebujesz go ... ale zgadzam się z ogólnym sentymentem, że często lepiej nauczyć się języka, bo myślisz, że można go znaleźć przydatne raczej ponieważ to, jak myślisz, powinieneś się nauczyć.
Tim Goodman,

8

Trudno twierdzić, że jakakolwiek sekwencja jest idealna, ale opracuję plan, który mogę uzasadnić:

  1. do

    Nauka języka C wymaga cierpliwości i staranności, a także zapoznaje cię z podstawowymi sposobami radzenia sobie z danymi przez komputery i pokazuje prawie najszerszy zakres obowiązków, jakie programista może zaakceptować, radząc sobie z taką maszyną.

  2. Perl

    Jako antidotum na rygor wymagany przez C, spróbuj niewiarygodnie wybaczającego Perla. Co napisanie w C zajęło tydzień, możesz napisać w Perlu za godzinę. Wprowadza inny rodzaj przyjemności w programowaniu i pokazuje, jak wykluczenie pewnych obaw i szczegółów uwalnia programistę do skupienia się na różnych rzeczach.

  3. C ++ , a może Java

    Następnie zobacz, w jaki sposób skupienie się C na niskopoziomowych i prymitywnych aspektach programowania służy jako podstawa do podniesienia poziomu abstrakcji, zwracając uwagę na transakcje, które wykonuje się, poruszając się w abstrakcji w górę. Dowiedz się, jak tworzyć abstrakcje, które mogą zachować efektywność, która ma znaczenie dla Twojego programu.

  4. Common Lisp

    To nagroda za poprzednie hasło. Znajdziesz echo tego, czego nauczyłeś się we wszystkich poprzednich językach, i zobaczysz, jak głupie wydaje się tyle poprzednich ustępstw podczas programowania w Lisp. Preprocesor C i szablony C ++ przygotowują do docenienia systemu makr Lisp. Odzyskasz łatwość wyrażania się w Perlu, możliwości optymalizacji na niskim poziomie od C, możliwości budowania abstrakcji w C ++ lub Javie i miniesz je wszystkie. Żadna z poprzednich trzech - być może oprócz debuggera Perla - nie przygotuje cię do interaktywnego programowania z wydajnym REPL („odczyt, ewaluacja, pętla drukowania”). Praca z obrazemoparte na środowisku - które zmienia związek między twoim kodem źródłowym a ideą „programu wykonywalnego” - zmieni twoje wyobrażenie o tym, co to znaczy zbudować program.

Poza tymi czterema eksploracja innych stylów programowania, takich jak programowanie funkcjonalne w Haskell lub programowanie logiczne w Prologu, pozwala na pełniejsze zrozumienie zakresu programowania - szeroka wiedza, jeśli chcesz - ale w tym momencie lepiej wykorzystać swój czas doskonaląc swoje umiejętności - głęboka znajomość - w dowolnym znanym języku.

Po skosztowaniu wystarczającej liczby różnych języków, twój pogląd podniesie się, aby skupić się na ideach wykraczających poza którykolwiek z nich. To trochę jak różnica między nauką prowadzenia samochodu ojca a umiejętnością prowadzenia dowolnego samochodu: możesz nie cieszyć się z prowadzenia wynajętego minivana przez kilka dni, dobrze znając przyjemność z prowadzenia ulubionego samochodu sportowego, ale wymyślisz, jak go obsługiwać, i na pewno będziesz wyciągał z biednej bestii więcej niż amator.


4
+1 dla C i Common Lisp, ale Perl jako drugi język? :) Python doskonale służyłby jako język dynamiczny, jednocześnie zachęcając do dobrych nawyków programistycznych - takich jak kod, który jest bardzo czytelny dla ciebie i innych, w tygodniach, miesiącach lub latach po pierwszym napisaniu programu.
limist

1
Jeśli chodzi o zalecenie Perla: to tylko ja pokazuję mój wiek. Pewnie, dziś Python lub Ruby byłyby bliskimi substytutami, ale oba są bardziej dogmatyczne niż Perl i bardziej nastawione na orientację obiektową w stylu klasycznych metod, niż nowy programista wychodzący z C jeszcze tego nie potrzebujesz. Pamiętam, że kiedy nauczyłem się Perla, od razu byłem przerażająco produktywny i wkrótce potem zacząłem korzystać z jego obiektowych obiektów. Zbyt często skupianie się na OO jest po prostu rozpraszające i niepotrzebne ceremonie.
seh

Nie zgadzam się z twoimi poglądami na temat „transakcji, które można efektywnie wykonać, poruszając się w górę w abstrakcji”. Jednym z filarów C ++ jest to, że program korzystający z udogodnień C ++ nigdy nie jest wolniejszy niż równoważny program C. Na przykład korzystanie z funkcji wirtualnych w C ++ nigdy nie jest wolniejsze niż symulowanie funkcji wirtualnych w C.
fredoverflow

To prawda, Fred, i to miałem na myśli: korzystanie z funkcji bez zastanowienia się nad tym, jak działają, może powodować koszty - koszty, których można było uniknąć, unikając również możliwości funkcji, ponieważ byłoby to nadmiernie skomplikowane lub po prostu niewystarczająco idiomatyczne wdrożyć ręcznie. Na przykład, twierdząc, że RTTI jest „zbyt wolny” od razu nasuwa się pytanie, jak jeszcze masz zamiar rozwiązać ten problem.
seh

6

1. Smalltalk

Zaprojektowany pierwotnie przynajmniej częściowo jako sposób na korzystanie przez dzieci z komputerów do nauki. Składnia jest wystarczająco prosta, aby opisać ją w akapicie. Podobnie jak LOGO jest przykładem zasady „niska bariera wejścia, wysoki sufit”.

Smalltalk to czysty język OO w tym sensie, że „wszystko jest przedmiotem”.

Uczy również wielu technik funkcjonalnych, szczególnie w interfejsie API Collection: łączenie komunikatów, funkcje wyższego rzędu, mapowanie, zmniejszanie i tak dalej.

Społeczność Squeak jest żywa i przyjazna. Zobaczysz także wiele dyskusji na temat zaawansowanych technik: podobnie jak społeczność lisp, na liście dyskusyjnej jest wielu bardzo doświadczonych Smalltalkerów, którzy chętnie dzielą się swoją wiedzą. (Nie szkodzi, że społeczność Squeak ma dużą populację profesjonalnych nauczycieli). Jest też inna lista dla początkujących.

2. PROLOG

Programowanie logiki języka, który daje bardzo odmienny pogląd obliczeń na niemal każdym innym języku. Prolog jest również wysoce deklaratywny (ale nie całkowicie: !operator lub cut może mieć znaczący wpływ semantyczny na predykat).

3. Common Lisp

Zamień tutaj program, jeśli chcesz. Common Lisp obsługuje wiele paradygmatów, zwłaszcza OO i funkcjonalny. Ma również długą historię (Lisp jest drugim najstarszym wciąż powszechnie używanym językiem: tylko starszy FORTRAN).

4. Haskell

(Zastrzeżenie: Dopiero zacząłem się go uczyć.) Prawdopodobnie najczystszy funkcjonalny język na świecie. Ma bardzo zaawansowany system typu statycznego. Dostępne są przydatne książki wprowadzające .

5. C lub Delphi

Musisz wiedzieć, jak działają komputery. Musisz wiedzieć, jak działa pamięć i procesor. Oba są tradycyjnie „bliskie metalu” i mają społeczności, które zachęcają do myślenia o tym, jak ich język kompiluje się w asemblerze.

Dlaczego to zamówienie?

Smalltalk jest bardzo łatwy do nauczenia, więc możesz szybko zacząć koncentrować się na rozwiązywaniu problemów zamiast walczyć z kompilatorem („niska bariera wejścia”). Po rozpoczęciu programowania nie ma również sztucznego ograniczenia tego, co możesz zrobić - „wysoki sufit”.

Gdy masz już całkiem jasne pojęcie o tym, jak działa OO (i - pod warunkiem, że WIELE istnieje inne rozumienie tego, co oznacza „OO” - można powiedzieć, że OO dominuje na rynku), przejście na Prolog gwarantuje, że nie zaczniesz myśląc, że OO jest jedynym sposobem. Prolog bardzo różni się od większości języków i rozciąga mięśnie mentalne, abyś nie zaczął myśleć, że wiesz wszystko.

Z kolei Common Lisp jest językiem dla dorosłych. Ma dojrzały standard, jest liderem w projektowaniu języków od dziesięcioleci (wraz z Smalltalk) - wszystkie te fantazyjne nowe funkcje, które właśnie zyskał Twój ulubiony język? Szanse są pomysłami inkubowanymi w Lisp lub Smalltalk. Common Lisp jest również trochę wartki, a wszędzie znajdziesz brodawki.

Haskell jest czwarty na liście, ponieważ (powiedziano mi: dopiero zacząłem się uczyć) jego czystość oznacza, że ​​niektóre bardzo powszechne rzeczy (jak We / Wy) są trudniejsze do zrobienia niż w mniej czysto funkcjonalnych językach. Haskellowie używają również dość egzotycznych terminologii (powiedzmy, takich jak „katamorfizm”, powiedzmy), i prawdopodobnie lepiej byłoby mieć trochę doświadczenia w programowaniu pod ręką, zanim się z tym zmierzysz. (Ale muszę powtórzyć, dopiero zacząłem się tego uczyć! Weź tę opinię ze szczyptą soli!)

A dlaczego C / Delphi trwa? Ponieważ chyba, że ​​pracujesz w systemach wbudowanych, tak naprawdę nie powinieneś uczyć się programowania, myśląc, że wystarczy manualne zarządzanie pamięcią. Śmieci działał wystarczająco dobrze dla maszyny poziomu 1980. Twój telefon jest tak potężny!

Na koniec nie umieściłem Erlanga na powyższej liście, chociaż naprawdę powinienem.


2
Czy to sekwencja uczenia się ?
Wizard79

Jest to wyraźnie sekwencja (o długości 1).
Frank Shearar,

Mniej żartobliwie: zrobię jeden krok w sekwencji, a ty zapewnisz drugi, a społeczność zagłosuje nad kolejnością tej sekwencji, dobrze?
Frank Shearar,

3
@Frank Nie miałem tego na myśli. Spodziewałem się pełnych sekwencji. I myślę, że porządkowanie nie może być wykonane przez głosowanie.
Gulshan,

Proszę, ludzie: jeśli zamierzasz zagłosować, wyjaśnij dlaczego .
Frank Shearar,

5
  1. Pyton. Doskonałe wprowadzenie do programowania. Będzie to również wiązać się z każdym wcześniejszym kontaktem z programowaniem.

  2. Schemat. Doskonałe wprowadzenie do programowania. Jeśli masz do czynienia z nowicjuszami w dziedzinie programowania, możesz uczyć tego najpierw, a Python drugiego. Jedną alternatywą byłby najpierw Python, a następnie Common Lisp zamiast Scheme: więcej pracy, ale więcej nagrody.

  3. C. Język niskiego poziomu, który pozostaje blisko krzemu. Dobry do nauki, co potrafi komputer. Możesz zastąpić jakąś formę języka asemblera, ale C jest dość zbliżony do podstaw i znacznie łatwiejszy w obsłudze.

  4. Prolog. Alternatywnie, zamień dowolny język ogólnego przeznaczenia w stylu deklaratywnym, jeśli możesz znaleźć taki, który ci się bardziej podoba.

  5. Haskell. Dla systemu typów i czystej funkcjonalności, jeśli nic więcej.

  6. Jest tu kilku kandydatów, ponieważ nie można objąć wszystkich pojęć sześcioma językami. Warto zapoznać się z Common Lisp, choćby dla systemu makr i systemu obiektowego (który różni się od większości innych, które widziałem). Po czwarte, Tcl i APL są dziwnymi językami, które odniosły pewien sukces, i jeden z nich byłby dobry, aby zapobiec uczniowi, że nauczył się tego wszystkiego. Erlang byłby dobry dla współbieżności.


„Jeśli masz do czynienia z nowicjuszami w dziedzinie programowania, możesz chcieć nauczyć tego najpierw, a Pythona drugiego”. Bardzo się zgadzam. To podejście, które obecnie przyjmuje mój dawny uniwersytet i wydaje się, że działa bardzo dobrze.
pyvi

To całkiem dobra lista, prawdopodobnie odwróciłbym kolejność na Haskell i Prolog. Gdyby uczeń był szczególnie źle doświadczony, wybiłbym sześć, podniosłem listę i zacząłem od czegoś prostszego.
Orbling

4

Podano wiele dobrych odpowiedzi, ale nie widziałem nikogo, kto oferowałby SQL. Jest to zupełnie inne zwierzę niż większość wymienionych na liście i bardzo ważne dla każdego programisty, który ma do czynienia z bazami danych.

Możesz także rozważyć niektóre „języki” skryptowe na poziomie systemu operacyjnego, takie jak Batch, grep, awk itp. „Make” może również należeć do tej kategorii.

Innym językiem, który możesz rozważyć (jeśli jeszcze nie jest całkowicie martwy) jest COBOL. Jest wystarczająco różniący się od innych języków proceduralnych, że należy o nim wspomnieć. Odmiany C, Fortran, Basic itp. Stały się tak podobne, że gdy się z nimi zaznajomisz, przejście do drugiego nie jest dużym problemem, ale w COBOL brakuje wielu konstrukcji uznawanych za oczywiste w innych. (Minęło co najmniej 20 lat, odkąd zrobiłem cokolwiek z COBOL, więc moje obserwacje mogą być nieaktualne w odniesieniu do tego języka.)

Możesz wspomnieć o APL tylko z historycznego punktu widzenia - lub pozwolić mu spoczywać w pokoju. Twój wybór.


1
Powodem, dla którego nie zasugerowałem SQL, jest to, że nie jest to język ogólnego przeznaczenia. Wolę uderzyć studentów czymś deklaratywnym i bardziej ogólnym, takim jak Prolog. Języki skryptowe na poziomie systemu operacyjnego nie oferują nic bardziej ogólnego niż język Python lub Perl. Ostatnio dotknąłem języka COBOL, nie oferowało żadnych koncepcji, których nie można poprawić w innych językach. Podoba mi się propozycja APL, nie tyle ze względu na wartość historyczną, co z tego, że jest to zupełnie inny język.
David Thornley,

@David Thornley: Zgadzam się, że SQL nie jest językiem ogólnego przeznaczenia. SQL ma kilka interesujących logicznych pojęć i teorii mnogości jako podstawowych operacji, które nie pojawiają się w wielu innych językach, np. zjednoczenie, dołączenie, grupowanie według itd., które są warte odnotowania dla każdego, kto może zajmować się bazami danych.
oosterwal 31.01.11

Wszystkie rzeczy, których chciałbym się nauczyć, zostały nauczone przez ucznia, choć niektóre z nich mają historyczny charakter. Nauka języków skryptowych jest dość istotna, ale może być wykonywana razem z innymi, tak samo jak w przypadku SQL, jest to język usługi dla podstawowych. Jeśli uczeń był bardzo silny w matematyce, wtedy rozpoczęcie od APL może być przyjemne (lub może R, ponieważ jest o wiele łatwiejsze do odczytania, ale może być używane podobnie).
Orbling

2

Proponuję najpierw przeczytać Erica Raymondsa „Jak zostać hakerem”, ponieważ ma on kilka bardzo interesujących uwag na temat tego, jak zacząć, w tym Lisp, który ma pojęcie „kod to dane, a dane to kod”.

Do programowania sugerowałbym również Haskell, Prolog, SQL i język asemblera (tylko niektóre).

Niezależnie od tego, czego chcesz się nauczyć, poświęć trochę czasu, aby nauczyć się go poprawnie i napisz nietrywialne ilości kodu. Przypomina jazdę na rowerze - nie można się tego nauczyć z książki.


2

Po pierwsze> Co chcesz zrobić, kiedy zaczniesz programować? Nauka bycia programistą gier jest inna niż nauka bycia programistą baz danych dla biznesu ... różni się od programisty internetowego ...

Po drugie> Czy kiedy zaczniesz się uczyć, chcesz zacząć wysoko i zejść na dół? Lub zacznij od niskiego poziomu i podążaj w górę. Nauka języka C # (wysoki poziom) różni się znacznie od nauki asemblera (niski poziom).

Ogromny wybór zależy od tego, co chcesz zrobić. Programowanie sterownika najprawdopodobniej obejmie C lub asemblację ... Programowanie strony będzie PHP, C #, asp itp. Nie dotkniesz asemblera do programowania w sieci ... itd ...

Jeśli chodzi o podstawy ... kiedy zdecydujesz, co chcesz zrobić, łatwiej jest wybrać język. Na przykład zostałem analitykiem danych w szpitalu. Tak więc moim „wyborem” języków jest SQL / TSQL / DB2 dla dostępu do danych, C # WPF dla klientów Windows, Silverlight dla klientów WWW, niektóre RPG / CL dla logiki zaplecza IBM ...

Osobiście trzymam się dobrej książki + buduję własny program do nauki języka. Lubię APress i uwielbiam czytać C # 2008 Ilustrowane podczas nauki C #. Mają inne książki, które zawierają podstawy zarówno dla osób niewykształconych, jak i dla ekspertów.


2

Nowicjusz potrzebuje tylko jednego języka, aby zacząć, po nauczeniu się drugiego języka, oni już robią postępy poza wieloma konkurującymi programistami. Uczyłbym się w następującej kolejności:

  • Smalltalk - to najlepsze, co dostaje OO, a prosta ekspozycja otworzy oczy na sposób, w jaki należy to zrobić. Najlepiej nauczyć się koncepcji OO.
  • Java lub C # - zapewnia bardziej architektoniczne i planowane podejście do OO, jednocześnie wprowadzając typy sprawdzane statycznie.
  • Ruby lub Python - nie możesz tego docenić, dopóki nie poczujesz Java lub C #
  • Erlang - współbieżność wykonana w sposób, który sprawia, że ​​wydaje się to łatwe. Jest o wiele lepszy niż twoje języki OO lub C.
  • Lisp, Haskell lub inny język funkcjonalny - to inne podejście do rozwiązywania problemów.
  • C - Budowanie rodzimych rozszerzeń dla języka Java lub implementowanie algorytmów niższego poziomu jest tak bliskie zestawowi, jak ktoś potrzebuje, dopóki nie napisze kompilatorów

Możesz zapytać „gdzie jest C ++?” a co z X? Szczerze mówiąc, uczenie się wielu języków ma kilka cech: wzbogaca twoje doświadczenie i zapewnia chęć do nauki większej liczby języków. Lista języków, które znam dobrze (Java, C #, Ruby, C ++, Javascript) są zorientowane obiektowo - ale przede wszystkim dlatego, że to właśnie muszę robić codziennie w pracy. Lista języków, z którymi się zetknąłem (Smalltalk, Python, Erlang, JESS, C, asembler [Motorola 6502/6510], Go) nauczyła mnie cennych lekcji. Potrafię przynajmniej zrozumieć, co się dzieje z tymi językami. Jest wiele rzeczy, których nie zbadałem, ale bardzo dobrze może w przyszłości. Istnieje również kilka języków znaczników: HTML, XSL: FO, XSLT, CSS, XML, SGML, na które ludzie muszą się ujawnić, jeśli będą w jakikolwiek sposób współpracować z siecią.

Po nauczeniu się co najmniej dwóch różnych języków, naprawdę nie sądzę, że powinieneś ograniczać to, co ktoś, kto chce się uczyć, decyduje się na następny. Uczenie się powinno być doświadczeniem organicznym, a zbyt duża struktura procesu tworzy grupę ludzi, którzy myślą dokładnie tak samo. Można powiedzieć, że monokultura.


2

Większość z tych odpowiedzi wydaje się mniej więcej taka sama, dlatego zamierzam przedstawić inną opinię. Od dawna uważam, że najlepszym pierwszym językiem jest Tcl.

Dlaczego? Po pierwsze, bardzo łatwo się go nauczyć. Język nie ma wiele składni, więc uczeń może bardziej skupić się na pojęciach programowania, a mniej na osobliwościach składniowych danego języka. W chwili pisania tego tekstu Tcl ma dokładnie 12 zasad rządzących całym językiem (w porównaniu z jedenastoma w ciągu ostatnich kilku dekad).

Po drugie, Tcl ma fantastyczny wbudowany język GUI, dzięki czemu można uzyskać względnie natychmiastową satysfakcję i nauczyć się podstaw programowania sterowanego zdarzeniami.

Po trzecie, jest rozszerzalny. Chcesz nauczyć się powtarzania pętli? Możesz napisać polecenie wykonujące pętlę powtarzania, dzięki czemu nie tylko nauczysz się korzystać z powtarzania ... dopóki nie dowiesz się, jak różni się ona od pętli while, ponieważ tak naprawdę napisałeś ją samodzielnie.

Ponadto, ponieważ jest rozszerzalny, istnieje łatwy podział na C. Możesz nauczyć się podstaw języka C i nauczyć się: a) rozszerzać Tcl o nowe polecenia napisane w innym języku, lub b) nauczyć się, jak dodać język skryptowy do programu napisanego w DO.

Kiedy nauczysz się Tcl i C, większość innych języków leży gdzieś pomiędzy tymi dwoma skrajnościami i powinna być stosunkowo łatwa do opanowania. Moja pełna lista, z czterema, których nauczałbym po Tcl i C, to:

  1. Tcl
  2. do
  3. Python - dla koncepcji OO, a także zachowanie definiowania bloków według wcięć w celu kontrastowania z innymi językami.
  4. Ruby - do innego spojrzenia na OO oraz szyny do nauki frameworków
  5. java - jest używany wszędzie, musisz go znać i dowiedzieć się o JVM
  6. groovy - przywróć dynamiczne języki

1

Asembler, C, SQL, C #

Wiem, nudno i old skool. Całe pytanie ignoruje naprawdę trudną część programowania, która polega na rozwiązywaniu problemów, modelowaniu domen i budowie algorytmów. Ale oto dlaczego:

  1. nie można udawać, przechodząc przez język asemblera; albo to dostajesz, albo nie. kompilator cię nie uratuje, nie ma narzuconych ram ani bibliotek i nie możesz ukryć się przed architekturą maszyny; to czyste programowanie (na poziomie początkującym dodaj dwie liczby)

  2. po napisaniu kilku programów w asemblerze zawierających więcej niż kilkaset wierszy wskaźniki i zarządzanie pamięcią nie są już tajemnicze i powinieneś zacząć zauważać wzorce w kodzie (if, switch, tablica, pętle itp. ). C wyprowadza te wzory na światło słoneczne i pozwala im świecić. Standardowa biblioteka jest przydatna, nie będąc ogromnym, ale nie zawracaj sobie głowy makrami / szablonami / etc. na tym etapie.

  3. teraz wskocz do baz danych za pomocą SQL. Nie przesadzaj z procedurami przechowywanymi, po prostu zapoznaj się z podstawami tabel i zapytań.

  4. po napisaniu kilku programów C zawierających więcej niż kilkaset linii, wskaźniki, struktury i zarządzanie pamięcią są drugą naturą, a konstrukcje proceduralne są starymi przyjaciółmi. Zaczniesz zauważać wzorce wyższego rzędu: te funkcje zawsze mają tę strukturę danych, ta część kodu jest taka jak ta część kodu, z wyjątkiem metod X, Y i Z i tak dalej. Dodaj do tego swoje dane relacyjne, a teraz jesteś gotowy na język obiektowy. Z ogromnymi ramami i ogólnie tępą dokumentacją. Witamy w prawdziwym świecie! Eksploruj GUI, pisz aplikacje komputerowe, pisz strony internetowe, pisz usługi sieciowe, pisz co chcesz. Idź po pracę, jeśli masz na to ochotę.

Czy jesteś teraz programistą Jedi? Kod ninja? Nie , teraz jesteś po prostu kompetentny. Ale masz solidne podstawy do eksploracji nowych, błyszczących rzeczy.


1

Potrzebujesz podstaw:

  1. Kod maszynowy
  2. język programowania
  3. do
  4. Seplenienie

Potem prawdopodobnie nie ma to znaczenia.


0

OK, to ostatni dzień nagród. I dodaję swoją odpowiedź. Moja sugerowana sekwencja

C, C ++, JAVA / C #, Python / Ruby, Dowolny inny język (Assembly / Lisp / Prolog itp.)

  • Nie sądzę, że pierwszy język musi być najłatwiejszy. Uważam raczej, że powinno to dać ogólny obraz tego, jak działa komputer, zachowując pewną abstrakcję.
  • Przejście z C do C ++ będzie łatwiejsze. Będzie OOP, obecnie najczęściej używany paradygmat.
  • Przejście z C ++ do C # / Java będzie łatwiejsze. Wolę C #, ponieważ zawiera wiele paradygmatów, takich jak programowanie funkcjonalne.
  • Kiedy ktoś przyjdzie teraz do dynamicznych języków, takich jak Python lub Ruby, pojawi się „ WoW ”. Łatwiej będzie poczuć piękno dynamicznego pisania. Ale najpierw nauka języków dynamicznych, a później statycznych spowoduje: „ Och! Dlaczego muszę to wszystko dodawać?
  • Teraz najczęściej używane paradygmaty i języki są już prawie gotowe. Więc eksploruj, co chcesz. Od Zgromadzenia do Lisp, Prolog lub Haskell. I odkryj nowsze konteksty i funkcje różnych języków programowania.

Tutaj C jest tylko na początek.
Gulshan

preferencja C # w stosunku do java zależy od wielu czynników, powiedziałbym, że oba są prawie równe.
prasonscala

0

Schemat, C, C ++

Będę stronniczy i użyję modelu, którego obecnie używa mój uniwersytet, do swojego podstawowego programu informatyki. Byłem temu przeciwny przez pierwszy rok, ale w późniejszych latach jestem za to wdzięczny. Model opiera się na tym, że nie wymaga żadnego doświadczenia w programowaniu, ale wymaga umiejętności uczenia się.

  1. Schemat
    To my uczymy się programowania, im mniej magii, tym lepiej. Język nauczania Schematu przedstawia jasną i rozsądną definicję języka, naprawdę niewielki zestaw aksjomatów („magii”), na których można budować i rozszerzać. Każdy, kto rozumie funkcje matematyczne, może śledzić i rozumować programy Scheme. Rozpoczęcie od schematu zapewnia czysty, ale skuteczny sposób myślenia o obliczeniach bez martwienia się o szczegóły dotyczące konkretnego języka.

  2. C
    Przejście ze schematu do C jest drastyczne, ale pozwala poznać bardzo ważne mapowanie języków wysokiego poziomu na języki niskiego poziomu. Poznanie modelu pamięci (wskaźniki, stos, stos itp.) Oraz sposobu kompilowania i uruchamiania programów, jak działają wskaźniki, stos i stos są podstawowymi umiejętnościami. Dzięki zrozumieniu na niskim poziomie możesz zacząć analizować programy na wyższym poziomie (Big O). Możesz rozpocząć tworzenie własnych abstrakcyjnych typów danych, grając z różnymi implementacjami (powiedzmy prostą tabelę skrótów vs. drzewo binarne dla zestawu).

  3. C ++
    Poprzez naukę języka C i schematu zaczynamy dostrzegać różne paradygmaty języków programowania i sposoby ich zastosowania do różnych problemów. Teraz możesz podejść do najstraszniejszych aspektów programowania: wyboru i kompromisów. Wybór języka programowania może wpływać na wydajność, czytelność, łatwość konserwacji, odporność itp. W przypadku rozwiązywania problemów większych niż rzeczy, które można trzymać w głowie, wybór ten jest świetny, ale także niebezpieczny. C ++ stara się dokonać dla programisty jak najmniejszej liczby wyborów. Poprzez naukę C ++ nauczysz się, jak samodzielnie wymieniać te kompromisy i wybierać rozwiązania swoich problemów.

Nie możesz używać żadnego z tych języków w branży ani dotykać ich ponownie, ale proces ich uczenia pomaga zrozumieć inne języki, których będziesz używać. Innym aspektem jest to, że uczysz się narzędzi w określonym języku. Uruchamianie gcc za pomocą wiersza poleceń, nauka Vima, przechodzenie przez program za pomocą GDB, tworzenie plików Make, sprawdzanie kodu za pomocą SVN, pisanie skryptów powłoki w celu automatyzacji testowania itp.

Pamiętaj, że podstawa programowa obejmuje również inne kursy (architektura komputera, struktury danych i algorytmy, kompilatory, systemy operacyjne itp.). Zatem samo uczenie się tych języków nie wystarczy, aby biegle programować.


0

Przejście z języka podstawowego na język wysokiego poziomu jest właściwą drogą. W ten sposób nadal masz pojęcie, co dzieje się z tyłu.

  • C - Wskaźniki i zarządzanie pamięcią
  • C ++ - podstawy OO i wciąż bardzo popularne
  • Java / C # - Najpopularniejsze języki
  • Trochę podstawowego montażu
  • Język funkcjonalny - np. Haskell
  • Język skryptowy - np. Python

0
  1. Pyton. Aby załatwić sprawę, wykonaj zwykłe programowanie. Proceduralne, OO i (do pewnego stopnia) funkcjonalne.

  2. Wyrażenia regularne. Są w bibliotece Pythona, ale jest to osobna DSL.

  3. Shell (BASH lub cokolwiek). „&”, „|”, „;” operatory łączenia procesów są w Pythonie krytyczne i nieprzyjemne.

  4. SQL. To - na razie - lingua franca w zakresie dostępu do danych.

  5. XHTML. To - na razie - lingua franca do prezentacji danych.

  6. CSS.

Może C, jeśli to konieczne.


Wygląda na to, że opuściłeś etap „ głębokiego oświecenia ”. Czy to numer 7?
Mark C

@Mark C: próbuję opisać „większość obecnie używanych języków i paradygmatów”. Z mojego doświadczenia wynika, że ​​te „inne” lub DSL są prawdopodobnie częściej używane niż języki programowania. Nie jestem pewien, czy prowadzi to do głębokiego oświecenia - wystarczy kontakt z wieloma językami, które są faktycznie używane.
S.Lott,

Masz rację, widzę, że to powiedział, a potem zauważyłem, że powiedział także „lub paradygmaty”. To był po prostu dobry humor.
Mark C

@ Mark C: Ale SQL i CSS to „inne paradygmaty”, które są najciekawsze. Rzeczywiście, wyrażenia regularne to paradygmat, który powoduje wiele pytań dotyczących przepełnienia stosu.
S.Lott,

0

Zacznij blisko metalu:

  1. Monter
  2. do
  3. C ++
  4. DO#
  5. Seplenienie
  6. Python lub Ruby

Problem z tak szerokim podejściem polega na tym, że nikt nie może stać się nawet w tych językach zdalnie bez wieloletnich studiów.

  1. Asembler: 3 miesiące
  2. C: 6 miesięcy
  3. C ++: 2 lata
  4. C #: 6 miesięcy
  5. Lisp: 3 miesiące
  6. Python / Ruby: 3 miesiące

Chyba że Twoim celem jest nauczenie ich „Witaj świecie”, co powinno zająć około miesiąca dla wszystkich 6.


-1

Dlaczego nie pójść od razu i nauczyć się VB lub C #. Oba moim zdaniem są kompletnymi językami, od początkującego do zaawansowanego, imho.


4
Ponieważ to nie jest żadna szerokość, a zatem nie jest odpowiedzią na pytanie. Co więcej, jeśli uważasz, że jeden (lub oba) z nich obejmuje wszystko, czego powinieneś się nauczyć, sam musisz nauczyć się więcej języków.
David Thornley,
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.