Seite 4 von 10

Verfasst: Samstag 12. Dezember 2009, 22:09
von Pekh
lunar hat geschrieben: Aus meiner persönlichen Erfahrung heraus erachte ich es sogar für sinnvoll, an Schulen anfangs völlig auf "echte" Programmiersprachen zu verzichten, und lieber mit etwas wie "Robot Karol" zu beginnen. Denn meist muss man erstmal "Problem lösen" unterrichten, bevor man sich dem "Programmieren" widmen kann.
Dem stimme ich voll und ganz zu. Diese Problemlösungskompetenz zu entwickeln ist das, was ich am Informatik-Unterricht als am Wertvollsten ansehen. Und es ist auch das, woran die meisten zu meiner Zeit scheiterten. Tiefe Einblicke in die Informatik oder auch nur eine bestimmte Sprache lassen sich in der eher knappen Zeit ohnehin nicht vermitteln.

Was ich noch wichtig finde: Ein BWLer, der in der Schule mal Informatik hatte, hat zumindest ne dumpfe Ahnung, wovon ich als Informatiker spreche und vor welchen Problemen ich stehe. Er muß es gar nicht beherrschen, aber es zumindest mal versucht zu haben erweitert den Horizont beträchtlich. Die Wahl der Programmiersprache ist in diesem Zusammenhang irrelevant. Zumal in jeder Nische der Informatik andere Sprachen bevorzugt werden. Aber wer weiß in Schulzeiten schon, in welcher Nische er landen wird?

Verfasst: Samstag 12. Dezember 2009, 22:24
von numerix
Pekh hat geschrieben:Die Wahl der Programmiersprache ist in diesem Zusammenhang irrelevant.
Nein, ist sie nicht. Weil es Sprachen gibt, die einem den Einstieg in das problemlösende, algorithmische Denken durch völlig unnötigen und für Einsteiger gänzlich unverständlichen Ballast erschweren. Python hilft hingegen, sich auf das Wesentliche zu konzentrieren.

Verfasst: Samstag 12. Dezember 2009, 22:37
von lunar
@numerix: Das sehe ich ganz genauso, auch wenn ich abhängig von Niveau der Schüler noch weiter reduzieren würde. In der Oberstufe oder im Programmierkurs für Informatik-Erstsemester ist Python eine gute Wahl (und um Welten besser als Java), für Schüler der Mittelstufe aber oder bei absolut blutigen Anfängern halte ich "Spielzeug"-Sprachen bzw. -Umgebungen für noch besser. Wenn man keine Ahnung von nichts hat, ist Python schon kompliziert genug ;)

Verfasst: Samstag 12. Dezember 2009, 23:07
von jbs
Ich denke es hängt und scheitert am Lehrer. Ein guter Lehrer kann auch schwierigere Sachverhalte einfach und anschaulich erklären. Nichts destotrotz mag ich Python lieber als Java oder C++.

Verfasst: Samstag 12. Dezember 2009, 23:44
von cofi
jbs hat geschrieben:Ich denke es hängt und scheitert am Lehrer. Ein guter Lehrer kann auch schwierigere Sachverhalte einfach und anschaulich erklären.
Das koennen die Schueler aber nur dann verarbeiten, wenn sie nicht mit der Sprache kaempfen.

Verfasst: Sonntag 13. Dezember 2009, 00:04
von lunar
@jbs: Problematisch an Java ist, dass einfache Dinge schnell in für Anfänger sehr komplexe Themen führen. Drei Beispiele, die ich aus Erfahrung als problematisch ansehe:
  • Die Verwendung von Listen setzt generische Typen voraus, was wiederum zum Unterschied zwischen Werttyp und Objekttyp führt, weil es den Typ "ArrayList<int>" nicht gibt.
  • Die Verwendung von Zeichenketten führt ebenfalls zum Unterschied zwischen Werttyp und Objekttyp bzw. zum Unterschied zwischen Referenz und Objektwert, da man Zeichenketten nicht mit == auf Wertgleichheit prüfen kann.
  • Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

    Code: Alles auswählen

    Integer.valueOf("10".charAt(0)) * 10;
    Integer.valueOf("10".substring(0,1)) * 10;
Mag der Lehrer noch so gut sein, die nötigen Erklärung übersteigen die Fähigkeiten eines Programmieranfängers, sei er Informatikstudent oder noch Schüler.

Die Qualität des Unterrichts hängt ohne Zweifel sehr an den Fähigkeiten des Lehrers, doch nicht minder hängt sie auch an der Angemessenheit des Stoffs. Es ist meines Erachtens nicht angemessen, Anfängern Fehler erklären zu müssen, die aus den oben beschriebenen Eigenheiten der Sprache resultieren.

In anderen Fächern zäumt man den Gaul ja auch nicht von hinten auf. In Mathematik sind Vektoren am Anfang nur Koordinaten aus dem zweidimensionalen kartesischen Koordinatensystem, und keine speziellen Matrizen in n-dimensionalen Vektorräumen. In Biologie sind Gene auch erstmal nur "Merkmale" und keine Codon-Sequenzen zur Proteinbiosynthese. Da sollten Zeichenketten im Informatik auch erstmal nur "Werte" sein, und Listen erstmal einfach nur Objekte, in denen man andere Objekte ablegen kann. Java macht diese künstliche, aber notwendige Vereinfachung mehr als schwer.

Verfasst: Sonntag 13. Dezember 2009, 00:14
von cos4
Ich hab in der Schule Delphi gehabt und lebe auch noch. Aber im ernst, in def Schule geht es darum in kurzer Zeit übersichtlich Dinge zu schreiben und dafür ist python ideal, fehlt nur noch die Anbindung an ne IDE mit simplem GUI-Designer.
Alternativ zu python finde ich smalltalk interessant, die Sprache macht oop sehr anschaulich.

Verfasst: Sonntag 13. Dezember 2009, 11:17
von Darii
lunar hat geschrieben:Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10;
Integer.valueOf("10".substring(0,1)) * 10;
Das ist ja eigentlich überall so. Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.

Verfasst: Sonntag 13. Dezember 2009, 13:01
von lunar
Darii hat geschrieben:
lunar hat geschrieben:Die Verwendung von Zeichenketten führt irgendwann auch zur Thematik impliziter Typkonvertierungen, weil einzelne Zeichen in Java implizit in "int" umgewandelt werden, weswegen man einzelne Zeichen anders behandeln muss als Zeichenketten, vgl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10;
Integer.valueOf("10".substring(0,1)) * 10;
Das ist ja eigentlich überall so.
Überall? Ich kenne das nur von Java, C#, C und C++, alles verwandte Sprachen.
Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.
Der Operator ist nicht überladen, es findet Auto(un-)boxing statt.

Verfasst: Sonntag 13. Dezember 2009, 14:15
von Darii
lunar hat geschrieben:Überall? Ich kenne das nur von Java, C#, C und C++, alles verwandte Sprachen.
Jetzt hat du das kleine Wörtchen fast unterschlagen, das steht da nicht ohne Grund. Ich habe nichtbehaupt, alle Sprachen zu kennen, aber Python, Ruby, Javascript und Smalltalk handhaben es genauso. Einzelne Zeichen sind nunmal etwas anderes als Zeichenketten.
Viel interessanter finde ich, dass der * Operator offenbar bei Integer überladen ist.
Der Operator ist nicht überladen, es findet Auto(un-)boxing statt.[/quote]Was es im Endeffekt auch nicht besser macht, bzw. aufs Selbe hinausläuft. Was das angeht, kenne ich keine Sprache die noch inkonsistenter ist.

Verfasst: Sonntag 13. Dezember 2009, 14:25
von lunar
Darii hat geschrieben:aber Python, Ruby, Javascript und Smalltalk handhaben es genauso.
Python und Javascript haben gar keinen Typ für ein einzelnes Zeichen, und es gibt daher auch keine implizite Konvertierung zwischen einem einzelnen Zeichen und einer Ganzzahl. Bei Python sind beide Ausdrücke äquivalent, es ist egal, ob ich ein einzelnes Zeichen entnehme, oder eine einelementen Teilzeichenkette (weil beides Zeichenketten sind):

Code: Alles auswählen

int("10"[0])*10 == int("10"[0:1])*10
Bei Python wird ein einzelnes Zeichen nirgends implizit in seine Ordinal-Zahl bzw. seinen Codepoint umgewandelt.

Ist Dir denn klar, was beim Java-Quelltext für Ergebnisse rauskommen?

Verfasst: Sonntag 13. Dezember 2009, 14:35
von gkuhl
lunar hat geschrieben:Ist Dir denn klar, was beim Java-Quelltext für Ergebnisse rauskommen?
Mir nicht! Ich beherrsche "leider" kein Java. 8)

Edit: Ich habe so ne Ahnung, das es etwas mit ASCI-Zeichen zu tun hat :?

Verfasst: Sonntag 13. Dezember 2009, 14:44
von lunar
@gkuhl:

Code: Alles auswählen

Integer.valueOf("10".charAt(0)) * 10 == 490;
Integer.valueOf("10".substring(0,1)) * 10 == 10;
Der implizite Cast von char (Rückgabe von charAt) nach int (erwarteter Parameter für valueOf) ergibt entsprechend dem Code-Point der '1' 49.

Verfasst: Sonntag 13. Dezember 2009, 15:34
von Darii
lunar hat geschrieben:Python und Javascript haben gar keinen Typ für ein einzelnes Zeichen, und es gibt daher auch keine implizite Konvertierung zwischen einem einzelnen Zeichen und einer Ganzzahl.
Du vergleichst da Äpfel und Birnen. Du übergibst an valueOf zwei verschiedene Typen und wunderst dich, dass da verschiedene Ergebnisse rauskommen. Wie du selbst sagst, kennt Python keinen Typ für ein einzelnes Zeichen deswegen kannst du "10".charAt(0) nicht mit "10"[0] in Python übersetzen, die Python-Version des Java-Codes wäre ord("10"[0]) wo dann auch 49 rauskommt. Ein einzelnes Zeichen ist nunmal etwas anderes als eine Zeichenkette mit genau einem Element, das gilt auch für Sprachen die keinen „char“-Typ kennen. Und um es nochmal in Smalltalk zu sagen:

Code: Alles auswählen

('10' at: 1) asInteger = 49
Ist also beileibe keine seltsame Java-Eigenheit.
Der implizite Cast von char (Rückgabe von charAt) nach int (erwarteter Parameter für valueOf) ergibt entsprechend dem Code-Point der '1' 49.
Ja was erwartest du denn anderes? char lässt sich nunmal nicht nach String casten. Was ist eher verwirrend finde ist, dass Integer.valueOf(some_integer) überhaupt funktioniert. Eigentlich erwartet die Funktion einen String.

Verfasst: Sonntag 13. Dezember 2009, 19:42
von BlackJack
@Darii: Erst sagst Du man kann das Java-Snippet nicht nach Python übersetzen weil es in Python keinen ``char``-Typ gibt, und dann machst Du es doch als ``ord("10"[0]) `` was aber aus Javasicht auch wieder falsch ist, denn in Java ist es eben keine Zahl sondern ein Zeichen, dass nur in bestimmten Fällen zur Zahl gecastet wird. Und genau *das* findet Lunar zu schräg um es Anfängern zuzumuten. Sowohl bei Deinem Python-Snippet als auch beim Smalltalk-Beispiel musst Du *explizit* in eine ganze Zahl umwandeln.

`Integer.valueOf` nimmt Zahlen entgegen, weil die Funktion sowohl für ``int`` als auch ``String`` überladen ist.

Ich denke Lunar hätte an der Stelle entweder einen Fehler zur Übersetzungzeit erwartet, oder dass das Ergebnis dem eines Aufrufs mit einer Zeichenkette mit genau dem Zeichen entspricht.

Verfasst: Sonntag 13. Dezember 2009, 20:04
von Darii
BlackJack hat geschrieben:@Darii: Erst sagst Du [...] dann machst Du es doch als ``ord("10"[0]) ``[...]
Genau. Da es kein char gibt muss man in Python halt Integer nehmen. Das wäre zumindest „richtiger“ als einfach ein 1-elementigen Python-String nehmen.
denn in Java ist es eben keine Zahl sondern ein Zeichen, dass nur in bestimmten Fällen zur Zahl gecastet wird. Und genau *das* findet Lunar zu schräg um es Anfängern zuzumuten.
Ich finde es nicht zu viel verlangt, einfach mal zu gucken, was der ominöse Typ char eigentlich ist. Nämlich eine Zahl. Um auf diese „Falle“ zu stoßen, muss man ja schließlich erstmal auf die Idee kommen, mit charAt ein char aus dem String rauszuholen.
`Integer.valueOf` nimmt Zahlen entgegen, weil die Funktion sowohl für ``int`` als auch ``String`` überladen ist.
Ist sie nicht, zumindest nicht laut der API-Dokumentation von Sun.

Edit: Mea culpa, seit 1.5 nimmt sie wirklich Integer entgegen(kann mir jemand sagen warum google immer noch 1.4 als ersten Treffer liefert?), aber wie gesagt, ein char ist eine Zahl. Und kann immer automatisch zu int gecastet werden. Ein Anfänger Kurs/Buch bei dem das nicht erwähnt wird macht etwas falsch.

Verfasst: Sonntag 13. Dezember 2009, 20:20
von gkuhl
Also die Diskussion, die diese beiden so simplen Codezeilen ausgelöst haben, untermauert ja eher Lunars Behauptung, das dieses Verhalten von Java für einen Schüler unnötig kompliziert ist. Was ist ein überladener Operatoren? Was ist Auto(un-)boxing? Was ist eine implizite Cast? Und warum ist das Ergebnis jetzt 49 und nicht 42?

Die Fragen sind rhetorisch. :wink:
Grüße
Gerrit

Verfasst: Sonntag 13. Dezember 2009, 22:06
von lunar
@Darii: Du hast mich überhaupt nicht verstanden. Es geht nicht um mich. Ich weiß, was da passiert und warum es passiert, und ich kenne mich in Java und C++ gut genug aus, um nichts anderes zu erwarten, und mich vom Ergebnis nicht überraschen zu lassen. Meines Erachtens ist das Verhalten zwar nicht sinnvoll, sondern nur historisch ererbte Altlast von C, aber darüber lässt sich unter Programmierern sicherlich trefflich streiten.

Hier geht es aber nicht um Programmierer, sondern Schüler bzw. Studenten, die gerade die ersten Schritt auf dem Weg zum Programmierer machen. Da fehlt die Erfahrung, die uns sagt, dass Java Zeichen lieber als Zahlen ansieht. An ihre Stelle tritt die Intuition. Nun, wenn Du ein "a" siehst, dann liest Du in erster Linie erstmal das Zeichen "a", und nicht das erste Zeichen des Alphabets oder das 97. Zeichen der ASCII-Tabelle. Kannst Du Javas Verhalten da mit gutem Gewissen als intuitiv bezeichnen? Zahlen als "richtigeren" Ersatz für Zeichen anzusehen, ist vor diesem Hintergrund dann sehr merkwürdig. Wenn ich Dich nun bitten würde, alle Buchstaben meines Beitrags aufzuzählen, muss ich dann eine Liste mit Zahlenwerten erwarten?

Ebenso befremdlich ist es, ein Anfängerbuch oder ein Kurs als "falsch" hinzustellen, wenn die impliziten Typkonvertierungen nicht erläutert werden. Wenn man anfängt, eine Tabelle mit impliziten Typumwandlungen zu erklären, passiert genau das, über das hier schon lang und breit debattiert wurde: Man verliert über den Besonderheiten einer Sprache das Ziel, nämlich "Programmieren" im Sinne von Problemlösung und Umsetzen vom Probleme in Algorithmen zu lehren. Aber hast Du denn überhaupt je solche Kurse gehalten?

Verfasst: Sonntag 13. Dezember 2009, 22:52
von Darii
lunar hat geschrieben:@Darii: Du hast mich überhaupt nicht verstanden.
Natürlich habe ich dich verstanden, bloß du mich nicht. Du kreidest speziell Java irgendetwas an, was in allen Programmiersprachen so funktioniert. Mehr wollte ich nicht sagen. Siehe das Smalltalk-Beispiel das BlackJack also so unpassend bezeichnet hat. Genau das selbe Spielchen, Zeichen -> Integer -> ASCII-Code. Wenn man damit also in Java einmal hinfliegt hat man etwas fürs Leben gelernt.
Ebenso befremdlich ist es, ein Anfängerbuch oder ein Kurs als "falsch" hinzustellen, wenn die impliziten Typkonvertierungen nicht erläutert werden.
Ich erwarte nur einen kleinen Satz, zu jedem Datentyp der gerade verwendet wurde. Wenn ich charAt erwähne, muss ich auch erwähnen das da rauskommt. Und wenn das keine Kleinigkeit sondern ein häufiger Fallstrick, dann muss ich dass erst recht erwähnen.

Verfasst: Montag 14. Dezember 2009, 00:53
von Leonidas
lunar hat geschrieben:Wenn ich Dich nun bitten würde, alle Buchstaben meines Beitrags aufzuzählen, muss ich dann eine Liste mit Zahlenwerten erwarten?
Wenn du Ruby 1.8 verwendest - ja. Was scheinbar nicht nur mich so dermaßen gewundert hat dass es in Ruby 1.9 an das Python-Verhalten angepasst wurde.