Kryteria wyboru języka dla pierwszego kursu programowania

35

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 .

Dave Clarke
źródło
1
Otwarty meta wątek na temat tego, czy to pytanie jest na czy nie na temat: meta.cs.stackexchange.com/questions/362/...
Dave Clarke
7
<Grab popcorn> Parafrazując Otto Neugebauera : Żaden pierwszy znany język programowania nie jest w stanie zrujnować wszystkich.
JeffE
3
@Raphael: Myślę, że odpowiedź Dijkstry brzmiałaby prawdopodobnie: „ Każdy pierwszy znany język programowania jest w stanie zrujnować wszystkich”.
JeffE
2
@ edA-qamort-ora-y, tak, powinny być narażone na kilka paradygmatów programowania. Nie, tego nie da się zrobić w pierwszym kursie.
vonbrand,
3
Mieliśmy SMLpo 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.
Markus Malkusch

Odpowiedzi:

14

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ów lub 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ć!

Pedro
źródło
4
Projekt VHDL i Verilog są podzielone.
avakar
@avakar: Aw, bzdury. Naprawię to w mojej odpowiedzi, dziękuję za wskazanie!
Pedro
Yikes, przeczytaj to i pomyślałem, że to jeden z moich wykładowców. +1 dla Oberona, o ile przełącznik użycia małych słów kluczowych jest automatycznie włączony; tak bolesne pisać WHILE expr DO stmts ENDitp.
Callum Rogers
3
+1 za „jakie są cele twojego kursu?” i dodatkowa uwaga, jednym z najczęstszych celów, nawet jeśli nie jest napisane, jest przedstawienie podstaw innych rzeczy (kursów i staży), które wymagają programowania jako warunku.
AProgrammer
Jedną ważną kwestią (przynajmniej dzisiaj) jest to, że pozwala ona studentom szybko i bezboleśnie tworzyć atrakcyjne wizualnie programy. Są narażeni na tak wiele aplikacji i gier intensywnie korzystających z grafiki, że naturalnie uważają, że w ten sposób komputery powinny wchodzić w interakcje z ludźmi.
vonbrand,
13
  • 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.

Nazar Merza
źródło
Możesz dość łatwo zacząć od podzbioru, powiedzmy Java, aby pokazać styl proceduralny. Następnie otwórz pudełko Pandory i pokaż, jak wyglądają te same rzeczy w OOP.
Raphael
3
@Raphael: Nie można tego uniknąć 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.
Dave Clarke
Dobre IDE może odłożyć public static void main()na bardzo długi czas. BlueJ jest dobrym przykładem IDE, które pozwala uczniom pisać programy bez jednego mainnigdzie w nim.
Barry Brown
2
Problem z OOP polega na tym, że w przypadku problemów z zabawkami objętych w pierwszym roku programowania, po prostu przeszkadza, bez żadnej wyraźnej przewagi. OOP staje się ważny (i doceniany), gdy twoje programy mają około tysiąca linii. „Java bez OOP” to okropne, wiele całkowicie nieprzejrzystych rzeczy, które „trzeba tak napisać”, są sprzeczne z nauką ludzi , a nie papugowaniem.
vonbrand,
11

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.

evilcandybag
źródło
1
Znaczenie dla branży można uznać za drugorzędne, ale nie sądzę, że jest to niewielki problem. Ponieważ jest to wprowadzenie do kursu programowania, nie rozumiem, dlaczego ktoś chciałby uczyć się w nim wszystkich pojęć, często jest drugi kurs programowania i inny kurs na temat języka programowania, w którym omawiane są różne języki, i wiele innych kursy koncentrowały się na określonych obszarach zastosowania, np. programowaniu w Internecie itp.
Kaveh
@Kaveh: Dla mnie to brzmi jak program politechniki.
Raphael
6
„ważne jest, aby jak najszybciej poddać uczniów innym, radykalnie innym językiem”. - absolutnie poprawne. Ustawiamy odświeżających, którzy myślą, że mogą programować bezpośrednio, wprowadzając najpierw programowanie funkcjonalne: prawie wszyscy są nowi w tym paradygmacie, a im więcej C (++) jesteś narażony na trudniejsze pozornie jest.
Raphael
3
@Kaveh: Języki zaprojektowane do wykonywania rzeczy w prawdziwym świecie niekoniecznie są optymalne do nauczania pojęć lub rozwijania umiejętności. Cele są bardzo różne.
JeffE
1
@Kaveh: Nigdy nie pisałem, że znajomość języków używanych w przemyśle jest nieistotna. Mam na myśli to, że biorąc pod uwagę solidny pierwszy język programowania, późniejsze kursy nie będą miały problemu z nauczeniem studentów czegoś o tym, co właściwie zrobią po ukończeniu studiów. Będąc częścią nauczania kilku kursów wprowadzających samodzielnie (jako TA), powiedziałbym, że umiejętności, których się uczysz, nie są podobne do tych potrzebnych w przemyśle (jest na to za mało czasu). Jeśli tak jest, uważam, że lepiej dać im solidne koncepcje, aby mogli stać się lepszymi programistami, a nie tylko programistami $ LANGUAGE.
evilcandybag
8

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.

jmad
źródło
1
W przypadku monad jak w Haskell można argumentować, że kryteria te nie mają już zastosowania do czysto funkcjonalnych języków.
Dave Clarke
@DaveClarke: monady to bardzo fajny sposób na robienie niefunkcjonalnych rzeczy. Ale czy nie jest zbyt ryzykowne, aby najpierw nauczyć się tego z napisem monada zamiast bezpośrednio? (Może nie, nie wiem!)
jmad
2
@jdam: Prawdopodobnie masz rację. Problem nie leży w samych monadach, ale w ogólności i trudnościach w przedstawianiu programistom dobrych komunikatów o błędach. Wersja Haskell Helium rozwiązuje te problemy i została z powodzeniem zastosowana u studentów pierwszego roku.
Dave Clarke
@DaveClarke: wow, nie słyszałem o tym. To bardzo fajnie! Niestety, chociaż jest to bardzo przydatne do nauki języka Haskell, nie rozwiązuje to problemu polegającego na tym, że może nie pomóc w nauce innych języków.
jmad
4
@Ben: Wydaje mi się, że ręczne zarządzanie pamięcią jest obecnie czymś specyficznym dla niektórych języków (i że w tych konkretnych przypadkach uczysz się) bardziej niż podstawową sprawą programowania. Jeśli się z tym nie zgadzasz, to chyba wskazuje na C (lub C ++).
jmad
8

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.

Dave Clarke
źródło
Serdecznie się zgadzam.
vonbrand,
1
Mam również własne preferencje dotyczące rywalizacji o typy statyczne i dynamiczne. Jednak w ogólnym programie CS, tak długo, jak oba są nauczane w pewnym momencie, uważam, że kolejność nie ma tak wielkiego znaczenia. Jeśli jednak prezentowana jest tylko jedna strona medalu, jest to dla mnie duży problem.
chi
8

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ę?

Raphael
ź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.
Mason Wheeler
Próba nauczenia początkujących mieszanki różnych składni i podstawowych pojęć to tylko mieszanie mózgów.
vonbrand,
6

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 .

David Cary
źródło
Czy sprawdziłeś u oryginalnych autorów, czy możesz reprodukować ich treść? Źródłem jest korporacyjna strona internetowa i nie mogłem znaleźć deklaracji, że treść była darmowa, więc może to nie być legalny post!
Raphael
1
@Raphael Źródłem jest wiki (więc potencjalnie ma wielu różnych autorów). Jeśli autor (którykolwiek ze współautorów) tego materiału nie chce, aby został tu zamieszczony, powinien wysłać powiadomienie o usunięciu DMCA na adres [adres kontaktowy wymieniony na dole tej strony] (mailto: [email protected]) . Ponadto informacje nie są objęte prawem autorskim, a jedynie sposób ich wyrażenia. Trochę refaktoryzacji i usunięciaWordsRunTogetherWikiWikiStyle poprawiłoby tę odpowiedź i wyeliminowałoby ryzyko naruszenia praw autorskich.
Gilles „SO- przestań być zły”
1
+ Dobra odpowiedź, ale mam jedną nitkę do wyboru - profilerów. Nie kryje się za nimi żadna teoria - po prostu „powszechna wiedza”. Ogólnie naukowcy nie doceniają, że istnieje wiele problemów, których nie znajdują, i robi to inna technika. Sprawdź ten link.
Mike Dunlavey,
5

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.

Kaveh
źródło
3
Okropnie nie oceniłbym przydatności w przemyśle na wstępnym kursie programowania. Skuteczny programista na wolności prawdopodobnie będzie musiał nauczyć się wielu języków podczas swojej kariery, niektóre z nich „w pracy”, więc umiejętność podnoszenia i uczenia się nowych języków jest kluczową umiejętnością, której należy nauczyć. W związku z tym nie spodziewałbym się, że pierwszy język wykładany na studiach uniwersyteckich będzie z pewnością najsilniejszy po ukończeniu studiów.
Ben
1
@Ben: Przydatność w branży jest szczególnie ważna, jeśli uczniowie nie chodzą na kierunku CS. Tam, skąd pochodzę, wielu ludzi chodzi do biologii lub innych nauk, a biorąc pod uwagę, że nie będą mieli czasu na naukę wielu języków, nauka czegoś wspólnego w ich ekosystemie, takiego jak Python, będzie prawdopodobnie bardziej przydatna niż ML, Java lub C.
hugomg
1
Mówiąc jak ktoś z branży (jedna konkretna branża, niekoniecznie reprezentatywna), nie sądzę, że znaczenie branży jest czynnikiem, jeśli chodzi o przyszłych programistów poziomu 1. Ekspozycja na wiele paradygmatów czyni lepszych programistów, nawet jeśli w mojej domenie (programowanie osadzone) używamy głównie C. Poszczególnych elementów języka można się nauczyć w podręczniku, ogólnych pojęć lepiej uczyć się w szkole. Dla przypadkowych programistów (np. Naukowców) priorytety są różne - ale zbytnie skupienie się na Fortranie może sprawić, że ludzie zignorują Numpy, kiedy powinni tego używać.
Gilles 'SO - przestań być zły'
5

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 cari cdrsugerować 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 ...

  • Ruby, choć nie jest zoptymalizowany pod kątem ogona, dość dobrze rekurencyjnie. Więc to jest to.
  • Ruby to paradygmat. Mimo że jest to język zorientowany wyłącznie na obiekt, obejmuje on również programowanie funkcjonalne, a także niezbędne imperatywne koła treningowe pochodzące z języka C. Porównaj to z Pythonem, który jest językiem proceduralnym z niektórymi sfałszowanymi OO (chociaż pokazują śruby), i niektórymi elementami funkcjonalnymi (które BDFL Pythona wielokrotnie próbował wyciąć ).
  • CRuby (znany również jako MRI lub „Ruby Classic”) jest napisany i rozszerzony w C. Możesz uczyć uczniów o wskaźnikach, zarządzaniu pamięcią i przerażającym bogu malloc(), ucząc ich, jak rozszerzać język w C.
  • Mimo że jest to dynamiczny język wysokiego poziomu, możesz wiele nauczyć o strukturach danych, typach itp .; istnieją biblioteki (klejnoty) dla wszystkiego, co można sobie wyobrazić, od czerwono-czarnych drzew po robienie dziwnych rzeczy z pisaniem kaczek.

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.

Jason Lewis
źródło
2
„Mocno wierzę, że Python jest nowym językiem BASIC” - skopiuj to. „dwie trudniejsze (i najważniejsze) koncepcje w CS; mianowicie wskaźniki i rekurencja” - nigdy nie nauczyłem się języka, który wyraźnie wskazuje na wskaźniki i nigdy niczego nie przeoczyłem. Kiedy dowiedziałem się, jak działają kompilatory, wskazówki zostały wystarczająco szybko wyjaśnione.
Raphael
Zgadzam się, że język z wieloma paradygmatami ma swój urok (chociaż nauczanie dwóch do trzech „czystych” języków może być lepsze), ale z tego powodu nie wybiorę Ruby. Inne języki do lepszej pracy, imho, w szczególności w odniesieniu do podstawowej biblioteki. Na przykład Scala ma całą bibliotekę niezmiennych zbiorów.
Raphael
3
Wierzę również, że Python jest nowym językiem BASIC. Ale dlaczego jest to argument przeciwko Pythonowi?
JeffE
1
@ Rafael, wskaźniki są trudne tylko wtedy, gdy zaczynasz od C, co nieco zmusza cię do bycia narażonym na wskaźniki, gdy zbyt wiele rzeczy nie jest ustalonych i gdzie mają one mylący związek z tablicami. Wskaźniki nie były dla mnie trudne, kiedy sam uczyłem się Pascal. Wskaźniki nie były trudne dla osób w mojej klasie, które uczyły ich w Algolu 68 (są tam nazywane referencjami, ale są wskaźnikami pod inną nazwą, tak jak w Javie; to, co jest trudne w Algolu 68, to reguły automatycznego usuwania dereferencji), wskaźniki nie są nawet trudne w C ++, jeśli nie zaczniesz od nauki podzbioru C.
AProgrammer
1
@DaveClarke: Wcina się spacje, które więcej niż nadrabiają.
Raphael
5

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.

Uday Reddy
źródło
5

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

ncmathsadist
źródło
1
Witamy! To miłe studium przypadku, ale niewiele pomaga odpowiedzieć na pytanie po kryteriach wyboru, imho. Czytanie przedmiotów wstecz może to zrobić, ale nie jestem pewien, czy zamierzałeś to zrobić w ten sposób.
Raphael
Żadne konkretne zamówienie nie było zamierzone. To jest „i”.
ncmathsadist
3

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/ )

utdiscant
źródło
1

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.

Jakie obiektywne kryteria może zastosować nauczyciel, aby wybrać język programowania, który będzie używany jako podstawa pierwszego roku programowania uniwersyteckiego?

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.

Jakie są podstawy tych kryteriów?

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

  • Wydajność: Czasy wykonania i wielkość pamięci można faktycznie zmierzyć.
  • Rozmiar: jak najmniejsza liczba zarezerwowanych słów ułatwiłaby naukę języka.
  • Zestaw funkcji: Szerszy zestaw obsługiwanych funkcji (np. Lambda, generics, orientacja obiektowa, przeciążenie operatora itp.) Pozwoli ci nauczyć więcej pojęć bez konieczności przełączania języków i powrotu do podstawowego.
  • Interoperacyjność: Język, który ułatwia pracę z innymi językami i systemami natywnymi (np. Win32 API z C # lub Python itp.) Może być podniesiony jako lepsza inwestycja długoterminowa itp.

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.

kod_dredd
źródło