Rozmawiałem kiedyś z jednym z moich nauczycieli.
Dyskutowaliśmy o wpływie prostszych języków skryptowych (takich jak Python lub Ruby) na młodszych programistów.
Twierdził, że języki skryptowe wywołują niechlujne techniki kodowania, ponieważ początkujący nie rozumieją, co się dzieje „pod maską”. Przytoczył także inne przykłady tego, jak języki skryptowe często powodują, że programiści zaniedbują obawy dotyczące wydajności, zarządzania pamięcią, złożoności operacyjnej itp.
Argumentowałem, że języki niższego poziomu mogą być dla niektórych za dużo i mogą się poddać, zanim rozwiną pasję do programowania. Kiedy zacząłem uczyć się pierwszego języka programowania (C), zacząłem korzystać ze wskazówek i poddałem się, ponieważ koncepcje były zbyt trudne (na swoją obronę miałem zaledwie 14 lat). Gdyby nie Java, nie zostałbym programistą! Gdybym zaczął od prostszego języka, a potem kopał głęboko, wydaje mi się, że nie poddałbym się i nauczyłbym tak samo, jak zaczynałem od C.
Klasa zakończyła się, zanim obie strony zostały w pełni zbadane.
Do tego momentu głosiłem, że początkujący powinni zacząć od języków skryptowych, a następnie kopać głęboko; ale po tej dyskusji zacząłem się zastanawiać, czy to błędne myślenie.
Jaki wpływ mają języki skryptowe na młodszych programistów?
Odpowiedzi:
Nie zgadzam się. Po pierwsze, języki skryptowe mają wyższy poziom abstrakcji i nie ma w tym nic złego. Na początku próbuje się nauczyć zasad. Właściwie powiedziałbym, że wybór języka niższego poziomu może zachęcać do złego kodowania, ponieważ trzeba zrozumieć kilka szczegółów, zanim będzie można je zrozumieć. Zamiast prostszego języka można zacząć pisać czysty i zwięzły kod od samego początku.
Po drugie, trzeba się wiele nauczyć w tych językach. Jeśli chodzi o naukę języka, powiedziałbym, że C jest łatwiejszy niż Python. Trzeba radzić sobie ze wskaźnikami lub dbać o łańcuchy, ale w Pythonie jest wiele innych pojęć. Rozumienie, orientacja obiektu, odbicie, metody magiczne, pierwszorzędne funkcje, lambdy, iteratory i generatory, metaklasy: wszystko to jest częścią języka.
Myślę, że począwszy od Pythona pozwala dowiedzieć się znacznie więcej o programowaniu i łagodniejszej krzywej uczenia się. Język niższego poziomu może mieć mniej abstrakcji - więc mniej ogólnych pojęć do nauki - i przytłoczyć początkujących szczegółami, bez których może chcieć się obejść.
źródło
Nie ma znaczenia od czego zaczniesz. Ma znaczenie, gdzie idziesz po uruchomieniu.
BASIC może nie jest najbardziej eleganckim językiem na świecie, ale obejmuje podstawy programowania proceduralnego i to wystarczy, aby zacząć.
Zacząłem od BASIC. I nie zatrzymać się tam.
źródło
Twój nauczyciel ma rację, tyle że zakłada, że jego konsekwencje są złe.
Jeśli patrzysz na naukę języków jako działalność czysto akademicką, aby dowiedzieć się, jak działają komputery, to ma rację. Jeśli spojrzysz na nie jako sposób na załatwienie sprawy, masz rację.
źródło
Myślę, że „język skryptowy” to okropne słowo, które jest bardzo nieaktualne lub w najlepszym wypadku pasuje do klasy języków specyficznych dla domeny. Twój nauczyciel po prostu dopasowuje wszystko, o czym wyraźnie nie ma wystarczającego zrozumienia, do osi zła.
Rozsądnym rozróżnieniem jest między językami wysokiego poziomu a językami niskiego poziomu lub między statycznymi i dynamicznymi typami języków, które są naprawdę ortogonalne.
Asembler jest dynamicznie typowany na niskim poziomie (jeśli mówienie o typach ma w ogóle sens), C jest statycznie typowany na niskim poziomie, Ruby jest dynamicznie typowany na wysokim poziomie, Haskell jest typowany na wysokim poziomie. Java nie jest statycznie typowana na wysokim, ani na niskim poziomie, C ++ jest statycznie typowana na wysokim i niskim poziomie. I tak dalej.
Dyskusja może dotyczyć tylko tego, które paradygmaty są bardziej odpowiednie dla programisty na poziomie podstawowym.
Jestem przekonany, że programowanie na niskim poziomie prawdopodobnie nie jest jednym. Być może kiedyś na początku lat 90. można było uzyskać interesujące wyniki w rozsądnym czasie.
Ale programowanie napędzane jest pasją. Namiętność karmi się nagrodami. Dlatego programiści na poziomie podstawowym powinni zacząć od narzędzi do wynagradzania. Narzędzia niskiego poziomu nie są już satysfakcjonujące, ponieważ istnieje ogromne morze narzędzi wysokiego poziomu, które zapewniają ten sam rezultat w ułamku czasu.
Ludzkie myślenie jest abstrakcyjne. Kiedy uczymy się rozumieć świat, robimy to poprzez bardzo gruboziarniste abstrakcje i w miarę potrzeb wchodzimy w szczegóły.
Aby dziecko zrozumiało swoje otoczenie, nie nauczysz go matematyki, fizyki, chemii, biologii, historii, socjologii i filozofii. Dajesz mu bardzo prosty model świata, z którym sobie poradzisz, i sam z siebie długo będzie chciał go przekroczyć, bez końca zadając ci pytania, gdy jesteś młody, a później całkowicie negując swój autorytet.
Tak myślimy. Ludzki mózg może przetwarzać jedynie ograniczone ilości „jednostek” informacji, ale stopień abstrakcyjności nie ma większego znaczenia przy kwantyzacji informacji. Na przykład: odczytanie wyrażenia „34 * 75” jest dla nas prostsze niż jego obliczenie, podczas gdy w przypadku komputerów jest odwrotnie. Rozpoznanie (a tym samym streszczenie) wiązki czarnych pikseli w krętą linię, którą następnie można rozpoznać (a tym samym po raz kolejny wyodrębnić) jako pojedynczą cyfrę, jest ogromnym nakładem pracy.
Moja babcia rozumie pomysł otwarcia pliku. Jednak nie ma zrozumienia poniżej tego poziomu. I szczerze mówiąc, gdyby musiała się tego nauczyć, najpierw badając wewnętrzne działanie sprzętu i systemu operacyjnego, a co nie, nigdy by się tam nie dostała.
Jest wielu ludzi, którzy nadmiernie komplikują rzeczy, ponieważ nigdy nie nauczyli się myśleć w kategoriach jasnych, zwięzłych, a tym samym eleganckich rozwiązań, ale spędzali zbyt dużo czasu na zadręczaniu się wymiennymi szczegółami niskiego poziomu i rozwiązywaniu problemów z nimi. Uczenie ludzi myślenia jak komputer jest najgorszym możliwym podejściem do programowania.
Wartość programowania polega na znalezieniu rozwiązania problemu. Wyrażanie go jako kodu jest bardziej nudnym, mechanicznym zadaniem i powinno być po prostu wykonane przy użyciu odpowiednich narzędzi.
Och, i nie martw się, że nie zrozumiałeś wskaźników. Miałem mniej więcej ten sam problem w tym samym wieku. Problemem jest także brak abstrakcji. Klasycznie dowiadujesz się o wskaźnikach z jakiejś książki C i gdy próbujesz je zrozumieć, idzie to w parze z alokacją pamięci, a więc z pamięcią stosu i sterty i tak dalej. Abstrakcyjną koncepcją wskaźników jest pośrednictwo. Zmienna, która przechowuje indeks w określonej tablicy, jest po prostu (w rzeczywistości jest taka sama w C, gdzie konkretna tablica jest twoją przestrzenią adresową) i do tego nie potrzebujesz arytmetyki wskaźnika.
Ma to jedynie zilustrować, że wybór wysokiego poziomu abstrakcji znacznie ułatwia zrozumienie.
EDYCJA: a jeśli chodzi o pisanie, wolę języki pisane statycznie. I myślę, że programiści na poziomie podstawowym powinni jasno zrozumieć pojęcie typów (które jest abstrakcyjne).
źródło
W Pythonie nie ma nic prostego. Spójrz na Unicode i metaprogramowanie.
źródło
Widzę inny, znacznie głębszy problem.
Języki Unityped nie zmuszają do zwracania uwagi na typy, do myślenia w typach. Jest to dobre i dobre, o ile mam małe skrypty z niektórymi ciągami znaków i liczbami, które są konwertowane na siebie bez zauważania. Ale nadejdzie dzień, kiedy to się zepsuje. Nagle program się zepsuje, a każda szybka poprawka spowoduje jego ponowne uszkodzenie.
Lub początkujący programista zorientuje się, że będzie potrzebował tupę list zamiast listy krotek, ale nie będzie miał najmniejszego pojęcia „jak to zrobić” i będzie zadawał pytania na temat przepełnienia stosu, które pokazują, że jest to absolutna bezradność.
źródło
Nadal twierdzę, że formalne instrukcje i mentoring są znacznie ważniejsze niż wybór języka w jakości kodu dla początkujących. Jednak gdybym musiał wybrać pierwszy język dla początkujących, wybrałbym python dla programistów samouków i C ++ do nauczania na studiach.
Powodem są formalne instrukcje, które możesz rozpocząć od małych, trywialnych programów, aby stworzyć solidne podstawy teoretyczne na wiele lat, zanim będziesz musiał zrobić coś pożytecznego. Myślę, że kolejność jest idealna, jeśli możesz sobie pozwolić na czas, a C ++ zapewnia dużą pomoc w przypadku błędów kompilatora i błędów segmentacji między wykładami, aby poinformować cię, jeśli nie rozumiesz podstaw.
Niektóre z tych podstaw są po prostu bardzo trudne do nauczenia, jeśli jesteś samoukiem, dopóki nie zdobędziesz doświadczenia. Ponadto zazwyczaj musisz jak najszybciej uczynić coś użytecznym i możesz zdobyć teoretyczne podstawy w razie potrzeby, chociaż ryzykujesz, że nigdy nie nauczysz się więcej niż absolutne minimum przy takim podejściu. Dlatego w takim przypadku polecam język taki jak python.
źródło
Widzieliśmy to na odwrót na studiach i myślę, że jest to przydatne. * Zaczęliśmy na niskim poziomie. Wskaźniki, zarządzanie pamięcią, tablice znaków ... Tak, zaczęliśmy od C. To samo z algorytmami: najpierw zaimplementuj połączoną listę, tablicę skrótów, drzewo ... A dopiero potem użyj standardowych bibliotek.
Następnie przeszliśmy do bardziej zaawansowanych języków, takich jak Java, C # lub perl. Ale z korzyścią wiedząc, co dzieje się pod pasem.
Chociaż to działa, uważam, że przejście od języków skryptowych do języka niższego poziomu jest również w porządku. Znajomość języka wysokiego i niskiego poziomu zapewnia łatwość korzystania z języka wysokiego poziomu przy jednoczesnym zrozumieniu, co się dzieje. Kolejność ich uczenia się jest mniej ważna.
źródło
Języki skryptowe nie powodują, że programiści są niechlujni. Brak jasności w zrozumieniu problematycznej dziedziny (np. Firmy obsługiwanej przez program) jest przyczyną niechlujstwa.
Jak mówi stare powiedzenie: „Możesz pisać COBOL w dowolnym języku”. Chociaż podejrzewam, że gdy każdy typ danych wygląda tak samo , trudniej jest dostrzec, jakie są zasadnicze aspekty Twojego programu, co jest główną cechą COBOL- izacja.
źródło
Foo
lubBar
czy coś zupełnie innego, tak długo jak to możliwe.frobnicate()
, że tak czy inaczej. Bez wyraźnych interfejsów.Uważam, że języki skryptowe mają zachęcić technik niechlujstwa. (Zauważ, że nie oznacza to, że języki są złe , po prostu trudno jest utrzymywać duże bazy kodów w tych językach). Myślę jednak, że z innych powodów niż inne odpowiedzi tutaj.
Myślę, że używając dowolnego języka programista musi posiadać podstawową wiedzę na temat programowania jako całości. Nigdzie nie będą skuteczne, jeśli nie zrozumieją takich pojęć, jak wektory, drzewa i tabele skrótów. Nie muszą koniecznie być w stanie wdrożyć tych rzeczy, ale muszą znać ich cechy.
Myślę, że w grę wchodzi niechlujność, ale nie umiejętność programowania, ale kiedy trzeba stworzyć komponenty do ponownego użycia. Języki te nie wymagają definiowania dobrych interfejsów między jednostkami kodu lub mechanizmów wymuszających na bibliotekach ograniczenia na swoich klientach. Nie jest niemożliwe tworzenie dobrych komponentów do ponownego użycia w takich językach, jest to po prostu znacznie trudniejsze.
Języki skryptowe przemawiają do początkującego programisty, ponieważ pozwalają im wykonywać więcej „jednorazowych” czynności w krótszym czasie, ale kiedy ci sami programiści zaczynają programować konserwację, często szybko mają problemy z tymi językami.
Nie twierdzę, że języki skryptowe są złe - wręcz przeciwnie. Ale utrudniają utrzymanie ogromnych (kilku milionów linii) baz kodowych (co jest jednym z powodów, dla których nie widzisz takich baz kodowych w językach skryptowych). Kiedy potrzebujesz stosunkowo niewielkich lub jednorazowych rozwiązań, pozwalają one osiągnąć znacznie więcej w krótszym czasie i mniej kodu (a mniej kodu jest prawie zawsze lepsze).
Pamiętaj tylko, że żadne narzędzie nie jest najlepsze do każdej pracy. Wybierz narzędzie najbardziej odpowiednie do sytuacji. Dotyczy to języków programowania, tak jak w przypadku każdego narzędzia.
źródło
Jestem z twoim nauczycielem, ale także z @Singletoned, kiedy mówi, że twój nauczyciel przyjmuje konsekwencje (np. Brak wiedzy o wydajności) są złe.
Myślę, że rozpoczęcie od C jest lepsze niż rozpoczęcie od języków skryptowych. Jako nauczyciel skoncentrowałbym się na tej całej architekturze von Neumanna (ALU, rejestry, pamięć, porty I / O, ...), przechodząc od razu do wskaźników (przepraszam, to naprawdę kluczowa koncepcja [nie wypuszczanie referencje (tj. wskaźniki) w językach VM są głównym źródłem wycieków pamięci]), uderzają w niektóre struktury danych (drzewo, lista połączona, tablica skrótów 1 ), a następnie ... podnoszą poziom abstrakcji do czegoś innego (OO, programowanie funkcjonalne, coś - silne zasady pisania statycznego , yo \ m /, więc nie ma "języków skryptowych"> :().
1 Hmm, może w końcu zgadzam się z nauczycielem w kwestii wydajności.
źródło
Myślę, że najlepiej zacząć od języka modułowego, a następnie przejść do bardziej skomplikowanych rzeczy. W moich czasach zaczęliśmy od Pascala i COBOL-a i próbowaliśmy zrozumieć, co oznaczają podprogramy, zmienne sterujące przepływem itp. Dopiero po zapoznaniu się z Pascalem miałem nawet ochotę przejść na języki takie jak C / C ++ i nauczyć się wszystkich innych technik, które są raczej dodatkiem do młodszego programisty.
źródło
Oboje macie rację.
Języki skryptowe zdecydowanie utrudniają początkującym programistom zrozumienie, co naprawdę się dzieje. (Podobnie jak bazy danych, frameworki i biblioteki. Och, a także przeglądarki, serwery, sieci i systemy plików.) Kiedy przeprowadzam wywiady z młodszymi programistami, często jestem oszołomiony, jak mało wiedzą o tym, jak naprawdę działają komputery i jak bardzo są podatni na ładunki -kulturowe programowanie.
Z drugiej strony, najważniejsza rzecz, której szukam w wywiadach, nie jest doskonałym zrozumieniem, to, że uwielbiają tworzyć. Kiedy zaczynałem, komputer robiąc cokolwiek robił wrażenie, więc moje małe Apple Basic i asembler 6502 wydawały mi się naprawdę niesamowite. Ale w dzisiejszych czasach komputery robią wiele niesamowitych rzeczy, więc myślę, że ludzie mogą zaczynać na dość wysokim poziomie, jeśli to jest to, czego potrzebują, aby się uzależnić.
Zasadniczo myślę, że można zacząć od płytkiego końca basenu, o ile w końcu uda ci się znaleźć głębsze wody.
źródło
Po pierwsze, zdecydowanie zaczynam od języka o wyższym poziomie abstrakcji. Obecnie polecam Python. Najważniejszym powodem wyboru języka skryptowego jako pierwszego języka jest to, że można łatwo połączyć coś, co działa. Jak Joe wspomina w swoim pytaniu, najważniejszą rzeczą podczas zostania programistą jest to, że masz motywację, aby iść dalej i kopać głębiej. Motywację tę uzyskuje się, gdy można tworzyć działające i użyteczne oprogramowanie.
Oprócz kwestii związanych ze zrozumieniem abstrakcji (wysoki poziom) i zrozumieniem podstawowej implementacji (niski poziom) brakuje trzeciego punktu. Aby być dobrym programistą w dzisiejszych czasach, z pewnością musisz opanować oba powyższe punkty. Ponadto dla Twojej kompetencji niezwykle ważne jest, aby stale patrzeć na nowe technologie i punkty widzenia. Bez względu na to, od którego poziomu abstrakcji zaczynasz, musisz stale doskonalić się i kwestionować swoje obecne metody.
Od samego początku należy wyjaśnić, że języki programowania są jedynie narzędziami do wykonania zadania. Bardzo ważne jest, aby wybrać odpowiednie narzędzie do konkretnego zadania. Myślę, że dla początkującego programisty język skryptowy wysokiego poziomu pomoże w podkreśleniu tego punktu. Język wyższego poziomu da szerszą perspektywę i zmotywuje programistę do głębszego zagłębiania się.
źródło