Teaching Programming

Source : http://www.ariel.com.au/a/teaching-programming.html

 

Bardzo szybkie porównanie popularnych języków do nauki programowania modułu elektronicznego

 

W CS department where I obecnie naucza niedawno urodziłam zechcieli w debacie, w której język programowania powinien być używany do pouczania roczników. Java i C są najczęściej używane języki w klinice, a dla wielu osób jest to słuszne, ale nie jest (Moim zdaniem) absolute beginners. Wierzę, że Python jest znacznie lepszym wyborem dla początkujących i usztywnią moich własnych pozycji i pełniły bardzo krótkie, bardzo unscientific testu opisanego poniżej.

***

Wynik testu

Chciałem się przyjrzeć co eksplodowała w piśmie bardzo proste programy w (mały) w różnych językach. Języki wybrałam były BASIC, C, Java i Python. Używałam C i Java, ponieważ są one w powszechnym użyciu w klinice (oraz w innych instytucjach edukacyjnych. Wybrałem Pythona, bo kocham go, i myślę, że to doskonały wybór dla nauczania, a wybrałem BASIC bo, cóż, to było po prostu zbyt łatwe…..

“Witaj Świecie” wydawało się, że troche zbyt banalne, więc zdecydowałem się na stosunkowo prostym zadaniem nauki czytania dwa numery od użytkowników, dodając je razem i drukowanie wyników. Moje zainteresowania był

  • Jak długo trwało do pisania i debugowania kodu
  • Jak wiele rzeczy nie jest studentem trzeba zrozumieć, aby napisać ten kod

Podane czasy aby wpisać kod są oczywiście nie ma to być przedstawiciel czas wymagany przez ucznia, ale sądzę, że dają one w przybliżeniu dokładną miarą porównanie. Jestem racjonalnie wykwalifikowanych (1-5 lat doświadczenia zawodowego) w każdym języku, więc nie wiem, czy zostałam bezpodstawnie stronniczą.

Podstawowe

Przestałem się programu, powrót w późnych latach 70., na poziomie I TRS-80 i na czas systemu podziału, że moje Liceum Ogólnokształcące miało sporadyczny dostęp do. Program jest banalnie w dobrym “ol podstawowe:

10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C

RUN

Czas zapisu:

15 sekund. Przyznaję, że nie mam podstawowych tłumacza poręczne i nie testowała tego, ale ja po prostu wiem że działa. (OK, ja fired up TRS-80 emulator i faktycznie prowadził ją – to działa…).

Rzeczy, które należy wyjaśnić:

  • Numery linii
  • Zmienne
  • Wejście
  • Drukuj
  • Uruchom

Zalety i wady

BASIC jest bardzo łatwe dla początkujących Od czego zaczac, ale to jest stary, źle zaprojektowany język, Ŝe w niemal wszystkich nowoczesnych funkcji. Visual Basic dodaje dużo do “dobry ‘ol BASIC”, ale nie ma sensu (Moim zdaniem) do pouczania o jednej platformie własny język. I to wciąż nie jest to naprawdę dobry język….

C

#include <stdio.h>

int main(int argc, char*argv[]) 
{
    int a,b,c;

    scanf("%d",&a);
    scanf("%d",&b);

    c = a+b;
    printf("%d\n",c);
}

%> gcc -o add add.c
%> ./add

Czas zapisu:

Około trzech minut, łącznie z debugowania.

Rzeczy, które należy wyjaśnić:

  • #obejmują funkcje (główny), powrotu typy, argc . Zmienne, zmiennych argv
  • Zmienne, typy (int)
  • Scanf (i dość szybko jego ograniczenia i w jaki sposób działa wokół nich).
  • Printf format strun
  • Kursory (już!)!
  • Kompilowanie, szelki i średniki

Zalety i wady

C został zaprojektowany przez najlepszych hakerów na własny użytek. Został on zaprojektowany do pisania systemów operacyjnych, kompilatorów i innych narzędzi systemowych, i w tej roli stał się niemal całkowicie dominuje.

Zapewnia on doskonałą wydajność (zakładając dobry wybór algorytmu i dobre umiejętności C) i zapewnia niski poziom dostępu do sprzętu, ale te nie są zwykle rzeczy wymaganych przez początkujących. C uzywana wskażniki są źródłem frustracji i nieporozumień dla początkujących, ale mają one podstawowe znaczenie w nawet dość błahe programy (jak wyżej, aczkolwiek w prosty sposób).

Ponadto, C’s string obsługa jest słaby w porównaniu do wielu innych języków nowożytnych (funkcja scanf użyte powyżej jest niezwykle problematyczna).

C jest poważnym i bardzo ważny język, a wszyscy programiści powinni mieć znaczące ryzyko. Należy jednak pamiętać, że jest to straszny język do nauki początkujących. Zbyt dużo jest C , który musi zostać wyjaśnione, pozostawiając mniej czasu na wyjaśnianie programowanie.

Java

import java.io.*;
public class Addup
{
    static public void main(String args[])  {
        InputStreamReader stdin = new InputStreamReader(System.in);
        BufferedReader console = new BufferedReader(stdin);
        int i1 = 0,i2 = 0;
        String s1,s2;
        try {
            s1 = console.readLine();
            i1 = Integer.parseInt(s1);
            s2 = console.readLine();
            i2 = Integer.parseInt(s2);
        }
        catch(IOException ioex) {
            System.out.println("Input error");
            System.exit(1);
        }
        catch(NumberFormatException nfex) {
            System.out.println("\"" + nfex.getMessage() + "\" is not numeric");
            System.exit(1);
        }
        System.out.println(i1 + " + " + i2 + " = " + (i1+i2));
        System.exit(0);
    }
}
%> javac Addup.java
%> java Addup

Czas zapisu:

19 minut! Rzeczywiście, spędziłem około 15 minut, upadłe, a następnie przeszukać Google dla przykładu. Ten kod powyżej jest zaczerpnięta z książki a web page, które Najbardziej znamienne jest to myślałem, zaczyna się od słów “być może przypuszczał, że program, który odczytuje w dwóch wprowadzonych przez użytkownika liczb i drukuje ich sumę byłby to prosty kawałek kodu”.

Oczywiście, ten kod nie jest idealnie równy inne programy zaprezentowane tutaj, ponieważ nie ma ono właściwego sprawdzania błędów, jednak Java sprawia, że trudno nie robić błędów. Musisz złapać wyjątki, które złowiły je możecie także zrobić coś z nimi.

Jestem aktualnie rodzaj embarassed mialem tyle kłopotów z tym – pracuję na komercyjny pakiet Java przez dwa lata, ale ponieważ jest oparte na interfejsie GUI i rzadko mają do czynienia z odczytywaniem z konsoli. Prawdziwych programistów Javy prawdopodobnie będą patrzeć na mnie z mieszaniną litość i obrzydzeniem. Takie jest życie.

Rzeczy do wyjaśnienia

  • Import, klas, średniki ramiączek
  • Public, static, nieważne, String, main args[]
  • InputStreamReader, BufferedReader, System.w
  • Zmienne, typy
  • Try, catch, wyjątki, readLine, parseInt
  • System.out.println, kompilowania, uruchamiania

Zalety i wady

Java to język przydatny dla cross-platform rozwoju GUI, to potężna platforma do rozwoju obiektowych oraz posiada bogate i wysoko rozwinięte zestaw class libraries. Być może najważniejsze, jest to najbardziej popularny język i wokół jest sporo miejsc pracy dla programistów Javy.

Obszerna biblioteka klas jest jednak dość karkołomnym zadaniem. Wydaje się, że klasy za niemal wszystko, a znaczna część “programowanie w języku Java” wydaje się składa się z “szukaniem właściwego class”. Nawet po dwóch latach mogę znaleźć nie mogę zrobić wiele w Java, bez nieustannego odniesienia do dokumentacji.

Java wymusza orientacja obiektu, Wyjątek – sprawdzanie i ścisłe pisanie – wszystkie te (zapewne) dobre rzeczy – ułatwienia dla grupy programistów, by potraktowały tworzenie dużych systemów. Ale dla małych problemów (takich jak sklejka w wstępne programowanie klas) te rzeczy stają się niczym więcej niż skomplikowana, które zasysają wsadu.

Zatrudnienie tylko powodu jest wystarczający do wykonania Java “musi nauczyć lanaguage”, ale myślę, że nie będziemy naszych studentów, więc nietaktem wobec czy to najlepszy język, pokazujemy je.

Python

import sys

a = sys.stdin.readline()
b = sys.stdin.readline()
c = int(a) + int(b)
print c

%> python add.py

Czas zapisu:

Około jednej minuty, w tym testowanie i debugowanie.

Rzeczy do wyjaśnienia

  • Importowanie
  • Zmienne
  • Sys.stdin
  • Readline (czyta a string)
  • Int (zamienia łańcuch na liczbę całkowitą)
  • Drukuj

Zalety i wady

Python ma strasznie dużo dobrych punktów:

  • Egzekwuje dobrego stylu programowania (penetracja jest wymowny)
  • OO dostępny ale nie egzekwowane
  • Wyjątki, ale nie egzekwowane
  • Nie jest to zabawka lub akademickie język – dużo prawdziwych praca jest wykonywana w Python.
  • Umożliwia koncentrację na algorytmy i problem, nie na funkcji języka i niedociągnięcia.
  • Jest cross platform i ma potężny zestaw bibliotek
  • Jest bezpieczny – posiada dynamiczny odliczanego czasu typu kontrola i sprawdzanie granic w macierzy
  • Posiada potężne wbudowane typy danych – słowniki, wykazy, sekwencje, funkcje, zestawów (w 2.4)
  • Posiada potężne wbudowane struktury kontrolne – prosta krążącymi nad sekwencjami, mapa, generatory, listy Refleksje to ważny mechanizm ułatwiający lepsze zrozumienie, wyrażenia regularne…
  • Wymaga mniej linii kodu dla danego problemu i jest bardziej zrozumiale – zatem większa produktywność.

Do nauki jako pierwszy język, ma jednak pewne zalety. Jak widać z powyższych przykładów (pomijając BASIC), Python wymaga mniej czasu, mniej linii kodu, a mniej koncepcje należy uświadamiać, aby osiągnąć dany cel. Dzięki temu więcej czasu na ważne rzeczy. Ponadto, niektóre typowe błędy ucznia są całkowicie byassed w Python:

  • Koniec wiersza jest końcem linii (nie pamiętam średników)
  • Brak deklaracji typu
  • Prawdziwe struktury bloku zawsze oczywiste (brak brak ramiączek błędu).
  • Dynamiczne przydzielanie pamięci i zbierania śmieci

W końcu programowanie w Python jest zabawa! Zabawne i często sukces rasy zaufania i zainteresowania studenta, który jest następnie lepsze szanse, aby kontynuować naukę do programu.

Ale Python jest tylko język skryptów

Python jest często oddalił jako “po prostu języka skryptowego (Perl i Ruby też cierpi na to głupie nietolerancji). To jest po prostu błędne. Nie jest on “po prostu języka skryptowego” – jest to w pełni funkcjonalny bardzo wysokiego poziomu języka, który jest idealny do wielu zastosowań, włącznie z prostych skryptów obowiązków.

Fakt, że możesz napisać “szybki i brudny” skrypty w Python jest zaletą, a nie wadą, ponieważ skrypt jest rzeczywiście istotną częścią profesjonalne programowanie. Jeśli studenci nie znam Pythona (lub Perl, Ruby, lub….), będą one zmarnowania mnóstwo czasu próbując rozwiązać script-podobnych problemów w języku Java.

Ale Python jest Slooooooow

Python jest interpretowanym językiem, i nie spowoduje to dodanie kilku potwierdzeń. Dynamiczne sprawdzanie granic, dynamiczne typowanie i inne sprytne Python rzeczy wolno go jeszcze bardziej. Python może być o cały rząd wielkości wolniejsza niż odpowiednik C kod. Jednakże

  • Wiele, wiele aplikacji nie są obliczenia związane. Aby wykorzystać wysoką wydajność w języku dla nich wyrazem grzech wczesnego optymalizacji kosztowej.
  • Python interfejsy do dekoracji C – ogromne zyski mogą być dokonywane przez kodowanie sekcje krytyczne w C
  • Zaoszczędzony czas kodowania w Pythona, a stokroć większą prostotę kod napisany, pozwala na znacznie więcej czasu na eksperymentowanie w bardziej wydajne algorytmy – często dużo bardziej owocne niż po prostu pracuje a bad algorytm bardzo szybko.

Zawarcie

C i Java są ważnymi językami – pojęcia te ucieleśniają dla perspektyw zatrudnienia, a dla klas problemów rozwiążą. Studenci muszą mieć dokładne rozeznanie w tych językach. Nie są one jednak stanowić wystarczający arsenał dla profesjonalnych programistów – dobry “języka skryptowego” jest absolutnym priorytetem – ani nie są dobre języków uczyć studentów rozpoczynają przygodę z programowaniem. Mają one dużą ilością potwierdzeń i innych przeszkód, które czerpią dużo przyjemności, i zarówno przez studenta i nauczyciela zadania trudniejsze niż powinny być.

Są ludzie, którzy twierdzą, że przeszkody są częścią dyscypliny programowania – studenci muszą się nauczyć, aby uchwycić ich wyjątki, posługując się wskaźnikami, deklarujemy wszystkie ich typy i tak dalej. Być może, być może nie – ale nie czas, by później. Niech niech studenci mają prostą radość z małych sukcesów, my (również “JA” zresztą) miał gdyśmy rozruch. Patrick Jordan – patrick@ariel.com.au – 2004-12-14 

Postscript (luty 2006).

Pomijając powyższe uwagi, a ogromna liczba ludzi napisało do mnie po ten artykuł ukazał się na codzienne Pythona, by pokazać, że nie ma prostszego sposobu, by to zrobić w Python:

a = input()
b = input()
c = a + b
print c

%> python add.py

(różne jednej tulei cylindrowych, takich jak ‘print input()+input()” były również sugerowane i działać równie dobrze ale chciałbym twierdzą są mniej przydatne dla celów dydaktycznych). Ponadto, ponieważ input() przyjmuje dowolne poprawne wyrażenie Pythona, ten program po prostu pracuje dla całego szeregu wejść – ints, pływaków, smyczki (niewzruszonym ciągami je – ale należy pamiętać, że muszą one być w cudzysłowie else uciekną być interpretowane jako nazwy zmiennej lub wyrażenia takie jak “3.14**2”. Kolejny dowód, jak gdyby był potrzebny, piękno języka Python.