Jak naprawdę opanować język programowania?

103

Wiem, że ucząc się języka, możesz po prostu kupić książkę, podążać za przykładami i, jeśli to możliwe, wypróbować ćwiczenia. Ale tak naprawdę szukam, jak opanować język, gdy się go nauczysz.

Teraz wiem, że doświadczenie jest jednym z głównych czynników, ale co z uczeniem się wewnętrznych elementów języka, jaka jest jego podstawowa struktura itp.

Istnieją artykuły mówiące, że czytaj tę książkę, czytaj tę książkę, stwórz tę grę i tę grę. Ale dla mnie nie oznacza to opanowania języka. Chcę być w stanie czytać kod innych ludzi i rozumieć go, bez względu na to, jak trudny to jest. Aby zrozumieć, kiedy należy użyć funkcji, a kiedy innej itp.

Lista mogłaby być długa, ale wydaje mi się, że o to mi chodziło. :)

I na koniec weź dowolny język jako przykład, jeśli to konieczne, chociaż najlepiej byłoby, gdyby C został wzięty za przykład.

cprogcr
źródło
11
Doświadczenie to wszystko, co naprawdę sprowadza się do. Cała teoria, w której jesteś ekspertem, jest bezużyteczna, chyba że możesz ją zastosować praktycznie.
Simon Whitehead,
2
Zaimplementuj kompilator dla tego języka. Właściwie to mój ulubiony sposób wypróbowania nowego języka. Jeśli brzmi to trochę zbyt łatwo i nudno, spróbuj zamiast tego zdefiniować formalną semantykę języka, używając frameworka K lub czegoś podobnego.
SK-logic,
6
„człowieku, ziemniak to dinossaur, wszechświat samochodowy”. nie ma znaczenia, jak dobrze opanujesz język, jeśli kod jest zły i nie ma sensu, nadal trudno go zrozumieć.
Renato Dinhani,
2
Wydaje mi się, że trochę mi tego brakowało. Langauges ewoluują, więc nie ma opanowania języka, rozwijasz się wraz z nim, im więcej go używasz, tym więcej musisz się uczyć.
nycynik
2
Kod i odczytać kod. Weź losowy kawałek jądra Linuxa (Programowanie C) i dowiedz się, co robi funkcja.
Alex Hart

Odpowiedzi:

166

Muszę odpowiedzieć: „Wszystkie powyższe”. Ludzie kłócą się o to, czy kodowanie jest sztuką, rzemiosłem, dyscypliną inżynierii, czy gałęzią matematyki, i myślę, że uczciwiej jest powiedzieć, że to niektóre z nich. W związku z tym im więcej technik opanujesz, tym lepiej. Oto częściowa lista:

  • Używaj języka przez cały dzień, każdego dnia. Zwykle oznacza to zatrudnienie na pełny etat w tym języku.

  • Przeczytaj wszystko, co możesz o języku. Zwłaszcza „najlepsze praktyki” i idiomy.

  • Dołącz do grupy użytkowników, aby porozmawiać z innymi na temat języka i jego działań.

  • Pracuj z kodem innych ludzi! Nie ma szybszego sposobu na nauczenie się, czego nie robić w języku, niż sprzątanie po kimś, kto zrobił coś okropnego.

  • Wspieraj napisany kod - każdy błąd staje się zapowiedzią twoich najgorszych decyzji!

  • Studiuj informatykę i ogólnie języki

  • Naucz się zupełnie innego języka. Świetnym komplementem dla C byłby funkcjonalny język, taki jak Lisp. To zmieni sposób myślenia o języku proceduralnym na lewą stronę.

  • Naucz się korzystać z ram i interfejsów API dostępnych dla tego języka.

  • Poświęć trochę czasu na własne eksperymenty z językiem. SICP nie ma zastosowania do C, ale podejście do nauki języka poprzez testowanie jego ograniczeń jest bardzo produktywne.

  • Przeczytaj historię języka, aby dowiedzieć się, dlaczego został on utworzony taki, jaki jest.

  • Weź udział w konferencjach, aby usłyszeć, jak mówią autorzy języków lub usłyszeć, co liderzy branży robią z tym językiem.

  • Weź udział w zajęciach w języku.

  • Naucz język innym (dzięki Bryan Oakley )

Podsumowując, rób wszystko, co możesz wymyślić. Nie ma możliwości dowiedzenia się wszystkiego o większości języków. Każda zastosowana technika uczenia się zapewnia dodatkową perspektywę do zrozumienia.

GlenPeterson
źródło
76
+5 za Wsparcie napisanego kodu - każdy błąd staje się zapowiedzią twoich najgorszych decyzji!
Jennifer S,
8
+1 wyłącznie za ostatnie zdanie:Every technique you use to learn brings and additional perspective to your understanding.
Izkata,
1
@Izkata: OMG, czy to napisałem? Właściwie jestem native speakerem angielskiego! Poprawiłem to. Dzięki!
GlenPeterson
2
@GlenPeterson ... Właściwie właśnie skopiowałem wklejony, nie zwracając uwagi na to, że zdanie jest wyłączone. +1 rzeczywiście było w tym celu. = P
Izkata,
13
+1 za „Naucz się zupełnie innego języka. Świetnym komplementem dla języka C byłby funkcjonalny język, taki jak Lisp. To zmieni sposób myślenia o języku proceduralnym na lewą stronę”. - to chyba najważniejsze. Pomaga nauczyć się, jak nauczyć się programowania (tj. Czego szukać w jakiej sytuacji).
naught101
53

Potrzebne jest 10 000 godzin ćwiczeń.

Przeczytaj „Naucz się programowania w ciągu dziesięciu lat”

Najważniejsze punkty z góry:

  • Uzyskaj interesuje się programowaniem, a nie jakiś bo to jest zabawa. Upewnij się, że jest wystarczająco zabawny, abyś mógł poświęcić dziesięć lat / 10 000 godzin.
  • Program. Najlepszym sposobem uczenia się jest uczenie się przez działanie.
  • Rozmawiaj z innymi programistami; czytaj inne programy.
vartec
źródło
1
Właśnie to zamierzałem zamieścić! Oczywiście nie spędziłem już wystarczająco dużo godzin na P.SE.
Martijn Pieters,
@MartijnPieters: :-D
vartec
8
Świetny tytuł dla książki! Nie mogę się doczekać kontynuacji „Naucz się programować dobrze za 20 lat!”
GlenPeterson
16
Musisz jednak upewnić się, że nie powtarzasz tych samych 10 godzin 1000 razy ...
Izkata,
Żadna specjalistyczna wiedza techniczna nie pomoże komuś wiedzieć, do czego należy zautomatyzować lub stworzyć program. To jak powiedzenie - idź na siłownię i wykonuj wszystkie podstawowe ćwiczenia w koszykówkę przez dziesięć lat, przez 1 godzinę każdego dnia. Puf! Jesteś supergwiazdą koszykówki (mistrzem) ... nie, to coś więcej niż tylko umiejętności techniczne. Dlatego nie uważam tego za odpowiedź na pytanie, tj. Jak zostać mistrzem? To może być część rozwiązania, ale nie jest to magiczna mikstura dla mistrzostwa. Wiem - nie jestem mistrzem!
oemb1905
36

NIGDY nie uważaj się za mistrza całego języka, dopóki nie zaimplementujesz lepszego języka niż ten. Co oznacza, że ​​aby dowiedzieć się, jak działa dany język od dołu, zdobądź książkę, która uczy kompilatora / interpretatora tego języka. Na przykład:

  • C: Książka LCC Compiler

  • C ++: Projektowanie i ewolucja C ++ (A następnie buduj własny kompilator C ++ lub przynajmniej zrozum implementację jednego z nich przy użyciu kodu kompilatora GNU C ++)

  • Java: Pobierz „Inside JVM” i pobierz kod źródłowy javac. Pomocny jest także kod .C „java”

  • Python: implementacja CPython.

  • Cel C: Prawie każdy materiał od Apple na temat wewnętrznych elementów środowiska wykonawczego ObjC env i kodów źródłowych kompilatora pomoże ci.

  • Lisp: SICP Book (uczy Cię Schematu i podstawowego interpretera-kompilatora dla języka podobnego do seplenienia): Lisp in Small Pieces (kolejna dobra książka).

Aniket Inge
źródło
1
Teraz nazywam to odpowiedzią. Zaakceptowałem już jedną, ale zasługiwałaby na „najlepszą odpowiedź”, gdyby była nieco wcześniej
cprogcr,
2
Nie masz pojęcia, jak bardzo Twoja odpowiedź pomogła. Czytam o książkach, o których wspomniałeś i są to rzeczy, których potrzebuję.
cprogcr
hehe nauczyłem się od nich. Cieszę się, że mogę pomóc :-)
Aniket Inge
skoro wspomniałeś C jako przykład, pozwól, że podam ci nazwy dwóch kolejnych książek, jako prezent, który opanowałem C jak grzbiet mojej dłoni: 1. OOC.PDF (bezpłatnie dostępny online) i 2. Minix Book (chociaż książka dla autorów systemów operacyjnych, to właśnie Linus Torvalds przeczytał przed wdrożeniem Linuksa)
Aniket Inge
1
tak, Andrew Tenenbaum, to jest książka. Każde wydanie jest dobre do przeczytania. Nie mówi ci, jak działa „C”, ale kiedy zobaczysz, jak biblioteka C jest zaimplementowana do pracy z systemem operacyjnym, który zbudowałeś, zaczynasz rozumieć C jeszcze lepiej! Może wystarczy, byś mógł to zmodyfikować (i tam właśnie wchodzi OOC)
Aniket Inge
12

Spróbuj użyć języka dla czegoś, do czego nie był przeznaczony. Napisz sterownik urządzenia w Pythonie lub bibliotekę manipulacji matrycą w języku COBOL. Myślę, że jednym z najlepszych sposobów opanowania języka jest naprawdę popychanie go, staranie się, aby jego mocne strony pokonały jego słabości.

TMN
źródło
1
Kiedy byłem na studiach, zdecydowałem, że „opanowałem” język, kiedy napisałem w nim Pong. Działało to całkiem dobrze, dopóki nie nauczyłem się MIPS. Nadal mam koszmary.
Roddy of the Frozen Peas
Czy strona internetowa w C jest gotowa?
BigSack
10

Ułatwię ci to. Nigdy nie opanujesz języka. Kropka. Jeśli uważasz, że tak, to oczywiście nie masz. Nie ma szczytu, do którego nagle dotrzesz i powiesz „Cóż, teraz w pełni opanowałem ten język. Co teraz?” Nawet doświadczeni programiści, którzy pracują z tym samym językiem od dziesięcioleci, powiedzą ci, że czasem natrafiają na nowe pomysły, procesy, praktyki itp. Prawdziwym celem jest opanowanie twojego rozumienia języka lub języków. Umiejętność uczenia się nowych pojęć i szybkość, z jaką można wprowadzać nowe lub zmienione funkcje w języku, jest o wiele ważniejsza niż znajomość każdego słowa kluczowego i składni. Przestań się martwić o „opanowanie” języka i po prostu martw się o ciągłe doskonalenie i udoskonalanie jakości i wydajności kodu.

Chris Pratt
źródło
2
The true goal is to master your conceptual understanding of a language or languages.Dokładnie. Tak naprawdę miałem na myśli.
cprogcr
Każdy język programowania jest skończony. Jest zbudowany ze skończonej liczby pojęć, wymaga skończonej liczby idiomatycznych sztuczek. Dlatego łatwo jest opanować dowolny język. Oczywiście nie można ogólnie opanować programowania , zawsze istnieje możliwość dalszej poprawy, ale pytanie dotyczy konkretnie języka .
SK-logic
SK-logic: zmieniają się języki programowania, podobnie jak ich biblioteki i środowiska. W rezultacie zmienia się również sposób pracy z językiem. Na przykład jQuery zmienił sposób pracy z Javascriptem.
orlp
Prawdopodobnie to prawda, że ​​nikt tak naprawdę nie jest w stanie opanować języka takiego jak C ++, ale dla nieco minimalistycznych takich jak Scheme powinno to być całkiem możliwe - jak mówi @ SK-logic, tak naprawdę programowania , w jakimkolwiek języku, nie da się opanować, ponieważ zakres zastosowań jest nieograniczony.
leftaroundabout
1
@nightcracker, języki nie „ewoluują”. C99 zawsze będzie C99 i nigdy się nie zmieni. C ++ 11 zawsze pozostanie C ++ 11, nawet po zastąpieniu go językiem nowej generacji. Środowiska „ewoluują”, tak, ale jQuery nie wprowadził żadnych nowych technik nieznanych wcześniej społecznościom innych języków. Byli nowi tylko w wąskiej społeczności Javascript.
SK-logic,
5

Znasz już odpowiedź na to pytanie

  • Musisz użyć języka. Dużo. Aby rozwiązać tak różnorodny zakres problemów, jak to możliwe
  • Musisz czytać (i, najlepiej, pracować) z kodem innych ludzi, najlepiej tych, którzy mają pewien poziom biegłości (tj. Głębokie zrozumienie przynajmniej niektórych aspektów języka). Co więcej, jeśli możesz rozmawiać z ludźmi na temat rozwiązywania problemów z językiem, tym lepiej.

Wszystko sprowadza się do ciężkiej pracy i determinacji oraz do wszystkiego, czego możesz nigdy nie osiągnąć.

Zastanów się, skąd pochodzi ten termin - aby zostać mistrzem rzemieślnika, musiałeś być uczniem, a następnie czeladnikiem i tylko oni mogliby mieć szansę zostać mistrzem. Po drodze bylibyście nauczani i ćwiczyliście, obserwowaliście i zadawali pytania innym w ich rzemiośle oraz (miejmy nadzieję) ucząc się od nich.

Nie ma magicznej kuli ...

Murph
źródło
2

Zacznij od przeczytania i zrozumienia, czym jest SDLC (alias Cykl życia oprogramowania). Jest to iteracyjny proces obejmujący samodoskonalenie, uczenie się,**practicing, practicing...**

wprowadź opis zdjęcia tutaj

To otworzy Twoje horyzonty na obszary, których musisz się nauczyć lub ulepszyć. Istnieje kilka podstawowych książek z zakresu inżynierii oprogramowania, które przydałyby się również przy samodzielnym tworzeniu kilku aplikacji.

Ponadto, gdy poczujesz się pewnie w języku OOP , możesz zacząć uczyć się wzorców projektowych , a wzorce Head First Design to naprawdę dobra książka do rozważenia. Kocham tę książkę.

EL Yusubov
źródło
1
Dzięki. Wybrałem już odpowiedź, zanim to przeczytałem, ale na pewno skorzystam z twojej rady.
cprogcr
nie jestem pewien, dlaczego głosowano za odrzuceniem, proszę dać mi znać, co należy poprawić.
EL Yusubov,
2

Nic nie zastąpi doświadczenia. Aby coś opanować, musisz to zrobić / wykorzystać na wiele różnych sposobów.

Dlatego używaj tego języka do ćwiczeń (takich jak Project Euler ) i osobistych projektów, rzeczy, których naprawdę potrzebujesz, lub rzeczy, które uważasz za interesujące. Napisz grę, napisz aplikację internetową, napisz parser, co tylko chcesz. I na każdym kroku staraj się zrozumieć, co robisz, zamiast wklejać razem kod lub postępować zgodnie z instrukcjami.

Chcę być w stanie czytać kod innych ludzi i rozumieć go, bez względu na to, jak trudny to jest.

Możesz to zrobić od razu po zrozumieniu podstawowej składni. Po prostu weź trochę kodu i poświęć czas, aby go szczegółowo zrozumieć. Wyszukaj rzeczy, których nie rozumiesz, lub zadaj konkretne pytania w miejscach takich jak Przepełnienie stosu .

Michael Borgwardt
źródło
2

Po stronie wysokiego poziomu problemu dowiedz się o architekturze: jak organizować swoje projekty, jaka jest jej struktura. Nie pozwól im rosnąć losowo.

Na poziomie średnim naucz się różnych technik i paradygmatów. Im bardziej różnorodne narzędzia masz w swoim repertuarze, tym więcej mocy dla Ciebie. Jeśli studiowałeś tylko java, python i ruby, byłeś narażony na bardzo małą część przestrzeni programistycznej. Naucz się programowania imperatywnego i funkcjonalnego, naucz się prologu i J. Ideą nie jest „opanowanie” stu języków, ale poznanie różnych sposobów rozwiązywania tych samych problemów.

Po stronie niskiego poziomu problemu jedną rzeczą, która może ci pomóc być lepszym programistą (a właściwie lepszym w tym, co robisz), jest dobry model mentalny platformy. Na przykład możesz dowiedzieć się, jak działają struktury kontrolne C i poznać najpopularniejsze biblioteki, ale jeśli nie masz mentalnego modelu działania wskaźników i pamięci, będziesz mieć problemy z umiarkowanie złożonymi wyrażeniami.

José Dinuncio
źródło
1

Czy mogę zrobić kilka sugestii?

Po pierwsze, jeśli znajdziesz mentora, z którym porozmawiasz o używaniu języka, uzyskasz najlepsze porady i wskazówki oraz odpowiesz, gdy jedna technika będzie lepsza od drugiej.

Po drugie, ćwicz jak najwięcej i wypróbuj język do maksimum! Kiedyś pracowałem w zespole, który każdego dnia wybrałby z podręcznika czasownik lub inny język programowania. To był znak honoru, jeśli mógłbyś wprowadzić go do swojego kodu tego dnia. Oznaczało to, że cały zespół programistów musiał przyjrzeć się i zrozumieć (czasami) niejasny termin, aby go zrozumieć i skutecznie z niego korzystać. W niektóre dni nam się nie udawało, ale ten zespół był zabawny i naprawdę technicznie włączony !!

Nicholas Sibson
źródło
0

Języki programowania odzwierciedlają idee stojące za paradygmatami programowania, które zostały opracowane z myślą o opracowywaniu oprogramowania ogólnego lub opracowywaniu oprogramowania specjalnego. Na przykład język programu, taki jak Java, reprezentuje zorientowany obiektowo paradygmat programu, ale AspectJ (rozszerzenie Java) jest używane do programowania zgodnie z programowaniem aspektowym.

Biorąc pod uwagę to krótkie wprowadzenie, aby naprawdę opanować język, samodzielne kupowanie i czytanie książki nie byłoby zbyt pomocne. Musisz zrozumieć środowisko, w którym możesz programować w wybranym języku, uczyć się o paradygmacie i, co ważniejsze, budować sensowną aplikację przy użyciu tego języka. Bardzo przydatnym podejściem do nauki jest zbudowanie małej aplikacji, która da ci przedsmak różnych narzędzi udostępnianych przez język.

Widziałem ludzi pochodzących ze społeczności czystego C, którzy nie dowiadywali się niczego o orientacji obiektowej i zmagali się w nauce języka Java lub celu-c. Widziałem także ludzi, którzy zmagają się z programowaniem interfejsów użytkownika, gdy tak naprawdę nie zrozumieli elementów interfejsu użytkownika, programowania sterowanego zdarzeniami itp.

Mam nadzieję, że to pomoże!

hsnm
źródło
0

Dodałbym dwa elementy do listy Glen

  • Spróbuj rozwiązać trudny problem, który inni mają np. Udzielić odpowiedzi na temat SO
  • Czytaj blogi / książki projektantów języków. To najlepszy zasób głębokiej wiedzy. Będziesz wiedział, jaka jest decyzja projektowa za powodem X.
Łukasz Madon
źródło
0

Aby wykorzystać to, co powiedział @TMN. Odniosłem wielki sukces w nauce języków, pisząc ten sam program w innym języku.

Na przykład napisanie programu, który wczytuje plik CSV, analizuje tekst, a następnie zapisuje go z powrotem w drugim pliku CSV z kolumnami w odwrotnej kolejności.

Lubię to,

Kolumna1, Kolumna2, Kolumna3

do

Kolumna3, Kolumna2, Kolumna1

Zapewni to podstawową znajomość języka. Zobacz, co jeszcze możesz zrobić. Może zezwalaj na podstawianie wartości, zmianę kolejności lub czytanie z wiersza poleceń. Zrób to tak skomplikowane, jak chcesz.

Myślę też, co powiedział @GlenPeterson,

Naucz się zupełnie innego języka. Świetnym komplementem dla C byłby funkcjonalny język, taki jak Lisp. To zmieni sposób myślenia o języku proceduralnym na lewą stronę.

To świetny pomysł. Sugerowałbym język taki jak Haskell, ponieważ w najnowszych wersjach możesz programować przy użyciu wszystkich czterech paradygmatów programowania OO, proceduralnego, logicznego lub funkcjonalnego. Mimo że jest to właściwie język funkcjonalny, można z pewnym wysiłkiem wdrożyć inne paradygmaty, które byłyby dobrym doświadczeniem w nauce.

Świetny język do zabawy.

Dan
źródło
0

Nie możesz nauczyć się języka z książki. Wszystko czego potrzebujesz to ćwiczyć i ćwiczyć. Nie sądzę, że możesz nauczyć się języka z tej konkretnej książki lub tego konkretnego źródła. Po prostu myśl, że język programowania jest taki sam jak język ludzki. Nie możesz po prostu nauczyć się angielskiego lub francuskiego, czytając określoną książkę. dzień życia. Kod od podstaw, rozszerz jego funkcjonalność, spróbuj zbudować coś, co sprawi, że będziesz trochę zadowolony. A jeśli myślisz o opanowaniu języka jako znajomości całego języka i wykorzystaniu każdego elementu języka programowania w praktycznym kodowaniu ... NIE MOŻESZ. A nawet jeśli możesz, może to potrwać 10-15 lat.

sumit
źródło