Jakiego języka powinienem używać podczas nauczania studiów licencjackich z programowania komputerowego?

22

Nauczanie studentów na poziomie licencjackim kursu zatytułowanego Wprowadzenie do programowania komputerowego. Jestem trochę zmieszany. W dziedzinie fizyki obliczeniowej naukowcy używają C / C ++ lub Python lub Fortran, CUDA itp ... czas na zbudowanie bazy. Czego powinienem użyć? Wiem, że możesz nauczyć się nowego języka programowania w dowolnym momencie swojego życia, ale to mądrzejszy wybór dla mnie, aby rozwinąć je wszystkie podstawowe koncepcje programowania i koncepcje OOP później.

Afnan Bashir
źródło
9
@ k20: Mam nadzieję, że twoja sugestia była bezczelna; w przeciwnym razie byłoby to poważne naruszenie etyki akademickiej.
Christian Clason,
6
@ k20: Wszystko to jest nie na temat, ale wybór oprogramowania opartego na odrzutach (dowolnego rodzaju) dla nauczyciela, a nie na treściach do nauczenia, jest zdecydowanie nieetyczne. (Żeby było jasne, że to „łup”, któremu się sprzeciwiam). Zwykle robi się to, że firmy udostępniają oprogramowanie po znacznie obniżonych kosztach (lub bezpłatnie).
Christian Clason,
3
@ k20: Pamiętaj również, że motywacja firmy programistycznej nie jest całkowicie altruistyczna: Twoi uczniowie mogą teraz otrzymać oprogramowanie za darmo, ale jest również prawdopodobne, że będą musieli kupić oprogramowanie w późniejszym okresie życia (lub nauczyć się nowego oprogramowanie).
Wrzlprmft
3
@ k20 Matlab i Mathematica nie są tak naprawdę używane do poważnych obliczeń naukowych. Są bardziej eksploracyjnymi narzędziami do testowania pomysłów. Jeśli celem kursu jest nauczenie podstawowych algorytmów, to mogą one być odpowiednie (szczególnie Matlab), ale jeśli jest to programowanie ogólne, to chcesz przejść z bardziej ogólnym językiem programowania, takim jak Python z C ++.
Truman Ellis
2
MATLAB ma projekt (gdybym nie był dyplomatyczny, powiedziałbym, że jest wadliwy :)), który wymaga tego, co w innych językach jest złymi praktykami. Wiele innych rzeczy różni się od wszystkiego, więc „wyjście” może być trudne. Moim zdaniem Mathematica ma piękny design, ale nie jest podobny do żadnego innego języka (może poza Lispem, ale nie jest używany w nauce), więc to, czego się nauczyłeś, jest w większości bezużyteczne do nauki innego języka. OTOH, przejście do C <-> Python jest znacznie łatwiejsze.
Davidmh

Odpowiedzi:

32

Po pierwsze, jeśli twoi studenci są tacy jak my i nie mieli wcześniejszego wstępu do komputerów, spędź trochę czasu, ucząc ich, jak korzystać z podstawowych rzeczy, takich jak używanie odpowiedniego edytora (tj. Nie MS Word), wiersza poleceń itp.

Myślę, że odpowiedź w pewnym stopniu zależy od tego, gdzie koncentrujesz się na swoim kursie (lub od tego, czego musisz uczyć). Na przykład: Jak istotne są wewnętrzne funkcjonowanie komputera? Czy potrzebujesz klas i innych zaawansowanych struktur OOP? Czy chcesz nauczyć ich, jak tworzyć wydajne programy, czy jesteś szczęśliwy, jeśli w ogóle produkują działające programy? Nie zapominaj też, że najprawdopodobniej będziesz potrzebować zdolnych opiekunów.

Ale teraz znam zalety i wady języków, które znam. Zauważ, że wynika to głównie z mojego doświadczenia jako fizyka obliczeniowego i niektóre z nich mogą zależeć od konkretnej dziedziny, grupy roboczej, uniwersytetu itp.

Pyton

Zasadniczo polecam używanie Numpy od samego początku i zakładam, że będzie on używany w dalszej części.

Zalety:

  • Łatwo się go nauczyć, podobnie jak odczytywanie kodu innych osób (np. Kodu przykładowego, ale także kodu ucznia dla nauczycieli).
  • Dane wejściowe i wyjściowe (które nie powinny być przedmiotem kursu) mogą być w pełni pokryte przez printNumpy savetxti loadtxt, i być może sys.argv. Można go wprowadzić w locie i nie zużywa dużo czasu na programowanie.
  • Nie musisz zajmować się takimi informacjami, takimi jak reprezentacja liczb, zarządzanie pamięcią, typy danych lub tylko niewiele. Dzięki temu programowanie jest szybkie i możesz skupić się na rzeczywistych algorytmach.
  • To nie jest skompilowany język. Ma to dwie zalety: Studenci nie muszą zajmować się kompilatorem, a uczniowie mogą testować rzeczy bezpośrednio w konsoli bez konieczności kompilacji, restartu i ponownego uruchomienia programu. W związku z tym debugowanie jest łatwiejsze.
  • Istnieją łatwe w użyciu biblioteki dla prawie wszystkiego.
  • Nie musisz uczyć się dodatkowych języków skryptowych, takich jak skrypty powłoki, Make, Gnuplot i tak dalej - wszystko to można zrobić w Pythonie.
  • Istnieje wiele dobrych samouczków (za darmo).

Niedogodności:

  • To nie jest skompilowane. Dlatego programy w języku Python mogą być znacznie wolniejsze niż programy skompilowane w niektórych przypadkach związanych z fizyką obliczeniową. W innych przypadkach biblioteki (zwłaszcza Numpy) mogą dawać porównywalną wydajność. Innym sposobem na uzyskanie dobrych wyników w Pythonie jest napisanie odpowiednich fragmentów kodu w innym języku, takim jak C¹. Oczywiście musisz nauczyć się tego języka, ale możesz to zrobić później, a Twój czas na naukę języka Python nie zostanie zmarnowany.
  • Trudniej jest nauczyć takich szczegółów, jak reprezentacja liczb, zarządzanie pamięcią, typy danych i ich pułapki, ponieważ są one nieco zaciemnione.

C / C ++

Zalety:

  • Jest kompilowany i dlatego łatwiej jest stworzyć wydajny kod.
  • Zajmujesz się bezpośrednio reprezentacją liczb, zarządzaniem pamięcią, typami danych, dlatego nauczanie ich jest bardziej intuicyjne - uczniowie przybliżą się do tego, co naprawdę dzieje się na ich komputerze.
  • Są biblioteki do wszystkiego, ale zrozumienie i korzystanie z biblioteki wymaga trochę pracy.
  • W C / C ++ istnieje odpowiednia ilość kodu, dlatego uczniowie muszą nauczyć się języka, jeśli chcą pracować z tym kodem.
  • Jeśli znasz już C / C ++, możesz nauczyć się języka Python (na przykład) bardzo szybko.

Niedogodności:

  • Jest kompilowany, a twoi uczniowie mają do czynienia z kompilatorem, preprocesorem, nagłówkami i tak dalej. Byłbyś zaskoczony, jak bardzo studenci zawodzą na tym etapie, nawet pod koniec semestru.
  • Uczenie się jest również wolniejsze i tworzenie działającego kodu zajmuje więcej czasu.
  • Radzenie sobie z marginalnymi rzeczami, takimi jak wejście i wyjście, zajmuje trochę czasu zarówno podczas nauczania, jak i programowania. W C ++ istnieje dodatkowa składnia dla danych wejściowych i wyjściowych.
  • Zależności kompilatora i systemu operacyjnego.
  • Musisz poradzić sobie z zamieszaniem w C / C ++.
  • Czytanie kodu innych, szczególnie w C ++, może być dość trudne ze względu na ogromną liczbę funkcji składniowych.

Główne zalety C ++ w porównaniu do C (klasy, szablony) nie powinny być odpowiednie dla twojego kursu i stają się odpowiednie tylko dla większych projektów. Dlatego wybrałbym C z dwóch, ponieważ jest bardziej zwięzły.

Inne

Niektóre komentarze na temat innych języków:

  • Fortran: Jest nadal używany przez wiele grup i istnieje wiele starszych kodów, ale nie można obejść się ze starymi standardami oraz ich ogromnymi ograniczeniami i pułapkami (wiele osób nadal pracuje z Fortran 77). Znacznie trudniej będzie znaleźć samouczki, pomoc w Internecie i tak dalej.
  • Matlab / Mathematica: Wszystkie problemy z oprogramowaniem prawnie zastrzeżonym. W szczególności zwróć uwagę, że Twoi uczniowie prawdopodobnie współpracują z ludźmi, którzy nie mają dostępu do tego oprogramowania i wynikających z tego problemów.
  • Cuda: Jest to istotne tylko w przypadku niektórych problemów, jeśli wydajność ma znaczenie. Poza tym, przecież wiem, że nie chcesz uczyć się programowania w ten sposób.

¹ Który jest standardowym przepływem pracy przynajmniej w naszej grupie.

Wrzlprmft
źródło
Bardzo precyzyjna odpowiedź
Afnan Bashir
1
Chciałbym również powiedzieć, że jedną z niewymienionych zalet Pythona jest to, że istnieje wiele naukowych dystrybucji (Anaconda / Enthought / PythonXY / SAGE), które naprawdę usprawniają proces umieszczania wszystkich na tej samej stronie obliczeniowej. Ponadto, jeszcze fajniejsze są podejścia internetowe (Wakari i SAGE), które zapewniają to wszystko za pośrednictwem przeglądarki aka 0 zainstalowanego oprogramowania. Nauczanie studentów c ++ lub Fortran spowoduje więcej czasu poświęconego na walkę z kompilatorem niż czas poświęcony na szybkość kodu.
meawoppl
W Pythonie istnieje niesamowity ekosystem dla fizyki obliczeniowej. Numpy, scipy za zapewnienie podstawowej infrastruktury, mayavi, tvtk do wizualizacji. Python jest dość dojrzały w naukowej społeczności komputerowej. Używam C ++ w produkcji, ale bez względu na to, jaki to jest ból.
Sai Venkat
@meawoppl: „Nauczanie studentów c ++ lub Fortran spowoduje, że stracisz więcej czasu na walkę z kompilatorem, niż czas na kodowaniu.” - Nie liczy się szybkość kodu dla ćwiczeń na kursie (programy będą bardzo szybkie, chyba że ćwiczenia są wykonane w taki sposób, że nie są), ale szybkość kodu programów, które będą pisać dla prawdziwego życia lub podobnie. I jest kilka rzeczy, których po prostu nie da się zrobić skutecznie tylko w Pythonie.
Wrzlprmft
1
Powiedziałbym, że CUDA nie wchodzi w rachubę na kurs ogólnego zastosowania, ponieważ wymaga sprzętu, którego nie wszyscy mają. A jeśli masz tylko laptopa bez niego, prawie nie ma sposobu, aby go zainstalować.
Davidmh
22

W 2014 roku powiedziałbym, że Python. W 2017 roku całym sercem wierzę, że językiem nauczania studentów jest Julia.

Nauczanie zawsze dotyczy kompromisu. Z jednej strony chcesz wybrać coś, co jest na tyle proste, że łatwo je uchwycić. Ale po drugie, chcesz nauczyć czegoś, co pozostanie mocą, tj. Czegoś, co może rosnąć razem z tobą. Wspólne języki dynamiczne (Python / MATLAB / R) z łatwością mieszczą się w kategorii 1 ze względu na ich nieistniejący kod na płycie głównej oraz łatwość otwierania interpretera i wyrzucania kodu, podczas gdy C / C ++ / Fortran należą do drugiej kategorii jako języki, w których napisano podstawowe, wysoce wydajne oprogramowanie dzisiejszego świata.

Ale są problemy z używaniem języka, który nie w pełni uwzględnia drugą kategorię. Korzystając z języka takiego jak Python, dobrze oddziela rzeczy takie jak przepełnienie typów i liczb całkowitych. Przydaje się to w nauczaniu informatyki w pierwszym semestrze, ale ponieważ chcesz głębiej i głębiej zrozumieć, jak rzeczy naprawdę działają, język Pythona jest zbyt daleko od abstrakcji od podstawowego metalu, aby być dobrym narzędziem do nauczania. Ale C / C ++ / Fortran (lub Java ... Najpierw nauczyłem się Java ...) wszystkie mają tak duży koszt uruchomienia, że ​​najtrudniejszą rzeczą do nauczenia jest po prostu konfigurowanie i mainkompilowanie nagłówków , co odwraca uwagę od faktycznej nauki programowania .

Wejdź do Julii. Kiedy po raz pierwszy używasz Julii, możesz wyodrębnić całą ideę typów i używać jej tak jak MATLAB lub Python. Ale jeśli chcesz dowiedzieć się więcej, w języku znajduje się „królicza dziura”. Ponieważ tak naprawdę jest to warstwa abstrakcji oparta na systemie typów + wielokrotne wysyłanie w LLVM, jest to w zasadzie „łatwy sposób na pisanie statycznie skompilowanego kodu” (a funkcje stabilne na typ można faktycznie skompilować statycznie). Oznacza to, że szczegóły C / C ++ są również dostępne. Możesz nauczyć się, jak pisać proste pętle i funkcje bez kodu bojlera, a następnie zagłębiać się we wskaźniki funkcji. Funkcje metaprogramowania Julii umożliwiają bezpośredni dostęp do AST, a istnieją makra, które pokazują każdą część łańcucha kompilacji. Ponadto, jako Lisp, jest podatny na funkcjonalne style programowania. I ma wiele możliwości przetwarzania równoległego. Pomysły takie jak pisanie parametryczne i stabilność tekstu są dość wyjątkowe i głęboko zakorzenione w Julii.

Jeśli chcesz samodzielnie uczyć się języków programowania, możesz nauczyć się, jak działa kompilacja, używając, @code_loweredaby zobaczyć, co to jest obniżanie, zobaczyć typ-AST z @code_typed, zobaczyć LLVM IR z @code_llvm, a na końcu natywny kod asemblera z @code_native. Można to wykorzystać, aby pokazać, jaki jest koszt zmiennych dynamicznych i dokładnie, jak działa „boksowanie zmiennych”, a ten post na blogu pokazuje, w jaki sposób można wykorzystać te narzędzia introspekcji do nauczenia, jak mogą / nie mogą wystąpić optymalizacje kompilatora.

Do odkrycia są nie tylko pomysły z zakresu informatyki i inżynierii oprogramowania, ale także bogate pomysły matematyczne. Ponieważ główne biblioteki Julii są pisane z myślą o typowym pisaniu, trywialne jest tworzenie operatorów bez macierzy i używanie IterativeSolvers.jl do wykonywania GMRES przy ich użyciu. Możesz użyć narzędzi introspekcji, takich jak @whichpokazanie, w jaki sposób wszystko zostało zaimplementowane. Na przykład, jak \działa?

@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805

To prowadzi mnie prosto do definicji \ . Jest zaimplementowany w Julii, więc ktoś, kto zna Julię, może następnie nauczyć się algorytmu i jego działania poprzez identyfikację podtypów macierzy i specjalizację, gdy to możliwe (wracając do eliminacji Gaussa). Ponieważ kod Julii ma licencję MIT (a prawie wszystkie pakiety mają licencję MIT), uczniowie mogą swobodnie korzystać z tych pomysłów we własnym kodzie (z atrybutami) (gdy kod ma licencję GPL, jak ma to miejsce w przypadku większości pakietów MATLAB i R, muszą uważać na problemy z licencjonowaniem!).

Ponieważ rdzeń językowy jest zbudowany z bardzo aktywnej społeczności open source, istnieje również bogate źródło informacji o historii rozwoju języka: jego problemy z Github . Zrozumienie pytań językowych, np. Czym tak naprawdę jest transpozycja macierzy? może być bardzo pouczające dla bardziej szczegółowego zrozumienia tych obiektów matematycznych.

Ale w końcu chcesz nauczyć swoich uczniów, jak tworzyć. Niestety, nauka języka Python lub R niekoniecznie oznacza, że ​​masz wszystko, czego potrzeba, aby „opracować język Python / R”, ponieważ większość szeroko używanych i dobrze zoptymalizowanych pakietów zawiera znaczną ilość kodu C / C ++ / Fortran w kolejności uzyskać wydajność. Tak więc, aby ci uczniowie mogli wnieść wkład w ekosystemy naukowe dla tych języków, w końcu będą musieli nauczyć się innego języka w pewnym momencie. Chociaż nie jest to do końca okropne, jest już nieoptymalne, skoro Julia istnieje. Ponieważ Julia ze stabilną czcionką jest w stanie osiągnąć prędkość C / Fortran, większość pakietów w ekosystemie Julii to czysty kod Julii. Uczenie się Julii oznacza, że ​​nauczyłeś się rozwijać Julię. A ponieważ Base Julia to także głównie kod Julii (tylko kilka prymitywów, a parser nie jest),

To powiedziawszy, istnieją pewne wady wyboru Julii. Po pierwsze, jest znacznie nowszy niż te inne języki, a więc jest nieco mniej zasobów. Będziesz musiał wymyślić wiele narzędzi do nauczania na własną rękę lub skorzystać z zasobów internetowych wymienionych na stronie internetowej Julii . Ponadto szczegóły dotyczące języka nie są do końca ustalone, chociaż wkrótce pojawi się 1.0 (do końca 2017 r.). Jest również całkiem prawdopodobne, że Ty, potencjalny nauczyciel kursu w Julii, sam nie będziesz miał tak dużego doświadczenia z językiem. Są to jednak problemy, które z czasem ustępują, podczas gdy korzyści Julii, o których wspomniałem powyżej, są znacznie bardziej istotne dla samych języków.

Chris Rackauckas
źródło
Zastanawiam się, czy używanie nieco używanego języka ma sens, ponieważ znajomość składni prawdopodobnie zostanie utracona i nie gwarantuje, że uczniowie nauczą się kilku języków. Być może z takiego punktu widzenia pyton nadal jest dobrym rozwiązaniem.
Xavier Combelle,
1
Dlatego nie powiedziałbym wcześniej Julii, ale teraz, gdy jest to dość powszechne, równie dobrze możesz go użyć.
Chris Rackauckas
Myślę, że Julia jest wciąż zbyt nowa. W przemyśle studenci będą musieli znać Python, C ++, (ew) MATLAB i R. Myślę, że lepiej jest uczyć się drugiego lub trzeciego języka, jako wzbogacającego doświadczenia. Jest mało prawdopodobne, aby studenci ponownie wykorzystali Julię w najbliższej przyszłości.
Mateen Ulhaq,
2
Uczniowie powinni nauczyć się umiejętności zbywalnych, a nie szablonu do kopiowania i wklejania. W tym sensie Python / MATLAB / R abstraktuje zbyt daleko od komputera, aby być dobrym narzędziem nauczania poza najprostszym programowaniem, ale C ++ ma zbyt niski poziom, aby być dobrym narzędziem do nauczania. Jasne, jeśli chcesz mieć język z boku, jak na kursie analizy numerycznej, rób to, czego będziesz używać, ponieważ kurs nie dotyczy programowania. Ale jeśli chodzi o koncepcje programowania, Julia jest właściwie jedynym prostym językiem, który faktycznie ma większość pojęć w swoim projekcie.
Chris Rackauckas,
2

Mówiąc jako niezbyt daleko odsunięty student i zakładając, że nie uczysz w dziale CS, myślę, że katastrofą byłoby zapoznanie studentów z programowaniem komputerowym z czymś w rodzaju C, C ++ lub Fortran (lub Boże zabraniaj CUDA), mimo że inni wskazywali, że jest to prawdopodobnie status quo w informatyce naukowej.

Jeśli chcesz uczyć studentów informatyki naukowej i wprowadzić ich do programowania na tym samym kursie, założę się, że to zbyt wiele, aby pokryć to w semestrze, chyba że trzymasz się interpretowanego języka, takiego jak Matlab lub Python. Z mojego doświadczenia wynika, że ​​większość zajęć z informatyki naukowej na poziomie licencjackim jest prowadzona w jednym z tych dwóch sposobów, a python staje się coraz bardziej przydatny jako język na poziomie produkcyjnym każdego dnia, więc nadal ma pewną użyteczność jako praktyczna umiejętność ( mam na myśli nie tylko nauczanie podstaw programowania).

Tylko moje dwa centy.

Sumedh Joshi
źródło
4
Katastrofa jest zbyt silnym słowem, by można je było opisać ucząc uczniów C, C ++ lub Fortran. Każdy z tych języków (C, C ++, Fortran lub Python) może być odpowiedni do nauczania programowania i obliczeń naukowych w zależności od tego, jak to robisz.
Bill Barth,
1
Z mojego doświadczenia z klasą wydziału CS (C ++) i klasą dla astronomów (Fortran 77), C / C ++ / Fortran nie zapewnia wystarczającej pomocy w porównaniu z pythonem dla zupełnie nowych programistów (segfaults vs wyjątki). Korzystanie z C / C ++ / Fortran albo wymaga nauki o tym, jak korzystać z debuggera (lub używania IDE), podczas gdy python może być używany samodzielnie.
James Tocknell,
0

C, C ++ i Fortran (wymienione w określonej kolejności) to trzy główne języki programowania używane w matematyce obliczeniowej / fizyce, jeśli chcesz rozwiązać duże problemy na superkomputerach. Myślę, że CUDA jest uważana za bibliotekę używaną w połączeniu z innymi językami do przyspieszonego obliczania na GPU. Matlab i python świetnie się uczą do przeprowadzania diagnostyki danych wyjściowych i tworzenia modeli prototypowych. Są również łatwiejsze do nauczenia i mogą być lepsze na kursie, w którym chcesz przejść przez wersety algorytmów uczących się programowania.

Zatem jeśli twój kurs dotyczy wyłącznie programowania, wybrałbym C ++ lub, jeśli jest to programowanie studentów po raz pierwszy, Python. Oba te języki mają wysoką użyteczność poza światem komputerów naukowych. Jeśli kurs koncentruje się na algorytmach uczenia się do rozwiązywania problemów opartych na fizyce, to myślę, że Matlab jest niewątpliwie zwycięzcą.

James
źródło
0

krótko: Weź pod uwagę, że obliczenia naukowe są skomplikowane. Czy naprawdę chcesz, aby język programowania wszedł do gry?

Matematyka używa abstrakcji do rozwiązywania problemów, których nie można rozwiązać intuicyjnie. Dlatego koncepcje mają tendencję do bycia abstrakcyjnymi. Dlatego zrozumienie, jakie pojęcia należy zamknąć, nie jest trywialne. W obliczeniach naukowych zwykłe przykłady klas takich jak „Zwierzę” „Pojazd” są raczej bezużyteczne. Dotyczy to programowania obiektowego, ale wierzę, że odtwarzanie abstrakcyjnych pojęć na komputerze nie jest również trywialne w programowaniu imperatywnym.

Właśnie dlatego uważam, że mamy tutaj do czynienia z dwoma różnymi wysiłkami: programowaniem, z jednej strony i naukowym, z drugiej. Na poziomie licencjackim, gdzie studenci pochodzą z różnorodnych środowisk, możesz skończyć nauczając dwóch różnych rzeczy w tym samym czasie.

Jeśli twoim celem jest nauczanie informatyki naukowej, myślę, że jest to wystarczająco trudne. Posiadanie dodatkowej bariery jako języka programowania (wszyscy zgadzamy się, że C ++ wymaga szkolenia) zdemotywowałoby spore grono studentów, dlatego sugeruję używanie Pythona.

Jeśli twój kurs to „Wprowadzenie do SC”, uważam, że Python ma najlepszy stosunek wyników do wysiłku.

PS: teraz mamy raczej dobre komputery, tak naprawdę nie musimy szukać wydajności na poziomie licencjackim.

Nicola Cavallini
źródło
Odnośnie twojego PS: Dlaczego wydajność nie ma znaczenia tylko dla studentów? Oprócz tego, że łatwo jest wyobrazić sobie zadania dla studentów tam, gdzie liczy się wydajność, nie chodzi o te zadania, których uczą się o wydajności, ale o prawdziwe życie. Szybkość komputera mogła również wzrosnąć, ale i nasze oczekiwania.
Wrzlprmft
Przepraszam, że byłem zbyt ostry. Pozwólcie, że sformułuję to w następujący sposób: „uczniowie mogą uruchamiać zadowalające duże aplikacje z językiem interpretowanym, przed przystąpieniem do optymalizacji kodu, a następnie do skompilowanego języka”.
Nicola Cavallini