Jako edukator CS na poziomie uniwersyteckim często pojawia się kwestia, którego języka programowania uczyć w pierwszym kursie programowania. Do wyboru są tysiące języków i wiele gorączek religijnych (lub gorączek) wspierających jeden obóz językowy nad drugim. Wszystkie te subiektywne uprzedzenia dotyczące każdego języka programowania bardzo utrudniają nauczycielowi wybór jednego z nich.
Moje pytanie brzmi:
Jakie obiektywne kryteria może zastosować nauczyciel, aby wybrać język programowania, który będzie używany jako podstawa pierwszego roku programowania uniwersyteckiego? Jakie są podstawy tych kryteriów?
Uwaga : nie chcę widzieć listy języków programowania i powodów, dla których są one najlepsze w użyciu. Pytanie nie dotyczy najlepszego języka, dotyczy kryteriów wyboru języka . Odpowiedzi mogą jednak polegać na użyciu języków programowania w celu zilustrowania poszczególnych punktów.
To pytanie zostało zainspirowane innym pytaniem, które uznano za nie na temat: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .
źródło
SML
po prostu dlatego, że jest mało prawdopodobne, aby jakikolwiek uczeń znał ten język wcześniej. To zrównoważyło każdego ucznia mniej więcej na tym samym poziomie, aby rozpocząć kurs.Odpowiedzi:
Wrzucę własne dwa centy, chociaż uważam, że ten temat jest bezdenną przepaścią. Nie zrozumcie mnie źle, myślę, że to fascynujące pytanie, ale prawdopodobnie nie jednego z nich rozwiążemy tutaj dla zadowolenia wszystkich.
Krótko mówiąc, powiedziałbym, że język powinien robić to, co chcesz , w prosty i jednoznaczny sposób, jak to możliwe, i nie więcej .
Moje własne doświadczenie pochodzi z nauczania kilku pokoleń studentów pierwszego i drugiego roku w języku programowania Oberon . Ludzie znający ten język rozpoznają jego wpływ w moich opiniach. Zauważ, że ten język był używany do nauczania „Algorytmów i struktur danych”. W tym czasie (wtedy) programowanie funkcjonalne i projektowanie obiektowe były nauczane na oddzielnych kursach od drugiego roku.
Ważne : Zanim jednak przejdę do specyfiki każdego języka, chciałbym podkreślić, że najważniejsze jest, aby być absolutnie jasnym, dla siebie i swoich uczniów, co do celów twojego kursu. Czy nauczanie programowania per se ? A może algorytmy i struktury danych? Czy inżynieria oprogramowania? Przed wybraniem języka warto zastanowić się, dokąd zmierzasz. Różnice na tym poziomie (cele) są, co moim zdaniem, prawdopodobnie prowadzi do większości nieporozumień na ten temat.
Punkty, które uważam za ważne, mogą pokrywać się z kilkoma już powiedzonymi rzeczami, ale uważam, że większość z nich to podzbiory jednej z następujących czterech:
Prostota : Studenci zwykle uczą się programowania, algorytmów i struktur danych, a nie cech i zawiłości jakiegokolwiek konkretnego języka programowania. Wirth zastosował cytat Einsteina „Uprość to tak prosto, jak to możliwe, ale nie prostsze” jako naczelną zasadę w projektowaniu Oberona, a istnieje kilka innych języków, które robią to równie dobrze. Twój wybrany język programowania powinien być w stanie wdrożyć wszystkie koncepcje wymagane na wykładzie, ale powinien to zrobić z możliwie najmniejszym zestawem funkcji / szczegółów. Język programowania jest zwykle tylko narzędziem, a nie celem.
Jednoznaczność : bliskie rodzeństwo prostoty, powinien być jeden konstrukt dla każdej koncepcji, przy jak najmniejszym nakładaniu się, jak to możliwe. Pomyśl o tym, jako że istnieje tylko jeden „właściwy” sposób wdrożenia każdej koncepcji. Trzy różne rodzaje pętli, które semantycznie wszystkie robią to samo? Lub piętnaście różnych sposobów na zwiększenie zmiennej? Niedobrze. To również sprawia, że sprostowanie lekcji lub po prostu ogólnie zrozumienie kodu swoich uczniów a dużo łatwiejsze. Twoi asystenci nauczyciela to docenią.
Przenośność : Uczniowie pójdą na zajęcia z maszynami z systemem Linux, Windows i OSX, a środowisko programowania powinno być możliwie podobne (identyczne) we wszystkich trzech. Wyniki każdego programu powinny być również identyczne. Jest to kolejny punkt, który docenią asystenci dydaktyczni odpowiedzialni za zaznaczanie pracy domowej i rozwiązywanie problemów / pytań.
Preferencje branżowe : Poważnie, powinniśmy zacząć się tym martwić tylko wtedy, gdy sam „Przemysł” kiedykolwiek decyduje, jaki język programowania najbardziej mu się podoba. Od czasu wynalezienia komputerów jest to ciągle zmieniający się cel. Na razie, jeśli twoi uczniowie naprawdę nauczą się programowania, to nie będzie to zależało od języka. Istnieją jednak pewne obszary, w których przemysłowi udaje się uzgodnić standard, np.
VHDL do projektowania obwodówlub SQL do zapytań do baz danych, więc jest to nadal ważny punkt.Ponownie, jak język pasuje do tej listy, jest silnie zależny od tego, czego chcesz uczyć!
źródło
WHILE expr DO stmts END
itp.Rozwijanie myślenia algorytmicznego w celu rozwiązywania problemów jako głównego celu: Jedną złą rzeczą w stosowaniu paradygmatu obiektowego w pierwszym kursie jest to, że wciągnięcie nowych uczniów w takie rzeczy jak dziedziczenie, polimorfizm itp., Odwraca ich uwagę od wyżej wspomnianego głównego celu. W rzeczywistości wprowadzenie jakichkolwiek drugorzędnych względów poza tym głównym celem, takich jak inżynieria oprogramowania, przenośność, użyteczność przemysłu itp., Przynosi efekt przeciwny do zamierzonego z podanego powodu.
Nie jest językiem zorientowanym obiektowo: obecnie większość uniwersytetów zaczyna nauczać programowania z użyciem języka zorientowanego obiektowo. Myślę, że to pomyłka. Są rzeczy na świecie, które można naprawdę zrozumieć tylko w przeciwieństwie do ich przeciwieństw. Nie narażając się na proceduralny paradygmat programowania (dane i funkcje jako dwa odrębne aspekty programu), wielu może zlekceważyć podstawową ideę orientacji obiektowej (dane i zachowanie postrzegane jako wewnętrznie powiązane). A ponieważ programowanie obiektowe jest tak ważne, pominięcie jego podstawowej idei nie jest małe. Poza tym, ponieważ najprawdopodobniej na bardziej zaawansowanych kursach studenci CS będą programować głównie w OO, muszą być również narażeni na proceduralną stronę rzeczy.
Na koniec wybrałbym język proceduralny, unikając zaawansowanych funkcji, koncentrując się na rozwijaniu myślenia algorytmicznego. Ale unikając zaawansowanych funkcji, nie mam na myśli unikania trudnych problemów. Chodzi mi o to, że nawet w przypadku trudnych problemów studenci powinni być zobowiązani do ich rozwiązania przy użyciu pierwszych zasad, prostych narzędzi.
źródło
public static void main()
w Javie, która musi znajdować się w kontekście niektórych klas. To sprawia, że Java nie jest idealna jako pierwszy język, choć oczywiście przeszkoda nie jest zbyt duża.public static void main()
na bardzo długi czas. BlueJ jest dobrym przykładem IDE, które pozwala uczniom pisać programy bez jednegomain
nigdzie w nim.Ponieważ mówimy o pierwszym kursie programistycznym w programie informatycznym, powiedziałbym, że najważniejszym aspektem byłoby to, jakie podstawowe pojęcia CS nauczy swoich uczniów. Ponieważ nie ma języka, który mógłby uczyć wszystkich pojęć naraz, należy zastanowić się, jakie pojęcia będą potrzebne w dalszej części.
Nie zgadzam się z poglądem @ Kaveha, że znaczenie branży jest ważne; może to być bonus, ale ma tutaj niewielkie znaczenie. Dzięki solidnemu fundamentowi zasad CS nauka języka „przemysłowego” na późniejszych kursach będzie stosunkowo łatwa.
Na marginesie, niezależnie od tego, który język zostanie wybrany jako pierwszy, ważne jest, aby jak najszybciej poddać uczniów innym, radykalnie innym językiem.
źródło
Moją główną troską jest uniwersalność w tym sensie, że nauka tego języka programowania powinna umożliwić studentowi obsługę większości języków programowania.
O ile żałuję, to kryterium wyklucza wyłącznie języki funkcjonalne. Dotyczy to również kursu, który nie powinien wykorzystywać egzotycznych cech języka.
... ale to tylko zdrowy rozsądek.
źródło
Wybierając pierwszy język programowania, należy wziąć pod uwagę wiele kwestii. Wiele z nich zostało rozważonych w powyższych odpowiedziach. Załączam jeszcze 3, ponieważ były one częścią mojej odpowiedzi na pytanie zamknięte ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ), które pierwotnie zainspirowały to pytanie . Skopiowałem tutaj swoją odpowiedź (i zmodyfikowałem ją) w oparciu o aktualną politykę usuwania zamkniętych pytań.
Oto 3 punkty do rozważenia na przykładzie kilku języków programowania.
Programowanie w dużym kontra programowanie w małym
Kiedy po raz pierwszy uczysz się programować, musisz nauczyć się programowania w małych , zanim przejdziesz do uczenia się mechanizmów pomagających programować w dużych .
Przez programowanie w małych, mam na myśli pisanie programów zawierających mniej niż 100 linii. Programy te będą wykorzystywać algorytmy, które manipulują prostymi strukturami danych, mają prosty przepływ sterowania i rozwiążą proste problemy. Zasadniczo nie będą one uważane za aplikacje .
Przez programowanie w dużej mierze mam na myśli pisanie dużych programów zbudowanych z wielu komponentów / klas, opartych na interfejsie API, z GUI, bazą danych, być może w konfiguracji klient-serwer.
Rzeczy, o których programista powinien pomyśleć, gdy programuje się w małych, są bardzo różne niż podczas programowania w dużych. Programowanie w dużym wymiarze wymaga od programisty myślenia o modułowości, dobrych interfejsach, dobrym projekcie, możliwości ponownego użycia i wielu innych kwestiach. Nowoczesne języki programowania zapewniają wiele konstrukcji, które pomagają programować w dużych. Te konstrukcje obejmują klasy, moduły, interfejsy, ukrywanie informacji itp. Podczas programowania w małych kwestiach te są znacznie mniej ważne.
Język programowania, taki jak C ++, ma wiele funkcji ułatwiających programowanie w dużych programach, ale trudniej jest usiąść i zacząć pisać bardzo prosty program. Java jest podobna.
Z drugiej strony język taki jak Python, Ruby, Scheme lub Haskell znacznie ułatwia bezpośrednie pisanie programu.
Wysoki poziom kontra niski poziom
Języki takie jak C ++ i C są językami niższego poziomu. Umożliwiają programiście bezpośrednie manipulowanie odwołaniami w pamięci. Chociaż pozwala to na napisanie bardzo wydajnego kodu, szczegóły na niskim poziomie mogą być trudne dla pierwszego programisty w nauce języka. Niektórzy twierdzą, że te szczegóły na niskim poziomie przeszkadzają w napisaniu logiki rozwiązania problemu.
Język wyższego poziomu, taki jak Python, ułatwia bardziej bezpośrednie wyrażanie pojęć w dziedzinie problematycznej.
Wpisany statycznie vs. Wpisany dynamicznie
C ++, Haskell, Java i wiele innych języków jest wpisywanych statycznie. Oznacza to, że kompilator automatycznie wyszukuje miejsca, w których występują potencjalne błędy, na podstawie oczekiwanych typów wartości w każdej lokalizacji w kodzie. Trwa wojna religijna o to, czy wpisywanie statyczne jest dobre, czy nie, ale uniknę tej. Jednym z problemów ze statycznym pisaniem dla nowych programistów jest to, że komunikaty o błędach zgłaszane przez kompilator są często trudne do zrozumienia. Dotyczy to w szczególności szablonów C ++ i ogólnie programów Haskell.
Python, Ruby i Scheme są dynamicznie pisane. Oznacza to, że błędy są wykrywane podczas działania programu. Można argumentować, że jest już za późno na wykrycie błędów (ale można też użyć testów, aby uniknąć takich błędów). Ponownie, unikając religijnego argumentu, zaletą tego rodzaju błędów, które napotyka się podczas pisania prostych programów w dynamicznie typowanym języku programowania, jest ten, że ten obiekt nie wie, jak wykonać tę operację . W kontekście małego programu błędy te są łatwe do zrozumienia i wyśledzenia.
Języki takie jak C mają słabe pisanie, co oznacza, że chociaż kompilator pomaga w niektórych błędach, w czasie wykonywania nie łapie innych, takich jak nieprawidłowe dostępy do pamięci. W rezultacie komunikat o błędzie zwracany do programisty jest podobny do „Program się zawiesił”. Język dynamicznie typowany przechwytuje te błędy i przekształca je w bardziej zrozumiały komunikat o błędzie.
Inne
W przypadku innych języków mogą być brane pod uwagę różne czynniki, takie jak wsparcie zapewniane przez środowisko programistyczne, dostępne interfejsy API, jakość książek i samouczków online itp.
źródło
Jako uwagę wprowadzającą rozważ możliwość przedstawienia więcej niż jednego języka (na jednym kursie). W pierwszym semestrze pokazaliśmy zarówno SML, jak i Javę. Kontrast miał swoją własną i ważną wiadomość: wybierz odpowiednie narzędzie do pracy.
Ale teraz kryteria, w dowolnej kolejności.
Trudności w nauce są kwestią subiektywną, ale ważne: nie chcesz, aby uczeń tracił czas na naukę języka, ale na robienie z nim rzeczy. Prawdopodobnie języki dynamiczne, takie jak Ruby, mogą wygrać na tym froncie: możesz je karmić wszystko, a w sieci są doskonałe „fałszywe” samouczki. Jeśli dobrze pamiętam, istnieją również badania, które pokazują, że uczniowie, którzy wcześniej nie programowali, osiągają lepsze wyniki w językach funkcjonalnych niż w innych.
Bogactwo : język (i) musi być wystarczająco bogaty dla wszystkich pojęć, których chcesz uczyć. Na przykład, jeśli chcesz omówić funkcje wyższego rzędu, potrzebujesz języka, w którym funkcje są wartościami, takiego jak języki funkcjonalne lub Scala.
Skalowalność : są szanse, że twoi uczniowie nie nauczą się więcej języków na własną rękę niż tych, którym im pokażesz. Dlatego chcesz, aby wybrane przez Ciebie języki były skalowane w trakcie ich nauki: muszą teraz pisać ćwiczenia dla Twojego zwierzaka, ale mogą także zaatakować później projekt średniej wielkości. Java i języki o podobnej ekosferze są tutaj dobrym wyborem.
Obsługa narzędzi : jest to związane ze skalowalnością. Jeśli oczekujesz / chcesz, aby twoi uczniowie byli produktywni w tym języku, to muszą istnieć dobre IDE, menedżerowie kompilacji i biblioteki. Interaktywne powłoki (Ruby, Scala) są również miłe, szczególnie na początek. Narzędzia muszą działać również na wszystkich głównych platformach.
Dokumentacja : Prawdopodobnie nie chcesz faktycznie uczyć języka, ale poproś uczniów, aby uczyli się z twoimi (abstrakcyjnymi) wskazówkami. Dlatego ważna jest dobra dokumentacja. Można argumentować, że im bardziej popularny i ustalony jest język, tym lepsza dokumentacja. Na przykład dokumentacja Scali jest dość słaba (ale się poprawia). Narzędzia takie jak Hoogle to plus.
Dostępność : w rzeczywistości są ludzie, którzy uczą przy użyciu Matlab lub Visual C ++. Weź pod uwagę, że nie każdy może mieć licencję lub maszynę, na której można uruchamiać niezbędne programy. Prawdopodobnie powinieneś faworyzować darmowe języki, które działają na różnych platformach.
Czystość : Prawdopodobnie chcesz kształtować sposób, w jaki myślą Twoi uczniowie. Im bardziej chaotyczny język, tym bardziej chaotyczny będą myśleć; Nigdy nie zaproponowałbym PHP na kursie. Dynamiczne języki mają tutaj wady: pozwalają, a czasem nawet promują, złe nawyki.
To, które kryteria są dla Ciebie ważniejsze niż inne, zależy również od tego, czego chcesz uczyć. Czy to dosłownie kurs programowania? Czy jest to kurs algorytmów i struktur danych? Czy to kurs, który wprowadza koncepcje języków programowania w różnych paradygmatach? Czy to jest kurs na temat tworzenia oprogramowania na dużą skalę?
źródło
For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala.
... lub C lub Pascal, które oba miały wskaźniki funkcji prawie na zawsze. Praktycznie jedynym (głównym nurtem) językiem, które to kryterium faktycznie wyłącza, jest Java.Fascynujące pytanie; Podoba mi się twój nacisk na obiektywne kryteria. Chcemy, aby pierwszoklasowcy nauczyli się:
koncepcje programowania : Pierwszy język programowania musi obsługiwać: wywołania funkcji, iterację, rekurencję
podstawowe idee : pierwszy język programowania musi obsługiwać tablice (pierwsze kroki w delikatnym wprowadzeniu do tego, jak naprawdę działa pamięć i jak działają wskaźniki)
praktyczne umiejętności programowania : jak korzystać z debuggera, jak korzystać z profilera, jak rozwiązywać duże problemy (język wysokiego poziomu), jak łączyć duże systemy, jak rozwiązywać problemy (rozkład problemów), jak unikać pisania skomplikowany kod, jak przekazać ludziom cel (często tajemniczej) serii wykonywalnych instrukcji.
fakt, że istnieją gotowe biblioteki dla takich rzeczy jak sort () i jak ich używać - tj. fakt, że nie trzeba pisać wszystkiego od zera.
Inne kryteria dla pierwszego języka :
interpretowane (szybka informacja zwrotna pomaga w procesie uczenia się).
interaktywne środowisko, które przyspiesza uczenie się, testowanie i debugowanie.
wysokiej jakości kod źródłowy jest dostępny dla studentów do czytania w tym języku
„łatwa do odczytania”, „składnia zbliżona do języka naturalnego” (aby ułatwić czytanie i ocenianie kodu źródłowego)
przenośny (działa na Mac OS, Windows, Unix). Co najmniej jedna implementacja języka w wolnym oprogramowaniu.
szybka w nauczaniu, „kilka gotchas” - na przykład: „Może być szybsze nauczenie początkujących Pythona, a potem Javy, niż Javy jako pierwszej OOPL”. - „Porównanie zorientowanych obiektowo języków programowania” i TelescopeRule
Matthias Felleisen opracował język programowania z komunikatami o błędach dostosowanymi do początkujących odbiorców. Podkreśla, że wybór konkretnego języka nie jest tak ważny, jak nauczanie dobrej metodologii projektowania. W rzeczywistości widzi pierwszy kurs CS jako zajęcia ze sztuk wyzwolonych, ucząc krytycznego myślenia, rozwiązywania problemów i dbałości o szczegóły.
kryteria drugiego języka programowania
Rzeczy, których chcemy, aby uczniowie się uczyli, ale być może to może poczekać na drugi język programowania:
„odpowiedni” język, który nie jest „zbyt ezoteryczny”; coś „popularnego w branży”
Teoria złożoności: jak rozpoznać zadania, które są niemożliwe przy obecnej technologii.
rzeczy na wyższym poziomie: jak wybrać odpowiednie narzędzie do pracy , jak korzystać z kompilatora, struktur, programowania obiektowego, programowania funkcjonalnego, programowania logiki, projektowania kompilatora, komponowania i manipulowania funkcjami (w sensie Lisp / ML), programowanie współbieżne i rozproszone,
rzeczy niskiego poziomu: arytmetyka wskaźników, architektura komputerowa. zarządzanie pamięcią, ramki stosu, programowanie montażu, architektura maszyny, sterowniki urządzeń i konstrukcja systemu operacyjnego (aby maszyna nie „wyglądała jak przerażająca czarna skrzynka, której nie mogą przeniknąć”)
EDYCJA: Jestem rozczarowany, że opublikowanie streszczenia czegoś, co napisałem we współpracy z wieloma innymi, „może nie być legalnym postem”.
Dodam więc bardziej formalny cytat do mojego poprzedniego nieformalnego linku, próbując zachować zgodność z dozwolonym użytkiem i innymi kwestiami praw autorskich wiki.
Ta odpowiedź jest streszczeniem Pierwszego Języka Freshmana (Anon 2011) w Portland Pattern Repository.
(Anon 2011) Wielu anonimowych i różnych innych autorów. „Pierwszy język Freshmans”. Repozytorium wzorców Portland. 27 września 2011 r . Http://c2.com/cgi/wiki?FreshmansFirstLanguage .
źródło
Myślę, że prostota i łatwość uczenia się jest jednym z głównych kryteriów. We wprowadzającym kursie na temat programowania chcielibyśmy uniknąć niepotrzebnych przeszkód programistycznych i skupić się w jak największym stopniu na zasadach programowania i algorytmicznym rozwiązywaniu problemów. Studenci pierwszego roku często nie mają zdolności algorytmicznego myślenia o problemach, więc kurs dotyczy również nauczania myślenia algorytmicznego.
Kolejnym kryterium jest przydatność języka w branży. Nie chcielibyśmy uczyć języka nieprzydatnego w branży. Zdecydowana większość studentów będzie pracować w branży, więc należy mieć oko na to, co jest wykorzystywane (i będzie wykorzystywane, gdy studenci ukończą szkołę) w branży.
Trzecim kryterium byłyby kursy, które uczniowie zamierzają wziąć w późniejszych latach. Kursy, w szczególności wymagane kursy, nie są projektowane same z siebie, ale w koordynacji z innymi kursami.
Ostatni, o którym teraz myślę, jest taki sam jak odpowiedź jmada, język powinien zapewniać łatwość uczenia się innych ważnych języków. Powinien być wystarczająco bogaty, a wybieranie późniejszych ważnych języków byłoby łatwe (tutaj ważne środki ważne z perspektywy studentów).
Myślę, że wiele uniwersytetów przeniosło swoje główne wprowadzenie do programowania z Java / C ++ / C na Python, chociaż od czasu do czasu mogą oferować wprowadzenie do programowania w innych językach (często dla kierunków nie-informatycznych, np. Dla kierunków elektrotechnika) choć mogą wykazywać elastyczność, jeśli instruktor chce od czasu do czasu eksperymentować z nauczaniem innego języka.
źródło
Tak więc natychmiast zrezygnuję z mojej gwałtownej reakcji na kolana, czyli wszyscy powinni nauczyć się programowania przez SICP, ponieważ Lisp jest właściwą rzeczą.
Było już wiele dobrych kryteriów wyboru języka ... prostota i przenośność należą do najważniejszych. Uważam jednak, że ważne jest, aby studenci, którzy dopiero zaczynają programować, nie zrozumieli źle (lub nie mieli pojęcia) o tym, co dzieje się za kulisami z nowoczesnymi językami.
Chociaż niektóre z tych innych postów oferują doskonałe kryteria, chciałbym użyć konkretnego języka, aby zilustrować, jak wygląda „spełnienie kryteriów”.
Niektóre z tych problemów zostały rozwiązane (znacznie lepiej niż mogłem próbować) w blogu Joela Spolsky'ego , The Perils of JavaSchools . Wybór języków takich jak Java czy Python zamyka dwie z trudniejszych (i najbardziej istotnych) pojęć w CS; mianowicie wskaźniki i rekurencja.
Oczywiście nauczanie kursu wprowadzającego w języku C będzie niezwykle gęste, prawdopodobnie nie będzie też zawierało wielu ważnych pojęć związanych z rekurencją. Podobnie, kurs uczy się w Lisp będzie musiał wskaźników adres pod osłonami, jak
car
icdr
sugerować ważnych pojęć związanych z połączonych listach, natomiast pozwalając szczegóły rączkę języku.Zasadniczo chodzi mi o to, że uczniowie muszą zrozumieć podstawy struktur danych i algorytmów, a także praktyczne wdrożenie.
Nie zgadzam się również z sugestią, aby nie używać języka obiektowego. Myślę, że użyteczność języków zorientowanych obiektowo do modelowania świata rzeczywistego jest pozytywnym atutem dla nowych programistów, pod warunkiem, że niedopasowanie impedancji zostanie wyjaśnione, a języki zorientowane obiektowo są jednym paradygmatem wśród wielu.
Sugerowałbym, że Ruby (zasugerowana również jako możliwość przez inny post) jest przykładem wielu cech, których należy szukać w języku używanym do wprowadzenia do kursu programowania.
Wyjaśnię to twierdzenie chwilowo, ale najpierw chcę skomentować jeden trend, który mnie niepokoi na wstępnych kursach CS. Pracuję na uniwersytecie, który, podobnie jak wiele szkół, niedawno przeszedł na używanie Pythona do prowadzenia kursów wprowadzających. Mocno wierzę, że Python jest nowym językiem BASIC, a językiem jest tendencja do wybierania przyjaznej nowości nad mocą i ekspresją, jak ostatnio argumentowałem w innym miejscu . To szkoda i musimy pomyśleć o programistach, którymi się staną, a nie o nowicjuszach, którymi są w tej chwili.
W każdym razie, uzasadniając Ruby jako język wprowadzający ...
malloc()
, ucząc ich, jak rozszerzać język w C.W każdym razie nic nie zastąpi nauki wielu języków z wielu paradygmatów, niezależnie od tego, czy posługujesz się nimi profesjonalnie, czy nie. Zasadniczo myślę, że każdy powinien zrozumieć , jeśli nie używać , C i Lisp. Ruby to najlepszy kompromis, jaki mogę wymyślić na semestr wprowadzający.
W każdym razie ... to moje 0,02 USD. Nie próbuję cię przekonywać, żebyś używał Ruby, pamiętaj, że ... po prostu używam go jako przykładu cech, których należy szukać w języku do prowadzenia kursu wprowadzającego.
źródło
Moim pierwszym językiem programowania był język montażu zabawek. Drugim był Fortran. W międzyczasie nauczyłem się zapisu „algorytmów”, którym był z grubsza Algol 60. Okazało się, że jest całkiem w porządku. W rzeczywistości uważam, że to, czego mnie nauczono, było prawie idealne.
Kiedy po raz pierwszy spojrzałem na programowanie funkcjonalne, w pracach naukowych, choć nie w zaimplementowanym języku, powiedziałem „wow, to jest zupełnie inne. Jest całkiem matematyczne!” Większość osób, które uczą się programowania funkcjonalnego, nadal ma takie same doświadczenia „wow”. Myślę, że to świetnie.
Myślę, że programowanie imperatywne i programowanie funkcjonalne to dwa zupełnie różne sposoby patrzenia na świat. Oddelegowalibyśmy naszym uczniom, gdyby okradli ich z tego różnorodnego doświadczenia.
Najlepszym pierwszym językiem programowania powinno być coś tak prostego, jak to możliwe i tak jasne, jak to możliwe, aby uczniowie mogli skupić się na tym, jak myśleć jasno. Niestety, prostota i przejrzystość montażu, Fortran i Algol 60 nie mają sobie równych w większości współczesnych języków programowania. Haskell jest dobrym wyjątkiem. Ale Haskell stworzyłby mój idealny drugi język programowania, a nie pierwszy. Może Eiffel lub Oberon pasowałyby do tego.
źródło
W The North Carolina School of Science and Mathematics wprowadziliśmy uczniów do Python od 2004 roku. Używamy go do nauczania programowania proceduralnego, ponieważ uważamy, że umiejętność pisania krótkich, poprawnych procedur jest niezbędna do późniejszego rozwijania cięższych narzędzi, w tym OO programowanie.
Lubimy to z tych powodów.
Python nie jest językiem dowolnego formatu. Zmusza studentów do pisania kodu w blokach za pomocą wcięcia. (Jako uwagę techniczną używamy edytora tekstu vim i umieszczamy [
set tabstop=4 set et
] w .vimrc, aby wyeliminować irytujące problemy i aby wcięcia kodu były zauważalne, ale nie powodowały brzydkiego nadmiernego dryfu w poziomie). Nasi uczniowie przyzwyczają się do hierarchicznej struktury programów ograniczonych białymi znakami. W rezultacie ich nawyki dotyczące formatowania wydają się być bardzo dobre, ponieważ programują w innych językach.Prostota syntaktyczna Pythona sprawia, że jest przyjazny dla początkujących. Proste programy można pisać z minimalną ilością tajemnych słów kluczowych i magicznych zaklęć. Chcemy, aby spróbowali tego uczniowie, którzy zwykle nie myślą o programowaniu. Zwróć uwagę na cudowną prostotę Pythona
hello.py
; jasne jest, co się dzieje.Python jest dynamicznie pisany i kaczych. Ułatwia to wprowadzanie zmiennych. Mówię moim uczniom, że zmienne to tylko etykiety. Wskazują na przedmioty. Wysyłasz wiadomość do obiektu przy użyciu nazwy zmiennej, podobnie jak ktoś wysyła wiadomość do ciebie dzwoniąc przez telefon.
Python to narzędzie, którego ambitni studenci nie wyrosną. Ma wyrafinowane biblioteki, które zawierają wiele przydatnych rzeczy. Jest to potężne narzędzie kreatywne, które jest dostępne dla początkujących.
Python jest darmowy i działa na wszystkich głównych platformach. Nasza szkoła jest heterogenicznym środowiskiem systemu operacyjnego z różnego rodzaju maszynami. Nie musimy się martwić bólami głowy, takimi jak problemy ze zgodnością. Będzie działał na prawie każdym komputerze.
Python ma doskonałą dokumentację. Zachęcamy naszych uczniów do odkrywania, majsterkowania i kolorowania poza liniami. Uczą się wcześnie korzystać z dokumentacji Pythona i często kończą odkrywanie ciekawych rzeczy poza klasą.
Jesteśmy bardzo zadowoleni z Python.
źródło
Powiedziałbym, że język (z pewnymi ograniczeniami) nie ma tak dużego znaczenia, jak to, co robisz z tym językiem. Możesz dowiedzieć się o tym samym na temat tworzenia oprogramowania, algorytmów, programowania obiektowego, sprzętu komputerowego i tak dalej w większości języków. Kluczem do sukcesu jest opracowanie czegoś interesującego, wykorzystującego wszystkie te koncepcje.
(migracja odpowiedzi z https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )
źródło
TL; DR: Nie ma sposobu, aby obiektywnie odpowiedzieć na to pytanie, ponieważ nie ma obiektywnych podstaw dla kryteriów, które się za tym kryją. To tak samo arbitralne, jak próba debaty, czy niebieski jest obiektywnie „lepszym” kolorem niż czerwony, czy też lody waniliowe są obiektywnie „smaczniejsze” niż czekolada.
Myślę, że są już jakieś wspaniałe posty, ale dodam własne 2 centy.
To pytanie jest podobne do pytania, czy istnieje sposób, aby obiektywnie wybrać pierwszy smak lodów, który ktoś inny powinien wypróbować, odwiedzając lody po raz pierwszy. Nie, nie ma obiektywnego sposobu na wybranie czegoś, co jest z natury subiektywne .
Czemu? Ponieważ nawet gdy spojrzymy na rozsądne kryteria wymienione w odpowiedzi Pedro , wszyscy nadal będą mieli subiektywny pogląd na to, jak każdy czynnik „radzi sobie” z poglądami innej osoby.
Na przykład, czy Ruby jest obiektywnie „prostsza” niż Python? Prostsze w jakim sensie? W odniesieniu do czego? Co dla Ciebie oznacza „prostsze” ? Czy to oznacza „mniej wierszy kodu”? Czy oznacza to „łatwiejsze do odczytania i zrozumienia”? Co z innymi? Dlaczego ktokolwiek miałby się zgodzić z jakimkolwiek wyborem tutaj? Nie sądzę, że możemy obiektywnie odpowiedzieć na to pytanie .
To prowadzi do następnego pytania.
Choć niektóre kryteria mogą być uzasadnione, myślę, że jest to bardziej oparte na subiektywnych preferencjach niż na czymkolwiek innym. Na przykład nie ma powodu, dla którego powinienem po prostu zaakceptować kryteria Pedro dotyczące prostoty , jednoznaczności , możliwości przenoszenia i preferencji branżowych - niezależnie od tego, jak rozsądni mogą być niektórzy. W rzeczywistości preferencje przemysłu są z definicji subiektywne i po prostu doprowadziłyby do błędnego koła. (Wszyscy są w tym przeszkoleni, więc wszyscy używają go w przemyśle, dlatego wszyscy są w tym przeszkoleni ...)
Na przykład dlaczego nie
Chodzi o to, że chociaż mógłbym wymyślić inny zestaw kryteriów oceny i nadal być uważany za rozsądny, nie możemy twierdzić, że jest on obiektywnie lepszy / gorszy od kryteriów innych.
Podsumowując, kryteria nie są obiektywne . To tak samo arbitralne, jak próba debaty, czy niebieski jest obiektywnie „lepszym” kolorem niż czerwony, czy też lody waniliowe są obiektywnie smaczniejsze niż czekolada.
Nie oznacza to, że nie możesz mieć dobrych powodów, aby uzasadniać swoje preferencje, ale ostatecznie są to tylko twoje preferencje.
źródło