Języki programowania, które ogólnie poprawiają twoje umiejętności programowania? [Zamknięte]

27

Jakich języków sugerowałbyś programiście do nauki, nie dlatego, że będą oni często korzystać z języka (ale mogą go mieć), ale dlatego, że poprawi on ogólną umiejętność programowania i pozwoli myśleć inaczej (i być może lepiej) ) droga?

Anto
źródło
12
Ani jednego. Raczej: jak najwięcej z nich, jak najdalej od innych.

Odpowiedzi:

27

dla „normalnego” programowania i algorytmów:

  • python, dobry do nauki, łatwy w użyciu, ładny do czytania.
  • C ++, uczy NAPRAWDĘ komputera.

dla doświadczenia zmieniającego myśl:

  • Haskell
  • Prolog

za zniszczenie twojego umysłu i przekroczenie linii między padawanem a Mistrzem Jedi:

  • Wspólny LISP
Lacrymology
źródło
3
Tak, zgadza się z chrisaycock, C i montaż nauczy Cię, co komputer jest naprawdę, C ++ jest bardzo niewielki krok w górę, ale nadal będzie pan postępowania w sprawach takich jak wskaźniki pamięci i zagadnień wysokiej wydajności
Lacrymology
mh Prolog jest świetny, ale nie rozumiem, jak to może być interesujące dla poprawy ogólnych umiejętności programowania. Widzę to jako alternatywny system notacji matematyczno-logicznej, którego konstrukty można przeszukiwać bardziej niż języki programowania (opisuje statystyki, a nie procedury). Edycja: to z pewnością zmienia sposób myślenia o czymś, ale to coś nie jest programowaniem.
cbrandolino 16.01.11
Prolog na pewno programuje. Programowanie deklaratywne i zakorzenione w logice (a zatem względnie matematyczne), tak. Ale wciąż programuję. Co do ostatniego punktu, czy myślisz, że zrobiłby to inny Lisp (tj. Schemat)?
3
Prolog jest najbardziej znanym językiem paradygmatu logiki. Ważne jest, aby skupić się na wszystkich paradygmatach, z którymi możesz sobie poradzić, jeśli chcesz być lepszy jako programista, pomoże ci to uzyskać sprawność umysłową i da ci nowe narzędzia. Wydaje mi się, że zrobiłby to dowolny dialekt Lisp. W Common Lisp widzę, że wydaje mi się to najbardziej użytecznym Lispem produkcyjnym.
Lacrymology
1
Głosowałbym za Schematem nad Common Lisp - myślę, że to zależy, czy myślisz, że kiedykolwiek użyjesz Lisp w produkcji. Jeśli nie, wybierz Schemat.
Skilldrick 17.01.11
13

Nie zapomnij o Javascript .

Ma funkcje OO, które nie są zwykłymi funkcjami OO. Jest dobrze przystosowany do funkcji i zamknięć wyższego rzędu, z których rutynowo korzystasz. Pozwala na wiele funkcjonalnych sztuczek programistycznych. Jest niezwykle elastyczny.

I to jest praktyczne, ponieważ ma ją każda poważna przeglądarka.

(Oczywiście ma również wiele nieprzyjemnych dziwactw. Niewiele praktycznych języków tego nie robi)

9000
źródło
1
Czy JS ma funkcje OO, których nie ma Java?
Mahmoud Hossam,
3
@Phobia: JS robi OO w zupełnie inny sposób. Nie ma zajęć. Dziedziczenie odbywa się za pomocą prototypów - zasadniczo obiekt może dziedziczyć z dowolnego innego obiektu. Funkcje są pierwszorzędnymi wartościami; nie tylko możesz je przekazywać, ale także łatwo przypisywać nowe metody do istniejących obiektów. Sposób, w jaki JS ukrywa dane, jest również zupełnie inny niż Java: wszystko, co eksponuje obiekt, jest publiczne, więc ukrywasz dane i metody za pomocą zamknięć. Zauważ, że nie ma „kanonicznego OO”; JS jest nieco bliżej „oryginalnego” OO, który wymyślił Smalltalk, niż np. C ++, ale OO Javy jest teraz również „kanoniczne”.
9000
11

C i montaż dla działania komputera

Haskell i LISP zarówno do programowania funkcjonalnego, jak i metaprogramowania

APL do programowania wektorowego i zwięzłego

bash lub tcsh za programowe administrowanie komputerem

chrisaycock
źródło
4
Zamiast APL możesz używać J tego samego autora.
9000
+1 przy montażu. Nigdy nie patrzysz na języki wysokiego poziomu w ten sam sposób po dokonaniu jakiegokolwiek znaczącego rozwoju. Jeśli szukasz czegoś, co sprawi, że pomyślisz o kodowaniu w zupełnie inny sposób, ASM to zrobi.
Kurtis,
9

Sugerowałbym Schemat.

Jest to funkcjonalny język programowania wywodzący się z Lisp (większość uważa, że ​​jest to dialekt). Główną różnicą w przypadku Common Lisp jest to, że jego podejście jest bardzo minimalistyczne - niezwykle . Na przykład, w normalnej dystrybucji Schematu (dowolny schemat <R5 lub Mit / GNU / Scheme) nie znajdziesz implementacji pętli: będziesz musiał stworzyć własną za pomocą rekurencji ogona.

Jest bardzo ekspresyjny, a jego składnia jest świetna do nauczenia się czegoś nowego o programowaniu, ponieważ: po prostu patrząc na kod, masz pojęcie o tym, jak kompilator / interpreter będzie działał przez niego.

Ponadto zawiera najlepszą książkę programistyczną, strukturę i interpretację programów komputerowych , którą można bezpłatnie pobrać ze strony internetowej MIT.

Oto kilka lekcji wideo, które mam nadzieję natychmiast zainteresują Cię tym fascynującym językiem - mówcami są autorzy SICP: http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman- Wykłady/

cbrandolino
źródło
Dziękuję Ci. Muszę cię jednak ostrzec, że lekcje są łatwe do przeniesienia namiętnych programistów do łez.
cbrandolino
@cbrandolino - To prawda, że ​​nasza klasa programowania funkcjonalnego znokautowała wiele osób z programu informatycznego.
jmort253
1
Schemat był minimalistyczny, ale w R5 wyhodował kilka brodawek, a na R6 jest zdecydowanie ogromny. Szkoda, bo było bardzo piękne. Dla naprawdę minimalistycznego, ale wciąż praktycznego języka, sprawdź Lua
Javier
@Javier, masz rację. Zedytuję odpowiedź, aby określić implementacje.
cbrandolino 17.01.11
Robię plan w bankomacie uniwersyteckim i nienawidzę tego. Nie dlatego, że jest to język funkcjonalny, chcę się w to zagłębić jeszcze długo. Jednak składnia naprawdę mnie zabija. Istnieją trzy różne typy nawiasów klamrowych na klawiaturze (cztery, jeśli policzymy nawiasy kątowe) i używasz tylko nawiasów. Czemu? Na czym polega problem z użyciem innych?
Femaref
4

LISP, najlepiej Schemat w połączeniu z „Strukturą i interpretacją programów komputerowych” Abelsona i Sussmana, nauczy Cię myślenia w kategoriach innych niż narzucone przez C / C ++.

FORTH, w szczególności FORTH zorientowany na blok, a nie na plik (taki jak D85) nauczy cię ograniczać swoją gadatliwość. Jeśli w żadnym wypadku nie możesz napisać procedury dłuższej niż 16 linii po 64 znaki, jesteś zmuszony do streszczenia i uwzględnienia.

John R. Strohm
źródło
4

Java jest jednym z języków, których uczy się najwięcej na uniwersytetach na całym świecie i jest ku temu powód. Chociaż często jest podobny do dinozaura, daje wszystkim bardzo dobry przegląd Koncepcji nowoczesnego programowania. NIE pokazuje ci, jak działa sam komputer, jak asembler, a nawet już i tak znacznie bardziej abstrakcyjny język C. Ale piloci muszą umieć latać i nie być w stanie samodzielnie zbudować samolotu - ucz się JAVA jako dobra podstawa dla każdego kodu, który napiszesz w najpopularniejszych obecnie językach (dla rezonansu): Java, c ++, php, c #, ruby ​​(na szynach) python i tak dalej ...

max

madmax
źródło
3

C # 3 z LINQ.

To świetne wprowadzenie do programowania funkcjonalnego.

Spróbuj napisać program (lub rozwiązać Project Euler) i zastąpić jak najwięcej pętli wywołaniami LINQ.
Pomaga opanować koncepcje programowania funkcjonalnego i leniwej oceny.

Stamtąd można przejść do F #

SLaks
źródło
3

Ręce w dół, powiedziałbym Haskell. I z dwóch powodów:

  • To po prostu najlepszy sposób na naukę programowania funkcjonalnego. Prawie każdy inny język domyślnie dopuszcza efekty uboczne, ale może robić rzeczy funkcjonalnie (i tak, dotyczy to także ML i Erlanga: więcej informacji na ten temat ). Haskell jest domyślnie funkcjonalny, ale można go użyć, aby używał efektów ubocznych, gdy są potrzebne.
  • Jest to zdecydowanie język, który zachęca do myślenia przed napisaniem kodu. Szczerze mówiąc, nigdy tak naprawdę nie stanowiło to dla mnie problemu (wręcz przeciwnie). To powiedziawszy wydaje się, że jestem mniejszością. Większość programistów, na których natknąłem się, wydaje się być bardziej nastawieniem na „najpierw kod, zadawaj pytania później” niż na „myślenie o problemie przez kilka dni przed kodowaniem rozwiązania w ciągu 5 minut” (co zwykle jest moim nastawieniem) . Dlatego ten rodzaj języka może zapewnić cenne doświadczenie większości programistów.
Jason Baker
źródło
3

Sugerowałbym Scalę, jeśli pochodzi ze świata C / Java.

To nie jest wyłącznie funkcjonalny język programowania, ale używa OO do symulacji niektórych funkcji programowania funkcjonalnego (np. Używanie obiektu do symulacji funkcji pierwszej klasy i funkcji wyższego rzędu).

Więc jeśli znasz OO, Scala używa terminów, które już znasz, aby wyjaśnić funkcjonalny świat.

Odkryłem, że łatwiej jest mi zrozumieć programowanie funkcjonalne w Scali niż nurkować w bardziej funkcjonalnym programowaniu, takim jak Haskell, Lista ... itd.

Brian Hsu
źródło
2

Języki funkcjonalne pomogły mi dotrzeć tam, gdzie jestem dzisiaj. Pomimo tego, że zajmuję się tworzeniem aplikacji internetowych, pojęcia wyniesione z języków funkcjonalnych pomagają mi znaleźć rozwiązania problemów, których inaczej nie widziałbym. Oto języki, z którymi pracowałem na mojej uczelni:

  • C ++ (nie działa, ale pojęcia takie jak wskaźniki i zarządzanie pamięcią są nieocenione)
  • Dr Scheme
  • ML / Ocaml (Napisaliśmy inny język przy użyciu ML / Ocaml!)
  • JavaScript (język funkcjonalny, który zyskuje na popularności w branży, zarówno po stronie klienta, jak i serwera)

Uczenie się tych języków pomoże ci zrozumieć świat abstrakcji i jak budować bloki kodu, które zawierają inne funkcje, ukrywając szczegóły niskiego poziomu, abyś mógł skupić się na wysokich celach biznesowych.

jmort253
źródło
1

Ruby ma jedną z najbardziej wydajnych i intuicyjnych platform testowych, z których korzystałem. Nie jestem pewien, czy naprawdę rozumiałem, jak właściwie używać kpiny i karczowania, dopóki nie zacząłem pisać testów w Rubim. rSpec i Cucumber to fantastyczne narzędzia.

gposton
źródło
1

Istnieje wiele języków programowania, które będą wymagały nowego myślenia o problemie (w stosunku do tego, do czego jesteś przyzwyczajony). Najczęstsze języki do nauki po nauczeniu się języka imperatywnego, są funkcjonalne i język logiczny, na przykład prolog i seplenienie .

Niektóre języki są pod silnym wpływem teorii kategorii, jak ocaml i Haskell, a niektóre są językami krzyżowymi, takimi jak Curry (funkcjonalne i logiczne). Curry jest prawdopodobnie najbardziej oszałamiającym językiem, jaki znam, nie tylko dlatego, że dostarczył Haskellowi niesamowitej inteligencji dzięki programowaniu logicznemu, ale także z powodu integracji z programowaniem opartym na ograniczeniach.

Innym zabawnym językiem jest Occam-pi, ponieważ jest tak obciążony współbieżnością, ale także z powodu ostatniego portu arduino .

HaskellElephant
źródło
1

Dobrze zaokrąglony programista ma kilka torebek chwytających za rękaw, a są to:

  • Montaż, aby dowiedzieć się, jak działa wnętrzności komputera.
  • Język proceduralny, taki jak C lub Pascal.
  • Funkcjonalny język, taki jak Scheme.
  • Język OOP, taki jak Squeak.

Te wszystkie nauczy Cię nieco różne sposoby, aby myśleć o i podejście problemy.

czerwony brud
źródło
0

nie nauczysz się poprawnie żadnego języka programowania bez wyraźnego celu. Wiedząc, co chcesz z tym zrobić, możesz zdecydować, który program odpowiada Twoim potrzebom.

Na przykład, powiedzmy o c #.

C # może wykonywać program internetowy, program konsoli, samodzielny plik wykonywalny, program do gier, program Silverlight i program mobilny. Chociaż składnia jest prawie taka sama w prawie każdym przypadku, ale działa inaczej w każdym scenariuszu. Na przykład samodzielny plik wykonywalny przechowuje swoje informacje, dopóki nie zostanie zwolniony lub program nie zostanie zakończony, podczas gdy program internetowy, informacje są niszczone za każdym razem, gdy ładujesz stronę, aw srebrnym świetle spędzasz większość czasu, walcząc z plik xml.

Po drugie, nie marnuj czasu na egzotyczne języki (na przykład Haskel), mówiąc korporacyjnie, jest bardzo mało programów wartych twojego wysiłku: java (król wzgórza), c # / vb.net, php i sql.

magallanes
źródło
0

Istnieje bardzo prosty program do pisania apletów Java o nazwie Przetwarzanie

Ten język zapewni bardzo podstawowe zrozumienie zmiennych, pętli i tego rodzaju rzeczy, jeśli dopiero zaczynasz.

Przeszklenie bułek
źródło
0

Kilka świetnych sugestii tutaj. Prawdopodobnie wybrałbym osobiście C lub C ++. Zmuszają cię do radzenia sobie z wieloma pojęciami, które mają ogromne znaczenie dla zrozumienia, jak działają rzeczy, ale które mają tendencję do zaciemniania w innych językach. Samo zrozumienie, jak rzeczy naprawdę działają, pomoże ci jako programistowi, nawet jeśli język, którego używasz później, ukrywa niektóre szczegóły.

Montaż jest fajny, jeśli chcesz zagłębić się nawet w nieco niższy poziom, ale nie oczekuj, że zrobisz z tym wiele. :)

Tridus
źródło
0

Poleciłbym Ruby. Ruby nie wymaga zmiany paradygmatów, ale zachęca do pracy w wielu paradygmatach. Myślę, że zaletą tego jest to, że zamiast być sfrustrowanym niemożnością pracy tak, jak jesteś przyzwyczajony, używasz innego paradygmatu z frustracji z ograniczeniami robienia rzeczy tak, jak jesteś przyzwyczajony.

filozofodad
źródło