Często słyszę, że prawdziwy programista może łatwo nauczyć się dowolnego języka w ciągu tygodnia. Mówiono mi, że języki to tylko narzędzia do wykonywania zadań. Programowanie to najwyższa umiejętność, której należy się nauczyć i opanować.
Jak mogę się upewnić, że faktycznie uczę się programowania, a nie tylko uczę się szczegółów języka? Jak mogę rozwinąć umiejętności programowania, które można zastosować we wszystkich językach zamiast tylko jednego?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. Tydzień później:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Odpowiedzi:
Nie martw się o spotkanie z jakąś niedorzeczną koncepcją „umiejętności”, tak często słyszaną w takich stwierdzeniach jak:
Wszystkie te stwierdzenia oparte są na błędnej przesłance i zdradzają brak doświadczenia w szerszym spektrum języków programowania. Są to bardzo powszechne stwierdzenia, w które głęboko wierzy programiści. Nie będę kwestionować tego, ale zakwestionuję ich dokładność.
Udowodniono to po prostu: Spędź tydzień (lub naprawdę więcej niż kilka dni), próbując poznać podstawy Haskell , Prolog lub Agda . Wkrótce zaczniesz słyszeć starą piosenkę Sesame Street w swojej głowie: „Jedna z tych rzeczy nie jest podobna do innych ...”.
Jak się okazuje, istnieje cały szereg języków programowania, technik i podejść, które są tak obce od tego, co 95% z nas robi lub kiedykolwiek robiło. Wielu zupełnie nie zdaje sobie sprawy z tego, że istnieje choć jedna z tych innych koncepcji, co jest w porządku i nie są konieczne, aby być zatrudnionym, a nawet skutecznym programistą.
Ale pozostaje faktem: te techniki i podejścia istnieją, są dobre dla wielu różnych rzeczy i mogą być bardzo przydatne, ale nie są one takie, do czego jesteś przyzwyczajony, a ludzie nie mogą ich po prostu odebrać po południu majstrowania.
Ponadto powiedziałbym, że większość przypadków, w których ludzie twierdzą, że mają lub potrafią uczyć się tak skomplikowanych rzeczy, jak języki programowania, tak szybko, jak w tydzień, cierpią z powodu efektu Dunninga Krugera , Wikipedia (moje podkreślenie):
Odsyłam ludzi do bardziej doświadczonego spojrzenia na koncepcję uczenia się programowania przez Petera Norviga: Naucz się programować za dziesięć lat .
Z pewnością istnieje zestaw nadrzędnych zasad, które ułatwią naukę wszystkich języków!
Być może, ale twierdzę, że ten zestaw zasad jest tak duży, że prawie zawsze będą języki poza twoim tygodniowym zasięgiem. Gdy dodajesz nowe koncepcje do listy, którą znasz i czujesz się swobodnie, ta lista języków poza twoim bezpośrednim zasięgiem może się skurczyć, ale trudno mi uwierzyć, że kiedyś zniknie. Lista koncepcyjnych podejść do obliczeń jest tak szeroka, że zaskakuje, od języków konkatenatywnych poprzez języki oparte na wektorze po języki specjalizujące się w sztucznej inteligencji lub metaprogramowaniu ( lub języki, które istnieją wyłącznie w celu obsługi wyrażeń regularnych ).
Po dziesięciu latach będziesz mógł ogólnie programować. Oznacza to, że możesz napisać nieco przyzwoity kod w jakimś języku lub stylu języków. Więc po 10 latach jesteś gotowy, by zacząć zajmować się tymi niezliczonymi szerokimi, przekrojowymi koncepcjami przez resztę swojego życia, a poza tym , że jesteś Edsgerem W. Dijkstrą , Donaldem Knuthem lub Johnem D. Carmackiem , nie dostaniesz się do wszystkich z nich.
źródło
Kluczem do tej kwestii jest, aby wznieść się w język i pomyśleć nie języka jesteś kodowania.
WAT
Doświadczeni programiści polyglot myślą w abstrakcyjnym drzewie składni (AST) własnego modelu mentalnego języka. Nie uważa się, że „potrzebuję pętli for”, a raczej „muszę coś zapętlić” i tłumaczy to na odpowiedni dla iteratora lub rekurencji dla tego języka.
Jest to podobne do tego, co widzi się podczas nauki języka mówionego. Ludzie, którzy mówią wieloma językami, płynnie myślą o znaczeniu , które pojawia się w danym języku.
Pewną wskazówkę dotyczącą tego AST można znaleźć w dwóch filmach o śledzeniu wzroku Kod Zrozumienie ze śledzeniem oczu i Eksperymentowanie z kodem oka (nowicjusz), w którym obserwuje się ruchy oka początkującego i doświadczonego programisty. Widać, że doświadczony programista „kompiluje” kod do swojego modelu mentalnego i „uruchamia” go w swojej głowie, podczas gdy początkujący musi iterować kod słowa kluczowego według słowa kluczowego.
Zatem kluczem do pytania o rozwijanie umiejętności programowania w odniesieniu do wszystkich języków jest nauka wielu języków, dzięki czemu można zdystansować się od modelu mentalnego jednego języka i rozwinąć zdolność do samodzielnego generowania AST dla problemu w język główny, który jest następnie tłumaczony na dany język.
Gdy ktoś ma już umiejętność używania AST w głowie, nauka innego języka w ramach podobnej szkoły myślenia (przejście do Befunge jest trochę skokiem z Jawy, ale nie tak bardzo z Forth ) staje się znacznie łatwiejsze - to „tylko” przetłumaczenie AST na nowy język, który jest o wiele łatwiejszy od trzeciego, czwartego i piątego (itd.) czasu, w którym jest to zrobione.
Jest klasyczny artykuł: Prawdziwi programiści nie używają Pascala . Część tego brzmi:
Są też bity, dla których nie możesz po prostu użyć mentalnej AST - musisz także myśleć w języku. Zajmuje to trochę czasu (wciąż jestem oskarżany o pisanie kodu Perla w Pythonie, a mój pierwszy kod Lisp został sprawdzony pod kątem „To bardzo dobry program w języku C.”).
W tym celu muszę wskazać artykuł opublikowany przez ACM, Jak nie pisać Fortran w żadnym języku . Trzeci akapit tego artykułu (który nie prowadzi do cytatów) bezpośrednio odnosi się do pytania:
Nie wystarczy mieć AST - trzeba mieć AST, którą można przetłumaczyć na inne języki. Posiadanie Fortran AST w głowie i pisanie kodu Fortran w Javie nie jest dobrą rzeczą. Trzeba także znać język i jego idiomy, aby móc myśleć w tym języku (pomimo tego, co powiedziałem na samym szczycie).
Widziałem kod Java napisany przez kogoś, kto nie przestał pisać kodu C. Był jeden obiekt z główną metodą. W tym obiekcie znajdowało się kilka metod statycznych wywoływanych przez
main
prywatne klasy wewnętrzne, które miały pola publiczne (a zatem wyglądały bardzo podobnie do rozpórek). Był to kod C napisany w Javie. Wszystko, co zostało zrobione, to przetłumaczenie składni jednego języka na inny.Aby przejść przez ten punkt, trzeba nadal pisać kod w wielu językach, nie myśleć w tych językach podczas projektowania kodu, ale myśleć w nich, tłumacząc projekt na kod, aby poprawnie pracować z idiomami języka.
Jedynym sposobem na osiągnięcie tego - możliwość rozwijania umiejętności programowania, które można zastosować we wszystkich językach - jest kontynuowanie nauki języków i utrzymanie elastyczności tego mentalnego języka programowania, a nie powiązania go z jednym językiem.
(Przepraszam ChaosPandion za ciężkie pożyczenie od pomysłu, który przedstawił ).
źródło
Wybierz język i zacznij pisać. Python jest dobrym wyborem dla początkujących. Dostępne są samouczki online , dzięki którym można nauczyć się, jak robić to poprawnie.
Wszystko z tego wynika. Twoje zainteresowania doprowadzą cię do ram i koncepcji projektowych, które dodadzą wyrafinowania twoim programom. Dowiesz się, że istnieją kursy online, które pozwolą ci ugruntować podstawy i teorię oraz że istnieją różne paradygmaty programowania, które możesz eksplorować i tak dalej.
I tak, odkryjesz języki takie jak Haskell, które nauczą cię czegoś nowego, gdy tylko będziesz mieć solidne podstawy w podstawach.
Niektórzy programiści prawdopodobnie sądzą, że wszystkie języki są takie same, ponieważ nie były narażone na żadne, które powodują, że myślą inaczej. Wszystkie najczęściej używane języki pochodzą z Algolu (są to głównie języki proceduralne), a spośród nich większość to języki nawiasów klamrowych podobne do C. Wszystkie z nich robią zasadniczo te same rzeczy, choć niektóre z nich są bardziej wyrafinowane niż inne.
źródło
Programowanie polega na rozwiązywaniu problemów w taki sposób, że rozwiązanie można wyrazić w tak ograniczonej gramatyce, że można je wdrożyć za pomocą języka programowania. Sztuka programowania jest zatem sztuką rozwiązywania problemów.
Niektóre języki zapraszają inne paradygmaty programowania, takie jak orientacja obiektowa, sterowana zdarzeniami, wielowątkowa i oparta na frameworku MVC. Są to tylko modele i wzorce i nie mają tak naprawdę nic wspólnego z implementacją.
Jeśli potrafisz usiąść i rozwiązać problem na papierze w taki sposób, że można go łatwo przetłumaczyć na kod i jest powiązany z odpowiednim modelem dla twojej platformy, to jesteś programistą. Jeśli wszystko, co możesz zrobić, weź te rozwiązania i zaimplementuj je w naszym wybranym języku, to inna sprawa.
Programuję od 30 lat (OMFG!) I nadal używam
php.net
do wyszukiwania poleceń w PHP, ponieważ to nie jest mój pierwszy język.Powiedziałbym, że znajomość języków jest odwrotnie proporcjonalna do tego, jak często patrzysz na instrukcję obsługi lub przepełnienie stosu. Specjalizacja w programowaniu polega na tym, jak łatwo rozwiązywać problemy w sposób zgodny z językami programowania komputerowego.
W powiązanych wiadomościach nauczyłem się Ruby w zeszłym tygodniu. Chociaż nie jestem „ekspertem”, mogę rozwiązać problem, który mógłbym napisać w Perlu, powiedzmy, a potem spędzić wiek tłumacząc go na Ruby, podczas gdy ja się go więcej uczę.
źródło
Myślę, że podobnie jak w przypadku wszystkiego, praktyka czyni mistrza. Po prostu nie daj się zaszufladkować, aby zawsze robić to samo lub zawsze używać tego samego języka, i kontynuuj naukę każdego projektu.
Myślę, że możesz łatwo narysować analogię do czegoś takiego jak nauka gry na gitarze. Każdy dobry muzyk może nauczyć się grać nową piosenkę w bardzo krótkim czasie, ponieważ zna już wszystkie akordy i całą teorię, dlaczego akordy są odtwarzane tak, jak są. Jak oni to robią? Po prostu zagrali tyle piosenek, że wszystkie wzorce połączyły się ze sobą, a jednocześnie uzupełnili swoją wiedzę faktyczną udokumentowaną teorią, że te wzorce też się zgadzają.
Może więc możesz bardzo dobrze odtworzyć kilka utworów, ale nie możesz szybko odbiegać od innych ani wybierać nowych. Prawdopodobnie jest to odpowiednik programisty .NET, który ciągle tworzy tę samą aplikację CRUD , w pewnym momencie wypróbowuje coś nowego, dodaje niektóre wywołania usługi internetowej lub zaawansowany interfejs użytkownika, lub pisze to w zupełnie nowym języku. Kiedy rzucisz okiem na to, dlaczego rzeczy dzieją się w ten sposób, zadawaj pytania na Stack Exchange itp. W końcu zobaczysz wszystkie wzorce, które nieustannie się pojawiają i znasz niektóre z podstawowych teorii i nauka nowego języka nie będzie wydają się być równie zniechęcające.
źródło
Nie zamierzam mówić o tym, ile czasu zajmuje nauka języka ani co to znaczy uczyć się języka. Zamiast tego zajmę się twoim faktycznym problemem: jak ustalić, czy nauczyłeś się programowania, czy nauczyłeś się języka programowania .
Nauczyłeś się programować, jeśli nauczyłeś się rozkładać problem na odrębne procesy, a następnie używać tych procesów do rozwiązania problemu. Nauczyłeś się języka programowania, jeśli nauczyłeś się składni języka i wiesz, jak dostosować sposób działania procesu, gdy jest on implementowany w tym języku.
Nie oznacza to, że powinieneś programować w Fortan, gdy używasz Lisp, lub dodawać wartości kolumny w tabeli w db za pomocą kursora. Tyle, że język jest szczegółem implementacji. Taki, który może zmienić potrzebne procesy, ale nie musi identyfikować i tworzyć procesów - w końcu istnieje implementacja w świecie rzeczywistym, z wejściami / wyjściami i pożądanymi rezultatami.
źródło
Moją strategią zawsze było koncentrowanie się na czystych umiejętnościach, a nie na konkretnych umiejętnościach.
Zamiast uczyć się specjalnej składni Pythona (lub dowolnego języka) do wszystkiego, co chcesz robić, poświęć swoje cykle mózgowe na rozwiązywanie abstrakcyjnych problemów, na przykład jak najlepiej rozwiązać każdy problem w tej kategorii.
W ten sposób będziesz wiedział, co robić bez względu na język, i będziesz w większości posiadał ponadczasowe umiejętności, które można wykorzystać do programowania w dowolnym języku.
W szczególności unikaj narzędzi pełnych gotchas, takich jak MySQL lub opiniotwórcze języki, takie jak Java, ponieważ wszystko, czego nauczysz się za pomocą tych narzędzi, będzie miało dużą część wiedzy na temat konkretnych narzędzi, która z pewnością szybko stanie się bezużyteczna.
W przeciwieństwie do tego, co powiedziano w wielu odpowiedziach, NIE słuchaj innych programistów, jesteś noobem i nie ma sposobu, aby odróżnić fałszywkę od prawdziwej oferty, więc lepiej zabrać wszystko łyżką soli.
Chcesz cały czas zadawać pytania i akceptować tylko wtedy, gdy rozwiązanie jest szybkie, eleganckie i niezawodne.
źródło
Istnieje podejście teoretyczne. Dowiedz się, jak faktycznie działają komputery pod przykryciem. W jaki sposób podstawowe instrukcje procesora są ze sobą powiązane, aby uczynić bardziej złożone operacje i struktury, które przyjmujemy za pewnik w obszarach programowania na wysokim poziomie.
Następnie jest bardziej praktyczne podejście do programowania. Główną kwestią sporną, którą dręczą ludzie zwykle określani jako „nie dobrzy programiści”, jest to, że naprawdę znają tylko jeden język. I nawet jeśli znają innych, programują w nich w taki sam sposób, jak w języku ojczystym . To cykl, który trzeba przerwać, jeśli naprawdę chcą nauczyć się programować. Domyślną odpowiedzią jest nauczenie się co najmniej jednego języka z każdego paradygmatu programowania. Naucz się więc języka OOP, języka funkcjonalnego, języka skryptowego ... itd. A przez naukę nie mam na myśli uczenia się składni . Uczysz się języka, używając go do stworzenia czegoś.
Osobiście, gdy chcę nauczyć się nowego języka, korzystam z łamigłówek Project Euler . Idę do układanki, którą już rozwiązałem w języku OOP (jako przykład) i próbuję rozwiązać ją za pomocą funkcjonalnego, próbując postępować zgodnie z najlepszymi praktykami nowego języka. Kiedy rozwiązujesz ten sam problem za pomocą dwóch zasadniczo różnych podejść, nie tylko widzisz rzeczywiste różnice, ale także pokazuje, gdzie są wspólne obszary. Te wspólne obszary, które są wspólne dla wszystkich języków, to prawdziwe programowanie , różnice to tylko inne sposoby na osiągnięcie tego.
źródło
Cóż, większość rzeczy, które chciałem powiedzieć, zostały już powiedziane. Chciałbym dodać bardzo prostą analogię.
Jeśli języki programowania są uważane za zwykłe narzędzia, nawet wtedy absolutnie nie ma logiki, że bycie dobrym w jednym sprawia, że bycie dobrym w drugim staje się bułką z masłem.
Języki często nie są trudne do nauczenia się, ale potrzeba cierpliwości i ćwiczeń, aby być w tym dobrym. Ponadto nie ma właściwego sposobu na naukę programowania.
Oto kilka rzeczy, które możesz chcieć robić podczas nauki języka.
Poznawaj nowe języki, odkrywaj nowe biblioteki, ucz się nowych sztuczek w wolnym czasie. Zanim się zorientujesz, zaskoczysz się swoimi umiejętnościami.
źródło
W moim przypadku uczę się, jak programować w następujący sposób:
Ponadto, jak wspomnieli komentatorzy, nie zapomnij także opanować swoich narzędzi. Nauka wszystkich najlepszych praktyk i najlepszych teorii jest zupełnie pusta lub będzie źle wdrożona, jeśli nie wiesz wystarczająco dużo o swoim narzędziu, w tym przypadku języku programowania.
źródło
Myślę, że jeśli potrafisz myśleć analitycznie, masz dobry początek.
Naucz się dowolnego języka i przećwicz serię przykładów, np. Tak jak w prawie każdej książce, która uczy programowania.
Następnie spróbuj rozwiązać własne problemy. Spróbuj znaleźć różne rozwiązania i porównaj je. Szybkość i zużycie pamięci są często używanymi czynnikami, które mają znaczenie. Omów swoje rozwiązania z innymi programistami.
Przeczytaj kod innych programistów i spróbuj zrozumieć, dlaczego w ten sposób rozwiązali problem.
Powinieneś również przeczytać kilka książek o algorytmach, aby uzyskać przegląd standardowych metod. Nowe problemy są często modyfikacjami starych problemów.
Dużo praktyki i pracy z kodem również w zespołach pomoże Ci krok po kroku podnieść swoje umiejętności.
Mam nadzieję, że moja opinia odpowiada na co najmniej częściowe pytanie.
źródło